IDEA-79203 Re-run keyboard shortcut (Ctrl-F5) doesn't work

This commit is contained in:
Vassiliy Kudryashov
2012-10-17 20:32:17 +04:00
parent 76fb633355
commit fcd1f0095b
2 changed files with 67 additions and 7 deletions
@@ -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<RestartAction> registry = new CopyOnWriteArrayList<RestartAction>();
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);
}
}
@@ -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<RestartAction> candidates = new ArrayList<RestartAction>(registry);
Collections.sort(candidates, new Comparator<RestartAction>() {
@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) {