blob: c42c9f012a32481a43d126ea2831a682892f6ccc [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.editor.impl.event;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.event.*;
import com.intellij.openapi.editor.ex.*;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.util.Disposer;
import com.intellij.util.EventDispatcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class EditorEventMulticasterImpl implements EditorEventMulticasterEx {
private final EventDispatcher<DocumentListener> myDocumentMulticaster = EventDispatcher.create(DocumentListener.class);
private final EventDispatcher<EditReadOnlyListener> myEditReadOnlyMulticaster = EventDispatcher.create(EditReadOnlyListener.class);
private final EventDispatcher<EditorMouseListener> myEditorMouseMulticaster = EventDispatcher.create(EditorMouseListener.class);
private final EventDispatcher<EditorMouseMotionListener> myEditorMouseMotionMulticaster = EventDispatcher.create(EditorMouseMotionListener.class);
private final EventDispatcher<ErrorStripeListener> myErrorStripeMulticaster = EventDispatcher.create(ErrorStripeListener.class);
private final EventDispatcher<CaretListener> myCaretMulticaster = EventDispatcher.create(CaretListener.class);
private final EventDispatcher<SelectionListener> mySelectionMulticaster = EventDispatcher.create(SelectionListener.class);
private final EventDispatcher<VisibleAreaListener> myVisibleAreaMulticaster = EventDispatcher.create(VisibleAreaListener.class);
private final EventDispatcher<PropertyChangeListener> myPropertyChangeMulticaster = EventDispatcher.create(PropertyChangeListener.class);
private final EventDispatcher<FocusChangeListener> myFocusChangeListenerMulticaster = EventDispatcher.create(FocusChangeListener.class);
public void registerDocument(@NotNull DocumentEx document) {
document.addDocumentListener(myDocumentMulticaster.getMulticaster());
document.addEditReadOnlyListener(myEditReadOnlyMulticaster.getMulticaster());
}
public void registerEditor(@NotNull EditorEx editor) {
editor.addEditorMouseListener(myEditorMouseMulticaster.getMulticaster());
editor.addEditorMouseMotionListener(myEditorMouseMotionMulticaster.getMulticaster());
((EditorMarkupModel) editor.getMarkupModel()).addErrorMarkerListener(myErrorStripeMulticaster.getMulticaster(), ((EditorImpl)editor).getDisposable());
editor.getCaretModel().addCaretListener(myCaretMulticaster.getMulticaster());
editor.getSelectionModel().addSelectionListener(mySelectionMulticaster.getMulticaster());
editor.getScrollingModel().addVisibleAreaListener(myVisibleAreaMulticaster.getMulticaster());
editor.addPropertyChangeListener(myPropertyChangeMulticaster.getMulticaster());
editor.addFocusListener(myFocusChangeListenerMulticaster.getMulticaster());
}
@Override
public void addDocumentListener(@NotNull DocumentListener listener) {
myDocumentMulticaster.addListener(listener);
}
@Override
public void addDocumentListener(@NotNull final DocumentListener listener, @NotNull Disposable parentDisposable) {
addDocumentListener(listener);
Disposer.register(parentDisposable, new Disposable() {
@Override
public void dispose() {
removeDocumentListener(listener);
}
});
}
@Override
public void removeDocumentListener(@NotNull DocumentListener listener) {
myDocumentMulticaster.removeListener(listener);
}
@Override
public void addEditorMouseListener(@NotNull EditorMouseListener listener) {
myEditorMouseMulticaster.addListener(listener);
}
@Override
public void addEditorMouseListener(@NotNull final EditorMouseListener listener, @NotNull final Disposable parentDisposable) {
addEditorMouseListener(listener);
Disposer.register(parentDisposable, new Disposable() {
@Override
public void dispose() {
removeEditorMouseListener(listener);
}
});
}
@Override
public void removeEditorMouseListener(@NotNull EditorMouseListener listener) {
myEditorMouseMulticaster.removeListener(listener);
}
@Override
public void addEditorMouseMotionListener(@NotNull EditorMouseMotionListener listener) {
myEditorMouseMotionMulticaster.addListener(listener);
}
@Override
public void addEditorMouseMotionListener(@NotNull final EditorMouseMotionListener listener, @NotNull final Disposable parentDisposable) {
addEditorMouseMotionListener(listener);
Disposer.register(parentDisposable, new Disposable() {
@Override
public void dispose() {
removeEditorMouseMotionListener(listener);
}
});
}
@Override
public void removeEditorMouseMotionListener(@NotNull EditorMouseMotionListener listener) {
myEditorMouseMotionMulticaster.removeListener(listener);
}
@Override
public void addCaretListener(@NotNull CaretListener listener) {
myCaretMulticaster.addListener(listener);
}
@Override
public void addCaretListener(@NotNull final CaretListener listener, @NotNull final Disposable parentDisposable) {
addCaretListener(listener);
Disposer.register(parentDisposable, new Disposable() {
@Override
public void dispose() {
removeCaretListener(listener);
}
});
}
@Override
public void removeCaretListener(@NotNull CaretListener listener) {
myCaretMulticaster.removeListener(listener);
}
@Override
public void addSelectionListener(@NotNull SelectionListener listener) {
mySelectionMulticaster.addListener(listener);
}
@Override
public void addSelectionListener(@NotNull SelectionListener listener, @NotNull Disposable parentDisposable) {
mySelectionMulticaster.addListener(listener, parentDisposable);
}
@Override
public void removeSelectionListener(@NotNull SelectionListener listener) {
mySelectionMulticaster.removeListener(listener);
}
@Override
public void addErrorStripeListener(@NotNull ErrorStripeListener listener) {
myErrorStripeMulticaster.addListener(listener);
}
@Override
public void addErrorStripeListener(@NotNull ErrorStripeListener listener, @NotNull Disposable parentDisposable) {
myErrorStripeMulticaster.addListener(listener, parentDisposable);
}
@Override
public void removeErrorStripeListener(@NotNull ErrorStripeListener listener) {
myErrorStripeMulticaster.removeListener(listener);
}
@Override
public void addVisibleAreaListener(@NotNull VisibleAreaListener listener) {
myVisibleAreaMulticaster.addListener(listener);
}
@Override
public void removeVisibleAreaListener(@NotNull VisibleAreaListener listener) {
myVisibleAreaMulticaster.removeListener(listener);
}
@Override
public void addEditReadOnlyListener(@NotNull EditReadOnlyListener listener) {
myEditReadOnlyMulticaster.addListener(listener);
}
@Override
public void removeEditReadOnlyListener(@NotNull EditReadOnlyListener listener) {
myEditReadOnlyMulticaster.removeListener(listener);
}
@Override
public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) {
myPropertyChangeMulticaster.addListener(listener);
}
@Override
public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) {
myPropertyChangeMulticaster.removeListener(listener);
}
@Override
public void addFocusChangeListner(@NotNull FocusChangeListener listener) {
myFocusChangeListenerMulticaster.addListener(listener);
}
@Override
public void addFocusChangeListner(@NotNull FocusChangeListener listener, @NotNull Disposable parentDisposable) {
myFocusChangeListenerMulticaster.addListener(listener,parentDisposable);
}
@Override
public void removeFocusChangeListner(@NotNull FocusChangeListener listener) {
myFocusChangeListenerMulticaster.removeListener(listener);
}
@TestOnly
public Map<Class, List> getListeners() {
Map<Class, List> myCopy = new LinkedHashMap<Class, List>();
myCopy.put(DocumentListener.class, new ArrayList<DocumentListener>(myDocumentMulticaster.getListeners()));
myCopy.put(EditReadOnlyListener.class, new ArrayList<EditReadOnlyListener>(myEditReadOnlyMulticaster.getListeners()));
myCopy.put(EditorMouseListener.class, new ArrayList<EditorMouseListener>(myEditorMouseMulticaster.getListeners()));
myCopy.put(EditorMouseMotionListener.class, new ArrayList<EditorMouseMotionListener>(myEditorMouseMotionMulticaster.getListeners()));
myCopy.put(ErrorStripeListener.class, new ArrayList<ErrorStripeListener>(myErrorStripeMulticaster.getListeners()));
myCopy.put(CaretListener.class, new ArrayList<CaretListener>(myCaretMulticaster.getListeners()));
myCopy.put(SelectionListener.class, new ArrayList<SelectionListener>(mySelectionMulticaster.getListeners()));
myCopy.put(VisibleAreaListener.class, new ArrayList<VisibleAreaListener>(myVisibleAreaMulticaster.getListeners()));
myCopy.put(PropertyChangeListener.class, new ArrayList<PropertyChangeListener>(myPropertyChangeMulticaster.getListeners()));
myCopy.put(FocusChangeListener.class, new ArrayList<FocusChangeListener>(myFocusChangeListenerMulticaster.getListeners()));
return myCopy;
}
}