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.FormFieldFactory;
40
41 import java.util.Locale;
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.AbstractField;
50 import com.vaadin.ui.AbstractSingleSelect;
51 import com.vaadin.ui.Component;
52 import com.vaadin.ui.renderers.ComponentRenderer;
53
54 import lombok.AllArgsConstructor;
55
56
57
58
59 public class ColumnComponentDefinition extends ConfiguredColumnDefinition {
60
61 public ColumnComponentDefinition() {
62 setRenderer(ComponentRenderer.class);
63 setValueProvider(ComponentValueProvider.class);
64 }
65
66
67
68
69
70 @AllArgsConstructor
71 public static class ComponentValueProvider<S> implements ValueProvider<S, Component> {
72
73 private final ColumnComponentDefinition componentDefinition;
74 private final FormFieldFactory formFieldFactory;
75 private final ValueProvider wrapped;
76
77 @Override
78 public Component apply(S t) {
79 return Optional.ofNullable(componentDefinition.getEditor()).map(ColumnEditorDefinition::getField).map(fieldDefinition -> {
80 final Component component = formFieldFactory.createField((FieldDefinition<?>) fieldDefinition, Locale.getDefault());
81 if (component instanceof AbstractField) {
82 ((AbstractField) component).setReadOnly(true);
83 } else if (component instanceof AbstractSingleSelect) {
84 ((AbstractSingleSelect) component).setReadOnly(true);
85 }
86 Object value = wrapped.apply(t);
87 if (value != null) {
88 ((HasValue) component).setValue(value);
89 }
90 return component;
91 }).orElse(null);
92 }
93
94
95
96
97
98 @AllArgsConstructor
99 public static class ComponentConverter implements Converter<Object, Object> {
100
101 private HasValue value;
102
103 @Override
104 public Result<Object> convertToModel(Object value, ValueContext context) {
105 return Result.ok(this.value);
106 }
107
108 @Override
109 public Object convertToPresentation(Object value, ValueContext context) {
110 return value;
111 }
112 }
113 }
114 }