From 584b2b87593892c6ded7b645425b603a4f554026 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 3 Jun 2022 05:49:15 +0200 Subject: [PATCH] Introduce SWT hierarchical part --- .../src/org/argeo/cms/swt/CmsSwtUtils.java | 19 +++++ .../cms/swt/widgets/SwtHierarchicalPart.java | 83 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java index 701de2827..3ff747949 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUtils.java @@ -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.layout.FormLayout; 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.Layout; 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); } + /* + * 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 */ 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 index 000000000..d390b5364 --- /dev/null +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java @@ -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 onSelected; + private Consumer 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 onSelected) { + this.onSelected = onSelected; + } + + public void onAction(Consumer onAction) { + this.onAction = onAction; + } + +} -- 2.39.2