44 *--------------------------------------------------------------------------------------------*/
55
66import { ComposedTreeDelegate , IAbstractTreeOptions , IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree' ;
7- import { ObjectTree , IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTree' ;
7+ import { ObjectTree , IObjectTreeOptions , CompressibleObjectTree , ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree' ;
88import { IListVirtualDelegate , IIdentityProvider , IListDragAndDrop , IListDragOverReaction } from 'vs/base/browser/ui/list/list' ;
99import { ITreeElement , ITreeNode , ITreeRenderer , ITreeEvent , ITreeMouseEvent , ITreeContextMenuEvent , ITreeSorter , ICollapseStateChangeEvent , IAsyncDataSource , ITreeDragAndDrop , TreeError } from 'vs/base/browser/ui/tree/tree' ;
1010import { IDisposable , dispose } from 'vs/base/common/lifecycle' ;
@@ -18,6 +18,7 @@ import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors
1818import { toggleClass } from 'vs/base/browser/dom' ;
1919import { values } from 'vs/base/common/map' ;
2020import { ScrollEvent } from 'vs/base/common/scrollable' ;
21+ import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel' ;
2122
2223interface IAsyncDataTreeNode < TInput , T > {
2324 element : TInput | T ;
@@ -101,8 +102,8 @@ class DataTreeRenderer<TInput, T, TFilterData, TTemplateData> implements ITreeRe
101102 private disposables : IDisposable [ ] = [ ] ;
102103
103104 constructor (
104- private renderer : ITreeRenderer < T , TFilterData , TTemplateData > ,
105- private nodeMapper : NodeMapper < TInput , T , TFilterData > ,
105+ protected renderer : ITreeRenderer < T , TFilterData , TTemplateData > ,
106+ protected nodeMapper : NodeMapper < TInput , T , TFilterData > ,
106107 readonly onDidChangeTwistieState : Event < IAsyncDataTreeNode < TInput , T > >
107108 ) {
108109 this . templateId = renderer . templateId ;
@@ -317,9 +318,9 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
317318 private readonly autoExpandSingleChildren : boolean ;
318319
319320 private readonly _onDidRender = new Emitter < void > ( ) ;
320- private readonly _onDidChangeNodeSlowState = new Emitter < IAsyncDataTreeNode < TInput , T > > ( ) ;
321+ protected readonly _onDidChangeNodeSlowState = new Emitter < IAsyncDataTreeNode < TInput , T > > ( ) ;
321322
322- private readonly nodeMapper = new NodeMapper < TInput , T , TFilterData > ( ) ;
323+ protected readonly nodeMapper = new NodeMapper < TInput , T , TFilterData > ( ) ;
323324
324325 protected readonly disposables : IDisposable [ ] = [ ] ;
325326
@@ -366,11 +367,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
366367 this . sorter = options . sorter ;
367368 this . collapseByDefault = options . collapseByDefault ;
368369
369- const objectTreeDelegate = new ComposedTreeDelegate < TInput | T , IAsyncDataTreeNode < TInput , T > > ( delegate ) ;
370- const objectTreeRenderers = renderers . map ( r => new DataTreeRenderer ( r , this . nodeMapper , this . _onDidChangeNodeSlowState . event ) ) ;
371- const objectTreeOptions = asObjectTreeOptions < TInput , T , TFilterData > ( options ) || { } ;
372-
373- this . tree = new ObjectTree ( user , container , objectTreeDelegate , objectTreeRenderers , objectTreeOptions ) ;
370+ this . tree = this . createTree ( user , container , delegate , renderers , options ) ;
374371
375372 this . root = createAsyncDataTreeNode ( {
376373 element : undefined ! ,
@@ -390,6 +387,20 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
390387 this . tree . onDidChangeCollapseState ( this . _onDidChangeCollapseState , this , this . disposables ) ;
391388 }
392389
390+ protected createTree (
391+ user : string ,
392+ container : HTMLElement ,
393+ delegate : IListVirtualDelegate < T > ,
394+ renderers : ITreeRenderer < T , TFilterData , any > [ ] ,
395+ options : IAsyncDataTreeOptions < T , TFilterData >
396+ ) : ObjectTree < IAsyncDataTreeNode < TInput , T > , TFilterData > {
397+ const objectTreeDelegate = new ComposedTreeDelegate < TInput | T , IAsyncDataTreeNode < TInput , T > > ( delegate ) ;
398+ const objectTreeRenderers = renderers . map ( r => new DataTreeRenderer ( r , this . nodeMapper , this . _onDidChangeNodeSlowState . event ) ) ;
399+ const objectTreeOptions = asObjectTreeOptions < TInput , T , TFilterData > ( options ) || { } ;
400+
401+ return new ObjectTree ( user , container , objectTreeDelegate , objectTreeRenderers , objectTreeOptions ) ;
402+ }
403+
393404 updateOptions ( options : IAsyncDataTreeOptionsUpdate = { } ) : void {
394405 this . tree . updateOptions ( options ) ;
395406 }
@@ -933,3 +944,40 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
933944 dispose ( this . disposables ) ;
934945 }
935946}
947+
948+ class CompressibleDataTreeRenderer < TInput , T , TFilterData , TTemplateData >
949+ extends DataTreeRenderer < TInput , T , TFilterData , TTemplateData >
950+ implements ICompressibleTreeRenderer < IAsyncDataTreeNode < TInput , T > , TFilterData , IDataTreeListTemplateData < TTemplateData > >
951+ {
952+ renderCompressedElements ( node : ITreeNode < ICompressedTreeNode < IAsyncDataTreeNode < TInput , T > > , TFilterData > , index : number , templateData : IDataTreeListTemplateData < TTemplateData > , height : number | undefined ) : void {
953+ this . renderer . renderElement ( this . nodeMapper . mapNode ( node ) as ITreeNode < T , TFilterData > , index , templateData . templateData , height ) ;
954+ }
955+ }
956+
957+ export class CompressibleAsyncDataTree < TInput , T , TFilterData = void > extends AsyncDataTree < TInput , T , TFilterData > {
958+
959+ constructor (
960+ user : string ,
961+ container : HTMLElement ,
962+ delegate : IListVirtualDelegate < T > ,
963+ renderers : ICompressibleTreeRenderer < T , TFilterData , any > [ ] ,
964+ dataSource : IAsyncDataSource < TInput , T > ,
965+ options : IAsyncDataTreeOptions < T , TFilterData > = { }
966+ ) {
967+ super ( user , container , delegate , renderers , dataSource , options ) ;
968+ }
969+
970+ protected createTree (
971+ user : string ,
972+ container : HTMLElement ,
973+ delegate : IListVirtualDelegate < T > ,
974+ renderers : ITreeRenderer < T , TFilterData , any > [ ] ,
975+ options : IAsyncDataTreeOptions < T , TFilterData >
976+ ) : ObjectTree < IAsyncDataTreeNode < TInput , T > , TFilterData > {
977+ const objectTreeDelegate = new ComposedTreeDelegate < TInput | T , IAsyncDataTreeNode < TInput , T > > ( delegate ) ;
978+ const objectTreeRenderers = renderers . map ( r => new CompressibleDataTreeRenderer ( r , this . nodeMapper , this . _onDidChangeNodeSlowState . event ) ) ;
979+ const objectTreeOptions = asObjectTreeOptions < TInput , T , TFilterData > ( options ) || { } ;
980+
981+ return new CompressibleObjectTree ( user , container , objectTreeDelegate , objectTreeRenderers , objectTreeOptions ) ;
982+ }
983+ }
0 commit comments