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