From fcd1f0095b80faa378906ad1c06f89e90dd3f38f Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Wed, 17 Oct 2012 20:32:17 +0400 Subject: [PATCH] IDEA-79203 Re-run keyboard shortcut (Ctrl-F5) doesn't work --- .../execution/runners/FakeRerunAction.java | 14 ++++- .../execution/runners/RestartAction.java | 60 +++++++++++++++++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java b/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java index 75899dec4809..e4bccf4bc4ba 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java @@ -20,17 +20,27 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + /** * @author Roman.Chernyatchik */ -public class FakeRerunAction extends AnAction implements DumbAware{ +public class FakeRerunAction extends AnAction implements DumbAware { + protected static final List registry = new CopyOnWriteArrayList(); + public void actionPerformed(AnActionEvent e) { + RestartAction action = RestartAction.findActualAction(); + if (action != null && action.isEnabled()) { + action.actionPerformed(e); + } } @Override public void update(AnActionEvent e) { final Presentation presentation = e.getPresentation(); - presentation.setEnabled(false); + RestartAction action = RestartAction.findActualAction(); + presentation.setEnabled(action != null && action.isEnabled()); presentation.setVisible(false); } } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java index 03d40981ff98..929429bddf4b 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java @@ -20,19 +20,27 @@ import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; /** * @author dyoma */ -public class RestartAction extends AnAction implements DumbAware, AnAction.TransparentUpdate { +public class RestartAction extends FakeRerunAction implements DumbAware, AnAction.TransparentUpdate, Disposable { private ProcessHandler myProcessHandler; private final ProgramRunner myRunner; @@ -47,7 +55,10 @@ public class RestartAction extends AnAction implements DumbAware, AnAction.Trans final Icon icon, final RunContentDescriptor descriptor, @NotNull final ExecutionEnvironment env) { - super(null, null, icon); + getTemplatePresentation().setIcon(icon); + Disposer.register(descriptor, this); + registry.add(this); + myIcon = icon; myEnvironment = env; getTemplatePresentation().setEnabled(false); @@ -58,6 +69,41 @@ public class RestartAction extends AnAction implements DumbAware, AnAction.Trans // see IDEADEV-698 } + @Override + public void dispose() { + registry.remove(this); + } + + @Nullable + static RestartAction findActualAction() { + if (registry.isEmpty()) + return null; + List candidates = new ArrayList(registry); + Collections.sort(candidates, new Comparator() { + @Override + public int compare(RestartAction action1, RestartAction action2) { + boolean isActive1 = action1.isEnabled(); + boolean isActive2 = action2.isEnabled(); + if (isActive1 != isActive2) + return isActive1? - 1 : 1; + Window window1 = SwingUtilities.windowForComponent(action1.myDescriptor.getComponent()); + Window window2 = SwingUtilities.windowForComponent(action2.myDescriptor.getComponent()); + if (window1 == null) + return 1; + if (window2 == null) + return -1; + boolean showing1 = action1.myDescriptor.getComponent().isShowing(); + boolean showing2 = action2.myDescriptor.getComponent().isShowing(); + if (showing1 && !showing2) + return -1; + if (showing2 && !showing1) + return 1; + return (window1.isActive() ? -1 : 1); + } + }); + return candidates.get(0); + } + public void actionPerformed(final AnActionEvent e) { Project project = myEnvironment.getProject(); RunnerAndConfigurationSettings settings = myEnvironment.getRunnerAndConfigurationSettings(); @@ -102,12 +148,16 @@ public class RestartAction extends AnAction implements DumbAware, AnAction.Trans final Presentation presentation = event.getPresentation(); String name = myEnvironment.getRunProfile().getName(); final boolean isRunning = myProcessHandler != null && !myProcessHandler.isProcessTerminated(); - boolean isTerminating = myProcessHandler != null && myProcessHandler.isProcessTerminating(); - boolean isStarting = ExecutorRegistry.getInstance().isStarting(myEnvironment.getProject(), myExecutor.getId(), myRunner.getRunnerId()); presentation.setText(ExecutionBundle.message("rerun.configuration.action.name", name)); presentation.setIcon(isRunning ? AllIcons.Actions.Restart : myIcon); - presentation.setEnabled(!isStarting && !isTerminating); + presentation.setEnabled(isEnabled()); + } + + boolean isEnabled() { + boolean isTerminating = myProcessHandler != null && myProcessHandler.isProcessTerminating(); + boolean isStarting = ExecutorRegistry.getInstance().isStarting(myEnvironment.getProject(), myExecutor.getId(), myRunner.getRunnerId()); + return !isStarting && !isTerminating; } public void registerShortcut(final JComponent component) {