Refactor UX
[gpl/argeo-suite.git] / swt / org.argeo.app.ui / src / org / argeo / app / ui / SuiteApp.java
index 12dceb88c786bf853c9ab5eabb48cb53ec0ba0a0..854268cc24807751836ab77086fe865e29409b51 100644 (file)
@@ -25,6 +25,7 @@ import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsEventSubscriber;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.directory.CmsUserManager;
 import org.argeo.api.cms.ux.CmsTheme;
 import org.argeo.api.cms.ux.CmsUi;
 import org.argeo.api.cms.ux.CmsView;
@@ -32,20 +33,24 @@ import org.argeo.app.api.EntityConstants;
 import org.argeo.app.api.EntityNames;
 import org.argeo.app.api.EntityType;
 import org.argeo.app.api.RankedObject;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.swt.ux.SwtAppUi;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.app.swt.ux.SwtAppLayer;
 import org.argeo.cms.AbstractCmsApp;
-import org.argeo.cms.CmsUserManager;
 import org.argeo.cms.LocaleUtils;
 import org.argeo.cms.Localized;
 import org.argeo.cms.acr.ContentUtils;
 import org.argeo.cms.jcr.CmsJcrUtils;
 import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.jcr.acr.JcrContentProvider;
 import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.swt.acr.SwtUiProvider;
 import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.util.LangUtils;
 import org.argeo.cms.ux.CmsUxUtils;
 import org.argeo.eclipse.ui.specific.UiContext;
 import org.argeo.jcr.JcrException;
-import org.argeo.util.LangUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.osgi.framework.Constants;
@@ -83,17 +88,17 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        // TODO use QName as key for byType
        private Map<String, RankedObject<SwtUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
        private Map<String, RankedObject<SwtUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
 
        private CmsUserManager cmsUserManager;
 
        // TODO make more optimal or via CmsSession/CmsView
-       private Map<String, SuiteUi> managedUis = new HashMap<>();
+       private Map<String, SwtAppUi> managedUis = new HashMap<>();
 
        // ACR
        private ContentRepository contentRepository;
-//     private JcrContentProvider jcrContentProvider;
+       private JcrContentProvider jcrContentProvider;
 
        // JCR
 //     private Repository repository;
@@ -132,7 +137,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        }
 
        public void destroy(Map<String, Object> properties) {
-               for (SuiteUi ui : managedUis.values())
+               for (SwtAppUi ui : managedUis.values())
                        if (!ui.isDisposed()) {
                                ui.getDisplay().syncExec(() -> ui.dispose());
                        }
@@ -160,7 +165,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                CmsTheme theme = getTheme(uiName);
                if (theme != null)
                        CmsSwtUtils.registerCmsTheme(uiParent.getShell(), theme);
-               SuiteUi argeoSuiteUi = new SuiteUi(uiParent, SWT.INHERIT_DEFAULT);
+               SwtAppUi argeoSuiteUi = new SwtAppUi(uiParent, SWT.INHERIT_DEFAULT);
                String uid = cmsView.getUid();
                managedUis.put(uid, argeoSuiteUi);
                argeoSuiteUi.addDisposeListener((e) -> {
@@ -183,7 +188,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        public void refreshUi(CmsUi cmsUi, String state) {
                try {
                        Content context = null;
-                       SuiteUi ui = (SuiteUi) cmsUi;
+                       SwtAppUi ui = (SwtAppUi) cmsUi;
 
                        String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null);
                        if (uiName == null)
@@ -233,8 +238,15 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                                                .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + publicBasePath);
                                                ui.setUserDir(userDir);
                                        } else {
-                                               Content userDir = contentSession.getSessionRunDir();
+                                               Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> {
+                                                       Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
+                                                       return node;
+                                               });
+                                               Content userDir = contentSession
+                                                               .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + userDirNode.getPath());
                                                ui.setUserDir(userDir);
+//                                             Content userDir = contentSession.getSessionRunDir();
+//                                             ui.setUserDir(userDir);
                                        }
                                }
                                initLocale(cmsSession);
@@ -246,7 +258,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        refreshPart(headerUiProvider, ui.getHeader(), context);
                                ui.refreshBelowHeader(true);
                                for (String key : layersByPid.keySet()) {
-                                       SuiteLayer layer = layersByPid.get(key).get();
+                                       SwtAppLayer layer = layersByPid.get(key).get();
                                        ui.addLayer(key, layer);
                                }
 
@@ -282,7 +294,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return uiProvidersByPid.get(pid).get();
        }
 
-       private SuiteLayer findLayer(String pid) {
+       private SwtAppLayer findLayer(String pid) {
                if (!layersByPid.containsKey(pid))
                        return null;
                return layersByPid.get(pid).get();
@@ -392,8 +404,8 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                if (state == null)
                        return;
                if (!state.startsWith("/")) {
-                       if (cmsUi instanceof SuiteUi) {
-                               SuiteUi ui = (SuiteUi) cmsUi;
+                       if (cmsUi instanceof SwtAppUi) {
+                               SwtAppUi ui = (SwtAppUi) cmsUi;
                                if (LOGIN.equals(state)) {
                                        String appTitle = "";
                                        if (ui.getTitle() != null)
@@ -409,7 +421,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                        }
                        return;
                }
-               SuiteUi suiteUi = (SuiteUi) cmsUi;
+               SwtAppUi suiteUi = (SwtAppUi) cmsUi;
                if (suiteUi.isLoginScreen()) {
                        return;
                }
@@ -428,7 +440,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return node.getPath();
        }
 
-       private Content stateToNode(SuiteUi suiteUi, String state) {
+       private Content stateToNode(SwtAppUi suiteUi, String state) {
                if (suiteUi == null)
                        return null;
                if (state == null || !state.startsWith("/"))
@@ -449,7 +461,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        public void onEvent(String topic, Map<String, Object> event) {
 
                // Specific UI related events
-               SuiteUi ui = getRelatedUi(event);
+               SwtAppUi ui = getRelatedUi(event);
                if (ui == null)
                        return;
                ui.getCmsView().runAs(() -> {
@@ -459,27 +471,27 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                        appTitle = ui.getTitle().lead() + " - ";
 
                                if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.refreshPart)) {
-                                       Content node = getNode(ui, event);
+                                       Content node = getContentFromEvent(ui, event);
                                        if (node == null)
                                                return;
                                        SwtUiProvider uiProvider = findByType(uiProvidersByType, node);
-                                       SuiteLayer layer = findByType(layersByType, node);
+                                       SwtAppLayer layer = findByType(layersByType, node);
                                        ui.switchToLayer(layer, node);
                                        layer.view(uiProvider, ui.getCurrentWorkArea(), node);
                                        ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node));
                                } else if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.openNewPart)) {
-                                       Content node = getNode(ui, event);
+                                       Content node = getContentFromEvent(ui, event);
                                        if (node == null)
                                                return;
                                        SwtUiProvider uiProvider = findByType(uiProvidersByType, node);
-                                       SuiteLayer layer = findByType(layersByType, node);
+                                       SwtAppLayer layer = findByType(layersByType, node);
                                        ui.switchToLayer(layer, node);
                                        layer.open(uiProvider, ui.getCurrentWorkArea(), node);
                                        ui.getCmsView().stateChanged(nodeToState(node), appTitle + CmsUxUtils.getTitle(node));
                                } else if (SuiteUiUtils.isTopic(topic, SuiteUxEvent.switchLayer)) {
                                        String layerId = get(event, SuiteUxEvent.LAYER);
                                        if (layerId != null) {
-                                               SuiteLayer suiteLayer = findLayer(layerId);
+                                               SwtAppLayer suiteLayer = findLayer(layerId);
                                                if (suiteLayer == null)
                                                        throw new IllegalArgumentException("No layer '" + layerId + "' available.");
                                                Localized layerTitle = suiteLayer.getTitle();
@@ -488,7 +500,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                                String title = null;
                                                if (layerTitle != null)
                                                        title = layerTitle.lead();
-                                               Content nodeFromState = getNode(ui, event);
+                                               Content nodeFromState = getContentFromEvent(ui, event);
                                                if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) {
                                                        // default layer view is forced
                                                        String state = defaultLayerPid.equals(layerId) ? "~" : layerId;
@@ -506,9 +518,9 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                                                        }
                                                }
                                        } else {
-                                               Content node = getNode(ui, event);
+                                               Content node = getContentFromEvent(ui, event);
                                                if (node != null) {
-                                                       SuiteLayer layer = findByType(layersByType, node);
+                                                       SwtAppLayer layer = findByType(layersByType, node);
                                                        ui.switchToLayer(layer, node);
                                                }
                                        }
@@ -520,13 +532,13 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                });
        }
 
-       private Content getNode(SuiteUi ui, Map<String, Object> event) {
+       protected Content getContentFromEvent(SwtAppUi ui, Map<String, Object> event) {
                ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository,
                                ui.getCmsView());
 
                String path = get(event, SuiteUxEvent.CONTENT_PATH);
 
-               if (path != null && path.equals(HOME_STATE))
+               if (path != null && (path.equals(HOME_STATE) || path.equals("")))
                        return ui.getUserDir();
                Content node;
                if (path == null) {
@@ -544,7 +556,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                return node;
        }
 
-       private SuiteUi getRelatedUi(Map<String, Object> eventProperties) {
+       private SwtAppUi getRelatedUi(Map<String, Object> eventProperties) {
                return managedUis.get(get(eventProperties, CMS_VIEW_UID_PROPERTY));
        }
 
@@ -594,7 +606,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                }
        }
 
-       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void addLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        RankedObject.putIfHigherRank(layersByPid, pid, layer, properties);
@@ -606,11 +618,11 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                }
        }
 
-       public void removeLayer(SuiteLayer layer, Map<String, Object> properties) {
+       public void removeLayer(SwtAppLayer layer, Map<String, Object> properties) {
                if (properties.containsKey(Constants.SERVICE_PID)) {
                        String pid = (String) properties.get(Constants.SERVICE_PID);
                        if (layersByPid.containsKey(pid)) {
-                               if (layersByPid.get(pid).equals(new RankedObject<SuiteLayer>(layer, properties))) {
+                               if (layersByPid.get(pid).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
                                        layersByPid.remove(pid);
                                }
                        }
@@ -619,7 +631,7 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
                        List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
                        for (String type : types) {
                                if (layersByType.containsKey(type)) {
-                                       if (layersByType.get(type).equals(new RankedObject<SuiteLayer>(layer, properties))) {
+                                       if (layersByType.get(type).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
                                                layersByType.remove(type);
                                        }
                                }
@@ -638,4 +650,9 @@ public class SuiteApp extends AbstractCmsApp implements CmsEventSubscriber {
        public void setContentRepository(ContentRepository contentRepository) {
                this.contentRepository = contentRepository;
        }
+
+       public void setJcrContentProvider(JcrContentProvider jcrContentProvider) {
+               this.jcrContentProvider = jcrContentProvider;
+       }
+
 }