473a64c165396bbab8901a54709f9be0e040dcb7
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / runners / RerunTestsAction.java
1 package com.intellij.execution.runners;
2
3 import com.intellij.openapi.Disposable;
4 import com.intellij.openapi.actionSystem.AnAction;
5 import com.intellij.openapi.actionSystem.AnActionEvent;
6 import com.intellij.openapi.project.DumbAwareAction;
7 import com.intellij.openapi.util.Disposer;
8 import com.intellij.util.containers.ContainerUtil;
9 import org.jetbrains.annotations.NotNull;
10
11 import java.util.Set;
12
13 /**
14  * Reruns all registered execution sessions.<p>
15  * The difference between this action and {@code Rerun} action (Ctrl+F5) is that this action reruns
16  * only explicitly registered execution sessions. For example, their tabs can be hidden by other tabs, it doesn't matter.
17  * <p>
18  * Thus it can be convenient for rerunning tests, because running non-test execution session after
19  * running test execution session won't hide the latter.
20  *
21  * @author Sergey Simonchik
22  */
23 public class RerunTestsAction extends DumbAwareAction implements AnAction.TransparentUpdate {
24   public static final String ID = "RerunTests";
25   private static final Set<ExecutionEnvironment> REGISTRY = ContainerUtil.newHashSet();
26
27   public static void register(@NotNull final ExecutionEnvironment environment) {
28     if (REGISTRY.add(environment)) {
29       Disposer.register(environment, new Disposable() {
30         @Override
31         public void dispose() {
32           REGISTRY.remove(environment);
33         }
34       });
35     }
36   }
37
38   @Override
39   public void actionPerformed(@NotNull AnActionEvent e) {
40     ExecutionEnvironment[] environments = REGISTRY.toArray(new ExecutionEnvironment[REGISTRY.size()]);
41     for (ExecutionEnvironment environment : environments) {
42       if (Disposer.isDisposed(environment)) {
43         REGISTRY.remove(environment);
44       }
45       else if (environment.getProject() == e.getProject()) {
46         ExecutionUtil.restart(environment);
47       }
48     }
49   }
50
51   @Override
52   public void update(@NotNull AnActionEvent e) {
53     e.getPresentation().setEnabled(true);
54   }
55 }