mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
tests memory leak
This commit is contained in:
@@ -180,12 +180,12 @@ public abstract class CompletionPhase implements Disposable {
|
||||
}
|
||||
}, this);
|
||||
if (indicator.isAutopopupCompletion()) {
|
||||
// lookup is not visible, we have to check ourselves if editor retains focus
|
||||
// lookup is not visible, we have to check ourselves if editor retains focus
|
||||
((EditorEx)indicator.getEditor()).addFocusListener(new FocusChangeListener() {
|
||||
@Override
|
||||
public void focusGained(Editor editor) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void focusLost(Editor editor) {
|
||||
indicator.closeAndFinish(true);
|
||||
@@ -318,14 +318,12 @@ public abstract class CompletionPhase implements Disposable {
|
||||
private final Project project;
|
||||
private final EditorMouseAdapter mouseListener;
|
||||
private final CaretListener caretListener;
|
||||
private final DocumentAdapter documentListener;
|
||||
private final PropertyChangeListener lookupListener;
|
||||
private final SelectionListener selectionListener;
|
||||
|
||||
public EmptyAutoPopup(CompletionProgressIndicator indicator) {
|
||||
super(indicator);
|
||||
this.editor = indicator.getEditor();
|
||||
this.project = indicator.getProject();
|
||||
editor = indicator.getEditor();
|
||||
project = indicator.getProject();
|
||||
MessageBusConnection connection = project.getMessageBus().connect(this);
|
||||
connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() {
|
||||
@Override
|
||||
@@ -355,26 +353,24 @@ public abstract class CompletionPhase implements Disposable {
|
||||
stopAutoPopup();
|
||||
}
|
||||
};
|
||||
documentListener = new DocumentAdapter() {
|
||||
|
||||
editor.addEditorMouseListener(mouseListener);
|
||||
editor.getCaretModel().addCaretListener(caretListener);
|
||||
editor.getDocument().addDocumentListener(new DocumentAdapter() {
|
||||
@Override
|
||||
public void documentChanged(DocumentEvent e) {
|
||||
if (!TypedAction.isTypedActionInProgress()) {
|
||||
stopAutoPopup();
|
||||
}
|
||||
}
|
||||
};
|
||||
lookupListener = new PropertyChangeListener() {
|
||||
}, this);
|
||||
editor.getSelectionModel().addSelectionListener(selectionListener);
|
||||
LookupManager.getInstance(project).addPropertyChangeListener(new PropertyChangeListener() {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
stopAutoPopup();
|
||||
}
|
||||
};
|
||||
|
||||
editor.addEditorMouseListener(mouseListener);
|
||||
editor.getCaretModel().addCaretListener(caretListener);
|
||||
editor.getDocument().addDocumentListener(documentListener);
|
||||
editor.getSelectionModel().addSelectionListener(selectionListener);
|
||||
LookupManager.getInstance(project).addPropertyChangeListener(lookupListener);
|
||||
}, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -382,8 +378,6 @@ public abstract class CompletionPhase implements Disposable {
|
||||
editor.removeEditorMouseListener(mouseListener);
|
||||
editor.getCaretModel().removeCaretListener(caretListener);
|
||||
editor.getSelectionModel().removeSelectionListener(selectionListener);
|
||||
editor.getDocument().removeDocumentListener(documentListener);
|
||||
LookupManager.getInstance(project).removePropertyChangeListener(lookupListener);
|
||||
}
|
||||
|
||||
private static void stopAutoPopup() {
|
||||
|
||||
@@ -48,18 +48,15 @@ import java.beans.PropertyChangeListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ParameterInfoController {
|
||||
public class ParameterInfoController implements Disposable {
|
||||
private final Project myProject;
|
||||
@NotNull private final Editor myEditor;
|
||||
|
||||
private final String myParameterCloseChars;
|
||||
private final RangeMarker myLbraceMarker;
|
||||
private final LightweightHint myHint;
|
||||
private final ParameterInfoComponent myComponent;
|
||||
|
||||
private final CaretListener myEditorCaretListener;
|
||||
private final DocumentListener myEditorDocumentListener;
|
||||
private final PropertyChangeListener myLookupListener;
|
||||
@NotNull private final ParameterInfoHandler<Object, Object> myHandler;
|
||||
private final ShowParameterInfoHandler.BestLocationPointProvider myProvider;
|
||||
|
||||
@@ -71,16 +68,16 @@ public class ParameterInfoController {
|
||||
/**
|
||||
* Keeps Vector of ParameterInfoController's in Editor
|
||||
*/
|
||||
private static final Key<ArrayList<ParameterInfoController>> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY");
|
||||
private static final Key<List<ParameterInfoController>> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY");
|
||||
|
||||
public static ParameterInfoController findControllerAtOffset(Editor editor, int offset) {
|
||||
ArrayList<ParameterInfoController> allControllers = getAllControllers(editor);
|
||||
List<ParameterInfoController> allControllers = getAllControllers(editor);
|
||||
for (int i = 0; i < allControllers.size(); ++i) {
|
||||
ParameterInfoController controller = allControllers.get(i);
|
||||
|
||||
if (controller.myLbraceMarker.getStartOffset() == offset) {
|
||||
if (controller.myHint.isVisible()) return controller;
|
||||
controller.dispose();
|
||||
Disposer.dispose(controller);
|
||||
--i;
|
||||
}
|
||||
}
|
||||
@@ -147,8 +144,8 @@ public class ParameterInfoController {
|
||||
}
|
||||
}
|
||||
|
||||
private static ArrayList<ParameterInfoController> getAllControllers(@NotNull Editor editor) {
|
||||
ArrayList<ParameterInfoController> array = editor.getUserData(ALL_CONTROLLERS_KEY);
|
||||
private static List<ParameterInfoController> getAllControllers(@NotNull Editor editor) {
|
||||
List<ParameterInfoController> array = editor.getUserData(ALL_CONTROLLERS_KEY);
|
||||
if (array == null){
|
||||
array = new ArrayList<ParameterInfoController>();
|
||||
editor.putUserData(ALL_CONTROLLERS_KEY, array);
|
||||
@@ -170,12 +167,11 @@ public class ParameterInfoController {
|
||||
myEditor = editor;
|
||||
myHandler = handler;
|
||||
myProvider = provider;
|
||||
myParameterCloseChars = handler.getParameterCloseChars();
|
||||
myLbraceMarker = editor.getDocument().createRangeMarker(lbraceOffset, lbraceOffset);
|
||||
myHint = hint;
|
||||
myComponent = (ParameterInfoComponent)myHint.getComponent();
|
||||
|
||||
ArrayList<ParameterInfoController> allControllers = getAllControllers(myEditor);
|
||||
List<ParameterInfoController> allControllers = getAllControllers(myEditor);
|
||||
allControllers.add(this);
|
||||
|
||||
myEditorCaretListener = new CaretListener(){
|
||||
@@ -187,53 +183,46 @@ public class ParameterInfoController {
|
||||
};
|
||||
myEditor.getCaretModel().addCaretListener(myEditorCaretListener);
|
||||
|
||||
myEditorDocumentListener = new DocumentAdapter(){
|
||||
myEditor.getDocument().addDocumentListener(new DocumentAdapter() {
|
||||
@Override
|
||||
public void documentChanged(DocumentEvent e) {
|
||||
myAlarm.cancelAllRequests();
|
||||
addAlarmRequest();
|
||||
}
|
||||
};
|
||||
myEditor.getDocument().addDocumentListener(myEditorDocumentListener);
|
||||
}, this);
|
||||
|
||||
myLookupListener = new PropertyChangeListener() {
|
||||
PropertyChangeListener lookupListener = new PropertyChangeListener() {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
if (LookupManager.PROP_ACTIVE_LOOKUP.equals(evt.getPropertyName())){
|
||||
if (LookupManager.PROP_ACTIVE_LOOKUP.equals(evt.getPropertyName())) {
|
||||
final LookupImpl lookup = (LookupImpl)evt.getNewValue();
|
||||
if (lookup != null && lookup.isShown()){
|
||||
if (lookup != null && lookup.isShown()) {
|
||||
adjustPositionForLookup(lookup);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
LookupManager.getInstance(project).addPropertyChangeListener(myLookupListener);
|
||||
LookupManager.getInstance(project).addPropertyChangeListener(lookupListener, this);
|
||||
|
||||
updateComponent();
|
||||
if (myEditor instanceof EditorImpl) {
|
||||
Disposer.register(((EditorImpl)myEditor).getDisposable(), new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
ParameterInfoController.this.dispose();
|
||||
}
|
||||
});
|
||||
Disposer.register(((EditorImpl)myEditor).getDisposable(), this);
|
||||
}
|
||||
}
|
||||
|
||||
private void dispose(){
|
||||
@Override
|
||||
public void dispose(){
|
||||
if (myDisposed) return;
|
||||
myDisposed = true;
|
||||
|
||||
ArrayList<ParameterInfoController> allControllers = getAllControllers(myEditor);
|
||||
List<ParameterInfoController> allControllers = getAllControllers(myEditor);
|
||||
allControllers.remove(this);
|
||||
myEditor.getCaretModel().removeCaretListener(myEditorCaretListener);
|
||||
myEditor.getDocument().removeDocumentListener(myEditorDocumentListener);
|
||||
LookupManager.getInstance(myProject).removePropertyChangeListener(myLookupListener);
|
||||
}
|
||||
|
||||
private void adjustPositionForLookup(@NotNull Lookup lookup) {
|
||||
if (!myHint.isVisible() || myEditor.isDisposed()) {
|
||||
dispose();
|
||||
Disposer.dispose(this);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -259,7 +248,7 @@ public class ParameterInfoController {
|
||||
|
||||
private void updateComponent(){
|
||||
if (!myHint.isVisible()){
|
||||
dispose();
|
||||
Disposer.dispose(this);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -382,7 +371,7 @@ public class ParameterInfoController {
|
||||
@Override
|
||||
public void removeHint() {
|
||||
myHint.hide();
|
||||
dispose();
|
||||
Disposer.dispose(ParameterInfoController.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.intellij.codeInsight.lookup;
|
||||
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.components.ServiceManager;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -45,18 +46,20 @@ public abstract class LookupManager {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public LookupEx showLookup(Editor editor, @NotNull LookupElement... items) {
|
||||
public LookupEx showLookup(@NotNull Editor editor, @NotNull LookupElement... items) {
|
||||
return showLookup(editor, items, "", new LookupArranger.DefaultArranger());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public LookupEx showLookup(Editor editor, @NotNull LookupElement[] items, @NotNull String prefix) {
|
||||
public LookupEx showLookup(@NotNull Editor editor, @NotNull LookupElement[] items, @NotNull String prefix) {
|
||||
return showLookup(editor, items, prefix, new LookupArranger.DefaultArranger());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public abstract LookupEx showLookup(Editor editor, @NotNull LookupElement[] items,
|
||||
@NotNull String prefix, @NotNull LookupArranger arranger);
|
||||
public abstract LookupEx showLookup(@NotNull Editor editor,
|
||||
@NotNull LookupElement[] items,
|
||||
@NotNull String prefix,
|
||||
@NotNull LookupArranger arranger);
|
||||
|
||||
public abstract void hideActiveLookup();
|
||||
|
||||
@@ -65,11 +68,11 @@ public abstract class LookupManager {
|
||||
|
||||
@NonNls public static final String PROP_ACTIVE_LOOKUP = "activeLookup";
|
||||
|
||||
public abstract void addPropertyChangeListener(PropertyChangeListener listener);
|
||||
public abstract void removePropertyChangeListener(PropertyChangeListener listener);
|
||||
public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener);
|
||||
public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable disposable);
|
||||
public abstract void removePropertyChangeListener(@NotNull PropertyChangeListener listener);
|
||||
|
||||
//public abstract boolean isDisposed();
|
||||
|
||||
public abstract Lookup createLookup(Editor editor, @NotNull LookupElement[] items, @NotNull final String prefix, LookupArranger arranger);
|
||||
@NotNull
|
||||
public abstract Lookup createLookup(@NotNull Editor editor, @NotNull LookupElement[] items, @NotNull final String prefix, @NotNull LookupArranger arranger);
|
||||
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import com.intellij.codeInsight.documentation.DocumentationManager;
|
||||
import com.intellij.codeInsight.hint.EditorHintListener;
|
||||
import com.intellij.codeInsight.hint.HintManager;
|
||||
import com.intellij.codeInsight.lookup.*;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
@@ -110,7 +111,7 @@ public class LookupManagerImpl extends LookupManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LookupEx showLookup(final Editor editor,
|
||||
public LookupEx showLookup(@NotNull final Editor editor,
|
||||
@NotNull LookupElement[] items,
|
||||
@NotNull final String prefix,
|
||||
@NotNull final LookupArranger arranger) {
|
||||
@@ -119,11 +120,12 @@ public class LookupManagerImpl extends LookupManager {
|
||||
}
|
||||
|
||||
LookupImpl lookup = createLookup(editor, items, prefix, arranger);
|
||||
return lookup != null && lookup.showLookup() ? lookup : null;
|
||||
return lookup.showLookup() ? lookup : null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public LookupImpl createLookup(final Editor editor,
|
||||
public LookupImpl createLookup(@NotNull final Editor editor,
|
||||
@NotNull LookupElement[] items,
|
||||
@NotNull final String prefix,
|
||||
@NotNull final LookupArranger arranger) {
|
||||
@@ -213,12 +215,13 @@ public class LookupManagerImpl extends LookupManager {
|
||||
myActiveLookup.addItem(item, matcher);
|
||||
}
|
||||
myActiveLookup.refreshUi(true, true);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
alarm.cancelAllRequests(); // no items -> no doc
|
||||
}
|
||||
|
||||
myPropertyChangeSupport.firePropertyChange(PROP_ACTIVE_LOOKUP, null, myActiveLookup);
|
||||
return myActiveLookup;
|
||||
return lookup;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -243,12 +246,23 @@ public class LookupManagerImpl extends LookupManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener listener) {
|
||||
public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) {
|
||||
myPropertyChangeSupport.addPropertyChangeListener(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener listener) {
|
||||
public void addPropertyChangeListener(@NotNull final PropertyChangeListener listener, @NotNull Disposable disposable) {
|
||||
addPropertyChangeListener(listener);
|
||||
Disposer.register(disposable, new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
removePropertyChangeListener(listener);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) {
|
||||
myPropertyChangeSupport.removePropertyChangeListener(listener);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user