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