diff --git a/src/vs/workbench/parts/debug/browser/debugViewer.ts b/src/vs/workbench/parts/debug/browser/debugViewer.ts index 1a1d5b87dea04441b7abafe1da296c8050b1762f..f6c5abf9726aa026ccf8b8a965e7012766e0950b 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewer.ts @@ -13,7 +13,7 @@ import errors = require('vs/base/common/errors'); import strings = require('vs/base/common/strings'); import { isMacintosh } from 'vs/base/common/platform'; import dom = require('vs/base/browser/dom'); -import mouse = require('vs/base/browser/mouseEvent'); +import {IMouseEvent} from 'vs/base/browser/mouseEvent'; import labels = require('vs/base/common/labels'); import actions = require('vs/base/common/actions'); import actionbar = require('vs/base/browser/ui/actionbar/actionbar'); @@ -195,10 +195,13 @@ export class BaseDebugController extends treedefaults.DefaultController { export class CallStackController extends BaseDebugController { - protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { + protected onLeftClick(tree: tree.ITree, element: any, event: IMouseEvent): boolean { if (typeof element === 'number') { return this.showMoreStackFrames(tree, element); } + if (element instanceof model.StackFrame) { + this.focusStackFrame(element, event, true); + } return super.onLeftClick(tree, element, event); } @@ -208,6 +211,9 @@ export class CallStackController extends BaseDebugController { if (typeof element === 'number') { return this.showMoreStackFrames(tree, element); } + if (element instanceof model.StackFrame) { + this.focusStackFrame(element, event, false); + } return super.onEnter(tree, event); } @@ -222,6 +228,13 @@ export class CallStackController extends BaseDebugController { return true; } + + private focusStackFrame(stackFrame: debug.IStackFrame, event: IKeyboardEvent|IMouseEvent, preserveFocus: boolean): void { + this.debugService.setFocusedStackFrameAndEvaluate(stackFrame).done(null, errors.onUnexpectedError); + + const sideBySide = (event && (event.ctrlKey || event.metaKey)); + this.debugService.openOrRevealSource(stackFrame.source, stackFrame.lineNumber, preserveFocus, sideBySide).done(null, errors.onUnexpectedError); + } } @@ -804,7 +817,7 @@ export class WatchExpressionsController extends BaseDebugController { } } - protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { + protected onLeftClick(tree: tree.ITree, element: any, event: IMouseEvent): boolean { // double click on primitive value: open input box to be able to select and copy value. if (element instanceof model.Expression && event.detail === 2) { const expression = element; @@ -1088,7 +1101,7 @@ export class BreakpointsAccessibilityProvider implements tree.IAccessibilityProv export class BreakpointsController extends BaseDebugController { - protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { + protected onLeftClick(tree: tree.ITree, element: any, event: IMouseEvent): boolean { if (element instanceof model.FunctionBreakpoint && event.detail === 2) { this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); return true; diff --git a/src/vs/workbench/parts/debug/browser/debugViews.ts b/src/vs/workbench/parts/debug/browser/debugViews.ts index 30d85f698674e75f7a0fd28c37b071a13b05a2de..01859dc34904cbab2bcd6f39984a76d3c672d9c9 100644 --- a/src/vs/workbench/parts/debug/browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/browser/debugViews.ts @@ -227,32 +227,6 @@ export class CallStackView extends viewlet.CollapsibleViewletView { controller: new viewer.CallStackController(this.debugService, this.contextMenuService, actionProvider) }, debugTreeOptions(nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel'}, "Debug Call Stack"))); - this.toDispose.push(this.tree.addListener2('selection', (e: tree.ISelectionEvent) => { - if (!e.selection.length || !e.payload) { - // Ignore the event if it was not initated by user. - // Debug sometimes automaticaly sets the selected frame, and those events we need to ignore. - return; - } - const element = e.selection[0]; - - if (element instanceof StackFrame) { - const stackFrame = element; - this.debugService.setFocusedStackFrameAndEvaluate(stackFrame).done(null, errors.onUnexpectedError); - - const isMouse = (e.payload && e.payload.origin === 'mouse'); - let preserveFocus = isMouse; - - const originalEvent:KeyboardEvent|MouseEvent = e && e.payload && e.payload.originalEvent; - if (originalEvent && isMouse && originalEvent.detail === 2) { - preserveFocus = false; - originalEvent.preventDefault(); // focus moves to editor, we need to prevent default - } - - const sideBySide = (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)); - this.debugService.openOrRevealSource(stackFrame.source, stackFrame.lineNumber, preserveFocus, sideBySide).done(null, errors.onUnexpectedError); - } - })); - this.toDispose.push(this.tree.addListener2(events.EventType.FOCUS, (e: tree.IFocusEvent) => { const isMouseClick = (e.payload && e.payload.origin === 'mouse'); const isStackFrameType = (e.focus instanceof StackFrame);