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.rendering.template.AreaDefinition;
39 import info.magnolia.ui.vaadin.gwt.client.editor.event.EditAreaEvent;
40 import info.magnolia.ui.vaadin.gwt.client.editor.event.NewAreaEvent;
41 import info.magnolia.ui.vaadin.gwt.client.editor.event.NewComponentEvent;
42 import info.magnolia.ui.vaadin.gwt.client.shared.AreaElement;
43 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.AreaEndBar;
44 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.ComponentPlaceHolder;
45 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.listener.AreaListener;
46
47 import com.google.gwt.dom.client.Element;
48 import com.google.gwt.event.shared.EventBus;
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public class MgnlArea extends MgnlElement implements AreaListener {
66 public static final String EDITOR_INIT_CLASS_NAME = "init";
67 private AreaEndBar areaEndBar;
68 private ComponentPlaceHolder componentPlaceHolder;
69 private Element componentMarkerElement;
70 private EventBus eventBus;
71
72
73
74
75 public MgnlArea(MgnlElement parent, EventBus eventBus) {
76 super(parent);
77 this.eventBus = eventBus;
78 }
79
80 private AreaEndBar getAreaEndBar() {
81 return areaEndBar;
82 }
83
84 public void setAreaEndBar(AreaEndBar areaEndBar) {
85 this.areaEndBar = areaEndBar;
86 }
87
88 private ComponentPlaceHolder getComponentPlaceHolder() {
89 return componentPlaceHolder;
90 }
91
92 public void setComponentPlaceHolder(ComponentPlaceHolder componentPlaceHolder) {
93 this.componentPlaceHolder = componentPlaceHolder;
94 }
95
96 public void setComponentMarkerElement(Element componentElement) {
97 this.componentMarkerElement = componentElement;
98 }
99
100 public Element getComponentMarkerElement() {
101 return componentMarkerElement;
102 }
103
104 @Override
105 public AreaElement getTypedElement() {
106 String availableComponents = getAttribute("availableComponents");
107 AreaElement area = new AreaElement(getAttribute("workspace"), getAttribute("path"), getAttribute("dialog"), availableComponents);
108
109 boolean areaHasChildComponents = getComponents().size() > 0;
110 boolean optional = Boolean.parseBoolean(getAttribute("optional"));
111 boolean created = Boolean.parseBoolean(getAttribute("created"));
112 boolean hasAvailableComponents = availableComponents != null && !availableComponents.isEmpty();
113 boolean addible = true;
114 if (getAttributes().containsKey(OperationPermissionDefinition.ADDIBLE)) {
115 addible = Boolean.parseBoolean(getAttribute(OperationPermissionDefinition.ADDIBLE));
116 }
117
118 area.setOptional(optional);
119 area.setCreated(created);
120 area.setAddible(addible && hasAvailableComponents && !(optional && !created) && !(isTypeSingle() && areaHasChildComponents) && !isMaxComponentsReached());
121
122 return area;
123 }
124
125 public boolean isTypeSingle() {
126 return "single".equals(getAttribute("type"));
127 }
128
129 public boolean isMaxComponentsReached() {
130 boolean showAddButton = Boolean.parseBoolean(getAttribute("showAddButton"));
131 boolean showNewComponentArea = Boolean.parseBoolean(getAttribute("showNewComponentArea"));
132
133 return showNewComponentArea && !showAddButton;
134 }
135
136 @Override
137 public void createOptionalArea() {
138 eventBus.fireEvent(new NewAreaEvent(getTypedElement()));
139 }
140
141 @Override
142 public void editArea() {
143 eventBus.fireEvent(new EditAreaEvent(getTypedElement()));
144 }
145
146 @Override
147 public void createNewComponent() {
148 eventBus.fireEvent(new NewComponentEvent(getTypedElement()));
149 }
150
151 @Override
152 public boolean hasAddButton() {
153 boolean optional = Boolean.parseBoolean(getAttribute("optional"));
154 boolean created = Boolean.parseBoolean(getAttribute("created"));
155
156 return optional && !created;
157 }
158
159 @Override
160 public boolean hasEditButton() {
161 boolean optional = Boolean.parseBoolean(getAttribute("optional"));
162 boolean created = Boolean.parseBoolean(getAttribute("created"));
163 boolean dialog = null != getAttribute("dialog");
164
165 if (dialog) {
166
167 if (!optional || (optional && created)) {
168 return true;
169 }
170 }
171 return false;
172 }
173
174 @Override
175 public boolean hasAddComponentButton() {
176 return Boolean.parseBoolean(getAttribute("showAddButton"));
177 }
178
179 @Override
180 public String getLabel() {
181 String label = getAttribute("label");
182 boolean optional = Boolean.parseBoolean(getAttribute("optional"));
183 return label + ((optional) ? " (optional)" : "");
184 }
185
186 @Override
187 public boolean isBoxPlaceHolder() {
188 Element marker = getComponentMarkerElement();
189 boolean onlyBar = (marker != null && marker.getAttribute(AreaDefinition.CMS_ADD).equals("bar"));
190 return !onlyBar;
191 }
192
193 @Override
194 public String getPlaceHolderLabel() {
195 String label = getAttribute("label");
196 String labelString;
197
198
199 if (isMaxComponentsReached()) {
200 labelString = "Maximum of components reached.";
201 } else {
202 labelString = "New Component";
203 if (label != null && !label.isEmpty()) {
204 labelString = "New" + " " + label + " " + "Component";
205 }
206 }
207 return labelString;
208 }
209
210 @Override
211 public int getActivationStatus() {
212 boolean isOptionalArea = Boolean.parseBoolean(getAttribute("optional"));
213 boolean isCreatedArea = Boolean.parseBoolean(getAttribute("created"));
214
215 if (isOptionalArea && !isCreatedArea) {
216 return -1;
217 }else if (containsAttribute(ACTIVATION_STATUS_KEY)) {
218 return Integer.parseInt(getAttribute(ACTIVATION_STATUS_KEY));
219 }
220 return NodeTypes.Activatable.ACTIVATION_STATUS_NOT_ACTIVATED;
221 }
222
223 public void removeFocus() {
224 if (getControlBar() != null) {
225 getControlBar().removeFocus();
226 }
227
228 if (getAreaEndBar() != null) {
229 getAreaEndBar().removeFocus();
230 }
231 }
232
233 public void setFocus(boolean child) {
234 if (getControlBar() != null) {
235 getControlBar().setFocus(child);
236 }
237 if (getAreaEndBar() != null) {
238 getAreaEndBar().setFocus(child);
239 }
240 }
241
242 public void setVisible(boolean visible) {
243 if (getControlBar() != null) {
244 getControlBar().setVisible(visible);
245 }
246 if (getAreaEndBar() != null) {
247 getAreaEndBar().setVisible(visible);
248 }
249 }
250
251 public void setPlaceHolderVisible(boolean visible) {
252 if (getComponentPlaceHolder() != null) {
253 getComponentPlaceHolder().setVisible(visible);
254 }
255 }
256
257 public void toggleInitFocus(boolean visible) {
258 if (visible) {
259 getControlBar().addStyleName(EDITOR_INIT_CLASS_NAME);
260 getAreaEndBar().addStyleName(EDITOR_INIT_CLASS_NAME);
261 getAreaEndBar().addStyleName(EDITOR_INIT_CLASS_NAME);
262 } else {
263 getControlBar().removeStyleName(EDITOR_INIT_CLASS_NAME);
264 getAreaEndBar().removeStyleName(EDITOR_INIT_CLASS_NAME);
265 }
266 }
267
268 public void onDragStart(boolean isDrag) {
269 if (getComponentPlaceHolder() != null) {
270 getComponentPlaceHolder().setStyleName("moveOngoing", isDrag);
271 }
272 }
273 }