From 8237494039d393bd92b8eacfed4fef5b33ecb9d7 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Sat, 25 Sep 2010 19:33:21 +0400 Subject: [PATCH] IDEA-58896 Multi-stroke keys partly broken [refix] --- .../openapi/keymap/impl/KeymapImpl.java | 4 ++ .../openapi/keymap/impl/ui/ActionsTree.java | 9 ++++ .../keymap/impl/ui/ActionsTreeUtil.java | 44 +++++++++++++++---- .../src/idea/Keymap_Default.xml | 3 ++ .../src/idea/Keymap_Mac.xml | 7 ++- .../src/idea/Keymap_MacClassic.xml | 4 ++ .../src/idea/Keymap_Netbeans.xml | 2 +- .../src/idea/Keymap_VisualStudio.xml | 3 ++ .../src/idea/PlatformLangActionManager.xml | 2 +- resources/src/idea/IdeaActions.xml | 2 +- 10 files changed, 68 insertions(+), 12 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.java index 45a4a680d373..4b641a6dab8c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.java @@ -493,6 +493,10 @@ public class KeymapImpl implements Keymap, ExternalizableScheme { return ids; } + public boolean isActionBound(@NotNull final String actionId) { + return getKeymapManager().getBoundActions().contains(actionId); + } + public Shortcut[] getShortcuts(String actionId) { KeymapManagerEx keymapManager = getKeymapManager(); if (keymapManager.getBoundActions().contains(actionId)) { diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTree.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTree.java index f5fa442b159c..fe468c379802 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTree.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTree.java @@ -23,9 +23,11 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.keymap.KeyMapBundle; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.openapi.keymap.impl.KeymapImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.LayeredIcon; import com.intellij.ui.ScrollPaneFactory; @@ -58,6 +60,7 @@ public class ActionsTree { private final JScrollPane myComponent; private Keymap myKeymap; private Group myMainGroup = new Group("", null, null); + private boolean myShowBoundActions = Registry.is("keymap.show.alias.actions"); @NonNls private static final String ROOT = "ROOT"; @@ -73,6 +76,7 @@ public class ActionsTree { Keymap originalKeymap = myKeymap != null ? myKeymap.getParent() : null; Icon icon = null; String text; + boolean bound = false; if (value instanceof DefaultMutableTreeNode) { Object userObject = ((DefaultMutableTreeNode)value).getUserObject(); boolean changed; @@ -88,6 +92,7 @@ public class ActionsTree { } else if (userObject instanceof String) { String actionId = (String)userObject; + bound = myShowBoundActions && ((KeymapImpl)myKeymap).isActionBound(actionId); AnAction action = ActionManager.getInstance().getActionOrStub(actionId); if (action != null) { text = action.getTemplatePresentation().getText(); @@ -133,6 +138,10 @@ public class ActionsTree { else { foreground = UIUtil.getTreeForeground(); } + + if (bound) { + foreground = Color.MAGENTA; + } } SearchUtil.appendFragments(myFilter, text, Font.PLAIN, foreground, selected ? UIUtil.getTreeSelectionBackground() : UIUtil.getTreeTextBackground(), this); } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTreeUtil.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTreeUtil.java index 98d4ed829921..e61b105ea5a5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTreeUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ActionsTreeUtil.java @@ -28,13 +28,16 @@ import com.intellij.openapi.keymap.KeyMapBundle; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapExtension; import com.intellij.openapi.keymap.ex.KeymapManagerEx; +import com.intellij.openapi.keymap.impl.KeymapImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; @@ -113,6 +116,25 @@ public class ActionsTreeUtil { return group; } + @Nullable + private static Condition wrapFilter(@Nullable final Condition filter, final Keymap keymap, final ActionManager actionManager) { + if (Registry.is("keymap.show.alias.actions")) return filter; + + return new Condition() { + @Override + public boolean value(final AnAction action) { + if (action == null) return false; + final String id = action instanceof ActionStub ? ((ActionStub)action).getId() : actionManager.getId(action); + if (id != null) { + boolean actionBound = isActionBound(keymap, id); + return filter == null ? !actionBound : !actionBound && filter.value(action); + } + + return filter == null ? true : filter.value(action); + } + }; + } + private static void fillGroupIgnorePopupFlag(ActionGroup actionGroup, Group group, Condition filtered) { AnAction[] mainMenuTopGroups = actionGroup instanceof DefaultActionGroup ? ((DefaultActionGroup)actionGroup).getChildActionsOrStubs() @@ -126,7 +148,6 @@ public class ActionsTreeUtil { } public static Group createGroup(ActionGroup actionGroup, boolean ignore, Condition filtered) { - return createGroup(actionGroup, getName(actionGroup), null, null, ignore, filtered); } @@ -222,6 +243,12 @@ public class ActionsTreeUtil { return group; } + private static boolean isActionBound(final Keymap keymap, final String id) { + if (keymap == null) return false; + Keymap parent = keymap.getParent(); + return ((KeymapImpl)keymap).isActionBound(id) || (parent != null && ((KeymapImpl)parent).isActionBound(id)); + } + private static void addEditorActions(final Condition filtered, final DefaultActionGroup editorGroup, final ArrayList ids) { @@ -397,20 +424,21 @@ public class ActionsTreeUtil { final String filter, final boolean forceFiltering, final Condition filtered) { + final Condition wrappedFilter = wrapFilter(filtered, keymap, ActionManager.getInstance()); Group mainGroup = new Group(KeyMapBundle.message("all.actions.group.title"), null, null); - mainGroup.addGroup(createEditorActionsGroup(filtered)); - mainGroup.addGroup(createMainMenuGroup(filtered)); + mainGroup.addGroup(createEditorActionsGroup(wrappedFilter)); + mainGroup.addGroup(createMainMenuGroup(wrappedFilter)); for (KeymapExtension extension : Extensions.getExtensions(KeymapExtension.EXTENSION_POINT_NAME)) { - final Group group = createExtensionGroup(filtered, project, extension); + final Group group = createExtensionGroup(wrappedFilter, project, extension); if (group != null) { mainGroup.addGroup(group); } } - mainGroup.addGroup(createMacrosGroup(filtered)); - mainGroup.addGroup(createQuickListsGroup(filtered, filter, forceFiltering, quickLists)); - final Group otherGroup = createOtherGroup(filtered, mainGroup, keymap); + mainGroup.addGroup(createMacrosGroup(wrappedFilter)); + mainGroup.addGroup(createQuickListsGroup(wrappedFilter, filter, forceFiltering, quickLists)); + final Group otherGroup = createOtherGroup(wrappedFilter, mainGroup, keymap); mainGroup.addGroup(otherGroup); - mainGroup.addGroup(createPluginsActionsGroup(filtered, otherGroup)); + mainGroup.addGroup(createPluginsActionsGroup(wrappedFilter, otherGroup)); if (!StringUtil.isEmpty(filter) || filtered != null) { final ArrayList list = mainGroup.getChildren(); for (Iterator i = list.iterator(); i.hasNext();) { diff --git a/platform/platform-resources/src/idea/Keymap_Default.xml b/platform/platform-resources/src/idea/Keymap_Default.xml index 652eb2f429bf..9d563ab98940 100644 --- a/platform/platform-resources/src/idea/Keymap_Default.xml +++ b/platform/platform-resources/src/idea/Keymap_Default.xml @@ -733,6 +733,9 @@ + + + diff --git a/platform/platform-resources/src/idea/Keymap_Mac.xml b/platform/platform-resources/src/idea/Keymap_Mac.xml index 1753fa7d1f1b..739fd6b05971 100644 --- a/platform/platform-resources/src/idea/Keymap_Mac.xml +++ b/platform/platform-resources/src/idea/Keymap_Mac.xml @@ -177,7 +177,12 @@ - + + + + + + diff --git a/platform/platform-resources/src/idea/Keymap_MacClassic.xml b/platform/platform-resources/src/idea/Keymap_MacClassic.xml index 52bc398798bd..1e884b8d7e49 100644 --- a/platform/platform-resources/src/idea/Keymap_MacClassic.xml +++ b/platform/platform-resources/src/idea/Keymap_MacClassic.xml @@ -205,6 +205,10 @@ + + + + diff --git a/platform/platform-resources/src/idea/Keymap_Netbeans.xml b/platform/platform-resources/src/idea/Keymap_Netbeans.xml index b5fd5f51c878..89b6cf4258de 100644 --- a/platform/platform-resources/src/idea/Keymap_Netbeans.xml +++ b/platform/platform-resources/src/idea/Keymap_Netbeans.xml @@ -226,7 +226,7 @@ - + diff --git a/platform/platform-resources/src/idea/Keymap_VisualStudio.xml b/platform/platform-resources/src/idea/Keymap_VisualStudio.xml index 5081e4564a20..1abebcf6e14b 100644 --- a/platform/platform-resources/src/idea/Keymap_VisualStudio.xml +++ b/platform/platform-resources/src/idea/Keymap_VisualStudio.xml @@ -108,6 +108,9 @@ + + + diff --git a/platform/platform-resources/src/idea/PlatformLangActionManager.xml b/platform/platform-resources/src/idea/PlatformLangActionManager.xml index 0a43456b9ea9..48ce2e847d23 100644 --- a/platform/platform-resources/src/idea/PlatformLangActionManager.xml +++ b/platform/platform-resources/src/idea/PlatformLangActionManager.xml @@ -36,7 +36,7 @@ - + diff --git a/resources/src/idea/IdeaActions.xml b/resources/src/idea/IdeaActions.xml index c96a93cce3f2..5dbc91ed6b58 100644 --- a/resources/src/idea/IdeaActions.xml +++ b/resources/src/idea/IdeaActions.xml @@ -63,7 +63,7 @@ - +