blob: 14877309db746a2cd8f11eb8af752243035ac381 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.runners;
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.configurations.SearchScopeProvider;
import com.intellij.execution.impl.ConsoleViewImpl;
import com.intellij.execution.ui.*;
import com.intellij.execution.ui.actions.CloseAction;
import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.icons.AllIcons;
import com.intellij.ide.actions.ContextHelpAction;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.tabs.PinToolwindowTabAction;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
public class RunContentBuilder extends RunTab {
@NonNls private static final String JAVA_RUNNER = "JavaRunner";
private final List<AnAction> myRunnerActions = new SmartList<AnAction>();
private final ExecutionResult myExecutionResult;
/**
* @deprecated use {@link #RunContentBuilder(com.intellij.execution.ExecutionResult, ExecutionEnvironment)}
* to remove in IDEA 14
*/
@SuppressWarnings("UnusedParameters")
public RunContentBuilder(@NotNull Project project,
ProgramRunner runner,
Executor executor,
ExecutionResult executionResult,
@NotNull ExecutionEnvironment environment) {
//noinspection deprecation
this(runner, executionResult, environment);
}
/**
* @deprecated use {@link #RunContentBuilder(com.intellij.execution.ExecutionResult, ExecutionEnvironment)}
* to remove in IDEA 15
*/
public RunContentBuilder(ProgramRunner runner,
ExecutionResult executionResult,
@NotNull ExecutionEnvironment environment) {
this(executionResult, fix(environment, runner));
}
public RunContentBuilder(@NotNull ExecutionResult executionResult, @NotNull ExecutionEnvironment environment) {
super(environment, getRunnerType(executionResult.getExecutionConsole()));
myExecutionResult = executionResult;
myUi.getOptions().setMoveToGridActionEnabled(false).setMinimizeActionEnabled(false);
}
@NotNull
public static ExecutionEnvironment fix(@NotNull ExecutionEnvironment environment, @Nullable ProgramRunner runner) {
if (runner == null || runner.equals(environment.getRunner())) {
return environment;
}
else {
return new ExecutionEnvironmentBuilder(environment).runner(runner).build();
}
}
@SuppressWarnings("UnusedDeclaration")
@Deprecated
@NotNull
/**
* @deprecated to remove in IDEA 15
*/
public static GlobalSearchScope createSearchScope(Project project, RunProfile runProfile) {
return SearchScopeProvider.createSearchScope(project, runProfile);
}
@NotNull
public ExecutionResult getExecutionResult() {
return myExecutionResult;
}
public void addAction(@NotNull final AnAction action) {
myRunnerActions.add(action);
}
@NotNull
private RunContentDescriptor createDescriptor() {
final RunProfile profile = myEnvironment.getRunProfile();
if (ApplicationManager.getApplication().isUnitTestMode()) {
return new RunContentDescriptor(profile, myExecutionResult, myUi);
}
final ExecutionConsole console = myExecutionResult.getExecutionConsole();
RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi);
if (console != null) {
if (console instanceof ExecutionConsoleEx) {
((ExecutionConsoleEx)console).buildUi(myUi);
}
else {
buildConsoleUiDefault(myUi, console);
}
initLogConsoles(profile, contentDescriptor, console);
}
myUi.getOptions().setLeftToolbar(createActionToolbar(contentDescriptor), ActionPlaces.UNKNOWN);
if (profile instanceof RunConfigurationBase) {
if (console instanceof ObservableConsoleView && !ApplicationManager.getApplication().isUnitTestMode()) {
((ObservableConsoleView)console).addChangeListener(new ConsoleToFrontListener((RunConfigurationBase)profile,
myProject,
myEnvironment.getExecutor(),
contentDescriptor,
myUi),
this);
}
}
return contentDescriptor;
}
@NotNull
private static String getRunnerType(@Nullable ExecutionConsole console) {
String runnerType = JAVA_RUNNER;
if (console instanceof ExecutionConsoleEx) {
String id = ((ExecutionConsoleEx)console).getExecutionConsoleId();
if (id != null) {
return JAVA_RUNNER + '.' + id;
}
}
return runnerType;
}
public static void buildConsoleUiDefault(RunnerLayoutUi ui, final ExecutionConsole console) {
final Content consoleContent = ui.createContent(ExecutionConsole.CONSOLE_CONTENT_ID, console.getComponent(), "Console",
AllIcons.Debugger.Console,
console.getPreferredFocusableComponent());
consoleContent.setCloseable(false);
addAdditionalConsoleEditorActions(console, consoleContent);
ui.addContent(consoleContent, 0, PlaceInGrid.bottom, false);
}
public static void addAdditionalConsoleEditorActions(final ExecutionConsole console, final Content consoleContent) {
final DefaultActionGroup consoleActions = new DefaultActionGroup();
if (console instanceof ConsoleView) {
for (AnAction action : ((ConsoleView)console).createConsoleActions()) {
consoleActions.add(action);
}
}
consoleContent.setActions(consoleActions, ActionPlaces.UNKNOWN, console.getComponent());
}
@NotNull
private ActionGroup createActionToolbar(@NotNull final RunContentDescriptor contentDescriptor) {
final DefaultActionGroup actionGroup = new DefaultActionGroup();
actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN));
final AnAction[] actions = contentDescriptor.getRestartActions();
actionGroup.addAll(actions);
if (actions.length > 0) {
actionGroup.addSeparator();
}
actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM));
if (myExecutionResult instanceof DefaultExecutionResult) {
actionGroup.addAll(((DefaultExecutionResult)myExecutionResult).getAdditionalStopActions());
}
actionGroup.addAll(myExecutionResult.getActions());
for (AnAction anAction : myRunnerActions) {
if (anAction != null) {
actionGroup.add(anAction);
}
else {
actionGroup.addSeparator();
}
}
actionGroup.addSeparator();
actionGroup.add(myUi.getOptions().getLayoutActions());
actionGroup.addSeparator();
actionGroup.add(PinToolwindowTabAction.getPinAction());
actionGroup.add(new CloseAction(myEnvironment.getExecutor(), contentDescriptor, myProject));
final String helpId = contentDescriptor.getHelpId();
actionGroup.add(new ContextHelpAction(helpId != null ? helpId : myEnvironment.getExecutor().getHelpId()));
return actionGroup;
}
/**
* @param reuseContent see {@link RunContentDescriptor#myContent}
*/
public RunContentDescriptor showRunContent(@Nullable RunContentDescriptor reuseContent) {
RunContentDescriptor descriptor = createDescriptor();
Disposer.register(descriptor, this);
Disposer.register(myProject, descriptor);
RunContentManagerImpl.copyContentAndBehavior(descriptor, reuseContent);
myRunContentDescriptor = descriptor;
return descriptor;
}
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;
}
}
}
}
}