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.widget.placeholder;
35
36
37 import com.google.gwt.dom.client.Element;
38 import com.google.gwt.dom.client.NativeEvent;
39 import com.google.gwt.dom.client.Style.Cursor;
40 import com.google.gwt.event.dom.client.ClickEvent;
41 import com.google.gwt.event.dom.client.ClickHandler;
42 import com.google.gwt.event.dom.client.MouseDownEvent;
43 import com.google.gwt.event.dom.client.MouseDownHandler;
44 import com.google.gwt.event.shared.EventBus;
45 import com.google.gwt.user.client.ui.FlowPanel;
46 import com.google.gwt.user.client.ui.Label;
47 import com.google.gwt.user.client.ui.PushButton;
48 import info.magnolia.rendering.template.AreaDefinition;
49 import info.magnolia.ui.vaadin.gwt.client.editor.dom.MgnlElement;
50 import info.magnolia.ui.vaadin.gwt.client.editor.event.NewComponentEvent;
51
52 import java.util.Map;
53
54 import static info.magnolia.ui.vaadin.gwt.client.editor.jsni.JavascriptUtils.getI18nMessage;
55
56
57
58
59 public class ComponentPlaceHolder extends AbstractPlaceHolder {
60
61 protected final static String ICON_CLASSNAME = "editorIcon";
62 protected final static String ADD_CLASSNAME = "icon-add-item";
63
64 private boolean showAddButton = false;
65 private String availableComponents = "";
66 private String type = "";
67 private String areaWorkspace = "";
68 private String areaPath = "";
69 private FlowPanel buttonWrapper;
70 private String label;
71 private String labelString;
72
73
74 public ComponentPlaceHolder(EventBus eventBus, MgnlElement mgnlElement) throws IllegalArgumentException {
75
76 super(eventBus, mgnlElement);
77
78 setFields(mgnlElement.getAttributes());
79
80 this.addStyleName("component");
81
82 FlowPanel controlBar = new FlowPanel();
83 controlBar.setStyleName("mgnlEditorBar");
84 controlBar.addStyleName("placeholder");
85
86 buttonWrapper = new FlowPanel();
87 buttonWrapper.setStylePrimaryName("mgnlEditorBarButtons");
88
89 controlBar.add(buttonWrapper);
90 labelString = getI18nMessage("buttons.component.new.js");
91 if (this.label != null && !this.label.isEmpty()) {
92 labelString = getI18nMessage("buttons.new.js") + " " + label + " " +getI18nMessage("buttons.component.js");
93 }
94
95 Label labelName = new Label(labelString);
96 labelName.setStyleName("mgnlEditorBarLabel");
97 controlBar.add(labelName);
98
99 add(controlBar);
100
101 Element marker = getMgnlElement().getComponentElement();
102 boolean onlyBar = (marker != null && marker.getAttribute(AreaDefinition.CMS_ADD).equals("bar"));
103
104 if (!onlyBar) {
105 createBoxPlaceHolder();
106 }
107
108 setVisible(false);
109 createControls();
110 }
111
112 private void createBoxPlaceHolder() {
113
114 FlowPanel elementWrapper = new FlowPanel();
115 elementWrapper.setStyleName("mgnlEditorPlaceholderElements");
116
117 if (this.showAddButton){
118 elementWrapper.getElement().getStyle().setCursor(Cursor.POINTER);
119 elementWrapper.addDomHandler(new MouseDownHandler() {
120
121 @Override
122 public void onMouseDown(MouseDownEvent event) {
123 if(event.getNativeButton() == NativeEvent.BUTTON_RIGHT) {
124 return;
125 }
126 getEventBus().fireEvent(new NewComponentEvent(areaWorkspace, areaPath, availableComponents));
127 }
128 }, MouseDownEvent.getType());
129 }
130 add(elementWrapper);
131
132 }
133
134 private void createButtons() {
135
136 if (this.showAddButton){
137 PushButton button = new PushButton();
138 button.setTitle(getI18nMessage("buttons.add.js") + " " + labelString);
139 button.setStylePrimaryName("mgnlEditorPushButton");
140 button.addStyleName("add");
141
142 button.addClickHandler(new ClickHandler() {
143 @Override
144 public void onClick(ClickEvent event) {
145 getEventBus().fireEvent(new NewComponentEvent(areaWorkspace, areaPath, availableComponents));
146 }
147 });
148 buttonWrapper.add(button);
149 }
150 }
151
152 private void createControls() {
153
154 if (this.showAddButton){
155 final Label add = new Label();
156 add.setStyleName(ICON_CLASSNAME);
157 add.addStyleName(ADD_CLASSNAME);
158 add.addClickHandler(new ClickHandler() {
159 @Override
160 public void onClick(ClickEvent event) {
161 getEventBus().fireEvent(new NewComponentEvent(areaWorkspace, areaPath, availableComponents));
162 }
163 });
164 buttonWrapper.add(add);
165 }
166 }
167
168 private void setFields(Map<String, String> attributes) throws IllegalArgumentException {
169
170 this.showAddButton = Boolean.parseBoolean(attributes.get("showAddButton"));
171 this.type = attributes.get("type");
172
173 this.areaWorkspace = attributes.get("workspace");
174 this.areaPath = attributes.get("path");
175
176 this.label = getMgnlElement().getAttribute("label");
177
178 if(AreaDefinition.TYPE_NO_COMPONENT.equals(this.type)) {
179 this.availableComponents = "";
180 }
181 else {
182 this.availableComponents = attributes.get("availableComponents");
183 }
184 }
185
186 }