summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java75
1 files changed, 45 insertions, 30 deletions
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() {