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 if (hasControlBar(getMgnlElement().getAttributes())) {
75 AreaBar areaBar = new AreaBar(getMgnlElement());
76 setEditBar(areaBar);
77 attachWidget();
78
79 if (hasComponentPlaceHolder(getMgnlElement().getAttributes())) {
80 ComponentPlaceHolder placeHolder = new ComponentPlaceHolder(getMgnlElement());
81 attachComponentPlaceHolder(placeHolder);
82 addToModel(placeHolder);
83 }
84
85 AreaEndBar endBar = new AreaEndBar(getMgnlElement());
86 attachAreaEndBar(endBar);
87 addToModel(endBar);
88
89 } else {
90
91 GWT.log("Not creating areabar and area endbar for this element. Missing parameters. Will be deleted.");
92
93
94
95
96
97 getMgnlElement().delete();
98
99
100 getModel().removeMgnlElement(getMgnlElement());
101 }
102 }
103
104 private void addToModel(ComponentPlaceHolder placeHolder) {
105 getModel().addElements(getMgnlElement(), placeHolder.getElement());
106
107 }
108
109 private void addToModel(AreaEndBar endBar) {
110 getModel().addElements(getMgnlElement(), endBar.getElement());
111 getMgnlElement().setAreaEndBar(endBar);
112 }
113
114 protected boolean hasComponentPlaceHolder(Map<String, String> attributes) {
115
116 final boolean optional = Boolean.parseBoolean(attributes.get(ATTRIBUTE_OPTIONAL));
117 final boolean created = Boolean.parseBoolean(attributes.get(ATTRIBUTE_CREATED));
118
119 if (optional && !created) {
120 return false;
121 }
122
123 final String type = attributes.get(ATTRIBUTE_TYPE);
124 if (AreaDefinition.TYPE_NO_COMPONENT.equals(type) || "".equals(attributes.get(ATTRIBUTE_AVAILABLE_COMPONENTS))) {
125 return false;
126 }
127
128 return !AreaDefinition.TYPE_SINGLE.equals(type) || getMgnlElement().getComponents().isEmpty();
129 }
130
131 protected boolean hasControlBar(Map<String, String> attributes) {
132
133
134 if (getMgnlElement().isInherited() || (attributes.containsKey(ATTRIBUTE_EDITABLE) && !Boolean.parseBoolean(attributes.get(ATTRIBUTE_EDITABLE)))) {
135 return false;
136 }
137
138 final String type = attributes.get(ATTRIBUTE_TYPE);
139 if (Boolean.parseBoolean(attributes.get(ATTRIBUTE_OPTIONAL)) || AreaDefinition.TYPE_SINGLE.equals(type) || Boolean.parseBoolean(attributes.get(ATTRIBUTE_SHOW_NEW_COMPONENT_AREA))) {
140 return true;
141 }
142
143
144 final String dialog = attributes.get(ATTRIBUTE_DIALOG);
145 return !(dialog == null || "".equals(dialog));
146 }
147
148 private void attachAreaEndBar(AreaEndBar controlBar) {
149 if (getMgnlElement().getFirstElement() != null && getMgnlElement().getFirstElement() == getMgnlElement().getLastElement()) {
150 Element element = getMgnlElement().getFirstElement();
151 if (element != null) {
152 element.appendChild(controlBar.getElement());
153 }
154 } else {
155 Element element = getMgnlElement().getEndComment();
156 Node parentNode = element.getParentNode();
157 parentNode.insertBefore(controlBar.getElement(), element);
158 }
159 controlBar.onAttach();
160 }
161
162 private void attachComponentPlaceHolder(ComponentPlaceHolder placeHolder) {
163 Element parent = getMgnlElement().getComponentMarkerElement();
164
165 if (parent == null) {
166 if (getMgnlElement().getLastElement() != null && getMgnlElement().getFirstElement() == getMgnlElement().getLastElement()) {
167 Element element = getMgnlElement().getFirstElement();
168 if (element != null) {
169 element.appendChild(placeHolder.getElement());
170 }
171 } else {
172 Element element = getMgnlElement().getEndComment();
173 Node parentNode = element.getParentNode();
174 parentNode.insertBefore(placeHolder.getElement(), element);
175 }
176 } else {
177 parent.insertFirst(placeHolder.getElement());
178 }
179 placeHolder.onAttach();
180 getMgnlElement().setComponentPlaceHolder(placeHolder);
181 }
182
183 @Override
184 public MgnlArea getMgnlElement() {
185 return (MgnlArea) super.getMgnlElement();
186 }
187 }