]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java
Extract log method from asynchronous publisher
[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.CmsLog;
6 import org.argeo.api.cms.ux.CmsIcon;
7 import org.argeo.cms.swt.CmsSwtTheme;
8 import org.argeo.cms.swt.CmsSwtUtils;
9 import org.argeo.cms.ux.widgets.Column;
10 import org.argeo.cms.ux.widgets.HierarchicalPart;
11 import org.eclipse.swt.SWT;
12 import org.eclipse.swt.graphics.Image;
13 import org.eclipse.swt.widgets.Composite;
14 import org.eclipse.swt.widgets.Tree;
15 import org.eclipse.swt.widgets.TreeItem;
16
17 /** View of a {@link HierarchicalPart} based on a {@link Tree}. */
18 public class SwtTreeView<T> extends AbstractSwtView<T, T> {
19 private final static CmsLog log = CmsLog.getLog(SwtTreeView.class);
20
21 private static final long serialVersionUID = -6247710601465713047L;
22
23 private final Tree tree;
24
25 private HierarchicalPart<T> hierarchicalPart;
26 private CmsSwtTheme theme;
27
28 public SwtTreeView(Composite parent, int style, HierarchicalPart<T> hierarchicalPart) {
29 super(parent, hierarchicalPart);
30 theme = CmsSwtUtils.getCmsTheme(parent);
31
32 tree = new Tree(this, style);
33 tree.setLayoutData(CmsSwtUtils.fillAll());
34 this.hierarchicalPart = hierarchicalPart;
35
36 tree.addSelectionListener(selectionListener);
37 }
38
39 @SuppressWarnings("unchecked")
40 @Override
41 public void refresh() {
42 // TODO optimise
43 for (TreeItem rootItem : tree.getItems()) {
44 rootItem.dispose();
45 }
46
47 List<T> rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput());
48 for (T child : rootItems) {
49 try {
50 addTreeItem(null, child);
51 } catch (Exception e) {
52 if (log.isTraceEnabled())
53 log.error("Cannot retrieve child", e);
54 }
55 }
56
57 tree.addListener(SWT.Expand, event -> {
58 final TreeItem root = (TreeItem) event.item;
59 TreeItem[] items = root.getItems();
60 for (TreeItem item : items) {
61 if (item.getData() != null) {
62 return;
63 }
64 item.dispose();
65 }
66
67 List<T> children = hierarchicalPart.getChildren((T) root.getData());
68 for (T child : children) {
69 addTreeItem(root, child);
70 }
71 });
72
73 CmsSwtUtils.fill(tree);
74
75 }
76
77 protected TreeItem addTreeItem(TreeItem parent, T data) {
78 TreeItem item = parent == null ? new TreeItem(tree, SWT.NONE) : new TreeItem(parent, SWT.NONE);
79 item.setData(data);
80 for (int i = 0; i < hierarchicalPart.getColumnCount(); i++) {
81 Column<T> column = hierarchicalPart.getColumn(i);
82 String txt = column.getText(data);
83 if (txt != null)
84 item.setText(txt);
85 CmsIcon icon = column.getIcon(data);
86 if (icon != null) {
87 Image image = theme.getSmallIcon(icon);
88 item.setImage(image);
89 }
90 }
91 // TODO optimise
92 List<T> grandChildren = hierarchicalPart.getChildren(data);
93 if (grandChildren.size() != 0)
94 new TreeItem(item, SWT.NONE);
95 return item;
96 }
97
98 @Override
99 public void notifyItemCountChange() {
100 // TODO what to update ?
101
102 }
103
104 protected Tree getTree() {
105 return tree;
106 }
107
108 }