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.contentapp.configuration.column.component;
35
36 import info.magnolia.ui.contentapp.configuration.column.ColumnEditorDefinition;
37 import info.magnolia.ui.contentapp.configuration.column.ColumnType;
38 import info.magnolia.ui.contentapp.configuration.column.ConfiguredColumnDefinition;
39 import info.magnolia.ui.field.FieldDefinition;
40 import info.magnolia.ui.field.FieldFactory;
41 import info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider;
42
43 import java.util.Optional;
44
45 import com.vaadin.data.HasValue;
46 import com.vaadin.data.ValueProvider;
47 import com.vaadin.ui.Component;
48 import com.vaadin.ui.renderers.ComponentRenderer;
49
50
51
52
53 @ColumnType("columnComponent")
54 public class ColumnComponentDefinition<T> extends ConfiguredColumnDefinition<T> {
55
56 public ColumnComponentDefinition() {
57 setRenderer(ComponentRenderer.class);
58 setValueProvider((Class) ComponentValueProvider.class);
59 }
60
61
62
63
64
65
66
67 public static class ComponentValueProvider<S> implements ValueProvider<Object, Component> {
68
69 private final ColumnComponentDefinition<S> componentDefinition;
70 private final ValueProvider<Object, S> wrapped;
71 private final UiContextBoundComponentProvider componentProvider;
72
73 public ComponentValueProvider(ColumnComponentDefinition<S> componentDefinition, ValueProvider<Object, S> wrapped, UiContextBoundComponentProvider componentProvider) {
74 this.componentDefinition = componentDefinition;
75 this.wrapped = wrapped;
76 this.componentProvider = componentProvider;
77 }
78
79 @Override
80 public Component apply(Object item) {
81 return Optional.ofNullable(componentDefinition.getEditor()).map(ColumnEditorDefinition::getField).map((FieldDefinition<S> fieldDefinition) -> {
82 FieldFactory<S> fieldFactory = componentProvider.inChildContext(fieldDefinition).newInstance(fieldDefinition.getFactoryClass());
83 HasValue<S> field = fieldFactory.createField();
84 Component asComponent = (Component) field;
85 asComponent.setEnabled(false);
86 S value = wrapped.apply(item);
87 if (value != null) {
88 field.setValue(value);
89 }
90 return asComponent;
91 }).orElse(null);
92 }
93 }
94 }