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 package info.magnolia.ui.vaadin.gwt.client.editor.widget.dnd;
35
36 import com.google.gwt.event.dom.client.DragEndEvent;
37 import com.google.gwt.event.dom.client.DragEndHandler;
38 import com.google.gwt.event.dom.client.DragLeaveEvent;
39 import com.google.gwt.event.dom.client.DragLeaveHandler;
40 import com.google.gwt.event.dom.client.DragOverEvent;
41 import com.google.gwt.event.dom.client.DragOverHandler;
42 import com.google.gwt.event.dom.client.DragStartEvent;
43 import com.google.gwt.event.dom.client.DragStartHandler;
44 import com.google.gwt.event.dom.client.DropEvent;
45 import com.google.gwt.event.dom.client.DropHandler;
46 import com.google.gwt.event.shared.EventBus;
47
48 import info.magnolia.ui.vaadin.gwt.client.editor.dom.CmsNode;
49 import info.magnolia.ui.vaadin.gwt.client.editor.event.SortComponentEvent;
50 import info.magnolia.ui.vaadin.gwt.client.editor.widget.controlbar.ComponentBar;
51 import info.magnolia.ui.vaadin.gwt.client.editor.widget.placeholder.ComponentPlaceHolder;
52
53
54
55
56 public class DragAndDropImpl {
57
58 private EventBus eventBus;
59
60 public void dragAndDrop (final EventBus eventBus, final ComponentBar bar) {
61 this.eventBus = eventBus;
62
63 bar.setDraggable(true);
64 bar.addDomHandler(new DragStartHandler() {
65 @Override
66 public void onDragStart(DragStartEvent event) {
67 bar.toggleButtons(false);
68
69 bar.setStyleName("moveSource", true);
70
71 CmsNode area = bar.getCmsNode().getParentArea();
72 if (area != null) {
73 for (CmsNode component : area.getComponents()) {
74 ComponentBar componentBar = (ComponentBar) component.asMgnlElement().getControlBar();
75 if (componentBar != null && componentBar != bar) {
76 componentBar.setStyleName("moveTarget", true);
77 }
78 }
79 ComponentPlaceHolder placeholder = area.asMgnlElement().getComponentPlaceHolder();
80 if (placeholder != null) {
81 placeholder.setStyleName("moveOngoing", true);
82 }
83 }
84
85 int x = bar.getAbsoluteLeft();
86 int y = bar.getAbsoluteTop();
87 event.setData("text", bar.getNodeName() + "," + x +","+y);
88 event.getDataTransfer().setDragImage(bar.getElement(), 10, 10);
89
90 }
91 }, DragStartEvent.getType());
92
93 bar.addDomHandler(new DragEndHandler() {
94 @Override
95 public void onDragEnd(DragEndEvent event) {
96 bar.toggleButtons(true);
97
98 bar.setStyleName("moveSource", false);
99
100 CmsNode area = bar.getCmsNode().getParentArea();
101 if (area != null) {
102 for (CmsNode component : area.getComponents()) {
103 ComponentBar componentBar = (ComponentBar) component.asMgnlElement().getControlBar();
104 if (componentBar != null && componentBar != bar) {
105 componentBar.setStyleName("moveTarget", false);
106 }
107 }
108 ComponentPlaceHolder placeholder = area.asMgnlElement().getComponentPlaceHolder();
109 if (placeholder != null) {
110 placeholder.setStyleName("moveOngoing", false);
111 }
112 }
113 }
114 }, DragEndEvent.getType());
115
116 bar.addDomHandler(new DragOverHandler() {
117 @Override
118 public void onDragOver(DragOverEvent event) {
119 String data = event.getData("text");
120 String[] tokens = data.split(",");
121 String idSource = tokens[0];
122
123 if (!bar.getNodeName().equals(idSource)){
124 bar.setStyleName("moveOver", true);
125 }
126 event.stopPropagation();
127 }
128 }, DragOverEvent.getType());
129
130 bar.addDomHandler(new DragLeaveHandler() {
131
132 @Override
133 public void onDragLeave(DragLeaveEvent event) {
134 bar.setStyleName("moveOver", false);
135 event.stopPropagation();
136 }
137 }, DragLeaveEvent.getType());
138
139 bar.addDomHandler(new DropHandler() {
140 @Override
141 public void onDrop(DropEvent event) {
142 String data = event.getData("text");
143 String[] tokens = data.split(",");
144 String idSource = tokens[0];
145
146 if (!bar.getNodeName().equals(idSource)) {
147 int xTarget = bar.getAbsoluteLeft();
148 int yTarget = bar.getAbsoluteTop();
149 int xOrigin = Integer.valueOf(tokens[1]);
150 int yOrigin = Integer.valueOf(tokens[2]);
151
152 boolean isDragUp = yOrigin > yTarget;
153 boolean isDragDown = !isDragUp;
154 boolean isDragLeft = xOrigin > xTarget;
155 boolean isDragRight = !isDragLeft;
156
157 String order = null;
158
159 if(isDragUp || isDragLeft) {
160 order = "before";
161 } else if(isDragDown || isDragRight) {
162 order = "after";
163 }
164 String parentPath = bar.getPath().substring(0, bar.getPath().lastIndexOf("/"));
165 eventBus.fireEvent(new SortComponentEvent(bar.getWorkspace(), parentPath, idSource, bar.getNodeName(), order));
166
167 }
168
169 event.preventDefault();
170 }
171 }, DropEvent.getType());
172
173 }
174 }