From e5cb4268683b9e3a83c8a82cbf35aef3a686a3ef Mon Sep 17 00:00:00 2001 From: Mihail Muhin Date: Fri, 1 Oct 2010 19:03:09 +0400 Subject: [PATCH] ActionsTreeUtil: take into account that some actions might be registered for pluginIds created by the IDE with no corresponding Idea plugins (e.g. MPS has plugin-per-language, and those plugins are not Idea plugins) --- .../intellij/openapi/extensions/PluginId.java | 4 +++ .../keymap/impl/ui/ActionsTreeUtil.java | 34 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/platform/extensions/src/com/intellij/openapi/extensions/PluginId.java b/platform/extensions/src/com/intellij/openapi/extensions/PluginId.java index 46cc7139a738..7f735dc376ce 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/PluginId.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/PluginId.java @@ -52,4 +52,8 @@ public class PluginId { public String toString() { return getIdString(); } + + public static Map getRegisteredIds() { + return ourRegisteredIds; + } } 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 e61b105ea5a5..7cc5946bb78d 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 @@ -21,9 +21,11 @@ import com.intellij.ide.ui.search.SearchUtil; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; import com.intellij.openapi.actionSystem.ex.QuickList; +import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.keymap.KeyMapBundle; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapExtension; @@ -67,7 +69,7 @@ public class ActionsTreeUtil { private ActionsTreeUtil() { } - private static Group createPluginsActionsGroup(Condition filtered, Group otherGroup) { + private static Group createPluginsActionsGroup(Condition filtered) { Group pluginsGroup = new Group(KeyMapBundle.message("plugins.group.title"), null, null); final KeymapManagerEx keymapManager = KeymapManagerEx.getInstanceEx(); ActionManagerEx managerEx = ActionManagerEx.getInstanceEx(); @@ -78,7 +80,10 @@ public class ActionsTreeUtil { return o1.getName().compareTo(o2.getName()); } }); + + List collected = new ArrayList(); for (IdeaPluginDescriptor plugin : plugins) { + collected.add(plugin.getPluginId()); Group pluginGroup; if (plugin.getName().equals("IDEA CORE")) { continue; @@ -102,10 +107,30 @@ public class ActionsTreeUtil { pluginGroup.addActionId(pluginAction); } } - if (pluginGroup.getSize() > 0 && pluginGroup != otherGroup) { + if (pluginGroup.getSize() > 0) { pluginsGroup.addGroup(pluginGroup); } } + + for (PluginId pluginId : PluginId.getRegisteredIds().values()) { + if (collected.contains(pluginId)) continue; + Group pluginGroup = new Group(pluginId.getIdString(), null, null); + final String[] pluginActions = managerEx.getPluginActions(pluginId); + if (pluginActions == null || pluginActions.length == 0) { + continue; + } + for (String pluginAction : pluginActions) { + if (keymapManager.getBoundActions().contains(pluginAction)) continue; + final AnAction anAction = managerEx.getActionOrStub(pluginAction); + if (filtered == null || filtered.value(anAction)) { + pluginGroup.addActionId(pluginAction); + } + } + if (pluginGroup.getSize() > 0) { + pluginsGroup.addGroup(pluginGroup); + } + } + return pluginsGroup; } @@ -436,9 +461,8 @@ public class ActionsTreeUtil { } mainGroup.addGroup(createMacrosGroup(wrappedFilter)); mainGroup.addGroup(createQuickListsGroup(wrappedFilter, filter, forceFiltering, quickLists)); - final Group otherGroup = createOtherGroup(wrappedFilter, mainGroup, keymap); - mainGroup.addGroup(otherGroup); - mainGroup.addGroup(createPluginsActionsGroup(wrappedFilter, otherGroup)); + mainGroup.addGroup(createPluginsActionsGroup(wrappedFilter)); + mainGroup.addGroup(createOtherGroup(wrappedFilter, mainGroup, keymap)); if (!StringUtil.isEmpty(filter) || filtered != null) { final ArrayList list = mainGroup.getChildren(); for (Iterator i = list.iterator(); i.hasNext();) {