X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fwidgets%2FSwtHierarchicalPart.java;h=07c9bac2e1cb3266028a90cbe139008c591d42b4;hb=43dc6cd030cab486347ffef4d339406bee7a8dec;hp=a4ca061e69fd6a1f25f6e7e50ec2e434b137d57c;hpb=54dac5debb27cc585200b3117b99f3de0015efef;p=lgpl%2Fargeo-commons.git diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java index a4ca061e6..07c9bac2e 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java @@ -1,102 +1,106 @@ package org.argeo.cms.swt.widgets; -import java.util.function.Consumer; +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.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; 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 implements HierarchicalPart { - private Composite area; +public class SwtHierarchicalPart extends AbstractSwtPart { + private static final long serialVersionUID = -6247710601465713047L; + private final Tree tree; - private Consumer onSelected; - private Consumer onAction; + 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; - public SwtHierarchicalPart(Composite parent, int style) { - area = new Composite(parent, style); - area.setLayout(CmsSwtUtils.noSpaceGridLayout()); - tree = new Tree(area, SWT.VIRTUAL | SWT.BORDER); + tree.addSelectionListener(selectionListener); } @Override public void refresh() { // TODO optimise - tree.clearAll(true); - tree.addListener(SWT.SetData, event -> { - TreeItem item = (TreeItem) event.item; - TreeItem parentItem = item.getParentItem(); - if (parentItem == null) { - refreshRootItem(item); - } else { - refreshItem(parentItem, item); + // 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(); } - }); - tree.setItemCount(getRootItemCount()); - CmsSwtUtils.fill(tree); - tree.addSelectionListener(new SelectionListener() { - - private static final long serialVersionUID = 4334785560035009330L; - - @Override - public void widgetSelected(SelectionEvent e) { - if (onSelected != null) - onSelected.accept(e.item.getData()); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - if (onAction != null) - onAction.accept(e.item.getData()); + 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); +// } } }); - } - - @Override - public void setInput(Object data) { - area.setData(data); - refresh(); - } - - @Override - public Object getInput() { - return area.getData(); - } - - protected void refreshRootItem(TreeItem item) { - - } - - protected void refreshItem(TreeItem parentItem, TreeItem item) { + CmsSwtUtils.fill(tree); } - protected int getRootItemCount() { - return 0; + 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; } - public void onSelected(Consumer onSelected) { - this.onSelected = onSelected; - } - - public void onAction(Consumer onAction) { - this.onAction = onAction; - } - - public Composite getArea() { - return area; - } - }