summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/actionSystem
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/actionSystem')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/ComputableActionGroup.java7
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/ex/QuickListsManager.java4
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/AbbreviationManagerImpl.java6
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java75
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ChameleonAction.java32
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java26
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();
}
});
}