X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.suite.ui%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fui%2FArgeoSuiteApp.java;h=da86e5b6c336bd13bb3a2693ff8e976407634d87;hb=29abcc0fa99e1c3fdee5beb9fff62b70b9dff519;hp=b669d45aa7078563f56065741428f986466381b4;hpb=a5ba54441da727f3965105a71b3a114b31dd34de;p=gpl%2Fargeo-suite.git diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java index b669d45..da86e5b 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java @@ -1,35 +1,51 @@ package org.argeo.suite.ui; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.SortedMap; import java.util.TreeMap; import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.api.RankingKey; import org.argeo.cms.ui.AbstractCmsApp; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; +import org.argeo.cms.ui.CmsView; +import org.argeo.cms.ui.dialogs.CmsFeedback; +import org.argeo.jcr.JcrUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import org.osgi.framework.Constants; +import org.eclipse.swt.widgets.Control; /** The Argeo Suite App. */ public class ArgeoSuiteApp extends AbstractCmsApp { private final static Log log = LogFactory.getLog(ArgeoSuiteApp.class); - public final static String PID_PREFIX = "argeo.work."; + public final static String PID_PREFIX = "argeo.suite.ui."; public final static String HEADER_PID = PID_PREFIX + "header"; public final static String LEAD_PANE_PID = PID_PREFIX + "leadPane"; + public final static String LOGIN_SCREEN_PID = PID_PREFIX + "loginScreen"; + public final static String DASHBOARD_PID = PID_PREFIX + "dashboard"; + public final static String RECENT_ITEMS_PID = PID_PREFIX + "recentItems"; private final static String DEFAULT_UI_NAME = "work"; private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default"; - private ArgeoSuiteUi argeoSuiteUi; + private SortedMap uiProviders = Collections.synchronizedSortedMap(new TreeMap<>()); - private Map uiProviders = new TreeMap<>(); + // TODO make more optimal or via CmsSession/CmsView + private List knownUis = new ArrayList<>(); + +// private CmsUiProvider headerPart = null; public void init(Map properties) { if (log.isDebugEnabled()) @@ -37,6 +53,9 @@ public class ArgeoSuiteApp extends AbstractCmsApp { } public void destroy(Map properties) { + for (ArgeoSuiteUi ui : knownUis) + if (!ui.isDisposed()) + ui.dispose(); if (log.isDebugEnabled()) log.info("Argeo Suite App stopped"); @@ -50,15 +69,15 @@ public class ArgeoSuiteApp extends AbstractCmsApp { } @Override - public void initUi(String uiName, Composite parent) { - if (DEFAULT_UI_NAME.equals(uiName)) { - CmsTheme theme = getTheme(uiName); - if (theme != null) - CmsTheme.registerCmsTheme(parent.getShell(), theme); - argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE); - refresh(uiName); - } - + public Composite initUi(Composite parent) { + String uiName = parent.getData(UI_NAME_PROPERTY) != null ? parent.getData(UI_NAME_PROPERTY).toString() : null; + CmsTheme theme = getTheme(uiName); + if (theme != null) + CmsTheme.registerCmsTheme(parent.getShell(), theme); + ArgeoSuiteUi argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE); + knownUis.add(argeoSuiteUi); + refreshUi(argeoSuiteUi, null); + return argeoSuiteUi; } @Override @@ -67,39 +86,139 @@ public class ArgeoSuiteApp extends AbstractCmsApp { return DEFAULT_THEME_ID; } - public void refresh(String uiName) { - if (DEFAULT_UI_NAME.equals(uiName)) { + @Override + public void refreshUi(Composite parent, String state) { + try { Node context = null; - uiProviders.get(HEADER_PID).createUiPart(argeoSuiteUi.getHeader(), context); - uiProviders.get(LEAD_PANE_PID).createUiPart(argeoSuiteUi.getLeadPane(), context); + ArgeoSuiteUi argeoSuiteUi = (ArgeoSuiteUi) parent; + refreshPart(findUiProvider(HEADER_PID, context), argeoSuiteUi.getHeader(), context); + CmsView cmsView = CmsView.getCmsView(parent); + if (cmsView.isAnonymous()) { + refreshPart(findUiProvider(LOGIN_SCREEN_PID, context), argeoSuiteUi.getDefaultBody(), context); + } else { + try { + if (argeoSuiteUi.getSession() == null) + argeoSuiteUi.setSession(getRepository().login()); + context = argeoSuiteUi.getSession().getRootNode(); + + } catch (RepositoryException e) { + e.printStackTrace(); + } + refreshPart(findUiProvider(DASHBOARD_PID, context), argeoSuiteUi.getDefaultBody(), context); + } + refreshPart(findUiProvider(LEAD_PANE_PID, context), argeoSuiteUi.getLeadPane(), context); + refreshPart(findUiProvider(RECENT_ITEMS_PID, context), argeoSuiteUi.getEntryArea(), context); + argeoSuiteUi.layout(true, true); + } catch (Exception e) { + CmsFeedback.show("Unexpected exception", e); } } - public void addUiProvider(CmsUiProvider uiProvider, Map properties) { - String servicePid = properties.get(Constants.SERVICE_PID); - if (servicePid == null) { - log.error("No service pid found for " + uiProvider.getClass() + ", " + properties); - } else { - uiProviders.put(servicePid, uiProvider); - if (log.isDebugEnabled()) - log.debug("Added UI provider " + servicePid + " to CMS app."); + private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) { + for (Control child : part.getChildren()) + child.dispose(); + uiProvider.createUiPart(part, context); + } + + private CmsUiProvider findUiProvider(String pid, Node context) { + if (pid != null) { + SortedMap subMap = uiProviders.subMap(RankingKey.minPid(pid), + RankingKey.maxPid(pid)); + CmsUiProvider found = null; + providers: for (RankingKey key : subMap.keySet()) { + if (key.getPid() == null || !key.getPid().equals(pid)) + break providers; + found = subMap.get(key); + log.debug(key); + } +// if (uiProviders.containsKey(pid)) +// return uiProviders.get(pid); + if (found != null) + return found; } + // nothing + return new CmsUiProvider() { + + @Override + public Control createUi(Composite parent, Node context) throws RepositoryException { + return parent; + } + }; } - public void removeUiProvider(CmsUiProvider uiProvider, Map properties) { - String servicePid = properties.get(Constants.SERVICE_PID); - uiProviders.remove(servicePid); + @Override + public void setState(Composite parent, String state) { + CmsView cmsView = CmsView.getCmsView(parent); + // for the time being we systematically open a session, in order to make sure + // that home is initialised + Session session = null; + try { + if (state != null && state.startsWith("/")) { + String path = state.substring(1); + String workspace; + if (path.equals("")) { + workspace = null; + path = "/"; + } else { + int index = path.indexOf('/'); + if (index == 0) { + log.error("Cannot interpret // " + state); + cmsView.navigateTo("~"); + return; + } else if (index > 0) { + workspace = path.substring(0, index); + path = path.substring(index); + } else {// index<0, assuming root node + workspace = path; + path = "/"; + } + } + session = getRepository().login(workspace); + + Node node = session.getNode(path); + refreshEntityUi(node); + } + } catch (RepositoryException e) { + log.error("Cannot load state " + state, e); + cmsView.navigateTo("~"); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + private void refreshEntityUi(Node node) { } -// static class UiProviderKey { -// private Map properties; -// -// public UiProviderKey(Map properties) { -// super(); -// this.properties = properties; + /* + * Dependency injection. + */ + + public void addUiProvider(CmsUiProvider uiProvider, Map properties) { + RankingKey partKey = new RankingKey(properties); +// String servicePid = properties.get(Constants.SERVICE_PID); +// if (servicePid == null) { +// log.error("No service pid found for " + uiProvider.getClass() + ", " + properties); +// } else { + uiProviders.put(partKey, uiProvider); + if (log.isDebugEnabled()) + log.debug("Added UI provider " + partKey + " to CMS app."); // } -// + + } + + public void removeUiProvider(CmsUiProvider uiProvider, Map properties) { + RankingKey partKey = new RankingKey(properties); +// String servicePid = properties.get(Constants.SERVICE_PID); + uiProviders.remove(partKey); + + } + +// public void setHeaderPart(CmsUiProvider headerPart) { +// this.headerPart = headerPart; +// if (log.isDebugEnabled()) +// log.debug("Header set."); // } + }