diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java index 8d1919e7c1ff..3386629f8e5e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java @@ -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() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoController.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoController.java index a16223f1fd49..966c935b0698 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoController.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoController.java @@ -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 myHandler; private final ShowParameterInfoHandler.BestLocationPointProvider myProvider; @@ -71,16 +68,16 @@ public class ParameterInfoController { /** * Keeps Vector of ParameterInfoController's in Editor */ - private static final Key> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY"); + private static final Key> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY"); public static ParameterInfoController findControllerAtOffset(Editor editor, int offset) { - ArrayList allControllers = getAllControllers(editor); + List 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 getAllControllers(@NotNull Editor editor) { - ArrayList array = editor.getUserData(ALL_CONTROLLERS_KEY); + private static List getAllControllers(@NotNull Editor editor) { + List array = editor.getUserData(ALL_CONTROLLERS_KEY); if (array == null){ array = new ArrayList(); 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 allControllers = getAllControllers(myEditor); + List 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 allControllers = getAllControllers(myEditor); + List 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 diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java index a1a95fd65e09..326015cbb616 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java @@ -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); } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java index cdaebe5bac0c..511f6ee5f9a8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupManagerImpl.java @@ -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); }