From: Mathieu Baudier Date: Sun, 18 Sep 2022 09:57:36 +0000 (+0200) Subject: Clarify distinction between UX views and parts X-Git-Tag: v2.3.10~39 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=fd46e1f55b8aa95e6218dabf84315adcc9c4957f Clarify distinction between UX views and parts --- diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java index fb1a79d44..e66549216 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java @@ -10,8 +10,8 @@ import javax.xml.namespace.QName; import org.argeo.api.acr.Content; import org.argeo.api.acr.NamespaceUtils; import org.argeo.cms.swt.CmsSwtUtils; -import org.argeo.cms.swt.widgets.SwtHierarchicalPart; -import org.argeo.cms.swt.widgets.SwtTabularPart; +import org.argeo.cms.swt.widgets.SwtTreeView; +import org.argeo.cms.swt.widgets.SwtTableView; import org.argeo.cms.ux.acr.ContentHierarchicalPart; import org.argeo.cms.ux.widgets.Column; import org.argeo.cms.ux.widgets.DefaultTabularPart; @@ -19,6 +19,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.widgets.Composite; +/** A simple ACR browser. */ public class AcrContentTreeView extends Composite { private static final long serialVersionUID = -3707881216246077323L; @@ -38,7 +39,7 @@ public class AcrContentTreeView extends Composite { ContentHierarchicalPart contentPart = new ContentHierarchicalPart(); contentPart.setInput(rootContent); - SwtHierarchicalPart hPart = new SwtHierarchicalPart<>(split, getStyle(), contentPart); + new SwtTreeView<>(split, getStyle(), contentPart); Composite area = new Composite(split, SWT.BORDER); area.setLayout(CmsSwtUtils.noSpaceGridLayout(2)); @@ -79,7 +80,7 @@ public class AcrContentTreeView extends Composite { }); // attributesPart.setInput(selected); - SwtTabularPart attributeTable = new SwtTabularPart<>(area, style, attributesPart); + SwtTableView attributeTable = new SwtTableView<>(area, style, attributesPart); attributeTable.setLayoutData(CmsSwtUtils.fillAll()); // types @@ -101,7 +102,7 @@ public class AcrContentTreeView extends Composite { // typesPart.setInput(selected); - SwtTabularPart typesTable = new SwtTabularPart<>(area, style, typesPart); + SwtTableView typesTable = new SwtTableView<>(area, style, typesPart); typesTable.setLayoutData(CmsSwtUtils.fillAll()); // controller diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java deleted file mode 100644 index c3d11a181..000000000 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.argeo.cms.swt.widgets; - -import org.argeo.cms.swt.CmsSwtUtils; -import org.argeo.cms.ux.widgets.DataPart; -import org.argeo.cms.ux.widgets.DataView; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.widgets.Composite; - -public abstract class AbstractSwtPart extends Composite implements DataView { - private static final long serialVersionUID = -1999179054267812170L; - - protected DataPart dataPart; - - protected final SelectionListener selectionListener; - - public AbstractSwtPart(Composite parent, int style, DataPart dataPart) { - super(parent, style); - setLayout(CmsSwtUtils.noSpaceGridLayout()); - - this.dataPart = dataPart; - - selectionListener = new SelectionListener() { - - private static final long serialVersionUID = 4334785560035009330L; - - @Override - public void widgetSelected(SelectionEvent e) { - if (dataPart.getOnSelected() != null) - dataPart.getOnSelected().accept((TYPE) e.item.getData()); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - if (dataPart.getOnAction() != null) - dataPart.getOnAction().accept((TYPE) e.item.getData()); - } - }; - - dataPart.addView(this); - addDisposeListener((e) -> dataPart.removeView(this)); - } - - public abstract void refresh(); -} diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtView.java new file mode 100644 index 000000000..efdc45a8a --- /dev/null +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtView.java @@ -0,0 +1,47 @@ +package org.argeo.cms.swt.widgets; + +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.DataPart; +import org.argeo.cms.ux.widgets.DataView; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Composite; + +/** Base class for {@link DataView}s based on an SWT {@link Composite}. */ +public abstract class AbstractSwtView extends Composite implements DataView { + private static final long serialVersionUID = -1999179054267812170L; + + protected DataPart dataPart; + + protected final SelectionListener selectionListener; + + @SuppressWarnings("unchecked") + public AbstractSwtView(Composite parent, int style, DataPart dataPart) { + super(parent, style); + setLayout(CmsSwtUtils.noSpaceGridLayout()); + + this.dataPart = dataPart; + + selectionListener = new SelectionListener() { + + private static final long serialVersionUID = 4334785560035009330L; + + @Override + public void widgetSelected(SelectionEvent e) { + if (dataPart.getOnSelected() != null) + dataPart.getOnSelected().accept((TYPE) e.item.getData()); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + if (dataPart.getOnAction() != null) + dataPart.getOnAction().accept((TYPE) e.item.getData()); + } + }; + + dataPart.addView(this); + addDisposeListener((e) -> dataPart.removeView(this)); + } + + public abstract void refresh(); +} diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java deleted file mode 100644 index 07c9bac2e..000000000 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtHierarchicalPart.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.argeo.cms.swt.widgets; - -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.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 AbstractSwtPart { - private static final long serialVersionUID = -6247710601465713047L; - - private final Tree tree; - - private HierarchicalPart hierarchicalPart; - - public SwtHierarchicalPart(Composite parent, int style, HierarchicalPart hierarchicalPart) { - super(parent, style, hierarchicalPart); - tree = new Tree(this, SWT.BORDER); - tree.setLayoutData(CmsSwtUtils.fillAll()); - this.hierarchicalPart = hierarchicalPart; - - tree.addSelectionListener(selectionListener); - } - - @Override - public void refresh() { - // TODO optimise - // tree.clearAll(true); - - for (TreeItem rootItem : tree.getItems()) { - rootItem.dispose(); - } - - List rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput()); - for (T child : rootItems) { - TreeItem childItem = addTreeItem(null, child); -// List 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 grandChildren = hierarchicalPart.getChildren((T) item.getData()); -// for (T grandChild : grandChildren) { -// addTreeItem(item, grandChild); -// } - return; - } - item.dispose(); - } - - List children = hierarchicalPart.getChildren((T) root.getData()); - for (T child : children) { - TreeItem childItem = addTreeItem(root, child); -// List grandChildren = hierarchicalPart.getChildren(child); -// for (T grandChild : grandChildren) { -// addTreeItem(childItem, grandChild); -// } - } - }); - - CmsSwtUtils.fill(tree); - - } - - 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 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; - } - -} diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTableView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTableView.java new file mode 100644 index 000000000..b136f36e1 --- /dev/null +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTableView.java @@ -0,0 +1,82 @@ +package org.argeo.cms.swt.widgets; + +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.cms.swt.CmsSwtTheme; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.Column; +import org.argeo.cms.ux.widgets.TabularPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; + +/** View of a {@link TabularPart} based on a {@link Table}. */ +public class SwtTableView extends AbstractSwtView { + private static final long serialVersionUID = -1114155772446357750L; + private final Table table; + private TabularPart tabularPart; + + private CmsSwtTheme theme; + + public SwtTableView(Composite parent, int style, TabularPart tabularPart) { + super(parent, style, tabularPart); + theme = CmsSwtUtils.getCmsTheme(parent); + + table = new Table(this, SWT.VIRTUAL | SWT.BORDER); + table.setLinesVisible(true); + table.setLayoutData(CmsSwtUtils.fillAll()); + + this.tabularPart = tabularPart; + } + + @Override + public void refresh() { + // TODO optimise + table.clearAll(); + table.addListener(SWT.SetData, event -> { + TableItem item = (TableItem) event.item; + refreshItem(item); + }); + table.setItemCount(tabularPart.getItemCount()); + for (int i = 0; i < tabularPart.getColumnCount(); i++) { + TableColumn swtColumn = new TableColumn(table, SWT.NONE); + swtColumn.setWidth(tabularPart.getColumn(i).getWidth()); + } + CmsSwtUtils.fill(table); + + table.addSelectionListener(selectionListener); + + } + + protected Object getDataFromEvent(SelectionEvent e) { + Object data = e.item.getData(); + if (data == null) + data = tabularPart.getData(getTable().indexOf((TableItem) e.item)); + return data; + } + + protected void refreshItem(TableItem item) { + int row = getTable().indexOf(item); + for (int i = 0; i < tabularPart.getColumnCount(); i++) { + Column column = tabularPart.getColumn(i); + T data = tabularPart.getData(row); + item.setData(data); + String text = data != null ? column.getText(data) : ""; + if (text != null) + item.setText(i, text); + CmsIcon icon = column.getIcon(data); + if (icon != null) { + Image image = theme.getSmallIcon(icon); + item.setImage(i, image); + } + } + } + + protected Table getTable() { + return table; + } + +} diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java deleted file mode 100644 index 2f10cac75..000000000 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.argeo.cms.swt.widgets; - -import org.argeo.api.cms.ux.CmsIcon; -import org.argeo.cms.swt.CmsSwtTheme; -import org.argeo.cms.swt.CmsSwtUtils; -import org.argeo.cms.ux.widgets.Column; -import org.argeo.cms.ux.widgets.TabularPart; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; - -/** {@link TabularPart} implementation based on a {@link Table}. */ -public class SwtTabularPart extends AbstractSwtPart { - private static final long serialVersionUID = -1114155772446357750L; - private final Table table; - private TabularPart tabularPart; - - private CmsSwtTheme theme; - - public SwtTabularPart(Composite parent, int style, TabularPart tabularPart) { - super(parent, style, tabularPart); - theme = CmsSwtUtils.getCmsTheme(parent); - - table = new Table(this, SWT.VIRTUAL | SWT.BORDER); - table.setLinesVisible(true); - table.setLayoutData(CmsSwtUtils.fillAll()); - - this.tabularPart = tabularPart; - } - - @Override - public void refresh() { - // TODO optimise - table.clearAll(); - table.addListener(SWT.SetData, event -> { - TableItem item = (TableItem) event.item; - refreshItem(item); - }); - table.setItemCount(tabularPart.getItemCount()); - for (int i = 0; i < tabularPart.getColumnCount(); i++) { - TableColumn swtColumn = new TableColumn(table, SWT.NONE); - swtColumn.setWidth(tabularPart.getColumn(i).getWidth()); - } - CmsSwtUtils.fill(table); - - table.addSelectionListener(selectionListener); - - } - - protected Object getDataFromEvent(SelectionEvent e) { - Object data = e.item.getData(); - if (data == null) - data = tabularPart.getData(getTable().indexOf((TableItem) e.item)); - return data; - } - - protected void refreshItem(TableItem item) { - int row = getTable().indexOf(item); - for (int i = 0; i < tabularPart.getColumnCount(); i++) { - Column column = tabularPart.getColumn(i); - T data = tabularPart.getData(row); - item.setData(data); - String text = data != null ? column.getText(data) : ""; - if (text != null) - item.setText(i, text); - CmsIcon icon = column.getIcon(data); - if (icon != null) { - Image image = theme.getSmallIcon(icon); - item.setImage(i, image); - } - } - } - - protected Table getTable() { - return table; - } - -} diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java new file mode 100644 index 000000000..79543e9f8 --- /dev/null +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTreeView.java @@ -0,0 +1,90 @@ +package org.argeo.cms.swt.widgets; + +import java.util.List; + +import org.argeo.api.cms.ux.CmsIcon; +import org.argeo.cms.swt.CmsSwtTheme; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ux.widgets.HierarchicalPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; + +/** View of a {@link HierarchicalPart} based on a {@link Tree}. */ +public class SwtTreeView extends AbstractSwtView { + private static final long serialVersionUID = -6247710601465713047L; + + private final Tree tree; + + private HierarchicalPart hierarchicalPart; + private CmsSwtTheme theme; + + public SwtTreeView(Composite parent, int style, HierarchicalPart hierarchicalPart) { + super(parent, style, hierarchicalPart); + theme = CmsSwtUtils.getCmsTheme(parent); + + tree = new Tree(this, SWT.BORDER); + tree.setLayoutData(CmsSwtUtils.fillAll()); + this.hierarchicalPart = hierarchicalPart; + + tree.addSelectionListener(selectionListener); + } + + @SuppressWarnings("unchecked") + @Override + public void refresh() { + // TODO optimise + for (TreeItem rootItem : tree.getItems()) { + rootItem.dispose(); + } + + List rootItems = hierarchicalPart.getChildren(hierarchicalPart.getInput()); + for (T child : rootItems) { + addTreeItem(null, child); + } + + tree.addListener(SWT.Expand, event -> { + final TreeItem root = (TreeItem) event.item; + TreeItem[] items = root.getItems(); + for (TreeItem item : items) { + if (item.getData() != null) { + return; + } + item.dispose(); + } + + List children = hierarchicalPart.getChildren((T) root.getData()); + for (T child : children) { + addTreeItem(root, child); + } + }); + + CmsSwtUtils.fill(tree); + + } + + 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); + if (icon != null) { + Image image = theme.getSmallIcon(icon); + item.setImage(image); + } + // TODO optimize + List grandChildren = hierarchicalPart.getChildren(data); + if (grandChildren.size() != 0) + new TreeItem(item, SWT.NONE); + return item; + } + + protected Tree getTree() { + return tree; + } + +}