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;
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.definition.ConfiguredFieldDefinition;
40 import info.magnolia.ui.form.field.definition.SwitchableFieldDefinition;
41 import info.magnolia.ui.form.field.factory.FieldFactoryFactory;
42
43 import java.util.HashMap;
44
45 import org.apache.commons.lang3.StringUtils;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 import com.vaadin.data.Item;
50 import com.vaadin.data.util.PropertysetItem;
51 import com.vaadin.ui.Component;
52 import com.vaadin.ui.Field;
53 import com.vaadin.ui.Label;
54 import com.vaadin.ui.VerticalLayout;
55
56
57
58
59
60
61
62 public class SwitchableField extends AbstractCustomMultiField<SwitchableFieldDefinition, PropertysetItem> {
63 private static final Logger log = LoggerFactory.getLogger(SwitchableField.class);
64
65
66
67 private HashMap<String, Field<?>> fieldMap = new HashMap<String, Field<?>>();
68
69 public SwitchableField(SwitchableFieldDefinition definition, FieldFactoryFactory fieldFactoryFactory, ComponentProvider componentProvider, Item relatedFieldItem, I18NAuthoringSupport i18nAuthoringSupport) {
70 super(definition, fieldFactoryFactory, componentProvider, relatedFieldItem, i18nAuthoringSupport);
71 }
72
73
74
75
76 @Deprecated
77 public SwitchableField(SwitchableFieldDefinition definition, FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport, ComponentProvider componentProvider, Item relatedFieldItem) {
78 this(definition, fieldFactoryFactory, componentProvider, relatedFieldItem, componentProvider.getComponent(I18NAuthoringSupport.class));
79 }
80
81 @Override
82 protected Component initContent() {
83
84 root = new VerticalLayout();
85 setWidth(100, Unit.PERCENTAGE);
86 setHeight(-1, Unit.PIXELS);
87 addStyleName("switchablefield");
88 root.setWidth(100, Unit.PERCENTAGE);
89 root.setHeight(-1, Unit.PIXELS);
90 root.setSpacing(true);
91
92
93 initFields();
94 return root;
95 }
96
97 @Override
98 protected void initFields(PropertysetItem fieldValues) {
99 root.removeAllComponents();
100 fieldMap.clear();
101
102 for (ConfiguredFieldDefinition fieldDefinition : definition.getFields()) {
103 String name = fieldDefinition.getName();
104 Field<?> field = createLocalField(fieldDefinition, fieldValues.getItemProperty(fieldDefinition.getName()), false);
105
106 if (!field.isVisible()) {
107 continue;
108 }
109 if (fieldValues.getItemProperty(fieldDefinition.getName()) == null) {
110 fieldValues.addItemProperty(fieldDefinition.getName(), field.getPropertyDataSource());
111 }
112 field.setWidth(100, Unit.PERCENTAGE);
113 fieldMap.put(name, field);
114
115 if (StringUtils.equals(fieldDefinition.getName(), definition.getName())) {
116 root.addComponentAsFirst(field);
117 }else {
118 root.addComponent(field);
119 }
120
121 }
122
123
124 Field<?> selectField = fieldMap.get(definition.getName());
125 selectField.setCaption(null);
126 selectField.addValueChangeListener(createSelectValueChangeListener());
127 selectField.addValueChangeListener(selectionListener);
128 switchField((String) selectField.getValue());
129 }
130
131
132
133
134
135
136 private ValueChangeListener createSelectValueChangeListener() {
137 ValueChangeListener listener;
138 listener = new ValueChangeListener() {
139
140 @Override
141 public void valueChange(com.vaadin.data.Property.ValueChangeEvent event) {
142 final String valueString = String.valueOf(event.getProperty().getValue());
143 switchField(valueString);
144 }
145
146 };
147 return listener;
148 }
149
150
151
152
153 private void switchField(String fieldName) {
154
155 if (root.getComponentCount() < 2 && StringUtils.equals(((Field<?>) root.getComponent(0)).getId(), definition.getName())) {
156 log.warn("{} is not associated to a field. Nothing will be displayed.", fieldName);
157 root.addComponent(new Label("No field configured for this switchable field "), 1);
158 return;
159 }
160
161 for(String innerFieldName:fieldMap.keySet()) {
162 Field<?> field = fieldMap.get(innerFieldName);
163
164 if (StringUtils.equals(innerFieldName, fieldName) || StringUtils.equals(innerFieldName, definition.getName())) {
165 field.setVisible(true);
166 } else {
167 field.setVisible(false);
168 }
169 }
170 }
171
172 @Override
173 public Class<? extends PropertysetItem> getType() {
174 return PropertysetItem.class;
175 }
176
177 }