Major refactoring of Argeo CMS UI
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteUi.java
index c2c3c8943d37678d67d8c75e564c18da203f2e7c..a79d236b29842c3f38806336a40c6e59f36bdf55 100644 (file)
@@ -8,27 +8,34 @@ import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeConstants;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.api.cms.CmsUi;
+import org.argeo.api.cms.CmsView;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.jcr.Jcr;
 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. */
-class SuiteUi extends Composite {
+/** The view for the default ergonomics of Argeo Suite. */
+class SuiteUi extends Composite implements CmsUi {
        private static final long serialVersionUID = 6207018859086689108L;
+       private final static Log log = LogFactory.getLog(SuiteUi.class);
 
+       private Localized title;
        private Composite header;
+       private Composite footer;
        private Composite belowHeader;
        private Composite leadPane;
+       private Composite sidePane;
        private Composite dynamicArea;
 
        private Session sysSession;
        private Session homeSession;
-       private Node userHome;
+       private Node userDir;
 
        private Map<String, SuiteLayer> layers = new HashMap<>();
        private Map<String, Composite> workAreas = new HashMap<>();
@@ -38,38 +45,51 @@ class SuiteUi extends Composite {
 
        public SuiteUi(Composite parent, int style) {
                super(parent, style);
-               cmsView = CmsView.getCmsView(parent);
-               this.setLayout(CmsUiUtils.noSpaceGridLayout());
+               cmsView = CmsSwtUtils.getCmsView(parent);
+               this.setLayout(CmsSwtUtils.noSpaceGridLayout());
 
                header = new Composite(this, SWT.NONE);
-               CmsUiUtils.style(header, SuiteStyle.header);
-               header.setLayoutData(CmsUiUtils.fillWidth());
+               header.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(header, SuiteStyle.header);
+               header.setLayoutData(CmsSwtUtils.fillWidth());
 
                belowHeader = new Composite(this, SWT.NONE);
-               belowHeader.setLayoutData(CmsUiUtils.fillAll());
+               belowHeader.setLayoutData(CmsSwtUtils.fillAll());
+
+               footer = new Composite(this, SWT.NONE);
+               footer.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(footer, SuiteStyle.footer);
+               footer.setLayoutData(CmsSwtUtils.fillWidth());
        }
 
        public void refreshBelowHeader(boolean initApp) {
-               CmsUiUtils.clear(belowHeader);
+               CmsSwtUtils.clear(belowHeader);
                int style = getStyle();
                if (initApp) {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
 
                        if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
                                dynamicArea = new Composite(belowHeader, SWT.NONE);
                                leadPane = new Composite(belowHeader, SWT.NONE);
                        } else {
                                leadPane = new Composite(belowHeader, SWT.NONE);
                                dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
                        }
-                       leadPane.setLayoutData(CmsUiUtils.fillHeight());
-                       CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
-                       dynamicArea.setLayoutData(CmsUiUtils.fillAll());
+                       leadPane.setLayoutData(CmsSwtUtils.fillHeight());
+                       leadPane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                       CmsSwtUtils.style(leadPane, SuiteStyle.leadPane);
 
+                       dynamicArea.setLayoutData(CmsSwtUtils.fillAll());
                        dynamicArea.setLayout(new FormLayout());
 
                } else {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout());
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout());
                }
        }
 
@@ -89,29 +109,53 @@ class SuiteUi extends Composite {
 
        private Composite getLayer(String id, Node context) {
                if (!layers.containsKey(id))
-                       throw new IllegalArgumentException("No layer " + id + " is available.");
+                       return null;
                if (!workAreas.containsKey(id))
                        initLayer(id, layers.get(id), context);
                return workAreas.get(id);
        }
 
-       Composite switchToLayer(String layer, Node context) {
+       Composite switchToLayer(String layerId, Node context) {
+               Composite current = null;
                if (currentLayerId != null) {
-                       Composite current = getCurrentWorkArea();
-                       if (currentLayerId.equals(layer))
+                       current = getCurrentWorkArea();
+                       if (currentLayerId.equals(layerId))
                                return current;
                }
                if (context == null) {
                        if (!cmsView.isAnonymous())
-                               context = userHome;
+                               context = userDir;
                }
-               Composite toShow = getLayer(layer, context);
-               getDisplay().syncExec(() -> {
-                       toShow.moveAbove(null);
-                       dynamicArea.layout(true, true);
-               });
-               currentLayerId = layer;
-               return toShow;
+               Composite toShow = getLayer(layerId, context);
+               if (toShow != null) {
+                       currentLayerId = layerId;
+                       if (!isDisposed()) {
+//                             getDisplay().syncExec(() -> {
+                               if (!toShow.isDisposed()) {
+                                       toShow.moveAbove(null);
+                               } else {
+                                       log.warn("Cannot show work area because it is disposed.");
+                                       toShow = initLayer(layerId, layers.get(layerId), context);
+                                       toShow.moveAbove(null);
+                               }
+                               dynamicArea.layout(true, true);
+//                             });
+                       }
+                       return toShow;
+               } else {
+                       return current;
+               }
+       }
+
+       Composite switchToLayer(SuiteLayer layer, Node context) {
+               // TODO make it more robust
+               for (String layerId : layers.keySet()) {
+                       SuiteLayer l = layers.get(layerId);
+                       if (layer == l) {
+                               return switchToLayer(layerId, context);
+                       }
+               }
+               throw new IllegalArgumentException("Layer is not registered.");
        }
 
        void addLayer(String id, SuiteLayer layer) {
@@ -129,11 +173,20 @@ class SuiteUi extends Composite {
 
        protected Composite initLayer(String id, SuiteLayer layer, Node context) {
                Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
-               workArea.setLayoutData(CmsUiUtils.coverAll());
+               CmsSwtUtils.style(workArea, SuiteStyle.workArea);
+               workArea.setLayoutData(CmsSwtUtils.coverAll());
                workAreas.put(id, workArea);
                return workArea;
        }
 
+       synchronized void logout() {
+               userDir = null;
+               Jcr.logout(sysSession);
+               Jcr.logout(homeSession);
+               currentLayerId = null;
+               workAreas.clear();
+       }
+
        /*
         * GETTERS / SETTERS
         */
@@ -142,10 +195,18 @@ class SuiteUi extends Composite {
                return header;
        }
 
+       Composite getFooter() {
+               return footer;
+       }
+
        Composite getLeadPane() {
                return leadPane;
        }
 
+       Composite getSidePane() {
+               return sidePane;
+       }
+
        Composite getBelowHeader() {
                return belowHeader;
        }
@@ -154,22 +215,45 @@ class SuiteUi extends Composite {
 //             return sysSession;
 //     }
 //
-       void initSessions(Repository repository) throws RepositoryException {
+       synchronized void initSessions(Repository repository, String userDirPath) throws RepositoryException {
                this.sysSession = repository.login();
                this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
-               userHome = NodeUtils.getUserHome(homeSession);
+               userDir = sysSession.getNode(userDirPath);
                addDisposeListener((e) -> {
                        Jcr.logout(sysSession);
                        Jcr.logout(homeSession);
                });
        }
 
-       Node getUserHome() {
-               return userHome;
+       Node getUserDir() {
+               return userDir;
        }
 
        Session getSysSession() {
                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);
+       }
+
+       public CmsView getCmsView() {
+               return cmsView;
+       }
+
+       public Localized getTitle() {
+               return title;
+       }
+
+       public void setTitle(Localized title) {
+               this.title = title;
+       }
+
 }