Introduce hierarchies in user management
[lgpl/argeo-commons.git] / eclipse / org.argeo.cms.swt / src / org / argeo / cms / swt / widgets / SwtHierarchicalPart.java
index d390b5364f407b8ae43d10bf31dd255e0cdfa3f5..08c85b1657af0a9a01a0449aa4880d9cb16bb5cd 100644 (file)
@@ -12,28 +12,30 @@ import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.TreeItem;
 
 /** {@link HierarchicalPart} implementation based on a {@link Tree}. */
-public class SwtHierarchicalPart extends Composite implements HierarchicalPart {
-       private static final long serialVersionUID = -2189742596757101778L;
-
+public class SwtHierarchicalPart implements HierarchicalPart {
+       private Composite area;
        private final Tree tree;
 
        private Consumer<Object> onSelected;
        private Consumer<Object> onAction;
 
        public SwtHierarchicalPart(Composite parent, int style) {
-               super(parent, style);
-               setLayout(CmsSwtUtils.noSpaceGridLayout());
-               tree = new Tree(this, SWT.VIRTUAL | SWT.BORDER);
+               area = new Composite(parent, style);
+               area.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               tree = new Tree(area, SWT.VIRTUAL | SWT.BORDER);
        }
 
+       @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, parentItem);
+                               refreshItem(parentItem, item);
                        }
                });
                tree.setItemCount(getRootItemCount());
@@ -45,17 +47,30 @@ public class SwtHierarchicalPart extends Composite implements HierarchicalPart {
 
                        @Override
                        public void widgetSelected(SelectionEvent e) {
-                               onSelected.accept(e.item.getData());
+                               if (onSelected != null)
+                                       onSelected.accept(e.item.getData());
                        }
 
                        @Override
                        public void widgetDefaultSelected(SelectionEvent e) {
-                               onAction.accept(e.item.getData());
+                               if (onAction != null)
+                                       onAction.accept(e.item.getData());
                        }
                });
 
        }
 
+       @Override
+       public void setInput(Object data) {
+               area.setData(data);
+               refresh();
+       }
+
+       @Override
+       public Object getInput() {
+               return area.getData();
+       }
+
        protected void refreshRootItem(TreeItem item) {
 
        }