Improve documents management.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Oct 2020 07:46:19 +0000 (08:46 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Oct 2020 07:46:19 +0000 (08:46 +0100)
18 files changed:
library/org.argeo.documents.ui/OSGI-INF/documentsFolder.xml [new file with mode: 0644]
library/org.argeo.documents.ui/OSGI-INF/entryArea.xml
library/org.argeo.documents.ui/bnd.bnd
library/org.argeo.documents.ui/build.properties
library/org.argeo.documents.ui/config/documentsFolder.properties [new file with mode: 0644]
library/org.argeo.documents.ui/config/documentsLayer.properties
library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsFolderUiProvider.java [new file with mode: 0644]
library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java
org.argeo.suite.ui/OSGI-INF/leadPane.xml
org.argeo.suite.ui/config/dashboardLayer.properties
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java
sdk/argeo-suite-rap.properties
sdk/argeo-suite-rcp.properties

diff --git a/library/org.argeo.documents.ui/OSGI-INF/documentsFolder.xml b/library/org.argeo.documents.ui/OSGI-INF/documentsFolder.xml
new file mode 100644 (file)
index 0000000..a7c2e4b
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Documents Folder">
+   <implementation class="org.argeo.documents.ui.DocumentsFolderUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/documentsFolder.properties"/>
+   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+</scr:component>
index eed1520b87707234f2a673a2417c766c12057446..50fcfe36d09be46fce8727c7bce8c6e8038e1f01 100644 (file)
@@ -4,6 +4,7 @@
    <service>
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
    </service>
    <service>
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
    </service>
-   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
    <properties entry="config/entryArea.properties"/>
    <properties entry="config/entryArea.properties"/>
+   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
 </scr:component>
 </scr:component>
index cf460283fe488dbd8da4fd9fc0dd50fac68b05d1..9a3a99c8de112a84cf55ea407fbe899a4ec4dc77 100644 (file)
@@ -1,6 +1,7 @@
 Service-Component:\
 OSGI-INF/entryArea.xml,\
 Service-Component:\
 OSGI-INF/entryArea.xml,\
-OSGI-INF/documentsLayer.xml
+OSGI-INF/documentsLayer.xml,\
+OSGI-INF/documentsFolder.xml
 
 Import-Package:\
 org.eclipse.swt,\
 
 Import-Package:\
 org.eclipse.swt,\
index 6ac35f7846e80cc600cd5d58037143d0dbb67b05..0a508e270ce4acb26d58d10fb210a9f38bd3b38c 100644 (file)
@@ -2,5 +2,6 @@ output.. = bin/
 bin.includes = META-INF/,\
                .,\
                OSGI-INF/,\
 bin.includes = META-INF/,\
                .,\
                OSGI-INF/,\
-               OSGI-INF/documentsLayer.xml
+               OSGI-INF/documentsLayer.xml,\
+               OSGI-INF/documentsFolder.xml
 source.. = src/
 source.. = src/
diff --git a/library/org.argeo.documents.ui/config/documentsFolder.properties b/library/org.argeo.documents.ui/config/documentsFolder.properties
new file mode 100644 (file)
index 0000000..349e930
--- /dev/null
@@ -0,0 +1 @@
+entity.type=nt:folder
\ No newline at end of file
index 2906f2d227991fccbc4611986a7e80f8c7cfdc6a..1c6222298cbc7099f428577a6fc5cfa78592c37f 100644 (file)
@@ -1 +1,4 @@
 service.pid=argeo.documents.ui.documentsLayer
 service.pid=argeo.documents.ui.documentsLayer
+
+title=Documents
+icon=documents
\ No newline at end of file
diff --git a/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsFolderUiProvider.java b/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsFolderUiProvider.java
new file mode 100644 (file)
index 0000000..2210b9f
--- /dev/null
@@ -0,0 +1,33 @@
+package org.argeo.documents.ui;
+
+import java.nio.file.spi.FileSystemProvider;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.fs.CmsFsUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** UI provider of a document folder. */
+public class DocumentsFolderUiProvider implements CmsUiProvider {
+       private FileSystemProvider nodeFileSystemProvider;
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               CmsView cmsView = CmsView.getCmsView(parent);
+               DocumentsFolderComposite dfc = new DocumentsFolderComposite(parent, SWT.NONE, context);
+               dfc.setLayoutData(CmsUiUtils.fillAll());
+               dfc.populate(cmsView.doAs(() -> CmsFsUtils.getPath(nodeFileSystemProvider, context)));
+               return dfc;
+       }
+
+       public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
+               this.nodeFileSystemProvider = nodeFileSystemProvider;
+       }
+
+}
index 224576e39441fdfdda147939e3e19fa7a8a990c0..c2cda5647511535bd617320f746ecc21146efa40 100644 (file)
@@ -1,16 +1,24 @@
 package org.argeo.documents.ui;
 
 package org.argeo.documents.ui;
 
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.spi.FileSystemProvider;
 import java.nio.file.Path;
 import java.nio.file.spi.FileSystemProvider;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.jcr.Node;
 
 import javax.jcr.Node;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.fs.CmsFsUtils;
 import org.argeo.cms.ui.CmsUiProvider;
 import javax.jcr.RepositoryException;
 
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.fs.CmsFsUtils;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.eclipse.ui.fs.FsTreeViewer;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.eclipse.ui.fs.FsTreeViewer;
+import org.argeo.jcr.Jcr;
+import org.argeo.suite.ui.SuiteEvent;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -19,6 +27,7 @@ import org.eclipse.swt.widgets.Control;
 /** Tree view of a user root folders. */
 public class DocumentsTreeUiProvider implements CmsUiProvider {
        private FileSystemProvider nodeFileSystemProvider;
 /** Tree view of a user root folders. */
 public class DocumentsTreeUiProvider implements CmsUiProvider {
        private FileSystemProvider nodeFileSystemProvider;
+       private Repository repository;
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
@@ -27,6 +36,39 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                fsTreeViewer.configureDefaultSingleColumnTable(500);
                Node homeNode = NodeUtils.getUserHome(context.getSession());
                Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
                fsTreeViewer.configureDefaultSingleColumnTable(500);
                Node homeNode = NodeUtils.getUserHome(context.getSession());
                Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
+               CmsView cmsView = CmsView.getCmsView(parent);
+               fsTreeViewer.addSelectionChangedListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       Map<String, Object> properties = new HashMap<>();
+                                       properties.put(SuiteEvent.NODE_ID, Jcr.getIdentifier(folderNode));
+                                       properties.put(SuiteEvent.WORKSPACE, Jcr.getWorkspaceName(folderNode));
+                                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties);
+                               }
+                       }
+               });
+               fsTreeViewer.addDoubleClickListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       Map<String, Object> properties = new HashMap<>();
+                                       properties.put(SuiteEvent.NODE_ID, Jcr.getIdentifier(folderNode));
+                                       properties.put(SuiteEvent.WORKSPACE, Jcr.getWorkspaceName(folderNode));
+                                       cmsView.sendEvent(SuiteEvent.openNewPart.topic(), properties);
+                               }
+                       }
+               });
                fsTreeViewer.setPathsInput(homePath);
                fsTreeViewer.getControl().setLayoutData(CmsUiUtils.fillAll());
                fsTreeViewer.getControl().getParent().layout(true, true);
                fsTreeViewer.setPathsInput(homePath);
                fsTreeViewer.getControl().setLayoutData(CmsUiUtils.fillAll());
                fsTreeViewer.getControl().getParent().layout(true, true);
@@ -37,4 +79,8 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                this.nodeFileSystemProvider = nodeFileSystemProvider;
        }
 
                this.nodeFileSystemProvider = nodeFileSystemProvider;
        }
 
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
 }
 }
index bcbc88b85989617e6efcc2827c87d7f0445b3913..9d3f2dd467be9f8ea661962ac5b18de2243fa8ca 100644 (file)
@@ -8,4 +8,5 @@
    <property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
 argeo.documents.ui.documentsLayer
    </property>
    <property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
 argeo.documents.ui.documentsLayer
    </property>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
 </scr:component>
 </scr:component>
index c7b815b2737838a8528f02223d54ba48fb4478d9..79abe4ce1456c3bc00c9e9bb24020c80e44656c8 100644 (file)
@@ -1 +1,4 @@
-service.pid=argeo.suite.ui.dashboardLayer
\ No newline at end of file
+service.pid=argeo.suite.ui.dashboardLayer
+
+title=Dashboard
+icon=dashboard
\ No newline at end of file
index 9ed12b67216aad8846040c0f4f1ee0b882d98ee2..6e77937f82a7347af2ede52208df397381c84f78 100644 (file)
@@ -27,16 +27,14 @@ public class DefaultEditionLayer implements SuiteLayer {
        }
 
        @Override
        }
 
        @Override
-       public void view(Composite workArea, Node context) {
+       public void view(CmsUiProvider uiProvider, Composite workArea, Node context) {
                TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
                TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
-               CmsUiProvider uiProvider = null;
                tabbedArea.view(uiProvider, context);
        }
 
        @Override
                tabbedArea.view(uiProvider, context);
        }
 
        @Override
-       public void open(Composite workArea, Node context) {
+       public void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
                TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
                TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
-               CmsUiProvider uiProvider = null;
                tabbedArea.open(uiProvider, context);
        }
 
                tabbedArea.open(uiProvider, context);
        }
 
index 77ba555e3b1af3e636f8cb1e9c9ea014c28135aa..ed7f9aaf54f75a6737202753787a74334acc9f94 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.suite.ui;
 
 package org.argeo.suite.ui;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.Map;
+import java.util.TreeMap;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -13,6 +15,7 @@ import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsIcon;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsIcon;
 import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.suite.RankedObject;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -20,6 +23,7 @@ import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.osgi.framework.Constants;
 
 /** Side pane listing various perspectives. */
 public class DefaultLeadPane implements CmsUiProvider {
 
 /** Side pane listing various perspectives. */
 public class DefaultLeadPane implements CmsUiProvider {
@@ -29,6 +33,7 @@ public class DefaultLeadPane implements CmsUiProvider {
                defaultLayers;
        }
 
                defaultLayers;
        }
 
+       private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
        private String[] defaultLayers;
 
        @Override
        private String[] defaultLayers;
 
        @Override
@@ -43,9 +48,24 @@ public class DefaultLeadPane implements CmsUiProvider {
 
                Button first = null;
                for (String layerId : defaultLayers) {
 
                Button first = null;
                for (String layerId : defaultLayers) {
-                       Button b = createButton(parent, layerId, SuiteMsg.dashboard, SuiteIcon.dashboard);
-                       if (first == null)
-                               first = b;
+                       if (layers.containsKey(layerId)) {
+                               RankedObject<SuiteLayer> layerObj = layers.get(layerId);
+
+                               // TODO deal with i10n
+                               String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name());
+                               Localized title = null;
+                               if (titleStr != null)
+                                       title = new Localized.Untranslated(titleStr);
+
+                               String iconName = (String) layerObj.getProperties().get(SuiteLayer.Property.icon.name());
+                               SuiteIcon icon = null;
+                               if (iconName != null)
+                                       icon = SuiteIcon.valueOf(iconName);
+
+                               Button b = createButton(parent, layerId, title, icon);
+                               if (first == null)
+                                       first = b;
+                       }
                }
 
 //             Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard);
                }
 
 //             Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard);
@@ -61,13 +81,16 @@ public class DefaultLeadPane implements CmsUiProvider {
                CmsTheme theme = CmsTheme.getCmsTheme(parent);
                Button button = new Button(parent, SWT.PUSH);
                CmsUiUtils.style(button, SuiteStyle.leadPane);
                CmsTheme theme = CmsTheme.getCmsTheme(parent);
                Button button = new Button(parent, SWT.PUSH);
                CmsUiUtils.style(button, SuiteStyle.leadPane);
-               button.setImage(icon.getBigIcon(theme));
+               if (icon != null)
+                       button.setImage(icon.getBigIcon(theme));
                button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
                // button.setToolTipText(msg.lead());
                button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
                // button.setToolTipText(msg.lead());
-               Label lbl = new Label(parent, SWT.NONE);
-               CmsUiUtils.style(lbl, SuiteStyle.leadPane);
-               lbl.setText(msg.lead());
-               lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+               if (msg != null) {
+                       Label lbl = new Label(parent, SWT.NONE);
+                       CmsUiUtils.style(lbl, SuiteStyle.leadPane);
+                       lbl.setText(msg.lead());
+                       lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+               }
                CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
                return button;
        }
                CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
                return button;
        }
@@ -79,4 +102,12 @@ public class DefaultLeadPane implements CmsUiProvider {
                if (log.isDebugEnabled())
                        log.debug("Default layers: " + defaultLayers);
        }
                if (log.isDebugEnabled())
                        log.debug("Default layers: " + defaultLayers);
        }
+
+       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       RankedObject.putIfHigherRank(layers, pid, layer, properties);
+               }
+       }
+
 }
 }
index ce6f7f1f8f91556f488867186133a290eace6023..44e7d3db4678abe9360949f9305ea1b54dd7919d 100644 (file)
@@ -8,13 +8,16 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.TreeSet;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeUtils;
 import org.argeo.cms.ui.AbstractCmsApp;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.AbstractCmsApp;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
@@ -22,6 +25,7 @@ import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.dialogs.CmsFeedback;
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.dialogs.CmsFeedback;
 import org.argeo.cms.ui.util.CmsEvent;
 import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityConstants;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.suite.RankedObject;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.suite.RankedObject;
@@ -47,6 +51,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
        private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
+       private Map<String, RankedObject<CmsUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
 
        // TODO make more optimal or via CmsSession/CmsView
        private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
 
        // TODO make more optimal or via CmsSession/CmsView
@@ -154,6 +159,35 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                        throw new IllegalArgumentException("No UI provider registered as " + pid);
                return uiProvidersByPid.get(pid).get();
        }
                        throw new IllegalArgumentException("No UI provider registered as " + pid);
                return uiProvidersByPid.get(pid).get();
        }
+
+       private CmsUiProvider findUiProvider(Node context) {
+               try {
+                       Set<String> types = new TreeSet<>();
+                       for (NodeType nodeType : context.getMixinNodeTypes()) {
+                               String typeName = nodeType.getName();
+                               if (uiProvidersByType.containsKey(typeName)) {
+                                       types.add(typeName);
+                               }
+                       }
+                       NodeType nodeType = context.getPrimaryNodeType();
+                       String typeName = nodeType.getName();
+                       if (uiProvidersByType.containsKey(typeName)) {
+                               types.add(typeName);
+                       }
+//                     if (context.getPath().equals("/")) {// root node
+//                             types.add("nt:folder");
+//                     }
+                       if (NodeUtils.isUserHome(context)) {// home node
+                               types.add("nt:folder");
+                       }
+
+                       if (types.size() == 0)
+                               throw new IllegalArgumentException("No UI provider found for " + context);
+                       return uiProvidersByType.get(types.iterator().next()).get();
+               } catch (RepositoryException e) {
+                       throw new IllegalStateException(e);
+               }
+       }
 //     private CmsUiProvider findUiProvider(String pid, Node context) {
 //             CmsUiProvider found = null;
 //             if (pid != null) {
 //     private CmsUiProvider findUiProvider(String pid, Node context) {
 //             CmsUiProvider found = null;
 //             if (pid != null) {
@@ -248,31 +282,14 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
         */
 
        public void addUiProvider(CmsUiProvider uiProvider, Map<String, Object> properties) {
         */
 
        public void addUiProvider(CmsUiProvider uiProvider, Map<String, Object> properties) {
-//             RankingKey partKey = new RankingKey(properties);
-//             if (partKey.getPid() != null || partKey.getDataType() != null) {
-//                     uiProvidersByPid.put(partKey, uiProvider);
-//                     if (log.isDebugEnabled())
-//                             log.debug("Added UI provider " + partKey + " (" + uiProvider.getClass().getName() + ") to CMS app.");
-//             }
-
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        RankedObject.putIfHigherRank(uiProvidersByPid, pid, uiProvider, properties);
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        RankedObject.putIfHigherRank(uiProvidersByPid, pid, uiProvider, properties);
-//                     RankedObject<CmsUiProvider> rankedObject = new RankedObject<>(uiProvider, properties);
-//                     if (!uiProvidersByPid.containsKey(pid)) {
-//                             uiProvidersByPid.put(pid, rankedObject);
-//                             if (log.isDebugEnabled())
-//                                     log.debug("Added UI provider " + pid + " as " + uiProvider.getClass().getName() + " with rank "
-//                                                     + rankedObject.getRank());
-//                     } else {
-//                             RankedObject<CmsUiProvider> current = uiProvidersByPid.get(pid);
-//                             if (current.getRank() <= rankedObject.getRank()) {
-//                                     uiProvidersByPid.put(pid, rankedObject);
-//                                     if (log.isDebugEnabled())
-//                                             log.debug("Replaced UI provider " + pid + " by " + uiProvider.getClass().getName()
-//                                                             + " with rank " + rankedObject.getRank());
-//                             }
-//                     }
+               }
+               if (properties.containsKey(EntityConstants.TYPE)) {
+                       // TODO manage String arrays as well
+                       String type = (String) properties.get(EntityConstants.TYPE);
+                       RankedObject.putIfHigherRank(uiProvidersByType, type, uiProvider, properties);
                }
        }
 
                }
        }
 
@@ -314,13 +331,19 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                String currentLayerId = ui.getCurrentLayerId();
                SuiteLayer layer = layers.get(currentLayerId).get();
                if (isTopic(event, SuiteEvent.refreshPart)) {
                String currentLayerId = ui.getCurrentLayerId();
                SuiteLayer layer = layers.get(currentLayerId).get();
                if (isTopic(event, SuiteEvent.refreshPart)) {
-                       Node node = Jcr.getNodeById(ui.getSysSession(), get(event, SuiteEvent.NODE_ID));
-                       layer.view(ui.getCurrentWorkArea(), node);
+                       String nodeId = get(event, SuiteEvent.NODE_ID);
+                       String workspace = get(event, SuiteEvent.WORKSPACE);
+                       Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+                       CmsUiProvider uiProvider = findUiProvider(node);
+                       layer.view(uiProvider, ui.getCurrentWorkArea(), node);
                        // ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID), node);
 //                     ui.layout(true, true);
                } else if (isTopic(event, SuiteEvent.openNewPart)) {
                        // ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID), node);
 //                     ui.layout(true, true);
                } else if (isTopic(event, SuiteEvent.openNewPart)) {
-                       Node node = Jcr.getNodeById(ui.getSysSession(), get(event, SuiteEvent.NODE_ID));
-                       layer.open(ui.getCurrentWorkArea(), node);
+                       String nodeId = get(event, SuiteEvent.NODE_ID);
+                       String workspace = get(event, SuiteEvent.WORKSPACE);
+                       Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+                       CmsUiProvider uiProvider = findUiProvider(node);
+                       layer.open(uiProvider, ui.getCurrentWorkArea(), node);
 //                     ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID), node);
 //                     ui.layout(true, true);
                } else if (isTopic(event, SuiteEvent.switchLayer)) {
 //                     ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID), node);
 //                     ui.layout(true, true);
                } else if (isTopic(event, SuiteEvent.switchLayer)) {
index cc68d4085941ee92828c4fe05f3b23606444b990..36a6ed7b55075c1bb59105f405f6011000f78884 100644 (file)
@@ -8,6 +8,7 @@ public enum SuiteEvent implements CmsEvent {
 
        public final static String LAYER = "layer";
        public final static String NODE_ID = "nodeId";
 
        public final static String LAYER = "layer";
        public final static String NODE_ID = "nodeId";
+       public final static String WORKSPACE = "workspace";
 
        public String getTopicBase() {
                return "argeo/suite/ui";
 
        public String getTopicBase() {
                return "argeo/suite/ui";
index 6770c6752f251b1807bd8a7845648be325b69cdd..d1fa90d1f0ee837684415f692c5e6ce082863f80 100644 (file)
@@ -7,9 +7,13 @@ import org.eclipse.swt.widgets.Composite;
 
 /** An UI layer for the main work area. */
 public interface SuiteLayer extends CmsUiProvider {
 
 /** An UI layer for the main work area. */
 public interface SuiteLayer extends CmsUiProvider {
-       void view(Composite workArea, Node context);
+       static enum Property {
+               title,icon;
+       }
+
+       void view(CmsUiProvider uiProvider, Composite workArea, Node context);
 
 
-       default void open(Composite workArea, Node context) {
-               view(workArea, context);
+       default void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
+               view(uiProvider, workArea, context);
        }
 }
        }
 }
index c2c3c8943d37678d67d8c75e564c18da203f2e7c..8320f7618e1ee5180fe85d48c0120ef6138ea235 100644 (file)
@@ -172,4 +172,15 @@ class SuiteUi extends Composite {
                return sysSession;
        }
 
                return sysSession;
        }
 
+       Session getSession(String workspaceName) {
+               if (workspaceName == null)
+                       return sysSession;
+               if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
+                       return sysSession;
+               else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
+                       return homeSession;
+               else
+                       throw new IllegalArgumentException("Unknown workspace " + workspaceName);
+       }
+
 }
 }
index ef7a063898caa57d162dbf702c5f21ff63a6950a..df068c6b5fdc287ba0c38de1a51ea54d8941d346 100644 (file)
@@ -27,7 +27,7 @@ org.osgi.service.http.port=7070
 
 argeo.node.init=../../init
 
 
 argeo.node.init=../../init
 
-argeo.i18n.locales=en,fr,de,ar
+argeo.i18n.locales=en,fr
 argeo.i18n.defaultLocale=en
 
 #tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
 argeo.i18n.defaultLocale=en
 
 #tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
index aff012d1da6510c28065efb0885d72a26d709688..4cc7c87dbdfd33a5e5085071a13100f6d0837f42 100644 (file)
@@ -24,7 +24,7 @@ org.osgi.service.http.port=7070
 
 argeo.node.init=../../init
 
 
 argeo.node.init=../../init
 
-argeo.i18n.locales=en,fr,de,ar
+argeo.i18n.locales=en,fr
 argeo.i18n.defaultLocale=en
 
 #tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
 argeo.i18n.defaultLocale=en
 
 #tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml