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.dam.external.app.field;
35
36 import info.magnolia.cms.i18n.I18nContentSupport;
37 import info.magnolia.dam.api.Asset;
38 import info.magnolia.dam.api.metadata.AssetMetadata;
39 import info.magnolia.dam.api.metadata.AssetMetadataDefinition;
40 import info.magnolia.dam.api.metadata.AssetMetadataRegistry;
41 import info.magnolia.dam.external.app.field.definition.AssetMetadataFieldDefinition;
42 import info.magnolia.objectfactory.ComponentProvider;
43 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
44 import info.magnolia.ui.form.field.definition.FieldDefinition;
45 import info.magnolia.ui.form.field.factory.FieldFactory;
46 import info.magnolia.ui.form.field.factory.FieldFactoryFactory;
47 import info.magnolia.ui.vaadin.integration.ItemAdapter;
48
49 import java.util.List;
50
51 import org.apache.commons.lang3.StringUtils;
52
53 import com.vaadin.data.Item;
54 import com.vaadin.data.util.BeanItem;
55 import com.vaadin.ui.AbstractComponent;
56 import com.vaadin.ui.AbstractOrderedLayout;
57 import com.vaadin.ui.Component;
58 import com.vaadin.ui.CustomField;
59 import com.vaadin.ui.Field;
60 import com.vaadin.ui.FormLayout;
61 import com.vaadin.ui.TabSheet;
62 import com.vaadin.ui.VerticalLayout;
63
64
65
66
67 public class AssetMetadataField extends CustomField<BeanItem> {
68
69 protected final FieldFactoryFactory fieldFactoryFactory;
70 protected final I18nContentSupport i18nContentSupport;
71 protected final ComponentProvider componentProvider;
72 protected final AssetMetadataFieldDefinition definition;
73 protected final Item relatedFieldItem;
74 protected final AssetMetadataRegistry metadataRegistry;
75 protected AbstractOrderedLayout root;
76 private TabSheet tabsheet;
77
78 public AssetMetadataField(AssetMetadataFieldDefinition definition, FieldFactoryFactory fieldFactoryFactory, I18nContentSupport i18nContentSupport, ComponentProvider componentProvider, AssetMetadataRegistry metadataRegistry, Item relatedFieldItem) {
79 this.definition = definition;
80 this.fieldFactoryFactory = fieldFactoryFactory;
81 this.componentProvider = componentProvider;
82 this.i18nContentSupport = i18nContentSupport;
83 this.relatedFieldItem = relatedFieldItem;
84 this.metadataRegistry = metadataRegistry;
85 }
86
87 @Override
88 protected Component initContent() {
89
90 root = new FormLayout();
91 setWidth(100, Unit.PERCENTAGE);
92 setHeight(-1, Unit.PIXELS);
93 addStyleName("switchablefield");
94 root.setWidth(100, Unit.PERCENTAGE);
95 root.setHeight(-1, Unit.PIXELS);
96 root.setSpacing(true);
97 tabsheet = new TabSheet();
98 tabsheet.setHeight(250, Unit.PIXELS);
99
100 initFields();
101 return root;
102 }
103
104 protected void initFields() {
105 BeanItem<Asset> value = (BeanItem<Asset>) getPropertyDataSource().getValue();
106 initFields(value);
107
108 if (relatedFieldItem instanceof ItemAdapter && ((ItemAdapter) relatedFieldItem).isNew()) {
109 getPropertyDataSource().setValue(getValue());
110 }
111 }
112
113 protected void initFields(BeanItem<Asset> beanItem) {
114 root.removeAllComponents();
115 if (beanItem == null || beanItem.getBean() == null) {
116 return;
117 }
118
119 Asset asset = beanItem.getBean();
120
121 BeanToFieldDefinition convertor = new BeanToFieldDefinition();
122 for (AssetMetadataDefinition metadataDefinition : metadataRegistry.getAll()) {
123 if (asset.supports(metadataDefinition.getMetadataClass())) {
124
125 VerticalLayout sheet = createSheet();
126 tabsheet.addTab(sheet, metadataDefinition.getNamespace());
127
128 List<ConfiguredFieldDefinition> fields = convertor.getFiledDefinition(metadataDefinition.getMetadataClass());
129 AssetMetadata metadata = asset.getMetadata(metadataDefinition.getMetadataClass());
130 BeanItem<AssetMetadata> metadataBeanItem = new BeanItem<AssetMetadata>(metadata);
131 for (ConfiguredFieldDefinition fieldDefinition : fields) {
132 Field<?> field = createLocalField(fieldDefinition, metadataBeanItem, false);
133 sheet.addComponent(field);
134 }
135 }
136 }
137 root.addComponent(tabsheet);
138 }
139
140
141
142
143 protected VerticalLayout createSheet() {
144 VerticalLayout sheet = new VerticalLayout();
145 sheet.setWidth(100, Unit.PERCENTAGE);
146 sheet.setHeight(-1, Unit.PIXELS);
147 sheet.setSpacing(true);
148 return sheet;
149 }
150
151 protected Field<?> createLocalField(FieldDefinition fieldDefinition, Object item, boolean setCaptionToNull) {
152 FieldFactory fieldfactory = fieldFactoryFactory.createFieldFactory(fieldDefinition, item);
153 fieldfactory.setComponentProvider(componentProvider);
154 fieldfactory.setI18nContentSupport(i18nContentSupport);
155
156 if (fieldDefinition instanceof ConfiguredFieldDefinition) {
157 ((ConfiguredFieldDefinition) fieldDefinition).setI18nBasename(definition.getI18nBasename());
158 }
159 Field<?> field = fieldfactory.createField();
160 if (field instanceof AbstractComponent) {
161 ((AbstractComponent) field).setImmediate(true);
162 }
163
164 if (setCaptionToNull) {
165 field.setCaption(null);
166 } else if (StringUtils.isNotBlank(fieldDefinition.getLabel())) {
167 field.setCaption(fieldDefinition.getLabel());
168 }
169
170 field.setWidth(100, Unit.PERCENTAGE);
171 return field;
172 }
173
174 @Override
175 public Class<? extends BeanItem> getType() {
176 return (Class<? extends BeanItem>) BeanItem.class;
177 }
178 }