From daef461662700ec2df8a72f895623c889f9da946 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 26 Nov 2020 12:19:00 +0100 Subject: [PATCH] Start implementing state management. --- .../src/org/argeo/suite/ui/SuiteApp.java | 160 +++++++----------- .../src/org/argeo/suite/ui/SuiteEvent.java | 5 +- .../src/org/argeo/suite/ui/SuiteUi.java | 8 +- 3 files changed, 67 insertions(+), 106 deletions(-) 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 62e1a70..9238271 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 @@ -23,7 +23,6 @@ import org.argeo.cms.ui.AbstractCmsApp; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.CmsView; -import org.argeo.cms.ui.MvcProvider; import org.argeo.cms.ui.dialogs.CmsFeedback; import org.argeo.cms.ui.util.CmsEvent; import org.argeo.cms.ui.util.CmsUiUtils; @@ -141,16 +140,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { SuiteLayer layer = layers.get(key).get(); ui.addLayer(key, layer); } - -// ui.addLayer(ArgeoSuiteUi.DASHBOARD_LAYER); -// ui.addLayer("documents"); -// ui.addLayer("locations"); -// ui.addLayer("people"); - // ui.switchToLayer(DASHBOARD_LAYER_PID, context); - -// refreshPart(findUiProvider(DASHBOARD_PID), ui.getTabbedArea().getCurrent(), context); refreshPart(findUiProvider(LEAD_PANE_PID), ui.getLeadPane(), context); -// refreshPart(findUiProvider(RECENT_ITEMS_PID), ui.getEntryArea(), context); } ui.layout(true, true); } catch (Exception e) { @@ -216,50 +206,6 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { throw new IllegalStateException(e); } } -// private CmsUiProvider findUiProvider(String pid, Node context) { -// CmsUiProvider found = null; -// if (pid != null) { -// SortedMap subMap = uiProvidersByPid.subMap(RankingKey.minPid(pid), -// RankingKey.maxPid(pid)); -// providers: for (RankingKey key : subMap.keySet()) { -// if (key.getPid() == null || !key.getPid().equals(pid)) -// break providers; -// found = subMap.get(key); -// } -// if (found != null) -// return found; -// } -// -// if (found == null && context != null) { -// SortedMap subMap = null; -// String dataType = null; -// if (Jcr.isNodeType(context, EntityTypes.ENTITY_ENTITY)) { -// dataType = Jcr.get(context, EntityNames.ENTITY_TYPE); -// subMap = uiProvidersByPid.subMap(RankingKey.minDataType(dataType), RankingKey.maxDataType(dataType)); -// } -// providers: for (RankingKey key : subMap.keySet()) { -// if (key.getDataType() == null || !key.getDataType().equals(dataType)) -// break providers; -// found = subMap.get(key); -// } -// if (found == null) -// found = uiProvidersByPid.get(new RankingKey(null, null, null, dataType, null)); -// if (found != null) -// return found; -// } -// -// // nothing -// if (log.isWarnEnabled()) -// log.warn("No UI provider found for" + (pid != null ? " pid " + pid : "") -// + (context != null ? " " + context : "")); -// return new CmsUiProvider() { -// -// @Override -// public Control createUi(Composite parent, Node context) throws RepositoryException { -// return parent; -// } -// }; -// } @Override public void setState(Composite parent, String state) { @@ -288,11 +234,11 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { path = "/"; } } - session = getRepository().login(workspace); + session = cmsView.doAs(() -> Jcr.login(getRepository(), workspace)); Node node = session.getNode(path); - refreshEntityUi(null, node); + cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node)); } } catch (RepositoryException e) { log.error("Cannot load state " + state, e); @@ -302,7 +248,61 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } } - private void refreshEntityUi(Composite parent, Node context) { + /* + * Events management + */ + + @Override + public void handleEvent(Event event) { + + // Specific UI related events + SuiteUi ui = getRelatedUi(event); + try { + String currentLayerId = ui.getCurrentLayerId(); + SuiteLayer layer = currentLayerId != null ? layers.get(currentLayerId).get() : null; + if (isTopic(event, SuiteEvent.refreshPart)) { + String nodePath = get(event, SuiteEvent.NODE_PATH); + String workspace = get(event, SuiteEvent.WORKSPACE); + Node node = Jcr.getNode(ui.getSession(workspace), nodePath); + CmsUiProvider uiProvider = findUiProvider(node); + layer.view(uiProvider, ui.getCurrentWorkArea(), node); + ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node)); + } else if (isTopic(event, SuiteEvent.openNewPart)) { + String nodePath = get(event, SuiteEvent.NODE_PATH); + String workspace = get(event, SuiteEvent.WORKSPACE); + Node node = Jcr.getNode(ui.getSession(workspace), nodePath); + CmsUiProvider uiProvider = findUiProvider(node); + layer.open(uiProvider, ui.getCurrentWorkArea(), node); + ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(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); + } + + } + + private String nodeToState(Node node) { + return '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node); + } + + private SuiteUi getRelatedUi(Event event) { + return managedUis.get(get(event, CMS_VIEW_UID_PROPERTY)); + } + + private static boolean isTopic(Event event, CmsEvent cmsEvent) { + return event.getTopic().equals(cmsEvent.topic()); + } + + private static String get(Event event, String key) { + Object value = event.getProperty(key); + if (value == null) + throw new IllegalArgumentException("Property " + key + " must be set"); + return value.toString(); + } /* @@ -374,50 +374,4 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { this.cmsUserManager = cmsUserManager; } - @Override - public void handleEvent(Event event) { - - // Specific UI related events - SuiteUi ui = getRelatedUi(event); - 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); - } - - } - - private SuiteUi getRelatedUi(Event event) { - return managedUis.get(get(event, CMS_VIEW_UID_PROPERTY)); - } - - private static boolean isTopic(Event event, CmsEvent cmsEvent) { - return event.getTopic().equals(cmsEvent.topic()); - } - - private static String get(Event event, String key) { - Object value = event.getProperty(key); - if (value == null) - throw new IllegalArgumentException("Property " + key + " must be set"); - return value.toString(); - - } } 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 a77dc7a..563cd21 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 @@ -14,7 +14,8 @@ public enum SuiteEvent implements CmsEvent { openNewPart, refreshPart, switchLayer; public final static String LAYER = "layer"; - public final static String NODE_ID = "nodeId"; +// public final static String NODE_ID = "nodeId"; + public final static String NODE_PATH = "path"; public final static String USERNAME = "username"; public final static String WORKSPACE = "workspace"; @@ -24,7 +25,7 @@ public enum SuiteEvent implements CmsEvent { public static Map eventProperties(Node node) { Map properties = new HashMap<>(); - properties.put(NODE_ID, Jcr.getIdentifier(node)); + properties.put(NODE_PATH, Jcr.getPath(node)); properties.put(WORKSPACE, Jcr.getWorkspaceName(node)); return properties; } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java index 3d1e938..8c8780f 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java @@ -17,7 +17,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; -/** The {@link CmsView} for the work ergonomics of Argeo Suite. */ +/** The view for the default ergonomics of Argeo Suite. */ class SuiteUi extends Composite { private static final long serialVersionUID = 6207018859086689108L; @@ -184,4 +184,10 @@ class SuiteUi extends Composite { throw new IllegalArgumentException("Unknown workspace " + workspaceName); } + public CmsView getCmsView() { + return cmsView; + } + + + } -- 2.30.2