From 43dc6cd030cab486347ffef4d339406bee7a8dec Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 26 Jun 2022 10:46:10 +0200 Subject: [PATCH] Refactor SWT UX. --- .../swt/acr/SwtContentHierarchicalPart.java | 55 ------- .../argeo/cms/swt/app/AcrContentTreeView.java | 74 ++++----- .../cms/swt/widgets/AbstractSwtPart.java | 41 ++++- .../cms/swt/widgets/SwtHierarchicalPart.java | 140 +++++++++--------- .../argeo/cms/swt/widgets/SwtTabularPart.java | 92 +++--------- .../cms/ux/acr/ContentHierarchicalPart.java | 29 ++++ .../cms/ux/widgets/AbstractDataPart.java | 61 ++++++++ .../ux/widgets/AbstractHierarchicalPart.java | 5 + .../cms/ux/widgets/AbstractTabularPart.java | 25 ++++ .../org/argeo/cms/ux/widgets/ColumnsPart.java | 2 +- .../org/argeo/cms/ux/widgets/DataPart.java | 18 ++- .../org/argeo/cms/ux/widgets/DataView.java | 5 + .../cms/ux/widgets/DefaultTabularPart.java | 46 ++++++ .../cms/ux/widgets/HierarchicalPart.java | 13 +- .../org/argeo/cms/ux/widgets/TabularPart.java | 10 +- 15 files changed, 371 insertions(+), 245 deletions(-) delete mode 100644 eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/SwtContentHierarchicalPart.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/acr/ContentHierarchicalPart.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractHierarchicalPart.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractTabularPart.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataView.java create mode 100644 org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DefaultTabularPart.java diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/SwtContentHierarchicalPart.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/SwtContentHierarchicalPart.java deleted file mode 100644 index 230cca4c8..000000000 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/SwtContentHierarchicalPart.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.argeo.cms.swt.acr; - -import java.util.Iterator; - -import org.argeo.api.acr.Content; -import org.argeo.cms.swt.widgets.SwtHierarchicalPart; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TreeItem; - -public class SwtContentHierarchicalPart extends SwtHierarchicalPart { - - public SwtContentHierarchicalPart(Composite parent, int style) { - super(parent, style); - } - - public Content getContent() { - return (Content) getInput(); - } - - @Override - protected void refreshRootItem(TreeItem item) { - refreshItem(null, item); - } - - @Override - protected void refreshItem(TreeItem parentItem, TreeItem item) { - int index = getTree().indexOf(item); - Content parentContent = parentItem == null ? getContent() : (Content) parentItem.getData(); - Content content = null; - int count = 0; - children: for (Content c : parentContent) { - if (count == index) { - content = c; - break children; - } - count++; - } - item.setData(content); - item.setText(content.getName().toString()); - item.setItemCount(getChildrenCount(content)); - } - - @Override - protected int getRootItemCount() { - return getChildrenCount(getContent()); - } - - static int getChildrenCount(Content content) { - int count = 0; - for (Iterator it = content.iterator(); it.hasNext();it.next()) { - count++; - } - return count; - } -} diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java index 9d7b83ab1..cb339929f 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/app/AcrContentTreeView.java @@ -1,18 +1,22 @@ package org.argeo.cms.swt.app; +import static org.argeo.api.acr.NamespaceUtils.toPrefixedName; + import java.util.ArrayList; import java.util.List; 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.acr.SwtContentHierarchicalPart; +import org.argeo.cms.swt.widgets.SwtHierarchicalPart; import org.argeo.cms.swt.widgets.SwtTabularPart; +import org.argeo.cms.ux.acr.ContentHierarchicalPart; import org.argeo.cms.ux.widgets.Column; +import org.argeo.cms.ux.widgets.DefaultTabularPart; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; public class AcrContentTreeView extends Composite { @@ -20,51 +24,47 @@ public class AcrContentTreeView extends Composite { private Content rootContent; - private Content selected; +// private Content selected; public AcrContentTreeView(Composite parent, int style, Content content) { super(parent, style); this.rootContent = content; - this.selected = rootContent; + // this.selected = rootContent; setLayout(CmsSwtUtils.noSpaceGridLayout()); SashForm split = new SashForm(this, SWT.HORIZONTAL); split.setLayoutData(CmsSwtUtils.fillAll()); - SwtContentHierarchicalPart hPart = new SwtContentHierarchicalPart(split, getStyle()); - Composite area = new Composite(split, SWT.NONE); + ContentHierarchicalPart contentPart = new ContentHierarchicalPart(); + contentPart.setInput(rootContent); + + SwtHierarchicalPart hPart = new SwtHierarchicalPart<>(split, getStyle(), contentPart); + + Composite area = new Composite(split, SWT.BORDER); area.setLayout(CmsSwtUtils.noSpaceGridLayout(2)); split.setWeights(new int[] { 30, 70 }); // attributes - SwtTabularPart attributesPart = new SwtTabularPart(area, SWT.NONE) { - List data; + DefaultTabularPart attributesPart = new DefaultTabularPart<>() { @Override - protected Object getData(int row) { - return data.get(row); - } - - @Override - protected int getItemCount() { - data = new ArrayList<>(selected.keySet()); - return data.size(); + protected List asList(Content input) { + return new ArrayList<>(input.keySet()); } }; - attributesPart.getArea().setLayoutData(CmsSwtUtils.fillHeight()); attributesPart.addColumn(new Column() { @Override public String getText(QName model) { - return model.toString(); + return toPrefixedName(model); } }); attributesPart.addColumn(new Column() { @Override public String getText(QName model) { - return selected.get(model).toString(); + return attributesPart.getInput().get(model).toString(); } @Override @@ -73,38 +73,40 @@ public class AcrContentTreeView extends Composite { } }); + // attributesPart.setInput(selected); - // types - SwtTabularPart typesPart = new SwtTabularPart(area, SWT.NONE) { - List data; + SwtTabularPart attributeTable = new SwtTabularPart<>(area, style, attributesPart); + attributeTable.setLayoutData(CmsSwtUtils.fillAll()); - @Override - protected Object getData(int row) { - return data.get(row); - } + // types + DefaultTabularPart typesPart = new DefaultTabularPart<>() { @Override - protected int getItemCount() { - data = new ArrayList<>(selected.getContentClasses()); - return data.size(); + protected List asList(Content input) { + return input.getContentClasses(); } }; typesPart.addColumn(new Column() { @Override public String getText(QName model) { - return model.toString(); + return toPrefixedName(model); } + }); - typesPart.getArea().setLayoutData(CmsSwtUtils.fillHeight()); + + // typesPart.setInput(selected); + + SwtTabularPart typesTable = new SwtTabularPart<>(area, style, typesPart); + typesTable.setLayoutData(CmsSwtUtils.fillAll()); // controller - hPart.setInput(rootContent); - hPart.onSelected((o) -> { + contentPart.setInput(rootContent); + contentPart.onSelected((o) -> { Content c = (Content) o; - selected = c; - attributesPart.refresh(); - typesPart.refresh(); +// selected = c; + attributesPart.setInput(c); + typesPart.setInput(c); }); attributesPart.refresh(); diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java index e846bb54e..c3d11a181 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/AbstractSwtPart.java @@ -1,14 +1,45 @@ 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 { - protected final Composite area; +public abstract class AbstractSwtPart extends Composite implements DataView { + private static final long serialVersionUID = -1999179054267812170L; - public AbstractSwtPart(Composite parent, int style) { - area = new Composite(parent, style); - area.setLayout(CmsSwtUtils.noSpaceGridLayout()); + 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/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 index a4ca061e6..07c9bac2e 100644 --- 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 @@ -1,102 +1,106 @@ 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 extends AbstractSwtPart { + private static final long serialVersionUID = -6247710601465713047L; + private final Tree tree; - private Consumer onSelected; - private Consumer onAction; + 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; - 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 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(); } - }); - 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 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); +// } } }); - } - - @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 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 onSelected) { - this.onSelected = onSelected; - } - - public void onAction(Consumer onAction) { - this.onAction = onAction; - } - - public Composite getArea() { - return area; - } - } diff --git a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java index 8fd4065ad..2f10cac75 100644 --- a/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java +++ b/eclipse/org.argeo.cms.swt/src/org/argeo/cms/swt/widgets/SwtTabularPart.java @@ -1,7 +1,5 @@ package org.argeo.cms.swt.widgets; -import java.util.function.Consumer; - import org.argeo.api.cms.ux.CmsIcon; import org.argeo.cms.swt.CmsSwtTheme; import org.argeo.cms.swt.CmsSwtUtils; @@ -9,7 +7,6 @@ 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.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; @@ -17,22 +14,22 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; /** {@link TabularPart} implementation based on a {@link Table}. */ -public class SwtTabularPart implements TabularPart { - private Composite area; - +public class SwtTabularPart extends AbstractSwtPart { + private static final long serialVersionUID = -1114155772446357750L; private final Table table; - - private Consumer onSelected; - private Consumer onAction; + private TabularPart tabularPart; private CmsSwtTheme theme; - public SwtTabularPart(Composite parent, int style) { + public SwtTabularPart(Composite parent, int style, TabularPart tabularPart) { + super(parent, style, tabularPart); theme = CmsSwtUtils.getCmsTheme(parent); - area = new Composite(parent, style); - area.setLayout(CmsSwtUtils.noSpaceGridLayout()); - table = new Table(area, SWT.VIRTUAL | SWT.BORDER); + + table = new Table(this, SWT.VIRTUAL | SWT.BORDER); table.setLinesVisible(true); + table.setLayoutData(CmsSwtUtils.fillAll()); + + this.tabularPart = tabularPart; } @Override @@ -43,50 +40,29 @@ public class SwtTabularPart implements TabularPart { TableItem item = (TableItem) event.item; refreshItem(item); }); - table.setItemCount(getItemCount()); + 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(new SelectionListener() { - private static final long serialVersionUID = -5225905921522775948L; - - @Override - public void widgetSelected(SelectionEvent e) { - if (onSelected != null) - onSelected.accept(getDataFromEvent(e)); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - if (onAction != null) - onAction.accept(getDataFromEvent(e)); - } - }); + table.addSelectionListener(selectionListener); } protected Object getDataFromEvent(SelectionEvent e) { Object data = e.item.getData(); if (data == null) - data = getData(getTable().indexOf((TableItem) e.item)); + data = tabularPart.getData(getTable().indexOf((TableItem) e.item)); return data; } - @Override - public void setInput(Object data) { - area.setData(data); - refresh(); - } - - @Override - public Object getInput() { - return area.getData(); - } - protected void refreshItem(TableItem item) { int row = getTable().indexOf(item); - for (int i = 0; i < item.getParent().getColumnCount(); i++) { - Column column = (Column) item.getParent().getColumn(i).getData(); - Object data = getData(row); + 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) @@ -99,36 +75,8 @@ public class SwtTabularPart implements TabularPart { } } - protected int getItemCount() { - return 0; - } - - protected Object getData(int row) { - return null; - } - protected Table getTable() { return table; } - public void onSelected(Consumer onSelected) { - this.onSelected = onSelected; - } - - public void onAction(Consumer onAction) { - this.onAction = onAction; - } - - @Override - public void addColumn(Column column) { - TableColumn swtColumn = new TableColumn(table, SWT.NONE); - swtColumn.setWidth(column.getWidth()); - swtColumn.setData(column); - - } - - public Composite getArea() { - return area; - } - } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/acr/ContentHierarchicalPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/acr/ContentHierarchicalPart.java new file mode 100644 index 000000000..ad4df115f --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/acr/ContentHierarchicalPart.java @@ -0,0 +1,29 @@ +package org.argeo.cms.ux.acr; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.argeo.api.acr.Content; +import org.argeo.cms.ux.widgets.AbstractDataPart; +import org.argeo.cms.ux.widgets.HierarchicalPart; + +public class ContentHierarchicalPart extends AbstractDataPart implements HierarchicalPart { + @Override + public List getChildren(Content content) { + List res = new ArrayList<>(); + if (content == null) + return res; + for (Iterator it = content.iterator(); it.hasNext();) { + res.add(it.next()); + } + + return res; + } + + @Override + public String getText(Content model) { + return model.getName().toString(); + } + +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java new file mode 100644 index 000000000..958fcde6a --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractDataPart.java @@ -0,0 +1,61 @@ +package org.argeo.cms.ux.widgets; + +import java.util.IdentityHashMap; +import java.util.function.Consumer; + +public abstract class AbstractDataPart implements DataPart { + + private Consumer onSelected; + private Consumer onAction; + + private IdentityHashMap, Object> views = new IdentityHashMap<>(); + + private INPUT data; + + @Override + public void setInput(INPUT data) { + this.data = data; + refresh(); + } + + @Override + public INPUT getInput() { + return data; + } + + @Override + public void onSelected(Consumer onSelected) { + this.onSelected = onSelected; + } + + @Override + public void onAction(Consumer onAction) { + this.onAction = onAction; + } + + public Consumer getOnSelected() { + return onSelected; + } + + public Consumer getOnAction() { + return onAction; + } + + @Override + public void refresh() { + for (DataView view : views.keySet()) { + view.refresh(); + } + } + + @Override + public void addView(DataView view) { + views.put(view, new Object()); + } + + @Override + public void removeView(DataView view) { + views.remove(view); + } + +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractHierarchicalPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractHierarchicalPart.java new file mode 100644 index 000000000..dd1854d39 --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractHierarchicalPart.java @@ -0,0 +1,5 @@ +package org.argeo.cms.ux.widgets; + +public abstract class AbstractHierarchicalPart extends AbstractDataPart implements HierarchicalPart { + +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractTabularPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractTabularPart.java new file mode 100644 index 000000000..7e63ea85b --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/AbstractTabularPart.java @@ -0,0 +1,25 @@ +package org.argeo.cms.ux.widgets; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractTabularPart extends AbstractDataPart implements TabularPart { + + private List> columns = new ArrayList<>(); + + @Override + public Column getColumn(int index) { + if (index >= columns.size()) + throw new IllegalArgumentException("There a only " + columns.size()); + return columns.get(index); + } + + public void addColumn(Column column) { + columns.add(column); + } + + @Override + public int getColumnCount() { + return columns.size(); + } +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/ColumnsPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/ColumnsPart.java index 7df7086b3..a60401c1f 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/ColumnsPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/ColumnsPart.java @@ -1,5 +1,5 @@ package org.argeo.cms.ux.widgets; -public interface ColumnsPart extends DataPart { +public interface ColumnsPart extends DataPart { } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java index 5a8da469b..11a12cf7b 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataPart.java @@ -2,14 +2,22 @@ package org.argeo.cms.ux.widgets; import java.util.function.Consumer; -public interface DataPart { - void setInput(Object data); +public interface DataPart { + void setInput(INPUT data); - Object getInput(); + INPUT getInput(); + + void onSelected(Consumer onSelected); + + Consumer getOnSelected(); + + void onAction(Consumer onAction); + + Consumer getOnAction(); void refresh(); - void onSelected(Consumer onSelected); + void addView(DataView view); - void onAction(Consumer onAction); + void removeView(DataView view); } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataView.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataView.java new file mode 100644 index 000000000..9768c68ec --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DataView.java @@ -0,0 +1,5 @@ +package org.argeo.cms.ux.widgets; + +public interface DataView { + void refresh(); +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DefaultTabularPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DefaultTabularPart.java new file mode 100644 index 000000000..cb30af675 --- /dev/null +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/DefaultTabularPart.java @@ -0,0 +1,46 @@ +package org.argeo.cms.ux.widgets; + +import java.util.ArrayList; +import java.util.List; + +public class DefaultTabularPart extends AbstractTabularPart implements TabularPart { + private List content; + + @Override + public int getItemCount() { + return content.size(); + } + + @Override + public T getData(int row) { + assert row < getItemCount(); + return content.get(row); + } + + @Override + public void refresh() { + INPUT input = getInput(); + if (input == null) { + content = new ArrayList<>(); + return; + } + content = asList(input); + super.refresh(); + } + + protected List asList(INPUT input) { + List res = new ArrayList<>(); + content.clear(); + if (input instanceof List) { + content = (List) input; + } else if (input instanceof Iterable) { + for (T item : (Iterable) input) + content.add(item); + } else { + throw new IllegalArgumentException( + "Unsupported class " + input.getClass() + ", method should be overridden."); + } + return res; + } + +} diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/HierarchicalPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/HierarchicalPart.java index 0926ff527..372c295dc 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/HierarchicalPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/HierarchicalPart.java @@ -1,5 +1,16 @@ package org.argeo.cms.ux.widgets; -public interface HierarchicalPart extends ColumnsPart { +import java.util.List; + +import org.argeo.api.cms.ux.CmsIcon; + +public interface HierarchicalPart extends ColumnsPart { + List getChildren(T parent); + + String getText(T model); + + default CmsIcon getIcon(T model) { + return null; + } } diff --git a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/TabularPart.java b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/TabularPart.java index 4c9320268..6adc0c3e6 100644 --- a/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/TabularPart.java +++ b/org.argeo.cms.ux/src/org/argeo/cms/ux/widgets/TabularPart.java @@ -1,5 +1,11 @@ package org.argeo.cms.ux.widgets; -public interface TabularPart extends ColumnsPart { - void addColumn(Column column); +public interface TabularPart extends ColumnsPart { + int getItemCount(); + + T getData(int row); + + Column getColumn(int index); + + int getColumnCount(); } -- 2.30.2