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<T> extends AbstractSwtPart<T, T> {
+ private static final long serialVersionUID = -6247710601465713047L;
+
private final Tree tree;
- private Consumer<Object> onSelected;
- private Consumer<Object> onAction;
+ private HierarchicalPart<T> hierarchicalPart;
+
+ public SwtHierarchicalPart(Composite parent, int style, HierarchicalPart<T> 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.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());
+ // tree.clearAll(true);
+
+ for (TreeItem rootItem : tree.getItems()) {
+ rootItem.dispose();
+ }
+
+ List<T> rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput());
+ for (T child : rootItems) {
+ TreeItem childItem = addTreeItem(null, child);
+// List<T> 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<T> grandChildren = hierarchicalPart.getChildren((T) item.getData());
+// for (T grandChild : grandChildren) {
+// addTreeItem(item, grandChild);
+// }
+ return;
+ }
+ item.dispose();
}
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- if (onAction != null)
- onAction.accept(e.item.getData());
+ List<T> children = hierarchicalPart.getChildren((T) root.getData());
+ for (T child : children) {
+ TreeItem childItem = addTreeItem(root, child);
+// List<T> 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<T> 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<Object> onSelected) {
- this.onSelected = onSelected;
- }
-
- public void onAction(Consumer<Object> onAction) {
- this.onAction = onAction;
- }
-
}