IDEA-90117 No Rerun possible in Run Window for External Tool

This commit is contained in:
Vassiliy Kudryashov
2012-09-06 16:28:06 +04:00
parent 8fde27c6f2
commit 92503b45be
8 changed files with 142 additions and 9 deletions
@@ -16,6 +16,7 @@
package com.intellij.debugger;
import com.intellij.diagnostic.logging.LogFilesManager;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import org.jetbrains.annotations.Nullable;
@@ -39,4 +40,7 @@ public interface DebugUIEnvironment {
void initLogs(RunContentDescriptor content, LogFilesManager logFilesManager);
void initActions(RunContentDescriptor content, DefaultActionGroup actionGroup);
@Nullable
RunProfile getRunProfile();
}
@@ -118,4 +118,9 @@ public class DefaultDebugUIEnvironment implements DebugUIEnvironment {
actionGroup.add(new CloseAction(myExecutor, content, myProject));
actionGroup.add(new ContextHelpAction(myExecutor.getHelpId()));
}
@Override
public RunProfile getRunProfile() {
return myRunProfile;
}
}
@@ -35,6 +35,7 @@ import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionManager;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.filters.ExceptionFilters;
import com.intellij.execution.filters.Filter;
@@ -80,7 +81,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
private final MyDebuggerStateManager myStateManager = new MyDebuggerStateManager();
private final FramesPanel myFramesPanel;
private DebugUIEnvironment myEnvironment;
private DebugUIEnvironment myDebugUIEnvironment;
private final ThreadsPanel myThreadsPanel;
private static final String THREAD_DUMP_CONTENT_PREFIX = "Dump";
@@ -255,7 +256,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
}
console.setActions(consoleActions, ActionPlaces.DEBUGGER_TOOLBAR, myConsole.getPreferredFocusableComponent());
myEnvironment.initLogs(myRunContentDescriptor, getLogManager());
myDebugUIEnvironment.initLogs(myRunContentDescriptor, getLogManager());
DefaultActionGroup group = new DefaultActionGroup();
@@ -322,7 +323,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
addActionToGroup(group, PinToolwindowTabAction.ACTION_NAME);
myEnvironment.initActions(myRunContentDescriptor, group);
myDebugUIEnvironment.initActions(myRunContentDescriptor, group);
myUi.getOptions().setLeftToolbar(group, ActionPlaces.DEBUGGER_TOOLBAR);
@@ -373,7 +374,7 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
}
public String getSessionName() {
return myEnvironment.getEnvironment().getSessionName();
return myDebugUIEnvironment.getEnvironment().getSessionName();
}
public DebuggerStateManager getContextManager() {
@@ -416,10 +417,16 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
}
}
@Nullable
@Override
protected RunProfile getRunProfile() {
return myDebugUIEnvironment != null ? myDebugUIEnvironment.getRunProfile() : null;
}
public RunContentDescriptor attachToSession(final DebuggerSession session, DebugUIEnvironment environment) throws ExecutionException {
disposeSession();
myDebuggerSession = session;
myEnvironment = environment;
myDebugUIEnvironment = environment;
session.getContextManager().addListener(new DebuggerContextListener() {
public void changeEvent(DebuggerContextImpl newContext, int event) {
@@ -48,9 +48,13 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements
@NonNls private static final String FILE_OUTPUT = "output_file";
@NonNls private static final String SAVE = "is_save";
@NonNls private static final String OUTPUT_FILE = "path";
@NonNls private static final String SHOW_CONSOLE_ON_STD_OUT = "show_console_on_std_out";
@NonNls private static final String SHOW_CONSOLE_ON_STD_ERR = "show_console_on_std_err";
private final Icon myIcon;
private boolean mySaveOutput = false;
private boolean myShowConsoleOnStdOut = false;
private boolean myShowConsoleOnStdErr = false;
private String myFileOutputPath = null;
protected RunConfigurationBase(final Project project, final ConfigurationFactory factory, final String name) {
@@ -114,6 +118,8 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements
runConfiguration.myPredefinedLogFiles = new ArrayList<PredefinedLogFile>(myPredefinedLogFiles);
runConfiguration.myFileOutputPath = myFileOutputPath;
runConfiguration.mySaveOutput = mySaveOutput;
runConfiguration.myShowConsoleOnStdOut = myShowConsoleOnStdOut;
runConfiguration.myShowConsoleOnStdErr = myShowConsoleOnStdErr;
copyCopyableDataTo(runConfiguration);
return runConfiguration;
}
@@ -190,6 +196,8 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements
final String isSave = fileOutputElement.getAttributeValue(SAVE);
mySaveOutput = isSave != null && Boolean.parseBoolean(isSave);
}
myShowConsoleOnStdOut = Boolean.parseBoolean(element.getAttributeValue(SHOW_CONSOLE_ON_STD_OUT));
myShowConsoleOnStdErr = Boolean.parseBoolean(element.getAttributeValue(SHOW_CONSOLE_ON_STD_ERR));
}
public void writeExternal(Element element) throws WriteExternalException {
@@ -211,6 +219,8 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements
if (myFileOutputPath != null || mySaveOutput) {
element.addContent(fileOutputPathElement);
}
element.setAttribute(SHOW_CONSOLE_ON_STD_OUT, String.valueOf(myShowConsoleOnStdOut));
element.setAttribute(SHOW_CONSOLE_ON_STD_ERR, String.valueOf(myShowConsoleOnStdErr));
}
public boolean isSaveOutputToFile() {
@@ -221,6 +231,22 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements
mySaveOutput = redirectOutput;
}
public boolean isShowConsoleOnStdOut() {
return myShowConsoleOnStdOut;
}
public void setShowConsoleOnStdOut(boolean showConsoleOnStdOut) {
myShowConsoleOnStdOut = showConsoleOnStdOut;
}
public boolean isShowConsoleOnStdErr() {
return myShowConsoleOnStdErr;
}
public void setShowConsoleOnStdErr(boolean showConsoleOnStdErr) {
myShowConsoleOnStdErr = showConsoleOnStdErr;
}
public String getOutputFilePath() {
return myFileOutputPath;
}
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.diagnostic.logging.LogConfigurationPanel">
<grid id="57687" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="15">
<grid id="57687" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="15">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="25" y="74" width="410" height="222"/>
<xy x="25" y="74" width="558" height="222"/>
</constraints>
<properties/>
<clientProperties>
@@ -13,7 +13,7 @@
<children>
<grid id="faa06" binding="myScrollPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<grid row="0" column="0" row-span="1" col-span="2" vsize-policy="7" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -22,7 +22,7 @@
<grid id="a8add" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
<grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -43,6 +43,22 @@
</component>
</children>
</grid>
<component id="5b1a9" class="javax.swing.JCheckBox" binding="myShowConsoleOnStdOutCb" default-binding="true">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Show console when standard out changes"/>
</properties>
</component>
<component id="b4310" class="javax.swing.JCheckBox" binding="myShowConsoleOnStdErrCb" default-binding="true">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Show console when standard error changes"/>
</properties>
</component>
</children>
</grid>
</form>
@@ -59,6 +59,8 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti
private JPanel myScrollPanel;
private JBCheckBox myRedirectOutputCb;
private TextFieldWithBrowseButton myOutputFile;
private JCheckBox myShowConsoleOnStdOutCb;
private JCheckBox myShowConsoleOnStdErrCb;
private final Map<LogFileOptions, PredefinedLogFile> myLog2Predefined = new HashMap<LogFileOptions, PredefinedLogFile>();
private final List<PredefinedLogFile> myUnresolvedPredefined = new ArrayList<PredefinedLogFile>();
@@ -240,6 +242,8 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti
final String fileOutputPath = configuration.getOutputFilePath();
myOutputFile.setText(fileOutputPath != null ? FileUtil.toSystemDependentName(fileOutputPath) : "");
myOutputFile.setEnabled(redirectOutputToFile);
myShowConsoleOnStdOutCb.setSelected(configuration.isShowConsoleOnStdOut());
myShowConsoleOnStdErrCb.setSelected(configuration.isShowConsoleOnStdErr());
}
protected void applyEditorTo(final RunConfigurationBase configuration) throws ConfigurationException {
@@ -269,6 +273,8 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti
final String text = myOutputFile.getText();
configuration.setFileOutputPath(StringUtil.isEmpty(text) ? null : FileUtil.toSystemIndependentName(text));
configuration.setSaveOutputToFile(myRedirectOutputCb.isSelected());
configuration.setShowConsoleOnStdOut(myShowConsoleOnStdOutCb.isSelected());
configuration.setShowConsoleOnStdErr(myShowConsoleOnStdErrCb.isSelected());
}
@NotNull
@@ -19,10 +19,12 @@ import com.intellij.diagnostic.logging.LogConsoleManagerBase;
import com.intellij.diagnostic.logging.LogFilesManager;
import com.intellij.diagnostic.logging.OutputFileUtil;
import com.intellij.execution.DefaultExecutionResult;
import com.intellij.execution.ExecutionManager;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ui.*;
import com.intellij.execution.ui.actions.CloseAction;
@@ -41,6 +43,10 @@ import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import javax.swing.event.ChangeEvent;
import java.io.File;
import java.nio.charset.Charset;
import java.util.*;
/**
* @author dyoma
@@ -127,6 +133,17 @@ public class RunContentBuilder extends LogConsoleManagerBase {
MyRunContentDescriptor contentDescriptor = new MyRunContentDescriptor(profile, myExecutionResult, myReuseProhibited, myUi.getComponent(), this);
myUi.getOptions().setLeftToolbar(createActionToolbar(contentDescriptor, myUi.getComponent()), ActionPlaces.UNKNOWN);
if (profile instanceof RunConfigurationBase) {
if (console instanceof ObservableConsoleView && !ApplicationManager.getApplication().isUnitTestMode()) {
((ObservableConsoleView)console).addChangeListener(new ConsoleToFrontListener((RunConfigurationBase)profile,
myEnvironment.getProject(),
myExecutor,
contentDescriptor,
myUi),
this);
}
}
return contentDescriptor;
}
@@ -245,4 +262,38 @@ public class RunContentBuilder extends LogConsoleManagerBase {
super.dispose();
}
}
public static class ConsoleToFrontListener implements ConsoleViewImpl.ChangeListener {
@NotNull private final RunConfigurationBase myRunConfigurationBase;
@NotNull private final Project myProject;
@NotNull private final Executor myExecutor;
@NotNull private final RunContentDescriptor myRunContentDescriptor;
@NotNull private final RunnerLayoutUi myUi;
public ConsoleToFrontListener(@NotNull RunConfigurationBase runConfigurationBase,
@NotNull Project project,
@NotNull Executor executor,
@NotNull RunContentDescriptor runContentDescriptor,
@NotNull RunnerLayoutUi ui) {
myRunConfigurationBase = runConfigurationBase;
myProject = project;
myExecutor = executor;
myRunContentDescriptor = runContentDescriptor;
myUi = ui;
}
@Override
public void contentAdded(Collection<ConsoleViewContentType> types) {
if (myProject.isDisposed() || myUi.isDisposed())
return;
for (ConsoleViewContentType type : types) {
if ((type == ConsoleViewContentType.NORMAL_OUTPUT) && myRunConfigurationBase.isShowConsoleOnStdOut()
|| (type == ConsoleViewContentType.ERROR_OUTPUT) && myRunConfigurationBase.isShowConsoleOnStdErr()) {
ExecutionManager.getInstance(myProject).getContentManager().toFrontRunContent(myExecutor, myRunContentDescriptor);
myUi.selectAndFocus(myUi.findContent(ExecutionConsole.CONSOLE_CONTENT_ID), false, false);
return;
}
}
}
}
}
@@ -23,6 +23,7 @@ import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.RunContentBuilder;
import com.intellij.execution.ui.*;
import com.intellij.execution.ui.layout.LayoutAttractionPolicy;
import com.intellij.execution.ui.layout.LayoutViewOptions;
@@ -52,6 +53,8 @@ import java.io.Reader;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.nio.charset.Charset;
import java.util.*;
/**
* @author nik
@@ -132,9 +135,24 @@ public abstract class DebuggerSessionTabBase extends LogConsoleManagerBase imple
}
}
}, content);
RunProfile profile = getRunProfile();
if (profile instanceof RunConfigurationBase && !ApplicationManager.getApplication().isUnitTestMode()) {
final RunConfigurationBase runConfigurationBase = (RunConfigurationBase)profile;
observable.addChangeListener(new RunContentBuilder.ConsoleToFrontListener(runConfigurationBase,
getProject(),
DefaultDebugExecutor.getDebugExecutorInstance(),
myRunContentDescriptor,
getUi()),
content);
}
}
}
@Nullable
protected RunProfile getRunProfile() {
return myEnvironment != null ? myEnvironment.getRunProfile() : null;
}
public void toFront() {
if (!ApplicationManager.getApplication().isUnitTestMode()) {
ExecutionManager.getInstance(getProject()).getContentManager().toFrontRunContent(DefaultDebugExecutor.getDebugExecutorInstance(), myRunContentDescriptor);