X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=swt%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fwidgets%2FSwtTreeView.java;fp=swt%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fwidgets%2FSwtTreeView.java;h=79543e9f89d938f583a9c05d3c1a5aba4bfe5b37;hb=fd46e1f55b8aa95e6218dabf84315adcc9c4957f;hp=0000000000000000000000000000000000000000;hpb=abdb7ad6f6275a90b407062578892b1f088fa9bd;p=lgpl%2Fargeo-commons.git diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java new file mode 100644 index 000000000..79543e9f8 --- /dev/null +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java @@ -0,0 +1,90 @@ +package org.argeo.cms.swt.widgets; + +import java.util.List; + +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.cms.swt.CmsSwtTheme; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.HierarchicalPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; + +/** View of a {@link HierarchicalPart} based on a {@link Tree}. */ +public class SwtTreeView extends AbstractSwtView { + private static final long serialVersionUID = -6247710601465713047L; + + private final Tree tree; + + private HierarchicalPart hierarchicalPart; + private CmsSwtTheme theme; + + public SwtTreeView(Composite parent, int style, HierarchicalPart hierarchicalPart) { + super(parent, style, hierarchicalPart); + theme = CmsSwtUtils.getCmsTheme(parent); + + tree = new Tree(this, SWT.BORDER); + tree.setLayoutData(CmsSwtUtils.fillAll()); + this.hierarchicalPart = hierarchicalPart; + + tree.addSelectionListener(selectionListener); + } + + @SuppressWarnings("unchecked") + @Override + public void refresh() { + // TODO optimise + for (TreeItem rootItem : tree.getItems()) { + rootItem.dispose(); + } + + List rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput()); + for (T child : rootItems) { + addTreeItem(null, child); + } + + tree.addListener(SWT.Expand, event -> { + final TreeItem root = (TreeItem) event.item; + TreeItem[] items = root.getItems(); + for (TreeItem item : items) { + if (item.getData() != null) { + return; + } + item.dispose(); + } + + List children = hierarchicalPart.getChildren((T) root.getData()); + for (T child : children) { + addTreeItem(root, child); + } + }); + + CmsSwtUtils.fill(tree); + + } + + protected TreeItem addTreeItem(TreeItem parent, T data) { + TreeItem item = parent == null ? new TreeItem(tree, SWT.NONE) : new TreeItem(parent, SWT.NONE); + item.setData(data); + String txt = hierarchicalPart.getText(data); + if (txt != null) + item.setText(hierarchicalPart.getText(data)); + CmsIcon icon = hierarchicalPart.getIcon(data); + if (icon != null) { + Image image = theme.getSmallIcon(icon); + item.setImage(image); + } + // TODO optimize + List grandChildren = hierarchicalPart.getChildren(data); + if (grandChildren.size() != 0) + new TreeItem(item, SWT.NONE); + return item; + } + + protected Tree getTree() { + return tree; + } + +}