From d8c0af7f6d390cc1c3e5e11d95dc54dbf4e23b9a Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Fri, 30 Sep 2016 16:38:56 -0700 Subject: [PATCH] Hook up provider mechanism and add onClick --- src/vs/vscode.d.ts | 10 +--- src/vs/workbench/api/node/extHost.api.impl.ts | 3 ++ src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostExplorers.ts | 26 +++++----- .../workbench/api/node/mainThreadExplorers.ts | 22 ++++++-- .../treeExplorerViewlet.contribution.ts | 7 ++- .../explorers/browser/treeExplorerViewlet.ts | 6 +++ .../browser/treeExplorerViewletService.ts | 36 +++++++++++++ .../parts/explorers/browser/views/treeView.ts | 50 ++++++------------- .../explorers/browser/views/treeViewer.ts | 8 ++- .../parts/explorers/common/treeViewModel.ts | 11 ++-- 11 files changed, 112 insertions(+), 69 deletions(-) create mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 9c867df6750..97e1ac32a48 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1349,18 +1349,12 @@ declare module 'vscode' { } export interface TreeContentProvider { - id: string; - provideTreeContent(): ITree; - } - - export interface ITree { - root: ITreeNode; + provideTreeContent(): Thenable; } export interface ITreeNode { label: string; isExpanded: boolean; - parent: ITreeNode; children: ITreeNode[] } @@ -3819,7 +3813,7 @@ declare module 'vscode' { */ export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable; - export function registerTreeContentProvider(provider: TreeContentProvider): Disposable; + export function registerTreeContentProvider(providerId: string, provider: TreeContentProvider): Disposable; /** * An event that is emitted when a [text document](#TextDocument) is opened. diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 565b3dccdb8..e04975b4841 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -335,6 +335,9 @@ export function createApiFactory(threadService: IThreadService, extensionService onWillSaveTextDocument: (listener, thisArgs?, disposables?) => { return extHostDocumentSaveParticipant.onWillSaveTextDocumentEvent(listener, thisArgs, disposables); }, + registerTreeContentProvider(providerId: string, provider: vscode.TreeContentProvider) { + return extHostExplorers.registerTreeContentProvider(providerId, provider); + }, onDidChangeConfiguration: (listener: () => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => { return extHostConfiguration.onDidChangeConfiguration(listener, thisArgs, disposables); }, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 1f52b3d8cb5..43ab9e5fbd2 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -263,7 +263,7 @@ export abstract class ExtHostEditorsShape { } export abstract class ExtHostExplorersShape { - $provideTextDocumentContent(treeContentProviderId: string): vscode.ITree { throw ni(); }; + $provideTreeContent(treeContentProviderId: string): TPromise { throw ni(); }; } export abstract class ExtHostExtensionServiceShape { diff --git a/src/vs/workbench/api/node/extHostExplorers.ts b/src/vs/workbench/api/node/extHostExplorers.ts index 7c9cbce1a77..f0be05d4693 100644 --- a/src/vs/workbench/api/node/extHostExplorers.ts +++ b/src/vs/workbench/api/node/extHostExplorers.ts @@ -15,7 +15,9 @@ export class ExtHostExplorers extends ExtHostExplorersShape { private _treeContentProviders: { [treeContentProviderId: string]: vscode.TreeContentProvider; }; - constructor(threadService: IThreadService) { + constructor( + threadService: IThreadService + ) { super(); this._proxy = threadService.get(MainContext.MainThreadExplorers); @@ -23,29 +25,25 @@ export class ExtHostExplorers extends ExtHostExplorersShape { this._treeContentProviders = Object.create(null); } - public registerTreeContentProvider(provider: vscode.TreeContentProvider): vscode.Disposable { - const treeContentProviderId = provider.id; - - if (this._treeContentProviders[treeContentProviderId]) { - throw new Error(`TreeContentProvider with id '${provider.id} already registered`); - } - - this._treeContentProviders[treeContentProviderId] = provider; - this._proxy.$registerTreeContentProvider(treeContentProviderId); + public registerTreeContentProvider(providerId: string, provider: vscode.TreeContentProvider): vscode.Disposable { + this._proxy.$registerTreeContentProvider(providerId); + this._treeContentProviders[providerId] = provider; return new Disposable(() => { - if (delete this._treeContentProviders[treeContentProviderId]) { - this._proxy.$unregisterTreeContentProvider(treeContentProviderId); + if (delete this._treeContentProviders[providerId]) { + this._proxy.$unregisterTreeContentProvider(providerId); } }); } - $provideTextDocumentContent(treeContentProviderId: string): vscode.ITree { + $provideTreeContent(treeContentProviderId: string): TPromise { const provider = this._treeContentProviders[treeContentProviderId]; if (!provider) { throw new Error(`no TreeContentProvider registered with id '${treeContentProviderId}'`); } - return provider.provideTreeContent(); + return TPromise.wrap(provider.provideTreeContent().then(treeContent => { + return JSON.stringify(treeContent); + })); } } diff --git a/src/vs/workbench/api/node/mainThreadExplorers.ts b/src/vs/workbench/api/node/mainThreadExplorers.ts index 42f68184b19..3e31c82261e 100644 --- a/src/vs/workbench/api/node/mainThreadExplorers.ts +++ b/src/vs/workbench/api/node/mainThreadExplorers.ts @@ -1,19 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { ITreeNode } from 'vscode'; +import {TPromise} from 'vs/base/common/winjs.base'; import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; import {ExtHostContext, MainThreadExplorersShape, ExtHostExplorersShape} from './extHost.protocol'; +import {ITreeExplorerViewletService} from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService'; export class MainThreadExplorers extends MainThreadExplorersShape { private _proxy: ExtHostExplorersShape; constructor( - @IThreadService threadService: IThreadService + @IThreadService threadService: IThreadService, + @ITreeExplorerViewletService private treeExplorerViewletService: ITreeExplorerViewletService ) { super(); this._proxy = threadService.get(ExtHostContext.ExtHostExplorers); } - $registerTreeContentProvider(treeContentProviderId: string): void { - const tree = this._proxy.$provideTextDocumentContent(treeContentProviderId); + $registerTreeContentProvider(providerId: string): void { + this.treeExplorerViewletService.registerTreeContentProvider(providerId, { + provideTreeContent: (): TPromise => { + return this._proxy.$provideTreeContent(providerId).then(jsonTree => { + return JSON.parse(jsonTree); + }) + } + }); } $unregisterTreeContentProvider(treeContentProviderId: string): void { diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.contribution.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.contribution.ts index 5721dc1b88f..758d1f57b3e 100644 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.contribution.ts +++ b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.contribution.ts @@ -1,3 +1,8 @@ 'use strict'; -import 'vs/css!./media/treeExplorerViewlet.contribution'; \ No newline at end of file +import 'vs/css!./media/treeExplorerViewlet.contribution'; + +import {ITreeExplorerViewletService, TreeExplorerViewletService } from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +registerSingleton(ITreeExplorerViewletService, TreeExplorerViewletService); \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts index f7fd583e3d5..a1c991eb346 100644 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts +++ b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts @@ -50,6 +50,12 @@ export class TreeExplorerViewlet extends Viewlet { this.view.layout(dimension.height, Orientation.VERTICAL); } + setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + this.view.setVisible(visible).done(); + }) + } + private onConfigurationUpdated(config: ICustomViewletConfiguration): TPromise { return TPromise.as(null); } diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts new file mode 100644 index 00000000000..f899fc22680 --- /dev/null +++ b/src/vs/workbench/parts/explorers/browser/treeExplorerViewletService.ts @@ -0,0 +1,36 @@ +'use strict'; + +import { ITreeNode, TreeContentProvider } from 'vscode'; +import { TPromise } from 'vs/base/common/winjs.base'; +import Event, {Emitter} from 'vs/base/common/event'; +import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { TreeViewNode } from 'vs/workbench/parts/explorers/common/treeViewModel'; + +export const ITreeExplorerViewletService = createDecorator('customViewletService'); + +export interface ITreeExplorerViewletService { + _serviceBrand: any; + + registerTreeContentProvider(providerId: string, provider: TreeContentProvider): void; + provideTreeContent(providerId: string): TPromise; +} + +export class TreeExplorerViewletService implements ITreeExplorerViewletService { + public _serviceBrand: any; + + private _treeContentProviders: { [providerId: string]: TreeContentProvider; }; + + constructor( + @IInstantiationService private _instantiationService: IInstantiationService, + ) { + this._treeContentProviders = Object.create(null); + } + + registerTreeContentProvider(providerId: string, provider: TreeContentProvider): void { + this._treeContentProviders[providerId] = provider; + } + + provideTreeContent(providerId: string): TPromise { + return TPromise.wrap(this._treeContentProviders[providerId].provideTreeContent()); + } +} diff --git a/src/vs/workbench/parts/explorers/browser/views/treeView.ts b/src/vs/workbench/parts/explorers/browser/views/treeView.ts index 186a95ae222..411a0733e91 100644 --- a/src/vs/workbench/parts/explorers/browser/views/treeView.ts +++ b/src/vs/workbench/parts/explorers/browser/views/treeView.ts @@ -16,6 +16,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { ITreeExplorerViewletService } from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService'; import { ITree, IDataSource, IRenderer } from 'vs/base/parts/tree/browser/tree'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; @@ -61,7 +62,8 @@ export class TreeView extends CollapsibleViewletView { @IWorkspaceContextService private contextService: IWorkspaceContextService, @IInstantiationService private instantiationService: IInstantiationService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService private editorGroupService: IEditorGroupService + @IEditorGroupService private editorGroupService: IEditorGroupService, + @ITreeExplorerViewletService private treeExplorerViewletService: ITreeExplorerViewletService ) { super(actionRunner, false, nls.localize('treeExplorerViewletTree', "Tree Explorer Tree Section"), messageService, keybindingService, contextMenuService, headerSize); @@ -80,7 +82,9 @@ export class TreeView extends CollapsibleViewletView { DOM.addClass(this.treeContainer, 'tree-explorer-viewlet-tree-view'); this.tree = this.createViewer($(this.treeContainer)); - this.tree.setInput(getTree()); + this.treeExplorerViewletService.provideTreeContent('pineTree').then(tree => { + this.tree.setInput(tree); + }); } getActions(): IAction[] { @@ -90,7 +94,7 @@ export class TreeView extends CollapsibleViewletView { createViewer(container: Builder): ITree { const dataSource = this.instantiationService.createInstance(TreeDataSource); const renderer = this.instantiationService.createInstance(TreeRenderer, this.viewletState, this.actionRunner, container.getHTMLElement()); - const controller = null; + const controller = this.instantiationService.createInstance(TreeController); const sorter = null; const filter = null; const dnd = null; @@ -108,43 +112,19 @@ export class TreeView extends CollapsibleViewletView { } create(): TPromise { - this.toDispose.push(this.editorGroupService.onEditorsChanged(() => this.onEditorsChanged())) - return TPromise.as(null); - } - - private onEditorsChanged() { - const activeInput = this.editorService.getActiveEditorInput(); - - if (activeInput instanceof FileEditorInput) { - const fileResource = activeInput.getResource(); - - this.updateOutlineViewlet(fileResource); - } + return this.setVisible(true); } - refresh(): TPromise { - const input = this.tree.getInput(); - return this.doRefresh(); - } - - private doRefresh(): TPromise { - return TPromise.as(null); - } - - private updateOutlineViewlet(fileURI: URI): TPromise { - this.tree.setInput(getTree()); - /* - documentSymbols(fileURI.path).then(nodes => { - const root = nodes[0]; - this.tree.setInput(root); + setVisible(visible: boolean): TPromise { + return super.setVisible(visible).then(() => { + this.updateInput().done(); }); - */ - - return TPromise.as(null); } - focus(): void { - + private updateInput(): TPromise { + return this.treeExplorerViewletService.provideTreeContent('pineTree').then(tree => { + this.tree.setInput(tree); + }) } public getOptimalWidth(): number { diff --git a/src/vs/workbench/parts/explorers/browser/views/treeViewer.ts b/src/vs/workbench/parts/explorers/browser/views/treeViewer.ts index b6b52f6328e..af9adde2f8e 100644 --- a/src/vs/workbench/parts/explorers/browser/views/treeViewer.ts +++ b/src/vs/workbench/parts/explorers/browser/views/treeViewer.ts @@ -5,6 +5,7 @@ import { ITree, IDataSource, IRenderer, IElementCallback } from 'vs/base/parts/t import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { TreeViewNode } from 'vs/workbench/parts/explorers/common/treeViewModel'; import { DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { IActionRunner } from 'vs/base/common/actions'; import { IActionProvider, ActionsRenderer } from 'vs/base/parts/tree/browser/actionsRenderer'; @@ -25,7 +26,7 @@ export class TreeDataSource implements IDataSource { } public hasChildren(tree: ITree, node: TreeViewNode): boolean { - return node.children.length > 0; + return node.children && node.children.length > 0; } public getChildren(tree: ITree, node: TreeViewNode): TPromise { @@ -74,6 +75,11 @@ export class TreeRenderer extends ActionsRenderer implements IRenderer { export class TreeController extends DefaultController { + /* protected */ public onLeftClick(tree: ITree, node: TreeViewNode, event: IMouseEvent, origin: string = 'mouse'): boolean { + super.onLeftClick(tree, node, event, origin); + console.log(node.label); + return true; + } } export interface ITreeExplorerViewletState { diff --git a/src/vs/workbench/parts/explorers/common/treeViewModel.ts b/src/vs/workbench/parts/explorers/common/treeViewModel.ts index 8d0cd3cdfe6..4a08ef46063 100644 --- a/src/vs/workbench/parts/explorers/common/treeViewModel.ts +++ b/src/vs/workbench/parts/explorers/common/treeViewModel.ts @@ -1,17 +1,16 @@ - export class TreeViewNode implements vscode.ITreeNode { id: number; label: string; isExpanded: boolean; - parent: vscode.ITreeNode; - children: vscode.ITreeNode[]; + parent: TreeViewNode + children: TreeViewNode[]; constructor( id: number, label: string, isExpanded: boolean = true, - parent: vscode.ITreeNode = null, - children: vscode.ITreeNode[] = []) { + parent: TreeViewNode = null, + children: TreeViewNode[] = []) { this.id = id; this.label = label; this.isExpanded = isExpanded; @@ -19,7 +18,7 @@ export class TreeViewNode implements vscode.ITreeNode { this.children = children; } - addChild(child: vscode.ITreeNode) { + addChild(child: TreeViewNode) { this.children.push(child); child.parent = this; } -- GitLab