IDEADEV-39575 IAE: DefaultActionGroup.add
[fedora-idea.git] / lang-impl / src / com / intellij / execution / ExecutorRegistryImpl.java
blob27c88d9397c32a7c526d5f8bb3cacba87245337b
1 package com.intellij.execution;
3 import com.intellij.execution.actions.RunContextAction;
4 import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl;
5 import com.intellij.execution.runners.ProgramRunner;
6 import com.intellij.openapi.actionSystem.*;
7 import com.intellij.openapi.diagnostic.Logger;
8 import com.intellij.openapi.extensions.Extensions;
9 import com.intellij.openapi.project.Project;
10 import com.intellij.util.containers.HashMap;
11 import com.intellij.util.containers.HashSet;
12 import org.jetbrains.annotations.NonNls;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Set;
21 /**
22 * @author spleaner
24 public class ExecutorRegistryImpl extends ExecutorRegistry {
25 private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ExecutorRegistryImpl");
27 @NonNls public static final String RUNNERS_GROUP = "RunnerActions";
28 @NonNls public static final String RUN_CONTEXT_GROUP = "RunContextGroup";
30 private List<Executor> myExecutors = new ArrayList<Executor>();
31 private ActionManager myActionManager;
32 private final Map<String, Executor> myId2Executor = new HashMap<String, Executor>();
33 private final Set<String> myContextActionIdSet = new HashSet<String>();
34 private final Map<String, AnAction> myId2Action = new HashMap<String, AnAction>();
35 private final Map<String, AnAction> myContextActionId2Action = new HashMap<String, AnAction>();
37 public ExecutorRegistryImpl(ActionManager actionManager) {
38 myActionManager = actionManager;
41 synchronized void initExecutor(@NotNull final Executor executor) {
42 if (myId2Executor.get(executor.getId()) != null) {
43 LOG.error("Executor with id: \"" + executor.getId() + "\" was already registered!");
46 if (myContextActionIdSet.contains(executor.getContextActionId())) {
47 LOG.error("Executor with context action id: \"" + executor.getContextActionId() + "\" was already registered!");
50 myExecutors.add(executor);
51 myId2Executor.put(executor.getId(), executor);
52 myContextActionIdSet.add(executor.getContextActionId());
54 registerAction(executor.getId(), new ExecutorAction(executor), RUNNERS_GROUP, myId2Action);
55 registerAction(executor.getContextActionId(), new RunContextAction(executor), RUN_CONTEXT_GROUP, myContextActionId2Action);
58 private void registerAction(@NotNull final String actionId, @NotNull final AnAction anAction, @NotNull final String groupId, @NotNull final Map<String, AnAction> map) {
59 AnAction action = myActionManager.getAction(actionId);
60 if (action == null) {
61 myActionManager.registerAction(actionId, anAction);
62 map.put(actionId, anAction);
63 action = anAction;
66 final DefaultActionGroup group = (DefaultActionGroup) myActionManager.getAction(groupId);
67 group.add(action);
70 synchronized void deinitExecutor(@NotNull final Executor executor) {
71 myExecutors.remove(executor);
72 myId2Executor.remove(executor.getId());
73 myContextActionIdSet.remove(executor.getContextActionId());
75 unregisterAction(executor.getId(), RUNNERS_GROUP, myId2Action);
76 unregisterAction(executor.getContextActionId(), RUN_CONTEXT_GROUP, myContextActionId2Action);
79 private void unregisterAction(@NotNull final String actionId, @NotNull final String groupId, @NotNull final Map<String, AnAction> map) {
80 final DefaultActionGroup group = (DefaultActionGroup)myActionManager.getAction(groupId);
81 if (group != null) {
82 group.remove(myActionManager.getAction(actionId));
83 final AnAction action = map.get(actionId);
84 if (action != null) {
85 myActionManager.unregisterAction(actionId);
86 map.remove(actionId);
91 @NotNull
92 public synchronized Executor[] getRegisteredExecutors() {
93 return myExecutors.toArray(new Executor[myExecutors.size()]);
96 public Executor getExecutorById(final String executorId) {
97 return myId2Executor.get(executorId);
100 @NonNls
101 @NotNull
102 public String getComponentName() {
103 return "ExecutorRegistyImpl";
106 public void initComponent() {
107 final Executor[] executors = Extensions.getExtensions(Executor.EXECUTOR_EXTENSION_NAME);
108 for (Executor executor : executors) {
109 initExecutor(executor);
113 public synchronized void disposeComponent() {
114 if (myExecutors.size() > 0) {
115 List<Executor> executors = new ArrayList<Executor>(myExecutors);
116 for (Executor executor : executors) {
117 deinitExecutor(executor);
120 myExecutors = null;
123 myActionManager = null;
126 private static class ExecutorAction extends AnAction {
127 private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ExecutorRegistryImpl.ExecutorAction");
129 private final Executor myExecutor;
131 private ExecutorAction(@NotNull final Executor executor) {
132 super(executor.getStartActionText(), executor.getActionName(), executor.getIcon());
133 myExecutor = executor;
136 public void update(final AnActionEvent e) {
137 super.update(e);
139 final Presentation presentation = e.getPresentation();
140 boolean enabled = false;
141 final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
143 if (project == null || !project.isInitialized() || project.isDisposed()) {
144 presentation.setEnabled(false);
145 return;
148 final RunnerAndConfigurationSettingsImpl selectedConfiguration = getConfiguration(project);
149 if (selectedConfiguration != null) {
150 final ProgramRunner runner =
151 RunnerRegistry.getInstance().getRunner(myExecutor.getId(), selectedConfiguration.getConfiguration());
152 enabled = runner != null;
154 if (enabled) {
155 presentation.setDescription(myExecutor.getDescription());
159 String text = getTemplatePresentation().getTextWithMnemonic();
161 presentation.setEnabled(enabled);
162 presentation.setText(text);
165 @Nullable
166 private static RunnerAndConfigurationSettingsImpl getConfiguration(@NotNull final Project project) {
167 return RunManagerEx.getInstanceEx(project).getSelectedConfiguration();
170 public void actionPerformed(final AnActionEvent e) {
171 final DataContext dataContext = e.getDataContext();
172 final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
173 if (project == null || project.isDisposed()) {
174 return;
177 ExecutionUtil.executeConfiguration(project, getConfiguration(project), myExecutor, dataContext);