]> git.argeo.org Git - lgpl/argeo-commons.git/commitdiff
Introduce SWT hierarchical part
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 3 Jun 2022 03:49:15 +0000 (05:49 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 3 Jun 2022 03:49:15 +0000 (05:49 +0200)
eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java
eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java [new file with mode: 0644]

index 701de2827f1f68f064220b6d2decc486c7d1e956..3ff747949c5553d0fa0694e13f6eb323ad1e772c 100644 (file)
@@ -11,6 +11,7 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.layout.RowData;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.layout.RowData;
@@ -19,6 +20,7 @@ import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Widget;
@@ -99,6 +101,23 @@ public class CmsSwtUtils {
                sendEventOnSelect(control, topic, properties);
        }
 
                sendEventOnSelect(control, topic, properties);
        }
 
+       /*
+        * LAYOUT INDEPENDENT
+        */
+       /** Takes the most space possible, depending on parent layout. */
+       public static void fill(Control control) {
+               Layout parentLayout = control.getParent().getLayout();
+               if (parentLayout == null)
+                       throw new IllegalStateException("Parent layout is not set");
+               if (parentLayout instanceof GridLayout) {
+                       control.setLayoutData(fillAll());
+               } else if (parentLayout instanceof FormLayout) {
+                       control.setLayoutData(coverAll());
+               } else {
+                       throw new IllegalArgumentException("Unsupported parent layout  " + parentLayout.getClass().getName());
+               }
+       }
+
        /*
         * GRID LAYOUT
         */
        /*
         * GRID LAYOUT
         */
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
new file mode 100644 (file)
index 0000000..d390b53
--- /dev/null
@@ -0,0 +1,83 @@
+package org.argeo.cms.swt.widgets;
+
+import java.util.function.Consumer;
+
+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 extends Composite implements HierarchicalPart {
+       private static final long serialVersionUID = -2189742596757101778L;
+
+       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);
+       }
+
+       public void refresh() {
+               tree.addListener(SWT.SetData, event -> {
+                       TreeItem item = (TreeItem) event.item;
+                       TreeItem parentItem = item.getParentItem();
+                       if (parentItem == null) {
+                               refreshRootItem(item);
+                       } else {
+                               refreshItem(parentItem, parentItem);
+                       }
+               });
+               tree.setItemCount(getRootItemCount());
+               CmsSwtUtils.fill(tree);
+
+               tree.addSelectionListener(new SelectionListener() {
+
+                       private static final long serialVersionUID = 4334785560035009330L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               onSelected.accept(e.item.getData());
+                       }
+
+                       @Override
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                               onAction.accept(e.item.getData());
+                       }
+               });
+
+       }
+
+       protected void refreshRootItem(TreeItem item) {
+
+       }
+
+       protected void refreshItem(TreeItem parentItem, TreeItem item) {
+
+       }
+
+       protected int getRootItemCount() {
+               return 0;
+       }
+
+       protected Tree getTree() {
+               return tree;
+       }
+
+       public void onSelected(Consumer<Object> onSelected) {
+               this.onSelected = onSelected;
+       }
+
+       public void onAction(Consumer<Object> onAction) {
+               this.onAction = onAction;
+       }
+
+}