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.framework.component;
35
36
37 import info.magnolia.i18nsystem.SimpleTranslator;
38 import info.magnolia.ui.contentapp.browser.preview.PreviewProvider;
39 import info.magnolia.ui.framework.datasource.components.PropertySetFactory;
40
41 import java.util.Map;
42 import java.util.Optional;
43
44 import javax.inject.Inject;
45
46 import org.apache.commons.collections4.MapUtils;
47
48 import com.vaadin.data.PropertySet;
49 import com.vaadin.server.Resource;
50 import com.vaadin.ui.Component;
51 import com.vaadin.ui.CustomComponent;
52 import com.vaadin.ui.FormLayout;
53 import com.vaadin.ui.HorizontalLayout;
54 import com.vaadin.ui.Image;
55 import com.vaadin.ui.Layout;
56
57
58
59
60
61
62
63
64
65
66
67 public abstract class AbstractItemPreviewComponent<T> extends CustomComponent implements ItemPreviewComponent<T> {
68
69 private Component itemDetail;
70 private Component itemPreview;
71 private final Layout rootLayout;
72 private final PreviewProvider<T> previewProvider;
73 private final SimpleTranslator i18n;
74 private final PropertySet<T> propertySet;
75
76
77 @Inject
78 public AbstractItemPreviewComponent(SimpleTranslator i18n, PropertySetFactory<T> propertySetFactory, PreviewProvider<T> previewProvider, Map<String, Class> properties) {
79 if (MapUtils.isEmpty(properties)) {
80 throw new IllegalArgumentException("Map containing properties to be displayed can't be empty or null.");
81 }
82 this.previewProvider = previewProvider;
83 this.i18n = i18n;
84 this.propertySet = propertySetFactory.withProperties(properties);
85 this.rootLayout = new HorizontalLayout();
86 setCompositionRoot(rootLayout);
87 }
88
89 @Override
90 public void onValueChange(T item) {
91 clearRootLayout();
92 Optional.ofNullable(item).ifPresent(i -> {
93 itemDetail = refreshItemDetail(i);
94 itemPreview = refreshItemPreview(i);
95 refreshRootLayout();
96 });
97 }
98
99
100
101
102
103 protected Component refreshItemDetail(T item) {
104 FormLayout itemDetail = new FormLayout();
105 itemDetail.addStyleName("file-details");
106
107 getPropertySet().getProperties()
108 .map(property -> this.createDetailComponent(property.getName(), property.getGetter().apply(item)))
109 .forEach(itemDetail::addComponent);
110
111 return itemDetail;
112 }
113
114
115
116
117 protected abstract Component createDetailComponent(String propertyName, Object value);
118
119
120
121
122
123 protected Component refreshItemPreview(T item) {
124 return getPreviewProvider().getResource(item).map(this::createPreviewImageComponent).orElse(null);
125 }
126
127 protected void clearRootLayout() {
128 rootLayout.setVisible(false);
129 rootLayout.removeAllComponents();
130 removeStyleName("done");
131 }
132
133 protected void refreshRootLayout() {
134 rootLayout.setVisible(true);
135 addStyleName("done");
136
137 Optional.ofNullable(itemPreview).ifPresent(rootLayout::addComponent);
138 Optional.ofNullable(itemDetail).ifPresent(rootLayout::addComponent);
139 }
140
141 protected PropertySet<T> getPropertySet() {
142 return propertySet;
143 }
144
145 protected SimpleTranslator getI18n() {
146 return i18n;
147 }
148
149 protected PreviewProvider<T> getPreviewProvider() {
150 return previewProvider;
151 }
152
153 private Image createPreviewImageComponent(Resource res) {
154 final Image image = new Image("", res);
155 image.addStyleName("file-preview-area");
156 return image;
157 }
158 }