diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/execution')
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; } |