提交 d8c0af7f 编写于 作者: P Pine Wu

Hook up provider mechanism and add onClick

上级 d03ea815
...@@ -1349,18 +1349,12 @@ declare module 'vscode' { ...@@ -1349,18 +1349,12 @@ declare module 'vscode' {
} }
export interface TreeContentProvider { export interface TreeContentProvider {
id: string; provideTreeContent(): Thenable<ITreeNode>;
provideTreeContent(): ITree;
}
export interface ITree {
root: ITreeNode;
} }
export interface ITreeNode { export interface ITreeNode {
label: string; label: string;
isExpanded: boolean; isExpanded: boolean;
parent: ITreeNode;
children: ITreeNode[] children: ITreeNode[]
} }
...@@ -3819,7 +3813,7 @@ declare module 'vscode' { ...@@ -3819,7 +3813,7 @@ declare module 'vscode' {
*/ */
export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable; 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. * An event that is emitted when a [text document](#TextDocument) is opened.
......
...@@ -335,6 +335,9 @@ export function createApiFactory(threadService: IThreadService, extensionService ...@@ -335,6 +335,9 @@ export function createApiFactory(threadService: IThreadService, extensionService
onWillSaveTextDocument: (listener, thisArgs?, disposables?) => { onWillSaveTextDocument: (listener, thisArgs?, disposables?) => {
return extHostDocumentSaveParticipant.onWillSaveTextDocumentEvent(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[]) => { onDidChangeConfiguration: (listener: () => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => {
return extHostConfiguration.onDidChangeConfiguration(listener, thisArgs, disposables); return extHostConfiguration.onDidChangeConfiguration(listener, thisArgs, disposables);
}, },
......
...@@ -263,7 +263,7 @@ export abstract class ExtHostEditorsShape { ...@@ -263,7 +263,7 @@ export abstract class ExtHostEditorsShape {
} }
export abstract class ExtHostExplorersShape { export abstract class ExtHostExplorersShape {
$provideTextDocumentContent(treeContentProviderId: string): vscode.ITree { throw ni(); }; $provideTreeContent(treeContentProviderId: string): TPromise<string> { throw ni(); };
} }
export abstract class ExtHostExtensionServiceShape { export abstract class ExtHostExtensionServiceShape {
......
...@@ -15,7 +15,9 @@ export class ExtHostExplorers extends ExtHostExplorersShape { ...@@ -15,7 +15,9 @@ export class ExtHostExplorers extends ExtHostExplorersShape {
private _treeContentProviders: { [treeContentProviderId: string]: vscode.TreeContentProvider; }; private _treeContentProviders: { [treeContentProviderId: string]: vscode.TreeContentProvider; };
constructor(threadService: IThreadService) { constructor(
threadService: IThreadService
) {
super(); super();
this._proxy = threadService.get(MainContext.MainThreadExplorers); this._proxy = threadService.get(MainContext.MainThreadExplorers);
...@@ -23,29 +25,25 @@ export class ExtHostExplorers extends ExtHostExplorersShape { ...@@ -23,29 +25,25 @@ export class ExtHostExplorers extends ExtHostExplorersShape {
this._treeContentProviders = Object.create(null); this._treeContentProviders = Object.create(null);
} }
public registerTreeContentProvider(provider: vscode.TreeContentProvider): vscode.Disposable { public registerTreeContentProvider(providerId: string, provider: vscode.TreeContentProvider): vscode.Disposable {
const treeContentProviderId = provider.id; this._proxy.$registerTreeContentProvider(providerId);
this._treeContentProviders[providerId] = provider;
if (this._treeContentProviders[treeContentProviderId]) {
throw new Error(`TreeContentProvider with id '${provider.id} already registered`);
}
this._treeContentProviders[treeContentProviderId] = provider;
this._proxy.$registerTreeContentProvider(treeContentProviderId);
return new Disposable(() => { return new Disposable(() => {
if (delete this._treeContentProviders[treeContentProviderId]) { if (delete this._treeContentProviders[providerId]) {
this._proxy.$unregisterTreeContentProvider(treeContentProviderId); this._proxy.$unregisterTreeContentProvider(providerId);
} }
}); });
} }
$provideTextDocumentContent(treeContentProviderId: string): vscode.ITree { $provideTreeContent(treeContentProviderId: string): TPromise<string> {
const provider = this._treeContentProviders[treeContentProviderId]; const provider = this._treeContentProviders[treeContentProviderId];
if (!provider) { if (!provider) {
throw new Error(`no TreeContentProvider registered with id '${treeContentProviderId}'`); throw new Error(`no TreeContentProvider registered with id '${treeContentProviderId}'`);
} }
return provider.provideTreeContent(); return TPromise.wrap(provider.provideTreeContent().then(treeContent => {
return JSON.stringify(treeContent);
}));
} }
} }
/*---------------------------------------------------------------------------------------------
* 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 {IThreadService} from 'vs/workbench/services/thread/common/threadService';
import {ExtHostContext, MainThreadExplorersShape, ExtHostExplorersShape} from './extHost.protocol'; import {ExtHostContext, MainThreadExplorersShape, ExtHostExplorersShape} from './extHost.protocol';
import {ITreeExplorerViewletService} from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService';
export class MainThreadExplorers extends MainThreadExplorersShape { export class MainThreadExplorers extends MainThreadExplorersShape {
private _proxy: ExtHostExplorersShape; private _proxy: ExtHostExplorersShape;
constructor( constructor(
@IThreadService threadService: IThreadService @IThreadService threadService: IThreadService,
@ITreeExplorerViewletService private treeExplorerViewletService: ITreeExplorerViewletService
) { ) {
super(); super();
this._proxy = threadService.get(ExtHostContext.ExtHostExplorers); this._proxy = threadService.get(ExtHostContext.ExtHostExplorers);
} }
$registerTreeContentProvider(treeContentProviderId: string): void { $registerTreeContentProvider(providerId: string): void {
const tree = this._proxy.$provideTextDocumentContent(treeContentProviderId); this.treeExplorerViewletService.registerTreeContentProvider(providerId, {
provideTreeContent: (): TPromise<ITreeNode> => {
return this._proxy.$provideTreeContent(providerId).then(jsonTree => {
return <ITreeNode>JSON.parse(jsonTree);
})
}
});
} }
$unregisterTreeContentProvider(treeContentProviderId: string): void { $unregisterTreeContentProvider(treeContentProviderId: string): void {
......
'use strict'; 'use strict';
import 'vs/css!./media/treeExplorerViewlet.contribution'; import 'vs/css!./media/treeExplorerViewlet.contribution';
\ No newline at end of file
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
...@@ -50,6 +50,12 @@ export class TreeExplorerViewlet extends Viewlet { ...@@ -50,6 +50,12 @@ export class TreeExplorerViewlet extends Viewlet {
this.view.layout(dimension.height, Orientation.VERTICAL); this.view.layout(dimension.height, Orientation.VERTICAL);
} }
setVisible(visible: boolean): TPromise<void> {
return super.setVisible(visible).then(() => {
this.view.setVisible(visible).done();
})
}
private onConfigurationUpdated(config: ICustomViewletConfiguration): TPromise<void> { private onConfigurationUpdated(config: ICustomViewletConfiguration): TPromise<void> {
return TPromise.as(null); return TPromise.as(null);
} }
......
'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<ITreeExplorerViewletService>('customViewletService');
export interface ITreeExplorerViewletService {
_serviceBrand: any;
registerTreeContentProvider(providerId: string, provider: TreeContentProvider): void;
provideTreeContent(providerId: string): TPromise<ITreeNode>;
}
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<ITreeNode> {
return TPromise.wrap(this._treeContentProviders[providerId].provideTreeContent());
}
}
...@@ -16,6 +16,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace ...@@ -16,6 +16,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; 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 { ITree, IDataSource, IRenderer } from 'vs/base/parts/tree/browser/tree';
import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl';
...@@ -61,7 +62,8 @@ export class TreeView extends CollapsibleViewletView { ...@@ -61,7 +62,8 @@ export class TreeView extends CollapsibleViewletView {
@IWorkspaceContextService private contextService: IWorkspaceContextService, @IWorkspaceContextService private contextService: IWorkspaceContextService,
@IInstantiationService private instantiationService: IInstantiationService, @IInstantiationService private instantiationService: IInstantiationService,
@IWorkbenchEditorService private editorService: IWorkbenchEditorService, @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); super(actionRunner, false, nls.localize('treeExplorerViewletTree', "Tree Explorer Tree Section"), messageService, keybindingService, contextMenuService, headerSize);
...@@ -80,7 +82,9 @@ export class TreeView extends CollapsibleViewletView { ...@@ -80,7 +82,9 @@ export class TreeView extends CollapsibleViewletView {
DOM.addClass(this.treeContainer, 'tree-explorer-viewlet-tree-view'); DOM.addClass(this.treeContainer, 'tree-explorer-viewlet-tree-view');
this.tree = this.createViewer($(this.treeContainer)); this.tree = this.createViewer($(this.treeContainer));
this.tree.setInput(getTree()); this.treeExplorerViewletService.provideTreeContent('pineTree').then(tree => {
this.tree.setInput(tree);
});
} }
getActions(): IAction[] { getActions(): IAction[] {
...@@ -90,7 +94,7 @@ export class TreeView extends CollapsibleViewletView { ...@@ -90,7 +94,7 @@ export class TreeView extends CollapsibleViewletView {
createViewer(container: Builder): ITree { createViewer(container: Builder): ITree {
const dataSource = this.instantiationService.createInstance(TreeDataSource); const dataSource = this.instantiationService.createInstance(TreeDataSource);
const renderer = this.instantiationService.createInstance(TreeRenderer, this.viewletState, this.actionRunner, container.getHTMLElement()); 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 sorter = null;
const filter = null; const filter = null;
const dnd = null; const dnd = null;
...@@ -108,43 +112,19 @@ export class TreeView extends CollapsibleViewletView { ...@@ -108,43 +112,19 @@ export class TreeView extends CollapsibleViewletView {
} }
create(): TPromise<void> { create(): TPromise<void> {
this.toDispose.push(this.editorGroupService.onEditorsChanged(() => this.onEditorsChanged())) return this.setVisible(true);
return TPromise.as(null);
}
private onEditorsChanged() {
const activeInput = this.editorService.getActiveEditorInput();
if (activeInput instanceof FileEditorInput) {
const fileResource = activeInput.getResource();
this.updateOutlineViewlet(fileResource);
}
} }
refresh(): TPromise<void> { setVisible(visible: boolean): TPromise<void> {
const input = this.tree.getInput(); return super.setVisible(visible).then(() => {
return this.doRefresh(); this.updateInput().done();
}
private doRefresh(): TPromise<void> {
return TPromise.as(null);
}
private updateOutlineViewlet(fileURI: URI): TPromise<void> {
this.tree.setInput(getTree());
/*
documentSymbols(fileURI.path).then(nodes => {
const root = nodes[0];
this.tree.setInput(root);
}); });
*/
return TPromise.as(null);
} }
focus(): void { private updateInput(): TPromise<void> {
return this.treeExplorerViewletService.provideTreeContent('pineTree').then(tree => {
this.tree.setInput(tree);
})
} }
public getOptimalWidth(): number { public getOptimalWidth(): number {
......
...@@ -5,6 +5,7 @@ import { ITree, IDataSource, IRenderer, IElementCallback } from 'vs/base/parts/t ...@@ -5,6 +5,7 @@ import { ITree, IDataSource, IRenderer, IElementCallback } from 'vs/base/parts/t
import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl';
import { TreeViewNode } from 'vs/workbench/parts/explorers/common/treeViewModel'; import { TreeViewNode } from 'vs/workbench/parts/explorers/common/treeViewModel';
import { DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; import { DefaultController } from 'vs/base/parts/tree/browser/treeDefaults';
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
import { IActionRunner } from 'vs/base/common/actions'; import { IActionRunner } from 'vs/base/common/actions';
import { IActionProvider, ActionsRenderer } from 'vs/base/parts/tree/browser/actionsRenderer'; import { IActionProvider, ActionsRenderer } from 'vs/base/parts/tree/browser/actionsRenderer';
...@@ -25,7 +26,7 @@ export class TreeDataSource implements IDataSource { ...@@ -25,7 +26,7 @@ export class TreeDataSource implements IDataSource {
} }
public hasChildren(tree: ITree, node: TreeViewNode): boolean { 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<TreeViewNode[]> { public getChildren(tree: ITree, node: TreeViewNode): TPromise<TreeViewNode[]> {
...@@ -74,6 +75,11 @@ export class TreeRenderer extends ActionsRenderer implements IRenderer { ...@@ -74,6 +75,11 @@ export class TreeRenderer extends ActionsRenderer implements IRenderer {
export class TreeController extends DefaultController { 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 { export interface ITreeExplorerViewletState {
......
export class TreeViewNode implements vscode.ITreeNode { export class TreeViewNode implements vscode.ITreeNode {
id: number; id: number;
label: string; label: string;
isExpanded: boolean; isExpanded: boolean;
parent: vscode.ITreeNode; parent: TreeViewNode
children: vscode.ITreeNode[]; children: TreeViewNode[];
constructor( constructor(
id: number, id: number,
label: string, label: string,
isExpanded: boolean = true, isExpanded: boolean = true,
parent: vscode.ITreeNode = null, parent: TreeViewNode = null,
children: vscode.ITreeNode[] = []) { children: TreeViewNode[] = []) {
this.id = id; this.id = id;
this.label = label; this.label = label;
this.isExpanded = isExpanded; this.isExpanded = isExpanded;
...@@ -19,7 +18,7 @@ export class TreeViewNode implements vscode.ITreeNode { ...@@ -19,7 +18,7 @@ export class TreeViewNode implements vscode.ITreeNode {
this.children = children; this.children = children;
} }
addChild(child: vscode.ITreeNode) { addChild(child: TreeViewNode) {
this.children.push(child); this.children.push(child);
child.parent = this; child.parent = this;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册