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
;
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
);
61 myActionManager
.registerAction(actionId
, anAction
);
62 map
.put(actionId
, anAction
);
66 final DefaultActionGroup group
= (DefaultActionGroup
) myActionManager
.getAction(groupId
);
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
);
82 group
.remove(myActionManager
.getAction(actionId
));
83 final AnAction action
= map
.get(actionId
);
85 myActionManager
.unregisterAction(actionId
);
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
);
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
);
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
) {
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);
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;
155 presentation
.setDescription(myExecutor
.getDescription());
159 String text
= getTemplatePresentation().getTextWithMnemonic();
161 presentation
.setEnabled(enabled
);
162 presentation
.setText(text
);
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()) {
177 ExecutionUtil
.executeConfiguration(project
, getConfiguration(project
), myExecutor
, dataContext
);