XDebugger: auto-focusing Console/Frames tabs when necessary (like in Java-debugger)

This commit is contained in:
Anton Makeev
2011-04-13 20:55:26 +02:00
parent acab2d5267
commit 0fe604b59e
8 changed files with 35 additions and 75 deletions
@@ -94,7 +94,6 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
private ExecutionEnvironment myEnvironment;
private RunProfile myConfiguration;
public static final String BREAKPOINT_CONDITION = "breakpoint";
private final ThreadsPanel myThreadsPanel;
private static final String THREAD_DUMP_CONTENT_PREFIX = "Dump";
private final Icon myIcon;
@@ -104,10 +103,10 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
myIcon = icon;
myUi = RunnerLayoutUi.Factory.getInstance(project).create("JavaDebugger", DebuggerBundle.message("title.generic.debug.dialog"), sessionName, this);
myUi = RunnerLayoutUi.Factory.getInstance(project).create("JavaDebugger", XDebuggerBundle.message("xdebugger.default.content.title"), sessionName, this);
myUi.getDefaults().initTabDefaults(0, "Debugger", null).
initFocusContent(DebuggerContentInfo.FRAME_CONTENT, BREAKPOINT_CONDITION).
myUi.getDefaults().initTabDefaults(0, XDebuggerBundle.message("xdebugger.debugger.tab.title"), null).
initFocusContent(DebuggerContentInfo.FRAME_CONTENT, LayoutViewOptions.BREAKPOINT_CONDITION).
initFocusContent(DebuggerContentInfo.CONSOLE_CONTENT, LayoutViewOptions.STARTUP, new LayoutAttractionPolicy.FocusOnce(false));
final DefaultActionGroup focus = new DefaultActionGroup();
@@ -479,9 +478,9 @@ public class DebuggerSessionTab extends DebuggerSessionTabBase implements Dispos
private void attractFramesOnPause(final int event) {
if (DebuggerSession.EVENT_PAUSE == event) {
myUi.attractBy(BREAKPOINT_CONDITION);
myUi.attractBy(LayoutViewOptions.BREAKPOINT_CONDITION);
} else if (DebuggerSession.EVENT_RESUME == event) {
myUi.clearAttractionBy(BREAKPOINT_CONDITION);
myUi.clearAttractionBy(LayoutViewOptions.BREAKPOINT_CONDITION);
}
}
@@ -16,10 +16,10 @@
package com.intellij.debugger.ui.breakpoints.actions;
import com.intellij.execution.ui.actions.AbstractFocusOnAction;
import com.intellij.debugger.ui.DebuggerSessionTab;
import com.intellij.execution.ui.layout.LayoutViewOptions;
public class FocusOnBreakpointAction extends AbstractFocusOnAction {
public FocusOnBreakpointAction() {
super(DebuggerSessionTab.BREAKPOINT_CONDITION);
super(LayoutViewOptions.BREAKPOINT_CONDITION);
}
}
@@ -16,6 +16,7 @@
package com.intellij.execution.ui.layout;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.intellij.openapi.actionSystem.ActionGroup;
@@ -25,6 +26,7 @@ import com.intellij.ui.content.Content;
public interface LayoutViewOptions {
String STARTUP = "startup";
String BREAKPOINT_CONDITION = "breakpoint";
@NotNull
LayoutViewOptions setTopToolbar(@NotNull ActionGroup actions, @NotNull String place);
@@ -2,6 +2,9 @@ xdebugger.colors.page.name=Debugger
debugger.configurable.display.name=Debugger
xdebugger.default.content.title=Debug
xdebugger.debugger.tab.title=Debugger
xdebugger.remove.line.breakpoint.action.text=Remove
xdebugger.disable.breakpoint.action.text=Disable
xdebugger.enable.breakpoint.action.text=Enable
@@ -19,6 +19,7 @@ package com.intellij.xdebugger;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.ui.RunnerLayoutUi;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.xdebugger.breakpoints.XBreakpoint;
@@ -135,4 +136,6 @@ public interface XDebugSession extends AbstractDebuggerSession {
void updateExecutionPosition();
ConsoleView getConsoleView();
RunnerLayoutUi getUI();
}
@@ -28,6 +28,8 @@ import com.intellij.execution.runners.ProgramRunner;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.ui.RunnerLayoutUi;
import com.intellij.execution.ui.layout.LayoutViewOptions;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.diagnostic.Logger;
@@ -217,6 +219,11 @@ public class XDebugSessionImpl implements XDebugSession {
return mySessionTab;
}
@Override
public RunnerLayoutUi getUI() {
return mySessionTab.getUi();
}
private void initSessionTab() {
mySessionTab = new XDebugSessionTab(myProject, mySessionName);
if (myEnvironment != null) {
@@ -408,6 +415,12 @@ public class XDebugSessionImpl implements XDebugSession {
myCurrentStackFrame = null;
myCurrentPosition = null;
myPaused = false;
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
mySessionTab.getUi().clearAttractionBy(LayoutViewOptions.BREAKPOINT_CONDITION);
}
});
myDispatcher.getMulticaster().sessionResumed();
}
@@ -574,6 +587,7 @@ public class XDebugSessionImpl implements XDebugSession {
showSessionTab();
}
mySessionTab.toFront();
mySessionTab.getUi().attractBy(LayoutViewOptions.BREAKPOINT_CONDITION);
}
});
myDispatcher.getMulticaster().sessionPaused();
@@ -29,6 +29,8 @@ import com.intellij.execution.ui.ExecutionConsole;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.execution.ui.RunnerLayoutUi;
import com.intellij.execution.ui.actions.CloseAction;
import com.intellij.execution.ui.layout.LayoutAttractionPolicy;
import com.intellij.execution.ui.layout.LayoutViewOptions;
import com.intellij.execution.ui.layout.PlaceInGrid;
import com.intellij.ide.CommonActionsManager;
import com.intellij.ide.actions.ContextHelpAction;
@@ -68,7 +70,10 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
mySessionName = sessionName;
myUi = RunnerLayoutUi.Factory.getInstance(project).create("Debug", "unknown!", sessionName, this);
myUi.getDefaults().initTabDefaults(0, "Debug", null);
myUi.getDefaults()
.initTabDefaults(0, XDebuggerBundle.message("xdebugger.debugger.tab.title"), null)
.initFocusContent(DebuggerContentInfo.FRAME_CONTENT, LayoutViewOptions.BREAKPOINT_CONDITION)
.initFocusContent(DebuggerContentInfo.CONSOLE_CONTENT, LayoutViewOptions.STARTUP, new LayoutAttractionPolicy.FocusOnce(false));
}
private static ActionGroup getActionGroup(final String id) {
@@ -201,71 +206,6 @@ public class XDebugSessionTab extends DebuggerSessionTabBase {
return myRunContentDescriptor;
}
private RunContentDescriptor initUI(final @NotNull XDebugSession session, final @NotNull XDebugSessionData sessionData,
final @Nullable ExecutionEnvironment environment,
final @Nullable ProgramRunner runner,
ConsoleView consoleView) {
final XDebugProcess debugProcess = session.getDebugProcess();
ProcessHandler processHandler = debugProcess.getProcessHandler();
myConsole = consoleView;
myRunContentDescriptor = new RunContentDescriptor(myConsole, processHandler, myUi.getComponent(), mySessionName);
myUi.addContent(createFramesContent(session), 0, PlaceInGrid.left, false);
myUi.addContent(createVariablesContent(session), 0, PlaceInGrid.center, false);
myUi.addContent(createWatchesContent(session, sessionData), 0, PlaceInGrid.right, false);
final Content consoleContent = createConsoleContent();
myUi.addContent(consoleContent, 1, PlaceInGrid.bottom, false);
attachNotificationTo(consoleContent);
session.getDebugProcess().registerAdditionalContent(myUi);
RunContentBuilder.addAdditionalConsoleEditorActions(myConsole, consoleContent);
myUi.addContent(consoleContent, 0, PlaceInGrid.bottom, false);
if (ApplicationManager.getApplication().isUnitTestMode()) {
return myRunContentDescriptor;
}
DefaultActionGroup leftToolbar = new DefaultActionGroup();
final Executor executor = DefaultDebugExecutor.getDebugExecutorInstance();
if (runner != null && environment != null) {
RestartAction restartAction = new RestartAction(executor, runner, myRunContentDescriptor.getProcessHandler(), XDebuggerUIConstants.DEBUG_AGAIN_ICON,
myRunContentDescriptor, environment);
leftToolbar.add(restartAction);
restartAction.registerShortcut(myUi.getComponent());
}
leftToolbar.addAll(getActionGroup(XDebuggerActions.TOOL_WINDOW_LEFT_TOOLBAR_GROUP));
//group.addSeparator();
//addAction(group, DebuggerActions.EXPORT_THREADS);
leftToolbar.addSeparator();
leftToolbar.add(myUi.getOptions().getLayoutActions());
leftToolbar.addSeparator();
leftToolbar.add(PinToolwindowTabAction.getPinAction());
leftToolbar.add(new CloseAction(executor, myRunContentDescriptor, getProject()));
leftToolbar.add(new ContextHelpAction(executor.getHelpId()));
DefaultActionGroup topToolbar = new DefaultActionGroup();
topToolbar.addAll(getActionGroup(XDebuggerActions.TOOL_WINDOW_TOP_TOOLBAR_GROUP));
session.getDebugProcess().registerAdditionalActions(leftToolbar, topToolbar);
myUi.getOptions().setLeftToolbar(leftToolbar, ActionPlaces.DEBUGGER_TOOLBAR);
myUi.getOptions().setTopToolbar(topToolbar, ActionPlaces.DEBUGGER_TOOLBAR);
if (environment != null) {
final RunProfile runConfiguration = environment.getRunProfile();
registerFileMatcher(runConfiguration);
initLogConsoles(runConfiguration, myRunContentDescriptor.getProcessHandler());
}
rebuildViews();
return myRunContentDescriptor;
}
public RunnerLayoutUi getUi() {
return myUi;
}
@@ -69,7 +69,6 @@ error.vm.disconnected=VM disconnected. Target virtual machine closed connection
error.unknown.host=Cannot connect to remote process, host is unknown
error.cannot.open.debugger.port=Unable to open debugger port
error.exception.while.connecting=Error connecting to remote process.\nException occurred: {0}\nException message: {1}
title.generic.debug.dialog=Debug
status.waiting.attach=Debugger is waiting for application to start; debug address: ''{0}''; transport: ''{1}''
status.listening=Listening to the connection, address: ''{0}'', transport: ''{1}''
status.connecting=Connecting to the target VM, address: ''{0}'', transport: ''{1}''