44 *--------------------------------------------------------------------------------------------*/
55
66import 'vs/css!./media/tree' ;
7- import { IDisposable , dispose } from 'vs/base/common/lifecycle' ;
7+ import { IDisposable , dispose , Disposable } from 'vs/base/common/lifecycle' ;
88import { IListOptions , List , IListStyles } from 'vs/base/browser/ui/list/listWidget' ;
99import { IListVirtualDelegate , IListRenderer , IListMouseEvent , IListEvent , IListContextMenuEvent , IListDragAndDrop , IListDragOverReaction } from 'vs/base/browser/ui/list/list' ;
10- import { append , $ , toggleClass } from 'vs/base/browser/dom' ;
10+ import { append , $ , toggleClass , timeout } from 'vs/base/browser/dom' ;
1111import { Event , Relay } from 'vs/base/common/event' ;
1212import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent' ;
1313import { KeyCode } from 'vs/base/common/keyCodes' ;
@@ -18,6 +18,9 @@ import { range } from 'vs/base/common/arrays';
1818
1919class TreeNodeListDragAndDrop < T , TFilterData , TRef > implements IListDragAndDrop < ITreeNode < T , TFilterData > > {
2020
21+ private autoExpandNode : ITreeNode < T , TFilterData > | undefined ;
22+ private autoExpandDisposable : IDisposable = Disposable . None ;
23+
2124 constructor ( private modelProvider : ( ) => ITreeModel < T , TFilterData , TRef > , private dnd : ITreeDragAndDrop < T > ) { }
2225
2326 getDragURI ( node : ITreeNode < T , TFilterData > ) : string | null {
@@ -32,15 +35,33 @@ class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<
3235 this . dnd . onDragStart ( data , originalEvent ) ;
3336 }
3437
35- onDragOver ( data : IDragAndDropData , targetNode : ITreeNode < T , TFilterData > | undefined , targetIndex : number | undefined , originalEvent : DragEvent , force = false ) : boolean | IListDragOverReaction {
38+ onDragOver ( data : IDragAndDropData , targetNode : ITreeNode < T , TFilterData > | undefined , targetIndex : number | undefined , originalEvent : DragEvent , raw = true ) : boolean | IListDragOverReaction {
3639 const result = this . dnd . onDragOver ( data , targetNode && targetNode . element , targetIndex , originalEvent ) ;
3740
3841 if ( typeof targetNode === 'undefined' ) {
3942 return result ;
4043 }
4144
45+ if ( this . autoExpandNode !== targetNode ) {
46+ this . autoExpandDisposable . dispose ( ) ;
47+ this . autoExpandNode = targetNode ;
48+ }
49+
50+ if ( typeof result !== 'boolean' && result . autoExpand ) {
51+ this . autoExpandDisposable = timeout ( ( ) => {
52+ const model = this . modelProvider ( ) ;
53+ const ref = model . getNodeLocation ( targetNode ) ;
54+
55+ if ( model . isCollapsed ( ref ) ) {
56+ model . setCollapsed ( ref , false ) ;
57+ }
58+
59+ this . autoExpandNode = undefined ;
60+ } , 500 ) ;
61+ }
62+
4263 if ( typeof result === 'boolean' || ! result . accept || typeof result . bubble === 'undefined' ) {
43- if ( force ) {
64+ if ( ! raw ) {
4465 const accept = typeof result === 'boolean' ? result : result . accept ;
4566 const effect = typeof result === 'boolean' ? undefined : result . effect ;
4667 return { accept, effect, feedback : [ targetIndex ! ] } ;
@@ -54,7 +75,7 @@ class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<
5475 const model = this . modelProvider ( ) ;
5576 const parentIndex = parentNode && model . getListIndex ( model . getNodeLocation ( parentNode ) ) ;
5677
57- return this . onDragOver ( data , parentNode , parentIndex , originalEvent , true ) ;
78+ return this . onDragOver ( data , parentNode , parentIndex , originalEvent , false ) ;
5879 }
5980
6081 const model = this . modelProvider ( ) ;
0 commit comments