Refactor SWT UX.
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtHierarchicalPart.java
index a4ca061e69fd6a1f25f6e7e50ec2e434b137d57c..07c9bac2e1cb3266028a90cbe139008c591d42b4 100644 (file)
 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.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();
                        }
-               });
-               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<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;
-       }
-
-       public Composite getArea() {
-               return area;
-       }
-
 }