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.dom;
35
36 import info.magnolia.cms.security.operations.OperationPermissionDefinition;
37 import info.magnolia.ui.vaadin.gwt.client.editor.event.ComponentStartMoveEvent;
38 import info.magnolia.ui.vaadin.gwt.client.editor.event.ComponentStopMoveEvent;
39 import info.magnolia.ui.vaadin.gwt.client.editor.event.EditComponentEvent;
40 import info.magnolia.ui.vaadin.gwt.client.editor.event.SortComponentEvent;
41 import info.magnolia.ui.vaadin.gwt.client.shared.AreaElement;
42 import info.magnolia.ui.vaadin.gwt.client.shared.ComponentElement;
43 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.ComponentBar;
44 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.listener.ComponentListener;
45
46 import java.util.Iterator;
47 import java.util.LinkedList;
48 import java.util.List;
49
50 import com.google.gwt.event.shared.EventBus;
51 import com.google.gwt.event.shared.HandlerRegistration;
52
53
54
55
56
57
58 public class MgnlComponent extends MgnlElement implements ComponentListener {
59
60 private final EventBus eventBus;
61 private List<HandlerRegistration> handlers = new LinkedList<HandlerRegistration>();
62
63 public MgnlComponent(MgnlElement parent, EventBus eventBus) {
64 super(parent);
65 this.eventBus = eventBus;
66 }
67
68 @Override
69 public ComponentElement getTypedElement() {
70 ComponentElement component = new ComponentElement(getAttribute("workspace"), getAttribute("path"), getAttribute("dialog"));
71 boolean inherited = Boolean.parseBoolean(getAttribute("inherited"));
72
73 boolean deletable = true;
74 if (getAttributes().containsKey(OperationPermissionDefinition.DELETABLE)) {
75 deletable = Boolean.parseBoolean(getAttribute(OperationPermissionDefinition.DELETABLE));
76 }
77
78 component.setDeletable(deletable && !inherited);
79 component.setWritable(hasEditButton());
80 component.setMoveable(isMovable());
81 return component;
82 }
83
84 @Override
85 public void editComponent() {
86 eventBus.fireEvent(new EditComponentEvent(getTypedElement()));
87 }
88
89
90
91
92
93
94 private void sortComponent(MgnlComponent target) {
95 MgnlArea area = getParentArea();
96 if (area != null) {
97
98
99 AreaElement areaElement = area.getTypedElement();
100 areaElement.setSourceComponent(getTypedElement());
101 areaElement.setTargetComponent(target.getTypedElement());
102 areaElement.setSortOrder(getSortOrder(target));
103
104 SortComponentEvent sortComponentEvent = new SortComponentEvent(areaElement);
105 eventBus.fireEvent(sortComponentEvent);
106 }
107 }
108
109 @Override
110 public String getLabel() {
111 return getAttribute("label");
112 }
113
114 @Override
115 public boolean hasEditButton() {
116 boolean inherited = Boolean.parseBoolean(getAttribute("inherited"));
117 boolean hasDialog = getAttribute("dialog") != null && getAttribute("dialog") != "";
118 boolean writable = true;
119 if (getAttributes().containsKey(OperationPermissionDefinition.WRITABLE)) {
120 writable = Boolean.parseBoolean(getAttribute(OperationPermissionDefinition.WRITABLE));
121 }
122 return writable && hasDialog && !inherited;
123 }
124
125 @Override
126 public boolean isMovable() {
127 boolean inherited = Boolean.parseBoolean(getAttribute("inherited"));
128 boolean movable = true;
129 if (getAttributes().containsKey(OperationPermissionDefinition.MOVEABLE)) {
130 movable = Boolean.parseBoolean(getAttribute(OperationPermissionDefinition.MOVEABLE));
131 }
132 return movable && !inherited;
133 }
134
135
136
137
138
139
140
141
142 @Override
143 public void onMoveStart(boolean isDrag) {
144 if (isDrag) {
145 doStartMove(isDrag);
146 } else {
147 eventBus.fireEvent(new ComponentStartMoveEvent());
148 }
149 }
150
151
152
153
154
155
156
157 public void doStartMove(boolean isDrag) {
158 setMoveSource(true);
159
160 for (MgnlComponent component : getSiblingComponents()) {
161 component.registerMoveTarget(isDrag);
162 }
163
164 handlers.add(eventBus.addHandler(ComponentStopMoveEvent.TYPE, new ComponentStopMoveEvent.ComponentStopMoveEventHandler() {
165 @Override
166 public void onStop(ComponentStopMoveEvent componentStopMoveEvent) {
167
168 setMoveSource(false);
169
170 Iterator<HandlerRegistration> it = handlers.iterator();
171 while (it.hasNext()) {
172 it.next().removeHandler();
173 it.remove();
174 }
175 MgnlComponent target = componentStopMoveEvent.getTargetComponent();
176 if (target != null) {
177 sortComponent(target);
178 }
179 }
180 }));
181 }
182
183
184
185
186
187
188 @Override
189 public void onMoveStop() {
190 eventBus.fireEvent(new ComponentStopMoveEvent(this, false));
191 }
192
193
194
195
196
197
198
199
200 @Override
201 public void onMoveCancel() {
202 eventBus.fireEvent(new ComponentStopMoveEvent(null, false));
203 }
204
205
206
207
208
209 private void registerMoveTarget(final boolean isDrag) {
210 setMoveTarget(true);
211
212 if (isDrag) {
213 registerDragAndDropHandlers();
214 } else {
215 setDraggable(false);
216 registerMoveHandlers();
217 }
218 handlers.add(eventBus.addHandler(ComponentStopMoveEvent.TYPE, new ComponentStopMoveEvent.ComponentStopMoveEventHandler() {
219 @Override
220 public void onStop(ComponentStopMoveEvent componentMoveEvent) {
221 unregisterMoveTarget(isDrag);
222 setMoveOver(false);
223 }
224 }));
225 }
226
227
228
229
230
231 private void unregisterMoveTarget(boolean isDrag) {
232 setMoveTarget(false);
233
234 if (isDrag) {
235 unregisterDragAndDropHandlers();
236 } else {
237 setDraggable(true);
238 unregisterMoveHandlers();
239 }
240
241 Iterator<HandlerRegistration> it = handlers.iterator();
242 while (it.hasNext()) {
243 it.next().removeHandler();
244 it.remove();
245 }
246 }
247
248 private void registerMoveHandlers() {
249 if (getControlBar() != null) {
250 getControlBar().registerMoveHandlers();
251 }
252 }
253
254 private void unregisterMoveHandlers() {
255 if (getControlBar() != null) {
256 getControlBar().unregisterMoveHandlers();
257 }
258 }
259
260 private void registerDragAndDropHandlers() {
261 if (getControlBar() != null) {
262 getControlBar().registerDragAndDropHandlers();
263 }
264 }
265
266 private void unregisterDragAndDropHandlers() {
267 if (getControlBar() != null) {
268 getControlBar().unregisterDragAndDropHandlers();
269 }
270 }
271
272 private void setDraggable(boolean draggable) {
273 if (getControlBar() != null) {
274 getControlBar().setDraggable(draggable);
275 }
276 }
277
278 public void setVisible(boolean visible) {
279 if (getControlBar() != null) {
280 getControlBar().setVisible(visible);
281 }
282 }
283
284 public void removeFocus() {
285 if (getControlBar() != null) {
286 getControlBar().removeFocus();
287 }
288 }
289
290 public void setFocus() {
291 if (getControlBar() != null) {
292 getControlBar().setFocus(false);
293 }
294 }
295
296 public void setMoveTarget(boolean moveTarget) {
297 if (getControlBar() != null) {
298 getControlBar().setMoveTarget(moveTarget);
299 }
300 }
301
302 public void setMoveOver(boolean moveTarget) {
303 if (getControlBar() != null) {
304 getControlBar().setMoveOver(moveTarget);
305 }
306 }
307
308 private void setMoveSource(boolean source) {
309 if (getControlBar() != null) {
310 getControlBar().setMoveSource(source);
311 }
312 }
313
314
315 @Override
316 public ComponentBar getControlBar() {
317 return (ComponentBar) super.getControlBar();
318 }
319
320 private String getSortOrder(MgnlComponent target) {
321
322 int xTarget = target.getControlBar().getAbsoluteLeft();
323 int yTarget = target.getControlBar().getAbsoluteTop();
324 int xThis = getControlBar().getAbsoluteLeft();
325 int yThis = getControlBar().getAbsoluteTop();
326
327 boolean isDragUp = yThis > yTarget;
328 boolean isDragDown = !isDragUp;
329 boolean isDragLeft = xThis > xTarget;
330 boolean isDragRight = !isDragLeft;
331
332 String order = null;
333
334 if (isDragUp || isDragLeft) {
335 order = "before";
336 } else if (isDragDown || isDragRight) {
337 order = "after";
338 }
339 return order;
340 }
341
342 private List<MgnlComponent> getSiblingComponents() {
343 List<MgnlComponent> siblings = new LinkedList<MgnlComponent>();
344 MgnlArea area = getParentArea();
345 for(MgnlComponent component : area.getComponents()) {
346 if (component != this) {
347 siblings.add(component);
348 }
349 }
350 return siblings;
351 }
352
353 public int getHeight() {
354 if (getControlBar() != null) {
355 return getControlBar().getOffsetHeight();
356 }
357 return 0;
358 }
359
360 public int getWidth() {
361 if (getControlBar() != null) {
362 return getControlBar().getOffsetWidth();
363 }
364 return 0;
365 }
366 }