summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/execution
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/execution')
-rw-r--r--platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java2
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java63
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java47
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java6
-rw-r--r--platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java10
-rw-r--r--platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java76
-rw-r--r--platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java9
-rw-r--r--platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java6
-rw-r--r--platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java11
9 files changed, 163 insertions, 67 deletions
diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java
index f19d92f76bcf..b27a939dd57c 100644
--- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java
+++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java
@@ -74,7 +74,7 @@ public class ProgramRunnerUtil {
}
public static void executeConfiguration(Project project,
- DataContext context,
+ @Nullable DataContext context,
@Nullable RunnerAndConfigurationSettings configuration,
Executor executor,
ExecutionTarget target,
diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
index 6c0bfffd450e..9aab415d5e70 100644
--- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
+++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryController.java
@@ -45,7 +45,9 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.testFramework.LightVirtualFile;
+import com.intellij.util.ExceptionUtil;
import com.intellij.util.ObjectUtils;
+import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.SafeFileOutputStream;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.xml.XppReader;
@@ -56,7 +58,6 @@ import org.xmlpull.v1.XmlSerializer;
import java.awt.event.KeyEvent;
import java.io.*;
-import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
@@ -65,6 +66,8 @@ import java.util.ListIterator;
*/
public class ConsoleHistoryController {
+ private static final int VERSION = 1;
+
private static final Logger LOG = Logger.getInstance("com.intellij.execution.console.ConsoleHistoryController");
private final LanguageConsoleImpl myConsole;
@@ -394,7 +397,15 @@ public class ConsoleHistoryController {
}
}
catch (Exception ex) {
- LOG.error(ex);
+ //noinspection ThrowableResultOfMethodCallIgnored
+ Throwable cause = ExceptionUtil.getRootCause(ex);
+ if (cause instanceof EOFException) {
+ LOG.warn("Failed to load " + myType + " console history from: " + file.getPath(), ex);
+ return false;
+ }
+ else {
+ LOG.error(ex);
+ }
}
finally {
if (xmlReader != null) {
@@ -423,6 +434,7 @@ public class ConsoleHistoryController {
}
serializer.setOutput(os = new SafeFileOutputStream(file), CharsetToolkit.UTF8);
saveHistory(serializer);
+ serializer.flush();
}
catch (Exception ex) {
LOG.error(ex);
@@ -439,47 +451,58 @@ public class ConsoleHistoryController {
}
@Nullable
- private String loadHistory(final HierarchicalStreamReader in, final String expectedId) {
+ private String loadHistory(HierarchicalStreamReader in, String expectedId) {
if (!in.getNodeName().equals("console-history")) return null;
- final String id = in.getAttribute("id");
+ int version = StringUtil.parseInt(in.getAttribute("version"), 0);
+ String id = in.getAttribute("id");
if (!expectedId.equals(id)) return null;
- final ArrayList<String> entries = new ArrayList<String>();
+ List<String> entries = ContainerUtil.newArrayList();
String consoleContent = null;
while (in.hasMoreChildren()) {
in.moveDown();
if ("history-entry".equals(in.getNodeName())) {
- entries.add(in.getValue());
+ entries.add(StringUtil.notNullize(in.getValue()));
}
else if ("console-content".equals(in.getNodeName())) {
- consoleContent = in.getValue();
+ consoleContent = StringUtil.notNullize(in.getValue());
}
in.moveUp();
}
for (ListIterator<String> iterator = entries.listIterator(entries.size()); iterator.hasPrevious(); ) {
- final String entry = iterator.previous();
+ String entry = iterator.previous();
getModel().addToHistory(entry);
}
return consoleContent;
}
- private void saveHistory(final XmlSerializer out) throws IOException {
+ private void saveHistory(XmlSerializer out) throws IOException {
out.startDocument(CharsetToolkit.UTF8, null);
out.startTag(null, "console-history");
+ out.attribute(null, "version", String.valueOf(VERSION));
out.attribute(null, "id", myId);
- for (String s : getModel().getHistory()) {
- out.startTag(null, "history-entry");
- out.text(s);
- out.endTag(null, "history-entry");
+ try {
+ for (String s : getModel().getHistory()) {
+ textTag(out, "history-entry", s);
+ }
+ String current = myContent;
+ if (StringUtil.isNotEmpty(current)) {
+ textTag(out, "console-content", current);
+ }
}
- String current = myContent;
- if (StringUtil.isNotEmpty(current)) {
- out.startTag(null, "console-content");
- out.text(current);
- out.endTag(null, "console-content");
+ finally {
+ out.endTag(null, "console-history");
+ out.endDocument();
}
- out.endTag(null, "console-history");
- out.endDocument();
}
}
+ private static void textTag(@NotNull XmlSerializer out, @NotNull String tag, @NotNull String text) throws IOException {
+ out.startTag(null, tag);
+ try {
+ out.cdsect(text);
+ }
+ finally {
+ out.endTag(null, tag);
+ }
+ }
}
diff --git a/platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java b/platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java
index c760310cd391..87e1323fe607 100644
--- a/platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java
+++ b/platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java
@@ -9,6 +9,7 @@ import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.execution.ui.ObservableConsoleView;
import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -34,6 +35,8 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
private final S myPrimaryConsoleView;
@NotNull
private final T mySecondaryConsoleView;
+ @Nullable
+ private final String myStateStorageKey;
private boolean myPrimary;
@Nullable
@@ -41,25 +44,46 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
@NotNull
private final SwitchDuplexConsoleViewAction mySwitchConsoleAction;
+
public DuplexConsoleView(@NotNull S primaryConsoleView, @NotNull T secondaryConsoleView) {
+ this(primaryConsoleView, secondaryConsoleView, null);
+ }
+
+ public DuplexConsoleView(@NotNull S primaryConsoleView, @NotNull T secondaryConsoleView, @Nullable String stateStorageKey) {
super(new CardLayout());
myPrimaryConsoleView = primaryConsoleView;
mySecondaryConsoleView = secondaryConsoleView;
+ myStateStorageKey = stateStorageKey;
add(myPrimaryConsoleView.getComponent(), PRIMARY_CONSOLE_PANEL);
add(mySecondaryConsoleView.getComponent(), SECONDARY_CONSOLE_PANEL);
- mySwitchConsoleAction = new SwitchDuplexConsoleViewAction(this);
+ mySwitchConsoleAction = new SwitchDuplexConsoleViewAction();
myPrimary = true;
- enableConsole(false);
+ enableConsole(getStoredState());
Disposer.register(this, myPrimaryConsoleView);
Disposer.register(this, mySecondaryConsoleView);
}
- public static <S extends ConsoleView, T extends ConsoleView> DuplexConsoleView<S, T> create(S primary, T secondary) {
- return new DuplexConsoleView<S, T>(primary, secondary);
+ public static <S extends ConsoleView, T extends ConsoleView> DuplexConsoleView<S, T> create(@NotNull S primary,
+ @NotNull T secondary,
+ @Nullable String stateStorageKey) {
+ return new DuplexConsoleView<S, T>(primary, secondary, stateStorageKey);
+ }
+
+ private void setStoredState(boolean primary) {
+ if (myStateStorageKey != null) {
+ PropertiesComponent.getInstance().setValue(myStateStorageKey, String.valueOf(primary));
+ }
+ }
+
+ private boolean getStoredState() {
+ if (myStateStorageKey == null) {
+ return false;
+ }
+ return PropertiesComponent.getInstance().getBoolean(myStateStorageKey, false);
}
public void enableConsole(boolean primary) {
@@ -215,23 +239,22 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
return mySwitchConsoleAction.getTemplatePresentation();
}
- private static class SwitchDuplexConsoleViewAction extends ToggleAction implements DumbAware {
- private final DuplexConsoleView myConsole;
+ private class SwitchDuplexConsoleViewAction extends ToggleAction implements DumbAware {
- public SwitchDuplexConsoleViewAction(final DuplexConsoleView console) {
+ public SwitchDuplexConsoleViewAction() {
super(ExecutionBundle.message("run.configuration.show.command.line.action.name"), null,
AllIcons.Debugger.ToolConsole);
- myConsole = console;
}
@Override
public boolean isSelected(final AnActionEvent event) {
- return !myConsole.isPrimaryConsoleEnabled();
+ return !isPrimaryConsoleEnabled();
}
@Override
public void setSelected(final AnActionEvent event, final boolean flag) {
- myConsole.enableConsole(!flag);
+ enableConsole(!flag);
+ setStoredState(!flag);
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
@@ -244,12 +267,12 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
public void update(final AnActionEvent event) {
super.update(event);
final Presentation presentation = event.getPresentation();
- final boolean isRunning = myConsole.myProcessHandler != null && !myConsole.myProcessHandler.isProcessTerminated();
+ final boolean isRunning = myProcessHandler != null && !myProcessHandler.isProcessTerminated();
if (isRunning) {
presentation.setEnabled(true);
}
else {
- myConsole.enableConsole(true);
+ enableConsole(true);
presentation.putClientProperty(SELECTED_PROPERTY, false);
presentation.setEnabled(false);
}
diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java
index 9cb57be6ad9d..1a9afd1e25e5 100644
--- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java
+++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java
@@ -670,12 +670,14 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider {
}
}
+ @NotNull
public Editor getCurrentEditor() {
- return ObjectUtils.chooseNotNull(myCurrentEditor, myConsoleEditor);
+ return ObjectUtils.notNull(myCurrentEditor, myConsoleEditor);
}
+ @NotNull
public Language getLanguage() {
- return myVirtualFile.getLanguage();
+ return ObjectUtils.assertNotNull(myVirtualFile.getLanguage());
}
public void setLanguage(@NotNull Language language) {
diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java
index ae6af9d1064e..edf1352a760c 100644
--- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java
+++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java
@@ -49,6 +49,8 @@ import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
import java.util.*;
import java.util.List;
@@ -345,6 +347,14 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB
mySettings = settings;
init();
myJBList.setSelectedValue(mySelectedSettings, true);
+ myJBList.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() ==2) {
+ doOKAction();
+ }
+ }
+ });
FontMetrics fontMetrics = myJBList.getFontMetrics(myJBList.getFont());
int maxWidth = fontMetrics.stringWidth("m") * 30;
for (RunnerAndConfigurationSettings setting : settings) {
diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
index df7f7e1b2e1c..b4b3cd919ec4 100644
--- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
+++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
@@ -15,6 +15,9 @@
*/
package com.intellij.execution.runners;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionHelper;
import com.intellij.execution.ExecutionManager;
@@ -129,38 +132,30 @@ public abstract class AbstractConsoleRunnerWithHistory<T extends LanguageConsole
registerActionShortcuts(actions, getLanguageConsole().getConsoleEditor().getComponent());
registerActionShortcuts(actions, panel);
panel.updateUI();
+
showConsole(defaultExecutor, contentDescriptor);
// Run
myProcessHandler.startNotify();
}
- private String constructConsoleTitle(final @NotNull String consoleTitle) {
+ protected String constructConsoleTitle(final @NotNull String consoleTitle) {
if (shouldAddNumberToTitle()) {
- List<RunContentDescriptor> consoles = ExecutionHelper.collectConsolesByDisplayName(myProject, new NotNullFunction<String, Boolean>() {
- @NotNull
- @Override
- public Boolean fun(String dom) {
- return dom.contains(consoleTitle);
- }
- });
+ List<String> activeConsoleNames = getActiveConsoleNames(consoleTitle);
int max = 0;
- for (RunContentDescriptor dsc : consoles) {
- ProcessHandler handler = dsc.getProcessHandler();
- if (handler != null && !handler.isProcessTerminated()) {
- if (max == 0) {
- max = 1;
- }
- try {
- int num = Integer.parseInt(dsc.getDisplayName().substring(consoleTitle.length() + 1, dsc.getDisplayName().length() - 1));
- if (num > max) {
- max = num;
- }
- }
- catch (Exception ignored) {
- //skip
+ for (String name : activeConsoleNames) {
+ if (max == 0) {
+ max = 1;
+ }
+ try {
+ int num = Integer.parseInt(name.substring(consoleTitle.length() + 1, name.length() - 1));
+ if (num > max) {
+ max = num;
}
}
+ catch (Exception ignored) {
+ //skip
+ }
}
if (max >= 1) {
return consoleTitle + "(" + (max + 1) + ")";
@@ -178,9 +173,9 @@ public abstract class AbstractConsoleRunnerWithHistory<T extends LanguageConsole
return false;
}
- protected void showConsole(Executor defaultExecutor, RunContentDescriptor myDescriptor) {
+ protected void showConsole(Executor defaultExecutor, RunContentDescriptor contentDescriptor) {
// Show in run toolwindow
- ExecutionManager.getInstance(myProject).getContentManager().showRunContent(defaultExecutor, myDescriptor);
+ ExecutionManager.getInstance(myProject).getContentManager().showRunContent(defaultExecutor, contentDescriptor);
}
protected void finishConsole() {
@@ -245,11 +240,13 @@ public abstract class AbstractConsoleRunnerWithHistory<T extends LanguageConsole
public static AnAction createConsoleExecAction(@NotNull LanguageConsoleView console,
@NotNull ProcessHandler processHandler,
@NotNull ProcessBackedConsoleExecuteActionHandler consoleExecuteActionHandler) {
- return new ConsoleExecuteAction(console, consoleExecuteActionHandler, consoleExecuteActionHandler.getEmptyExecuteAction(), consoleExecuteActionHandler);
+ return new ConsoleExecuteAction(console, consoleExecuteActionHandler, consoleExecuteActionHandler.getEmptyExecuteAction(),
+ consoleExecuteActionHandler);
}
protected AnAction createConsoleExecAction(@NotNull ProcessBackedConsoleExecuteActionHandler consoleExecuteActionHandler) {
- return new ConsoleExecuteAction(myConsoleView, consoleExecuteActionHandler, consoleExecuteActionHandler.getEmptyExecuteAction(), consoleExecuteActionHandler);
+ return new ConsoleExecuteAction(myConsoleView, consoleExecuteActionHandler, consoleExecuteActionHandler.getEmptyExecuteAction(),
+ consoleExecuteActionHandler);
}
@SuppressWarnings("UnusedDeclaration")
@@ -301,4 +298,31 @@ public abstract class AbstractConsoleRunnerWithHistory<T extends LanguageConsole
public ProcessBackedConsoleExecuteActionHandler getConsoleExecuteActionHandler() {
return myConsoleExecuteActionHandler;
}
+
+ protected List<String> getActiveConsoleNames(final String consoleTitle) {
+ return getActiveConsolesFromRunToolWindow(consoleTitle);
+ }
+
+ protected List<String> getActiveConsolesFromRunToolWindow(final String consoleTitle) {
+ List<RunContentDescriptor> consoles = ExecutionHelper.collectConsolesByDisplayName(myProject, new NotNullFunction<String, Boolean>() {
+ @NotNull
+ @Override
+ public Boolean fun(String dom) {
+ return dom.contains(consoleTitle);
+ }
+ });
+
+ return FluentIterable.from(consoles).filter(new Predicate<RunContentDescriptor>() {
+ @Override
+ public boolean apply(RunContentDescriptor input) {
+ ProcessHandler handler = input.getProcessHandler();
+ return handler != null && !handler.isProcessTerminated();
+ }
+ }).transform(new Function<RunContentDescriptor, String>() {
+ @Override
+ public String apply(RunContentDescriptor input) {
+ return input.getDisplayName();
+ }
+ }).toList();
+ }
}
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 507864126430..20b29c2de994 100644
--- a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java
+++ b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java
@@ -61,6 +61,15 @@ public class RestartAction extends FakeRerunAction implements DumbAware, AnActio
myDescriptor = descriptor;
myExecutor = executor;
// see IDEADEV-698
+
+ if (descriptor.getRestarter() == null) {
+ descriptor.setRestarter(new Runnable() {
+ @Override
+ public void run() {
+ restart();
+ }
+ });
+ }
}
@Override
diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java
index ab9433e66831..bb6d206f1eb9 100644
--- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java
+++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java
@@ -206,12 +206,6 @@ public class RunContentBuilder extends LogConsoleManagerBase {
final RestartAction restartAction = new RestartAction(myExecutor, myRunner, contentDescriptor, getEnvironment());
restartAction.registerShortcut(component);
actionGroup.add(restartAction);
- contentDescriptor.setRestarter(new Runnable() {
- @Override
- public void run() {
- restartAction.restart();
- }
- });
if (myExecutionResult instanceof DefaultExecutionResult) {
final AnAction[] actions = ((DefaultExecutionResult)myExecutionResult).getRestartActions();
diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java
index 897d169e1845..821d9dbd6bc3 100644
--- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java
+++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java
@@ -1271,6 +1271,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
return null;
}
+ @Nullable
+ public void restoreContent(final String key) {
+ for (AnAction action : myMinimizedViewActions.getChildren(null)) {
+ Content content = ((RestoreViewAction)action).getContent();
+ if (key.equals(content.getUserData(ViewImpl.ID))) {
+ action.actionPerformed(null);
+ return;
+ }
+ }
+ }
+
public void setToDisposeRemovedContent(final boolean toDispose) {
myToDisposeRemovedContent = toDispose;
}