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; } }