diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/actionSystem')
6 files changed, 101 insertions, 49 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/ComputableActionGroup.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/ComputableActionGroup.java index b5027fd9df81..3b0e247180b2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/ComputableActionGroup.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/ComputableActionGroup.java @@ -55,6 +55,13 @@ public abstract class ComputableActionGroup extends ActionGroup implements DumbA protected abstract CachedValueProvider<AnAction[]> createChildrenProvider(@NotNull ActionManager actionManager); public abstract static class Simple extends ComputableActionGroup { + protected Simple() { + } + + protected Simple(boolean popup) { + super(popup); + } + @NotNull @Override protected final CachedValueProvider<AnAction[]> createChildrenProvider(@NotNull final ActionManager actionManager) { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/ex/QuickListsManager.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/ex/QuickListsManager.java index bf7c79695c94..eb9436481767 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/ex/QuickListsManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/ex/QuickListsManager.java @@ -70,10 +70,10 @@ public class QuickListsManager implements ExportableApplicationComponent, NamedJ return loadListFromDocument(schemeContent); } - public Document writeScheme(@NotNull final QuickList scheme) throws WriteExternalException { + public Element writeScheme(@NotNull final QuickList scheme) throws WriteExternalException { Element element = new Element(LIST_TAG); scheme.writeExternal(element); - return new Document(element); + return element; } public boolean shouldBeSaved(@NotNull final QuickList scheme) { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/AbbreviationManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/AbbreviationManagerImpl.java index 0d116c7a927f..fd96e54fc98e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/AbbreviationManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/AbbreviationManagerImpl.java @@ -31,11 +31,7 @@ import java.util.*; */ @State( name = "AbbreviationManager", - roamingType = RoamingType.PER_PLATFORM, - storages = { - @Storage( - file = StoragePathMacros.APP_CONFIG + "/abbreviations.xml" - )} + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/abbreviations.xml", roamingType = RoamingType.PER_PLATFORM)} ) public class AbbreviationManagerImpl extends AbbreviationManager implements ExportableComponent, PersistentStateComponent<Element> { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java index c5a9b01c4d21..32e823bd9758 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java @@ -70,6 +70,7 @@ import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.List; +import java.util.concurrent.Future; public final class ActionManagerImpl extends ActionManagerEx implements ApplicationComponent { @NonNls public static final String ACTION_ELEMENT_NAME = "action"; @@ -360,7 +361,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat } private static void assertActionIsGroupOrStub(final AnAction action) { - if (!(action instanceof ActionGroup || action instanceof ActionStub)) { + if (!(action instanceof ActionGroup || action instanceof ActionStub || action instanceof ChameleonAction)) { LOG.error("Action : " + action + "; class: " + action.getClass()); } } @@ -520,11 +521,9 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat LOG.assertTrue(action.equals(stub)); AnAction anAction = convertStub(stub); - - addToMap(stub.getId(), anAction, stub.getPluginId(), stub.getProjectType() == null ? null : new ProjectType(stub.getProjectType())); myAction2Id.put(anAction, stub.getId()); - return anAction; + return addToMap(stub.getId(), anAction, stub.getPluginId(), stub.getProjectType()); } @Override @@ -653,7 +652,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat } } else { - registerAction(id, action, pluginId); + registerAction(id, action, pluginId, element.getAttributeValue(PROJECT_TYPE)); } } } @@ -991,8 +990,12 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat @Override public void registerAction(@NotNull String actionId, @NotNull AnAction action, @Nullable PluginId pluginId) { + registerAction(actionId, action, pluginId, null); + } + + public void registerAction(@NotNull String actionId, @NotNull AnAction action, @Nullable PluginId pluginId, @Nullable String projectType) { synchronized (myLock) { - if (!addToMap(actionId, action, pluginId, null)) return; + if (addToMap(actionId, action, pluginId, projectType) == null) return; if (myAction2Id.containsKey(action)) { reportActionError(pluginId, "action was already registered for another ID. ID is " + myAction2Id.get(action) + getPluginInfo(pluginId)); @@ -1012,31 +1015,42 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat } } - public boolean addToMap(String actionId, AnAction action, PluginId pluginId, ProjectType projectType) { - if (myId2Action.containsKey(actionId)) { - // make sure id+projectType is unique - AnAction o = myId2Action.get(actionId); - ChameleonAction chameleonAction; - if (o instanceof ChameleonAction) { - chameleonAction = (ChameleonAction)o; - } - else { - chameleonAction = new ChameleonAction(o, projectType); - myId2Action.put(actionId, chameleonAction); - } - AnAction old = chameleonAction.addAction(action, projectType); - if (old != null) { - reportActionError(pluginId, - "action with the ID \"" + actionId + "\" was already registered. Action being registered is " + action + - "; Registered action is " + - myId2Action.get(actionId) + getPluginInfo(pluginId)); - return false; - } + private AnAction addToMap(String actionId, AnAction action, PluginId pluginId, String projectType) { + if (projectType != null || myId2Action.containsKey(actionId)) { + return registerChameleon(actionId, action, pluginId, projectType); } else { myId2Action.put(actionId, action); + return action; } - return true; + } + + private AnAction registerChameleon(String actionId, AnAction action, PluginId pluginId, String projectType) { + ProjectType type = projectType == null ? null : new ProjectType(projectType); + // make sure id+projectType is unique + AnAction o = myId2Action.get(actionId); + ChameleonAction chameleonAction; + if (o == null) { + chameleonAction = new ChameleonAction(action, type); + myId2Action.put(actionId, chameleonAction); + return chameleonAction; + } + if (o instanceof ChameleonAction) { + chameleonAction = (ChameleonAction)o; + } + else { + chameleonAction = new ChameleonAction(o, type); + myId2Action.put(actionId, chameleonAction); + } + AnAction old = chameleonAction.addAction(action, type); + if (old != null) { + reportActionError(pluginId, + "action with the ID \"" + actionId + "\" was already registered. Action being registered is " + action + + "; Registered action is " + + myId2Action.get(actionId) + getPluginInfo(pluginId)); + return null; + } + return chameleonAction; } @Override @@ -1053,7 +1067,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat return; } } - AnAction oldValue = (AnAction)myId2Action.remove(actionId); + AnAction oldValue = myId2Action.remove(actionId); myAction2Id.remove(oldValue); myId2Index.remove(actionId); for (PluginId pluginName : myPlugin2Id.keySet()) { @@ -1251,7 +1265,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat } } - public void preloadActions() { + public Future<?> preloadActions() { if (myPreloadActionsRunnable == null) { myPreloadActionsRunnable = new Runnable() { @Override @@ -1262,8 +1276,9 @@ public final class ActionManagerImpl extends ActionManagerEx implements Applicat } } }; - ApplicationManager.getApplication().executeOnPooledThread(myPreloadActionsRunnable); + return ApplicationManager.getApplication().executeOnPooledThread(myPreloadActionsRunnable); } + return null; } private void doPreloadActions() { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ChameleonAction.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ChameleonAction.java index 4b46dc191c0c..f4e92f7eae02 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ChameleonAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ChameleonAction.java @@ -15,14 +15,13 @@ */ package com.intellij.openapi.actionSystem.impl; -import com.intellij.openapi.actionSystem.ActionStub; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectType; import com.intellij.openapi.project.ProjectTypeService; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import java.util.HashMap; import java.util.Map; @@ -36,6 +35,7 @@ public class ChameleonAction extends AnAction { public ChameleonAction(@NotNull AnAction first, ProjectType projectType) { addAction(first, projectType); + copyFrom(myActions.values().iterator().next()); } public AnAction addAction(AnAction action, ProjectType projectType) { @@ -48,21 +48,35 @@ public class ChameleonAction extends AnAction { } @Override - public void actionPerformed(AnActionEvent e) { - getAction(e).actionPerformed(e); + public void actionPerformed(@NotNull AnActionEvent e) { + AnAction action = getAction(e); + assert action != null; + action.actionPerformed(e); } @Override - public void update(AnActionEvent e) { - super.update(e); + public void update(@NotNull AnActionEvent e) { + AnAction action = getAction(e); + if (action != null) { + e.getPresentation().setVisible(true); + action.update(e); + } + else { + e.getPresentation().setVisible(false); + } } + @Nullable private AnAction getAction(AnActionEvent e) { Project project = CommonDataKeys.PROJECT.getData(e.getDataContext()); ProjectType projectType = ProjectTypeService.getProjectType(project); AnAction action = myActions.get(projectType); if (action == null) action = myActions.get(null); - if (action == null) action = myActions.values().iterator().next(); return action; } + + @TestOnly + public Map<ProjectType, AnAction> getActions() { + return myActions; + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java index 85c0555f9bc6..9af1d30c28bf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java @@ -26,6 +26,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; @@ -164,7 +165,7 @@ public class Utils{ } } else if (child instanceof Separator) { - if (!list.isEmpty() && !(list.get(list.size() - 1) instanceof Separator)) { + if (!StringUtil.isEmpty(((Separator)child).getText()) || (!list.isEmpty() && !(list.get(list.size() - 1) instanceof Separator))) { list.add(child); } } @@ -284,8 +285,10 @@ public class Utils{ for (int i = 0, size = list.size(); i < size; i++) { final AnAction action = list.get(i); if (action instanceof Separator) { - if (i > 0 && i < size - 1) { + final String text = ((Separator)action).getText(); + if (!StringUtil.isEmpty(text) || (i > 0 && i < size - 1)) { component.add(new JPopupMenu.Separator() { + private final JMenuItem myMenu = !StringUtil.isEmpty(text) ? new JMenuItem(text) : null; @Override public Insets getInsets() { final Insets insets = super.getInsets(); @@ -296,12 +299,29 @@ public class Utils{ } @Override + public void doLayout() { + super.doLayout(); + if (myMenu != null) { + myMenu.setBounds(getBounds()); + } + } + + @Override protected void paintComponent(Graphics g) { if (UIUtil.isUnderWindowsClassicLookAndFeel() || UIUtil.isUnderDarcula() || UIUtil.isUnderWindowsLookAndFeel()) { g.setColor(component.getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); } - super.paintComponent(g); + if (myMenu != null) { + myMenu.paint(g); + } else { + super.paintComponent(g); + } + } + + @Override + public Dimension getPreferredSize() { + return myMenu != null ? myMenu.getPreferredSize() : super.getPreferredSize(); } }); } |