From 47c51f53295a964af4cccee0821631f25a2ea935 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 9 Sep 2022 09:10:33 +0200 Subject: [PATCH] Improve ACR usage --- Makefile | 1 + .../org/argeo/app/core/SuiteContentTypes.java | 2 + .../src/org/argeo/app/core/schemas/entity.xsd | 18 ++ .../OSGI-INF/contentEntryArea.xml | 3 +- org.argeo.app.ui/OSGI-INF/contentLayer.xml | 2 +- .../OSGI-INF/publishEntryArea.xml | 8 + .../OSGI-INF/publishUiProvider.xml | 8 + org.argeo.app.ui/bnd.bnd | 2 + .../config/publishEntryArea.properties | 1 + .../config/publishUiProvider.properties | 3 + .../app/ui/library/ContentEntryArea.java | 183 +++--------------- .../app/ui/library/JcrContentEntryArea.java | 178 +++++++++++++++++ .../app/ui/publish/PublishEntryArea.java | 16 ++ .../app/ui/publish/PublishUiProvider.java | 17 ++ org.argeo.app.ux/.classpath | 7 + org.argeo.app.ux/.project | 28 +++ org.argeo.app.ux/bnd.bnd | 0 org.argeo.app.ux/build.properties | 4 + .../argeo/app/ux/docbook/DocBookViewer.java | 15 ++ 19 files changed, 340 insertions(+), 156 deletions(-) create mode 100644 org.argeo.app.ui/OSGI-INF/publishEntryArea.xml create mode 100644 org.argeo.app.ui/OSGI-INF/publishUiProvider.xml create mode 100644 org.argeo.app.ui/config/publishEntryArea.properties create mode 100644 org.argeo.app.ui/config/publishUiProvider.properties create mode 100644 org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java create mode 100644 org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java create mode 100644 org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java create mode 100644 org.argeo.app.ux/.classpath create mode 100644 org.argeo.app.ux/.project create mode 100644 org.argeo.app.ux/bnd.bnd create mode 100644 org.argeo.app.ux/build.properties create mode 100644 org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java diff --git a/Makefile b/Makefile index 573c303..444b300 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ org.argeo.app.api \ org.argeo.app.core \ org.argeo.app.servlet.odk \ org.argeo.app.servlet.publish \ +org.argeo.app.ux \ org.argeo.app.ui \ org.argeo.app.theme.default \ org.argeo.app.profile.acr.fs \ diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteContentTypes.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteContentTypes.java index 1f09021..8b58fe1 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteContentTypes.java +++ b/org.argeo.app.core/src/org/argeo/app/core/SuiteContentTypes.java @@ -35,6 +35,8 @@ public enum SuiteContentTypes { // ODK("odk", "http://www.opendatakit.org/xforms", null, null), // + WGS84("geo", "http://www.w3.org/2003/01/geo/wgs84_pos#", null, null), + // ; private final static String RESOURCE_BASE = "/org/argeo/app/core/schemas/"; diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/entity.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/entity.xsd index e291137..a2fbfcd 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/schemas/entity.xsd +++ b/org.argeo.app.core/src/org/argeo/app/core/schemas/entity.xsd @@ -16,4 +16,22 @@ processContents="lax" /> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml b/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml index 87cadaa..8aad52c 100644 --- a/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml +++ b/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml @@ -2,8 +2,7 @@ - + - diff --git a/org.argeo.app.ui/OSGI-INF/contentLayer.xml b/org.argeo.app.ui/OSGI-INF/contentLayer.xml index 35c4c3a..4bf4474 100644 --- a/org.argeo.app.ui/OSGI-INF/contentLayer.xml +++ b/org.argeo.app.ui/OSGI-INF/contentLayer.xml @@ -4,6 +4,6 @@ - + diff --git a/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml b/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml new file mode 100644 index 0000000..350a00c --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml b/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml new file mode 100644 index 0000000..793fc34 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/bnd.bnd b/org.argeo.app.ui/bnd.bnd index 482a9ff..f70f51a 100644 --- a/org.argeo.app.ui/bnd.bnd +++ b/org.argeo.app.ui/bnd.bnd @@ -22,6 +22,8 @@ OSGI-INF/mapLayer.xml,\ OSGI-INF/overviewMap.xml,\ OSGI-INF/wwwLayer.xml,\ OSGI-INF/documentUiProvider.xml,\ +OSGI-INF/publishEntryArea.xml,\ +OSGI-INF/publishUiProvider.xml,\ diff --git a/org.argeo.app.ui/config/publishEntryArea.properties b/org.argeo.app.ui/config/publishEntryArea.properties new file mode 100644 index 0000000..f391774 --- /dev/null +++ b/org.argeo.app.ui/config/publishEntryArea.properties @@ -0,0 +1 @@ +service.pid=argeo.publish.ui.publishEntryArea diff --git a/org.argeo.app.ui/config/publishUiProvider.properties b/org.argeo.app.ui/config/publishUiProvider.properties new file mode 100644 index 0000000..64ca319 --- /dev/null +++ b/org.argeo.app.ui/config/publishUiProvider.properties @@ -0,0 +1,3 @@ +service.pid=argeo.publishing.ui.publishUiProvider + +#entity.type=entity:document,nt:file \ No newline at end of file diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java index 42c7e69..6b50e93 100644 --- a/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java +++ b/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java @@ -1,178 +1,55 @@ package org.argeo.app.ui.library; -import java.util.SortedMap; -import java.util.TreeMap; - -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.jcr.query.Query; - import org.argeo.api.acr.Content; -import org.argeo.api.cms.CmsConstants; +import org.argeo.api.acr.spi.ProvidedContent; +import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsView; import org.argeo.app.api.EntityType; import org.argeo.app.ui.SuiteEvent; -import org.argeo.app.ui.SuiteIcon; -import org.argeo.app.ui.widgets.TreeOrSearchArea; -import org.argeo.cms.jcr.acr.JcrContentProvider; -import org.argeo.cms.swt.CmsSwtTheme; import org.argeo.cms.swt.CmsSwtUtils; -import org.argeo.cms.ui.CmsUiProvider; -import org.argeo.jcr.Jcr; -import org.argeo.jcr.JcrException; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.TreeViewerColumn; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; +import org.argeo.cms.swt.acr.SwtUiProvider; +import org.argeo.cms.swt.widgets.SwtHierarchicalPart; +import org.argeo.cms.ux.acr.ContentHierarchicalPart; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; -public class ContentEntryArea implements CmsUiProvider { - private JcrContentProvider jcrContentProvider; +public class ContentEntryArea implements SwtUiProvider { + private final static CmsLog log = CmsLog.getLog(ContentEntryArea.class); @Override public Control createUiPart(Composite parent, Content context) { - CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent); + CmsView cmsView = CmsSwtUtils.getCmsView(parent); parent.setLayout(new GridLayout()); - Ui ui = new Ui(parent, SWT.NONE); - ui.setLayoutData(CmsSwtUtils.fillAll()); - - TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE); - nameCol.getColumn().setWidth(400); - nameCol.setLabelProvider(new ColumnLabelProvider() { - - @Override - public String getText(Object element) { - Node node = (Node) element; - return Jcr.getTitle(node); - } - @Override - public Image getImage(Object element) { - Node node = (Node) element; - Image icon; - if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) { - icon = theme.getSmallIcon(SuiteIcon.folder); - } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) { - // TODO check recognized document types - icon = theme.getSmallIcon(SuiteIcon.document); - } else if (Jcr.isNodeType(node, EntityType.document.get())) { - icon = theme.getSmallIcon(SuiteIcon.document); - } else { - if (!isLeaf(node)) - icon = theme.getSmallIcon(SuiteIcon.folder); - else - icon = null; - } - return icon; - } + new Label(parent, 0).setText(context.toString()); - }); + Content rootContent = ((ProvidedContent) context).getSession().getRepository().get().get("/srv"); - ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() { + ContentHierarchicalPart contentPart = new ContentHierarchicalPart() { @Override - public void doubleClick(DoubleClickEvent event) { - Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); - if (user != null) { - CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), - SuiteEvent.eventProperties(user)); - } - - } - }); - ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); - if (user != null) { - CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), - SuiteEvent.eventProperties(user)); - } + protected boolean isLeaf(Content content) { + if (content.hasContentClass(EntityType.document.qName())) + return true; + return super.isLeaf(content); } + }; + contentPart.setInput(rootContent); + + SwtHierarchicalPart view = new SwtHierarchicalPart<>(parent, 0, contentPart); + view.setLayoutData(CmsSwtUtils.fillAll()); + + contentPart.setInput(rootContent); + contentPart.onSelected((o) -> { + Content c = (Content) o; + log.debug(c.getPath()); + // cmsView.sendEvent(SuiteEvent.refreshPart.topic(), + // SuiteEvent.eventProperties(c)); }); - - ui.getTreeViewer().setContentProvider(new SpacesContentProvider()); - Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE); - ui.getTreeViewer().setInput(session); - return ui; - } - - protected boolean isLeaf(Node node) { - return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get()) - || Jcr.isNodeType(node, NodeType.NT_FILE); - } - - public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { - this.jcrContentProvider = jcrContentProvider; - } - - class Ui extends TreeOrSearchArea { - - public Ui(Composite parent, int style) { - super(parent, style); - } - - } - - class SpacesContentProvider implements ITreeContentProvider { - - @Override - public Object[] getElements(Object inputElement) { - Session session = (Session) inputElement; - try { - Query query = session.getWorkspace().getQueryManager() - .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2); - NodeIterator spacesIt = query.execute().getNodes(); - SortedMap map = new TreeMap<>(); - while (spacesIt.hasNext()) { - Node space = spacesIt.nextNode(); - String path = space.getPath(); - map.put(path, space); - } - return map.values().toArray(); - } catch (RepositoryException e) { - throw new JcrException(e); - } - } - - @Override - public Object[] getChildren(Object parentElement) { - Node parent = (Node) parentElement; - if (isLeaf(parent)) - return null; - return Jcr.getNodes(parent).toArray(); - } - - @Override - public Object getParent(Object element) { - Node node = (Node) element; - return Jcr.getParent(node); - } - - @Override - public boolean hasChildren(Object element) { - Node node = (Node) element; - return !isLeaf(node); - } - - @Override - public void dispose() { - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - + return view; } } diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java b/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java new file mode 100644 index 0000000..d86eef2 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java @@ -0,0 +1,178 @@ +package org.argeo.app.ui.library; + +import java.util.SortedMap; +import java.util.TreeMap; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.query.Query; + +import org.argeo.api.acr.Content; +import org.argeo.api.cms.CmsConstants; +import org.argeo.app.api.EntityType; +import org.argeo.app.ui.SuiteEvent; +import org.argeo.app.ui.SuiteIcon; +import org.argeo.app.ui.widgets.TreeOrSearchArea; +import org.argeo.cms.jcr.acr.JcrContentProvider; +import org.argeo.cms.swt.CmsSwtTheme; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ui.CmsUiProvider; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class JcrContentEntryArea implements CmsUiProvider { + private JcrContentProvider jcrContentProvider; + + @Override + public Control createUiPart(Composite parent, Content context) { + CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent); + + parent.setLayout(new GridLayout()); + Ui ui = new Ui(parent, SWT.NONE); + ui.setLayoutData(CmsSwtUtils.fillAll()); + + TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE); + nameCol.getColumn().setWidth(400); + nameCol.setLabelProvider(new ColumnLabelProvider() { + + @Override + public String getText(Object element) { + Node node = (Node) element; + return Jcr.getTitle(node); + } + + @Override + public Image getImage(Object element) { + Node node = (Node) element; + Image icon; + if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) { + icon = theme.getSmallIcon(SuiteIcon.folder); + } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) { + // TODO check recognized document types + icon = theme.getSmallIcon(SuiteIcon.document); + } else if (Jcr.isNodeType(node, EntityType.document.get())) { + icon = theme.getSmallIcon(SuiteIcon.document); + } else { + if (!isLeaf(node)) + icon = theme.getSmallIcon(SuiteIcon.folder); + else + icon = null; + } + return icon; + } + + }); + + ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() { + + @Override + public void doubleClick(DoubleClickEvent event) { + Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); + if (user != null) { + CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), + SuiteEvent.eventProperties(user)); + } + + } + }); + ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement(); + if (user != null) { + CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), + SuiteEvent.eventProperties(user)); + } + } + }); + + ui.getTreeViewer().setContentProvider(new SpacesContentProvider()); + Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE); + ui.getTreeViewer().setInput(session); + return ui; + } + + protected boolean isLeaf(Node node) { + return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get()) + || Jcr.isNodeType(node, NodeType.NT_FILE); + } + + public void setJcrContentProvider(JcrContentProvider jcrContentProvider) { + this.jcrContentProvider = jcrContentProvider; + } + + class Ui extends TreeOrSearchArea { + + public Ui(Composite parent, int style) { + super(parent, style); + } + + } + + class SpacesContentProvider implements ITreeContentProvider { + + @Override + public Object[] getElements(Object inputElement) { + Session session = (Session) inputElement; + try { + Query query = session.getWorkspace().getQueryManager() + .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2); + NodeIterator spacesIt = query.execute().getNodes(); + SortedMap map = new TreeMap<>(); + while (spacesIt.hasNext()) { + Node space = spacesIt.nextNode(); + String path = space.getPath(); + map.put(path, space); + } + return map.values().toArray(); + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + @Override + public Object[] getChildren(Object parentElement) { + Node parent = (Node) parentElement; + if (isLeaf(parent)) + return null; + return Jcr.getNodes(parent).toArray(); + } + + @Override + public Object getParent(Object element) { + Node node = (Node) element; + return Jcr.getParent(node); + } + + @Override + public boolean hasChildren(Object element) { + Node node = (Node) element; + return !isLeaf(node); + } + + @Override + public void dispose() { + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + } + +} diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java new file mode 100644 index 0000000..8aafded --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java @@ -0,0 +1,16 @@ +package org.argeo.app.ui.publish; + +import org.argeo.api.acr.Content; +import org.argeo.cms.swt.acr.SwtUiProvider; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class PublishEntryArea implements SwtUiProvider { + + @Override + public Control createUiPart(Composite parent, Content context) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java new file mode 100644 index 0000000..a077372 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java @@ -0,0 +1,17 @@ +package org.argeo.app.ui.publish; + +import org.argeo.api.acr.Content; +import org.argeo.app.ux.docbook.DocBookViewer; +import org.argeo.cms.swt.acr.SwtUiProvider; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class PublishUiProvider implements SwtUiProvider { + + @Override + public Control createUiPart(Composite parent, Content context) { + DocBookViewer docBookViewer = new DocBookViewer(parent, 0, context); + return docBookViewer; + } + +} diff --git a/org.argeo.app.ux/.classpath b/org.argeo.app.ux/.classpath new file mode 100644 index 0000000..81fe078 --- /dev/null +++ b/org.argeo.app.ux/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.ux/.project b/org.argeo.app.ux/.project new file mode 100644 index 0000000..8ba2daf --- /dev/null +++ b/org.argeo.app.ux/.project @@ -0,0 +1,28 @@ + + + org.argeo.app.ux + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.argeo.app.ux/bnd.bnd b/org.argeo.app.ux/bnd.bnd new file mode 100644 index 0000000..e69de29 diff --git a/org.argeo.app.ux/build.properties b/org.argeo.app.ux/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/org.argeo.app.ux/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java b/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java new file mode 100644 index 0000000..d53b2a7 --- /dev/null +++ b/org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java @@ -0,0 +1,15 @@ +package org.argeo.app.ux.docbook; + +import org.argeo.api.acr.Content; +import org.argeo.cms.swt.acr.ContentComposite; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +public class DocBookViewer extends ContentComposite { + + public DocBookViewer(Composite parent, int style, Content item) { + super(parent, style, item); + new Label(parent, 0).setText(item.toString()); + } + +} -- 2.30.2