diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 6b291af09fa..05efdffb630 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -6159,6 +6159,18 @@ declare module 'vscode' { } + /** + * The event that is fired when there is a change in [tree view's selections](#TreeView.selections) + */ + export interface TreeViewSelectionChangeEvent { + + /** + * Selected elements. + */ + selections: T[]; + + } + /** * Represents a Tree view */ @@ -6174,6 +6186,11 @@ declare module 'vscode' { */ readonly onDidCollapseElement: Event>; + /** + * Event that is fired when the selection has changed + */ + readonly onDidChangeSelection: Event>; + /** * Currently selected elements. */ diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 499e859b46f..4287ad62e93 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -17,6 +17,7 @@ import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHos import { asWinJsPromise } from 'vs/base/common/async'; import { TreeItemCollapsibleState, ThemeIcon } from 'vs/workbench/api/node/extHostTypes'; import { isUndefinedOrNull } from 'vs/base/common/types'; +import { equals } from 'vs/base/common/arrays'; type TreeItemHandle = string; @@ -51,6 +52,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { return { get onDidCollapseElement() { return treeView.onDidCollapseElement; }, get onDidExpandElement() { return treeView.onDidExpandElement; }, + get onDidChangeSelection() { return treeView.onDidChangeSelection; }, get selection() { return treeView.selectedElements; }, reveal: (element: T, options?: { select?: boolean }): Thenable => { return treeView.reveal(element, options); @@ -113,8 +115,8 @@ class ExtHostTreeView extends Disposable { private elements: Map = new Map(); private nodes: Map = new Map(); - private _selectedElements: T[] = []; - get selectedElements(): T[] { return this._selectedElements; } + private _selectedHandles: TreeItemHandle[] = []; + get selectedElements(): T[] { return this._selectedHandles.map(handle => this.getExtensionElement(handle)).filter(element => !isUndefinedOrNull(element)); } private _onDidExpandElement: Emitter> = this._register(new Emitter>()); readonly onDidExpandElement: Event> = this._onDidExpandElement.event; @@ -122,6 +124,9 @@ class ExtHostTreeView extends Disposable { private _onDidCollapseElement: Emitter> = this._register(new Emitter>()); readonly onDidCollapseElement: Event> = this._onDidCollapseElement.event; + private _onDidChangeSelection: Emitter> = this._register(new Emitter>()); + readonly onDidChangeSelection: Event> = this._onDidChangeSelection.event; + private refreshPromise: TPromise = TPromise.as(null); constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape, private commands: CommandsConverter) { @@ -182,7 +187,10 @@ class ExtHostTreeView extends Disposable { } setSelection(treeItemHandles: TreeItemHandle[]): void { - this._selectedElements = treeItemHandles.map(handle => this.getExtensionElement(handle)).filter(element => !isUndefinedOrNull(element)); + if (!equals(this._selectedHandles, treeItemHandles)) { + this._selectedHandles = treeItemHandles; + this._onDidChangeSelection.fire({ selections: this.selectedElements }); + } } private resolveUnknownParentChain(element: T): TPromise {