From 5f3933c6262a3f45212299f6f0ec3c29a2e411bf Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 26 Oct 2020 10:42:27 +0100 Subject: [PATCH] Improve extensibility. --- .../documents/ui/DocumentsTreeUiProvider.java | 18 ++--- .../src/org/argeo/suite/RankedObject.java | 2 +- .../src/org/argeo/suite/ui/RecentItems.java | 20 +++--- .../src/org/argeo/suite/ui/SuiteApp.java | 72 +++++++++++-------- .../src/org/argeo/suite/ui/SuiteEvent.java | 12 ++++ 5 files changed, 75 insertions(+), 49 deletions(-) diff --git a/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java b/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java index c2cda56..13c26e5 100644 --- a/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java +++ b/library/org.argeo.documents.ui/src/org/argeo/documents/ui/DocumentsTreeUiProvider.java @@ -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 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 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)); } } }); diff --git a/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java b/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java index a4d2833..f0165af 100644 --- a/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java +++ b/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java @@ -34,7 +34,7 @@ public class RankedObject { 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 diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java index 0104a68..e0415a0 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java @@ -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 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; diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java index 44e7d3d..7bb9991 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java @@ -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 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); } } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java index 36a6ed7..99e4988 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java @@ -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 eventProperties(Node node) { + Map properties = new HashMap<>(); + properties.put(NODE_ID, Jcr.getIdentifier(node)); + properties.put(WORKSPACE, Jcr.getWorkspaceName(node)); + return properties; + } } -- 2.30.2