]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java
Refactor SWT UX.
[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.List;
4
5 import org.argeo.api.cms.ux.CmsIcon;
6 import org.argeo.cms.swt.CmsSwtUtils;
7 import org.argeo.cms.ux.widgets.HierarchicalPart;
8 import org.eclipse.swt.SWT;
9 import org.eclipse.swt.widgets.Composite;
10 import org.eclipse.swt.widgets.Tree;
11 import org.eclipse.swt.widgets.TreeItem;
12
13 /** {@link HierarchicalPart} implementation based on a {@link Tree}. */
14 public class SwtHierarchicalPart<T> extends AbstractSwtPart<T, T> {
15 private static final long serialVersionUID = -6247710601465713047L;
16
17 private final Tree tree;
18
19 private HierarchicalPart<T> hierarchicalPart;
20
21 public SwtHierarchicalPart(Composite parent, int style, HierarchicalPart<T> hierarchicalPart) {
22 super(parent, style, hierarchicalPart);
23 tree = new Tree(this, SWT.BORDER);
24 tree.setLayoutData(CmsSwtUtils.fillAll());
25 this.hierarchicalPart = hierarchicalPart;
26
27 tree.addSelectionListener(selectionListener);
28 }
29
30 @Override
31 public void refresh() {
32 // TODO optimise
33 // tree.clearAll(true);
34
35 for (TreeItem rootItem : tree.getItems()) {
36 rootItem.dispose();
37 }
38
39 List<T> rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput());
40 for (T child : rootItems) {
41 TreeItem childItem = addTreeItem(null, child);
42 // List<T> grandChildren = hierarchicalPart.getChildren(child);
43 // for (T grandChild : grandChildren) {
44 // addTreeItem(childItem, grandChild);
45 // }
46 }
47 // tree.addListener(SWT.SetData, event -> {
48 // TreeItem item = (TreeItem) event.item;
49 // TreeItem parentItem = item.getParentItem();
50 // if (parentItem == null) {
51 // refreshRootItem(item);
52 // } else {
53 // refreshItem(parentItem, item);
54 // }
55 // });
56 // tree.setItemCount(getRootItemCount());
57
58 tree.addListener(SWT.Expand, event -> {
59 final TreeItem root = (TreeItem) event.item;
60 TreeItem[] items = root.getItems();
61 for (TreeItem item : items) {
62 if (item.getData() != null) {
63 // List<T> grandChildren = hierarchicalPart.getChildren((T) item.getData());
64 // for (T grandChild : grandChildren) {
65 // addTreeItem(item, grandChild);
66 // }
67 return;
68 }
69 item.dispose();
70 }
71
72 List<T> children = hierarchicalPart.getChildren((T) root.getData());
73 for (T child : children) {
74 TreeItem childItem = addTreeItem(root, child);
75 // List<T> grandChildren = hierarchicalPart.getChildren(child);
76 // for (T grandChild : grandChildren) {
77 // addTreeItem(childItem, grandChild);
78 // }
79 }
80 });
81
82 CmsSwtUtils.fill(tree);
83
84 }
85
86 protected TreeItem addTreeItem(TreeItem parent, T data) {
87 TreeItem item = parent == null ? new TreeItem(tree, SWT.NONE) : new TreeItem(parent, SWT.NONE);
88 item.setData(data);
89 String txt = hierarchicalPart.getText(data);
90 if (txt != null)
91 item.setText(hierarchicalPart.getText(data));
92 CmsIcon icon = hierarchicalPart.getIcon(data);
93 // TODO optimize
94 List<T> grandChildren = hierarchicalPart.getChildren(data);
95 if (grandChildren.size() != 0)
96 new TreeItem(item, SWT.NONE);
97 return item;
98 //if(icon!=null)
99 // item.setImage(null);
100 }
101
102 protected Tree getTree() {
103 return tree;
104 }
105
106 }