diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/execution')
29 files changed, 952 insertions, 1078 deletions
diff --git a/platform/lang-impl/src/com/intellij/execution/ExecutionHelper.java b/platform/lang-impl/src/com/intellij/execution/ExecutionHelper.java index c4b5eaf71daf..cce4fc571abb 100644 --- a/platform/lang-impl/src/com/intellij/execution/ExecutionHelper.java +++ b/platform/lang-impl/src/com/intellij/execution/ExecutionHelper.java @@ -21,6 +21,7 @@ import com.intellij.execution.executors.DefaultRunExecutor; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.process.ProcessOutput; import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.execution.ui.RunContentManager; import com.intellij.ide.errorTreeView.NewErrorTreeViewPanel; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; @@ -44,12 +45,8 @@ import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ui.components.JBList; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; -import com.intellij.ui.content.ContentManager; import com.intellij.ui.content.MessageView; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Consumer; -import com.intellij.util.Function; -import com.intellij.util.NotNullFunction; +import com.intellij.util.*; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.ErrorTreeView; @@ -170,10 +167,8 @@ public class ExecutionHelper { openMessagesView(errorTreeView, myProject, tabDisplayName); } catch (NullPointerException e) { - final StringBuilder builder = new StringBuilder(); - builder.append(stdOutTitle).append("\n").append(stdout != null ? stdout : "<empty>").append("\n"); - builder.append(stderrTitle).append("\n").append(stderr != null ? stderr : "<empty>"); - Messages.showErrorDialog(builder.toString(), "Process Output"); + Messages.showErrorDialog(stdOutTitle + "\n" + (stdout != null ? stdout : "<empty>") + "\n" + stderrTitle + "\n" + + (stderr != null ? stderr : "<empty>"), "Process Output"); return; } @@ -267,13 +262,12 @@ public class ExecutionHelper { }); } - public static Collection<RunContentDescriptor> findRunningConsole(final Project project, - @NotNull final NotNullFunction<RunContentDescriptor, Boolean> descriptorMatcher) { - final ExecutionManager executionManager = ExecutionManager.getInstance(project); - - final RunContentDescriptor selectedContent = executionManager.getContentManager().getSelectedContent(); + public static Collection<RunContentDescriptor> findRunningConsole(@NotNull Project project, + @NotNull NotNullFunction<RunContentDescriptor, Boolean> descriptorMatcher) { + RunContentManager contentManager = ExecutionManager.getInstance(project).getContentManager(); + final RunContentDescriptor selectedContent = contentManager.getSelectedContent(); if (selectedContent != null) { - final ToolWindow toolWindow = ExecutionManager.getInstance(project).getContentManager().getToolWindowByDescriptor(selectedContent); + final ToolWindow toolWindow = contentManager.getToolWindowByDescriptor(selectedContent); if (toolWindow != null && toolWindow.isVisible()) { if (descriptorMatcher.fun(selectedContent)) { return Collections.singletonList(selectedContent); @@ -282,7 +276,7 @@ public class ExecutionHelper { } final ArrayList<RunContentDescriptor> result = ContainerUtil.newArrayList(); - for (RunContentDescriptor runContentDescriptor : executionManager.getContentManager().getAllDescriptors()) { + for (RunContentDescriptor runContentDescriptor : contentManager.getAllDescriptors()) { if (descriptorMatcher.fun(runContentDescriptor)) { result.add(runContentDescriptor); } @@ -290,11 +284,10 @@ public class ExecutionHelper { return result; } - public static List<RunContentDescriptor> collectConsolesByDisplayName(final Project project, + public static List<RunContentDescriptor> collectConsolesByDisplayName(@NotNull Project project, @NotNull NotNullFunction<String, Boolean> titleMatcher) { - List<RunContentDescriptor> result = ContainerUtil.newArrayList(); - final ExecutionManager executionManager = ExecutionManager.getInstance(project); - for (RunContentDescriptor runContentDescriptor : executionManager.getContentManager().getAllDescriptors()) { + List<RunContentDescriptor> result = new SmartList<RunContentDescriptor>(); + for (RunContentDescriptor runContentDescriptor : ExecutionManager.getInstance(project).getContentManager().getAllDescriptors()) { if (titleMatcher.fun(runContentDescriptor.getDisplayName())) { result.add(runContentDescriptor); } @@ -343,21 +336,18 @@ public class ExecutionHelper { } } - private static void descriptorToFront(final Project project, final RunContentDescriptor descriptor) { + private static void descriptorToFront(@NotNull final Project project, @NotNull final RunContentDescriptor descriptor) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - final ToolWindow toolWindow = ExecutionManager.getInstance(project).getContentManager().getToolWindowByDescriptor(descriptor); - + ToolWindow toolWindow = ExecutionManager.getInstance(project).getContentManager().getToolWindowByDescriptor(descriptor); if (toolWindow != null) { toolWindow.show(null); - - final ContentManager contentManager = toolWindow.getContentManager(); - - contentManager.setSelectedContent(descriptor.getAttachedContent()); + //noinspection ConstantConditions + toolWindow.getContentManager().setSelectedContent(descriptor.getAttachedContent()); } } - }); + }, project.getDisposed()); } public static class ErrorViewPanel extends NewErrorTreeViewPanel { @@ -384,8 +374,6 @@ public class ExecutionHelper { @NotNull final ExecutionMode mode, @NotNull final String presentableCmdline) { final String title = mode.getTitle() != null ? mode.getTitle() : "Please wait..."; - assert title != null; - final Runnable process; if (mode.cancelable()) { process = createCancelableExecutionProcess(processHandler, mode.shouldCancelFun()); @@ -400,7 +388,7 @@ public class ExecutionHelper { }; } else { - process = createTimelimitedExecutionProcess(processHandler, mode.getTimeout(), presentableCmdline); + process = createTimeLimitedExecutionProcess(processHandler, mode.getTimeout(), presentableCmdline); } } if (mode.withModalProgress()) { @@ -447,7 +435,7 @@ public class ExecutionHelper { private final Runnable myCancelListener = new Runnable() { @Override public void run() { - for (; ; ) { + while (true) { if ((myProgressIndicator != null && (myProgressIndicator.isCanceled() || !myProgressIndicator.isRunning())) || (cancelableFun != null && cancelableFun.fun(null).booleanValue()) @@ -493,7 +481,7 @@ public class ExecutionHelper { }; } - private static Runnable createTimelimitedExecutionProcess(final ProcessHandler processHandler, + private static Runnable createTimeLimitedExecutionProcess(final ProcessHandler processHandler, final int timeout, @NotNull final String presentableCmdline) { return new Runnable() { diff --git a/platform/lang-impl/src/com/intellij/execution/ExecutionTargetManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ExecutionTargetManagerImpl.java index d0170430613e..e4d7b9cff49e 100644 --- a/platform/lang-impl/src/com/intellij/execution/ExecutionTargetManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ExecutionTargetManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * 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. @@ -15,9 +15,11 @@ */ package com.intellij.execution; -import com.intellij.execution.impl.RunManagerImpl; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.*; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.util.containers.ContainerUtil; @@ -29,25 +31,30 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - -@State(name = "ExecutionTargetManager", storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE, scheme = StorageScheme.DEFAULT)}) -public class ExecutionTargetManagerImpl extends ExecutionTargetManager implements ProjectComponent, PersistentStateComponent<Element> { +@State(name = "ExecutionTargetManager", storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)}) +public class ExecutionTargetManagerImpl extends ExecutionTargetManager implements PersistentStateComponent<Element> { @NotNull private final Project myProject; @NotNull private final Object myActiveTargetLock = new Object(); @Nullable private ExecutionTarget myActiveTarget; @Nullable private String mySavedActiveTargetId; - public ExecutionTargetManagerImpl(@NotNull Project project) { + public ExecutionTargetManagerImpl(@NotNull Project project, @NotNull RunManager runManager) { myProject = project; - } - @Override - public void projectOpened() { - } + ((RunManagerEx)runManager).addRunManagerListener(new RunManagerAdapter() { + @Override + public void runConfigurationChanged(@NotNull RunnerAndConfigurationSettings settings) { + if (settings == RunManager.getInstance(myProject).getSelectedConfiguration()) { + updateActiveTarget(settings); + } + } - @Override - public void projectClosed() { + @Override + public void runConfigurationSelected() { + updateActiveTarget(); + } + }); } @Override @@ -70,33 +77,6 @@ public class ExecutionTargetManagerImpl extends ExecutionTargetManager implement } } - @Override - public void initComponent() { - RunManagerImpl.getInstanceImpl(myProject).addRunManagerListener(new RunManagerAdapter() { - @Override - public void runConfigurationChanged(@NotNull RunnerAndConfigurationSettings settings) { - if (settings == RunManager.getInstance(myProject).getSelectedConfiguration()) { - updateActiveTarget(settings); - } - } - - @Override - public void runConfigurationSelected() { - updateActiveTarget(); - } - }); - } - - @Override - public void disposeComponent() { - } - - @NotNull - @Override - public String getComponentName() { - return ExecutionTargetManager.class.getName(); - } - @NotNull @Override public ExecutionTarget getActiveTarget() { @@ -128,7 +108,7 @@ public class ExecutionTargetManagerImpl extends ExecutionTargetManager implement private void updateActiveTarget(@Nullable RunnerAndConfigurationSettings settings, @Nullable ExecutionTarget toSelect) { List<ExecutionTarget> suitable = settings == null ? Collections.singletonList(DefaultExecutionTarget.INSTANCE) : getTargetsFor(settings); - ExecutionTarget toNotify = null; + ExecutionTarget toNotify; synchronized (myActiveTargetLock) { if (toSelect == null) toSelect = myActiveTarget; diff --git a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java index bd9f5014fabb..44af49d36cdd 100644 --- a/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ExecutorRegistryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution; import com.intellij.execution.actions.RunContextAction; @@ -35,12 +34,8 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -/** - * @author spleaner - */ public class ExecutorRegistryImpl extends ExecutorRegistry { - private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ExecutorRegistryImpl"); - + private static final Logger LOG = Logger.getInstance(ExecutorRegistryImpl.class); @NonNls public static final String RUNNERS_GROUP = "RunnerActions"; @NonNls public static final String RUN_CONTEXT_GROUP = "RunContextGroup"; @@ -84,8 +79,7 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { action = anAction; } - final DefaultActionGroup group = (DefaultActionGroup) myActionManager.getAction(groupId); - group.add(action); + ((DefaultActionGroup)myActionManager.getAction(groupId)).add(action); } synchronized void deinitExecutor(@NotNull final Executor executor) { @@ -135,18 +129,18 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { final MessageBusConnection connect = project.getMessageBus().connect(project); connect.subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionAdapter(){ @Override - public void processStartScheduled(String executorId, ExecutionEnvironment env) { - myInProgress.add(createExecutionId(executorId, env, project)); + public void processStartScheduled(String executorId, ExecutionEnvironment environment) { + myInProgress.add(createExecutionId(executorId, environment)); } @Override - public void processNotStarted(String executorId, @NotNull ExecutionEnvironment env) { - myInProgress.remove(createExecutionId(executorId, env, project)); + public void processNotStarted(String executorId, @NotNull ExecutionEnvironment environment) { + myInProgress.remove(createExecutionId(executorId, environment)); } @Override - public void processStarted(String executorId, @NotNull ExecutionEnvironment env, @NotNull ProcessHandler handler) { - myInProgress.remove(createExecutionId(executorId, env, project)); + public void processStarted(String executorId, @NotNull ExecutionEnvironment environment, @NotNull ProcessHandler handler) { + myInProgress.remove(createExecutionId(executorId, environment)); } }); } @@ -172,26 +166,29 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { } } - private static Trinity<Project, String, String> createExecutionId(String executorId, ExecutionEnvironment env, Project project) { - return new Trinity<Project, String, String>(project, executorId, env.getRunnerId()); + @NotNull + private static Trinity<Project, String, String> createExecutionId(String executorId, @NotNull ExecutionEnvironment environment) { + return Trinity.create(environment.getProject(), executorId, environment.getRunner().getRunnerId()); } @Override public boolean isStarting(Project project, final String executorId, final String runnerId) { - return myInProgress.contains(new Trinity<Project, String, String>(project, executorId, runnerId)); + return myInProgress.contains(Trinity.create(project, executorId, runnerId)); + } + + @Override + public boolean isStarting(@NotNull ExecutionEnvironment environment) { + return isStarting(environment.getProject(), environment.getExecutor().getId(), environment.getRunner().getRunnerId()); } @Override public synchronized void disposeComponent() { - if (myExecutors.size() > 0) { - List<Executor> executors = new ArrayList<Executor>(myExecutors); - for (Executor executor : executors) { + if (!myExecutors.isEmpty()) { + for (Executor executor : new ArrayList<Executor>(myExecutors)) { deinitExecutor(executor); } - - myExecutors = null; } - + myExecutors = null; myActionManager = null; } @@ -206,7 +203,7 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { @Override public void update(final AnActionEvent e) { final Presentation presentation = e.getPresentation(); - final Project project = CommonDataKeys.PROJECT.getData(e.getDataContext()); + final Project project = e.getProject(); if (project == null || !project.isInitialized() || project.isDisposed() || DumbService.getInstance(project).isDumb()) { presentation.setEnabled(false); @@ -222,7 +219,7 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { ExecutionTarget target = ExecutionTargetManager.getActiveTarget(project); enabled = ExecutionTargetManager.canRun(selectedConfiguration, target) - && runner != null && !isStarting(project, myExecutor.getId(), runner.getRunnerId()); + && runner != null && !isStarting(project, myExecutor.getId(), runner.getRunnerId()); if (enabled) { presentation.setDescription(myExecutor.getDescription()); @@ -244,25 +241,17 @@ public class ExecutorRegistryImpl extends ExecutorRegistry { @Override public void actionPerformed(final AnActionEvent e) { - final DataContext dataContext = e.getDataContext(); final Project project = e.getProject(); if (project == null || project.isDisposed()) { return; } - final RunnerAndConfigurationSettings configuration = getConfiguration(project); - if (configuration == null) { - return; - } - ExecutionTarget target = ExecutionTargetManager.getActiveTarget(project); - ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(project, myExecutor); - ProgramRunner runner = ProgramRunnerUtil.getRunner(myExecutor.getId(), configuration); - if (runner == null) { + RunnerAndConfigurationSettings configuration = getConfiguration(project); + ExecutionEnvironmentBuilder builder = configuration == null ? null : ExecutionEnvironmentBuilder.createOrNull(myExecutor, configuration); + if (builder == null) { return; } - - builder.setDataContext(dataContext).setTarget(target).setRunnerAndSettings(runner, configuration); - ExecutionManager.getInstance(project).restartRunProfile(runner, builder.build(), null); + ExecutionManager.getInstance(project).restartRunProfile(builder.activeTarget().dataContext(e.getDataContext()).build()); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index b27a939dd57c..5ad5f73b954a 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * 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. @@ -13,23 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution; import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.ConfigurationType; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.impl.RunDialog; import com.intellij.execution.impl.RunManagerImpl; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ExecutionEnvironmentBuilder; import com.intellij.execution.runners.ExecutionUtil; import com.intellij.execution.runners.ProgramRunner; -import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.icons.AllIcons; import com.intellij.internal.statistic.UsageTrigger; import com.intellij.internal.statistic.beans.ConvertUsagesUtil; -import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; @@ -41,11 +38,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -/** - * @author spleaner - */ public class ProgramRunnerUtil { - private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ProgramRunnerUtil"); + private static final Logger LOG = Logger.getInstance(ProgramRunnerUtil.class); private ProgramRunnerUtil() { } @@ -55,102 +49,82 @@ public class ProgramRunnerUtil { return configuration == null ? null : RunnerRegistry.getInstance().getRunner(executorId, configuration.getConfiguration()); } - public static void executeConfiguration(@NotNull final Project project, - @Nullable final DataContext context, - @NotNull final RunnerAndConfigurationSettings configuration, - @NotNull final Executor executor, - @NotNull final ExecutionTarget target, - @Nullable RunContentDescriptor contentToReuse, - final boolean showSettings) { - ProgramRunner runner = getRunner(executor.getId(), configuration); - if (runner == null) { - LOG.error("Runner MUST not be null! Cannot find runner for " + - executor.getId() + - " and " + - configuration.getConfiguration().getFactory().getName()); - return; - } - executeConfiguration(project, context, configuration, executor, target, contentToReuse, showSettings, runner, null, true); - } - - public static void executeConfiguration(Project project, - @Nullable DataContext context, - @Nullable RunnerAndConfigurationSettings configuration, - Executor executor, - ExecutionTarget target, - RunContentDescriptor contentToReuse, - boolean showSettings, - @NotNull ProgramRunner runner, - @Nullable RunProfile runProfile, - boolean assignNewId) { - if (ExecutorRegistry.getInstance().isStarting(project, executor.getId(), runner.getRunnerId())) { - return; - } - - if (configuration != null && !ExecutionTargetManager.canRun(configuration, target)) { - ExecutionUtil.handleExecutionError( - project, executor.getToolWindowId(), configuration.getConfiguration(), - new ExecutionException(StringUtil.escapeXml("Cannot run '" + configuration.getName() + "' on '" + target.getDisplayName() + "'"))); + public static void executeConfiguration(@NotNull ExecutionEnvironment environment, boolean showSettings, boolean assignNewId) { + if (ExecutorRegistry.getInstance().isStarting(environment)) { return; } - if (configuration != null && - (!RunManagerImpl.canRunConfiguration(configuration, executor) || (showSettings && configuration.isEditBeforeRun()))) { - if (!RunDialog.editConfiguration(project, configuration, "Edit configuration", executor)) { + RunnerAndConfigurationSettings runnerAndConfigurationSettings = environment.getRunnerAndConfigurationSettings(); + if (runnerAndConfigurationSettings != null) { + if (!ExecutionTargetManager.canRun(environment)) { + ExecutionUtil.handleExecutionError(environment, new ExecutionException( + StringUtil.escapeXml("Cannot run '" + environment.getRunProfile().getName() + "' on '" + environment.getExecutionTarget().getDisplayName() + "'"))); return; } - while (!RunManagerImpl.canRunConfiguration(configuration, executor)) { - if (Messages.YES == Messages - .showYesNoDialog(project, "Configuration is still incorrect. Do you want to edit it again?", "Change Configuration Settings", - "Edit", "Continue Anyway", Messages.getErrorIcon())) { - if (!RunDialog.editConfiguration(project, configuration, "Edit configuration", executor)) { - return; - } + if (!RunManagerImpl.canRunConfiguration(environment) || (showSettings && runnerAndConfigurationSettings.isEditBeforeRun())) { + if (!RunDialog.editConfiguration(environment, "Edit configuration")) { + return; } - else { - break; + + while (!RunManagerImpl.canRunConfiguration(environment)) { + if (Messages.YES == Messages + .showYesNoDialog(environment.getProject(), "Configuration is still incorrect. Do you want to edit it again?", "Change Configuration Settings", + "Edit", "Continue Anyway", Messages.getErrorIcon())) { + if (!RunDialog.editConfiguration(environment, "Edit configuration")) { + return; + } + } + else { + break; + } } } - } - final ConfigurationType configurationType = configuration != null ? configuration.getType() : null; - if (configurationType != null) { - UsageTrigger.trigger("execute." + ConvertUsagesUtil.ensureProperKey(configurationType.getId()) + "." + executor.getId()); + ConfigurationType configurationType = runnerAndConfigurationSettings.getType(); + if (configurationType != null) { + UsageTrigger.trigger("execute." + ConvertUsagesUtil.ensureProperKey(configurationType.getId()) + "." + environment.getExecutor().getId()); + } } try { - ExecutionEnvironmentBuilder builder = - new ExecutionEnvironmentBuilder(project, executor); - if (configuration != null) { - builder.setRunnerAndSettings(runner, configuration); - } - else { - builder.setRunnerId(runner.getRunnerId()); - } - builder.setTarget(target).setContentToReuse(contentToReuse).setDataContext(context); if (assignNewId) { - builder.assignNewId(); - } - if (runProfile != null) { - builder.setRunProfile(runProfile); + environment.assignNewExecutionId(); } - runner.execute(builder.build()); + environment.getRunner().execute(environment); } catch (ExecutionException e) { - String name = configuration != null ? configuration.getName() : null; - if (name == null && runProfile != null) name = runProfile.getName(); - if (name == null && contentToReuse != null) name = contentToReuse.getDisplayName(); - if (name == null) name = "<Unknown>"; - ExecutionUtil.handleExecutionError(project, executor.getToolWindowId(), name, e); + String name = runnerAndConfigurationSettings != null ? runnerAndConfigurationSettings.getName() : null; + if (name == null) { + name = environment.getRunProfile().getName(); + } + if (name == null && environment.getContentToReuse() != null) { + name = environment.getContentToReuse().getDisplayName(); + } + if (name == null) { + name = "<Unknown>"; + } + ExecutionUtil.handleExecutionError(environment.getProject(), environment.getExecutor().getToolWindowId(), name, e); } } - public static void executeConfiguration(@NotNull Project project, @NotNull RunnerAndConfigurationSettings configuration, @NotNull Executor executor) { - executeConfiguration(project, null, configuration, executor, ExecutionTargetManager.getActiveTarget(project), null, true); + ExecutionEnvironmentBuilder builder; + try { + builder = ExecutionEnvironmentBuilder.create(executor, configuration); + } + catch (ExecutionException e) { + LOG.error(e); + return; + } + + executeConfiguration(builder + .contentToReuse(null) + .dataContext(null) + .activeTarget() + .build(), true, true); } public static Icon getConfigurationIcon(final RunnerAndConfigurationSettings settings, diff --git a/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java b/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java index 1a0235ac9d46..a4764dae0036 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/ChooseRunConfigurationPopup.java @@ -22,8 +22,8 @@ import com.intellij.execution.configurations.UnknownConfigurationType; import com.intellij.execution.impl.EditConfigurationsDialog; import com.intellij.execution.impl.RunDialog; import com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl; +import com.intellij.execution.runners.ExecutionUtil; import com.intellij.execution.runners.ProgramRunner; -import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.util.PropertiesComponent; @@ -193,10 +193,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { } private void updatePresentation() { - final Executor executor = getExecutor(); - if (executor != null) { - myPopup.setCaption(executor.getActionName()); - } + myPopup.setCaption(getExecutor().getActionName()); } static void execute(final ItemWrapper itemWrapper, final Executor executor) { @@ -218,12 +215,10 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { void editConfiguration(@NotNull final Project project, @NotNull final RunnerAndConfigurationSettings configuration) { final Executor executor = getExecutor(); - assert executor != null; - PropertiesComponent.getInstance().setValue("run.configuration.edit.ad", Boolean.toString(true)); if (RunDialog.editConfiguration(project, configuration, "Edit configuration settings", executor)) { RunManagerEx.getInstanceEx(project).setSelectedConfiguration(configuration); - doRunConfiguration(configuration, executor, project); + ExecutionUtil.runConfiguration(configuration, executor); } } @@ -379,7 +374,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { public void perform(@NotNull Project project, @NotNull Executor executor, @NotNull DataContext context) { RunnerAndConfigurationSettings config = getValue(); RunManagerEx.getInstanceEx(project).setSelectedConfiguration(config); - doRunConfiguration(config, executor, project); + ExecutionUtil.runConfiguration(config, executor); } @Override @@ -404,7 +399,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { @Override public boolean available(Executor executor) { - return null != ProgramRunnerUtil.getRunner(executor.getId(), getValue()); + return ProgramRunnerUtil.getRunner(executor.getId(), getValue()) != null; } @Override @@ -462,7 +457,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { final List<ItemWrapper> configurations = getValues(); final int index = configurations.indexOf(value); if (index > 0 && index <= configurations.size() - 1) { - final ItemWrapper aboveConfiguration = index == 0 ? null : configurations.get(index - 1); + final ItemWrapper aboveConfiguration = configurations.get(index - 1); if (aboveConfiguration != null && aboveConfiguration.isDynamic() != value.isDynamic()) { return new ListSeparator(); @@ -508,18 +503,15 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { } } - final Executor executor = myAction.getExecutor(); - assert executor != null; - - if (finalChoice && wrapper.available(executor)) { + if (finalChoice && wrapper.available(myAction.getExecutor())) { return doFinalStep(new Runnable() { @Override public void run() { - if (executor == myAction.myAlternativeExecutor) { + if (myAction.getExecutor() == myAction.myAlternativeExecutor) { PropertiesComponent.getInstance().setValue(myAction.myAddKey, Boolean.toString(true)); } - wrapper.perform(myProject, executor, DataManager.getInstance().getDataContext()); + wrapper.perform(myProject, myAction.getExecutor(), DataManager.getInstance().getDataContext()); } }); } @@ -545,14 +537,6 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { } } - private static void doRunConfiguration(RunnerAndConfigurationSettings configuration, Executor executor, Project project) { - ExecutionManager.getInstance(project).restartRunProfile(project, - executor, - ExecutionTargetManager.getActiveTarget(project), - configuration, - (RunContentDescriptor)null); - } - private static final class ConfigurationActionsStep extends BaseListPopupStep<ActionWrapper> { @NotNull private final RunnerAndConfigurationSettings mySettings; @@ -600,11 +584,13 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { @Override public void perform() { final RunManagerEx manager = RunManagerEx.getInstanceEx(project); - if (dynamic) manager.setTemporaryConfiguration(settings); + if (dynamic) { + manager.setTemporaryConfiguration(settings); + } manager.setSelectedConfiguration(settings); ExecutionTargetManager.setActiveTarget(project, eachTarget); - doRunConfiguration(settings, action.getExecutor(), project); + ExecutionUtil.runConfiguration(settings, action.getExecutor()); } }); } @@ -617,9 +603,11 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { @Override public void perform() { final RunManagerEx manager = RunManagerEx.getInstanceEx(project); - if (dynamic) manager.setTemporaryConfiguration(settings); + if (dynamic) { + manager.setTemporaryConfiguration(settings); + } manager.setSelectedConfiguration(settings); - doRunConfiguration(settings, executor, project); + ExecutionUtil.runConfiguration(settings, executor); } }); isFirst = false; @@ -857,7 +845,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { RunnerAndConfigurationSettings selectedConfiguration = RunManagerEx.getInstanceEx(project).getSelectedConfiguration(); if (myConfigurations.contains(selectedConfiguration)) { RunManagerEx.getInstanceEx(project).setSelectedConfiguration(selectedConfiguration); - doRunConfiguration(selectedConfiguration, myExecutorProvider.getExecutor(), project); + ExecutionUtil.runConfiguration(selectedConfiguration, myExecutorProvider.getExecutor()); } } @@ -906,8 +894,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { public void run() { RunnerAndConfigurationSettings settings = selectedValue.getSettings(); RunManagerEx.getInstanceEx(myProject).setSelectedConfiguration(settings); - doRunConfiguration(settings, myExecutorProvider.getExecutor(), myProject); - + ExecutionUtil.runConfiguration(settings, myExecutorProvider.getExecutor()); } }); } else { @@ -961,7 +948,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { @Override public void perform(@NotNull final Project project, @NotNull final Executor executor, @NotNull DataContext context) { ExecutionTargetManager.setActiveTarget(project, eachTarget); - doRunConfiguration(selectedConfiguration, executor, project); + ExecutionUtil.runConfiguration(selectedConfiguration, executor); } @Override @@ -1035,7 +1022,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - doRunConfiguration(RunManager.getInstance(project).getSelectedConfiguration(), executor, project); + ExecutionUtil.runConfiguration(RunManager.getInstance(project).getSelectedConfiguration(), executor); } }); } @@ -1116,7 +1103,7 @@ public class ChooseRunConfigurationPopup implements ExecutorProvider { public void perform(@NotNull Project project, @NotNull Executor executor, @NotNull DataContext context) { manager.setTemporaryConfiguration(configuration); RunManagerEx.getInstanceEx(project).setSelectedConfiguration(configuration); - doRunConfiguration(configuration, executor, project); + ExecutionUtil.runConfiguration(configuration, executor); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/actions/RunContextAction.java b/platform/lang-impl/src/com/intellij/execution/actions/RunContextAction.java index f5741242089d..0a467c7cec23 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/RunContextAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/RunContextAction.java @@ -18,10 +18,9 @@ package com.intellij.execution.actions; import com.intellij.execution.*; import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.runners.ExecutionUtil; import com.intellij.execution.runners.ProgramRunner; -import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,12 +46,8 @@ public class RunContextAction extends BaseRunConfigurationAction { runManager.setTemporaryConfiguration(configuration); } runManager.setSelectedConfiguration(configuration); - Project project = context.getProject(); - ExecutionManager.getInstance(project).restartRunProfile(project, - myExecutor, - ExecutionTargetManager.getActiveTarget(project), - configuration, - (RunContentDescriptor)null); + + ExecutionUtil.runConfiguration(configuration, myExecutor); } @Override @@ -81,11 +76,10 @@ public class RunContextAction extends BaseRunConfigurationAction { configuration = context.getConfiguration(); } - if (configuration == null) return Pair.create(false, false); - - final ProgramRunner runner = getRunner(configuration.getConfiguration()); - if (runner == null) return Pair.create(false, false); - + ProgramRunner runner = configuration == null ? null : getRunner(configuration.getConfiguration()); + if (runner == null) { + return Pair.create(false, false); + } return Pair.create(!ExecutorRegistry.getInstance().isStarting(context.getProject(), myExecutor.getId(), runner.getRunnerId()), true); } } diff --git a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java index 618a4b1c65c5..75466528ae2f 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution.actions; +import com.intellij.execution.ExecutionBundle; import com.intellij.execution.ExecutionManager; import com.intellij.execution.KillableProcess; +import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.execution.ui.RunContentManager; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.progress.ProgressIndicator; @@ -29,7 +29,7 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; -import com.intellij.openapi.ui.popup.ListItemDescriptor; +import com.intellij.openapi.ui.popup.ListItemDescriptorAdapter; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; @@ -49,19 +49,20 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate { +class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate { @Override public void update(final AnActionEvent e) { boolean enable = false; Icon icon = getTemplatePresentation().getIcon(); String description = getTemplatePresentation().getDescription(); - final Presentation presentation = e.getPresentation(); - + Presentation presentation = e.getPresentation(); if (ActionPlaces.MAIN_MENU.equals(e.getPlace())) { enable = !getCancellableProcesses(e.getProject()).isEmpty() || !getActiveDescriptors(e.getDataContext()).isEmpty(); + presentation.setText(getTemplatePresentation().getText()); } else { - final ProcessHandler processHandler = getHandler(e.getDataContext()); + RunContentDescriptor contentDescriptor = e.getData(LangDataKeys.RUN_CONTENT_DESCRIPTOR); + ProcessHandler processHandler = contentDescriptor == null ? null : contentDescriptor.getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminated()) { if (!processHandler.isProcessTerminating()) { enable = true; @@ -72,6 +73,14 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU description = "Kill process"; } } + + RunProfile runProfile = e.getData(LangDataKeys.RUN_PROFILE); + if (runProfile == null && contentDescriptor == null) { + presentation.setText(getTemplatePresentation().getText()); + } + else { + presentation.setText(ExecutionBundle.message("stop.configuration.action.name", runProfile == null ? contentDescriptor.getDisplayName() : runProfile.getName())); + } } presentation.setEnabled(enable); @@ -84,7 +93,8 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU final DataContext dataContext = e.getDataContext(); ProcessHandler activeProcessHandler = getHandler(dataContext); - List<Pair<TaskInfo, ProgressIndicator>> backgroundTasks = getCancellableProcesses(e.getProject()); + Project project = e.getProject(); + List<Pair<TaskInfo, ProgressIndicator>> backgroundTasks = getCancellableProcesses(project); if (ActionPlaces.MAIN_MENU.equals(e.getPlace())) { if (activeProcessHandler != null && !activeProcessHandler.isProcessTerminating() && !activeProcessHandler.isProcessTerminated() && backgroundTasks.isEmpty()) { @@ -94,12 +104,14 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU Pair<List<HandlerItem>, HandlerItem> handlerItems = getItemsList(backgroundTasks, getActiveDescriptors(dataContext), activeProcessHandler); - if (handlerItems.first.isEmpty()) return; + if (handlerItems == null || handlerItems.first.isEmpty()) { + return; + } final JBList list = new JBList(handlerItems.first); if (handlerItems.second != null) list.setSelectedValue(handlerItems.second, true); - list.setCellRenderer(new GroupedItemsListRenderer(new ListItemDescriptor() { + list.setCellRenderer(new GroupedItemsListRenderer(new ListItemDescriptorAdapter() { @Nullable @Override public String getTextFor(Object value) { @@ -108,12 +120,6 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU @Nullable @Override - public String getTooltipFor(Object value) { - return null; - } - - @Nullable - @Override public Icon getIconFor(Object value) { return value instanceof HandlerItem ? ((HandlerItem)value).icon : null; } @@ -122,12 +128,6 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU public boolean hasSeparatorAboveOf(Object value) { return value instanceof HandlerItem && ((HandlerItem)value).hasSeparator; } - - @Nullable - @Override - public String getCaptionAboveOf(Object value) { - return null; - } })); final PopupChooserBuilder builder = JBPopupFactory.getInstance().createListPopupBuilder(list); @@ -148,7 +148,8 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU } }).setRequestFocus(true).createPopup(); - popup.showCenteredInCurrentWindow(e.getProject()); + assert project != null; + popup.showCenteredInCurrentWindow(project); } else { if (activeProcessHandler != null) { @@ -171,12 +172,15 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU }); } + @Nullable private static Pair<List<HandlerItem>, HandlerItem> getItemsList(List<Pair<TaskInfo, ProgressIndicator>> tasks, List<RunContentDescriptor> descriptors, ProcessHandler activeProcessHandler) { - if (tasks.isEmpty() && descriptors.isEmpty()) return Pair.create(Collections.<HandlerItem>emptyList(), null); + if (tasks.isEmpty() && descriptors.isEmpty()) { + return null; + } - ArrayList<HandlerItem> items = new ArrayList<HandlerItem>(tasks.size() + descriptors.size()); + List<HandlerItem> items = new ArrayList<HandlerItem>(tasks.size() + descriptors.size()); HandlerItem selected = null; for (RunContentDescriptor descriptor : descriptors) { final ProcessHandler handler = descriptor.getProcessHandler(); @@ -188,7 +192,9 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU } }; items.add(item); - if (handler == activeProcessHandler) selected = item; + if (handler == activeProcessHandler) { + selected = item; + } } } @@ -202,7 +208,7 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU }); hasSeparator = false; } - return Pair.<List<HandlerItem>, HandlerItem>create(items, selected); + return Pair.create(items, selected); } private static void stopProcess(ProcessHandler processHandler) { @@ -220,21 +226,19 @@ public class StopAction extends DumbAwareAction implements AnAction.TransparentU } @Nullable - static ProcessHandler getHandler(final DataContext dataContext) { - final RunContentDescriptor contentDescriptor = RunContentManager.RUN_CONTENT_DESCRIPTOR.getData(dataContext); - final ProcessHandler processHandler; + static ProcessHandler getHandler(@NotNull DataContext dataContext) { + final RunContentDescriptor contentDescriptor = LangDataKeys.RUN_CONTENT_DESCRIPTOR.getData(dataContext); if (contentDescriptor != null) { // toolwindow case - processHandler = contentDescriptor.getProcessHandler(); + return contentDescriptor.getProcessHandler(); } else { // main menu toolbar final Project project = CommonDataKeys.PROJECT.getData(dataContext); final RunContentDescriptor selectedContent = project == null ? null : ExecutionManager.getInstance(project).getContentManager().getSelectedContent(); - processHandler = selectedContent == null ? null : selectedContent.getProcessHandler(); + return selectedContent == null ? null : selectedContent.getProcessHandler(); } - return processHandler; } @NotNull 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 1a9afd1e25e5..d7f40f35a219 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java @@ -616,7 +616,7 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { sink.put(OpenFileDescriptor.NAVIGATE_IN_EDITOR, myConsoleEditor); } else if (getProject().isInitialized()) { - sink.put(key, FileEditorManagerEx.getInstanceEx(getProject()).getData(key.getName(), myConsoleEditor, myVirtualFile)); + sink.put(key, FileEditorManagerEx.getInstanceEx(getProject()).getData(key.getName(), myConsoleEditor, myConsoleEditor.getCaretModel().getCurrentCaret())); } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConfigurationSettingsEditor.java b/platform/lang-impl/src/com/intellij/execution/impl/ConfigurationSettingsEditor.java index bdae21f781ea..7bae2105014a 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConfigurationSettingsEditor.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConfigurationSettingsEditor.java @@ -75,16 +75,14 @@ class ConfigurationSettingsEditor extends CompositeSettingsEditor<RunnerAndConfi myRunnersComponent = new RunnersEditorComponent(); - ProgramRunner[] runners = RunnerRegistry.getInstance().getRegisteredRunners(); final Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); for (final Executor executor : executors) { - for (ProgramRunner runner : runners) { - if (runner.canRun(executor.getId(), myConfiguration)) { - JComponent perRunnerSettings = createCompositePerRunnerSettings(executor, runner); - if (perRunnerSettings != null) { - myRunnersComponent.addExecutorComponent(executor, perRunnerSettings); - } + ProgramRunner runner = RunnerRegistry.getInstance().getRunner(executor.getId(), myConfiguration); + if (runner != null) { + JComponent perRunnerSettings = createCompositePerRunnerSettings(executor, runner); + if (perRunnerSettings != null) { + myRunnersComponent.addExecutorComponent(executor, perRunnerSettings); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java index c017284f8e11..29808af0845d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.execution.impl; import com.intellij.CommonBundle; import com.intellij.execution.*; import com.intellij.execution.configuration.CompatibilityAwareRunProfile; -import com.intellij.execution.configurations.*; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; @@ -34,12 +35,12 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Trinity; @@ -47,21 +48,20 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.ui.docking.DockManager; import com.intellij.util.Alarm; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.Predicate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; -/** - * @author dyoma - */ -public class ExecutionManagerImpl extends ExecutionManager implements ProjectComponent { +public class ExecutionManagerImpl extends ExecutionManager implements Disposable { public static final Key<Object> EXECUTION_SESSION_ID_KEY = Key.create("EXECUTION_SESSION_ID_KEY"); - private static final Logger LOG = Logger.getInstance("com.intellij.execution.impl.ExecutionManagerImpl"); + + private static final Logger LOG = Logger.getInstance(ExecutionManagerImpl.class); + private static final ProcessHandler[] EMPTY_PROCESS_HANDLERS = new ProcessHandler[0]; private final Project myProject; @@ -70,28 +70,12 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom private final List<Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor>> myRunningConfigurations = ContainerUtil.createLockFreeCopyOnWriteList(); - /** - * reflection - */ - ExecutionManagerImpl(final Project project) { + ExecutionManagerImpl(@NotNull Project project) { myProject = project; } @Override - public void projectOpened() { - ((RunContentManagerImpl)getContentManager()).init(); - } - - @Override - public void projectClosed() { - } - - @Override - public void initComponent() { - } - - @Override - public void disposeComponent() { + public void dispose() { for (Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity : myRunningConfigurations) { Disposer.dispose(trinity.first); } @@ -108,112 +92,118 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom return myContentManager; } + @NotNull @Override public ProcessHandler[] getRunningProcesses() { - final List<ProcessHandler> handlers = new ArrayList<ProcessHandler>(); + if (myContentManager == null) return EMPTY_PROCESS_HANDLERS; + List<ProcessHandler> handlers = null; for (RunContentDescriptor descriptor : getContentManager().getAllDescriptors()) { - final ProcessHandler processHandler = descriptor.getProcessHandler(); + ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null) { + if (handlers == null) { + handlers = new SmartList<ProcessHandler>(); + } handlers.add(processHandler); } } - return handlers.toArray(new ProcessHandler[handlers.size()]); + return handlers == null ? EMPTY_PROCESS_HANDLERS : handlers.toArray(new ProcessHandler[handlers.size()]); } @Override public void compileAndRun(@NotNull final Runnable startRunnable, - @NotNull final ExecutionEnvironment env, + @NotNull final ExecutionEnvironment environment, @Nullable final RunProfileState state, @Nullable final Runnable onCancelRunnable) { - long id = env.getExecutionId(); + long id = environment.getExecutionId(); if (id == 0) { - id = env.assignNewExecutionId(); + id = environment.assignNewExecutionId(); } - RunProfile profile = env.getRunProfile(); - - if (profile instanceof RunConfiguration) { - final RunConfiguration runConfiguration = (RunConfiguration)profile; - final RunManagerImpl runManager = RunManagerImpl.getInstanceImpl(myProject); - final List<BeforeRunTask> activeTasks = new ArrayList<BeforeRunTask>(); - activeTasks.addAll(runManager.getBeforeRunTasks(runConfiguration)); + RunProfile profile = environment.getRunProfile(); + if (!(profile instanceof RunConfiguration)) { + startRunnable.run(); + return; + } - DataContext context = env.getDataContext(); + final RunConfiguration runConfiguration = (RunConfiguration)profile; + final List<BeforeRunTask> beforeRunTasks = RunManagerEx.getInstanceEx(myProject).getBeforeRunTasks(runConfiguration); + if (beforeRunTasks.isEmpty()) { + startRunnable.run(); + } + else { + DataContext context = environment.getDataContext(); final DataContext projectContext = context != null ? context : SimpleDataContext.getProjectContext(myProject); - - if (!activeTasks.isEmpty()) { - final long finalId = id; - final Long executionSessionId = new Long(id); - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - /** @noinspection SSBasedInspection*/ - @Override - public void run() { - for (BeforeRunTask task : activeTasks) { - if (myProject.isDisposed()) { - return; - } - BeforeRunTaskProvider<BeforeRunTask> provider = BeforeRunTaskProvider.getProvider(myProject, task.getProviderId()); - if (provider == null) { - LOG.warn("Cannot find BeforeRunTaskProvider for id='" + task.getProviderId() + "'"); - continue; - } - ExecutionEnvironment taskEnvironment = new ExecutionEnvironmentBuilder(env).setContentToReuse(null).build(); - taskEnvironment.setExecutionId(finalId); - EXECUTION_SESSION_ID_KEY.set(taskEnvironment, executionSessionId); - if (!provider.executeTask(projectContext, runConfiguration, taskEnvironment, task)) { - if (onCancelRunnable != null) { - SwingUtilities.invokeLater(onCancelRunnable); - } - return; - } + final long finalId = id; + final Long executionSessionId = new Long(id); + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + /** @noinspection SSBasedInspection*/ + @Override + public void run() { + for (BeforeRunTask task : beforeRunTasks) { + if (myProject.isDisposed()) { + return; } - // important! Do not use DumbService.smartInvokelater here because it depends on modality state - // and execution of startRunnable could be skipped if modality state check fails - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (!myProject.isDisposed()) { - DumbService.getInstance(myProject).runWhenSmart(startRunnable); - } + @SuppressWarnings("unchecked") + BeforeRunTaskProvider<BeforeRunTask> provider = BeforeRunTaskProvider.getProvider(myProject, task.getProviderId()); + if (provider == null) { + LOG.warn("Cannot find BeforeRunTaskProvider for id='" + task.getProviderId() + "'"); + continue; + } + ExecutionEnvironment taskEnvironment = new ExecutionEnvironmentBuilder(environment).contentToReuse(null).build(); + taskEnvironment.setExecutionId(finalId); + EXECUTION_SESSION_ID_KEY.set(taskEnvironment, executionSessionId); + if (!provider.executeTask(projectContext, runConfiguration, taskEnvironment, task)) { + if (onCancelRunnable != null) { + SwingUtilities.invokeLater(onCancelRunnable); } - }); + return; + } } - }); - } - else { - startRunnable.run(); - } - } - else { - startRunnable.run(); + // important! Do not use DumbService.smartInvokeLater here because it depends on modality state + // and execution of startRunnable could be skipped if modality state check fails + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (!myProject.isDisposed()) { + DumbService.getInstance(myProject).runWhenSmart(startRunnable); + } + } + }); + } + }); } } @Override - public void startRunProfile(@NotNull final RunProfileStarter starter, @NotNull final RunProfileState state, - @NotNull final Project project, @NotNull final Executor executor, @NotNull final ExecutionEnvironment env) { - final RunContentDescriptor reuseContent = - ExecutionManager.getInstance(project).getContentManager().getReuseContent(env); + public void startRunProfile(@NotNull final RunProfileStarter starter, + @NotNull final RunProfileState state, + @NotNull final ExecutionEnvironment environment) { + final Project project = environment.getProject(); + final RunContentDescriptor reuseContent = getContentManager().getReuseContent(environment); if (reuseContent != null) { - reuseContent.setExecutionId(env.getExecutionId()); + reuseContent.setExecutionId(environment.getExecutionId()); } - final RunProfile profile = env.getRunProfile(); - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStartScheduled(executor.getId(), env); + final Executor executor = environment.getExecutor(); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStartScheduled(executor.getId(), environment); Runnable startRunnable = new Runnable() { @Override public void run() { - if (project.isDisposed()) return; + if (project.isDisposed()) { + return; + } + + RunProfile profile = environment.getRunProfile(); boolean started = false; try { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarting(executor.getId(), env); - - final RunContentDescriptor descriptor = starter.execute(project, executor, state, reuseContent, env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarting(executor.getId(), environment); + final RunContentDescriptor descriptor = starter.execute(project, executor, state, reuseContent, environment); if (descriptor != null) { + environment.setContentToReuse(descriptor); final Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity = - Trinity.create(descriptor, env.getRunnerAndConfigurationSettings(), executor); + Trinity.create(descriptor, environment.getRunnerAndConfigurationSettings(), executor); myRunningConfigurations.add(trinity); Disposer.register(descriptor, new Disposable() { @Override @@ -221,13 +211,13 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom myRunningConfigurations.remove(trinity); } }); - ExecutionManager.getInstance(project).getContentManager().showRunContent(executor, descriptor, reuseContent); + getContentManager().showRunContent(executor, descriptor, reuseContent); final ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null) { if (!processHandler.isStartNotified()) { processHandler.startNotify(); } - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(executor.getId(), env, processHandler); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processStarted(executor.getId(), environment, processHandler); started = true; processHandler.addProcessListener(new ProcessExecutionListener(project, profile, processHandler)); } @@ -239,7 +229,7 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom } finally { if (!started) { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), environment); } } } @@ -249,11 +239,11 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom startRunnable.run(); } else { - compileAndRun(startRunnable, env, state, new Runnable() { + compileAndRun(startRunnable, environment, state, new Runnable() { @Override public void run() { if (!project.isDisposed()) { - project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), env); + project.getMessageBus().syncPublisher(EXECUTION_TOPIC).processNotStarted(executor.getId(), environment); } } }); @@ -261,26 +251,36 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom } @Override - public void startRunProfile(@NotNull RunProfileStarter starter, @NotNull RunProfileState state, @NotNull ExecutionEnvironment env) { - startRunProfile(starter, state, env.getProject(), env.getExecutor(), env); - } - - @Override - public void restartRunProfile(@NotNull final Project project, - @NotNull final Executor executor, - @NotNull final ExecutionTarget target, - @Nullable final RunnerAndConfigurationSettings configuration, - @Nullable final ProcessHandler processHandler) { + public void restartRunProfile(@NotNull Project project, + @NotNull Executor executor, + @NotNull ExecutionTarget target, + @Nullable RunnerAndConfigurationSettings configuration, + @Nullable ProcessHandler processHandler) { + ExecutionEnvironmentBuilder builder = createEnvironmentBuilder(project, executor, configuration); if (processHandler != null) { for (RunContentDescriptor descriptor : getContentManager().getAllDescriptors()) { - final ProcessHandler handler = descriptor.getProcessHandler(); - if (handler == processHandler) { - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, descriptor); - return; + if (descriptor.getProcessHandler() == processHandler) { + builder.contentToReuse(descriptor); + break; } } } - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, null); + restartRunProfile(builder.target(target).build()); + } + + @NotNull + private static ExecutionEnvironmentBuilder createEnvironmentBuilder(@NotNull Project project, @NotNull Executor executor, @Nullable RunnerAndConfigurationSettings configuration) { + ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(project, executor); + + ProgramRunner runner = RunnerRegistry.getInstance().getRunner(executor.getId(), configuration != null ? configuration.getConfiguration() : null); + if (runner == null && configuration != null) { + LOG.error("Cannot find runner for " + configuration.getName()); + } + else if (runner != null) { + assert configuration != null; + builder.runnerAndSettings(runner, configuration); + } + return builder; } @Override @@ -289,123 +289,89 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom @NotNull ExecutionTarget target, @Nullable RunnerAndConfigurationSettings configuration, @Nullable RunContentDescriptor currentDescriptor) { - restartRunProfile(project, null, null, null, null, null, executor, target, configuration, currentDescriptor); + ExecutionEnvironmentBuilder builder = createEnvironmentBuilder(project, executor, configuration); + restartRunProfile(builder.target(target).contentToReuse(currentDescriptor).build()); } @Override public void restartRunProfile(@Nullable ProgramRunner runner, @NotNull ExecutionEnvironment environment, @Nullable RunContentDescriptor currentDescriptor) { - restartRunProfile(environment.getProject(), - environment.getDataContext(), - runner, - environment.getRunProfile(), - environment.getRunnerSettings(), - environment.getConfigurationSettings(), - environment.getExecutor(), - environment.getExecutionTarget(), - environment.getRunnerAndConfigurationSettings(), currentDescriptor); + ExecutionEnvironmentBuilder builder = new ExecutionEnvironmentBuilder(environment).contentToReuse(currentDescriptor); + if (runner != null) { + builder.runner(runner); + } + restartRunProfile(builder.build()); } + public static boolean isProcessRunning(@Nullable RunContentDescriptor descriptor) { + ProcessHandler processHandler = descriptor == null ? null : descriptor.getProcessHandler(); + return processHandler != null && !processHandler.isProcessTerminated(); + } - private void restartRunProfile(@NotNull final Project project, - @Nullable final DataContext context, - @Nullable ProgramRunner r, - @Nullable final RunProfile runProfile, - @Nullable final RunnerSettings runnerSettings, - @Nullable final ConfigurationPerRunnerSettings configurationPerRunnerSettings, - @NotNull final Executor executor, - @NotNull final ExecutionTarget target, - @Nullable final RunnerAndConfigurationSettings configuration, - @Nullable final RunContentDescriptor currentDescriptor) { - final ProgramRunner runner = r != null ? - r : - RunnerRegistry.getInstance().getRunner(executor.getId(), - configuration != null && configuration.getConfiguration() != null - ? configuration.getConfiguration() - : runProfile - ); - if (configuration != null && runner == null) { - LOG.error("Cannot find runner for " + configuration.getName()); - return; - } - - final List<RunContentDescriptor> runningConfigurationsOfTheSameType = new ArrayList<RunContentDescriptor>(); - final List<RunContentDescriptor> runningIncompatibleConfigurations = new ArrayList<RunContentDescriptor>(); + @Override + public void restartRunProfile(@NotNull final ExecutionEnvironment environment) { + RunnerAndConfigurationSettings configuration = environment.getRunnerAndConfigurationSettings(); - if (configuration != null) { - runningIncompatibleConfigurations.addAll(getIncompatibleRunningDescriptors(configuration)); + List<RunContentDescriptor> runningIncompatible; + if (configuration == null) { + runningIncompatible = Collections.emptyList(); } + else { + runningIncompatible = getIncompatibleRunningDescriptors(configuration); + } + + RunContentDescriptor contentToReuse = environment.getContentToReuse(); + final List<RunContentDescriptor> runningOfTheSameType = new SmartList<RunContentDescriptor>(); if (configuration != null && configuration.isSingleton()) { - runningConfigurationsOfTheSameType.addAll(getRunningDescriptorsOfTheSameConfigType(configuration)); + runningOfTheSameType.addAll(getRunningDescriptorsOfTheSameConfigType(configuration)); } - else if (currentDescriptor != null) { - runningConfigurationsOfTheSameType.add(currentDescriptor); + else if (isProcessRunning(contentToReuse)) { + runningOfTheSameType.add(contentToReuse); } - final List<RunContentDescriptor> runningConfigurationsToStop = ContainerUtil.concat(runningConfigurationsOfTheSameType, - runningIncompatibleConfigurations); - if (!runningConfigurationsToStop.isEmpty()) { + List<RunContentDescriptor> runningToStop = ContainerUtil.concat(runningOfTheSameType, runningIncompatible); + if (!runningToStop.isEmpty()) { if (configuration != null) { - if (!runningConfigurationsOfTheSameType.isEmpty() - && (runningConfigurationsOfTheSameType.size() > 1 || - currentDescriptor == null || - runningConfigurationsOfTheSameType.get(0) != currentDescriptor) && - !userApprovesStopForSameTypeConfigurations(project, configuration.getName(), runningConfigurationsOfTheSameType.size())) { + if (!runningOfTheSameType.isEmpty() + && (runningOfTheSameType.size() > 1 || contentToReuse == null || runningOfTheSameType.get(0) != contentToReuse) && + !userApprovesStopForSameTypeConfigurations(environment.getProject(), configuration.getName(), runningOfTheSameType.size())) { return; } - if (!runningIncompatibleConfigurations.isEmpty() - && !userApprovesStopForIncompatibleConfigurations(myProject, configuration.getName(), runningIncompatibleConfigurations)) { + if (!runningIncompatible.isEmpty() + && !userApprovesStopForIncompatibleConfigurations(myProject, configuration.getName(), runningIncompatible)) { return; } } - for (RunContentDescriptor descriptor : runningConfigurationsToStop) { + + for (RunContentDescriptor descriptor : runningToStop) { stop(descriptor); } } - Runnable runnable = new Runnable() { + awaitingTerminationAlarm.addRequest(new Runnable() { @Override public void run() { - if (runner != null && ExecutorRegistry.getInstance().isStarting(project, executor.getId(), runner.getRunnerId())) { + if (ExecutorRegistry.getInstance().isStarting(environment)) { awaitingTerminationAlarm.addRequest(this, 100); return; } - for (RunContentDescriptor descriptor : runningConfigurationsOfTheSameType) { + + for (RunContentDescriptor descriptor : runningOfTheSameType) { ProcessHandler processHandler = descriptor.getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminated()) { awaitingTerminationAlarm.addRequest(this, 100); return; } } - start(project, context, runner, runProfile, runnerSettings, configurationPerRunnerSettings, configuration, executor, target, - currentDescriptor); + start(environment); } - }; - awaitingTerminationAlarm.addRequest(runnable, 50); + }, 50); } - private static void start(@NotNull Project project, - @Nullable DataContext context, - @Nullable ProgramRunner runner, - @Nullable RunProfile runProfile, - @Nullable RunnerSettings runnerSettings, - @Nullable ConfigurationPerRunnerSettings configurationPerRunnerSettings, - @Nullable RunnerAndConfigurationSettings configuration, - @NotNull Executor executor, - @NotNull ExecutionTarget target, - @Nullable RunContentDescriptor descriptor) { - Runnable restarter = descriptor != null ? descriptor.getRestarter() : null; - if (runner != null && runProfile != null) { - ProgramRunnerUtil.executeConfiguration(project, context, configuration, executor, target, descriptor, - configuration != null && configuration.isEditBeforeRun(), runner, runProfile, false); - } - else if (configuration != null) { - ProgramRunnerUtil.executeConfiguration(project, context, configuration, executor, target, descriptor, true); - } - else if (restarter != null) { - restarter.run(); - } + private static void start(@NotNull ExecutionEnvironment environment) { + RunnerAndConfigurationSettings settings = environment.getRunnerAndConfigurationSettings(); + ProgramRunnerUtil.executeConfiguration(environment, settings != null && settings.isEditBeforeRun(), true); } private static boolean userApprovesStopForSameTypeConfigurations(Project project, String configName, int instancesCount) { @@ -505,35 +471,36 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom Messages.getQuestionIcon(), option) == Messages.OK; } - private List<RunContentDescriptor> getRunningDescriptorsOfTheSameConfigType( - @NotNull final RunnerAndConfigurationSettings configurationAndSettings) { - return getRunningDescriptors(new Predicate<RunnerAndConfigurationSettings>() { + @NotNull + private List<RunContentDescriptor> getRunningDescriptorsOfTheSameConfigType(@NotNull final RunnerAndConfigurationSettings configurationAndSettings) { + return getRunningDescriptors(new Condition<RunnerAndConfigurationSettings>() { @Override - public boolean apply(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { + public boolean value(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { return configurationAndSettings == runningConfigurationAndSettings; } }); } - private List<RunContentDescriptor> getIncompatibleRunningDescriptors( - @NotNull final RunnerAndConfigurationSettings configurationAndSettings) { + @NotNull + private List<RunContentDescriptor> getIncompatibleRunningDescriptors(@NotNull RunnerAndConfigurationSettings configurationAndSettings) { final RunConfiguration configurationToCheckCompatibility = configurationAndSettings.getConfiguration(); - return getRunningDescriptors(new Predicate<RunnerAndConfigurationSettings>() { + return getRunningDescriptors(new Condition<RunnerAndConfigurationSettings>() { @Override - public boolean apply(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { - if (runningConfigurationAndSettings == null) return false; - RunConfiguration runningConfiguration = runningConfigurationAndSettings.getConfiguration(); - if (runningConfiguration == null || !(runningConfiguration instanceof CompatibilityAwareRunProfile)) return false; + public boolean value(@Nullable RunnerAndConfigurationSettings runningConfigurationAndSettings) { + RunConfiguration runningConfiguration = runningConfigurationAndSettings == null ? null : runningConfigurationAndSettings.getConfiguration(); + if (runningConfiguration == null || !(runningConfiguration instanceof CompatibilityAwareRunProfile)) { + return false; + } return ((CompatibilityAwareRunProfile)runningConfiguration).mustBeStoppedToRun(configurationToCheckCompatibility); } }); } - private List<RunContentDescriptor> getRunningDescriptors( - Predicate<RunnerAndConfigurationSettings> condition) { - List<RunContentDescriptor> result = new ArrayList<RunContentDescriptor>(); + @NotNull + private List<RunContentDescriptor> getRunningDescriptors(@NotNull Condition<RunnerAndConfigurationSettings> condition) { + List<RunContentDescriptor> result = new SmartList<RunContentDescriptor>(); for (Trinity<RunContentDescriptor, RunnerAndConfigurationSettings, Executor> trinity : myRunningConfigurations) { - if (condition.apply(trinity.getSecond())) { + if (condition.value(trinity.getSecond())) { ProcessHandler processHandler = trinity.getFirst().getProcessHandler(); if (processHandler != null && !processHandler.isProcessTerminating() && !processHandler.isProcessTerminated()) { result.add(trinity.getFirst()); @@ -543,30 +510,27 @@ public class ExecutionManagerImpl extends ExecutionManager implements ProjectCom return result; } - private static void stop(RunContentDescriptor runContentDescriptor) { - ProcessHandler processHandler = runContentDescriptor != null ? runContentDescriptor.getProcessHandler() : null; + private static void stop(@Nullable RunContentDescriptor descriptor) { + ProcessHandler processHandler = descriptor != null ? descriptor.getProcessHandler() : null; if (processHandler == null) { return; } + if (processHandler instanceof KillableProcess && processHandler.isProcessTerminating()) { ((KillableProcess)processHandler).killProcess(); return; } - if (processHandler.detachIsDefault()) { - processHandler.detachProcess(); - } - else { - processHandler.destroyProcess(); + if (!processHandler.isProcessTerminated()) { + if (processHandler.detachIsDefault()) { + processHandler.detachProcess(); + } + else { + processHandler.destroyProcess(); + } } } - @Override - @NotNull - public String getComponentName() { - return "ExecutionManager"; - } - private static class ProcessExecutionListener extends ProcessAdapter { private final Project myProject; private final RunProfile myProfile; diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java index deadaad0a0d1..42b9be79890e 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java @@ -50,7 +50,7 @@ import java.util.Set; } ) public class ProjectRunConfigurationManager implements ProjectComponent, PersistentStateComponent<Element> { - private static final Logger LOG = Logger.getInstance("#com.intellij.execution.impl.ProjectRunConfigurationManager"); + private static final Logger LOG = Logger.getInstance(ProjectRunConfigurationManager.class); private final RunManagerImpl myManager; private List<Element> myUnloadedElements = null; @@ -150,7 +150,7 @@ public class ProjectRunConfigurationManager implements ProjectComponent, Persist } if (myUnloadedElements != null) { for (Element unloadedElement : myUnloadedElements) { - element.addContent((Element)unloadedElement.clone()); + element.addContent(unloadedElement.clone()); } } } 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 edf1352a760c..97f36a8fd2b4 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationBeforeRunProvider.java @@ -23,6 +23,7 @@ import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.runners.ExecutionEnvironmentBuilder; import com.intellij.execution.runners.ProgramRunner; import com.intellij.icons.AllIcons; import com.intellij.openapi.Disposable; @@ -137,7 +138,7 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB } @NotNull - private List<RunnerAndConfigurationSettings> getAvailableConfigurations(RunConfiguration runConfiguration) { + private static List<RunnerAndConfigurationSettings> getAvailableConfigurations(RunConfiguration runConfiguration) { Project project = runConfiguration.getProject(); if (project == null || !project.isInitialized()) return Collections.emptyList(); @@ -164,9 +165,7 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB } String executorId = DefaultRunExecutor.getRunExecutorInstance().getId(); final ProgramRunner runner = ProgramRunnerUtil.getRunner(executorId, settings); - if (runner == null) - return false; - return runner.canRun(executorId, settings.getConfiguration()); + return runner != null && runner.canRun(executorId, settings.getConfiguration()); } @Override @@ -180,16 +179,17 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB } final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); final String executorId = executor.getId(); - final ProgramRunner runner = ProgramRunnerUtil.getRunner(executorId, settings); - if (runner == null) + ExecutionEnvironmentBuilder builder = ExecutionEnvironmentBuilder.createOrNull(executor, settings); + if (builder == null) { return false; - final ExecutionEnvironment environment = new ExecutionEnvironment(executor, runner, settings, myProject); + } + final ExecutionEnvironment environment = builder.build(); environment.setExecutionId(env.getExecutionId()); if (!ExecutionTargetManager.canRun(settings, env.getExecutionTarget())) { return false; } - if (!runner.canRun(executorId, environment.getRunProfile())) { + if (!environment.getRunner().canRun(executorId, environment.getRunProfile())) { return false; } else { @@ -198,23 +198,27 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB final Disposable disposable = Disposer.newDisposable(); myProject.getMessageBus().connect(disposable).subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionAdapter() { + @Override public void processStartScheduled(final String executorIdLocal, final ExecutionEnvironment environmentLocal) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { targetDone.down(); } } + @Override public void processNotStarted(final String executorIdLocal, @NotNull final ExecutionEnvironment environmentLocal) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { targetDone.up(); } } + @Override public void processStarted(final String executorIdLocal, @NotNull final ExecutionEnvironment environmentLocal, @NotNull final ProcessHandler handler) { if (executorId.equals(executorIdLocal) && environment.equals(environmentLocal)) { handler.addProcessListener(new ProcessAdapter() { + @Override public void processTerminated(ProcessEvent event) { result.set(event.getExitCode() == 0); targetDone.up(); @@ -229,7 +233,7 @@ extends BeforeRunTaskProvider<RunConfigurationBeforeRunProvider.RunConfigurableB @Override public void run() { try { - runner.execute(environment); + environment.getRunner().execute(environment); } catch (ExecutionException e) { targetDone.up(); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunDialog.java b/platform/lang-impl/src/com/intellij/execution/impl/RunDialog.java index 71e205c3f22c..139eb0c4e25b 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunDialog.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunDialog.java @@ -20,6 +20,7 @@ import com.intellij.execution.ExecutionBundle; import com.intellij.execution.Executor; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.ex.SingleConfigurableEditor; @@ -111,6 +112,10 @@ public class RunDialog extends DialogWrapper implements RunConfigurable.RunDialo return editConfiguration(project, configuration, title, null); } + public static boolean editConfiguration(@NotNull ExecutionEnvironment environment, @NotNull String title) { + return editConfiguration(environment.getProject(), environment.getRunnerAndConfigurationSettings(), title, environment.getExecutor()); + } + public static boolean editConfiguration(final Project project, final RunnerAndConfigurationSettings configuration, final String title, @Nullable final Executor executor) { final SingleConfigurationConfigurable<RunConfiguration> configurable = SingleConfigurationConfigurable.editSettings(configuration, executor); final SingleConfigurableEditor dialog = new SingleConfigurableEditor(project, configurable, IdeModalityType.PROJECT) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index d3a1e1cb0574..7b54f21503df 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -19,6 +19,7 @@ package com.intellij.execution.impl; import com.intellij.ProjectTopics; import com.intellij.execution.*; import com.intellij.execution.configurations.*; +import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.NamedComponent; @@ -106,7 +107,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, public final void initializeConfigurationTypes(@NotNull final ConfigurationType[] factories) { Arrays.sort(factories, new Comparator<ConfigurationType>() { @Override - public int compare(final ConfigurationType o1, final ConfigurationType o2) { + public int compare(@NotNull final ConfigurationType o1, @NotNull final ConfigurationType o2) { return o1.getDisplayName().compareTo(o2.getDisplayName()); } }); @@ -461,7 +462,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, // IDEA-63663 Sort run configurations alphabetically if clean checkout Collections.sort(order, new Comparator<Pair<String, RunnerAndConfigurationSettings>>() { @Override - public int compare(Pair<String, RunnerAndConfigurationSettings> o1, Pair<String, RunnerAndConfigurationSettings> o2) { + public int compare(@NotNull Pair<String, RunnerAndConfigurationSettings> o1, @NotNull Pair<String, RunnerAndConfigurationSettings> o2) { boolean temporary1 = o1.getSecond().isTemporary(); boolean temporary2 = o2.getSecond().isTemporary(); if (temporary1 == temporary2) { @@ -475,7 +476,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, else { Collections.sort(order, new Comparator<Pair<String, RunnerAndConfigurationSettings>>() { @Override - public int compare(Pair<String, RunnerAndConfigurationSettings> o1, Pair<String, RunnerAndConfigurationSettings> o2) { + public int compare(@NotNull Pair<String, RunnerAndConfigurationSettings> o1, @NotNull Pair<String, RunnerAndConfigurationSettings> o2) { int i1 = folderNames.indexOf(o1.getSecond().getFolderName()); int i2 = folderNames.indexOf(o2.getSecond().getFolderName()); if (i1 != i2) { @@ -507,8 +508,12 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, return myConfigurations.values(); } - public static boolean canRunConfiguration(@NotNull final RunnerAndConfigurationSettings configuration, - @NotNull final Executor executor) { + public static boolean canRunConfiguration(@NotNull ExecutionEnvironment environment) { + RunnerAndConfigurationSettings runnerAndConfigurationSettings = environment.getRunnerAndConfigurationSettings(); + return runnerAndConfigurationSettings != null && canRunConfiguration(runnerAndConfigurationSettings, environment.getExecutor()); + } + + public static boolean canRunConfiguration(@NotNull RunnerAndConfigurationSettings configuration, @NotNull Executor executor) { try { configuration.checkSettings(executor); } @@ -567,7 +572,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, if (myUnknownElements != null) { for (Element unloadedElement : myUnknownElements) { - parentNode.addContent((Element)unloadedElement.clone()); + parentNode.addContent(unloadedElement.clone()); } } } @@ -647,7 +652,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, final Comparator<Element> comparator = new Comparator<Element>() { @Override - public int compare(Element a, Element b) { + public int compare(@NotNull Element a, @NotNull Element b) { final boolean aDefault = Boolean.valueOf(a.getAttributeValue("default", "false")); final boolean bDefault = Boolean.valueOf(b.getAttributeValue("default", "false")); return aDefault == bDefault ? 0 : aDefault ? -1 : 1; @@ -666,7 +671,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, Collections.sort(sortedElements, comparator); // ensure templates are loaded first! for (final Element element : sortedElements) { - RunnerAndConfigurationSettings configurationSettings = null; + RunnerAndConfigurationSettings configurationSettings; try { configurationSettings = loadConfiguration(element, false); } @@ -915,6 +920,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, public List<RunnerAndConfigurationSettings> getTempConfigurationsList() { List<RunnerAndConfigurationSettings> configurations = ContainerUtil.filter(myConfigurations.values(), new Condition<RunnerAndConfigurationSettings>() { + @Override public boolean value(RunnerAndConfigurationSettings settings) { return settings.isTemporary(); } @@ -933,6 +939,7 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, return result; } + @Override public void makeStable(@NotNull RunnerAndConfigurationSettings settings) { settings.setTemporary(false); myRecentlyUsedTemporaries.remove(settings.getConfiguration()); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java index 08e9541c265f..cefeaf958f0d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java @@ -51,10 +51,12 @@ public class RunnerRegistryImpl extends RunnerRegistry { } @Override - public ProgramRunner getRunner(@NotNull final String executorId, final RunProfile settings) { - if (settings == null) return null; - final ProgramRunner[] runners = getRegisteredRunners(); - for (final ProgramRunner runner : runners) { + public ProgramRunner getRunner(@NotNull String executorId, @Nullable RunProfile settings) { + if (settings == null) { + return null; + } + + for (ProgramRunner runner : getRegisteredRunners()) { if (runner.canRun(executorId, settings)) { return runner; } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java index 4c58ab7029b3..4a750f22a15d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java @@ -151,12 +151,10 @@ public final class SingleConfigurationConfigurable<Config extends RunConfigurati if (snapshot != null) { snapshot.setName(getNameText()); snapshot.checkSettings(myExecutor); - for (ProgramRunner runner : RunnerRegistry.getInstance().getRegisteredRunners()) { - for (Executor executor : ExecutorRegistry.getInstance().getRegisteredExecutors()) { - if (runner.canRun(executor.getId(), snapshot.getConfiguration())) { - checkConfiguration(runner, snapshot); - break; - } + for (Executor executor : ExecutorRegistry.getInstance().getRegisteredExecutors()) { + ProgramRunner runner = RunnerRegistry.getInstance().getRunner(executor.getId(), snapshot.getConfiguration()); + if (runner != null) { + checkConfiguration(runner, snapshot); } } } 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 b4b3cd919ec4..7bcabebf256a 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -173,7 +173,7 @@ public abstract class AbstractConsoleRunnerWithHistory<T extends LanguageConsole return false; } - protected void showConsole(Executor defaultExecutor, RunContentDescriptor contentDescriptor) { + protected void showConsole(Executor defaultExecutor, @NotNull RunContentDescriptor contentDescriptor) { // Show in run toolwindow ExecutionManager.getInstance(myProject).getContentManager().showRunContent(defaultExecutor, contentDescriptor); } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/DefaultProgramRunner.java b/platform/lang-impl/src/com/intellij/execution/runners/DefaultProgramRunner.java index e2f8a5a717fe..5f7321aa8068 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/DefaultProgramRunner.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/DefaultProgramRunner.java @@ -36,10 +36,10 @@ public abstract class DefaultProgramRunner extends GenericProgramRunner { @NotNull final ExecutionEnvironment env) throws ExecutionException { FileDocumentManager.getInstance().saveAllDocuments(); ExecutionResult executionResult = state.execute(env.getExecutor(), this); - if (executionResult == null) return null; - - final RunContentBuilder contentBuilder = new RunContentBuilder(this, executionResult, env); - return contentBuilder.showRunContent(contentToReuse); + if (executionResult == null) { + return null; + } + return new RunContentBuilder(executionResult, env).showRunContent(contentToReuse); } } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java b/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java index 45393c328e69..ecc8fa553121 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/FakeRerunAction.java @@ -15,33 +15,127 @@ */ package com.intellij.execution.runners; +import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.ExecutorRegistry; +import com.intellij.execution.impl.ExecutionManagerImpl; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; /** * @author Roman.Chernyatchik */ -public class FakeRerunAction extends AnAction implements DumbAware { - protected static final List<RestartAction> registry = ContainerUtil.createLockFreeCopyOnWriteList(); +class FakeRerunAction extends AnAction implements DumbAware { + @SuppressWarnings("deprecation") + static final List<RestartAction> registry = ContainerUtil.createLockFreeCopyOnWriteList(); @Override - public void actionPerformed(AnActionEvent e) { - RestartAction action = RestartAction.findActualAction(); - if (action != null && action.isEnabled()) { - action.actionPerformed(e); + public void update(AnActionEvent event) { + Presentation presentation = event.getPresentation(); + ExecutionEnvironment environment = getEnvironment(event); + if (environment != null) { + presentation.setText(ExecutionBundle.message("rerun.configuration.action.name", environment.getRunProfile().getName())); + presentation.setIcon(ExecutionManagerImpl.isProcessRunning(getDescriptor(event)) ? AllIcons.Actions.Restart : environment.getExecutor().getIcon()); + presentation.setEnabledAndVisible(isEnabled(event)); + return; } + + FakeRerunAction action = findActualAction(event); + presentation.setEnabled(action != null && action.isEnabled(event)); + presentation.setVisible(false); } @Override - public void update(AnActionEvent e) { - final Presentation presentation = e.getPresentation(); - RestartAction action = RestartAction.findActualAction(); - presentation.setEnabled(action != null && action.isEnabled()); - presentation.setVisible(false); + public void actionPerformed(AnActionEvent event) { + ExecutionEnvironment environment = getEnvironment(event); + if (environment != null) { + ExecutionUtil.restart(environment); + return; + } + + FakeRerunAction action = findActualAction(event); + if (action != null && action.isEnabled(event)) { + action.actionPerformed(event); + } + } + + @Nullable + protected RunContentDescriptor getDescriptor(AnActionEvent event) { + return event.getData(LangDataKeys.RUN_CONTENT_DESCRIPTOR); + } + + @Nullable + protected ExecutionEnvironment getEnvironment(AnActionEvent event) { + return event.getData(LangDataKeys.EXECUTION_ENVIRONMENT); + } + + protected boolean isEnabled(AnActionEvent event) { + RunContentDescriptor descriptor = getDescriptor(event); + ProcessHandler processHandler = descriptor == null ? null : descriptor.getProcessHandler(); + ExecutionEnvironment environment = getEnvironment(event); + return environment != null && + !ExecutorRegistry.getInstance().isStarting(environment) && + !(processHandler != null && processHandler.isProcessTerminating()); + } + + @Nullable + private JComponent getRunComponent(@NotNull AnActionEvent event) { + RunContentDescriptor descriptor = getDescriptor(event); + return descriptor == null ? null : descriptor.getComponent(); + } + + @Nullable + private static FakeRerunAction findActualAction(@NotNull final AnActionEvent event) { + if (registry.isEmpty()) { + return null; + } + + List<FakeRerunAction> candidates = new ArrayList<FakeRerunAction>(registry); + Collections.sort(candidates, new Comparator<FakeRerunAction>() { + @Override + public int compare(@NotNull FakeRerunAction action1, @NotNull FakeRerunAction action2) { + boolean isActive1 = action1.isEnabled(event); + if (isActive1 != action2.isEnabled(event)) { + return isActive1 ? -1 : 1; + } + + JComponent component1 = action1.getRunComponent(event); + JComponent component2 = action2.getRunComponent(event); + Window window1 = component1 == null ? null : SwingUtilities.windowForComponent(component1); + Window window2 = component2 == null ? null : SwingUtilities.windowForComponent(component2); + if (window1 == null) { + return 1; + } + if (window2 == null) { + return -1; + } + + boolean showing1 = component1.isShowing(); + boolean showing2 = component2.isShowing(); + if (showing1 && !showing2) { + return -1; + } + if (showing2 && !showing1) { + return 1; + } + return (window1.isActive() ? -1 : 1); + } + }); + return candidates.get(0); } } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RerunTestsAction.java b/platform/lang-impl/src/com/intellij/execution/runners/RerunTestsAction.java index c4e8fd0a3e0d..8d3bf8663598 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RerunTestsAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RerunTestsAction.java @@ -1,13 +1,11 @@ package com.intellij.execution.runners; -import com.intellij.execution.ExecutionManager; -import com.intellij.execution.ExecutorRegistry; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -25,41 +23,27 @@ import java.util.List; * @author Sergey Simonchik */ public class RerunTestsAction extends DumbAwareAction implements AnAction.TransparentUpdate { - public static final String ID = "RerunTests"; - private static final List<RerunInfo> REGISTRY = ContainerUtil.createLockFreeCopyOnWriteList(); + private static final List<ExecutionEnvironment> REGISTRY = ContainerUtil.createLockFreeCopyOnWriteList(); - public static void register(@NotNull RunContentDescriptor descriptor, - @NotNull ExecutionEnvironment env, - @NotNull ProgramRunner runner) { - final RerunInfo rerunInfo = new RerunInfo(descriptor, env, runner); - REGISTRY.add(rerunInfo); - Disposer.register(descriptor, new Disposable() { + public static void register(@NotNull final ExecutionEnvironment environment) { + REGISTRY.add(environment); + Disposer.register(environment, new Disposable() { @Override public void dispose() { - REGISTRY.remove(rerunInfo); + REGISTRY.remove(environment); } }); } @Override public void actionPerformed(AnActionEvent e) { - DataContext dataContext = e.getDataContext(); - Project project = CommonDataKeys.PROJECT.getData(dataContext); - if (project == null) { - return; - } - ExecutionManager executionManager = ExecutionManager.getInstance(project); - for (RerunInfo rerunInfo : REGISTRY) { - RunContentDescriptor descriptor = rerunInfo.getDescriptor(); - if (!Disposer.isDisposed(descriptor)) { - ExecutionEnvironment env = rerunInfo.getEnv(); - ProgramRunner runner = rerunInfo.getRunner(); - ProcessHandler processHandler = descriptor.getProcessHandler(); + for (ExecutionEnvironment environment : REGISTRY) { + if (!Disposer.isDisposed(environment)) { + RunContentDescriptor descriptor = environment.getContentToReuse(); + ProcessHandler processHandler = descriptor == null ? null : descriptor.getProcessHandler(); if (processHandler != null && processHandler.isProcessTerminated()) { - if (!ExecutorRegistry.getInstance().isStarting(project, env.getExecutor().getId(), runner.getRunnerId())) { - executionManager.restartRunProfile(runner, env, descriptor); - } + ExecutionUtil.restart(environment); } } } @@ -67,35 +51,6 @@ public class RerunTestsAction extends DumbAwareAction implements AnAction.Transp @Override public void update(AnActionEvent e) { - Presentation presentation = e.getPresentation(); - presentation.setEnabled(true); - } - - private static class RerunInfo { - - private final RunContentDescriptor myDescriptor; - private final ExecutionEnvironment myEnv; - private final ProgramRunner myRunner; - - public RerunInfo(@NotNull RunContentDescriptor descriptor, - @NotNull ExecutionEnvironment env, - @NotNull ProgramRunner runner) { - myDescriptor = descriptor; - myEnv = env; - myRunner = runner; - } - - private RunContentDescriptor getDescriptor() { - return myDescriptor; - } - - private ExecutionEnvironment getEnv() { - return myEnv; - } - - private ProgramRunner getRunner() { - return myRunner; - } + e.getPresentation().setEnabled(true); } - } 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 20b29c2de994..1ab3cee3c8cb 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RestartAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -15,129 +15,69 @@ */ package com.intellij.execution.runners; -import com.intellij.execution.ExecutionBundle; -import com.intellij.execution.ExecutionManager; import com.intellij.execution.Executor; -import com.intellij.execution.ExecutorRegistry; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.RunContentDescriptor; -import com.intellij.icons.AllIcons; import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CustomShortcutSet; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +@Deprecated /** - * @author dyoma + * to remove in IDEA 15 */ public class RestartAction extends FakeRerunAction implements DumbAware, AnAction.TransparentUpdate, Disposable { - - private final ProgramRunner myRunner; - @NotNull private final RunContentDescriptor myDescriptor; - @NotNull private final Executor myExecutor; + private final RunContentDescriptor myDescriptor; private final ExecutionEnvironment myEnvironment; - public RestartAction(@NotNull final Executor executor, - final ProgramRunner runner, - @NotNull final RunContentDescriptor descriptor, - @NotNull final ExecutionEnvironment env) { + public RestartAction(@NotNull RunContentDescriptor descriptor, @NotNull ExecutionEnvironment environment) { + //noinspection deprecation + this(environment.getExecutor(), null, descriptor, environment); + } + + @Deprecated + /** + * @deprecated environment must provide runner id + * to remove in IDEA 15 + */ + public RestartAction(@SuppressWarnings("UnusedParameters") @NotNull Executor executor, + @Nullable ProgramRunner runner, + @NotNull RunContentDescriptor descriptor, + @NotNull ExecutionEnvironment environment) { Disposer.register(descriptor, this); - registry.add(this); + FakeRerunAction.registry.add(this); - myEnvironment = env; + myEnvironment = runner == null ? environment : RunContentBuilder.fix(environment, runner); getTemplatePresentation().setEnabled(false); - myRunner = runner; myDescriptor = descriptor; - myExecutor = executor; - // see IDEADEV-698 - - if (descriptor.getRestarter() == null) { - descriptor.setRestarter(new Runnable() { - @Override - public void run() { - restart(); - } - }); - } } @Override public void dispose() { - registry.remove(this); - } - - @Nullable - static RestartAction findActualAction() { - if (registry.isEmpty()) - return null; - List<RestartAction> candidates = new ArrayList<RestartAction>(registry); - Collections.sort(candidates, new Comparator<RestartAction>() { - @Override - public int compare(RestartAction action1, RestartAction action2) { - boolean isActive1 = action1.isEnabled(); - boolean isActive2 = action2.isEnabled(); - if (isActive1 != isActive2) - return isActive1? - 1 : 1; - Window window1 = SwingUtilities.windowForComponent(action1.myDescriptor.getComponent()); - Window window2 = SwingUtilities.windowForComponent(action2.myDescriptor.getComponent()); - if (window1 == null) - return 1; - if (window2 == null) - return -1; - boolean showing1 = action1.myDescriptor.getComponent().isShowing(); - boolean showing2 = action2.myDescriptor.getComponent().isShowing(); - if (showing1 && !showing2) - return -1; - if (showing2 && !showing1) - return 1; - return (window1.isActive() ? -1 : 1); - } - }); - return candidates.get(0); + FakeRerunAction.registry.remove(this); } @Override - public void actionPerformed(final AnActionEvent e) { - restart(); - } - - public void restart() { - Project project = myEnvironment.getProject(); - if (!ExecutorRegistry.getInstance().isStarting(project, myExecutor.getId(), myRunner.getRunnerId())) - ExecutionManager.getInstance(project).restartRunProfile(myRunner, myEnvironment, myDescriptor); + @NotNull + protected RunContentDescriptor getDescriptor(AnActionEvent event) { + return myDescriptor; } @Override - public void update(final AnActionEvent event) { - final Presentation presentation = event.getPresentation(); - String name = myEnvironment.getRunProfile().getName(); - ProcessHandler processHandler = myDescriptor.getProcessHandler(); - final boolean isRunning = processHandler != null && !processHandler.isProcessTerminated(); - - presentation.setText(ExecutionBundle.message("rerun.configuration.action.name", name)); - presentation.setIcon(isRunning ? AllIcons.Actions.Restart : myExecutor.getIcon()); - presentation.setEnabled(isEnabled()); - } - - boolean isEnabled() { - ProcessHandler processHandler = myDescriptor.getProcessHandler(); - boolean isTerminating = processHandler != null && processHandler.isProcessTerminating(); - boolean isStarting = ExecutorRegistry.getInstance().isStarting(myEnvironment.getProject(), myExecutor.getId(), myRunner.getRunnerId()); - return !isStarting && !isTerminating; + @NotNull + protected ExecutionEnvironment getEnvironment(AnActionEvent event) { + return myEnvironment; } - public void registerShortcut(final JComponent component) { + public void registerShortcut(JComponent component) { registerCustomShortcutSet(new CustomShortcutSet(KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_RERUN)), component); } 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 bb6d206f1eb9..f16f8dadfb45 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -15,9 +15,6 @@ */ package com.intellij.execution.runners; -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; @@ -32,7 +29,6 @@ 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.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; @@ -40,115 +36,91 @@ 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 javax.swing.*; -import java.util.ArrayList; import java.util.Collection; +import java.util.List; -/** - * @author dyoma - */ -public class RunContentBuilder extends LogConsoleManagerBase { +public class RunContentBuilder extends RunTab { @NonNls private static final String JAVA_RUNNER = "JavaRunner"; - private final ProgramRunner myRunner; - private final ArrayList<AnAction> myRunnerActions = new ArrayList<AnAction>(); - private ExecutionResult myExecutionResult; - - private final LogFilesManager myManager; - - private RunnerLayoutUi myUi; - private final Executor myExecutor; + private final List<AnAction> myRunnerActions = new SmartList<AnAction>(); + private final ExecutionResult myExecutionResult; /** - * @deprecated use {@link #RunContentBuilder(ProgramRunner, com.intellij.execution.ExecutionResult, ExecutionEnvironment)} + * @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) { - super(environment.getProject(), SearchScopeProvider.createSearchScope(environment.getProject(), environment.getRunProfile())); - myRunner = runner; - myExecutor = environment.getExecutor(); - myManager = new LogFilesManager(environment.getProject(), this, this); + this(executionResult, fix(environment, runner)); + } + + public RunContentBuilder(@NotNull ExecutionResult executionResult, @NotNull ExecutionEnvironment environment) { + super(environment, getRunnerType(executionResult.getExecutionConsole())); + myExecutionResult = executionResult; - setEnvironment(environment); + myUi.getOptions().setMoveToGridActionEnabled(false).setMinimizeActionEnabled(false); } - /** - * @deprecated use {@link #RunContentBuilder(com.intellij.openapi.project.Project, ProgramRunner, com.intellij.execution.Executor, com.intellij.execution.ExecutionResult, ExecutionEnvironment)} - */ - public RunContentBuilder(final Project project, final ProgramRunner runner, Executor executor) { - super(project); - myRunner = runner; - myExecutor = executor; - myManager = new LogFilesManager(project, this, this); + @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; } - @Deprecated - public void setExecutionResult(final ExecutionResult executionResult) { - myExecutionResult = executionResult; - } - - @Override - public void setEnvironment(@NotNull final ExecutionEnvironment env) { - super.setEnvironment(env); - final RunProfile profile = env.getRunProfile(); - if (profile instanceof RunConfigurationBase) { - myManager.registerFileMatcher((RunConfigurationBase)profile); - } - } - public void addAction(@NotNull final AnAction action) { myRunnerActions.add(action); } + @NotNull private RunContentDescriptor createDescriptor() { - if (myExecutionResult == null) { - throw new IllegalStateException("Missing ExecutionResult"); - } - - ExecutionEnvironment environment = getEnvironment(); - if (environment == null) { - throw new IllegalStateException("Missing ExecutionEnvironment"); - } - - final RunProfile profile = environment.getRunProfile(); - - final ExecutionConsole console = myExecutionResult.getExecutionConsole(); - String runnerType = JAVA_RUNNER; - if (console instanceof ExecutionConsoleEx) { - final String id = ((ExecutionConsoleEx)console).getExecutionConsoleId(); - if (id != null) { - runnerType = JAVA_RUNNER + "." + id; - } - } - myUi = RunnerLayoutUi.Factory.getInstance(getProject()).create(runnerType, myExecutor.getId(), profile.getName(), this); - myUi.getOptions().setMoveToGridActionEnabled(false).setMinimizeActionEnabled(false); - + final RunProfile profile = getEnvironment().getRunProfile(); if (ApplicationManager.getApplication().isUnitTestMode()) { - return new MyRunContentDescriptor(profile, myExecutionResult, myUi.getComponent(), this); + RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); + Disposer.register(contentDescriptor, this); + return contentDescriptor; } + final ExecutionConsole console = myExecutionResult.getExecutionConsole(); if (console != null) { if (console instanceof ExecutionConsoleEx) { ((ExecutionConsoleEx)console).buildUi(myUi); @@ -156,19 +128,17 @@ public class RunContentBuilder extends LogConsoleManagerBase { else { buildConsoleUiDefault(myUi, console); } - if (profile instanceof RunConfigurationBase) { - myManager.initLogConsoles((RunConfigurationBase)profile, myExecutionResult.getProcessHandler()); - OutputFileUtil.attachDumpListener((RunConfigurationBase)profile, myExecutionResult.getProcessHandler(), console); - } + initLogConsoles(profile, myExecutionResult.getProcessHandler(), console); } - MyRunContentDescriptor contentDescriptor = new MyRunContentDescriptor(profile, myExecutionResult, myUi.getComponent(), this); - myUi.getOptions().setLeftToolbar(createActionToolbar(contentDescriptor, myUi.getComponent()), ActionPlaces.UNKNOWN); + RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); + Disposer.register(contentDescriptor, this); + 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, getProject(), - myExecutor, + getEnvironment().getExecutor(), contentDescriptor, myUi), this); @@ -178,10 +148,22 @@ public class RunContentBuilder extends LogConsoleManagerBase { 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()); + console.getPreferredFocusableComponent()); consoleContent.setCloseable(false); addAdditionalConsoleEditorActions(console, consoleContent); @@ -191,22 +173,18 @@ public class RunContentBuilder extends LogConsoleManagerBase { public static void addAdditionalConsoleEditorActions(final ExecutionConsole console, final Content consoleContent) { final DefaultActionGroup consoleActions = new DefaultActionGroup(); if (console instanceof ConsoleView) { - AnAction[] actions = ((ConsoleView)console).createConsoleActions(); - for (AnAction goaction: actions) { - consoleActions.add(goaction); + for (AnAction action : ((ConsoleView)console).createConsoleActions()) { + consoleActions.add(action); } } consoleContent.setActions(consoleActions, ActionPlaces.UNKNOWN, console.getComponent()); } - private ActionGroup createActionToolbar(final RunContentDescriptor contentDescriptor, final JComponent component) { + @NotNull + private ActionGroup createActionToolbar(@NotNull RunContentDescriptor contentDescriptor) { final DefaultActionGroup actionGroup = new DefaultActionGroup(); - - final RestartAction restartAction = new RestartAction(myExecutor, myRunner, contentDescriptor, getEnvironment()); - restartAction.registerShortcut(component); - actionGroup.add(restartAction); - + actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN)); if (myExecutionResult instanceof DefaultExecutionResult) { final AnAction[] actions = ((DefaultExecutionResult)myExecutionResult).getRestartActions(); if (actions != null) { @@ -217,15 +195,14 @@ public class RunContentBuilder extends LogConsoleManagerBase { } } - final AnAction stopAction = ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM); - actionGroup.add(stopAction); + actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM)); if (myExecutionResult instanceof DefaultExecutionResult) { actionGroup.addAll(((DefaultExecutionResult)myExecutionResult).getAdditionalStopActions()); } actionGroup.addAll(myExecutionResult.getActions()); - for (final AnAction anAction : myRunnerActions) { + for (AnAction anAction : myRunnerActions) { if (anAction != null) { actionGroup.add(anAction); } @@ -238,9 +215,9 @@ public class RunContentBuilder extends LogConsoleManagerBase { actionGroup.add(myUi.getOptions().getLayoutActions()); actionGroup.addSeparator(); actionGroup.add(PinToolwindowTabAction.getPinAction()); - actionGroup.add(new CloseAction(myExecutor, contentDescriptor, getProject())); + actionGroup.add(new CloseAction(getEnvironment().getExecutor(), contentDescriptor, getProject())); final String helpId = contentDescriptor.getHelpId(); - actionGroup.add(new ContextHelpAction(helpId != null ? helpId : myExecutor.getHelpId())); + actionGroup.add(new ContextHelpAction(helpId != null ? helpId : getEnvironment().getExecutor().getHelpId())); return actionGroup; } @@ -252,14 +229,10 @@ public class RunContentBuilder extends LogConsoleManagerBase { /** * @param reuseContent see {@link RunContentDescriptor#myContent} */ - public RunContentDescriptor showRunContent(final RunContentDescriptor reuseContent) { - final RunContentDescriptor descriptor = createDescriptor(); - if (reuseContent != null) { - descriptor.setAttachedContent(reuseContent.getAttachedContent()); - if (reuseContent.isReuseToolWindowActivation()) { - descriptor.setActivateToolWindowWhenAdded(reuseContent.isActivateToolWindowWhenAdded()); - } - } + public RunContentDescriptor showRunContent(@Nullable RunContentDescriptor reuseContent) { + RunContentDescriptor descriptor = createDescriptor(); + RunContentManagerImpl.copyContentAndBehavior(descriptor, reuseContent); + myRunContentDescriptor = descriptor; return descriptor; } @@ -273,21 +246,6 @@ public class RunContentBuilder extends LogConsoleManagerBase { return AllIcons.Debugger.Console; } - private static class MyRunContentDescriptor extends RunContentDescriptor { - private final Disposable myAdditionalDisposable; - - public MyRunContentDescriptor(final RunProfile profile, final ExecutionResult executionResult, final JComponent component, @NotNull Disposable additionalDisposable) { - super(executionResult.getExecutionConsole(), executionResult.getProcessHandler(), component, profile.getName(), profile.getIcon()); - myAdditionalDisposable = additionalDisposable; - } - - @Override - public void dispose() { - Disposer.dispose(myAdditionalDisposable); - super.dispose(); - } - } - public static class ConsoleToFrontListener implements ConsoleViewImpl.ChangeListener { @NotNull private final RunConfigurationBase myRunConfigurationBase; @NotNull private final Project myProject; diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java new file mode 100644 index 000000000000..2edc2098ce15 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java @@ -0,0 +1,94 @@ +/* + * 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.diagnostic.logging.LogConsoleManagerBase; +import com.intellij.diagnostic.logging.LogFilesManager; +import com.intellij.diagnostic.logging.OutputFileUtil; +import com.intellij.execution.configurations.RunConfigurationBase; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.configurations.SearchScopeProvider; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.ui.ExecutionConsole; +import com.intellij.execution.ui.RunContentDescriptor; +import com.intellij.execution.ui.RunnerLayoutUi; +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class RunTab extends LogConsoleManagerBase implements DataProvider { + @NotNull + protected final RunnerLayoutUi myUi; + protected final LogFilesManager myManager; + protected RunContentDescriptor myRunContentDescriptor; + + protected RunTab(@NotNull ExecutionEnvironment environment, @NotNull String runnerType) { + this(environment.getProject(), + SearchScopeProvider.createSearchScope(environment.getProject(), environment.getRunProfile()), + runnerType, + environment.getExecutor().getId(), + environment.getRunProfile().getName()); + + setEnvironment(environment); + } + + protected RunTab(@NotNull Project project, @NotNull GlobalSearchScope searchScope, @NotNull String runnerType, @NotNull String runnerTitle, @NotNull String sessionName) { + super(project, searchScope); + + myManager = new LogFilesManager(project, this, this); + + myUi = RunnerLayoutUi.Factory.getInstance(getProject()).create(runnerType, runnerTitle, sessionName, this); + myUi.getContentManager().addDataProvider(this); + } + + @Nullable + @Override + public Object getData(@NonNls String dataId) { + if (LangDataKeys.RUN_PROFILE.is(dataId)) { + ExecutionEnvironment environment = getEnvironment(); + return environment == null ? null : environment.getRunProfile(); + } + else if (LangDataKeys.EXECUTION_ENVIRONMENT.is(dataId)) { + return getEnvironment(); + } + else if (LangDataKeys.RUN_CONTENT_DESCRIPTOR.is(dataId)) { + return myRunContentDescriptor; + } + return null; + } + + @Override + public final void setEnvironment(@NotNull ExecutionEnvironment environment) { + super.setEnvironment(environment); + + RunProfile profile = environment.getRunProfile(); + if (profile instanceof RunConfigurationBase) { + myManager.registerFileMatcher((RunConfigurationBase)profile); + } + } + + protected final void initLogConsoles(@NotNull RunProfile runConfiguration, @Nullable ProcessHandler processHandler, @Nullable ExecutionConsole console) { + if (runConfiguration instanceof RunConfigurationBase && processHandler != null) { + RunConfigurationBase configuration = (RunConfigurationBase)runConfiguration; + myManager.initLogConsoles(configuration, processHandler); + OutputFileUtil.attachDumpListener(configuration, processHandler, console); + } + } +} diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java index 73ec463954cd..c9dae095522c 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * 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. @@ -46,12 +46,14 @@ import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; +import com.intellij.ui.AppUIUtil; import com.intellij.ui.content.*; import com.intellij.ui.docking.DockManager; +import com.intellij.util.SmartList; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashMap; -import com.intellij.util.messages.Topic; +import gnu.trove.THashMap; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,60 +61,59 @@ import javax.swing.*; import java.util.*; public class RunContentManagerImpl implements RunContentManager, Disposable { - public static final Topic<RunContentWithExecutorListener> RUN_CONTENT_TOPIC = - Topic.create("Run Content", RunContentWithExecutorListener.class); public static final Key<Boolean> ALWAYS_USE_DEFAULT_STOPPING_BEHAVIOUR_KEY = Key.create("ALWAYS_USE_DEFAULT_STOPPING_BEHAVIOUR_KEY"); - private static final Logger LOG = Logger.getInstance("#com.intellij.execution.ui.RunContentManagerImpl"); - private static final Key<RunContentDescriptor> DESCRIPTOR_KEY = new Key<RunContentDescriptor>("Descriptor"); + private static final Logger LOG = Logger.getInstance(RunContentManagerImpl.class); + private static final Key<RunContentDescriptor> DESCRIPTOR_KEY = Key.create("Descriptor"); private final Project myProject; - private DockableGridContainerFactory myContentFactory; - private final Map<String, ContentManager> myToolwindowIdToContentManagerMap = new HashMap<String, ContentManager>(); + private final Map<String, ContentManager> myToolwindowIdToContentManagerMap = new THashMap<String, ContentManager>(); - private final Map<RunContentListener, Disposable> myListeners = new HashMap<RunContentListener, Disposable>(); - private final LinkedList<String> myToolwindowIdZbuffer = new LinkedList<String>(); + private final Map<RunContentListener, Disposable> myListeners = new THashMap<RunContentListener, Disposable>(); + private final LinkedList<String> myToolwindowIdZBuffer = new LinkedList<String>(); - public RunContentManagerImpl(Project project, DockManager dockManager) { + public RunContentManagerImpl(@NotNull Project project, @NotNull DockManager dockManager) { myProject = project; - myContentFactory = new DockableGridContainerFactory(); - dockManager.register(DockableGridContainerFactory.TYPE, myContentFactory); - Disposer.register(myProject, myContentFactory); + DockableGridContainerFactory containerFactory = new DockableGridContainerFactory(); + dockManager.register(DockableGridContainerFactory.TYPE, containerFactory); + Disposer.register(myProject, containerFactory); + + AppUIUtil.invokeOnEdt(new Runnable() { + @Override + public void run() { + init(); + } + }, myProject.getDisposed()); } - public void init() { - final Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); - for (Executor executor : executors) { - registerToolwindow(executor); + // must be called on EDT + private void init() { + ToolWindowManagerEx toolWindowManager = ToolWindowManagerEx.getInstanceEx(myProject); + if (toolWindowManager == null) { + return; } - if (ToolWindowManager.getInstance(myProject) == null) return; + for (Executor executor : ExecutorRegistry.getInstance().getRegisteredExecutors()) { + registerToolwindow(executor, toolWindowManager); + } - // To ensure ToolwindowManager had already initialized in its projectOpened. - SwingUtilities.invokeLater(new Runnable() { + toolWindowManager.addToolWindowManagerListener(new ToolWindowManagerAdapter() { @Override - public void run() { - if (myProject.isDisposed()) return; - ((ToolWindowManagerEx)ToolWindowManager.getInstance(myProject)).addToolWindowManagerListener(new ToolWindowManagerAdapter() { - @Override - public void stateChanged() { - if (myProject.isDisposed()) return; - - ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject); - - Set<String> currentWindows = new HashSet<String>(); - String[] toolWindowIds = toolWindowManager.getToolWindowIds(); + public void stateChanged() { + if (myProject.isDisposed()) { + return; + } - ContainerUtil.addAll(currentWindows, toolWindowIds); - myToolwindowIdZbuffer.retainAll(currentWindows); + ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject); + Set<String> currentWindows = new THashSet<String>(); + ContainerUtil.addAll(currentWindows, toolWindowManager.getToolWindowIds()); + myToolwindowIdZBuffer.retainAll(currentWindows); - final String activeToolWindowId = toolWindowManager.getActiveToolWindowId(); - if (activeToolWindowId != null) { - if (myToolwindowIdZbuffer.remove(activeToolWindowId)) { - myToolwindowIdZbuffer.addFirst(activeToolWindowId); - } - } + final String activeToolWindowId = toolWindowManager.getActiveToolWindowId(); + if (activeToolWindowId != null) { + if (myToolwindowIdZBuffer.remove(activeToolWindowId)) { + myToolwindowIdZBuffer.addFirst(activeToolWindowId); } - }); + } } }); } @@ -121,25 +122,15 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { public void dispose() { } - private void unregisterToolwindow(final String id) { - final ContentManager manager = myToolwindowIdToContentManagerMap.get(id); - manager.removeAllContents(true); - myToolwindowIdToContentManagerMap.remove(id); - myToolwindowIdZbuffer.remove(id); - } - - private void registerToolwindow(@NotNull final Executor executor) { + private void registerToolwindow(@NotNull final Executor executor, @NotNull ToolWindowManagerEx toolWindowManager) { final String toolWindowId = executor.getToolWindowId(); - final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject); - if (toolWindowManager == null) return; //headless environment if (toolWindowManager.getToolWindow(toolWindowId) != null) { return; } - final ToolWindow toolWindow = toolWindowManager.registerToolWindow(toolWindowId, true, ToolWindowAnchor.BOTTOM, this, true); - + ToolWindow toolWindow = toolWindowManager.registerToolWindow(toolWindowId, true, ToolWindowAnchor.BOTTOM, this, true); final ContentManager contentManager = toolWindow.getContentManager(); - class MyDataProvider implements DataProvider { + contentManager.addDataProvider(new DataProvider() { private int myInsideGetData = 0; @Override @@ -157,31 +148,30 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { myInsideGetData--; } } - } - contentManager.addDataProvider(new MyDataProvider()); + }); toolWindow.setIcon(executor.getToolWindowIcon()); new ContentManagerWatcher(toolWindow, contentManager); contentManager.addContentManagerListener(new ContentManagerAdapter() { @Override public void selectionChanged(final ContentManagerEvent event) { - final Content content = event.getContent(); - final RunContentDescriptor descriptor = content != null ? getRunContentDescriptorByContent(content) : null; - getSyncPublisher().contentSelected(descriptor, executor); + Content content = event.getContent(); + getSyncPublisher().contentSelected(content == null ? null : getRunContentDescriptorByContent(content), executor); } }); myToolwindowIdToContentManagerMap.put(toolWindowId, contentManager); Disposer.register(contentManager, new Disposable() { @Override public void dispose() { - unregisterToolwindow(toolWindowId); + myToolwindowIdToContentManagerMap.remove(toolWindowId).removeAllContents(true); + myToolwindowIdZBuffer.remove(toolWindowId); } }); - myToolwindowIdZbuffer.addLast(toolWindowId); + myToolwindowIdZBuffer.addLast(toolWindowId); } private RunContentWithExecutorListener getSyncPublisher() { - return myProject.getMessageBus().syncPublisher(RUN_CONTENT_TOPIC); + return myProject.getMessageBus().syncPublisher(TOPIC); } @Override @@ -193,24 +183,19 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { toFrontRunContent(requestor, descriptor); } - @Override public void toFrontRunContent(final Executor requestor, final RunContentDescriptor descriptor) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - final ContentManager contentManager = getContentManagerForRunner(requestor); - - final Content content = getRunContentByDescriptor(contentManager, descriptor); - - if (contentManager != null && content != null) { + ContentManager contentManager = getContentManagerForRunner(requestor); + Content content = getRunContentByDescriptor(contentManager, descriptor); + if (content != null) { contentManager.setSelectedContent(content); - - final ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(requestor.getToolWindowId()); - toolWindow.show(null); + ToolWindowManager.getInstance(myProject).getToolWindow(requestor.getToolWindowId()).show(null); } } - }); + }, myProject.getDisposed()); } @Override @@ -218,37 +203,25 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - if (!myProject.isDisposed()) { - final String toolWindowId = executor.getToolWindowId(); - final ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(toolWindowId); - if (toolWindow != null) { - toolWindow.hide(null); - } + ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(executor.getToolWindowId()); + if (toolWindow != null) { + toolWindow.hide(null); } } - }); + }, myProject.getDisposed()); } @Override @Nullable public RunContentDescriptor getSelectedContent(final Executor executor) { - final ContentManager contentManager = getContentManagerForRunner(executor); - if (contentManager != null) { - final Content selectedContent = contentManager.getSelectedContent(); - if (selectedContent != null) { - final RunContentDescriptor runContentDescriptorByContent = getRunContentDescriptorByContent(selectedContent); - if (runContentDescriptorByContent != null) { - return runContentDescriptorByContent; - } - } - } - return null; + final Content selectedContent = getContentManagerForRunner(executor).getSelectedContent(); + return selectedContent != null ? getRunContentDescriptorByContent(selectedContent) : null; } @Override @Nullable public RunContentDescriptor getSelectedContent() { - for (String activeWindow : myToolwindowIdZbuffer) { + for (String activeWindow : myToolwindowIdZBuffer) { final ContentManager contentManager = myToolwindowIdToContentManagerMap.get(activeWindow); if (contentManager == null) { continue; @@ -280,32 +253,30 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } @Override - public void showRunContent(@NotNull final Executor executor, final RunContentDescriptor descriptor) { - showRunContent(executor, descriptor, descriptor != null ? descriptor.getExecutionId() : 0L); + public void showRunContent(@NotNull Executor executor, @NotNull RunContentDescriptor descriptor) { + showRunContent(executor, descriptor, descriptor.getExecutionId()); } - public void showRunContent(@NotNull final Executor executor, final RunContentDescriptor descriptor, long executionId) { - if (ApplicationManager.getApplication().isUnitTestMode()) return; + public void showRunContent(@NotNull final Executor executor, @NotNull final RunContentDescriptor descriptor, long executionId) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + return; + } final ContentManager contentManager = getContentManagerForRunner(executor); - RunContentDescriptor oldDescriptor = - chooseReuseContentForDescriptor(contentManager, descriptor, executionId, descriptor != null ? descriptor.getDisplayName() : null); - + RunContentDescriptor oldDescriptor = chooseReuseContentForDescriptor(contentManager, descriptor, executionId, descriptor.getDisplayName()); final Content content; - - Content oldAttachedContent = oldDescriptor != null ? oldDescriptor.getAttachedContent() : null; - if (oldDescriptor != null) { - content = oldAttachedContent; - getSyncPublisher().contentRemoved(oldDescriptor, executor); - Disposer.dispose(oldDescriptor); // is of the same category, can be reused - } - else if (oldAttachedContent == null || !oldAttachedContent.isValid() /*|| oldAttachedContent.getUserData(MARKED_TO_BE_REUSED) != null */) { + if (oldDescriptor == null) { content = createNewContent(contentManager, descriptor, executor); - final Icon icon = descriptor.getIcon(); + Icon icon = descriptor.getIcon(); content.setIcon(icon == null ? executor.getToolWindowIcon() : icon); - } else { - content = oldAttachedContent; } + else { + content = oldDescriptor.getAttachedContent(); + LOG.assertTrue(content != null); + getSyncPublisher().contentRemoved(oldDescriptor, executor); + Disposer.dispose(oldDescriptor); // is of the same category, can be reused + } + content.setExecutionId(executionId); content.setComponent(descriptor.getComponent()); content.setPreferredFocusedComponent(descriptor.getPreferredFocusComputable()); @@ -353,10 +324,10 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { if (!descriptor.isActivateToolWindowWhenAdded()) { return; } + ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - if (myProject.isDisposed()) return; ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(executor.getToolWindowId()); // let's activate tool window, but don't move focus // @@ -367,14 +338,17 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { descriptor.getPreferredFocusComputable(); window.activate(null, descriptor.isAutoFocusContent(), descriptor.isAutoFocusContent()); } - }); + }, myProject.getDisposed()); } @Override @Nullable @Deprecated public RunContentDescriptor getReuseContent(final Executor requestor, DataContext dataContext) { - if (ApplicationManager.getApplication().isUnitTestMode()) return null; + if (ApplicationManager.getApplication().isUnitTestMode()) { + return null; + } + //noinspection deprecation return getReuseContent(requestor, GenericProgramRunner.CONTENT_TO_REUSE_DATA_KEY.getData(dataContext)); } @@ -382,11 +356,13 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { @Nullable @Deprecated public RunContentDescriptor getReuseContent(Executor requestor, @Nullable RunContentDescriptor contentToReuse) { - if (ApplicationManager.getApplication().isUnitTestMode()) return null; - if (contentToReuse != null) return contentToReuse; - - final ContentManager contentManager = getContentManagerForRunner(requestor); - return chooseReuseContentForDescriptor(contentManager, contentToReuse, 0L, null); + if (ApplicationManager.getApplication().isUnitTestMode()) { + return null; + } + if (contentToReuse != null) { + return contentToReuse; + } + return chooseReuseContentForDescriptor(getContentManagerForRunner(requestor), null, 0L, null); } @Nullable @@ -400,10 +376,12 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { public RunContentDescriptor getReuseContent(@NotNull ExecutionEnvironment executionEnvironment) { if (ApplicationManager.getApplication().isUnitTestMode()) return null; RunContentDescriptor contentToReuse = executionEnvironment.getContentToReuse(); - if (contentToReuse != null) return contentToReuse; + if (contentToReuse != null) { + return contentToReuse; + } final ContentManager contentManager = getContentManagerForRunner(executionEnvironment.getExecutor()); - return chooseReuseContentForDescriptor(contentManager, contentToReuse, executionEnvironment.getExecutionId(), + return chooseReuseContentForDescriptor(contentManager, null, executionEnvironment.getExecutionId(), executionEnvironment.toString()); } @@ -413,14 +391,21 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } @Override - public void showRunContent(@NotNull final Executor info, RunContentDescriptor descriptor, RunContentDescriptor contentToReuse) { + public void showRunContent(@NotNull Executor info, @NotNull RunContentDescriptor descriptor, @Nullable RunContentDescriptor contentToReuse) { + copyContentAndBehavior(descriptor, contentToReuse); + showRunContent(info, descriptor, descriptor.getExecutionId()); + } + + public static void copyContentAndBehavior(@NotNull RunContentDescriptor descriptor, @Nullable RunContentDescriptor contentToReuse) { if (contentToReuse != null) { - final Content attachedContent = contentToReuse.getAttachedContent(); - if (attachedContent.getManager() != null) { + Content attachedContent = contentToReuse.getAttachedContent(); + if (attachedContent != null && attachedContent.isValid()) { descriptor.setAttachedContent(attachedContent); } + if (contentToReuse.isReuseToolWindowActivation()) { + descriptor.setActivateToolWindowWhenAdded(contentToReuse.isActivateToolWindowWhenAdded()); + } } - showRunContent(info, descriptor, descriptor != null ? descriptor.getExecutionId(): 0L); } @Nullable @@ -436,7 +421,9 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } //Stage two: try to get content from descriptor itself final Content attachedContent = descriptor.getAttachedContent(); - if (attachedContent != null && attachedContent.isValid() && contentManager.getIndexOfContent(attachedContent) != -1) content = attachedContent; + if (attachedContent != null && attachedContent.isValid() && contentManager.getIndexOfContent(attachedContent) != -1) { + content = attachedContent; + } } //Stage three: choose the content with name we prefer if (content == null) { @@ -486,6 +473,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { if (contentManager == null) { LOG.error("Runner " + executor.getId() + " is not registered"); } + //noinspection ConstantConditions return contentManager; } @@ -499,26 +487,20 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { return content; } - private static boolean isTerminated(@NotNull final Content content) { - final RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); - if (descriptor == null) { - return true; - } - else { - final ProcessHandler processHandler = descriptor.getProcessHandler(); - return processHandler == null || processHandler.isProcessTerminated(); - } + private static boolean isTerminated(@NotNull Content content) { + RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); + ProcessHandler processHandler = descriptor == null ? null : descriptor.getProcessHandler(); + return processHandler == null || processHandler.isProcessTerminated(); } @Nullable - public static RunContentDescriptor getRunContentDescriptorByContent(@NotNull final Content content) { + private static RunContentDescriptor getRunContentDescriptorByContent(@NotNull Content content) { return content.getUserData(DESCRIPTOR_KEY); } - @Override @Nullable - public ToolWindow getToolWindowByDescriptor(@NotNull final RunContentDescriptor descriptor) { + public ToolWindow getToolWindowByDescriptor(@NotNull RunContentDescriptor descriptor) { for (Map.Entry<String, ContentManager> entry : myToolwindowIdToContentManagerMap.entrySet()) { if (getRunContentByDescriptor(entry.getValue(), descriptor) != null) { return ToolWindowManager.getInstance(myProject).getToolWindow(entry.getKey()); @@ -528,9 +510,8 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } @Nullable - private static Content getRunContentByDescriptor(final ContentManager contentManager, final RunContentDescriptor descriptor) { - final Content[] contents = contentManager.getContents(); - for (final Content content : contents) { + private static Content getRunContentByDescriptor(@NotNull ContentManager contentManager, @NotNull RunContentDescriptor descriptor) { + for (Content content : contentManager.getContents()) { if (descriptor.equals(content.getUserData(DESCRIPTOR_KEY))) { return content; } @@ -539,18 +520,18 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } @Override - public void addRunContentListener(final RunContentListener listener, final Executor executor) { + public void addRunContentListener(@NotNull final RunContentListener listener, final Executor executor) { final Disposable disposable = Disposer.newDisposable(); - myProject.getMessageBus().connect(disposable).subscribe(RUN_CONTENT_TOPIC, new RunContentWithExecutorListener() { + myProject.getMessageBus().connect(disposable).subscribe(TOPIC, new RunContentWithExecutorListener() { @Override - public void contentSelected(RunContentDescriptor descriptor, @NotNull Executor executor2) { + public void contentSelected(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor2) { if (executor2.equals(executor)) { listener.contentSelected(descriptor); } } @Override - public void contentRemoved(RunContentDescriptor descriptor, @NotNull Executor executor2) { + public void contentRemoved(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor2) { if (executor2.equals(executor)) { listener.contentRemoved(descriptor); } @@ -560,16 +541,16 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } @Override - public void addRunContentListener(final RunContentListener listener) { + public void addRunContentListener(@NotNull final RunContentListener listener) { final Disposable disposable = Disposer.newDisposable(); - myProject.getMessageBus().connect(disposable).subscribe(RUN_CONTENT_TOPIC, new RunContentWithExecutorListener() { + myProject.getMessageBus().connect(disposable).subscribe(TOPIC, new RunContentWithExecutorListener() { @Override - public void contentSelected(RunContentDescriptor descriptor, @NotNull Executor executor) { + public void contentSelected(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor) { listener.contentSelected(descriptor); } @Override - public void contentRemoved(RunContentDescriptor descriptor, @NotNull Executor executor) { + public void contentRemoved(@Nullable RunContentDescriptor descriptor, @NotNull Executor executor) { listener.contentRemoved(descriptor); } }); @@ -582,18 +563,16 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { if (myToolwindowIdToContentManagerMap.isEmpty()) { return Collections.emptyList(); } - final String[] ids = myToolwindowIdToContentManagerMap.keySet().toArray(new String[myToolwindowIdToContentManagerMap.size()]); - final List<RunContentDescriptor> descriptors = new ArrayList<RunContentDescriptor>(); - for (String id : ids) { - final ContentManager contentManager = myToolwindowIdToContentManagerMap.get(id); - for (final Content content : contentManager.getContents()) { - final RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); + + List<RunContentDescriptor> descriptors = new SmartList<RunContentDescriptor>(); + for (String id : myToolwindowIdToContentManagerMap.keySet()) { + for (Content content : myToolwindowIdToContentManagerMap.get(id).getContents()) { + RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); if (descriptor != null) { descriptors.add(descriptor); } } } - return descriptors; } @@ -607,10 +586,9 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { @Nullable private RunContentDescriptor getDescriptorBy(ProcessHandler handler, Executor runnerInfo) { - ContentManager contentManager = getContentManagerForRunner(runnerInfo); - Content[] contents = contentManager.getContents(); - for (Content content : contents) { - RunContentDescriptor runContentDescriptor = content.getUserData(DESCRIPTOR_KEY); + for (Content content : getContentManagerForRunner(runnerInfo).getContents()) { + RunContentDescriptor runContentDescriptor = getRunContentDescriptorByContent(content); + assert runContentDescriptor != null; if (runContentDescriptor.getProcessHandler() == handler) { return runContentDescriptor; } @@ -642,12 +620,11 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { final Content content = myContent; try { - final RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); - + RunContentDescriptor descriptor = getRunContentDescriptorByContent(content); getSyncPublisher().contentRemoved(descriptor, myExecutor); - - if (descriptor != null) + if (descriptor != null) { Disposer.dispose(descriptor); + } } finally { content.getManager().removeContentManagerListener(this); @@ -699,7 +676,6 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { private boolean closeQuery(boolean modal) { final RunContentDescriptor descriptor = getRunContentDescriptorByContent(myContent); - if (descriptor == null) { return true; } @@ -709,6 +685,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { return true; } final boolean destroyProcess; + //noinspection deprecation if (processHandler.isSilentlyDestroyOnClose() || Boolean.TRUE.equals(processHandler.getUserData(ProcessHandler.SILENTLY_DESTROY_ON_CLOSE))) { destroyProcess = true; } @@ -786,7 +763,9 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { break; } try { + //noinspection SynchronizeOnThis synchronized (this) { + //noinspection SynchronizeOnThis wait(2000L); } } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentWithExecutorListener.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentWithExecutorListener.java deleted file mode 100644 index 8231f0d1d1d8..000000000000 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentWithExecutorListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2000-2010 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.ui; - -import com.intellij.execution.Executor; -import org.jetbrains.annotations.NotNull; - -/** - * @author nik - */ -public interface RunContentWithExecutorListener { - void contentSelected(RunContentDescriptor descriptor, @NotNull Executor executor); - void contentRemoved(RunContentDescriptor descriptor, @NotNull Executor executor); -} diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java index b70d37a79e41..301cceee7e19 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java @@ -70,6 +70,7 @@ public class GridCellImpl implements GridCell { myPlaceInGrid = placeInGrid; myPlaceholder = placeholder; myTabs = new JBTabsImpl(myContext.getProject(), myContext.getActionManager(), myContext.getFocusManager(), container) { + @SuppressWarnings("UseJBColor") @Override protected Color getFocusedTopFillColor() { return UIUtil.isUnderDarcula() ? ColorUtil.toAlpha(new Color(0x1E2533), 100) : new Color(202, 211, 227); @@ -88,11 +89,13 @@ public class GridCellImpl implements GridCell { super.paintBorder(g2d, shape, borderColor); } + @SuppressWarnings("UseJBColor") @Override protected Color getFocusedBottomFillColor() { return UIUtil.isUnderDarcula() ? new Color(0x1E2533) : new Color(0xc2cbdb); } + @SuppressWarnings("UseJBColor") @Override public Color getBackground() { return UIUtil.isUnderDarcula() ? new Color(0x27292A) : super.getBackground(); @@ -239,8 +242,6 @@ public class GridCellImpl implements GridCell { } private TabInfo createTabInfoFor(Content content) { - final JComponent c = content.getComponent(); - final TabInfo tabInfo = updatePresentation(new TabInfo(new ProviderWrapper(content, myContext)), content) .setObject(content) .setPreferredFocusableComponent(content.getPreferredFocusableComponent()) @@ -257,7 +258,10 @@ public class GridCellImpl implements GridCell { @Nullable private static TabInfo updatePresentation(TabInfo info, Content content) { - if (info == null) return info; + if (info == null) { + return null; + } + return info. setIcon(content.getIcon()). setText(content.getDisplayName()). @@ -309,7 +313,6 @@ public class GridCellImpl implements GridCell { } private static class ProviderWrapper extends NonOpaquePanel implements DataProvider { - Content myContent; ViewContext myContext; diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/JBRunnerTabs.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/JBRunnerTabs.java index 8ca416bd5427..d680e8a7e173 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/JBRunnerTabs.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/JBRunnerTabs.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * 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. @@ -43,7 +43,7 @@ import java.util.Map; */ public class JBRunnerTabs extends JBTabsImpl { - public JBRunnerTabs(@Nullable Project project, ActionManager actionManager, IdeFocusManager focusManager, @NotNull Disposable parent) { + public JBRunnerTabs(@Nullable Project project, @NotNull ActionManager actionManager, IdeFocusManager focusManager, @NotNull Disposable parent) { super(project, actionManager, focusManager, parent); } 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 821d9dbd6bc3..b8225b0c238b 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * 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. @@ -89,7 +89,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private ContentManager myManager; private final RunnerLayout myLayoutSettings; - private final ActionManager myActionManager; + @NotNull private final ActionManager myActionManager; private final String mySessionName; private final MyComponent myComponent = new MyComponent(); @@ -99,7 +99,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac JBRunnerTabs myTabs; private final Comparator<TabInfo> myTabsComparator = new Comparator<TabInfo>() { @Override - public int compare(final TabInfo o1, final TabInfo o2) { + public int compare(@NotNull final TabInfo o1, @NotNull final TabInfo o2) { //noinspection ConstantConditions TabImpl tab1 = getTabFor(o1); TabImpl tab2 = getTabFor(o2); @@ -132,7 +132,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private final Map<String, LayoutAttractionPolicy> myConditionAttractions = new HashMap<String, LayoutAttractionPolicy>(); private ActionGroup myTabPopupActions; - private ActionGroup myAdditonalFocusActions; + private ActionGroup myAdditionalFocusActions; private final ActionCallback myInitialized = new ActionCallback(); private boolean myToDisposeRemovedContent = true; @@ -149,7 +149,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private final CopyOnWriteArraySet<Listener> myDockingListeners = new CopyOnWriteArraySet<Listener>(); private final Set<RunnerContentUi> myChildren = new TreeSet<RunnerContentUi>(new Comparator<RunnerContentUi>() { @Override - public int compare(RunnerContentUi o1, RunnerContentUi o2) { + public int compare(@NotNull RunnerContentUi o1, @NotNull RunnerContentUi o2) { return o1.myWindow - o2.myWindow; } }); @@ -164,7 +164,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac @NotNull String sessionName) { myProject = project; myRunnerUi = ui; - myLayoutSettings = settings; + myLayoutSettings = settings; myActionManager = actionManager; mySessionName = sessionName; myFocusManager = focusManager; @@ -190,7 +190,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } public void setAdditionalFocusActions(final ActionGroup group) { - myAdditonalFocusActions = group; + myAdditionalFocusActions = group; rebuildTabPopup(); } @@ -269,7 +269,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac }); myTabs.addTabMouseListener(new MouseAdapter() { @Override - public void mousePressed(MouseEvent e) { + public void mousePressed(@NotNull MouseEvent e) { if (UIUtil.isCloseClick(e)) { final TabInfo tabInfo = myTabs.findInfo(e); final GridImpl grid = tabInfo == null? null : getGridFor(tabInfo); @@ -299,10 +299,11 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } private void rebuildTabPopup() { + initUi(); + myTabs.setPopupGroup(getCellPopupGroup(TAB_POPUP_PLACE), TAB_POPUP_PLACE, true); - final ArrayList<GridImpl> grids = getGrids(); - for (GridImpl each : grids) { + for (GridImpl each : getGrids()) { each.rebuildTabPopup(); } } @@ -325,10 +326,9 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac for (AnAction eachFocus : focusActions) { group.add(eachFocus); } - if (myAdditonalFocusActions != null) { - final AnAction[] addins = myAdditonalFocusActions.getChildren(event); - for (AnAction eachAddin : addins) { - group.add(eachAddin); + if (myAdditionalFocusActions != null) { + for (AnAction action : myAdditionalFocusActions.getChildren(event)) { + group.add(action); } } } @@ -350,7 +350,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } @Override - public void propertyChange(final PropertyChangeEvent evt) { + public void propertyChange(@NotNull final PropertyChangeEvent evt) { Content content = (Content)evt.getSource(); final GridImpl grid = getGridFor(content, false); if (grid == null) return; @@ -436,8 +436,8 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac return new ActionCallback.Done(); } - private void storeDefaultIndices(Content[] contents) { - int i = 0; + private void storeDefaultIndices(@NotNull Content[] contents) { + //int i = 0; for (Content content : contents) { content.putUserData(RunnerLayout.DEFAULT_INDEX, getStateFor(content).getTab().getDefaultIndex()); //content.putUserData(CONTENT_NUMBER, i++); @@ -637,8 +637,9 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac myManager.addContentManagerListener(new ContentManagerListener() { @Override public void contentAdded(final ContentManagerEvent event) { - final GridImpl grid = getGridFor(event.getContent(), true); + initUi(); + GridImpl grid = getGridFor(event.getContent(), true); if (grid == null) { return; } @@ -795,10 +796,12 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private static void moveFollowingTabs(int index, final JBRunnerTabs tabs) { for (TabInfo info : tabs.getTabs()) { - final TabImpl tab = getTabFor(info); - final int tabIndex = tab != null ? tab.getIndex() : -1; - if (tabIndex >= index) { - tab.setIndex(tabIndex + 1); + TabImpl tab = getTabFor(info); + if (tab != null) { + int tabIndex = tab.getIndex(); + if (tabIndex >= index) { + tab.setIndex(tabIndex + 1); + } } } } @@ -1147,7 +1150,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac myOriginal = null; myTopActions = null; - myAdditonalFocusActions = null; + myAdditionalFocusActions = null; myLeftToolbarActions = null; } @@ -1166,7 +1169,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac Content[] all = contents.toArray(new Content[contents.size()]); Arrays.sort(all, new Comparator<Content>() { @Override - public int compare(Content content, Content content1) { + public int compare(@NotNull Content content, @NotNull Content content1) { final int i = getStateFor(content).getTab().getDefaultIndex(); final int i1 = getStateFor(content1).getTab().getDefaultIndex(); return i - i1; @@ -1222,6 +1225,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac myMinimizeActionEnabled = enabled; } + @SuppressWarnings("SpellCheckingInspection") public void setMovetoGridActionEnabled(final boolean enabled) { myMoveToGridActionEnabled = enabled; } @@ -1271,7 +1275,6 @@ 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(); @@ -1293,7 +1296,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac private static class MyDropAreaPainter extends AbstractPainter { private Shape myBoundingBox; - private Color myColor = ColorUtil.mix(JBColor.BLUE, JBColor.WHITE, .3); + private final Color myColor = ColorUtil.mix(JBColor.BLUE, JBColor.WHITE, .3); @Override public boolean needsRepaint() { @@ -1390,6 +1393,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } } + @SuppressWarnings("NullableProblems") @Override public String getName() { return RunnerContentUi.this.getName(); @@ -1575,6 +1579,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac return myManager; } + @NotNull @Override public ActionManager getActionManager() { return myActionManager; @@ -1617,7 +1622,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } @Override - public void validate(final Content content, final ActiveRunnable toRestore) { + public void validate(Content content, final ActiveRunnable toRestore) { final TabInfo current = myTabs.getSelectedInfo(); myTabs.getPresentation().setPaintBlocked(true, true); @@ -1628,6 +1633,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac toRestore.run().doWhenDone(new Runnable() { @Override public void run() { + assert current != null; myTabs.select(current, true); myTabs.getPresentation().setPaintBlocked(false, true); } @@ -1654,7 +1660,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } @Override - public Dimension preferredLayoutSize(final Container parent) { + public Dimension preferredLayoutSize(@NotNull final Container parent) { Dimension size = new Dimension(); Dimension leftSize = myLeft.getPreferredSize(); @@ -1667,7 +1673,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac } @Override - public void layoutContainer(final Container parent) { + public void layoutContainer(@NotNull final Container parent) { Dimension size = parent.getSize(); Dimension prefSize = parent.getPreferredSize(); if (prefSize.width <= size.width) { @@ -1806,10 +1812,9 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac @Override public void dragOutStarted(MouseEvent mouseEvent, TabInfo info) { - final JComponent component = info.getComponent(); - final Content[] data = CONTENT_KEY.getData((DataProvider)component); - final List<Content> contents = Arrays.asList(data); - + JComponent component = info.getComponent(); + Content[] data = CONTENT_KEY.getData((DataProvider)component); + assert data != null; storeDefaultIndices(data); final Dimension size = info.getComponent().getSize(); @@ -1822,7 +1827,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac presentation.setIcon(info.getIcon()); mySession = getDockManager().createDragSession(mouseEvent, new DockableGrid(image, presentation, size, - contents, 0)); + Arrays.asList(data), 0)); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java index 70d6a3f92819..7475adbcab21 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java @@ -21,7 +21,6 @@ import com.intellij.execution.ui.layout.LayoutAttractionPolicy; import com.intellij.execution.ui.layout.LayoutStateDefaults; import com.intellij.execution.ui.layout.LayoutViewOptions; import com.intellij.execution.ui.layout.PlaceInGrid; -import com.intellij.ide.DataManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; @@ -46,9 +45,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, LayoutStateDefaults, LayoutViewOptions { +public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, LayoutStateDefaults, LayoutViewOptions, DataProvider { private final RunnerLayout myLayout; - private final JPanel myContentPanel; private final RunnerContentUi myContentUI; private final ContentManager myViewsContentManager; @@ -63,14 +61,12 @@ public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, La Disposer.register(parent, this); myContentUI = new RunnerContentUi(project, this, ActionManager.getInstance(), IdeFocusManager.getInstance(project), myLayout, - runnerTitle + " - " + sessionName); + runnerTitle + " - " + sessionName); Disposer.register(this, myContentUI); - myContentPanel = new MyContent(); myViewsContentManager = getContentFactory().createContentManager(myContentUI.getContentUI(), false, project); + myViewsContentManager.addDataProvider(this); Disposer.register(this, myViewsContentManager); - - myContentPanel.add(myViewsContentManager.getComponent(), BorderLayout.CENTER); } @Override @@ -80,7 +76,6 @@ public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, La return this; } - @NotNull @Override public LayoutStateDefaults initTabDefaults(int id, String text, Icon icon) { @@ -156,7 +151,7 @@ public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, La @Override @NotNull public JComponent getComponent() { - return myContentPanel; + return myViewsContentManager.getComponent(); } private static ContentFactory getContentFactory() { @@ -380,28 +375,12 @@ public class RunnerLayoutUiImpl implements Disposable.Parent, RunnerLayoutUi, La return contents; } - private class MyContent extends JPanel implements DataProvider { - public MyContent() { - super(new BorderLayout()); - } - - @Override - public Object getData(@NonNls String dataId) { - if (SwitchProvider.KEY.getName().equals(dataId)) { - return myContentUI; - } - - if (QuickActionProvider.KEY.getName().equals(dataId)) { - return myContentUI; - } - - if (RunnerContentUi.KEY.getName().equals(dataId)) { - return myContentUI; - } - - final DataProvider provider = DataManager.getDataProvider(this); - return provider != null ? provider.getData(dataId) : null; + @Nullable + @Override + public Object getData(@NonNls String dataId) { + if (SwitchProvider.KEY.is(dataId) || QuickActionProvider.KEY.is(dataId) || RunnerContentUi.KEY.is(dataId)) { + return myContentUI; } + return null; } - } |