1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.vectomatic.dnd;
19
20 import com.google.gwt.dom.client.Element;
21 import com.google.gwt.dom.client.NativeEvent;
22 import com.google.gwt.dom.client.Node;
23 import com.google.gwt.event.dom.client.DomEvent;
24 import com.google.gwt.event.dom.client.DragEnterEvent;
25 import com.google.gwt.event.dom.client.DragEnterHandler;
26 import com.google.gwt.event.dom.client.DragLeaveEvent;
27 import com.google.gwt.event.dom.client.DragLeaveHandler;
28 import com.google.gwt.event.dom.client.DragOverEvent;
29 import com.google.gwt.event.dom.client.DragOverHandler;
30 import com.google.gwt.event.dom.client.DropEvent;
31 import com.google.gwt.event.dom.client.DropHandler;
32 import com.google.gwt.event.dom.client.HasDragEnterHandlers;
33 import com.google.gwt.event.dom.client.HasDragLeaveHandlers;
34 import com.google.gwt.event.dom.client.HasDragOverHandlers;
35 import com.google.gwt.event.dom.client.HasDropHandlers;
36 import com.google.gwt.event.shared.EventBus;
37 import com.google.gwt.event.shared.GwtEvent;
38 import com.google.gwt.event.shared.HandlerRegistration;
39 import com.google.gwt.event.shared.SimpleEventBus;
40 import com.google.gwt.user.client.ui.SimplePanel;
41
42
43
44
45
46
47
48
49
50
51 public class DropPanel extends SimplePanel implements HasDropHandlers, HasDragEnterHandlers, HasDragLeaveHandlers, HasDragOverHandlers {
52
53
54
55 static protected EventBus eventBus;
56
57
58
59
60
61 public static EventBus getEventBus() {
62 if (eventBus == null) {
63 eventBus = new SimpleEventBus();
64 }
65 return eventBus;
66 }
67
68
69
70
71
72 public static void setEventBus(EventBus eventBus) {
73 DropPanel.eventBus = eventBus;
74 }
75
76
77
78
79 public DropPanel() {
80 super();
81 setup(getElement());
82 }
83
84 private final native void setup(Element elem)
85
86
87
88
89
90
91
92
93 ;
94
95 public void fireEvent(GwtEvent<?> event) {
96 revive(event);
97 getEventBus().fireEventFromSource(event, this);
98 }
99
100
101
102
103
104 private static final native void revive(GwtEvent<?> event)
105
106 ;
107
108
109
110
111
112
113 public void dispatch(NativeEvent event) {
114
115
116
117 if ("dragenter".equals(event.getType())
118 || "dragleave".equals(event.getType())) {
119 if (isChildOf((Node)event.getCurrentEventTarget().cast(), (Node)event.getRelatedEventTarget().cast())) {
120 return;
121 }
122 }
123
124
125 DomEvent.fireNativeEvent(event, this, (Element)event.getCurrentEventTarget().cast());
126 }
127
128
129
130
131
132
133
134
135
136
137 protected native boolean isChildOf(Node root, Node node)
138
139
140
141
142
143
144
145 ;
146
147
148 @Override
149 public HandlerRegistration addDropHandler(DropHandler handler) {
150 return getEventBus().addHandlerToSource(DropEvent.getType(), this, handler);
151 }
152
153 @Override
154 public HandlerRegistration addDragLeaveHandler(DragLeaveHandler handler) {
155 return getEventBus().addHandlerToSource(DragLeaveEvent.getType(), this, handler);
156 }
157
158 @Override
159 public HandlerRegistration addDragEnterHandler(DragEnterHandler handler) {
160 return getEventBus().addHandlerToSource(DragEnterEvent.getType(), this, handler);
161 }
162
163 @Override
164 public HandlerRegistration addDragOverHandler(DragOverHandler handler) {
165 return getEventBus().addHandlerToSource(DragOverEvent.getType(), this, handler);
166 }
167
168 }