diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 515329e5de1..776395ccbcf 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -601,15 +601,14 @@ export interface IResourceResultsNavigationOptions { export class TreeResourceNavigator2 extends Disposable { - private readonly _openResource = new Emitter>(); - readonly openResource: Event> = this._openResource.event; + private readonly _onDidOpenResource = new Emitter>(); + readonly onDidOpenResource: Event> = this._onDidOpenResource.event; constructor( - private tree: WorkbenchObjectTree | WorkbenchAsyncDataTree, + private tree: WorkbenchObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree, private options?: IResourceResultsNavigationOptions ) { super(); - this.registerListeners(); } @@ -642,12 +641,15 @@ export class TreeResourceNavigator2 extends Disposable { } const isDoubleClick = e.browserEvent.detail === 2; - const sideBySide = e.browserEvent instanceof MouseEvent && (e.browserEvent.ctrlKey || e.browserEvent.metaKey || e.browserEvent.altKey); - this.open(!isDoubleClick, isDoubleClick, sideBySide); + + if (this.tree.openOnSingleClick || isDoubleClick) { + const sideBySide = e.browserEvent instanceof MouseEvent && (e.browserEvent.ctrlKey || e.browserEvent.metaKey || e.browserEvent.altKey); + this.open(!isDoubleClick, isDoubleClick, sideBySide); + } } private open(preserveFocus: boolean, pinned: boolean, sideBySide: boolean): void { - this._openResource.fire({ + this._onDidOpenResource.fire({ editorOptions: { preserveFocus, pinned, @@ -904,6 +906,7 @@ export class WorkbenchObjectTree, TFilterData = void> private hasDoubleSelection: IContextKey; private hasMultiSelection: IContextKey; + private _openOnSingleClick: boolean; private _useAltAsMultipleSelectionModifier: boolean; constructor( @@ -940,6 +943,7 @@ export class WorkbenchObjectTree, TFilterData = void> this.hasDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); this.hasMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this._openOnSingleClick = useSingleClickToOpen(configurationService); this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); this.disposables.push( @@ -961,6 +965,9 @@ export class WorkbenchObjectTree, TFilterData = void> this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); }), configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(openModeSettingKey)) { + this._openOnSingleClick = useSingleClickToOpen(configurationService); + } if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } @@ -979,6 +986,10 @@ export class WorkbenchObjectTree, TFilterData = void> ); } + get openOnSingleClick(): boolean { + return this._openOnSingleClick; + } + get useAltAsMultipleSelectionModifier(): boolean { return this._useAltAsMultipleSelectionModifier; } @@ -997,6 +1008,7 @@ export class WorkbenchDataTree extends DataTree; private hasMultiSelection: IContextKey; + private _openOnSingleClick: boolean; private _useAltAsMultipleSelectionModifier: boolean; constructor( @@ -1034,6 +1046,7 @@ export class WorkbenchDataTree extends DataTree extends DataTree 0 || focus.length > 0); }), configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(openModeSettingKey)) { + this._openOnSingleClick = useSingleClickToOpen(configurationService); + } if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } @@ -1073,6 +1089,10 @@ export class WorkbenchDataTree extends DataTree extends Async private hasDoubleSelection: IContextKey; private hasMultiSelection: IContextKey; + private _openOnSingleClick: boolean; private _useAltAsMultipleSelectionModifier: boolean; constructor( @@ -1123,6 +1144,7 @@ export class WorkbenchAsyncDataTree extends Async this.hasDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); this.hasMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this._openOnSingleClick = useSingleClickToOpen(configurationService); this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); this.disposables.push( @@ -1144,6 +1166,9 @@ export class WorkbenchAsyncDataTree extends Async this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); }), configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(openModeSettingKey)) { + this._openOnSingleClick = useSingleClickToOpen(configurationService); + } if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } @@ -1162,6 +1187,10 @@ export class WorkbenchAsyncDataTree extends Async ); } + get openOnSingleClick(): boolean { + return this._openOnSingleClick; + } + get useAltAsMultipleSelectionModifier(): boolean { return this._useAltAsMultipleSelectionModifier; } diff --git a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts b/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts index fabd77cd8c0..c59a90734ca 100644 --- a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts +++ b/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts @@ -429,7 +429,7 @@ export class LoadedScriptsView extends ViewletPanel { const loadedScriptsNavigator = new TreeResourceNavigator2(this.tree); this.disposables.push(loadedScriptsNavigator); - this.disposables.push(loadedScriptsNavigator.openResource(e => { + this.disposables.push(loadedScriptsNavigator.onDidOpenResource(e => { if (e.element instanceof BaseTreeItem) { const source = e.element.getSource(); if (source && source.available) { diff --git a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts index aef0de79a27..a4dfb9bea3c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts +++ b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts @@ -149,7 +149,7 @@ export class CallStackView extends ViewletPanel { const callstackNavigator = new TreeResourceNavigator2(this.tree); this.disposables.push(callstackNavigator); - this.disposables.push(callstackNavigator.openResource(e => { + this.disposables.push(callstackNavigator.onDidOpenResource(e => { if (this.ignoreSelectionChangedEvent) { return; } diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts index 9f4fcb57c13..4f3b10f4513 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts @@ -289,6 +289,8 @@ export class ExplorerView extends ViewletPanel { this.rootContext.set(!stat || (stat && stat.isRoot)); })); + // TODO@Isidor: use TreeResourceNavigator2 just like search and listen to the `onDidOpenResource` instead + // Open when selecting via keyboard this.disposables.push(this.tree.onDidChangeSelection(e => { if (!e.browserEvent) { @@ -318,6 +320,11 @@ export class ExplorerView extends ViewletPanel { if (e.browserEvent instanceof MouseEvent) { isDoubleClick = e.browserEvent.detail === 2; + + if (!this.tree.openOnSingleClick && !isDoubleClick) { + return; + } + isMiddleClick = e.browserEvent.button === 1; sideBySide = this.tree.useAltAsMultipleSelectionModifier ? (e.browserEvent.ctrlKey || e.browserEvent.metaKey) : e.browserEvent.altKey; } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 128c751cd08..c86ac4dca7c 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -354,7 +354,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { })); const markersNavigator = this._register(new TreeResourceNavigator2(this.tree, { openOnFocus: true })); - this._register(Event.debounce(markersNavigator.openResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(markersNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { this.openFileAtElement(options.element, options.editorOptions.preserveFocus, options.sideBySide, options.editorOptions.pinned); })); this._register(this.tree.onDidChangeCollapseState(({ node }) => { diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index a6ef7c274c9..25a2ec1b093 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -638,7 +638,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); const resourceNavigator = this._register(new TreeResourceNavigator2(this.tree, { openOnFocus: true })); - this._register(Event.debounce(resourceNavigator.openResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(resourceNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { if (options.element instanceof Match) { const selectedMatch: Match = options.element; if (this.currentSelectedFileMatch) {