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.preview;
35
36
37 import info.magnolia.i18nsystem.SimpleTranslator;
38 import info.magnolia.ui.contentapp.browser.preview.PreviewProvider;
39 import info.magnolia.ui.datasource.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 protected 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 = getRootLayout();
86 setCompositionRoot(rootLayout);
87 }
88
89 protected Layout getRootLayout() {
90 return rootLayout == null ? new HorizontalLayout() : rootLayout;
91 }
92
93 @Override
94 public void onValueChange(T item) {
95 clearRootLayout();
96 Optional.ofNullable(item).ifPresent(i -> {
97 itemDetail = refreshItemDetail(i);
98 itemPreview = refreshItemPreview(i);
99 refreshRootLayout();
100 });
101 }
102
103
104
105
106
107 protected Component refreshItemDetail(T item) {
108 FormLayout itemDetail = new FormLayout();
109 itemDetail.addStyleName("file-details");
110
111 getPropertySet().getProperties()
112 .map(property -> this.createDetailComponent(property.getName(), property.getGetter().apply(item)))
113 .forEach(itemDetail::addComponent);
114
115 return itemDetail;
116 }
117
118
119
120
121 protected abstract Component createDetailComponent(String propertyName, Object value);
122
123
124
125
126
127 protected Component refreshItemPreview(T item) {
128 return getPreviewProvider().getResource(item).map(this::createPreviewImageComponent).orElse(null);
129 }
130
131 protected void clearRootLayout() {
132 rootLayout.setVisible(false);
133 rootLayout.removeAllComponents();
134 removeStyleName("done");
135 }
136
137 protected void refreshRootLayout() {
138 rootLayout.setVisible(true);
139 addStyleName("done");
140
141 Optional.ofNullable(itemPreview).ifPresent(rootLayout::addComponent);
142 Optional.ofNullable(itemDetail).ifPresent(rootLayout::addComponent);
143 }
144
145 protected PropertySet<T> getPropertySet() {
146 return propertySet;
147 }
148
149 protected SimpleTranslator getI18n() {
150 return i18n;
151 }
152
153 protected PreviewProvider<T> getPreviewProvider() {
154 return previewProvider;
155 }
156
157 private Image createPreviewImageComponent(Resource res) {
158 final Image image = new Image("", res);
159 image.addStyleName("file-preview-area");
160 return image;
161 }
162 }