]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java
Merge remote-tracking branch 'origin/unstable' into merge-to-testing
[lgpl/argeo-commons.git] / swt / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtTreeView.java
1 package org.argeo.cms.swt.widgets;
2
3 import java.util.List;
4
5 import org.argeo.api.cms.ux.CmsIcon;
6 import org.argeo.cms.swt.CmsSwtTheme;
7 import org.argeo.cms.swt.CmsSwtUtils;
8 import org.argeo.cms.ux.widgets.HierarchicalPart;
9 import org.eclipse.swt.SWT;
10 import org.eclipse.swt.graphics.Image;
11 import org.eclipse.swt.widgets.Composite;
12 import org.eclipse.swt.widgets.Tree;
13 import org.eclipse.swt.widgets.TreeItem;
14
15 /** View of a {@link HierarchicalPart} based on a {@link Tree}. */
16 public class SwtTreeView<T> extends AbstractSwtView<T, T> {
17 private static final long serialVersionUID = -6247710601465713047L;
18
19 private final Tree tree;
20
21 private HierarchicalPart<T> hierarchicalPart;
22 private CmsSwtTheme theme;
23
24 public SwtTreeView(Composite parent, int style, HierarchicalPart<T> hierarchicalPart) {
25 super(parent, style, hierarchicalPart);
26 theme = CmsSwtUtils.getCmsTheme(parent);
27
28 tree = new Tree(this, SWT.BORDER);
29 tree.setLayoutData(CmsSwtUtils.fillAll());
30 this.hierarchicalPart = hierarchicalPart;
31
32 tree.addSelectionListener(selectionListener);
33 }
34
35 @SuppressWarnings("unchecked")
36 @Override
37 public void refresh() {
38 // TODO optimise
39 for (TreeItem rootItem : tree.getItems()) {
40 rootItem.dispose();
41 }
42
43 List<T> rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput());
44 for (T child : rootItems) {
45 addTreeItem(null, child);
46 }
47
48 tree.addListener(SWT.Expand, event -> {
49 final TreeItem root = (TreeItem) event.item;
50 TreeItem[] items = root.getItems();
51 for (TreeItem item : items) {
52 if (item.getData() != null) {
53 return;
54 }
55 item.dispose();
56 }
57
58 List<T> children = hierarchicalPart.getChildren((T) root.getData());
59 for (T child : children) {
60 addTreeItem(root, child);
61 }
62 });
63
64 CmsSwtUtils.fill(tree);
65
66 }
67
68 protected TreeItem addTreeItem(TreeItem parent, T data) {
69 TreeItem item = parent == null ? new TreeItem(tree, SWT.NONE) : new TreeItem(parent, SWT.NONE);
70 item.setData(data);
71 String txt = hierarchicalPart.getText(data);
72 if (txt != null)
73 item.setText(hierarchicalPart.getText(data));
74 CmsIcon icon = hierarchicalPart.getIcon(data);
75 if (icon != null) {
76 Image image = theme.getSmallIcon(icon);
77 item.setImage(image);
78 }
79 // TODO optimize
80 List<T> grandChildren = hierarchicalPart.getChildren(data);
81 if (grandChildren.size() != 0)
82 new TreeItem(item, SWT.NONE);
83 return item;
84 }
85
86 protected Tree getTree() {
87 return tree;
88 }
89
90 }