diff --git a/src/sql/workbench/browser/modelComponents/treeViewDataProvider.ts b/src/sql/workbench/browser/modelComponents/treeViewDataProvider.ts index a4e459d02c..5f63c16dd1 100644 --- a/src/sql/workbench/browser/modelComponents/treeViewDataProvider.ts +++ b/src/sql/workbench/browser/modelComponents/treeViewDataProvider.ts @@ -11,6 +11,24 @@ import { IModelViewTreeViewDataProvider, ITreeComponentItem } from 'sql/workbenc import { INotificationService } from 'vs/platform/notification/common/notification'; // eslint-disable-next-line code-import-patterns import * as vsTreeView from 'vs/workbench/api/browser/mainThreadTreeViews'; +import { ResolvableTreeItem } from 'vs/workbench/common/views'; +import { deepClone } from 'vs/base/common/objects'; + +export class ResolvableTreeComponentItem extends ResolvableTreeItem implements ITreeComponentItem { + + checked?: boolean; + enabled?: boolean; + onCheckedChanged?: (checked: boolean) => void; + children?: ITreeComponentItem[]; + + constructor(treeItem: ITreeComponentItem, resolve?: (() => Promise)) { + super(treeItem, resolve); + this.checked = treeItem.checked; + this.enabled = treeItem.enabled; + this.onCheckedChanged = treeItem.onCheckedChanged; + this.children = deepClone(treeItem.children); + } +} export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implements IModelViewTreeViewDataProvider { constructor(handle: number, treeViewId: string, @@ -32,4 +50,24 @@ export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implem refresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeComponentItem }) { } + + /** + * Returns the set of mapped ResolvableTreeComponentItems + * @override + * @param elements The elements to map + */ + protected async postGetChildren(elements: ITreeComponentItem[]): Promise { + const result: ResolvableTreeComponentItem[] = []; + const hasResolve = await this.hasResolve; + if (elements) { + for (const element of elements) { + const resolvable = new ResolvableTreeComponentItem(element, hasResolve ? () => { + return this._proxy.$resolve(this.treeViewId, element.handle); + } : undefined); + this.itemsMap.set(element.handle, resolvable); + result.push(resolvable); + } + } + return result; + } } diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 3de74ce80b..62cc37cc73 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -164,8 +164,8 @@ export type TreeItemHandle = string; // {{SQL CARBON EDIT}} export class TreeViewDataProvider implements ITreeViewDataProvider { - private readonly itemsMap: Map = new Map(); - private hasResolve: Promise; + protected readonly itemsMap: Map = new Map(); // {{SQL CARBON EDIT}} For use by Component Tree View + protected hasResolve: Promise; // {{SQL CARBON EDIT}} For use by Component Tree View // {{SQL CARBON EDIT}} constructor(protected readonly treeViewId: string, @@ -219,7 +219,7 @@ export class TreeViewDataProvider implements ITreeViewDataProvider { return this.itemsMap.size === 0; } - private async postGetChildren(elements: ITreeItem[]): Promise { + protected async postGetChildren(elements: ITreeItem[]): Promise { // {{SQL CARBON EDIT}} For use by Component Tree View const result: ResolvableTreeItem[] = []; const hasResolve = await this.hasResolve; if (elements) {