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.browser;
35
36 import info.magnolia.ui.contentapp.browser.context.ValueContext;
37 import info.magnolia.ui.contentapp.browser.drop.RowDragger;
38 import info.magnolia.ui.contentapp.configuration.ListViewDefinition;
39 import info.magnolia.ui.framework.datasource.components.SelectedItems;
40 import info.magnolia.util.OptionalConsumer;
41
42 import java.util.Optional;
43
44 import javax.inject.Inject;
45
46 import org.vaadin.patrik.FastNavigation;
47
48 import com.vaadin.shared.ui.grid.DropMode;
49 import com.vaadin.ui.CustomComponent;
50 import com.vaadin.ui.Grid;
51
52
53
54
55
56 public class ListView<T> extends CustomComponent implements ContentView {
57
58 protected final Grid<T> grid;
59
60 @Inject
61 public ListView(ValueContext<T> valueContext, ListViewDefinition<T> definition) {
62 ListPresenter<T> listPresenter = this.create(ListPresenter.class);
63 bindInstance(ListPresenter.class, listPresenter);
64
65 grid = Grid.withPropertySet(listPresenter.getPropertySet());
66 grid.setSizeFull();
67 grid.setSelectionMode(definition.isMultiSelect() ? Grid.SelectionMode.MULTI : Grid.SelectionMode.SINGLE);
68 grid.addSelectionListener(event -> valueContext.current().set(SelectedItems.of(event.getAllSelectedItems())));
69 grid.addItemClickListener(event -> {
70 grid.deselectAll();
71 grid.select(event.getItem());
72 });
73
74 FastNavigation<T> navigation = new FastNavigation<>(grid, true);
75 navigation.setOpenEditorWithSingleClick(false);
76 navigation.setOpenEditorOnTyping(true);
77 navigation.addEditorOpenShortcut(13);
78
79 listPresenter.createColumns(grid);
80
81 Optional.ofNullable(definition.getDropConstraint()).ifPresent(dropConstraint -> getComponentProvider().newInstance(RowDragger.class, grid, DropMode.BETWEEN, dropConstraint));
82
83 valueContext
84 .current()
85 .observe(value -> OptionalConsumer.of(value)
86 .ifPresent(ts -> {
87 if (ts.size() > 0) {
88 ts.stream().forEach(grid::select);
89 } else {
90 grid.deselectAll();
91 }
92 })
93 .ifNotPresent(grid::deselectAll));
94
95 grid.setDataProvider(listPresenter.getDataProvider());
96
97 setSizeFull();
98 setCompositionRoot(grid);
99 }
100 }