2018-10-29 19:09:34 +01:00
|
|
|
import * as vscode from 'vscode';
|
|
|
|
|
|
|
|
|
|
export class TestView {
|
|
|
|
|
|
|
|
|
|
constructor(context: vscode.ExtensionContext) {
|
2018-10-29 19:30:50 +01:00
|
|
|
const view = vscode.window.createTreeView('testView', { treeDataProvider: aNodeWithIdTreeDataProvider(), showCollapseAll: true });
|
2018-10-29 19:09:34 +01:00
|
|
|
vscode.commands.registerCommand('testView.reveal', async () => {
|
2018-10-29 19:30:50 +01:00
|
|
|
const key = await vscode.window.showInputBox({ placeHolder: 'Type the label of the item to reveal' });
|
2018-10-29 19:09:34 +01:00
|
|
|
if (key) {
|
2018-10-29 19:30:50 +01:00
|
|
|
await view.reveal({ key }, { focus: true, select: false, expand: true });
|
2018-10-29 19:09:34 +01:00
|
|
|
}
|
|
|
|
|
});
|
2019-10-09 17:29:14 +02:00
|
|
|
vscode.commands.registerCommand('testView.changeTitle', async () => {
|
|
|
|
|
const title = await vscode.window.showInputBox({ prompt: 'Type the new title for the Test View', placeHolder: view.title });
|
|
|
|
|
if (title) {
|
|
|
|
|
view.title = title;
|
|
|
|
|
}
|
|
|
|
|
});
|
2018-10-29 19:09:34 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const tree = {
|
|
|
|
|
'a': {
|
|
|
|
|
'aa': {
|
|
|
|
|
'aaa': {
|
|
|
|
|
'aaaa': {
|
|
|
|
|
'aaaaa': {
|
|
|
|
|
'aaaaaa': {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'ab': {}
|
|
|
|
|
},
|
|
|
|
|
'b': {
|
|
|
|
|
'ba': {},
|
|
|
|
|
'bb': {}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let nodes = {};
|
|
|
|
|
|
|
|
|
|
function aNodeWithIdTreeDataProvider(): vscode.TreeDataProvider<{ key: string }> {
|
|
|
|
|
return {
|
|
|
|
|
getChildren: (element: { key: string }): { key: string }[] => {
|
|
|
|
|
return getChildren(element ? element.key : undefined).map(key => getNode(key));
|
|
|
|
|
},
|
|
|
|
|
getTreeItem: (element: { key: string }): vscode.TreeItem => {
|
|
|
|
|
const treeItem = getTreeItem(element.key);
|
|
|
|
|
treeItem.id = element.key;
|
|
|
|
|
return treeItem;
|
|
|
|
|
},
|
|
|
|
|
getParent: ({ key }: { key: string }): { key: string } => {
|
|
|
|
|
const parentKey = key.substring(0, key.length - 1);
|
|
|
|
|
return parentKey ? new Key(parentKey) : void 0;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getChildren(key: string): string[] {
|
|
|
|
|
if (!key) {
|
|
|
|
|
return Object.keys(tree);
|
|
|
|
|
}
|
|
|
|
|
let treeElement = getTreeElement(key);
|
|
|
|
|
if (treeElement) {
|
|
|
|
|
return Object.keys(treeElement);
|
|
|
|
|
}
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-29 19:30:50 +01:00
|
|
|
function getTreeItem(key: string): vscode.TreeItem2 {
|
2018-10-29 19:09:34 +01:00
|
|
|
const treeElement = getTreeElement(key);
|
|
|
|
|
return {
|
2018-10-29 19:30:50 +01:00
|
|
|
label: <vscode.TreeItemLabel>{ label: key, highlights: key.length > 1 ? [[key.length - 2, key.length - 1]] : void 0},
|
2018-10-29 19:09:34 +01:00
|
|
|
tooltip: `Tooltip for ${key}`,
|
|
|
|
|
collapsibleState: treeElement && Object.keys(treeElement).length ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getTreeElement(element): any {
|
|
|
|
|
let parent = tree;
|
|
|
|
|
for (let i = 0; i < element.length; i++) {
|
|
|
|
|
parent = parent[element.substring(0, i + 1)];
|
|
|
|
|
if (!parent) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return parent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getNode(key: string): { key: string } {
|
|
|
|
|
if (!nodes[key]) {
|
|
|
|
|
nodes[key] = new Key(key);
|
|
|
|
|
}
|
|
|
|
|
return nodes[key];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Key {
|
|
|
|
|
constructor(readonly key: string) { }
|
|
|
|
|
}
|