1
1
import { toggleClass } from '../dom' ;
2
- import { Emitter , Event } from '../events' ;
2
+ import { DockviewEvent , Emitter , Event } from '../events' ;
3
3
import { CompositeDisposable } from '../lifecycle' ;
4
4
import { DragAndDropObserver } from './dnd' ;
5
5
import { clamp } from '../math' ;
6
6
import { Direction } from '../gridview/baseComponentGridview' ;
7
7
8
+ export interface DroptargetEvent {
9
+ readonly position : Position ;
10
+ readonly nativeEvent : DragEvent ;
11
+ }
12
+
13
+ export class WillShowOverlayEvent
14
+ extends DockviewEvent
15
+ implements DroptargetEvent
16
+ {
17
+ get nativeEvent ( ) : DragEvent {
18
+ return this . options . nativeEvent ;
19
+ }
20
+
21
+ get position ( ) : Position {
22
+ return this . options . position ;
23
+ }
24
+
25
+ constructor (
26
+ private readonly options : {
27
+ nativeEvent : DragEvent ;
28
+ position : Position ;
29
+ }
30
+ ) {
31
+ super ( ) ;
32
+ }
33
+ }
34
+
8
35
export function directionToPosition ( direction : Direction ) : Position {
9
36
switch ( direction ) {
10
37
case 'above' :
@@ -39,11 +66,6 @@ export function positionToDirection(position: Position): Direction {
39
66
}
40
67
}
41
68
42
- export interface DroptargetEvent {
43
- readonly position : Position ;
44
- readonly nativeEvent : DragEvent ;
45
- }
46
-
47
69
export type Position = 'top' | 'bottom' | 'left' | 'right' | 'center' ;
48
70
49
71
export type CanDisplayOverlay =
@@ -70,6 +92,12 @@ const DEFAULT_SIZE: MeasuredValue = {
70
92
const SMALL_WIDTH_BOUNDARY = 100 ;
71
93
const SMALL_HEIGHT_BOUNDARY = 100 ;
72
94
95
+ export interface DroptargetOptions {
96
+ canDisplayOverlay : CanDisplayOverlay ;
97
+ acceptedTargetZones : Position [ ] ;
98
+ overlayModel ?: DroptargetOverlayModel ;
99
+ }
100
+
73
101
export class Droptarget extends CompositeDisposable {
74
102
private targetElement : HTMLElement | undefined ;
75
103
private overlayElement : HTMLElement | undefined ;
@@ -79,6 +107,10 @@ export class Droptarget extends CompositeDisposable {
79
107
private readonly _onDrop = new Emitter < DroptargetEvent > ( ) ;
80
108
readonly onDrop : Event < DroptargetEvent > = this . _onDrop . event ;
81
109
110
+ private readonly _onWillShowOverlay = new Emitter < WillShowOverlayEvent > ( ) ;
111
+ readonly onWillShowOverlay : Event < WillShowOverlayEvent > =
112
+ this . _onWillShowOverlay . event ;
113
+
82
114
readonly dnd : DragAndDropObserver ;
83
115
84
116
private static USED_EVENT_ID = '__dockview_droptarget_event_is_used__' ;
@@ -89,11 +121,7 @@ export class Droptarget extends CompositeDisposable {
89
121
90
122
constructor (
91
123
private readonly element : HTMLElement ,
92
- private readonly options : {
93
- canDisplayOverlay : CanDisplayOverlay ;
94
- acceptedTargetZones : Position [ ] ;
95
- overlayModel ?: DroptargetOverlayModel ;
96
- }
124
+ private readonly options : DroptargetOptions
97
125
) {
98
126
super ( ) ;
99
127
@@ -142,6 +170,22 @@ export class Droptarget extends CompositeDisposable {
142
170
return ;
143
171
}
144
172
173
+ const willShowOverlayEvent = new WillShowOverlayEvent ( {
174
+ nativeEvent : e ,
175
+ position : quadrant ,
176
+ } ) ;
177
+
178
+ /**
179
+ * Provide an opportunity to prevent the overlay appearing and in turn
180
+ * any dnd behaviours
181
+ */
182
+ this . _onWillShowOverlay . fire ( willShowOverlayEvent ) ;
183
+
184
+ if ( willShowOverlayEvent . defaultPrevented ) {
185
+ this . removeDropTarget ( ) ;
186
+ return ;
187
+ }
188
+
145
189
if ( typeof this . options . canDisplayOverlay === 'boolean' ) {
146
190
if ( ! this . options . canDisplayOverlay ) {
147
191
this . removeDropTarget ( ) ;
@@ -192,7 +236,7 @@ export class Droptarget extends CompositeDisposable {
192
236
} ,
193
237
} ) ;
194
238
195
- this . addDisposables ( this . _onDrop , this . dnd ) ;
239
+ this . addDisposables ( this . _onDrop , this . _onWillShowOverlay , this . dnd ) ;
196
240
}
197
241
198
242
setTargetZones ( acceptedTargetZones : Position [ ] ) : void {
0 commit comments