diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java index 60db6b033af2..a563f3468ae9 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java @@ -669,6 +669,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre @Override public void dispose() { + super.dispose(); myTreeModel.removeEditorPositionListener(myFileEditorPositionListener); } diff --git a/platform/structure-view-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java b/platform/structure-view-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java index a8c254c04e25..ca133e5f9c18 100644 --- a/platform/structure-view-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java +++ b/platform/structure-view-api/src/com/intellij/ide/structureView/TextEditorBasedStructureViewModel.java @@ -39,7 +39,7 @@ import java.util.List; /** * The standard {@link StructureViewModel} implementation which is linked to a text editor. * - * @see com.intellij.ide.structureView.TreeBasedStructureViewBuilder#createStructureViewModel(Editor editor) + * @see TreeBasedStructureViewBuilder#createStructureViewModel(Editor editor) */ public abstract class TextEditorBasedStructureViewModel implements StructureViewModel, ProvidingTreeModel { @@ -48,6 +48,7 @@ public abstract class TextEditorBasedStructureViewModel implements StructureView private final Disposable myDisposable = Disposer.newDisposable(); private final List myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private List myModelListeners = new ArrayList(2); + private CaretAdapter myEditorCaretListener; /** * Creates a structure view model instance linked to a text editor displaying the specified @@ -72,28 +73,32 @@ public abstract class TextEditorBasedStructureViewModel implements StructureView myEditor = editor; myPsiFile = file; - if (editor != null) { - EditorFactory.getInstance().getEventMulticaster().addCaretListener(new CaretAdapter() { - @Override - public void caretPositionChanged(CaretEvent e) { - if (e.getEditor().equals(myEditor)) { - for (FileEditorPositionListener listener : myListeners) { - listener.onCurrentElementChanged(); - } + myEditorCaretListener = new CaretAdapter() { + @Override + public void caretPositionChanged(CaretEvent e) { + if (e.getEditor().equals(myEditor)) { + for (FileEditorPositionListener listener : myListeners) { + listener.onCurrentElementChanged(); } } - }, myDisposable); - } + } + }; } @Override public final void addEditorPositionListener(@NotNull FileEditorPositionListener listener) { + if (myEditor != null && myListeners.isEmpty()) { + EditorFactory.getInstance().getEventMulticaster().addCaretListener(myEditorCaretListener, myDisposable); + } myListeners.add(listener); } @Override public final void removeEditorPositionListener(@NotNull FileEditorPositionListener listener) { myListeners.remove(listener); + if (myEditor != null && myListeners.isEmpty()) { + EditorFactory.getInstance().getEventMulticaster().removeCaretListener(myEditorCaretListener); + } } @Override