Improve ACR usage
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 9 Sep 2022 07:10:33 +0000 (09:10 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 9 Sep 2022 07:10:33 +0000 (09:10 +0200)
19 files changed:
Makefile
org.argeo.app.core/src/org/argeo/app/core/SuiteContentTypes.java
org.argeo.app.core/src/org/argeo/app/core/schemas/entity.xsd
org.argeo.app.ui/OSGI-INF/contentEntryArea.xml
org.argeo.app.ui/OSGI-INF/contentLayer.xml
org.argeo.app.ui/OSGI-INF/publishEntryArea.xml [new file with mode: 0644]
org.argeo.app.ui/OSGI-INF/publishUiProvider.xml [new file with mode: 0644]
org.argeo.app.ui/bnd.bnd
org.argeo.app.ui/config/publishEntryArea.properties [new file with mode: 0644]
org.argeo.app.ui/config/publishUiProvider.properties [new file with mode: 0644]
org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java
org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java [new file with mode: 0644]
org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java [new file with mode: 0644]
org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java [new file with mode: 0644]
org.argeo.app.ux/.classpath [new file with mode: 0644]
org.argeo.app.ux/.project [new file with mode: 0644]
org.argeo.app.ux/bnd.bnd [new file with mode: 0644]
org.argeo.app.ux/build.properties [new file with mode: 0644]
org.argeo.app.ux/src/org/argeo/app/ux/docbook/DocBookViewer.java [new file with mode: 0644]

index 573c303c5f3be9f45892d5faf858bf215c718dae..444b30085df0b529757137ad26bb871a61750e7a 100644 (file)
--- 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 \
index 1f09021ed7cec04fdcaae2bc478cd97ec55b19e3..8b58fe16cb7e02672783ac98f84514d16fa15f87 100644 (file)
@@ -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/";
index e291137fbb6c52ab09c5b52fd6c8c921c7993982..a2fbfcd8f26e582f153b01880705ac60741bbb08 100644 (file)
                                processContents="lax" />
                </xs:complexType>
        </xs:element>
+
+       <xs:element name="terms">
+               <xs:complexType>
+                       <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xs:element ref="entity:term"></xs:element>
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="term">
+               <xs:complexType>
+                       <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xs:element ref="entity:term"></xs:element>
+                       </xs:sequence>
+                       <xs:anyAttribute namespace="##any"
+                               processContents="lax" />
+               </xs:complexType>
+       </xs:element>
 </xs:schema>
\ No newline at end of file
index 87cadaa2b2aba70b536f0779c3340b7759137c2a..8aad52c9e041e56cc4435b3fbba4fbd573351509 100644 (file)
@@ -2,8 +2,7 @@
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
    <implementation class="org.argeo.app.ui.library.ContentEntryArea"/>
    <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
    </service>
    <properties entry="config/contentEntryArea.properties"/>
-   <reference bind="setJcrContentProvider" cardinality="1..1" interface="org.argeo.cms.jcr.acr.JcrContentProvider" name="JcrContentProvider" policy="static"/>
 </scr:component>
index 35c4c3ab4f8ffab589d970d1ca10e3d5b9fec66f..4bf447461f0365dc011855f86c516dbd30cf7a80 100644 (file)
@@ -4,6 +4,6 @@
    <service>
       <provide interface="org.argeo.app.ui.SuiteLayer"/>
    </service>
-   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.library.ui.contentEntryArea)"/>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" target="(service.pid=argeo.library.ui.contentEntryArea)"/>
    <properties entry="config/contentLayer.properties"/>
 </scr:component>
diff --git a/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml b/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml
new file mode 100644 (file)
index 0000000..350a00c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.publish.PublishEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <properties entry="config/publishEntryArea.properties"/>
+</scr:component>
\ 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 (file)
index 0000000..793fc34
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.publish.PublishUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <properties entry="config/publishUiProvider.properties"/>
+</scr:component>
index 482a9ff39d21647159519c4024fe5858781e3d3d..f70f51aaa8197765f1d582f55ce9471589527458 100644 (file)
@@ -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 (file)
index 0000000..f391774
--- /dev/null
@@ -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 (file)
index 0000000..64ca319
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.publishing.ui.publishUiProvider
+
+#entity.type=entity:document,nt:file
\ No newline at end of file
index 42c7e69867cf946e8c20f3d8de448bf5f51bdeef..6b50e931633afb04ccabd2159bf58b9a2c1b5858 100644 (file)
 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<Content> 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<String, Node> 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 (file)
index 0000000..d86eef2
--- /dev/null
@@ -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<String, Node> 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 (file)
index 0000000..8aafded
--- /dev/null
@@ -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 (file)
index 0000000..a077372
--- /dev/null
@@ -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 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.ux/.project b/org.argeo.app.ux/.project
new file mode 100644 (file)
index 0000000..8ba2daf
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.ux</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.ux/bnd.bnd b/org.argeo.app.ux/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.app.ux/build.properties b/org.argeo.app.ux/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -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 (file)
index 0000000..d53b2a7
--- /dev/null
@@ -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());
+       }
+
+}