From 2a7e9af40554432a2a21b1200c4c451dfa3c9979 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 17 Aug 2017 19:15:12 +0300 Subject: [PATCH] fix behaviour of Ctrl+Up/Down when parameter info is shown ... and lookup is not shown --- .../JavaMethodOverloadSwitchHandler.java | 53 ++++++++------- .../completion/CompletionHintsTest.java | 4 +- .../lookup/impl/LookupActionHandler.java | 65 ++++++++++--------- resources/src/META-INF/IdeaPlugin.xml | 9 +-- 4 files changed, 71 insertions(+), 60 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaMethodOverloadSwitchHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaMethodOverloadSwitchHandler.java index 729f06204631..9e292e653b7c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaMethodOverloadSwitchHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaMethodOverloadSwitchHandler.java @@ -20,11 +20,14 @@ import com.intellij.codeInsight.completion.CompletionMemory; import com.intellij.codeInsight.completion.JavaMethodCallElement; import com.intellij.codeInsight.hint.ParameterInfoController; import com.intellij.codeInsight.hints.ParameterHintsPass; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; @@ -181,47 +184,53 @@ abstract class JavaMethodOverloadSwitchHandler extends EditorActionHandler { } public static class UpInEditor extends UpDownInEditor { - public UpInEditor() { - super(true); + public UpInEditor(EditorActionHandler originalHandler) { + super(originalHandler, true); } } public static class DownInEditor extends UpDownInEditor { - public DownInEditor() { - super(false); + public DownInEditor(EditorActionHandler originalHandler) { + super(originalHandler, false); } } - private static abstract class UpDownInEditor extends AnAction { + private static abstract class UpDownInEditor extends EditorActionHandler { + private final EditorActionHandler myOriginalHandler; private final boolean myUp; - private UpDownInEditor(boolean up) { + private UpDownInEditor(EditorActionHandler originalHandler, boolean up) { + myOriginalHandler = originalHandler; myUp = up; } @Override - public void update(AnActionEvent e) { - Editor editor = e.getData(CommonDataKeys.EDITOR); - e.getPresentation().setEnabled(CodeInsightSettings.getInstance().SHOW_PARAMETER_NAME_HINTS_ON_COMPLETION && editor != null && - ParameterInfoController.existsWithVisibleHintForEditor(editor, false)); + protected boolean isEnabledForCaret(@NotNull Editor editor, @NotNull Caret caret, DataContext dataContext) { + return myOriginalHandler.isEnabled(editor, caret, dataContext) || + isEnabled(editor); + } + + private static boolean isEnabled(@NotNull Editor editor) { + return CodeInsightSettings.getInstance().SHOW_PARAMETER_NAME_HINTS_ON_COMPLETION && + ParameterInfoController.existsWithVisibleHintForEditor(editor, false); } @Override - public void actionPerformed(AnActionEvent e) { - Editor editor = e.getData(CommonDataKeys.EDITOR); - assert editor != null; - ParameterInfoController.hideAllHints(editor); + protected void doExecute(@NotNull Editor editor, @Nullable Caret caret, DataContext dataContext) { + if (isEnabled(editor)) { + ParameterInfoController.hideAllHints(editor); + } // hints can be hidden asynchronously (with animation), so we disable switching explicitly here editor.putUserData(SWITCH_DISABLED, Boolean.TRUE); try { - ActionManager actionManager = ActionManager.getInstance(); - AnAction action = actionManager.getAction(myUp ? IdeActions.ACTION_LOOKUP_UP - : IdeActions.ACTION_LOOKUP_DOWN); - if (action == null) { - action = actionManager.getAction(myUp ? IdeActions.ACTION_EDITOR_MOVE_CARET_UP - : IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN); + if (myOriginalHandler.isEnabled(editor, caret, dataContext)) { + myOriginalHandler.execute(editor, caret, dataContext); + } + else { + EditorActionManager.getInstance().getActionHandler(myUp ? IdeActions.ACTION_EDITOR_MOVE_CARET_UP + : IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN) + .execute(editor, caret, dataContext); } - action.actionPerformed(e); } finally { editor.putUserData(SWITCH_DISABLED, null); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/CompletionHintsTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/CompletionHintsTest.java index 3c4b208ab00b..52369b000c27 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/CompletionHintsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/CompletionHintsTest.java @@ -565,7 +565,7 @@ public class CompletionHintsTest extends LightFixtureCompletionTestCase { waitForAllAsyncStuff(); checkHintContents("@NotNull String key\n" + "@NotNull String key, String def"); - myFixture.performEditorAction("EditorOverloadUp"); + myFixture.performEditorAction(IdeActions.ACTION_LOOKUP_UP); waitForAllAsyncStuff(); checkResultWithInlays("class C { void m() { System.getProperty(, ) } }"); checkHintContents(null); @@ -580,7 +580,7 @@ public class CompletionHintsTest extends LightFixtureCompletionTestCase { waitForAllAsyncStuff(); checkHintContents("@NotNull String key\n" + "@NotNull String key, String def"); - myFixture.performEditorAction("EditorOverloadDown"); + myFixture.performEditorAction(IdeActions.ACTION_LOOKUP_DOWN); waitForAllAsyncStuff(); checkResultWithInlays("class C { void m() { System.getProperty(, ) } }"); checkHintContents(null); 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 8a91f49863d1..0fd3fa860c2e 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 @@ -20,16 +20,18 @@ import com.intellij.codeInsight.completion.CodeCompletionFeatures; import com.intellij.codeInsight.completion.CompletionProgressIndicator; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.lookup.CharFilter; -import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.ide.ui.UISettings; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.CaretAction; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; -import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.editor.actionSystem.EditorActionManager; +import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.ui.ScrollingUtil; import org.jetbrains.annotations.NotNull; @@ -105,39 +107,44 @@ public abstract class LookupActionHandler extends EditorActionHandler { } - public static class UpAction extends DumbAwareAction { - - @Override - public void actionPerformed(AnActionEvent e) { - FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); - LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); - assert lookup != null : LookupImpl.getLastLookupDisposeTrace(); - lookup.hideLookup(true); - ActionManager.getInstance().getAction(IdeActions.ACTION_EDITOR_MOVE_CARET_UP).actionPerformed(e); - } - - @Override - public void update(AnActionEvent e) { - Lookup lookup = LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); - e.getPresentation().setEnabled(lookup != null); + public static class UpAction extends EditorAction implements DumbAware { + public UpAction() { + super(new UpDownInEditorHandler(true)); } } - public static class DownAction extends DumbAwareAction { + public static class DownAction extends EditorAction implements DumbAware { + public DownAction() { + super(new UpDownInEditorHandler(false)); + } + } - @Override - public void actionPerformed(AnActionEvent e) { - FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); - LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); - assert lookup != null : LookupImpl.getLastLookupDisposeTrace(); - lookup.hideLookup(true); - ActionManager.getInstance().getAction(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN).actionPerformed(e); + private static class UpDownInEditorHandler extends EditorActionHandler { + private final boolean myUp; + + private UpDownInEditorHandler(boolean up) { + myUp = up; } @Override - public void update(AnActionEvent e) { - Lookup lookup = LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); - e.getPresentation().setEnabled(lookup != null); + public boolean executeInCommand(@NotNull Editor editor, DataContext dataContext) { + return false; + } + + @Override + protected boolean isEnabledForCaret(@NotNull Editor editor, @NotNull Caret caret, DataContext dataContext) { + return LookupManager.getActiveLookup(editor) != null; + } + + @Override + protected void doExecute(@NotNull Editor editor, @Nullable Caret caret, DataContext dataContext) { + FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); + LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(editor); + assert lookup != null : LookupImpl.getLastLookupDisposeTrace(); + lookup.hideLookup(true); + EditorActionManager.getInstance().getActionHandler(myUp ? IdeActions.ACTION_EDITOR_MOVE_CARET_UP + : IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN) + .execute(editor, caret, dataContext); } } diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index d8b4bc2e1239..759172a79951 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -17,13 +17,6 @@ com.intellij IDEA CORE - - - - - @@ -1431,6 +1424,8 @@ + +