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.layout.field;
35
36 import info.magnolia.ui.field.EditorPropertyDefinition;
37
38 import java.util.Collection;
39
40 import javax.inject.Inject;
41 import javax.inject.Provider;
42
43 import com.vaadin.ui.Component;
44 import com.vaadin.ui.HorizontalLayout;
45 import com.vaadin.ui.VerticalLayout;
46
47
48
49
50
51
52 public class FieldComponentDecorator {
53
54 private final Collection<Provider<FieldLayoutComponent>> extraComponents;
55
56 @Inject
57 protected FieldComponentDecorator(Collection<Provider<FieldLayoutComponent>> extraComponents) {
58 this.extraComponents = extraComponents;
59 }
60
61 public Component decorateField(Component field, EditorPropertyDefinition editorPropertyDefinition) {
62
63 final HorizontalLayout horizontalLayout = new HorizontalLayout(field);
64 horizontalLayout.addStyleName("help-button-field-layout");
65 horizontalLayout.setSizeFull();
66 horizontalLayout.setSpacing(false);
67 horizontalLayout.setExpandRatio(field, 1);
68 extraComponents.stream()
69 .map(Provider::get)
70 .filter(fieldLayoutComponent -> fieldLayoutComponent.getPosition() == FieldLayoutComponent.Position.horizontal)
71 .peek(component -> component.init(editorPropertyDefinition, field))
72 .sorted((o1, o2) -> o1 instanceof FieldLayoutComponent.Description ? 1 : o2 instanceof FieldLayoutComponent.Description ? -1 : 0)
73 .forEach(horizontalLayout::addComponent);
74
75 final VerticalLayout verticalLayout = new VerticalLayout(horizontalLayout);
76 verticalLayout.setMargin(false);
77 extraComponents.stream()
78 .map(Provider::get)
79 .filter(fieldLayoutComponent -> fieldLayoutComponent.getPosition() == FieldLayoutComponent.Position.vertical)
80 .sorted((o1, o2) -> o1 instanceof FieldLayoutComponent.ValidationLabel ? 1 : o2 instanceof FieldLayoutComponent.ValidationLabel ? -1 : 0)
81 .peek(component -> component.init(editorPropertyDefinition, field))
82 .forEach(verticalLayout::addComponent);
83
84 return new FieldLayoutComponent.Root<>(field, verticalLayout, editorPropertyDefinition);
85 }
86 }