@@ -49,7 +49,8 @@ export interface IView extends ee.IEventEmitter {
4949 fixedSize : number ;
5050 minimumSize : number ;
5151 maximumSize : number ;
52- draggableElement : HTMLElement ;
52+ draggableElement ?: HTMLElement ;
53+ draggableLabel ?: string ;
5354 render ( container : HTMLElement , orientation : Orientation ) : void ;
5455 layout ( size : number , orientation : Orientation ) : void ;
5556 focus ( ) : void ;
@@ -72,7 +73,6 @@ export abstract class View extends ee.EventEmitter implements IView {
7273 protected _sizing : ViewSizing ;
7374 protected _fixedSize : number ;
7475 protected _minimumSize : number ;
75- protected _draggableElement : HTMLElement = null ;
7676
7777 constructor ( opts : IViewOptions ) {
7878 super ( ) ;
@@ -87,7 +87,6 @@ export abstract class View extends ee.EventEmitter implements IView {
8787 get fixedSize ( ) : number { return this . _fixedSize ; }
8888 get minimumSize ( ) : number { return this . sizing === ViewSizing . Fixed ? this . fixedSize : this . _minimumSize ; }
8989 get maximumSize ( ) : number { return this . sizing === ViewSizing . Fixed ? this . fixedSize : Number . POSITIVE_INFINITY ; }
90- get draggableElement ( ) : HTMLElement { return this . _draggableElement ; }
9190
9291 protected setFlexible ( size ?: number ) : void {
9392 this . _sizing = ViewSizing . Flexible ;
@@ -166,10 +165,11 @@ export abstract class HeaderView extends View {
166165 }
167166 }
168167
168+ get draggableElement ( ) : HTMLElement { return this . header ; }
169+
169170 render ( container : HTMLElement , orientation : Orientation ) : void {
170171 this . header = document . createElement ( 'div' ) ;
171172 this . header . className = 'header' ;
172- this . _draggableElement = this . header ;
173173
174174 let headerSize = this . headerSize + 'px' ;
175175
@@ -596,7 +596,7 @@ export class SplitView extends lifecycle.Disposable implements
596596 }
597597
598598 // Listen to Drag and Drop
599- this . viewDnDListeners [ index ] = this . listenToDragAndDrop ( view , viewElement ) ;
599+ this . viewDnDListeners [ index ] = this . createDnDListeners ( view , viewElement ) ;
600600
601601 // Add sash
602602 if ( this . views . length > 2 ) {
@@ -698,7 +698,7 @@ export class SplitView extends lifecycle.Disposable implements
698698 this . dropBackground = styles . dropBackground ;
699699 }
700700
701- private listenToDragAndDrop ( view : IView , viewElement : HTMLElement ) : lifecycle . IDisposable [ ] {
701+ private createDnDListeners ( view : IView , viewElement : HTMLElement ) : lifecycle . IDisposable [ ] {
702702 if ( ! this . canDragAndDrop || view instanceof VoidView ) {
703703 return [ ] ;
704704 }
@@ -710,6 +710,14 @@ export class SplitView extends lifecycle.Disposable implements
710710 view . draggableElement . draggable = true ;
711711 disposables . push ( dom . addDisposableListener ( view . draggableElement , dom . EventType . DRAG_START , ( e : DragEvent ) => {
712712 e . dataTransfer . effectAllowed = 'move' ;
713+
714+ const dragImage = document . createElement ( 'div' ) ;
715+ dragImage . className = 'monaco-tree-drag-image' ;
716+ dragImage . textContent = view . draggableLabel ? view . draggableLabel : view . draggableElement . textContent ;
717+ document . body . appendChild ( dragImage ) ;
718+ e . dataTransfer . setDragImage ( dragImage , - 10 , - 10 ) ;
719+ setTimeout ( ( ) => document . body . removeChild ( dragImage ) , 0 ) ;
720+
713721 this . draggedView = view ;
714722 } ) ) ;
715723 }
0 commit comments