WEB-18808 'Rerun tests' (Alt+Shift+R) doesn't re-run tests
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / runners / RerunTestsAction.java
1 package com.intellij.execution.runners;
2
3 import com.intellij.execution.ExecutionManager;
4 import com.intellij.execution.ui.RunContentDescriptor;
5 import com.intellij.execution.ui.RunContentManager;
6 import com.intellij.openapi.Disposable;
7 import com.intellij.openapi.actionSystem.AnAction;
8 import com.intellij.openapi.actionSystem.AnActionEvent;
9 import com.intellij.openapi.project.DumbAwareAction;
10 import com.intellij.openapi.project.Project;
11 import com.intellij.openapi.util.Disposer;
12 import com.intellij.util.containers.ContainerUtil;
13 import org.jetbrains.annotations.NotNull;
14
15 import java.util.List;
16 import java.util.Set;
17
18 /**
19  * Reruns all registered execution sessions.<p>
20  * The difference between this action and {@code Rerun} action (Ctrl+F5) is that this action reruns
21  * only explicitly registered execution sessions. For example, their tabs can be hidden by other tabs, it doesn't matter.
22  * <p>
23  * Thus it can be convenient for rerunning tests, because running non-test execution session after
24  * running test execution session won't hide the latter.
25  *
26  * @see RerunTestsNotification
27  */
28 public class RerunTestsAction extends DumbAwareAction implements AnAction.TransparentUpdate {
29   public static final String ID = "RerunTests";
30   private static final Set<RunContentDescriptor> REGISTRY = ContainerUtil.newHashSet();
31
32   public static void register(@NotNull final RunContentDescriptor descriptor) {
33     if (!Disposer.isDisposed(descriptor) && REGISTRY.add(descriptor)) {
34       Disposer.register(descriptor, new Disposable() {
35         @Override
36         public void dispose() {
37           REGISTRY.remove(descriptor);
38         }
39       });
40     }
41   }
42
43   /**
44    * @deprecated use {@link #register(RunContentDescriptor)} instead
45    */
46   @SuppressWarnings("UnusedParameters")
47   public static void register(@NotNull ExecutionEnvironment environment) {
48   }
49
50   @Override
51   public void actionPerformed(@NotNull AnActionEvent e) {
52     List<RunContentDescriptor> descriptors = ContainerUtil.newArrayList(REGISTRY);
53     for (RunContentDescriptor descriptor : descriptors) {
54       if (Disposer.isDisposed(descriptor)) {
55         REGISTRY.remove(descriptor);
56       }
57       else {
58         Project project = e.getProject();
59         if (project != null) {
60           RunContentManager runContentManager = ExecutionManager.getInstance(project).getContentManager();
61           // check if the descriptor belongs to the current project
62           if (runContentManager.getToolWindowByDescriptor(descriptor) != null) {
63             ExecutionUtil.restart(descriptor);
64           }
65         }
66       }
67     }
68   }
69
70   @Override
71   public void update(@NotNull AnActionEvent e) {
72     e.getPresentation().setEnabled(e.getProject() != null);
73   }
74 }