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.widget.dnd;
35
36 import info.magnolia.ui.vaadin.gwt.client.widget.PageEditorFrame;
37 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.eventmanager.ControlBarEventHandler;
38 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.eventmanager.ControlBarEventManager;
39
40 import com.google.gwt.core.client.GWT;
41 import com.google.gwt.dom.client.BodyElement;
42 import com.google.gwt.dom.client.Element;
43 import com.google.gwt.dom.client.NativeEvent;
44 import com.google.gwt.dom.client.Style.Unit;
45 import com.google.gwt.event.dom.client.HasMouseMoveHandlers;
46 import com.google.gwt.event.dom.client.MouseMoveEvent;
47 import com.google.gwt.event.dom.client.MouseMoveHandler;
48 import com.google.gwt.event.shared.HandlerRegistration;
49 import com.google.gwt.user.client.ui.Widget;
50
51
52
53
54
55 public class MoveWidget extends Widget {
56
57 public static final String CLASS_NAME = "mgnlEditorMoveDiv";
58 public static final int OFFSET_FROM_MOUSE = 15;
59
60 private FrameBodyWrapper wrapper;
61
62 private PageEditorFrame frame;
63
64 private ControlBarEventManager eventManager = GWT.create(ControlBarEventManager.class);
65
66 public MoveWidget(Element element) {
67 setElement(element);
68 getElement().setId(CLASS_NAME);
69 }
70
71 public void attach(final PageEditorFrame frame, final int width, final int height) {
72 this.frame = frame;
73
74
75 String widthImp = "width: " + width + Unit.PX.getType() + " !important;";
76 String heightImp = "height: " + height + Unit.PX.getType() + " !important;";
77 getElement().setAttribute("style", widthImp + heightImp);
78
79 final BodyElement frameBody = frame.getBody();
80 frameBody.appendChild(this.getElement());
81
82 this.wrapper = new FrameBodyWrapper(frameBody);
83 wrapper.onAttach();
84
85 eventManager.addMouseMoveHandler(wrapper, new ControlBarEventHandler() {
86 @Override
87 public void handle(NativeEvent event) {
88 int x = event.getClientX() + frame.getContentDocument().getScrollLeft();
89 int y = event.getClientY() + OFFSET_FROM_MOUSE + frame.getContentDocument().getScrollTop();
90 int maxX = frame.getBody().getOffsetWidth() - width;
91 int maxY = frame.getBody().getOffsetHeight() - height - OFFSET_FROM_MOUSE;
92
93 x = (x > maxX) ? maxX : x;
94 y = (y > maxY) ? maxY : y;
95
96 getElement().getStyle().setTop(y, Unit.PX);
97 getElement().getStyle().setLeft(x, Unit.PX);
98 }
99 });
100 super.onAttach();
101
102 }
103
104 public void detach() {
105 frame.getBody().removeChild(this.getElement());
106 eventManager.removeMouseMoveHandler(wrapper);
107 wrapper.onDetach();
108 super.onDetach();
109 }
110
111
112
113
114 class FrameBodyWrapper extends Widget implements HasMouseMoveHandlers {
115
116 FrameBodyWrapper(Element frame) {
117 setElement(frame);
118 }
119
120 @Override
121 public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
122 return addDomHandler(handler, MouseMoveEvent.getType());
123 }
124
125 @Override
126 protected void onAttach() {
127 super.onAttach();
128 }
129
130 @Override
131 protected void onDetach() {
132 super.onDetach();
133 }
134 }
135
136 }