X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=org.argeo.suite.ui%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fui%2FArgeoSuiteApp.java;h=db71387dda9d51b8619fe807db9832764196195d;hp=fce2deb369fbb752c60017422725ecac42bb9a1a;hb=643015b2ea9a066531250059a31b23358a38aa72;hpb=6dd21e8d47a1ecc92cf9f958af9ce1a97655fa68 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..db71387 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; @@ -15,14 +20,22 @@ 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.cms.ui.util.CmsEvent; +import org.argeo.cms.ui.util.CmsUiUtils; +import org.argeo.entity.EntityNames; +import org.argeo.entity.EntityTypes; +import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrUtils; +import org.argeo.suite.RankingKey; 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."; @@ -32,10 +45,15 @@ public class ArgeoSuiteApp extends AbstractCmsApp { 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_UI_NAME = "app"; 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 +61,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 +79,20 @@ 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); + if (cmsView == null) + throw new IllegalStateException("No CMS view is registered."); 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,33 +105,82 @@ 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 ui = (ArgeoSuiteUi) parent; + refreshPart(findUiProvider(HEADER_PID, context), ui.getHeader(), context); + CmsView cmsView = CmsView.getCmsView(parent); + if (cmsView.isAnonymous()) { + ui.refreshBelowHeader(false); + refreshPart(findUiProvider(LOGIN_SCREEN_PID, context), ui.getBelowHeader(), context); + } else { + try { + if (ui.getSession() == null) + ui.setSession(getRepository().login()); + context = ui.getSession().getRootNode(); + + } catch (RepositoryException e) { + e.printStackTrace(); + } + ui.refreshBelowHeader(true); + + ui.addLayer(ArgeoSuiteUi.DASHBOARD_LAYER); + ui.addLayer("documents"); + ui.addLayer("locations"); + ui.addLayer("people"); + ui.switchToLayer(ArgeoSuiteUi.DASHBOARD_LAYER); + + refreshPart(findUiProvider(DASHBOARD_PID, context), ui.getTabbedArea().getCurrent(), context); + refreshPart(findUiProvider(LEAD_PANE_PID, context), ui.getLeadPane(), context); + refreshPart(findUiProvider(RECENT_ITEMS_PID, context), ui.getEntryArea(), context); + } + ui.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) { - for (Control child : part.getChildren()) - child.dispose(); + CmsUiUtils.clear(part); uiProvider.createUiPart(part, context); } private CmsUiProvider findUiProvider(String pid, Node context) { + CmsUiProvider found = null; if (pid != null) { - if (uiProviders.containsKey(pid)) - return uiProviders.get(pid); + SortedMap subMap = uiProviders.subMap(RankingKey.minPid(pid), + RankingKey.maxPid(pid)); + providers: for (RankingKey key : subMap.keySet()) { + if (key.getPid() == null || !key.getPid().equals(pid)) + break providers; + found = subMap.get(key); + } + if (found != null) + return found; + } + + if (found == null && context != null) { + SortedMap subMap = null; + String dataType = null; + if (Jcr.isNodeType(context, EntityTypes.ENTITY_ENTITY)) { + dataType = Jcr.get(context, EntityNames.ENTITY_TYPE); + subMap = uiProviders.subMap(RankingKey.minDataType(dataType), RankingKey.maxDataType(dataType)); + } + providers: for (RankingKey key : subMap.keySet()) { + if (key.getDataType() == null || !key.getDataType().equals(dataType)) + break providers; + found = subMap.get(key); + } + if (found == null) + found = uiProviders.get(new RankingKey(null, null, null, dataType, null)); + if (found != null) + return found; } // nothing + if (log.isWarnEnabled()) + log.warn("No UI provider found for" + (pid != null ? " pid " + pid : "") + + (context != null ? " " + context : "")); return new CmsUiProvider() { @Override @@ -140,7 +220,8 @@ public class ArgeoSuiteApp extends AbstractCmsApp { session = getRepository().login(workspace); Node node = session.getNode(path); - refreshEntityUi(node); + + refreshEntityUi(null, node); } } catch (RepositoryException e) { log.error("Cannot load state " + state, e); @@ -150,29 +231,68 @@ public class ArgeoSuiteApp extends AbstractCmsApp { } } - private void refreshEntityUi(Node node) { - + private void refreshEntityUi(Composite parent, Node context) { } /* * 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); + 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 { + if (partKey.getPid() != null || partKey.getDataType() != null) { + uiProviders.put(partKey, uiProvider); if (log.isDebugEnabled()) - log.debug("Added UI provider " + servicePid + " to CMS app."); + log.debug("Added UI provider " + partKey + " (" + uiProvider.getClass().getName() + ") 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) { + + // Specific UI related events + ArgeoSuiteUi ui = getRelatedUi(event); + if (isTopic(event, SuiteEvent.refreshPart)) { + Node node = Jcr.getNodeById(ui.getSession(), get(event, SuiteEvent.NODE_ID)); + ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID, node), node); +// ui.layout(true, true); + } else if (isTopic(event, SuiteEvent.openNewPart)) { + Node node = Jcr.getNodeById(ui.getSession(), get(event, SuiteEvent.NODE_ID)); + ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID, node), node); +// ui.layout(true, true); + } else if (isTopic(event, SuiteEvent.switchLayer)) { + String layer = get(event, SuiteEvent.LAYER); + ui.switchToLayer(layer); } } - public void removeUiProvider(CmsUiProvider uiProvider, Map properties) { - String servicePid = properties.get(Constants.SERVICE_PID); - uiProviders.remove(servicePid); + private ArgeoSuiteUi getRelatedUi(Event event) { + return managedUis.get(get(event, CMS_VIEW_UID_PROPERTY)); + } + + private static boolean isTopic(Event event, CmsEvent cmsEvent) { + return event.getTopic().equals(cmsEvent.topic()); + } + + 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(); } }