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.field.factory;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.ui.field.ComboBoxFieldDefinition;
38 import info.magnolia.ui.field.SelectFieldSupport;
39
40 import java.util.Optional;
41 import java.util.stream.Stream;
42
43 import javax.inject.Inject;
44
45 import com.vaadin.data.provider.AbstractDataProvider;
46 import com.vaadin.data.provider.DataProvider;
47 import com.vaadin.data.provider.Query;
48 import com.vaadin.ui.ComboBox;
49
50
51
52
53
54
55
56 public class ComboBoxFieldFactory<T, D extends ComboBoxFieldDefinition<T>> extends AbstractSelectFieldFactory<D, T> {
57
58 @Inject
59 public ComboBoxFieldFactory(D definition, ComponentProvider componentProvider, SelectFieldSupport<T> selectFieldSupport) {
60 super(definition, componentProvider, selectFieldSupport);
61 }
62
63 @Override
64 protected ComboBox<T> createFieldComponent() {
65 final ComboBox<T> select = new ComboBox<>();
66 select.addAttachListener(event -> {
67 if (!select.isEnabled()) {
68 select.setDataProvider(EmptyDataProvider.getInstance());
69 }
70 });
71 select.setScrollToSelectedItem(getDefinition().isScrollToSelectedItem());
72 select.setEmptySelectionAllowed(getDefinition().isEmptySelectionAllowed());
73 select.setTextInputAllowed(getDefinition().isTextInputAllowed());
74 select.setPopupWidth(getDefinition().getPopWidth());
75 select.setEmptySelectionCaption(getDefinition().getEmptySelectionCaption());
76 select.setPlaceholder(getDefinition().getPlaceholder());
77 select.setPageLength(getDefinition().getPageLength());
78 select.setNewItemProvider(Optional.ofNullable(getDefinition().getNewItemProviderClass())
79 .map(aClass -> componentProvider.newInstance(aClass))
80 .orElse(null)
81 );
82 return select;
83 }
84
85 @Override
86 protected DataProvider<T, String> getDataProvider() {
87 return getDefinition().isReadOnly() ? EmptyDataProvider.getInstance() : super.getDataProvider();
88 }
89
90 static class EmptyDataProvider<T> extends AbstractDataProvider<T, String> {
91
92 private static final EmptyDataProvider<?> INSTANCE = new EmptyDataProvider<>();
93
94 @Override
95 public boolean isInMemory() {
96 return true;
97 }
98
99 @Override
100 public int size(Query<T, String> query) {
101 return 0;
102 }
103
104 @Override
105 public Stream<T> fetch(Query<T, String> query) {
106 return Stream.empty();
107 }
108
109 public static <T> EmptyDataProvider<T> getInstance() {
110 return (EmptyDataProvider<T>) INSTANCE;
111 }
112 }
113 }