From a169953a591e509b6424ecfe6e6822f09dc54736 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 28 Oct 2014 16:38:02 +0400 Subject: [PATCH] IDEA-131953 Multiple carets misbehave when auto completion dropdown opens --- .../completion/JavaAutoPopupTest.groovy | 41 +++++++++++++++++++ .../lookup/impl/LookupActionHandler.java | 18 ++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index 41e2b5bd71fc..5748716cb2e7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -650,6 +650,47 @@ public interface Test { assert !lookup } + public void testMulticaretLeftRightMovements() { + myFixture.configureByText("a.java", """ + class Foo { + void foo(String iterable) { + ter x + ter x + } + } + """) + type('i') + assert lookup + + edt { myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_CARET_RIGHT) } + myFixture.checkResult """ + class Foo { + void foo(String iterable) { + iter x + iter x + } + } + """ + joinAutopopup() + joinCompletion() + assert lookup + assert !lookup.calculating + + edt { myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_CARET_LEFT) } + myFixture.checkResult """ + class Foo { + void foo(String iterable) { + iter x + iter x + } + } + """ + joinAutopopup() + joinCompletion() + assert lookup + assert !lookup.calculating + } + public void testTypingInAnotherEditor() { myFixture.configureByText("a.java", "") type 'c' diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java index 80a0d05cb913..1ea0f9862af3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupActionHandler.java @@ -26,6 +26,7 @@ import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Caret; +import com.intellij.openapi.editor.CaretAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.project.DumbAwareAction; @@ -211,7 +212,7 @@ public abstract class LookupActionHandler extends EditorActionHandler { } @Override - protected void executeInLookup(LookupImpl lookup, DataContext context, Caret caret) { + protected void executeInLookup(LookupImpl lookup, DataContext context, final Caret caret) { final Editor editor = lookup.getEditor(); final int offset = editor.getCaretModel().getOffset(); CharSequence seq = editor.getDocument().getCharsSequence(); @@ -231,8 +232,19 @@ public abstract class LookupActionHandler extends EditorActionHandler { if (!lookup.performGuardedChange(new Runnable() { @Override public void run() { - editor.getSelectionModel().removeSelection(); - editor.getCaretModel().moveToOffset(offset + 1); + CaretAction action = new CaretAction() { + @Override + public void perform(Caret caret) { + caret.removeSelection(); + caret.moveToOffset(caret.getOffset() + 1); + } + }; + if (caret == null) { + editor.getCaretModel().runForEachCaret(action); + } + else { + action.perform(caret); + } } })) { return;