55
66import { ComposedTreeDelegate , IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree' ;
77import { ObjectTree , IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTree' ;
8- import { IListVirtualDelegate , IIdentityProvider } from 'vs/base/browser/ui/list/list' ;
9- import { ITreeElement , ITreeNode , ITreeRenderer , ITreeEvent , ITreeMouseEvent , ITreeContextMenuEvent , ITreeSorter , ICollapseStateChangeEvent , IAsyncDataSource } from 'vs/base/browser/ui/tree/tree' ;
8+ import { IListVirtualDelegate , IIdentityProvider , IListDragAndDrop , IListDragOverReaction } from 'vs/base/browser/ui/list/list' ;
9+ import { ITreeElement , ITreeNode , ITreeRenderer , ITreeEvent , ITreeMouseEvent , ITreeContextMenuEvent , ITreeSorter , ICollapseStateChangeEvent , IAsyncDataSource , ITreeDragAndDrop } from 'vs/base/browser/ui/tree/tree' ;
1010import { IDisposable , dispose } from 'vs/base/common/lifecycle' ;
1111import { Emitter , Event } from 'vs/base/common/event' ;
1212import { timeout , always } from 'vs/base/common/async' ;
@@ -124,6 +124,46 @@ export interface IChildrenResolutionEvent<T> {
124124 readonly reason : ChildrenResolutionReason ;
125125}
126126
127+ function asAsyncDataTreeDragAndDropData < TInput , T > ( data : IDragAndDropData ) : IDragAndDropData {
128+ if ( data instanceof ElementsDragAndDropData ) {
129+ const nodes = ( data as ElementsDragAndDropData < IAsyncDataTreeNode < TInput , T > > ) . elements ;
130+ return new ElementsDragAndDropData ( nodes . map ( node => node . element ) ) ;
131+ }
132+
133+ return data ;
134+ }
135+
136+ class AsyncDataTreeNodeListDragAndDrop < TInput , T > implements IListDragAndDrop < IAsyncDataTreeNode < TInput , T > > {
137+
138+ constructor ( private dnd : ITreeDragAndDrop < T > ) { }
139+
140+ getDragURI ( node : IAsyncDataTreeNode < TInput , T > ) : string | null {
141+ return this . dnd . getDragURI ( node . element as T ) ;
142+ }
143+
144+ getDragLabel ( nodes : IAsyncDataTreeNode < TInput , T > [ ] ) : string | undefined {
145+ if ( this . dnd . getDragLabel ) {
146+ return this . dnd . getDragLabel ( nodes . map ( node => node . element as T ) ) ;
147+ }
148+
149+ return undefined ;
150+ }
151+
152+ onDragStart ( data : IDragAndDropData , originalEvent : DragEvent ) : void {
153+ if ( this . dnd . onDragStart ) {
154+ this . dnd . onDragStart ( asAsyncDataTreeDragAndDropData ( data ) , originalEvent ) ;
155+ }
156+ }
157+
158+ onDragOver ( data : IDragAndDropData , targetNode : IAsyncDataTreeNode < TInput , T > | undefined , targetIndex : number | undefined , originalEvent : DragEvent , raw = true ) : boolean | IListDragOverReaction {
159+ return this . dnd . onDragOver ( asAsyncDataTreeDragAndDropData ( data ) , targetNode && targetNode . element as T , targetIndex , originalEvent ) ;
160+ }
161+
162+ drop ( data : IDragAndDropData , targetNode : IAsyncDataTreeNode < TInput , T > | undefined , targetIndex : number | undefined , originalEvent : DragEvent ) : void {
163+ this . dnd . drop ( asAsyncDataTreeDragAndDropData ( data ) , targetNode && targetNode . element as T , targetIndex , originalEvent ) ;
164+ }
165+ }
166+
127167function asObjectTreeOptions < TInput , T , TFilterData > ( options ?: IAsyncDataTreeOptions < T , TFilterData > ) : IObjectTreeOptions < IAsyncDataTreeNode < TInput , T > , TFilterData > | undefined {
128168 return options && {
129169 ...options ,
@@ -132,36 +172,7 @@ function asObjectTreeOptions<TInput, T, TFilterData>(options?: IAsyncDataTreeOpt
132172 return options . identityProvider ! . getId ( el . element as T ) ;
133173 }
134174 } ,
135- dnd : options . dnd && {
136- getDragURI ( node ) {
137- return options . dnd ! . getDragURI ( node . element as T ) ;
138- } ,
139- getDragLabel ( nodes ) {
140- if ( options . dnd ! . getDragLabel ) {
141- return options . dnd ! . getDragLabel ! ( nodes . map ( node => node . element as T ) ) ;
142- }
143-
144- return undefined ;
145- } ,
146- onDragStart ( data , originalEvent ) {
147- if ( options . dnd ! . onDragStart ) {
148- options . dnd ! . onDragStart ! ( data , originalEvent ) ;
149- }
150- } ,
151- onDragOver ( data , targetNode , targetIndex , originalEvent ) {
152- let treeData : IDragAndDropData = data ;
153-
154- if ( data instanceof ElementsDragAndDropData ) {
155- const nodes = ( data as ElementsDragAndDropData < IAsyncDataTreeNode < TInput , T > > ) . elements ;
156- treeData = new ElementsDragAndDropData ( nodes . map ( node => node . element ) ) ;
157- }
158-
159- return options . dnd ! . onDragOver ( treeData , targetNode && targetNode . element as T , targetIndex , originalEvent ) ;
160- } ,
161- drop ( data , targetNode , targetIndex , originalEvent ) {
162- options . dnd ! . drop ( data , targetNode && targetNode . element as T , targetIndex , originalEvent ) ;
163- }
164- } ,
175+ dnd : options . dnd && new AsyncDataTreeNodeListDragAndDrop ( options . dnd ) ,
165176 multipleSelectionController : options . multipleSelectionController && {
166177 isSelectionSingleChangeEvent ( e ) {
167178 return options . multipleSelectionController ! . isSelectionSingleChangeEvent ( { ...e , element : e . element } as any ) ;
0 commit comments