package jetbrains.mps.debugger.api.ui.tool; /*Generated by MPS */ import com.intellij.openapi.Disposable; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.jetbrains.annotations.NonNls; import com.intellij.execution.runners.ProgramRunner; import com.intellij.openapi.project.Project; import java.util.ArrayList; import com.intellij.execution.ExecutionResult; import com.intellij.execution.Executor; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.ExecutionConsoleEx; import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.actionSystem.ActionPlaces; import jetbrains.mps.workbench.action.BaseGroup; import com.intellij.openapi.actionSystem.ActionManager; import jetbrains.mps.debug.api.AbstractDebugSession; import jetbrains.mps.debug.api.DebugSessionManagerComponent; import org.apache.log4j.Level; import com.intellij.ui.content.Content; import com.intellij.openapi.util.IconLoader; import com.intellij.execution.ui.layout.PlaceInGrid; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.execution.ui.actions.CloseAction; import javax.swing.JComponent; import org.jetbrains.annotations.NotNull; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DataProvider; import org.jetbrains.annotations.Nullable; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.util.Disposer; public class DebuggerToolContentBuilder implements Disposable { private static final Logger LOG = LogManager.getLogger(DebuggerToolContentBuilder.class); @NonNls private static final String JAVA_RUNNER = "JavaRunner"; private final ProgramRunner myRunner; private final Project myProject; private final ArrayList<Disposable> myDisposeables = new ArrayList<Disposable>(); private final boolean myReuseProhibited = false; private final ExecutionResult myExecutionResult; private final Executor myExecutor; private final ExecutionEnvironment myEnvironment; public DebuggerToolContentBuilder(Project project, ProgramRunner runner, Executor executor, ExecutionResult executionResult, ExecutionEnvironment env) { myProject = project; myRunner = runner; myExecutor = executor; myExecutionResult = executionResult; myEnvironment = env; } @Override public void dispose() { for (Disposable disposable : myDisposeables) { disposable.dispose(); } } private RunContentDescriptor createDescriptor() { RunProfile profile = myEnvironment.getRunProfile(); ExecutionConsole console = myExecutionResult.getExecutionConsole(); String runnerType = (console instanceof ExecutionConsoleEx ? JAVA_RUNNER + "." + ((ExecutionConsoleEx) console).getExecutionConsoleId() : JAVA_RUNNER); RunnerLayoutUi ui = RunnerLayoutUi.Factory.getInstance(myProject).create(runnerType, myExecutor.getId(), profile.getName(), this); if (ApplicationManager.getApplication().isUnitTestMode()) { return createDescriptorInternal(ui, profile); } buildUi(ui, console); DebuggerToolContentBuilder.MyRunContentDescriptor contentDescriptor = createDescriptorInternal(ui, profile); ui.getOptions().setLeftToolbar(createActionToolbar(ui, contentDescriptor), ActionPlaces.DEBUGGER_TOOLBAR); ui.getOptions().setTopToolbar(((BaseGroup) ActionManager.getInstance().getAction("jetbrains.mps.debugger.api.ui.actions.DebugStepsMenu_ActionGroup")), ActionPlaces.DEBUGGER_TOOLBAR); return contentDescriptor; } private DebuggerToolContentBuilder.MyRunContentDescriptor createDescriptorInternal(RunnerLayoutUi ui, RunProfile profile) { return new DebuggerToolContentBuilder.MyRunContentDescriptor(profile, myExecutionResult, myReuseProhibited, ui.getComponent(), this); } private void buildUi(RunnerLayoutUi ui, ExecutionConsole console) { ui.getOptions().setMoveToGridActionEnabled(true).setMinimizeActionEnabled(true); AbstractDebugSession debugSession = DebugSessionManagerComponent.getInstance(myProject).getDebugSession(myExecutionResult.getProcessHandler()); if (debugSession == null) { if (LOG.isEnabledFor(Level.ERROR)) { LOG.error("No debug session found for process handler " + myExecutionResult.getProcessHandler()); } } else { new DebuggerToolPanel(myProject, debugSession, ui); } Content consoleContent = ui.createContent("Console2.0", console.getComponent(), "Console", IconLoader.getIcon("/debugger/console.png"), console.getPreferredFocusableComponent()); consoleContent.setSearchComponent(console.getComponent()); consoleContent.setCloseable(false); ui.addContent(consoleContent, 1, PlaceInGrid.center, false); } private ActionGroup createActionToolbar(RunnerLayoutUi ui, RunContentDescriptor contentDescriptor) { DefaultActionGroup actionGroup = new DefaultActionGroup(); // TODO use context to get data to the action actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN)); actionGroup.add(((BaseGroup) ActionManager.getInstance().getAction("jetbrains.mps.debugger.api.ui.actions.DebugTool_ActionGroup"))); actionGroup.addAll(myExecutionResult.getActions()); actionGroup.addSeparator(); actionGroup.add(ui.getOptions().getLayoutActions()); actionGroup.addSeparator(); actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_PIN_ACTIVE_TAB)); actionGroup.add(new CloseAction(myExecutor, contentDescriptor, myProject)); return actionGroup; } /** * * @param reuseContent see {@link RunContentDescriptor#myContent} */ public RunContentDescriptor showRunContent(final RunContentDescriptor reuseContent) { final RunContentDescriptor descriptor = createDescriptor(); if (reuseContent != null) { descriptor.setAttachedContent(reuseContent.getAttachedContent()); } return descriptor; } private static class MyRunContentDescriptor extends RunContentDescriptor { private final boolean myReuseProhibited; private final Disposable myAdditionalDisposable; public MyRunContentDescriptor(final RunProfile profile, final ExecutionResult executionResult, final boolean reuseProhibited, final JComponent component, @NotNull Disposable additionalDisposable) { super(executionResult.getExecutionConsole(), executionResult.getProcessHandler(), component, profile.getName(), profile.getIcon()); myReuseProhibited = reuseProhibited; myAdditionalDisposable = additionalDisposable; DataManager.registerDataProvider(component, new DataProvider() { @Nullable public Object getData(@NonNls String dataId) { if (LangDataKeys.RUN_CONTENT_DESCRIPTOR.is(dataId)) { return MyRunContentDescriptor.this; } return null; } }); } @Override public boolean isContentReuseProhibited() { return myReuseProhibited; } @Override public void dispose() { Disposer.dispose(myAdditionalDisposable); DataManager.removeDataProvider(getComponent()); super.dispose(); } } }