diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index d53e5748124..9fe0a674568 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5189,12 +5189,39 @@ declare module 'vscode' { /** * Register a [TreeDataProvider](#TreeDataProvider) for the view contributed using the extension point `views`. + * This will allow you to contribute data to the [TreeView](#TreeView) and update if the data changes. + * To get access to the [TreeView](#TreeView) and perform operations on it, use [createTreeView](#window.createTreeView). + * * @param viewId Id of the view contributed using the extension point `views`. * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view */ export function registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): Disposable; + + /** + * Create a [TreeView](#TreeView) for the view contributed using the extension point `views`. + * @param viewId Id of the view contributed using the extension point `views`. + * @param options Options object to provide [TreeDataProvider](#TreeDataProvider) for the view. + * @returns a [TreeView](#TreeView). + */ + export function createTreeView(viewId: string, options: { treeDataProvider: TreeDataProvider }): TreeView; } + /** + * Represents a Tree view + */ + export interface TreeView extends Disposable { + + /** + * Reveal an element. By default revealed element is selected. + * + * In order to not to select, set the option `select` to `false`. + * + * **NOTE:** [TreeDataProvider](#TreeDataProvider) is required to implement [getParent](#TreeDataProvider.getParent) method to access this API. + */ + reveal(element: T, options?: { select?: boolean }): Thenable; + } + + /** * A data provider that provides tree data */ @@ -5221,6 +5248,17 @@ declare module 'vscode' { * @return Children of `element` or root if no element is passed. */ getChildren(element?: T): ProviderResult; + + /** + * Optional method to return the parent of `element`. + * Return `null` or `undefined` if `element` is a child of root. + * + * **NOTE:** This method should be implemented in order to access [reveal](#TreeView.reveal) API. + * + * @param element The element for which the parent has to be returned. + * @return Parent of `element`. + */ + getParent?(element: T): ProviderResult; } export class TreeItem { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 344fe22f55f..d2836a5d925 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -663,76 +663,6 @@ declare module 'vscode' { //#endregion - //#region Sandeep: TreeView - - export namespace window { - - /** - * Register a [TreeDataProvider](#TreeDataProvider) for the view contributed using the extension point `views`. - * @param viewId Id of the view contributed using the extension point `views`. - * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view - * @return handle to the [treeview](#TreeView) that can be disposable. - */ - export function registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): TreeView; - - } - - /** - * Represents a Tree view - */ - export interface TreeView extends Disposable { - - /** - * Reveal an element. By default revealed element is selected. - * - * In order to not to select, set the option `select` to `false`. - * - * **NOTE:** [TreeDataProvider](#TreeDataProvider) is required to implement [getParent](#TreeDataProvider.getParent) method to access this API. - */ - reveal(element: T, options?: { select?: boolean }): Thenable; - } - - /** - * A data provider that provides tree data - */ - export interface TreeDataProvider { - /** - * An optional event to signal that an element or root has changed. - * This will trigger the view to update the changed element/root and its children recursively (if shown). - * To signal that root has changed, do not pass any argument or pass `undefined` or `null`. - */ - onDidChangeTreeData?: Event; - - /** - * Get [TreeItem](#TreeItem) representation of the `element` - * - * @param element The element for which [TreeItem](#TreeItem) representation is asked for. - * @return [TreeItem](#TreeItem) representation of the element - */ - getTreeItem(element: T): TreeItem | Thenable; - - /** - * Get the children of `element` or root if no element is passed. - * - * @param element The element from which the provider gets children. Can be `undefined`. - * @return Children of `element` or root if no element is passed. - */ - getChildren(element?: T): ProviderResult; - - /** - * Optional method to return the parent of `element`. - * Return `null` or `undefined` if `element` is a child of root. - * - * **NOTE:** This method should be implemented in order to access [reveal](#TreeView.reveal) API. - * - * @param element The element for which the parent has to be returned. - * @return Parent of `element`. - */ - getParent?(element: T): ProviderResult; - } - - //#endregion - //#region Alex: TextEditor.visibleRange and related event export interface TextEditor { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index aedb82a56b1..9265c43a5c6 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -403,8 +403,11 @@ export function createApiFactory( } return extHostTerminalService.createTerminal(nameOrOptions, shellPath, shellArgs); }, - registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider): vscode.TreeView { - return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider, (fn) => proposedApiFunction(extension, fn)); + registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { + return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider); + }, + createTreeView(viewId: string, options: { treeDataProvider: vscode.TreeDataProvider }): vscode.TreeView { + return extHostTreeViews.createTreeView(viewId, options); }, // proposed API sampleFunction: proposedApiFunction(extension, () => { diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 24bb25a9684..b6ddcfa97a0 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -38,14 +38,22 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { }); } - registerTreeDataProvider(id: string, dataProvider: vscode.TreeDataProvider, proposedApiFunction: (fn: U) => U): vscode.TreeView { - const treeView = this.createExtHostTreeViewer(id, dataProvider); + registerTreeDataProvider(id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { + const treeView = this.createTreeView(id, { treeDataProvider }); + return { dispose: () => treeView.dispose() }; + } + + createTreeView(viewId: string, options: { treeDataProvider: vscode.TreeDataProvider }): vscode.TreeView { + if (!options || !options.treeDataProvider) { + throw new Error('Options with treeDataProvider is mandatory'); + } + const treeView = this.createExtHostTreeViewer(viewId, options.treeDataProvider); return { - reveal: proposedApiFunction((element: T, options?: { select?: boolean }): Thenable => { + reveal: (element: T, options?: { select?: boolean }): Thenable => { return treeView.reveal(element, options); - }), + }, dispose: () => { - this.treeViews.delete(id); + this.treeViews.delete(viewId); treeView.dispose(); } }; diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index 791b1d7d065..9b95fc29698 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -75,8 +75,8 @@ suite('ExtHostTreeView', function () { testObject = new ExtHostTreeViews(target, new ExtHostCommands(rpcProtocol, new ExtHostHeapService(), new NullLogService())); onDidChangeTreeNode = new Emitter<{ key: string }>(); onDidChangeTreeNodeWithId = new Emitter<{ key: string }>(); - testObject.registerTreeDataProvider('testNodeTreeProvider', aNodeTreeDataProvider(), (fn) => fn); - testObject.registerTreeDataProvider('testNodeWithIdTreeProvider', aNodeWithIdTreeDataProvider(), (fn) => fn); + testObject.createTreeView('testNodeTreeProvider', { treeDataProvider: aNodeTreeDataProvider() }); + testObject.createTreeView('testNodeWithIdTreeProvider', { treeDataProvider: aNodeWithIdTreeDataProvider() }); testObject.$getChildren('testNodeTreeProvider').then(elements => { for (const element of elements) { @@ -405,14 +405,14 @@ suite('ExtHostTreeView', function () { }); test('reveal will throw an error if getParent is not implemented', () => { - const treeView = testObject.registerTreeDataProvider('treeDataProvider', aNodeTreeDataProvider(), (fn) => fn); + const treeView = testObject.createTreeView('treeDataProvider', { treeDataProvider: aNodeTreeDataProvider() }); return treeView.reveal({ key: 'a' }) .then(() => assert.fail('Reveal should throw an error as getParent is not implemented'), () => null); }); test('reveal will return empty array for root element', () => { const revealTarget = sinon.spy(target, '$reveal'); - const treeView = testObject.registerTreeDataProvider('treeDataProvider', aCompleteNodeTreeDataProvider(), (fn) => fn); + const treeView = testObject.createTreeView('treeDataProvider', { treeDataProvider: aCompleteNodeTreeDataProvider() }); return treeView.reveal({ key: 'a' }) .then(() => { assert.ok(revealTarget.calledOnce); @@ -425,7 +425,7 @@ suite('ExtHostTreeView', function () { test('reveal will return parents array for an element', () => { const revealTarget = sinon.spy(target, '$reveal'); - const treeView = testObject.registerTreeDataProvider('treeDataProvider', aCompleteNodeTreeDataProvider(), (fn) => fn); + const treeView = testObject.createTreeView('treeDataProvider', { treeDataProvider: aCompleteNodeTreeDataProvider() }); return treeView.reveal({ key: 'aa' }) .then(() => { assert.ok(revealTarget.calledOnce); @@ -445,7 +445,7 @@ suite('ExtHostTreeView', function () { } }; const revealTarget = sinon.spy(target, '$reveal'); - const treeView = testObject.registerTreeDataProvider('treeDataProvider', aCompleteNodeTreeDataProvider(), (fn) => fn); + const treeView = testObject.createTreeView('treeDataProvider', { treeDataProvider: aCompleteNodeTreeDataProvider() }); return treeView.reveal({ key: 'bac' }, { select: false }) .then(() => { assert.ok(revealTarget.calledOnce);