package org.argeo.suite.ui; import java.util.HashMap; import java.util.Map; import javax.jcr.Node; 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.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 { private static final long serialVersionUID = 6207018859086689108L; private Composite header; private Composite belowHeader; private Composite leadPane; private Composite dynamicArea; private Session sysSession; private Session homeSession; private Node userHome; private Map layers = new HashMap<>(); private Map workAreas = new HashMap<>(); private String currentLayerId = null; private CmsView cmsView; public SuiteUi(Composite parent, int style) { super(parent, style); cmsView = CmsView.getCmsView(parent); this.setLayout(CmsUiUtils.noSpaceGridLayout()); header = new Composite(this, SWT.NONE); CmsUiUtils.style(header, SuiteStyle.header); header.setLayoutData(CmsUiUtils.fillWidth()); belowHeader = new Composite(this, SWT.NONE); belowHeader.setLayoutData(CmsUiUtils.fillAll()); } public void refreshBelowHeader(boolean initApp) { CmsUiUtils.clear(belowHeader); int style = getStyle(); if (initApp) { belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2)); if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc. 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); } leadPane.setLayoutData(CmsUiUtils.fillHeight()); CmsUiUtils.style(leadPane, SuiteStyle.leadPane); dynamicArea.setLayoutData(CmsUiUtils.fillAll()); dynamicArea.setLayout(new FormLayout()); } else { belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout()); } } /* * LAYERS */ Composite getCurrentWorkArea() { if (currentLayerId == null) throw new IllegalStateException("No current layer"); return workAreas.get(currentLayerId); } String getCurrentLayerId() { return currentLayerId; } private Composite getLayer(String id, Node context) { if (!layers.containsKey(id)) throw new IllegalArgumentException("No layer " + id + " is available."); if (!workAreas.containsKey(id)) initLayer(id, layers.get(id), context); return workAreas.get(id); } Composite switchToLayer(String layer, Node context) { if (currentLayerId != null) { Composite current = getCurrentWorkArea(); if (currentLayerId.equals(layer)) return current; } if (context == null) { if (!cmsView.isAnonymous()) context = userHome; } Composite toShow = getLayer(layer, context); if (!isDisposed()) getDisplay().syncExec(() -> { toShow.moveAbove(null); dynamicArea.layout(true, true); }); currentLayerId = layer; return toShow; } void addLayer(String id, SuiteLayer layer) { layers.put(id, layer); } void removeLayer(String id) { layers.remove(id); if (workAreas.containsKey(id)) { Composite workArea = workAreas.remove(id); if (!workArea.isDisposed()) workArea.dispose(); } } protected Composite initLayer(String id, SuiteLayer layer, Node context) { Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context)); workArea.setLayoutData(CmsUiUtils.coverAll()); workAreas.put(id, workArea); return workArea; } /* * GETTERS / SETTERS */ Composite getHeader() { return header; } Composite getLeadPane() { return leadPane; } Composite getBelowHeader() { return belowHeader; } // Session getSysSession() { // return sysSession; // } // void initSessions(Repository repository) throws RepositoryException { this.sysSession = repository.login(); this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE); userHome = NodeUtils.getUserHome(homeSession); addDisposeListener((e) -> { Jcr.logout(sysSession); Jcr.logout(homeSession); }); } Node getUserHome() { return userHome; } 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; } }