Skip to content

Commit 419d5bb

Browse files
committed
AsyncDataTree<TInput...
related to microsoft#65091
1 parent 8c09d4f commit 419d5bb

15 files changed

Lines changed: 211 additions & 203 deletions

File tree

src/vs/base/browser/ui/tree/asyncDataTree.ts

Lines changed: 85 additions & 67 deletions
Large diffs are not rendered by default.

src/vs/base/browser/ui/tree/dataTree.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,7 @@ export interface IDataTreeOptions<T, TFilterData = void> extends IAbstractTreeOp
1717
export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | null, TFilterData, TInput | T> {
1818

1919
protected model: ObjectTreeModel<T | null, TFilterData>;
20-
21-
private _input: TInput | undefined;
22-
23-
get input(): TInput | undefined {
24-
return this._input;
25-
}
26-
27-
set input(input: TInput | undefined) {
28-
this._input = input;
29-
this.refresh(input);
30-
}
20+
private input: TInput | undefined;
3121

3222
constructor(
3323
container: HTMLElement,
@@ -39,8 +29,22 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
3929
super(container, delegate, renderers, options);
4030
}
4131

42-
refresh(element: TInput | T): void {
43-
if (!this._input) {
32+
getInput(): TInput | undefined {
33+
return this.input;
34+
}
35+
36+
setInput(input: TInput | undefined): void {
37+
this.input = input;
38+
39+
if (typeof input === 'undefined') {
40+
return;
41+
}
42+
43+
this.refresh(input);
44+
}
45+
46+
refresh(element: TInput | T = this.input): void {
47+
if (typeof this.input === 'undefined') {
4448
throw new Error('Tree input not set');
4549
}
4650

src/vs/base/browser/ui/tree/tree.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ export interface IDataSource<TInput, T> {
149149
getChildren(element: TInput | T): T[];
150150
}
151151

152-
export interface IAsyncDataSource<T extends NonNullable<any>> {
153-
hasChildren(element: T | null): boolean;
154-
getChildren(element: T | null): T[] | Promise<T[]>;
152+
export interface IAsyncDataSource<TInput, T> {
153+
hasChildren(element: TInput | T): boolean;
154+
getChildren(element: TInput | T): T[] | Promise<T[]>;
155155
}
156156

157157
/**

src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,11 @@ suite('AsyncDataTree', function () {
5151
}
5252
};
5353

54-
const dataSource = new class implements IAsyncDataSource<Element> {
55-
hasChildren(element: Element | null): boolean {
56-
return !element || (element.children && element.children.length > 0);
54+
const dataSource = new class implements IAsyncDataSource<Element, Element> {
55+
hasChildren(element: Element): boolean {
56+
return element.children && element.children.length > 0;
5757
}
58-
getChildren(element: Element | null): Promise<Element[]> {
59-
if (!element) {
60-
return Promise.resolve(root.children);
61-
}
62-
58+
getChildren(element: Element): Promise<Element[]> {
6359
return Promise.resolve(element.children || []);
6460
}
6561
};
@@ -79,11 +75,11 @@ suite('AsyncDataTree', function () {
7975

8076
const _: (id: string) => Element = find.bind(null, root.children);
8177

82-
const tree = new AsyncDataTree(container, delegate, [renderer], dataSource, { identityProvider });
78+
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, { identityProvider });
8379
tree.layout(200);
8480
assert.equal(container.querySelectorAll('.monaco-list-row').length, 0);
8581

86-
await tree.refresh(null);
82+
await tree.setInput(root);
8783
assert.equal(container.querySelectorAll('.monaco-list-row').length, 1);
8884
let twistie = container.querySelector('.monaco-list-row:first-child .monaco-tl-twistie') as HTMLElement;
8985
assert(!hasClass(twistie, 'collapsible'));

src/vs/editor/contrib/referenceSearch/referencesTree.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
2626

2727
export type TreeElement = FileReferences | OneReference;
2828

29-
export class DataSource implements IAsyncDataSource<TreeElement> {
29+
export class DataSource implements IAsyncDataSource<ReferencesModel | FileReferences, TreeElement> {
3030

31-
root: ReferencesModel | FileReferences;
31+
constructor(@ITextModelService private readonly _resolverService: ITextModelService) { }
3232

33-
constructor(
34-
@ITextModelService private readonly _resolverService: ITextModelService,
35-
) {
36-
//
37-
}
38-
39-
hasChildren(element: TreeElement): boolean {
40-
if (!element) {
33+
hasChildren(element: ReferencesModel | FileReferences | TreeElement): boolean {
34+
if (element instanceof ReferencesModel) {
4135
return true;
4236
}
4337
if (element instanceof FileReferences && !element.failure) {
@@ -46,10 +40,11 @@ export class DataSource implements IAsyncDataSource<TreeElement> {
4640
return false;
4741
}
4842

49-
getChildren(element: TreeElement): Promise<TreeElement[]> {
50-
if (!element && this.root instanceof FileReferences) {
51-
element = this.root;
43+
getChildren(element: ReferencesModel | FileReferences | TreeElement): TreeElement[] | Promise<TreeElement[]> {
44+
if (element instanceof ReferencesModel) {
45+
return element.groups;
5246
}
47+
5348
if (element instanceof FileReferences) {
5449
return element.resolve(this._resolverService).then(val => {
5550
// if (element.failure) {
@@ -60,9 +55,7 @@ export class DataSource implements IAsyncDataSource<TreeElement> {
6055
return val.children;
6156
});
6257
}
63-
if (this.root instanceof ReferencesModel) {
64-
return Promise.resolve(this.root.groups);
65-
}
58+
6659
throw new Error('bad tree');
6760
}
6861
}

src/vs/editor/contrib/referenceSearch/referencesWidget.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,7 @@ export class ReferenceWidget extends PeekViewWidget {
237237
private _callOnDispose: IDisposable[] = [];
238238
private _onDidSelectReference = new Emitter<SelectionEvent>();
239239

240-
private _treeDataSource: DataSource;
241-
private _tree: WorkbenchAsyncDataTree<TreeElement>;
240+
private _tree: WorkbenchAsyncDataTree<ReferencesModel | FileReferences, TreeElement>;
242241
private _treeContainer: HTMLElement;
243242
private _sash: VSash;
244243
private _preview: ICodeEditor;
@@ -357,14 +356,14 @@ export class ReferenceWidget extends PeekViewWidget {
357356
accessibilityProvider: new AriaProvider()
358357
};
359358

360-
this._treeDataSource = this._instantiationService.createInstance(DataSource);
359+
const treeDataSource = this._instantiationService.createInstance(DataSource);
361360

362-
this._tree = this._instantiationService.createInstance<HTMLElement, IListVirtualDelegate<TreeElement>, ITreeRenderer<any, void, any>[], IAsyncDataSource<TreeElement>, IAsyncDataTreeOptions<TreeElement, void>, WorkbenchAsyncDataTree<TreeElement, void>>(
361+
this._tree = this._instantiationService.createInstance<HTMLElement, IListVirtualDelegate<TreeElement>, ITreeRenderer<any, void, any>[], IAsyncDataSource<ReferencesModel | FileReferences, TreeElement>, IAsyncDataTreeOptions<TreeElement, void>, WorkbenchAsyncDataTree<ReferencesModel | FileReferences, TreeElement, void>>(
363362
WorkbenchAsyncDataTree,
364363
this._treeContainer,
365364
new Delegate(),
366365
renderers,
367-
this._treeDataSource,
366+
treeDataSource,
368367
treeOptions
369368
);
370369

@@ -498,8 +497,7 @@ export class ReferenceWidget extends PeekViewWidget {
498497
this.focus();
499498

500499
// pick input and a reference to begin with
501-
this._treeDataSource.root = this._model.groups.length === 1 ? this._model.groups[0] : this._model;
502-
return this._tree.refresh(null);
500+
return this._tree.setInput(this._model.groups.length === 1 ? this._model.groups[0] : this._model);
503501
}
504502

505503
private _getFocusedReference(): OneReference {
@@ -533,7 +531,7 @@ export class ReferenceWidget extends PeekViewWidget {
533531

534532
const promise = this._textModelResolverService.createModelReference(reference.uri);
535533

536-
if (this._treeDataSource.root === reference.parent) {
534+
if (this._tree.getInput() === reference.parent) {
537535
this._tree.reveal(reference);
538536
} else {
539537
if (revealParent) {

src/vs/platform/list/browser/listService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import { ObjectTree, IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTr
3535
import { ITreeEvent, ITreeRenderer, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree';
3636
import { AsyncDataTree, IAsyncDataTreeOptions } from 'vs/base/browser/ui/tree/asyncDataTree';
3737

38-
export type ListWidget = List<any> | PagedList<any> | ITree | ObjectTree<any, any> | AsyncDataTree<any, any>;
38+
export type ListWidget = List<any> | PagedList<any> | ITree | ObjectTree<any, any> | AsyncDataTree<any, any, any>;
3939

4040
export const IListService = createDecorator<IListService>('listService');
4141

@@ -590,7 +590,7 @@ export class TreeResourceNavigator2<T, TFilterData> extends Disposable {
590590
private readonly _openResource: Emitter<IOpenEvent<T>> = new Emitter<IOpenEvent<T>>();
591591
readonly openResource: Event<IOpenEvent<T>> = this._openResource.event;
592592

593-
constructor(private tree: WorkbenchObjectTree<T, TFilterData> | WorkbenchAsyncDataTree<T, TFilterData>, private options?: IResourceResultsNavigationOptions) {
593+
constructor(private tree: WorkbenchObjectTree<T, TFilterData> | WorkbenchAsyncDataTree<any, T, TFilterData>, private options?: IResourceResultsNavigationOptions) {
594594
super();
595595

596596
this.registerListeners();
@@ -955,7 +955,7 @@ export class WorkbenchObjectTree<T extends NonNullable<any>, TFilterData = void>
955955
}
956956
}
957957

958-
export class WorkbenchAsyncDataTree<T extends NonNullable<any>, TFilterData = void> extends AsyncDataTree<T, TFilterData> {
958+
export class WorkbenchAsyncDataTree<TInput, T, TFilterData = void> extends AsyncDataTree<TInput, T, TFilterData> {
959959

960960
readonly contextKeyService: IContextKeyService;
961961

@@ -969,7 +969,7 @@ export class WorkbenchAsyncDataTree<T extends NonNullable<any>, TFilterData = vo
969969
container: HTMLElement,
970970
delegate: IListVirtualDelegate<T>,
971971
renderers: ITreeRenderer<any /* TODO@joao */, TFilterData, any>[],
972-
dataSource: IAsyncDataSource<T>,
972+
dataSource: IAsyncDataSource<TInput, T>,
973973
options: IAsyncDataTreeOptions<T, TFilterData>,
974974
@IContextKeyService contextKeyService: IContextKeyService,
975975
@IListService listService: IListService,

src/vs/workbench/browser/viewlet.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export class CollapseAction extends Action {
186186

187187
// Collapse All action for the new tree
188188
export class CollapseAction2 extends Action {
189-
constructor(tree: AsyncDataTree<any>, enabled: boolean, clazz: string) {
189+
constructor(tree: AsyncDataTree<any, any>, enabled: boolean, clazz: string) {
190190
super('workbench.action.collapse', nls.localize('collapse', "Collapse All"), clazz, enabled, () => {
191191
tree.collapseAll();
192192
return Promise.resolve(undefined);

src/vs/workbench/parts/debug/browser/debugActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ export class ReverseContinueAction extends AbstractDebugAction {
804804
}
805805

806806
export class ReplCollapseAllAction extends CollapseAction2 {
807-
constructor(tree: AsyncDataTree<any>, private toFocus: { focus(): void; }) {
807+
constructor(tree: AsyncDataTree<any, any>, private toFocus: { focus(): void; }) {
808808
super(tree, true, undefined);
809809
}
810810

src/vs/workbench/parts/debug/browser/loadedScriptsView.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export class LoadedScriptsView extends ViewletPanel {
362362

363363
private treeContainer: HTMLElement;
364364
private loadedScriptsItemType: IContextKey<string>;
365-
private tree: WorkbenchAsyncDataTree<any>;
365+
private tree: WorkbenchAsyncDataTree<LoadedScriptsItem, LoadedScriptsItem>;
366366
private changeScheduler: RunOnceScheduler;
367367
private treeNeedsRefreshOnVisible: boolean;
368368
private filter: LoadedScriptsFilter;
@@ -399,7 +399,7 @@ export class LoadedScriptsView extends ViewletPanel {
399399
[
400400
this.instantiationService.createInstance(LoadedScriptsRenderer)
401401
],
402-
new LoadedScriptsDataSource(root),
402+
new LoadedScriptsDataSource(),
403403
{
404404
identityProvider: {
405405
getId: element => element.getId()
@@ -414,10 +414,12 @@ export class LoadedScriptsView extends ViewletPanel {
414414
this.contextKeyService, this.listService, this.themeService, this.configurationService, this.keybindingService
415415
);
416416

417+
this.tree.setInput(root);
418+
417419
this.changeScheduler = new RunOnceScheduler(() => {
418420
this.treeNeedsRefreshOnVisible = false;
419421
if (this.tree) {
420-
this.tree.refresh(null);
422+
this.tree.refresh();
421423
}
422424
}, 300);
423425
this.disposables.push(this.changeScheduler);
@@ -535,19 +537,13 @@ class LoadedScriptsDelegate implements IListVirtualDelegate<LoadedScriptsItem> {
535537
}
536538
}
537539

538-
class LoadedScriptsDataSource implements IAsyncDataSource<LoadedScriptsItem> {
539-
540-
constructor(private root: LoadedScriptsItem) {
541-
}
540+
class LoadedScriptsDataSource implements IAsyncDataSource<LoadedScriptsItem, LoadedScriptsItem> {
542541

543-
hasChildren(element: LoadedScriptsItem | null): boolean {
544-
return element === null || element.hasChildren();
542+
hasChildren(element: LoadedScriptsItem): boolean {
543+
return element.hasChildren();
545544
}
546545

547-
getChildren(element: LoadedScriptsItem | null): Promise<LoadedScriptsItem[]> {
548-
if (element === null) {
549-
element = this.root;
550-
}
546+
getChildren(element: LoadedScriptsItem): Promise<LoadedScriptsItem[]> {
551547
return element.getChildren();
552548
}
553549
}

0 commit comments

Comments
 (0)