提交 8cfe1716 编写于 作者: S Sandeep Somavarapu

Use element as handle when element is a string identifier

上级 5a89b5c2
...@@ -156,16 +156,16 @@ class ExtHostTreeView<T> extends Disposable { ...@@ -156,16 +156,16 @@ class ExtHostTreeView<T> extends Disposable {
private resolveElement(element: T, index: number, parentHandle?: TreeItemHandle): TPromise<ITreeItem> { private resolveElement(element: T, index: number, parentHandle?: TreeItemHandle): TPromise<ITreeItem> {
return asWinJsPromise(() => this.dataProvider.getTreeItem(element)) return asWinJsPromise(() => this.dataProvider.getTreeItem(element))
.then(extTreeItem => this.massageTreeItem(extTreeItem, index, parentHandle)); .then(extTreeItem => this.massageTreeItem(element, extTreeItem, index, parentHandle));
} }
private massageTreeItem(extensionTreeItem: vscode.TreeItem, index: number, parentHandle: TreeItemHandle): ITreeItem { private massageTreeItem(element: T, extensionTreeItem: vscode.TreeItem, index: number, parentHandle: TreeItemHandle): ITreeItem {
if (!extensionTreeItem) { if (!extensionTreeItem) {
return null; return null;
} }
const icon = this.getLightIconPath(extensionTreeItem); const icon = this.getLightIconPath(extensionTreeItem);
const label = extensionTreeItem.label; const label = extensionTreeItem.label;
const handle = this.generateHandle(label, index, parentHandle); const handle = typeof element === 'string' ? element : this.generateHandle(label, index, parentHandle);
return { return {
handle, handle,
parentHandle, parentHandle,
......
...@@ -22,7 +22,6 @@ import { TreeItemCollapsibleState, ITreeItem } from 'vs/workbench/common/views'; ...@@ -22,7 +22,6 @@ import { TreeItemCollapsibleState, ITreeItem } from 'vs/workbench/common/views';
suite('ExtHostTreeView', function () { suite('ExtHostTreeView', function () {
class RecordingShape extends mock<MainThreadTreeViewsShape>() { class RecordingShape extends mock<MainThreadTreeViewsShape>() {
onRefresh = new Emitter<{ [treeItemHandle: string]: ITreeItem }>(); onRefresh = new Emitter<{ [treeItemHandle: string]: ITreeItem }>();
...@@ -37,9 +36,9 @@ suite('ExtHostTreeView', function () { ...@@ -37,9 +36,9 @@ suite('ExtHostTreeView', function () {
let testObject: ExtHostTreeViews; let testObject: ExtHostTreeViews;
let target: RecordingShape; let target: RecordingShape;
let onDidChangeTreeData: Emitter<string>; let onDidChangeTreeNode: Emitter<{ key: string }>;
let tree; let onDidChangeTreeKey: Emitter<string>;
let labels; let tree, labels, nodes;
setup(() => { setup(() => {
tree = { tree = {
...@@ -54,6 +53,7 @@ suite('ExtHostTreeView', function () { ...@@ -54,6 +53,7 @@ suite('ExtHostTreeView', function () {
}; };
labels = {}; labels = {};
nodes = {};
let threadService = new TestThreadService(); let threadService = new TestThreadService();
// Use IInstantiationService to get typechecking when instantiating // Use IInstantiationService to get typechecking when instantiating
...@@ -66,38 +66,68 @@ suite('ExtHostTreeView', function () { ...@@ -66,38 +66,68 @@ suite('ExtHostTreeView', function () {
threadService.setTestInstance(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, threadService)); threadService.setTestInstance(MainContext.MainThreadCommands, inst.createInstance(MainThreadCommands, threadService));
target = new RecordingShape(); target = new RecordingShape();
testObject = new ExtHostTreeViews(target, new ExtHostCommands(threadService, new ExtHostHeapService())); testObject = new ExtHostTreeViews(target, new ExtHostCommands(threadService, new ExtHostHeapService()));
onDidChangeTreeData = new Emitter<string>(); onDidChangeTreeNode = new Emitter<{ key: string }>();
testObject.registerTreeDataProvider('testDataProvider', aTreeDataProvider()); onDidChangeTreeKey = new Emitter<string>();
testObject.registerTreeDataProvider('testNodeTreeProvider', aNodeTreeDataProvider());
testObject.registerTreeDataProvider('testStringTreeProvider', aStringTreeDataProvider());
testObject.$getElements('testDataProvider').then(elements => { testObject.$getElements('testNodeTreeProvider').then(elements => {
for (const element of elements) { for (const element of elements) {
testObject.$getChildren('testDataProvider', element.handle); testObject.$getChildren('testNodeTreeProvider', element.handle);
} }
}); });
}); });
test('construct tree', () => { test('construct node tree', () => {
return testObject.$getElements('testDataProvider') return testObject.$getElements('testNodeTreeProvider')
.then(elements => { .then(elements => {
const actuals = elements.map(e => e.handle); const actuals = elements.map(e => e.handle);
assert.deepEqual(actuals, ['0/0:a', '0/1:b']); assert.deepEqual(actuals, ['0/0:a', '0/1:b']);
return TPromise.join([ return TPromise.join([
testObject.$getChildren('testDataProvider', '0/0:a') testObject.$getChildren('testNodeTreeProvider', '0/0:a')
.then(children => { .then(children => {
const actuals = children.map(e => e.handle); const actuals = children.map(e => e.handle);
assert.deepEqual(actuals, ['0/0:a/0:aa', '0/0:a/1:ab']); assert.deepEqual(actuals, ['0/0:a/0:aa', '0/0:a/1:ab']);
return TPromise.join([ return TPromise.join([
testObject.$getChildren('testDataProvider', '0/0:a/0:aa').then(children => assert.equal(children.length, 0)), testObject.$getChildren('testNodeTreeProvider', '0/0:a/0:aa').then(children => assert.equal(children.length, 0)),
testObject.$getChildren('testDataProvider', '0/0:a/1:ab').then(children => assert.equal(children.length, 0)) testObject.$getChildren('testNodeTreeProvider', '0/0:a/1:ab').then(children => assert.equal(children.length, 0))
]); ]);
}), }),
testObject.$getChildren('testDataProvider', '0/1:b') testObject.$getChildren('testNodeTreeProvider', '0/1:b')
.then(children => { .then(children => {
const actuals = children.map(e => e.handle); const actuals = children.map(e => e.handle);
assert.deepEqual(actuals, ['0/1:b/0:ba', '0/1:b/1:bb']); assert.deepEqual(actuals, ['0/1:b/0:ba', '0/1:b/1:bb']);
return TPromise.join([ return TPromise.join([
testObject.$getChildren('testDataProvider', '0/1:b/0:ba').then(children => assert.equal(children.length, 0)), testObject.$getChildren('testNodeTreeProvider', '0/1:b/0:ba').then(children => assert.equal(children.length, 0)),
testObject.$getChildren('testDataProvider', '0/1:b/1:bb').then(children => assert.equal(children.length, 0)) testObject.$getChildren('testNodeTreeProvider', '0/1:b/1:bb').then(children => assert.equal(children.length, 0))
]);
})
]);
});
});
test('construct string tree', () => {
return testObject.$getElements('testStringTreeProvider')
.then(elements => {
const actuals = elements.map(e => e.handle);
assert.deepEqual(actuals, ['a', 'b']);
return TPromise.join([
testObject.$getChildren('testStringTreeProvider', 'a')
.then(children => {
const actuals = children.map(e => e.handle);
assert.deepEqual(actuals, ['aa', 'ab']);
return TPromise.join([
testObject.$getChildren('testStringTreeProvider', 'aa').then(children => assert.equal(children.length, 0)),
testObject.$getChildren('testStringTreeProvider', 'ab').then(children => assert.equal(children.length, 0))
]);
}),
testObject.$getChildren('testStringTreeProvider', 'b')
.then(children => {
const actuals = children.map(e => e.handle);
assert.deepEqual(actuals, ['ba', 'bb']);
return TPromise.join([
testObject.$getChildren('testStringTreeProvider', 'ba').then(children => assert.equal(children.length, 0)),
testObject.$getChildren('testStringTreeProvider', 'bb').then(children => assert.equal(children.length, 0))
]); ]);
}) })
]); ]);
...@@ -109,7 +139,7 @@ suite('ExtHostTreeView', function () { ...@@ -109,7 +139,7 @@ suite('ExtHostTreeView', function () {
assert.equal(undefined, actuals); assert.equal(undefined, actuals);
done(); done();
}); });
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
}); });
test('refresh a parent node', () => { test('refresh a parent node', () => {
...@@ -122,7 +152,7 @@ suite('ExtHostTreeView', function () { ...@@ -122,7 +152,7 @@ suite('ExtHostTreeView', function () {
}); });
c(null); c(null);
}); });
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
}); });
}); });
...@@ -136,7 +166,7 @@ suite('ExtHostTreeView', function () { ...@@ -136,7 +166,7 @@ suite('ExtHostTreeView', function () {
}); });
done(); done();
}); });
onDidChangeTreeData.fire('bb'); onDidChangeTreeNode.fire(getNode('bb'));
}); });
test('refresh parent and child node trigger refresh only on parent - scenario 1', function (done) { test('refresh parent and child node trigger refresh only on parent - scenario 1', function (done) {
...@@ -153,9 +183,9 @@ suite('ExtHostTreeView', function () { ...@@ -153,9 +183,9 @@ suite('ExtHostTreeView', function () {
}); });
done(); done();
}); });
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire('aa'); onDidChangeTreeNode.fire(getNode('aa'));
onDidChangeTreeData.fire('bb'); onDidChangeTreeNode.fire(getNode('bb'));
}); });
test('refresh parent and child node trigger refresh only on parent - scenario 2', function (done) { test('refresh parent and child node trigger refresh only on parent - scenario 2', function (done) {
...@@ -172,9 +202,9 @@ suite('ExtHostTreeView', function () { ...@@ -172,9 +202,9 @@ suite('ExtHostTreeView', function () {
}); });
done(); done();
}); });
onDidChangeTreeData.fire('bb'); onDidChangeTreeNode.fire(getNode('bb'));
onDidChangeTreeData.fire('aa'); onDidChangeTreeNode.fire(getNode('aa'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
}); });
test('refresh an element for label change', function (done) { test('refresh an element for label change', function (done) {
...@@ -187,7 +217,7 @@ suite('ExtHostTreeView', function () { ...@@ -187,7 +217,7 @@ suite('ExtHostTreeView', function () {
}); });
done(); done();
}); });
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
}); });
test('refresh calls are throttled on roots', function (done) { test('refresh calls are throttled on roots', function (done) {
...@@ -195,10 +225,10 @@ suite('ExtHostTreeView', function () { ...@@ -195,10 +225,10 @@ suite('ExtHostTreeView', function () {
assert.equal(undefined, actuals); assert.equal(undefined, actuals);
done(); done();
}); });
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
}); });
test('refresh calls are throttled on elements', function (done) { test('refresh calls are throttled on elements', function (done) {
...@@ -207,10 +237,10 @@ suite('ExtHostTreeView', function () { ...@@ -207,10 +237,10 @@ suite('ExtHostTreeView', function () {
done(); done();
}); });
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
}); });
test('refresh calls are throttled on unknown elements', function (done) { test('refresh calls are throttled on unknown elements', function (done) {
...@@ -219,10 +249,10 @@ suite('ExtHostTreeView', function () { ...@@ -219,10 +249,10 @@ suite('ExtHostTreeView', function () {
done(); done();
}); });
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire('g'); onDidChangeTreeNode.fire(getNode('g'));
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
}); });
test('refresh calls are throttled on unknown elements and root', function (done) { test('refresh calls are throttled on unknown elements and root', function (done) {
...@@ -231,10 +261,10 @@ suite('ExtHostTreeView', function () { ...@@ -231,10 +261,10 @@ suite('ExtHostTreeView', function () {
done(); done();
}); });
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire('g'); onDidChangeTreeNode.fire(getNode('g'));
onDidChangeTreeData.fire(''); onDidChangeTreeNode.fire();
}); });
test('refresh calls are throttled on elements and root', function (done) { test('refresh calls are throttled on elements and root', function (done) {
...@@ -243,10 +273,10 @@ suite('ExtHostTreeView', function () { ...@@ -243,10 +273,10 @@ suite('ExtHostTreeView', function () {
done(); done();
}); });
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
onDidChangeTreeData.fire('b'); onDidChangeTreeNode.fire(getNode('b'));
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
onDidChangeTreeData.fire('a'); onDidChangeTreeNode.fire(getNode('a'));
}); });
test('generate unique handles from labels by escaping them', () => { test('generate unique handles from labels by escaping them', () => {
...@@ -254,9 +284,9 @@ suite('ExtHostTreeView', function () { ...@@ -254,9 +284,9 @@ suite('ExtHostTreeView', function () {
'a/0:b': {} 'a/0:b': {}
}; };
onDidChangeTreeData.fire(); onDidChangeTreeNode.fire();
return testObject.$getElements('testDataProvider') return testObject.$getElements('testNodeTreeProvider')
.then(elements => { .then(elements => {
assert.deepEqual(elements.map(e => e.handle), ['0/0:a//0:b']); assert.deepEqual(elements.map(e => e.handle), ['0/0:a//0:b']);
}); });
...@@ -272,8 +302,31 @@ suite('ExtHostTreeView', function () { ...@@ -272,8 +302,31 @@ suite('ExtHostTreeView', function () {
return result; return result;
} }
function aTreeDataProvider(): TreeDataProvider<string> { function aNodeTreeDataProvider(): TreeDataProvider<{ key: string }> {
const getTreeElement = (element) => { return {
getChildren: (element: { key: string }): { key: string }[] => {
return getChildren(element ? element.key : undefined).map(key => getNode(key));
},
getTreeItem: (element: { key: string }): TreeItem => {
return getTreeItem(element.key);
},
onDidChangeTreeData: onDidChangeTreeNode.event
};
}
function aStringTreeDataProvider(): TreeDataProvider<string> {
return {
getChildren: (element: string): string[] => {
return getChildren(element);
},
getTreeItem: (element: string): TreeItem => {
return getTreeItem(element);
},
onDidChangeTreeData: onDidChangeTreeKey.event
};
}
function getTreeElement(element): any {
let parent = tree; let parent = tree;
for (let i = 0; i < element.length; i++) { for (let i = 0; i < element.length; i++) {
parent = parent[element.substring(0, i + 1)]; parent = parent[element.substring(0, i + 1)];
...@@ -282,13 +335,13 @@ suite('ExtHostTreeView', function () { ...@@ -282,13 +335,13 @@ suite('ExtHostTreeView', function () {
} }
} }
return parent; return parent;
}; }
return {
getChildren: (element: string): string[] => { function getChildren(key: string): string[] {
if (!element) { if (!key) {
return Object.keys(tree); return Object.keys(tree);
} }
let treeElement = getTreeElement(element); let treeElement = getTreeElement(key);
if (treeElement) { if (treeElement) {
const children = Object.keys(treeElement); const children = Object.keys(treeElement);
const collapsibleStateIndex = children.indexOf('collapsibleState'); const collapsibleStateIndex = children.indexOf('collapsibleState');
...@@ -298,16 +351,21 @@ suite('ExtHostTreeView', function () { ...@@ -298,16 +351,21 @@ suite('ExtHostTreeView', function () {
return children; return children;
} }
return []; return [];
}, }
getTreeItem: (element: string): TreeItem => {
const treeElement = getTreeElement(element); function getTreeItem(key: string): TreeItem {
const treeElement = getTreeElement(key);
return { return {
label: labels[element] || element, label: labels[key] || key,
collapsibleState: treeElement ? treeElement['collapsibleState'] : TreeItemCollapsibleState.Collapsed collapsibleState: treeElement ? treeElement['collapsibleState'] : TreeItemCollapsibleState.Collapsed
}; };
}, }
onDidChangeTreeData: onDidChangeTreeData.event
}; function getNode(key: string): { key: string } {
if (!nodes[key]) {
nodes[key] = { key };
}
return nodes[key];
} }
}); });
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册