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.dialog.formdialog;
35
36 import info.magnolia.cms.i18n.I18nContentSupport;
37 import info.magnolia.objectfactory.ComponentProvider;
38 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
39 import info.magnolia.ui.api.view.View;
40 import info.magnolia.ui.form.Form;
41 import info.magnolia.ui.form.FormItem;
42 import info.magnolia.ui.form.FormTab;
43 import info.magnolia.ui.form.definition.FormDefinition;
44 import info.magnolia.ui.form.definition.TabDefinition;
45 import info.magnolia.ui.form.field.definition.FieldDefinition;
46 import info.magnolia.ui.form.field.factory.FieldFactory;
47 import info.magnolia.ui.form.field.factory.FieldFactoryFactory;
48 import info.magnolia.ui.vaadin.form.FormViewReduced;
49 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
50 import info.magnolia.ui.vaadin.richtext.TextAreaStretcher;
51
52 import java.util.List;
53 import java.util.Locale;
54
55 import javax.inject.Inject;
56 import javax.jcr.Node;
57
58 import org.apache.commons.lang3.StringUtils;
59 import org.vaadin.openesignforms.ckeditor.CKEditorTextField;
60
61 import com.vaadin.data.Item;
62 import com.vaadin.ui.AbstractComponent;
63 import com.vaadin.ui.Component;
64 import com.vaadin.ui.CssLayout;
65 import com.vaadin.ui.Field;
66 import com.vaadin.ui.TextArea;
67
68
69
70
71 public class FormBuilder {
72
73 private final FieldFactoryFactory fieldFactoryFactory;
74 private final I18nContentSupport i18nContentSupport;
75 private final I18NAuthoringSupport i18nAuthoringSupport;
76 private final ComponentProvider componentProvider;
77
78 @Inject
79 public FormBuilder(FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport,
80 I18NAuthoringSupport i18nAuthoringSupport, ComponentProvider componentProvider) {
81 this.fieldFactoryFactory = fieldFactoryFactory;
82 this.componentProvider = componentProvider;
83 this.i18nContentSupport = i18nContentSupport;
84 this.i18nAuthoringSupport = i18nAuthoringSupport;
85 }
86
87
88
89
90 public void buildForm(FormView view, FormDefinition formDefinition, Item item, FormItem parent) {
91 final String description = formDefinition.getDescription();
92 final String label = formDefinition.getLabel();
93
94
95
96
97
98 if (StringUtils.isNotBlank(description) && !isMessageKey(description)) {
99 view.setDescription(description);
100 }
101
102 if (StringUtils.isNotBlank(label) && !isMessageKey(label)) {
103 view.setCaption(label);
104 }
105
106 buildReducedForm(formDefinition, view, item, parent);
107 boolean hasI18NAwareFields = hasI18NAwareFields(formDefinition);
108
109 if (hasI18NAwareFields) {
110 if (item instanceof JcrItemAdapter) {
111 javax.jcr.Item jcrItem = ((JcrItemAdapter) item).getJcrItem();
112 if (jcrItem.isNode()) {
113 List<Locale> locales = i18nAuthoringSupport.getAvailableLocales((Node) jcrItem);
114 view.setAvailableLocales(locales);
115 view.setCurrentLocale(i18nAuthoringSupport.getAuthorLocale() != null ? i18nAuthoringSupport.getAuthorLocale() : i18nContentSupport.getFallbackLocale());
116 }
117 }
118 }
119 }
120
121 public View buildView(FormDefinition formDefinition, Item item) {
122
123 final CssLayout view = new CssLayout();
124 view.setSizeFull();
125
126 for (TabDefinition tabDefinition : formDefinition.getTabs()) {
127 List<FieldDefinition> fields = tabDefinition.getFields();
128 if (fields.size() == 0) {
129 continue;
130 }
131 for (final FieldDefinition fieldDefinition : fields) {
132 final FieldFactory formField = fieldFactoryFactory.createFieldFactory(fieldDefinition, item);
133 if (formField == null) {
134 continue;
135 }
136 formField.setComponentProvider(componentProvider);
137 formField.setI18nContentSupport(i18nContentSupport);
138
139 final View fieldView = formField.getView();
140
141 view.addComponent(fieldView.asVaadinComponent());
142
143 }
144 }
145 return new View() {
146 @Override
147 public Component asVaadinComponent() {
148 return view;
149 }
150 };
151 }
152
153 public void buildReducedForm(FormDefinition formDefinition, FormViewReduced view, Item item, FormItem parent) {
154 final Form form = new Form(formDefinition);
155 form.setParent(parent);
156 view.setItemDataSource(item);
157
158 boolean firstFieldIsBuilt = false;
159
160 for (TabDefinition tabDefinition : formDefinition.getTabs()) {
161 List<FieldDefinition> fields = tabDefinition.getFields();
162 if (fields.size() == 0) {
163 continue;
164 }
165 FormTab tab = new FormTab(tabDefinition);
166 tab.setParent(form);
167 for (final FieldDefinition fieldDefinition : fields) {
168 final FieldFactory formField = fieldFactoryFactory.createFieldFactory(fieldDefinition, item);
169 if (formField == null) {
170 continue;
171 }
172 formField.setComponentProvider(componentProvider);
173 formField.setI18nContentSupport(i18nContentSupport);
174 formField.setParent(tab);
175 final Field<?> field = formField.createField();
176 if (field instanceof AbstractComponent) {
177 ((AbstractComponent) field).setImmediate(true);
178 }
179 tab.addField(field);
180 final String helpDescription = fieldDefinition.getDescription();
181
182 if (StringUtils.isNotBlank(helpDescription) && !isMessageKey(helpDescription)) {
183 tab.setComponentHelpDescription(field, helpDescription);
184 }
185
186 if (field instanceof TextArea || field instanceof CKEditorTextField) {
187 TextAreaStretcher.extend(field);
188 }
189
190 view.addField(field);
191
192 if (!firstFieldIsBuilt) {
193 field.focus();
194 firstFieldIsBuilt = true;
195 }
196 }
197 view.addFormSection(tabDefinition.getLabel(), tab.getContainer());
198 }
199 view.setShowAllEnabled(formDefinition.getTabs().size() > 1);
200
201 }
202
203 private boolean hasI18NAwareFields(FormDefinition formDefinition) {
204 boolean hasI18NAwareFields = false;
205 for (TabDefinition tabDefinition : formDefinition.getTabs()) {
206 for (final FieldDefinition fieldDefinition : tabDefinition.getFields()) {
207 hasI18NAwareFields |= fieldDefinition.isI18n();
208 }
209 }
210 return hasI18NAwareFields;
211
212 }
213
214
215
216
217 @Deprecated
218 private boolean isMessageKey(final String text) {
219 return !text.contains(" ") && text.contains(".") && !text.endsWith(".");
220 }
221 }