diff --git a/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java index dbe88aa9f168..8c89bada270d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DebugUIEnvironment.java @@ -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(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java index 41ba909b5283..66614159b271 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugUIEnvironment.java @@ -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; + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 34ed6ce5604e..bb8f331d06c4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -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) { diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java index e6dac0cc7cb3..a91678083b5f 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java @@ -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(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; } diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.form b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.form index 6f336c7dfd1e..9dd29c5b3b60 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.form +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.form @@ -1,9 +1,9 @@
- + - + @@ -13,7 +13,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -43,6 +43,22 @@ + + + + + + + + + + + + + + + +
diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java index 3a755d362540..a2d51099a3e7 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java @@ -59,6 +59,8 @@ public class LogConfigurationPanel extends Setti private JPanel myScrollPanel; private JBCheckBox myRedirectOutputCb; private TextFieldWithBrowseButton myOutputFile; + private JCheckBox myShowConsoleOnStdOutCb; + private JCheckBox myShowConsoleOnStdErrCb; private final Map myLog2Predefined = new HashMap(); private final List myUnresolvedPredefined = new ArrayList(); @@ -240,6 +242,8 @@ public class LogConfigurationPanel 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 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 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 f1b50705d0e9..fc3fa5dcd7c6 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -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 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; + } + } + } + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java index f398087e8e1a..2d7f423eee7e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerSessionTabBase.java @@ -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);