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 static java.util.stream.Collectors.toSet;
37
38 import info.magnolia.objectfactory.Components;
39 import info.magnolia.ui.ValueContext;
40 import info.magnolia.ui.contentapp.configuration.TreeViewDefinition;
41 import info.magnolia.ui.filter.DataFilter;
42 import info.magnolia.ui.filter.FilterContext;
43
44 import java.util.Set;
45
46 import javax.inject.Inject;
47
48 import com.vaadin.ui.TreeGrid;
49
50
51
52
53
54 public class TreeView<T> extends GridView<T, TreePresenter<T>> implements ContentView {
55
56 @Inject
57 public TreeView(ValueContext<T> valueContext, TreeViewDefinition<T> definition, FilterContext filterContext) {
58 super(valueContext, definition);
59
60 final TreeGrid<T> treeGrid = treeGrid();
61 treeGrid.addCollapseListener(e -> treeGrid.getEditor().cancel());
62 treeGrid.addSelectionListener(e -> expandParents(e.getAllSelectedItems()));
63
64
65 filterContext.getFilter().observe(dataFilter -> dataFilter
66 .filter(DataFilter::isEmpty)
67 .ifPresent(any -> expandParents(valueContext.get().collect(toSet())))
68 );
69 }
70
71
72
73
74 @Deprecated
75 public TreeView(ValueContext<T> valueContext, TreeViewDefinition<T> definition) {
76 this(valueContext, definition, Components.getComponent(FilterContext.class));
77 }
78
79 @Override
80 protected TreePresenter<T> createPresenter() {
81 return create(TreePresenter.class, this, this.definition);
82 }
83
84 protected TreeGrid<T> treeGrid() {
85 return (TreeGrid<T>) this.grid;
86 }
87
88 private void expandParents(Set<T> items) {
89 treeGrid().expand(items.stream()
90 .filter(presenter::isItemAvailable)
91 .flatMap(presenter::getParents)
92 .collect(toSet())
93 );
94 }
95 }