diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 7bead8e8e8c..a6bbcda3f88 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -395,7 +395,10 @@ class AsyncFindController extends AbstractFindController declare protected readonly filter: AsyncFindFilter; private readonly model: ITreeModel | null, TFilterData, IAsyncDataTreeNode | null>; private readonly nodes = new Map>(); - private previousTreeScrollTop: number = 0; + + private previousScrollTop: number | undefined; + private previousFocus: (IAsyncDataTreeNode | null)[] = []; + private previousSelection: (IAsyncDataTreeNode | null)[] = []; private sessionId: number = 0; private active: boolean = false; @@ -439,7 +442,12 @@ class AsyncFindController extends AbstractFindController private activateFindMode(): void { this.sessionId++; - this.previousTreeScrollTop = this.tree.scrollTop; + + // store tree view state + this.previousScrollTop = this.tree.scrollTop; + this.previousFocus = this.tree.getFocus(); + this.previousSelection = this.tree.getSelection(); + this.tree.scrollTop = 0; const findModel = this.tree.createNewModel({ filter: this.filter as ITreeFilter | null, TFilterData> }); this.tree.setModel(findModel); @@ -452,7 +460,9 @@ class AsyncFindController extends AbstractFindController if (focus && focus.element && this.findProvider.revealResultInTree) { this.findProvider.revealResultInTree(focus.element as T); } else { - this.tree.scrollTop = this.previousTreeScrollTop; + this.tree.scrollTop = this.previousScrollTop ?? 0; + this.tree.setFocus(this.previousFocus); + this.tree.setSelection(this.previousSelection); } this.activeTokenSource = undefined;