From 3f824de719b0c7998dafbee087db0e18f9d949f2 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 11 May 2021 06:27:51 +0200 Subject: [PATCH] Introduce content layer and document type. --- .../src/org/argeo/entity/EntityType.java | 2 +- .../src/org/argeo/entity/entity.cnd | 3 + .../config/contentLayer.properties | 2 +- .../argeo/library/ui/ContentEntryArea.java | 71 ++++++++++++++++++- .../OSGI-INF/documentUiProvider.xml | 8 +++ publishing/org.argeo.publishing.ui/bnd.bnd | 3 +- .../org.argeo.publishing.ui/build.properties | 5 +- .../config/documentUiProvider.properties | 3 + .../publishing/ui/DocumentUiProvider.java | 38 ++++++++++ 9 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml create mode 100644 publishing/org.argeo.publishing.ui/config/documentUiProvider.properties create mode 100644 publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java index 84fa16f..089cdcf 100644 --- a/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java +++ b/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java @@ -5,7 +5,7 @@ public enum EntityType implements JcrName { // entity entity, local, relatedTo, // structure - space, + space, document, // typology typologies, terms, term, // form diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd b/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd index cd3f327..151df4e 100644 --- a/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd +++ b/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd @@ -41,6 +41,9 @@ mixin [entity:space] mixin +[entity:document] +mixin + // // TYPOLOGY // diff --git a/library/org.argeo.library.ui/config/contentLayer.properties b/library/org.argeo.library.ui/config/contentLayer.properties index ad7b10e..0f07715 100644 --- a/library/org.argeo.library.ui/config/contentLayer.properties +++ b/library/org.argeo.library.ui/config/contentLayer.properties @@ -3,4 +3,4 @@ service.pid=argeo.library.ui.contentLayer title=%content icon=documents -entity.type=nt:folder,entity:space +entity.type=nt:folder,entity:space,entity:document diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java index 4c8b041..8b884eb 100644 --- a/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java +++ b/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java @@ -10,35 +10,102 @@ import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.query.Query; +import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; +import org.argeo.cms.ui.CmsView; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.entity.EntityType; import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; +import org.argeo.suite.ui.SuiteEvent; +import org.argeo.suite.ui.SuiteIcon; import org.argeo.suite.ui.widgets.TreeOrSearchArea; +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; -import org.eclipse.swt.widgets.Label; public class ContentEntryArea implements CmsUiProvider { @Override public Control createUi(Composite parent, Node context) throws RepositoryException { + CmsTheme theme = CmsTheme.getCmsTheme(parent); + parent.setLayout(new GridLayout()); Ui ui = new Ui(parent, SWT.NONE); ui.setLayoutData(CmsUiUtils.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 = SuiteIcon.folder.getSmallIcon(theme); + } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) { + // TODO check recognized document types + icon = SuiteIcon.document.getSmallIcon(theme); + } else if (Jcr.isNodeType(node, EntityType.document.get())) { + icon = SuiteIcon.document.getSmallIcon(theme); + } else { + if (!isLeaf(node)) + icon = SuiteIcon.folder.getSmallIcon(theme); + 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) { + CmsView.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) { + CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), + SuiteEvent.eventProperties(user)); + } + } + }); + ui.getTreeViewer().setContentProvider(new SpacesContentProvider()); ui.getTreeViewer().setInput(context.getSession()); return ui; } protected boolean isLeaf(Node node) { - return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, NodeType.NT_FILE); + return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get()) + || Jcr.isNodeType(node, NodeType.NT_FILE); } class Ui extends TreeOrSearchArea { diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml new file mode 100644 index 0000000..5cee79f --- /dev/null +++ b/publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/publishing/org.argeo.publishing.ui/bnd.bnd b/publishing/org.argeo.publishing.ui/bnd.bnd index 60d985c..a2a5f70 100644 --- a/publishing/org.argeo.publishing.ui/bnd.bnd +++ b/publishing/org.argeo.publishing.ui/bnd.bnd @@ -12,4 +12,5 @@ Provide-Capability:\ cms.datamodel; name=docbook; cnd=/org/argeo/docbook/docbook.cnd; abstract=true Service-Component:\ -OSGI-INF/fontsServlet.xml +OSGI-INF/fontsServlet.xml,\ +OSGI-INF/documentUiProvider.xml diff --git a/publishing/org.argeo.publishing.ui/build.properties b/publishing/org.argeo.publishing.ui/build.properties index c58ea21..2ef3d70 100644 --- a/publishing/org.argeo.publishing.ui/build.properties +++ b/publishing/org.argeo.publishing.ui/build.properties @@ -1,5 +1,6 @@ -source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - OSGI-INF/ + OSGI-INF/,\ + OSGI-INF/documentUiProvider.xml +source.. = src/ diff --git a/publishing/org.argeo.publishing.ui/config/documentUiProvider.properties b/publishing/org.argeo.publishing.ui/config/documentUiProvider.properties new file mode 100644 index 0000000..2b9635f --- /dev/null +++ b/publishing/org.argeo.publishing.ui/config/documentUiProvider.properties @@ -0,0 +1,3 @@ +service.pid=argeo.publishing.ui.documentUiProvider + +entity.type=entity:document \ No newline at end of file diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java new file mode 100644 index 0000000..17292d8 --- /dev/null +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java @@ -0,0 +1,38 @@ +package org.argeo.publishing.ui; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.cms.ui.CmsEditable; +import org.argeo.cms.ui.CmsUiProvider; +import org.argeo.cms.ui.util.CmsUiUtils; +import org.argeo.cms.ui.viewers.JcrVersionCmsEditable; +import org.argeo.cms.ui.widgets.ScrolledPage; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.ui.AbstractDbkViewer; +import org.argeo.docbook.ui.DocumentTextEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +public class DocumentUiProvider implements CmsUiProvider { + + @Override + public Control createUi(Composite parent, Node context) throws RepositoryException { + CmsEditable cmsEditable = new JcrVersionCmsEditable(context); + if (context.hasNode(DbkType.article.get())) { + Node textNode = context.getNode(DbkType.article.get()); + // Title + parent.setLayout(CmsUiUtils.noSpaceGridLayout()); + + ScrolledPage page = new ScrolledPage(parent, SWT.NONE); + page.setLayoutData(CmsUiUtils.fillAll()); + page.setLayout(CmsUiUtils.noSpaceGridLayout()); + + AbstractDbkViewer dbkEditor = new DocumentTextEditor(page, SWT.NONE, textNode, cmsEditable); + + } + return null; + } + +} -- 2.30.2