X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.suite.ui%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fui%2FSuiteUi.java;h=dc2ef509b1161d00e203d75a5ca5871df7a31376;hb=41e9998f7f1c87c747c57f60c6bec65fa20757a6;hp=8c8780fc1621071c4255770c2c880fa8fe434c85;hpb=daef461662700ec2df8a72f895623c889f9da946;p=gpl%2Fargeo-suite.git 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 8c8780f..dc2ef50 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 @@ -8,27 +8,33 @@ import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; -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.api.cms.CmsLog; +import org.argeo.api.cms.CmsConstants; +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 view for the default ergonomics of Argeo Suite. */ -class SuiteUi extends Composite { +class SuiteUi extends Composite implements CmsUi { private static final long serialVersionUID = 6207018859086689108L; + private final static CmsLog log = CmsLog.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 layers = new HashMap<>(); private Map workAreas = new HashMap<>(); @@ -38,38 +44,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,30 +108,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); - if (!isDisposed()) - getDisplay().syncExec(() -> { - toShow.moveAbove(null); + 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); - }); - currentLayerId = layer; - return toShow; +// }); + } + 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) { @@ -130,11 +172,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 */ @@ -143,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; } @@ -155,18 +214,18 @@ 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); + this.homeSession = repository.login(CmsConstants.HOME_WORKSPACE); + userDir = sysSession.getNode(userDirPath); addDisposeListener((e) -> { Jcr.logout(sysSession); Jcr.logout(homeSession); }); } - Node getUserHome() { - return userHome; + Node getUserDir() { + return userDir; } Session getSysSession() { @@ -176,9 +235,9 @@ class SuiteUi extends Composite { Session getSession(String workspaceName) { if (workspaceName == null) return sysSession; - if (NodeConstants.SYS_WORKSPACE.equals(workspaceName)) + if (CmsConstants.SYS_WORKSPACE.equals(workspaceName)) return sysSession; - else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName)) + else if (CmsConstants.HOME_WORKSPACE.equals(workspaceName)) return homeSession; else throw new IllegalArgumentException("Unknown workspace " + workspaceName); @@ -188,6 +247,12 @@ class SuiteUi extends Composite { return cmsView; } - - + public Localized getTitle() { + return title; + } + + public void setTitle(Localized title) { + this.title = title; + } + }