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.controlbar;
35
36 import info.magnolia.ui.vaadin.gwt.client.editor.dom.MgnlComponent;
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 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.listener.ComponentListener;
40
41 import com.google.gwt.core.client.GWT;
42 import com.google.gwt.dom.client.NativeEvent;
43 import com.google.gwt.dom.client.Style;
44 import com.google.gwt.event.dom.client.ChangeEvent;
45 import com.google.gwt.event.dom.client.ChangeHandler;
46 import com.google.gwt.event.dom.client.DragDropEventBase;
47 import com.google.gwt.user.client.Element;
48 import com.google.gwt.user.client.ui.FlowPanel;
49 import com.google.gwt.user.client.ui.Label;
50 import com.google.gwt.user.client.ui.ListBox;
51
52
53
54
55 public class ComponentBar extends AbstractBar {
56
57 private static final String MOVE_ICON_CLASS_NAME = "icon-move";
58 private static final String MOVE_SOURCE_CLASS_NAME = "moveSource";
59 private static final String MOVE_TARGET_CLASS_NAME = "moveTarget";
60 private static final String MOVE_OVER_CLASS_NAME = "moveOver";
61
62 private static final String HAS_VARIANTS_ICON_NAME = "icon-has-variants";
63 private static final String VARIANT_SELECTOR_CLASS_NAME = "variantSelector";
64
65 private static final String ACTION_SELECT_COMPONENT_VARIANT = "selectComponentVariant";
66 private static final String ATTRIBUTE_VARIANTS = "variants";
67 private static final String ATTRIBUTE_VARIANT_TITLES = "variantTitles";
68 private static final String ATTRIBUTE_SELECTED_VARIANT = "selectedVariant";
69
70 private final ComponentListener listener;
71
72 private ControlBarEventManager eventManager = GWT.create(ControlBarEventManager.class);
73
74 public ComponentBar(MgnlComponent mgnlElement) {
75 super(mgnlElement);
76
77 this.listener = mgnlElement;
78 addStyleName(COMPONENT_CLASS_NAME);
79
80 initLayout();
81
82 if (listener.isMovable() && DragDropEventBase.isSupported()) {
83 registerDragStartHandler();
84 setDraggable(true);
85 }
86 }
87
88 public void setDraggable(boolean draggable) {
89 if (DragDropEventBase.isSupported()) {
90 if (draggable) {
91 this.getElement().setDraggable(Element.DRAGGABLE_TRUE);
92 getStyle().setCursor(Style.Cursor.MOVE);
93 } else {
94 this.getElement().setDraggable(Element.DRAGGABLE_FALSE);
95 getStyle().setCursor(Style.Cursor.DEFAULT);
96 }
97 }
98 }
99
100 @Override
101 protected String getLabel() {
102 return listener.getLabel();
103 }
104
105 @Override
106 protected void createControls() {
107 final String variantsAttribute = listener.getAttribute(ATTRIBUTE_VARIANTS);
108 if (variantsAttribute != null) {
109 final ListBox variantSelect = new ListBox();
110 variantSelect.setStyleName(VARIANT_SELECTOR_CLASS_NAME);
111 variantSelect.addChangeHandler(new ChangeHandler() {
112 @Override
113 public void onChange(ChangeEvent event) {
114 listener.onComponentAction(ACTION_SELECT_COMPONENT_VARIANT, variantSelect.getSelectedValue());
115 }
116 });
117 final String selectedVariant = listener.getAttribute(ATTRIBUTE_SELECTED_VARIANT);
118 final String[] variants = variantsAttribute.split(",");
119 final String[] variantTitles = listener.getAttribute(ATTRIBUTE_VARIANT_TITLES).split(",");
120 int selectedIndex = 0;
121
122 for (int i = 0; i < variants.length; i++) {
123 variantSelect.addItem(variantTitles[i], variants[i]);
124 if (variants[i].equals(selectedVariant)) {
125 selectedIndex = i;
126 }
127 }
128 variantSelect.setSelectedIndex(selectedIndex);
129
130 final Label hasVariantsIcon = new Label();
131 hasVariantsIcon.setStyleName(ICON_CLASS_NAME);
132 hasVariantsIcon.addStyleName(HAS_VARIANTS_ICON_NAME);
133 addButton(hasVariantsIcon);
134
135 FlowPanel variantSelectorDiv = new FlowPanel();
136 variantSelectorDiv.addStyleName(VARIANT_SELECTOR_CLASS_NAME);
137 variantSelectorDiv.add(variantSelect);
138 addButton(variantSelectorDiv);
139 }
140 if (listener.hasEditButton()) {
141 final Label edit = new Label();
142 edit.setStyleName(ICON_CLASS_NAME);
143 edit.addStyleName(EDIT_CLASS_NAME);
144 eventManager.addClickOrTouchHandler(edit, new ControlBarEventHandler() {
145 @Override
146 public void handle(NativeEvent event) {
147 listener.editComponent();
148 }
149 });
150 addButton(edit);
151 }
152 if (listener.isMovable()) {
153 final Label move = new Label();
154 move.setStyleName(ICON_CLASS_NAME);
155 move.addStyleName(MOVE_ICON_CLASS_NAME);
156 eventManager.addClickOrTouchHandler(move, new ControlBarEventHandler() {
157 @Override
158 public void handle(NativeEvent event) {
159 listener.onMoveStart(false);
160 }
161 });
162 addButton(move);
163 }
164 }
165
166 private void registerDragStartHandler() {
167 eventManager.addDragStartHandler(this, new ControlBarEventHandler() {
168 @Override
169 public void handle(NativeEvent event) {
170 event.getDataTransfer().setData("text", "dummyPayload");
171 event.getDataTransfer().setDragImage(getElement(), 10, 10);
172 listener.onMoveStart(true);
173 }
174 });
175
176 eventManager.addDragEndHandler(this, new ControlBarEventHandler() {
177 @Override
178 public void handle(NativeEvent event) {
179 listener.onMoveCancel();
180 }
181 });
182 }
183
184 public void registerDragAndDropHandlers() {
185 eventManager.addDragOverHandler(this, new ControlBarEventHandler() {
186 @Override
187 public void handle(NativeEvent event) {
188 setMoveOver(true);
189 event.stopPropagation();
190 }
191 });
192
193
194 eventManager.addDragLeaveHandler(this, new ControlBarEventHandler() {
195 @Override
196 public void handle(NativeEvent event) {
197 setMoveOver(false);
198 event.stopPropagation();
199 }
200 });
201
202 eventManager.addDropHandler(this, new ControlBarEventHandler() {
203 @Override
204 public void handle(NativeEvent event) {
205 listener.onMoveStop();
206 event.preventDefault();
207 }
208 });
209 }
210
211 public void unregisterDragAndDropHandlers() {
212 eventManager.unregisterDnDHandlers(this);
213 }
214
215 public void registerMoveHandlers() {
216 eventManager.addMouseDownHandler(this, new ControlBarEventHandler() {
217 @Override
218 public void handle(NativeEvent event) {
219 listener.onMoveStop();
220 }
221 });
222
223 eventManager.addMouseOverHandler(this, new ControlBarEventHandler() {
224 @Override
225 public void handle(NativeEvent event) {
226 setMoveOver(true);
227 }
228 });
229
230 eventManager.addMouseOutHandler(this, new ControlBarEventHandler() {
231 @Override
232 public void handle(NativeEvent event) {
233 setMoveOver(false);
234 }
235 });
236 }
237
238 public void unregisterMoveHandlers() {
239 eventManager.unregisterMoveHandlers(this);
240 }
241
242 public void setMoveTarget(boolean target) {
243 setStyleName(MOVE_TARGET_CLASS_NAME, target);
244 }
245
246 public void setMoveOver(boolean over) {
247 setStyleName(MOVE_OVER_CLASS_NAME, over);
248 }
249
250 public void setMoveSource(boolean source) {
251 setStyleName(MOVE_SOURCE_CLASS_NAME, source);
252 }
253
254 @Override
255 protected int getActivationStatus() {
256 return listener.getActivationStatus();
257 }
258 }