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.form.field.SwitchableField;
39 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
40 import info.magnolia.ui.form.field.definition.FieldDefinition;
41 import info.magnolia.ui.form.field.definition.OptionGroupFieldDefinition;
42 import info.magnolia.ui.form.field.definition.SelectFieldDefinition;
43 import info.magnolia.ui.form.field.definition.SwitchableFieldDefinition;
44
45 import java.util.HashMap;
46
47 import javax.inject.Inject;
48
49 import org.apache.commons.beanutils.BeanUtils;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 import com.rits.cloning.Cloner;
54 import com.vaadin.data.Item;
55 import com.vaadin.ui.AbstractSelect;
56 import com.vaadin.ui.Field;
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public class SwitchableFieldFactory<D extends FieldDefinition> extends AbstractFieldFactory<SwitchableFieldDefinition, String> {
71 private static final Logger log = LoggerFactory.getLogger(SwitchableFieldFactory.class);
72 private FieldFactoryFactory fieldFactoryFactory;
73 private I18nContentSupport i18nContentSupport;
74 private ComponentProvider componentProvider;
75
76 private HashMap<String, Field<?>> fieldMap;
77 private AbstractSelect selectField;
78
79 @Inject
80 public SwitchableFieldFactory(SwitchableFieldDefinition definition, Item relatedFieldItem, FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport, ComponentProvider componentProvider) {
81 super(definition, relatedFieldItem);
82 this.fieldFactoryFactory = fieldFactoryFactory;
83 this.componentProvider = componentProvider;
84 this.i18nContentSupport = i18nContentSupport;
85 }
86
87 @Override
88 protected Field<String> createFieldComponent() {
89 try {
90
91 this.selectField = createSelectionField();
92
93
94 this.fieldMap = createFieldSet();
95
96 } catch (Exception e) {
97 log.warn("Not able to create a SwitchableField");
98 throw new RuntimeException(e);
99 }
100 return new SwitchableField(fieldMap, selectField);
101 }
102
103
104
105
106 private AbstractSelect createSelectionField() throws Exception {
107
108 SelectFieldDefinition selectDefinition = null;
109 if (definition.getSelectionType().equals("radio")) {
110 selectDefinition = new OptionGroupFieldDefinition();
111 } else {
112 selectDefinition = new SelectFieldDefinition();
113 }
114
115 BeanUtils.copyProperties(selectDefinition, definition);
116
117 AbstractSelect field = (AbstractSelect) createLocalField(selectDefinition);
118 field.addStyleName("horizontal");
119 field.setImmediate(true);
120
121 return field;
122 }
123
124
125
126
127
128
129 private HashMap<String, Field<?>> createFieldSet() {
130
131 HashMap<String, Field<?>> localFieldMap = new HashMap<String, Field<?>>();
132
133 for (ConfiguredFieldDefinition fieldDefinition : definition.getFields()) {
134
135
136
137 ConfiguredFieldDefinition fieldDefinitionClone = new Cloner().deepClone(fieldDefinition);
138 String name = fieldDefinitionClone.getName();
139 fieldDefinitionClone.setName(definition.getName() + fieldDefinition.getName());
140
141 Field<?> field = createLocalField(fieldDefinitionClone);
142 localFieldMap.put(name, field);
143 }
144
145 return localFieldMap;
146 }
147
148 private Field<?> createLocalField(ConfiguredFieldDefinition fieldDefinition) {
149 FieldFactory formField = fieldFactoryFactory.createFieldFactory(fieldDefinition, item);
150 formField.setComponentProvider(componentProvider);
151 formField.setI18nContentSupport(i18nContentSupport);
152 Field<?> field = formField.createField();
153 field.setCaption(null);
154 return field;
155 }
156
157 }