Merge remote-tracking branch 'origin/unstable' into testing
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteUi.java
index 1231d9262efda834e893a75f6a4dd81b670f79af..469e36f466ba770ff081f331a1d1c086076e789a 100644 (file)
@@ -11,7 +11,7 @@ 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.Localized;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.jcr.Jcr;
@@ -23,14 +23,18 @@ import org.eclipse.swt.widgets.Composite;
 class SuiteUi extends Composite {
        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<>();
@@ -44,30 +48,43 @@ class SuiteUi extends Composite {
                this.setLayout(CmsUiUtils.noSpaceGridLayout());
 
                header = new Composite(this, SWT.NONE);
+               header.setLayout(CmsUiUtils.noSpaceGridLayout());
                CmsUiUtils.style(header, SuiteStyle.header);
                header.setLayoutData(CmsUiUtils.fillWidth());
 
                belowHeader = new Composite(this, SWT.NONE);
                belowHeader.setLayoutData(CmsUiUtils.fillAll());
+
+               footer = new Composite(this, SWT.NONE);
+               footer.setLayout(CmsUiUtils.noSpaceGridLayout());
+               CmsUiUtils.style(footer, SuiteStyle.footer);
+               footer.setLayoutData(CmsUiUtils.fillWidth());
        }
 
        public void refreshBelowHeader(boolean initApp) {
                CmsUiUtils.clear(belowHeader);
                int style = getStyle();
                if (initApp) {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(3));
 
                        if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsUiUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsUiUtils.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(CmsUiUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsUiUtils.fillHeight());
                        }
                        leadPane.setLayoutData(CmsUiUtils.fillHeight());
+                       leadPane.setLayout(CmsUiUtils.noSpaceGridLayout());
                        CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
-                       dynamicArea.setLayoutData(CmsUiUtils.fillAll());
 
+                       dynamicArea.setLayoutData(CmsUiUtils.fillAll());
                        dynamicArea.setLayout(new FormLayout());
 
                } else {
@@ -91,33 +108,42 @@ 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 layerId, Node context) {
+               Composite current = null;
                if (currentLayerId != null) {
-                       Composite current = getCurrentWorkArea();
+                       current = getCurrentWorkArea();
                        if (currentLayerId.equals(layerId))
                                return current;
                }
                if (context == null) {
                        if (!cmsView.isAnonymous())
-                               context = userHome;
+                               context = userDir;
                }
                Composite toShow = getLayer(layerId, context);
-               currentLayerId = layerId;
-               if (!isDisposed())
-                       getDisplay().syncExec(() -> {
-                               if (!toShow.isDisposed())
+               if (toShow != null) {
+                       currentLayerId = layerId;
+                       if (!isDisposed()) {
+//                             getDisplay().syncExec(() -> {
+                               if (!toShow.isDisposed()) {
                                        toShow.moveAbove(null);
-                               else
+                               } 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;
+//                             });
+                       }
+                       return toShow;
+               } else {
+                       return current;
+               }
        }
 
        Composite switchToLayer(SuiteLayer layer, Node context) {
@@ -146,13 +172,14 @@ class SuiteUi extends Composite {
 
        protected Composite initLayer(String id, SuiteLayer layer, Node context) {
                Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
+               CmsUiUtils.style(workArea, SuiteStyle.workArea);
                workArea.setLayoutData(CmsUiUtils.coverAll());
                workAreas.put(id, workArea);
                return workArea;
        }
 
        synchronized void logout() {
-               userHome = null;
+               userDir = null;
                Jcr.logout(sysSession);
                Jcr.logout(homeSession);
                currentLayerId = null;
@@ -167,10 +194,18 @@ class SuiteUi extends Composite {
                return header;
        }
 
+       Composite getFooter() {
+               return footer;
+       }
+
        Composite getLeadPane() {
                return leadPane;
        }
 
+       Composite getSidePane() {
+               return sidePane;
+       }
+
        Composite getBelowHeader() {
                return belowHeader;
        }
@@ -179,18 +214,18 @@ class SuiteUi extends Composite {
 //             return sysSession;
 //     }
 //
-       synchronized 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() {
@@ -212,4 +247,12 @@ class SuiteUi extends Composite {
                return cmsView;
        }
 
+       public Localized getTitle() {
+               return title;
+       }
+
+       public void setTitle(Localized title) {
+               this.title = title;
+       }
+
 }