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 afa0aa70f513..8d1919e7c1ff 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java @@ -31,6 +31,8 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.TypedAction; import com.intellij.openapi.editor.event.*; +import com.intellij.openapi.editor.ex.EditorEx; +import com.intellij.openapi.editor.ex.FocusChangeListener; import com.intellij.openapi.fileEditor.FileEditorManagerAdapter; import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.fileEditor.FileEditorManagerListener; @@ -177,6 +179,19 @@ public abstract class CompletionPhase implements Disposable { } } }, this); + if (indicator.isAutopopupCompletion()) { + // 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); + } + }, this); + } } @Override diff --git a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java index d6da349d512a..6c0907beb148 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java @@ -21,6 +21,7 @@ import com.intellij.ide.CutProvider; import com.intellij.ide.DeleteProvider; import com.intellij.ide.PasteProvider; import com.intellij.ide.highlighter.HighlighterFactory; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.*; @@ -628,6 +629,11 @@ public class EditorWindow extends UserDataHolderBase implements EditorEx { myDelegate.addFocusListener(listener); } + @Override + public void addFocusListener(@NotNull FocusChangeListener listener, Disposable parentDisposable) { + myDelegate.addFocusListener(listener, parentDisposable); + } + @Override public Project getProject() { return myDelegate.getProject(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java index b5e04cbabe43..3e5575154407 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java @@ -19,6 +19,7 @@ import com.intellij.ide.CopyProvider; import com.intellij.ide.CutProvider; import com.intellij.ide.DeleteProvider; import com.intellij.ide.PasteProvider; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; @@ -105,6 +106,8 @@ public interface EditorEx extends Editor { boolean setCaretEnabled(boolean enabled); void addFocusListener(@NotNull FocusChangeListener listener); + + void addFocusListener(@NotNull FocusChangeListener listener, Disposable parentDisposable); void setOneLineMode(boolean b); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 29853472614e..09c4cbcd305f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -4268,6 +4268,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myFocusListeners.add(listener); } + @Override + public void addFocusListener(@NotNull FocusChangeListener listener, Disposable parentDisposable) { + ContainerUtil.add(listener, myFocusListeners, parentDisposable); + } + @Override @Nullable public Project getProject() {