X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.suite.ui%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fui%2FArgeoSuiteApp.java;h=3f1a8cebbc8bbf4eb1b362e518b58918292854fe;hb=ff73a753e98016467d44c3a0beac79d590874520;hp=fce2deb369fbb752c60017422725ecac42bb9a1a;hpb=6dd21e8d47a1ecc92cf9f958af9ce1a97655fa68;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 fce2deb..3f1a8ce 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,8 +1,13 @@ package org.argeo.suite.ui; +import static org.argeo.cms.ui.CmsView.CMS_VIEW_UID_PROPERTY; + +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.SortedMap; import java.util.TreeMap; import javax.jcr.Node; @@ -11,18 +16,21 @@ 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.eclipse.swt.widgets.Control; -import org.osgi.framework.Constants; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; /** The Argeo Suite App. */ -public class ArgeoSuiteApp extends AbstractCmsApp { +public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler { private final static Log log = LogFactory.getLog(ArgeoSuiteApp.class); public final static String PID_PREFIX = "argeo.suite.ui."; @@ -35,7 +43,12 @@ public class ArgeoSuiteApp extends AbstractCmsApp { private final static String DEFAULT_UI_NAME = "work"; private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default"; - private Map uiProviders = new TreeMap<>(); + private SortedMap uiProviders = Collections.synchronizedSortedMap(new TreeMap<>()); + + // TODO make more optimal or via CmsSession/CmsView + private Map managedUis = new HashMap<>(); + +// private CmsUiProvider headerPart = null; public void init(Map properties) { if (log.isDebugEnabled()) @@ -43,6 +56,9 @@ public class ArgeoSuiteApp extends AbstractCmsApp { } public void destroy(Map properties) { + for (ArgeoSuiteUi ui : managedUis.values()) + if (!ui.isDisposed()) + ui.dispose(); if (log.isDebugEnabled()) log.info("Argeo Suite App stopped"); @@ -58,10 +74,18 @@ public class ArgeoSuiteApp extends AbstractCmsApp { @Override public Composite initUi(Composite parent) { String uiName = parent.getData(UI_NAME_PROPERTY) != null ? parent.getData(UI_NAME_PROPERTY).toString() : null; + CmsView cmsView = CmsView.getCmsView(parent); CmsTheme theme = getTheme(uiName); if (theme != null) CmsTheme.registerCmsTheme(parent.getShell(), theme); ArgeoSuiteUi argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE); + String uid = cmsView.getUid(); + managedUis.put(uid, argeoSuiteUi); + argeoSuiteUi.addDisposeListener((e) -> { + managedUis.remove(uid); + if (log.isDebugEnabled()) + log.debug("Suite UI " + uid + " has been disposed."); + }); refreshUi(argeoSuiteUi, null); return argeoSuiteUi; } @@ -74,18 +98,30 @@ public class ArgeoSuiteApp extends AbstractCmsApp { @Override public void refreshUi(Composite parent, String state) { - Node context = null; - 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 { - refreshPart(findUiProvider(DASHBOARD_PID, context), argeoSuiteUi.getDefaultBody(), context); + try { + Node context = null; + 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); } - refreshPart(findUiProvider(LEAD_PANE_PID, context), argeoSuiteUi.getLeadPane(), context); - refreshPart(findUiProvider(RECENT_ITEMS_PID, context), argeoSuiteUi.getEntryArea(), context); - argeoSuiteUi.layout(true, true); } private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) { @@ -96,8 +132,19 @@ public class ArgeoSuiteApp extends AbstractCmsApp { private CmsUiProvider findUiProvider(String pid, Node context) { if (pid != null) { - if (uiProviders.containsKey(pid)) - return uiProviders.get(pid); + 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 @@ -158,21 +205,47 @@ public class ArgeoSuiteApp extends AbstractCmsApp { * Dependency injection. */ - 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."); + 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); + + } + + @Override + public void handleEvent(Event event) { + if (event.getTopic().equals(SuiteEvent.switchLayer.topic())) { + String layer = get(event, SuiteEvent.LAYER_PARAM); + managedUis.get(get(event, CMS_VIEW_UID_PROPERTY)).switchToLayer(layer); } } - public void removeUiProvider(CmsUiProvider uiProvider, Map properties) { - String servicePid = properties.get(Constants.SERVICE_PID); - uiProviders.remove(servicePid); + private static String get(Event event, String key) { + Object value = event.getProperty(key); + if (value == null) + throw new IllegalArgumentException("Property " + key + " must be set"); + return value.toString(); } + +// public void setHeaderPart(CmsUiProvider headerPart) { +// this.headerPart = headerPart; +// if (log.isDebugEnabled()) +// log.debug("Header set."); +// } + }