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.ConfiguredColumnDefinition;
38 import info.magnolia.ui.field.FieldDefinition;
39 import info.magnolia.ui.field.factory.FieldFactory;
40 import info.magnolia.ui.framework.ioc.UiContextBoundComponentProvider;
41
42 import java.util.Optional;
43
44 import com.vaadin.data.Converter;
45 import com.vaadin.data.HasValue;
46 import com.vaadin.data.Result;
47 import com.vaadin.data.ValueContext;
48 import com.vaadin.data.ValueProvider;
49 import com.vaadin.ui.Component;
50 import com.vaadin.ui.renderers.ComponentRenderer;
51
52 import lombok.AllArgsConstructor;
53
54
55
56
57 public class ColumnComponentDefinition<T> extends ConfiguredColumnDefinition<T> {
58
59 public ColumnComponentDefinition() {
60 setRenderer(ComponentRenderer.class);
61 setValueProvider((Class) ComponentValueProvider.class);
62 }
63
64
65
66
67
68
69
70 public static class ComponentValueProvider<S> implements ValueProvider<Object, Component> {
71
72 private final ColumnComponentDefinition<S> componentDefinition;
73 private final ValueProvider<Object, S> wrapped;
74 private final UiContextBoundComponentProvider componentProvider;
75
76 public ComponentValueProvider(ColumnComponentDefinition<S> componentDefinition, ValueProvider<Object, S> wrapped, UiContextBoundComponentProvider componentProvider) {
77 this.componentDefinition = componentDefinition;
78 this.wrapped = wrapped;
79 this.componentProvider = componentProvider;
80 }
81
82 @Override
83 public Component apply(Object item) {
84 return Optional.ofNullable(componentDefinition.getEditor()).map(ColumnEditorDefinition::getField).map((FieldDefinition<S> fieldDefinition) -> {
85 FieldFactory<S> fieldFactory = componentProvider.inChildContext(fieldDefinition).newInstance(fieldDefinition.getFactoryClass());
86 HasValue<S> field = fieldFactory.createField();
87 Component asComponent = (Component) field;
88 asComponent.setEnabled(false);
89 S value = wrapped.apply(item);
90 if (value != null) {
91 field.setValue(value);
92 }
93 return asComponent;
94 }).orElse(null);
95 }
96
97
98
99
100
101 @AllArgsConstructor
102 public static class ComponentConverter implements Converter<Object, Object> {
103
104 private HasValue value;
105
106 @Override
107 public Result<Object> convertToModel(Object value, ValueContext context) {
108 return Result.ok(this.value);
109 }
110
111 @Override
112 public Object convertToPresentation(Object value, ValueContext context) {
113 return value;
114 }
115 }
116 }
117 }