X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fwidgets%2FSwtHierarchicalPart.java;fp=swt%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fwidgets%2FSwtHierarchicalPart.java;h=07c9bac2e1cb3266028a90cbe139008c591d42b4;hb=7b242851c0094d13cbaca5b68261ad92c873a59f;hp=0000000000000000000000000000000000000000;hpb=dbb84b4ec2d313ec0724d035c32f482ac57974c5;p=lgpl%2Fargeo-commons.git diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java new file mode 100644 index 000000000..07c9bac2e --- /dev/null +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java @@ -0,0 +1,106 @@ +package org.argeo.cms.swt.widgets; + +import java.util.List; + +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.HierarchicalPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; + +/** {@link HierarchicalPart} implementation based on a {@link Tree}. */ +public class SwtHierarchicalPart extends AbstractSwtPart { + private static final long serialVersionUID = -6247710601465713047L; + + private final Tree tree; + + private HierarchicalPart hierarchicalPart; + + public SwtHierarchicalPart(Composite parent, int style, HierarchicalPart hierarchicalPart) { + super(parent, style, hierarchicalPart); + tree = new Tree(this, SWT.BORDER); + tree.setLayoutData(CmsSwtUtils.fillAll()); + this.hierarchicalPart = hierarchicalPart; + + tree.addSelectionListener(selectionListener); + } + + @Override + public void refresh() { + // TODO optimise + // tree.clearAll(true); + + for (TreeItem rootItem : tree.getItems()) { + rootItem.dispose(); + } + + List rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput()); + for (T child : rootItems) { + TreeItem childItem = addTreeItem(null, child); +// List grandChildren = hierarchicalPart.getChildren(child); +// for (T grandChild : grandChildren) { +// addTreeItem(childItem, grandChild); +// } + } +// tree.addListener(SWT.SetData, event -> { +// TreeItem item = (TreeItem) event.item; +// TreeItem parentItem = item.getParentItem(); +// if (parentItem == null) { +// refreshRootItem(item); +// } else { +// refreshItem(parentItem, item); +// } +// }); +// tree.setItemCount(getRootItemCount()); + + tree.addListener(SWT.Expand, event -> { + final TreeItem root = (TreeItem) event.item; + TreeItem[] items = root.getItems(); + for (TreeItem item : items) { + if (item.getData() != null) { +// List grandChildren = hierarchicalPart.getChildren((T) item.getData()); +// for (T grandChild : grandChildren) { +// addTreeItem(item, grandChild); +// } + return; + } + item.dispose(); + } + + List children = hierarchicalPart.getChildren((T) root.getData()); + for (T child : children) { + TreeItem childItem = addTreeItem(root, child); +// List grandChildren = hierarchicalPart.getChildren(child); +// for (T grandChild : grandChildren) { +// addTreeItem(childItem, grandChild); +// } + } + }); + + 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); + // TODO optimize + List grandChildren = hierarchicalPart.getChildren(data); + if (grandChildren.size() != 0) + new TreeItem(item, SWT.NONE); + return item; +//if(icon!=null) +// item.setImage(null); + } + + protected Tree getTree() { + return tree; + } + +}