1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
/*
@VaadinApache2LicenseForJavaFiles@
*/
package com.vaadin.terminal.gwt.server;
import java.io.PrintWriter;
import java.util.Map;
import java.util.logging.Logger;
import com.vaadin.event.Transferable;
import com.vaadin.event.TransferableImpl;
import com.vaadin.event.dd.DragAndDropEvent;
import com.vaadin.event.dd.DragSource;
import com.vaadin.event.dd.DropHandler;
import com.vaadin.event.dd.DropTarget;
import com.vaadin.event.dd.TargetDetails;
import com.vaadin.event.dd.TargetDetailsImpl;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.VariableOwner;
import com.vaadin.terminal.gwt.client.ui.dd.VDragAndDropManager.DragEventType;
import com.vaadin.ui.Component;
public class DragAndDropService implements VariableOwner {
private static final Logger logger = Logger
.getLogger(DragAndDropService.class.getName());
private int lastVisitId;
private boolean lastVisitAccepted = false;
private DragAndDropEvent dragEvent;
private final AbstractCommunicationManager manager;
private AcceptCriterion acceptCriterion;
public DragAndDropService(AbstractCommunicationManager manager) {
this.manager = manager;
}
public void changeVariables(Object source, Map<String, Object> variables) {
Object owner = variables.get("dhowner");
// Validate drop handler owner
if (!(owner instanceof DropTarget)) {
logger.severe("DropHandler owner " + owner
+ " must implement DropTarget");
return;
}
// owner cannot be null here
DropTarget dropTarget = (DropTarget) owner;
lastVisitId = (Integer) variables.get("visitId");
// request may be dropRequest or request during drag operation (commonly
// dragover or dragenter)
boolean dropRequest = isDropRequest(variables);
if (dropRequest) {
handleDropRequest(dropTarget, variables);
} else {
handleDragRequest(dropTarget, variables);
}
}
/**
* Handles a drop request from the VDragAndDropManager.
*
* @param dropTarget
* @param variables
*/
private void handleDropRequest(DropTarget dropTarget,
Map<String, Object> variables) {
DropHandler dropHandler = (dropTarget).getDropHandler();
if (dropHandler == null) {
// No dropHandler returned so no drop can be performed.
logger.fine("DropTarget.getDropHandler() returned null for owner: "
+ dropTarget);
return;
}
/*
* Construct the Transferable and the DragDropDetails for the drop
* operation based on the info passed from the client widgets (drag
* source for Transferable, drop target for DragDropDetails).
*/
Transferable transferable = constructTransferable(dropTarget, variables);
TargetDetails dropData = constructDragDropDetails(dropTarget, variables);
DragAndDropEvent dropEvent = new DragAndDropEvent(transferable,
dropData);
if (dropHandler.getAcceptCriterion().accept(dropEvent)) {
dropHandler.drop(dropEvent);
}
}
/**
* Handles a drag/move request from the VDragAndDropManager.
*
* @param dropTarget
* @param variables
*/
private void handleDragRequest(DropTarget dropTarget,
Map<String, Object> variables) {
lastVisitId = (Integer) variables.get("visitId");
acceptCriterion = dropTarget.getDropHandler().getAcceptCriterion();
/*
* Construct the Transferable and the DragDropDetails for the drag
* operation based on the info passed from the client widgets (drag
* source for Transferable, current target for DragDropDetails).
*/
Transferable transferable = constructTransferable(dropTarget, variables);
TargetDetails dragDropDetails = constructDragDropDetails(dropTarget,
variables);
dragEvent = new DragAndDropEvent(transferable, dragDropDetails);
lastVisitAccepted = acceptCriterion.accept(dragEvent);
}
/**
* Construct DragDropDetails based on variables from client drop target.
* Uses DragDropDetailsTranslator if available, otherwise a default
* DragDropDetails implementation is used.
*
* @param dropTarget
* @param variables
* @return
*/
@SuppressWarnings("unchecked")
private TargetDetails constructDragDropDetails(DropTarget dropTarget,
Map<String, Object> variables) {
Map<String, Object> rawDragDropDetails = (Map<String, Object>) variables
.get("evt");
TargetDetails dropData = dropTarget
.translateDropTargetDetails(rawDragDropDetails);
if (dropData == null) {
// Create a default DragDropDetails with all the raw variables
dropData = new TargetDetailsImpl(rawDragDropDetails, dropTarget);
}
return dropData;
}
private boolean isDropRequest(Map<String, Object> variables) {
return getRequestType(variables) == DragEventType.DROP;
}
private DragEventType getRequestType(Map<String, Object> variables) {
int type = (Integer) variables.get("type");
return DragEventType.values()[type];
}
@SuppressWarnings("unchecked")
private Transferable constructTransferable(DropTarget dropHandlerOwner,
Map<String, Object> variables) {
final Component sourceComponent = (Component) variables
.get("component");
variables = (Map<String, Object>) variables.get("tra");
Transferable transferable = null;
if (sourceComponent != null && sourceComponent instanceof DragSource) {
transferable = ((DragSource) sourceComponent)
.getTransferable(variables);
}
if (transferable == null) {
transferable = new TransferableImpl(sourceComponent, variables);
}
return transferable;
}
public boolean isEnabled() {
return true;
}
public boolean isImmediate() {
return true;
}
void printJSONResponse(PrintWriter outWriter) throws PaintException {
if (isDirty()) {
outWriter.print(", \"dd\":");
JsonPaintTarget jsonPaintTarget = new JsonPaintTarget(manager,
outWriter, false);
jsonPaintTarget.startTag("dd");
jsonPaintTarget.addAttribute("visitId", lastVisitId);
if (acceptCriterion != null) {
jsonPaintTarget.addAttribute("accepted", lastVisitAccepted);
acceptCriterion.paintResponse(jsonPaintTarget);
}
jsonPaintTarget.endTag("dd");
jsonPaintTarget.close();
lastVisitId = -1;
lastVisitAccepted = false;
acceptCriterion = null;
dragEvent = null;
}
}
private boolean isDirty() {
if (lastVisitId > 0) {
return true;
}
return false;
}
}
|