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 private final int width;
60 private final int height;
61
62 private FrameBodyWrapper wrapper;
63
64 private PageEditorFrame frame;
65
66 private ControlBarEventManager eventManager = GWT.create(ControlBarEventManager.class);
67
68 public MoveWidget(Element element, int width, int height) {
69 this.width = width;
70 this.height = height;
71 setElement(element);
72 getElement().setId(CLASS_NAME);
73 }
74
75 public void attach(final PageEditorFrame frame) {
76 this.frame = frame;
77
78
79 String widthImp = "width: " + width + Unit.PX.getType() + " !important;";
80 String heightImp = "height: " + height + Unit.PX.getType() + " !important;";
81 getElement().setAttribute("style", widthImp + heightImp);
82
83 final BodyElement frameBody = frame.getBody();
84 frameBody.appendChild(this.getElement());
85
86 this.wrapper = new FrameBodyWrapper(frameBody);
87 wrapper.onAttach();
88
89 eventManager.addMouseMoveHandler(wrapper, new ControlBarEventHandler() {
90 @Override
91 public void handle(NativeEvent event) {
92 int x = event.getClientX() + frame.getContentDocument().getScrollLeft();
93 int y = event.getClientY() + OFFSET_FROM_MOUSE + frame.getContentDocument().getScrollTop();
94 int maxX = frame.getBody().getOffsetWidth() - width;
95 int maxY = frame.getBody().getOffsetHeight() - height - OFFSET_FROM_MOUSE;
96
97 x = (x > maxX) ? maxX : x;
98 y = (y > maxY) ? maxY : y;
99
100 getElement().getStyle().setTop(y, Unit.PX);
101 getElement().getStyle().setLeft(x, Unit.PX);
102 }
103 });
104 super.onAttach();
105
106 }
107
108 public void detach() {
109 frame.getBody().removeChild(this.getElement());
110 eventManager.removeMouseMoveHandler(wrapper);
111 wrapper.onDetach();
112 super.onDetach();
113 }
114
115
116
117
118 class FrameBodyWrapper extends Widget implements HasMouseMoveHandlers {
119
120 FrameBodyWrapper(Element frame) {
121 setElement(frame);
122 }
123
124 @Override
125 public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
126 return addDomHandler(handler, MouseMoveEvent.getType());
127 }
128
129 @Override
130 protected void onAttach() {
131 super.onAttach();
132 }
133
134 @Override
135 protected void onDetach() {
136 super.onDetach();
137 }
138 }
139
140 }