mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-79203 Re-run keyboard shortcut (Ctrl-F5) doesn't work
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user