treeViewer.ts 3.9 KB
Newer Older
1 2 3 4 5 6
import { TPromise } from 'vs/base/common/winjs.base';
import { $, Builder } from 'vs/base/browser/builder';

import { ITree, IDataSource, IRenderer, IElementCallback } from 'vs/base/parts/tree/browser/tree';
import { Tree } from 'vs/base/parts/tree/browser/treeImpl';
import { TreeViewNode } from 'vs/workbench/parts/explorers/common/treeViewModel';
7
import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults';
8
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
9 10

import { IActionRunner } from 'vs/base/common/actions';
P
Pine Wu 已提交
11 12
import { IActionProvider, ActionsRenderer } from 'vs/base/parts/tree/browser/actionsRenderer';
import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry';
13 14 15 16

import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
import { IModeService } from 'vs/editor/common/services/modeService';
P
Pine Wu 已提交
17
import { ITreeExplorerViewletService } from 'vs/workbench/parts/explorers/browser/treeExplorerViewletService';
18

P
Pine Wu 已提交
19
const providerId = 'pineTree';
20

P
Pine Wu 已提交
21 22 23 24
export class TreeDataSource implements IDataSource {
	constructor(
		@ITreeExplorerViewletService private treeExplorerViewletService: ITreeExplorerViewletService
	) {
25 26 27

	}

P
Pine Wu 已提交
28 29
	getId(tree: ITree, node: TreeViewNode): string {
		return node.id.toString();
30 31
	}

P
Pine Wu 已提交
32 33
	hasChildren(tree: ITree, node: TreeViewNode): boolean {
		return node.hasChildren;
34 35
	}

P
Pine Wu 已提交
36
	getChildren(tree: ITree, node: TreeViewNode): TPromise<TreeViewNode[]> {
P
Pine Wu 已提交
37 38 39 40 41
		if (node.isChildrenResolved) {
			return TPromise.as(node.children);
		} else {
			return this.treeExplorerViewletService.resolveChildren(providerId, node).then(children => {
				children.forEach(child => {
P
Pine Wu 已提交
42
					node.children.push(TreeViewNode.create(child));
P
Pine Wu 已提交
43 44 45 46 47
				});
				node.isChildrenResolved = true;
				return node.children;
			});
		}
48 49
	}

P
Pine Wu 已提交
50
	getParent(tree: ITree, node: TreeViewNode): TPromise<TreeViewNode> {
51 52 53 54 55 56 57
		return TPromise.as(null);
	}
}

export class TreeRenderer extends ActionsRenderer implements IRenderer {

	constructor(
P
Pine Wu 已提交
58
		state: TreeExplorerViewletState,
59 60 61 62 63 64 65
		actionRunner: IActionRunner,
		private container: HTMLElement,
		@IContextViewService private contextViewService: IContextViewService,
		@IExtensionService private extensionService: IExtensionService,
		@IModeService private modeService: IModeService
	) {
		super({
P
Pine Wu 已提交
66
			actionProvider: state.actionProvider,
67 68 69 70
			actionRunner: actionRunner
		});
	}

P
Pine Wu 已提交
71
	getContentHeight(tree: ITree, element: any): number {
72 73 74
		return 22;
	}

P
Pine Wu 已提交
75
	renderContents(tree: ITree, node: TreeViewNode, domElement: HTMLElement, previousCleanupFn: IElementCallback): IElementCallback {
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
		const el = $(domElement).clearChildren();
		const item = $('.custom-viewlet-tree-node-item');
		item.appendTo(el);
		return this.renderFileFolderLabel(item, node);
	}

	private renderFileFolderLabel(container: Builder, node: TreeViewNode): IElementCallback {
		const label = $('.custom-viewlet-tree-node-item-label').appendTo(container);
		$('a.plain').text(node.label).title(node.label).appendTo(label);

		return null;
	}
}

export class TreeController extends DefaultController {

P
Pine Wu 已提交
92
	constructor() {
P
Pine Wu 已提交
93
		super({ clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change to not break DND */ });
P
Pine Wu 已提交
94 95
	}

P
Pine Wu 已提交
96
	onLeftClick(tree: ITree, node: TreeViewNode, event: IMouseEvent, origin: string = 'mouse'): boolean {
97
		super.onLeftClick(tree, node, event, origin);
P
Pine Wu 已提交
98

99 100
		return true;
	}
P
Pine Wu 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
}

export interface ITreeExplorerViewletState {
	actionProvider: IActionProvider;
}

export class TreeExplorerActionProvider extends ContributableActionProvider {
	private state: TreeExplorerViewletState;

	constructor(state: TreeExplorerViewletState) {
		super();

		this.state = state;
	}
}

export class TreeExplorerViewletState implements ITreeExplorerViewletState {
	private _actionProvider: TreeExplorerActionProvider;

	constructor() {
		this._actionProvider = new TreeExplorerActionProvider(this);
	}

	get actionProvider() { return this._actionProvider; }
125
}