diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 04c2fd8111d..9ec9f103f70 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -27,7 +27,7 @@ enum AsyncDataTreeNodeState { } interface IAsyncDataTreeNode> { - readonly element: T | null; + element: T | null; readonly parent: IAsyncDataTreeNode | null; readonly id?: string | null; readonly children?: IAsyncDataTreeNode[]; @@ -259,7 +259,7 @@ export class AsyncDataTree, TFilterData = void> imple // Data Tree - refresh(element: T | null, recursive = false): Thenable { + refresh(element: T | null, recursive = true): Thenable { return this.refreshNode(this.getDataNode(element), recursive, ChildrenResolutionReason.Refresh); } @@ -405,7 +405,15 @@ export class AsyncDataTree, TFilterData = void> imple return node; } - private refreshNode(node: IAsyncDataTreeNode, recursive: boolean, reason: ChildrenResolutionReason): Thenable { + private async refreshNode(node: IAsyncDataTreeNode, recursive: boolean, reason: ChildrenResolutionReason): Promise { + await this._refreshNode(node, recursive, reason); + + if (recursive && node.children) { + await Promise.all(node.children.map(child => this.refreshNode(child, recursive, reason))); + } + } + + private _refreshNode(node: IAsyncDataTreeNode, recursive: boolean, reason: ChildrenResolutionReason): Thenable { let result = this.refreshPromises.get(node); if (result) { @@ -423,6 +431,8 @@ export class AsyncDataTree, TFilterData = void> imple if (!hasChildren) { this.setChildren(node, [], recursive); return Promise.resolve(); + } else if (node !== this.root && this.tree.isCollapsed(node)) { + return Promise.resolve(); } else { node.state = AsyncDataTreeNodeState.Loading; this._onDidChangeNodeState.fire(node); @@ -499,19 +509,20 @@ export class AsyncDataTree, TFilterData = void> imple }; } - // TODO - // if (recursive) { - // asyncDataTreeNode.state = AsyncDataTreeNodeState.Uninitialized; + asyncDataTreeNode.element = element; - // if (this.tree.isCollapsed(asyncDataTreeNode)) { - // asyncDataTreeNode.children!.length = 0; + if (recursive) { + asyncDataTreeNode.state = AsyncDataTreeNodeState.Uninitialized; - // return { - // element: asyncDataTreeNode, - // collapsible: this.dataSource.hasChildren(element), - // }; - // } - // } + if (this.tree.isCollapsed(asyncDataTreeNode)) { + asyncDataTreeNode.children!.length = 0; + + return { + element: asyncDataTreeNode, + collapsible: this.dataSource.hasChildren(element), + }; + } + } return { element: asyncDataTreeNode,