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.processor;
35
36 import info.magnolia.rendering.template.AreaDefinition;
37 import info.magnolia.ui.vaadin.gwt.client.editor.dom.MgnlArea;
38 import info.magnolia.ui.vaadin.gwt.client.editor.model.Model;
39 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.AreaBar;
40 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.AreaEndBar;
41 import info.magnolia.ui.vaadin.gwt.client.widget.controlbar.ComponentPlaceHolder;
42
43 import java.util.Map;
44
45 import com.google.gwt.core.client.GWT;
46 import com.google.gwt.dom.client.Element;
47 import com.google.gwt.dom.client.Node;
48
49
50
51
52
53
54
55
56
57 public class AreaProcessor extends AbstractMgnlElementProcessor {
58
59 public static final String ATTRIBUTE_OPTIONAL = "optional";
60 public static final String ATTRIBUTE_CREATED = "created";
61 public static final String ATTRIBUTE_TYPE = "type";
62 public static final String ATTRIBUTE_EDITABLE = "editable";
63 public static final String ATTRIBUTE_AVAILABLE_COMPONENTS = "availableComponents";
64 public static final String ATTRIBUTE_DIALOG = "dialog";
65 public static final String ATTRIBUTE_SHOW_NEW_COMPONENT_AREA = "showNewComponentArea";
66
67 public AreaProcessor(Model model, MgnlArea mgnlElement) {
68 super(model, mgnlElement);
69 }
70
71 @Override
72 public void process() {
73
74 MgnlArea area = getMgnlElement();
75
76 if (hasControlBar(area.getAttributes())) {
77 AreaBar areaBar = new AreaBar.Builder()
78 .withListener(area)
79 .withAdd(area.hasAddButton())
80 .withEdit(area.hasEditButton())
81 .withLevel(area.getLevel())
82 .withLabel(area.getLabel())
83 .withActivationStatus(area.getActivationStatus())
84 .build();
85
86 setEditBar(areaBar);
87 attachWidget();
88
89 if (hasComponentPlaceHolder(area.getAttributes())) {
90 ComponentPlaceHolder placeHolder = new ComponentPlaceHolder.Builder()
91 .withListener(area)
92 .withType(area.isBoxPlaceHolder())
93 .withAddButton(area.hasAddComponentButton())
94 .withLabel(area.getPlaceHolderLabel())
95 .build();
96
97 attachComponentPlaceHolder(placeHolder);
98 addToModel(placeHolder);
99 }
100
101 AreaEndBar endBar = new AreaEndBar();
102 attachAreaEndBar(endBar);
103 addToModel(endBar);
104
105 } else {
106
107 GWT.log("Not creating areabar and area endbar for this element. Missing parameters. Will be deleted.");
108
109
110
111
112
113
114
115
116
117
118 area.delete();
119
120
121 getModel().removeMgnlElement(area);
122 }
123 }
124
125 private void addToModel(ComponentPlaceHolder placeHolder) {
126 getModel().addElements(getMgnlElement(), placeHolder.getElement());
127
128 }
129
130 private void addToModel(AreaEndBar endBar) {
131 getModel().addElements(getMgnlElement(), endBar.getElement());
132 getMgnlElement().setAreaEndBar(endBar);
133 }
134
135 protected boolean hasComponentPlaceHolder(Map<String, String> attributes) {
136
137 final boolean optional = Boolean.parseBoolean(attributes.get(ATTRIBUTE_OPTIONAL));
138 final boolean created = Boolean.parseBoolean(attributes.get(ATTRIBUTE_CREATED));
139
140 if (optional && !created) {
141 return false;
142 }
143
144 final String type = attributes.get(ATTRIBUTE_TYPE);
145 if (AreaDefinition.TYPE_NO_COMPONENT.equals(type) || "".equals(attributes.get(ATTRIBUTE_AVAILABLE_COMPONENTS))) {
146 return false;
147 }
148
149 return !AreaDefinition.TYPE_SINGLE.equals(type) || getMgnlElement().getComponents().isEmpty();
150 }
151
152 protected boolean hasControlBar(Map<String, String> attributes) {
153
154
155 if (getMgnlElement().isInherited() || (attributes.containsKey(ATTRIBUTE_EDITABLE) && !Boolean.parseBoolean(attributes.get(ATTRIBUTE_EDITABLE)))) {
156 return false;
157 }
158
159 final String type = attributes.get(ATTRIBUTE_TYPE);
160 if (Boolean.parseBoolean(attributes.get(ATTRIBUTE_OPTIONAL)) || AreaDefinition.TYPE_SINGLE.equals(type) || Boolean.parseBoolean(attributes.get(ATTRIBUTE_SHOW_NEW_COMPONENT_AREA))) {
161 return true;
162 }
163
164
165 final String dialog = attributes.get(ATTRIBUTE_DIALOG);
166 return !(dialog == null || "".equals(dialog));
167 }
168
169 private void attachAreaEndBar(AreaEndBar controlBar) {
170 if (getMgnlElement().getFirstElement() != null && getMgnlElement().getFirstElement() == getMgnlElement().getLastElement()) {
171 Element element = getMgnlElement().getFirstElement();
172 if (element != null) {
173 element.appendChild(controlBar.getElement());
174 }
175 } else {
176 Element element = getMgnlElement().getEndComment();
177 Node parentNode = element.getParentNode();
178 parentNode.insertBefore(controlBar.getElement(), element);
179 }
180 controlBar.onAttach();
181 }
182
183 private void attachComponentPlaceHolder(ComponentPlaceHolder placeHolder) {
184 Element parent = getMgnlElement().getComponentMarkerElement();
185
186 if (parent == null) {
187 if (getMgnlElement().getLastElement() != null && getMgnlElement().getFirstElement() == getMgnlElement().getLastElement()) {
188 Element element = getMgnlElement().getFirstElement();
189 if (element != null) {
190 element.appendChild(placeHolder.getElement());
191 }
192 } else {
193 Element element = getMgnlElement().getEndComment();
194 Node parentNode = element.getParentNode();
195 parentNode.insertBefore(placeHolder.getElement(), element);
196 }
197 } else {
198 parent.insertFirst(placeHolder.getElement());
199 }
200 placeHolder.onAttach();
201 getMgnlElement().setComponentPlaceHolder(placeHolder);
202 }
203
204 @Override
205 public MgnlArea getMgnlElement() {
206 return (MgnlArea) super.getMgnlElement();
207 }
208 }