]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java
Introduce directory content provider
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtHierarchicalPart.java
1 package org.argeo.cms.swt.widgets;
2
3 import java.util.function.Consumer;
4
5 import org.argeo.cms.swt.CmsSwtUtils;
6 import org.argeo.cms.ux.widgets.HierarchicalPart;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.events.SelectionEvent;
9 import org.eclipse.swt.events.SelectionListener;
10 import org.eclipse.swt.widgets.Composite;
11 import org.eclipse.swt.widgets.Tree;
12 import org.eclipse.swt.widgets.TreeItem;
13
14 /** {@link HierarchicalPart} implementation based on a {@link Tree}. */
15 public class SwtHierarchicalPart implements HierarchicalPart {
16 private Composite area;
17 private final Tree tree;
18
19 private Consumer<Object> onSelected;
20 private Consumer<Object> onAction;
21
22 public SwtHierarchicalPart(Composite parent, int style) {
23 area = new Composite(parent, style);
24 area.setLayout(CmsSwtUtils.noSpaceGridLayout());
25 tree = new Tree(area, SWT.VIRTUAL | SWT.BORDER);
26 }
27
28 @Override
29 public void refresh() {
30 // TODO optimise
31 tree.clearAll(true);
32 tree.addListener(SWT.SetData, event -> {
33 TreeItem item = (TreeItem) event.item;
34 TreeItem parentItem = item.getParentItem();
35 if (parentItem == null) {
36 refreshRootItem(item);
37 } else {
38 refreshItem(parentItem, item);
39 }
40 });
41 tree.setItemCount(getRootItemCount());
42 CmsSwtUtils.fill(tree);
43
44 tree.addSelectionListener(new SelectionListener() {
45
46 private static final long serialVersionUID = 4334785560035009330L;
47
48 @Override
49 public void widgetSelected(SelectionEvent e) {
50 if (onSelected != null)
51 onSelected.accept(e.item.getData());
52 }
53
54 @Override
55 public void widgetDefaultSelected(SelectionEvent e) {
56 if (onAction != null)
57 onAction.accept(e.item.getData());
58 }
59 });
60
61 }
62
63 @Override
64 public void setInput(Object data) {
65 area.setData(data);
66 refresh();
67 }
68
69 @Override
70 public Object getInput() {
71 return area.getData();
72 }
73
74 protected void refreshRootItem(TreeItem item) {
75
76 }
77
78 protected void refreshItem(TreeItem parentItem, TreeItem item) {
79
80 }
81
82 protected int getRootItemCount() {
83 return 0;
84 }
85
86 protected Tree getTree() {
87 return tree;
88 }
89
90 public void onSelected(Consumer<Object> onSelected) {
91 this.onSelected = onSelected;
92 }
93
94 public void onAction(Consumer<Object> onAction) {
95 this.onAction = onAction;
96 }
97
98 public Composite getArea() {
99 return area;
100 }
101
102 }