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.form.field.factory;
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.form.field.SwitchableField;
40 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
41 import info.magnolia.ui.form.field.definition.FieldDefinition;
42 import info.magnolia.ui.form.field.definition.Layout;
43 import info.magnolia.ui.form.field.definition.OptionGroupFieldDefinition;
44 import info.magnolia.ui.form.field.definition.SelectFieldDefinition;
45 import info.magnolia.ui.form.field.definition.StaticFieldDefinition;
46 import info.magnolia.ui.form.field.definition.SwitchableFieldDefinition;
47 import info.magnolia.ui.form.field.transformer.Transformer;
48 import info.magnolia.ui.form.field.transformer.composite.DelegatingCompositeFieldTransformer;
49
50 import java.util.ArrayList;
51 import java.util.List;
52
53 import javax.inject.Inject;
54
55 import org.apache.commons.lang3.StringUtils;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 import com.vaadin.data.Item;
60 import com.vaadin.data.util.PropertysetItem;
61 import com.vaadin.ui.Field;
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public class SwitchableFieldFactory<D extends FieldDefinition> extends AbstractFieldFactory<SwitchableFieldDefinition, PropertysetItem> {
76
77 private static final Logger log = LoggerFactory.getLogger(SwitchableFieldFactory.class);
78 private FieldFactoryFactory fieldFactoryFactory;
79 private ComponentProvider componentProvider;
80 private final I18NAuthoringSupport i18nAuthoringSupport;
81
82 @Inject
83 public SwitchableFieldFactory(SwitchableFieldDefinition definition, Item relatedFieldItem, FieldFactoryFactory fieldFactoryFactory, ComponentProvider componentProvider, I18NAuthoringSupport i18nAuthoringSupport) {
84 super(definition, relatedFieldItem);
85 this.fieldFactoryFactory = fieldFactoryFactory;
86 this.componentProvider = componentProvider;
87 this.i18nAuthoringSupport = i18nAuthoringSupport;
88 }
89
90
91
92
93 @Deprecated
94 public SwitchableFieldFactory(SwitchableFieldDefinition definition, Item relatedFieldItem, FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport, ComponentProvider componentProvider) {
95 this(definition, relatedFieldItem, fieldFactoryFactory, componentProvider, componentProvider.getComponent(I18NAuthoringSupport.class));
96 }
97
98 @Override
99 protected Field<PropertysetItem> createFieldComponent() {
100
101 definition.setI18nBasename(getMessages().getBasename());
102
103
104 if (!containsSelectFieldDefinition()) {
105 definition.addField(createSelectFieldDefinition());
106 }
107
108 SwitchableField field = new SwitchableField(definition, fieldFactoryFactory, componentProvider, item, i18nAuthoringSupport);
109 return field;
110 }
111
112
113
114
115 @Override
116 protected Transformer<?> initializeTransformer(Class<? extends Transformer<?>> transformerClass) {
117
118 List<String> propertyNames = new ArrayList<>(definition.getFieldNames());
119 if (!propertyNames.contains(definition.getName())) {
120 propertyNames.add(definition.getName());
121 }
122 return this.componentProvider.newInstance(transformerClass, item, definition, PropertysetItem.class, propertyNames);
123 }
124
125
126
127
128 private boolean containsSelectFieldDefinition() {
129 for (ConfiguredFieldDefinition fieldDefinition : definition.getFields()) {
130 if (StringUtils.equals(fieldDefinition.getName(), definition.getName())) {
131 return true;
132 }
133 }
134 return false;
135 }
136
137
138
139
140
141 protected ConfiguredFieldDefinition createSelectFieldDefinition() {
142 try {
143 SelectFieldDefinition selectDefinition = null;
144
145 String layout = "horizontal";
146 if (definition.getSelectionType().equals("radio")) {
147 selectDefinition = new OptionGroupFieldDefinition();
148 if (definition.getLayout().equals(Layout.vertical)) {
149 layout = "vertical";
150 }
151 } else {
152 selectDefinition = new SelectFieldDefinition();
153 }
154
155 selectDefinition.setOptions(definition.getOptions());
156 selectDefinition.setTransformerClass(null);
157 selectDefinition.setRequired(false);
158 selectDefinition.setSortOptions(false);
159 selectDefinition.setStyleName(layout);
160 selectDefinition.setName(definition.getName());
161
162 if (definition.isI18n() && definition.getTransformerClass().isAssignableFrom(DelegatingCompositeFieldTransformer.class)) {
163 selectDefinition.setI18n(definition.isI18n());
164 }
165 return selectDefinition;
166 } catch (Exception e) {
167 log.warn("Coudn't create the select field.", e.getMessage());
168 StaticFieldDefinition definition = new StaticFieldDefinition();
169 definition.setName(this.definition.getName());
170 definition.setValue("Select definition not correctly initialised. Please check your field configuration");
171 return definition;
172 }
173 }
174
175 }