Improve extensibility.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Oct 2020 09:42:27 +0000 (10:42 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 26 Oct 2020 09:42:27 +0000 (10:42 +0100)
library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java
org.argeo.suite.core/src/org/argeo/suite/RankedObject.java
org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java

index c2cda5647511535bd617320f746ecc21146efa40..13c26e5123b0a51107d0c1359e1bb1778bb1526d 100644 (file)
@@ -3,13 +3,12 @@ package org.argeo.documents.ui;
 import java.nio.file.Files;
 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.Repository;
 import javax.jcr.RepositoryException;
 
+import org.argeo.api.NodeConstants;
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.fs.CmsFsUtils;
 import org.argeo.cms.ui.CmsUiProvider;
@@ -34,9 +33,10 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                parent.setLayout(new GridLayout());
                FsTreeViewer fsTreeViewer = new FsTreeViewer(parent, SWT.NONE);
                fsTreeViewer.configureDefaultSingleColumnTable(500);
-               Node homeNode = NodeUtils.getUserHome(context.getSession());
-               Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
                CmsView cmsView = CmsView.getCmsView(parent);
+               Node homeNode = NodeUtils.getUserHome(cmsView.doAs(() -> Jcr.login(repository, NodeConstants.HOME_WORKSPACE)));
+               parent.addDisposeListener((e1) -> Jcr.logout(homeNode));
+               Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
                fsTreeViewer.addSelectionChangedListener((e) -> {
                        IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
                        if (selection.isEmpty())
@@ -46,10 +46,7 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                                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);
+                                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(folderNode));
                                }
                        }
                });
@@ -62,10 +59,7 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                                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);
+                                       cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(folderNode));
                                }
                        }
                });
index a4d28330481fa7d23583d31adc11556a0b9f8d6b..f0165af75f3905a88a2580e6ddd37caae0df72ea 100644 (file)
@@ -34,7 +34,7 @@ public class RankedObject<T> {
                if (properties == null)
                        return 0l;
                if (properties.containsKey(SERVICE_RANKING))
-                       return ((Integer) properties.get(SERVICE_RANKING)).longValue();
+                       return Long.valueOf(properties.get(SERVICE_RANKING).toString());
 //             else if (properties.containsKey(SERVICE_ID))
 //                     return (Long) properties.get(SERVICE_ID);
                else
index 0104a687ea5fda0d9d27044212cbc89daf4560cf..e0415a0304baf8473adf5d74f0e4bd9ef3413cf3 100644 (file)
@@ -20,7 +20,6 @@ import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.entity.EntityConstants;
 import org.argeo.entity.EntityTypes;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
@@ -57,6 +56,10 @@ public class RecentItems implements CmsUiProvider {
        private final static int SEARCH_TEXT_DELAY = 800;
        private final static int SEARCH_DEFAULT_LIMIT = 100;
 
+       public static enum Property {
+               entityTypes;
+       }
+
        private CmsTheme theme;
 
        private String entityType;
@@ -105,8 +108,8 @@ public class RecentItems implements CmsUiProvider {
                        public void doubleClick(DoubleClickEvent event) {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null)
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.NODE_ID,
-                                                       Jcr.getIdentifier(node));
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
+                                                       SuiteEvent.eventProperties(node));
 
                        }
                });
@@ -114,8 +117,8 @@ public class RecentItems implements CmsUiProvider {
                        public void selectionChanged(SelectionChangedEvent event) {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null) {
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.NODE_ID,
-                                                       Jcr.getIdentifier(node));
+                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
+                                                       SuiteEvent.eventProperties(node));
                                        deleteItem.setEnabled(true);
                                } else {
                                        deleteItem.setEnabled(false);
@@ -128,7 +131,8 @@ public class RecentItems implements CmsUiProvider {
        }
 
        public void init(Map<String, String> properties) {
-               entityType = properties.get(EntityConstants.TYPE);
+               // TODO manage multiple entities
+               entityType = properties.get(Property.entityTypes.name());
        }
 
        class SingleEntityViewer {
@@ -263,8 +267,8 @@ public class RecentItems implements CmsUiProvider {
 //                     });
                        table.setLinesVisible(true);
                        table.setHeaderVisible(false);
-                       CmsUiUtils.markup(table);
-                       CmsUiUtils.setItemHeight(table, 26);
+                       // CmsUiUtils.markup(table);
+                       // CmsUiUtils.setItemHeight(table, 26);
 
                        viewer.setContentProvider(new BasicNodeListContentProvider());
                        return viewer;
index 44e7d3db4678abe9360949f9305ea1b54dd7919d..7bb9991e0bd90d398c3250eaa7453487dfe0d27c 100644 (file)
@@ -26,6 +26,8 @@ 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.entity.EntityNames;
+import org.argeo.entity.EntityTypes;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.suite.RankedObject;
@@ -43,7 +45,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        public final static String HEADER_PID = PID_PREFIX + "header";
        public final static String LEAD_PANE_PID = PID_PREFIX + "leadPane";
        public final static String LOGIN_SCREEN_PID = PID_PREFIX + "loginScreen";
-       public final static String DASHBOARD_LAYER_PID = PID_PREFIX + "dashboardLayer";
+       // public final static String DASHBOARD_LAYER_PID = PID_PREFIX +
+       // "dashboardLayer";
        public final static String DASHBOARD_PID = PID_PREFIX + "dashboard";
        public final static String RECENT_ITEMS_PID = PID_PREFIX + "recentItems";
 
@@ -137,7 +140,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 //                             ui.addLayer("documents");
 //                             ui.addLayer("locations");
 //                             ui.addLayer("people");
-                               ui.switchToLayer(DASHBOARD_LAYER_PID, context);
+                               // ui.switchToLayer(DASHBOARD_LAYER_PID, context);
 
 //                             refreshPart(findUiProvider(DASHBOARD_PID), ui.getTabbedArea().getCurrent(), context);
                                refreshPart(findUiProvider(LEAD_PANE_PID), ui.getLeadPane(), context);
@@ -162,6 +165,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        private CmsUiProvider findUiProvider(Node context) {
                try {
+                       // mixins
                        Set<String> types = new TreeSet<>();
                        for (NodeType nodeType : context.getMixinNodeTypes()) {
                                String typeName = nodeType.getName();
@@ -169,15 +173,26 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                        types.add(typeName);
                                }
                        }
-                       NodeType nodeType = context.getPrimaryNodeType();
-                       String typeName = nodeType.getName();
-                       if (uiProvidersByType.containsKey(typeName)) {
-                               types.add(typeName);
+                       // primary node type
+                       {
+                               NodeType nodeType = context.getPrimaryNodeType();
+                               String typeName = nodeType.getName();
+                               if (uiProvidersByType.containsKey(typeName)) {
+                                       types.add(typeName);
+                               }
+                       }
+                       // entity type
+                       if (context.isNodeType(EntityTypes.ENTITY_ENTITY)) {
+                               String typeName =context.getProperty(EntityNames.ENTITY_TYPE).getString();
+                               if (uiProvidersByType.containsKey(typeName)) {
+                                       types.add(typeName);
+                               }
                        }
+
 //                     if (context.getPath().equals("/")) {// root node
 //                             types.add("nt:folder");
 //                     }
-                       if (NodeUtils.isUserHome(context)) {// home node
+                       if (NodeUtils.isUserHome(context) && uiProvidersByType.containsKey("nt:folder")) {// home node
                                types.add("nt:folder");
                        }
 
@@ -328,27 +343,28 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
                // Specific UI related events
                SuiteUi ui = getRelatedUi(event);
-               String currentLayerId = ui.getCurrentLayerId();
-               SuiteLayer layer = layers.get(currentLayerId).get();
-               if (isTopic(event, SuiteEvent.refreshPart)) {
-                       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)) {
-                       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)) {
-                       String layerId = get(event, SuiteEvent.LAYER);
-                       ui.switchToLayer(layerId, null);
+               try {
+                       String currentLayerId = ui.getCurrentLayerId();
+                       SuiteLayer layer = currentLayerId != null ? layers.get(currentLayerId).get() : null;
+                       if (isTopic(event, SuiteEvent.refreshPart)) {
+                               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);
+                       } else if (isTopic(event, SuiteEvent.openNewPart)) {
+                               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);
+                       } else if (isTopic(event, SuiteEvent.switchLayer)) {
+                               String layerId = get(event, SuiteEvent.LAYER);
+                               ui.switchToLayer(layerId, Jcr.getRootNode(ui.getSession(null)));
+                       }
+               } catch (Exception e) {
+                       log.error("Cannot handle event " + event, e);
+//                     CmsView.getCmsView(ui).exception(e);
                }
 
        }
index 36a6ed7b55075c1bb59105f405f6011000f78884..99e49880e1b6e7925cd184b8bd9a1d5dc6efab9a 100644 (file)
@@ -1,6 +1,12 @@
 package org.argeo.suite.ui;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+
 import org.argeo.cms.ui.util.CmsEvent;
+import org.argeo.jcr.Jcr;
 
 /** Events specific to Argeo Suite. */
 public enum SuiteEvent implements CmsEvent {
@@ -14,4 +20,10 @@ public enum SuiteEvent implements CmsEvent {
                return "argeo/suite/ui";
        }
 
+       public static Map<String, Object> eventProperties(Node node) {
+               Map<String, Object> properties = new HashMap<>();
+               properties.put(NODE_ID, Jcr.getIdentifier(node));
+               properties.put(WORKSPACE, Jcr.getWorkspaceName(node));
+               return properties;
+       }
 }