IDEA-80056 Column selection mode improvement

avoid leaking Editor
This commit is contained in:
Dmitry Batrak
2014-02-20 18:49:56 +04:00
parent 83550bf5c1
commit ec8a5d224a
@@ -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<Boolean> 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;
}
}
});
}
}
}