diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorLastActionTrackerImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorLastActionTrackerImpl.java index 8e2d4e7429f3..e86e86247610 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorLastActionTrackerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorLastActionTrackerImpl.java @@ -15,19 +15,24 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.AnActionListener; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.EditorLastActionTracker; -import com.intellij.openapi.editor.event.EditorEventMulticaster; -import com.intellij.openapi.editor.event.EditorMouseEvent; -import com.intellij.openapi.editor.event.EditorMouseListener; +import com.intellij.openapi.editor.event.*; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class EditorLastActionTrackerImpl extends EditorLastActionTracker implements ApplicationComponent, AnActionListener, EditorMouseListener { +public class EditorLastActionTrackerImpl extends EditorLastActionTracker implements ApplicationComponent, + AnActionListener, + EditorMouseListener { + private static final Key DISPOSABLE_SET = Key.create("EditorLastActionTracker.dispose.handler.set"); + private final ActionManager myActionManager; private final EditorEventMulticaster myEditorEventMulticaster; @@ -67,6 +72,7 @@ public class EditorLastActionTrackerImpl extends EditorLastActionTracker impleme @Override public void beforeActionPerformed(AnAction action, DataContext dataContext, AnActionEvent event) { myCurrentEditor = CommonDataKeys.EDITOR.getData(dataContext); + registerDisposeHandler(myCurrentEditor); if (myCurrentEditor != myLastEditor) { resetLastAction(); } @@ -117,4 +123,24 @@ public class EditorLastActionTrackerImpl extends EditorLastActionTracker impleme myLastActionId = null; myLastEditor = null; } + + private void registerDisposeHandler(final Editor editor) { + if (!(editor instanceof EditorImpl)) { + return; + } + EditorImpl editorImpl = (EditorImpl)editor; + if (editorImpl.replace(DISPOSABLE_SET, null, Boolean.TRUE)) { + Disposer.register(editorImpl.getDisposable(), new Disposable() { + @Override + public void dispose() { + if (myCurrentEditor == editor) { + myCurrentEditor = null; + } + if (myLastEditor == editor) { + myLastEditor = null; + } + } + }); + } + } }