From 3afd052c9c380355ebfce9455e8fa3993f168fe0 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 7 Feb 2021 12:31:08 +0100 Subject: [PATCH] Improve layers UI. --- .../argeo/suite/ui/DefaultEditionLayer.java | 37 ++++++++++++++++++- .../src/org/argeo/suite/ui/DefaultHeader.java | 34 ++++++++++++++--- .../org/argeo/suite/ui/DefaultLeadPane.java | 19 +++++----- .../src/org/argeo/suite/ui/SuiteApp.java | 30 ++++++++++++--- .../src/org/argeo/suite/ui/SuiteLayer.java | 5 +++ 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java index 0ab5ab4..9c2ad47 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java @@ -7,6 +7,7 @@ import java.util.Map; import javax.jcr.Node; import javax.jcr.RepositoryException; +import org.argeo.cms.Localized; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; import org.argeo.cms.ui.util.CmsUiUtils; @@ -17,6 +18,8 @@ import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.osgi.framework.BundleContext; +import org.osgi.framework.wiring.BundleWiring; /** An app layer based on an entry area and an editor area. */ public class DefaultEditionLayer implements SuiteLayer { @@ -24,6 +27,7 @@ public class DefaultEditionLayer implements SuiteLayer { private CmsUiProvider workArea; private List weights = new ArrayList<>(); private boolean startMaximized = false; + private Localized title = null; @Override public Control createUi(Composite parent, Node context) throws RepositoryException { @@ -64,12 +68,43 @@ public class DefaultEditionLayer implements SuiteLayer { tabbedArea.open(uiProvider, context); } - public void init(Map properties) { + @Override + public Localized getTitle() { + return title; + } + + public void init(BundleContext bundleContext, Map properties) { weights = LangUtils.toStringList(properties.get(Property.weights.name())); startMaximized = properties.containsKey(Property.startMaximized.name()) && "true".equals(properties.get(Property.startMaximized.name())); + + String titleStr = (String) properties.get(SuiteLayer.Property.title.name()); + if (titleStr != null) { + if (titleStr.startsWith("%")) { + title = new Localized() { + + @Override + public String name() { + return titleStr; + } + + @Override + public ClassLoader getL10nClassLoader() { + return bundleContext != null + ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader() + : getClass().getClassLoader(); + } + }; + } else { + title = new Localized.Untranslated(titleStr); + } + } } + public void destroy() { + + } + public void setEntryArea(CmsUiProvider entryArea) { this.entryArea = entryArea; } diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java index 692a23b..d3b4740 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java @@ -7,7 +7,7 @@ import java.util.TreeMap; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.cms.LocaleUtils; +import org.argeo.cms.Localized; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.ui.CmsTheme; import org.argeo.cms.ui.CmsUiProvider; @@ -26,16 +26,38 @@ import org.eclipse.swt.widgets.Label; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedService; -/** HEader of a standard Argeo Suite applicaiton. */ +/** HEader of a standard Argeo Suite application. */ public class DefaultHeader implements CmsUiProvider, ManagedService { public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title"; private Map properties; + private Localized title = null; + @Override public Control createUi(Composite parent, Node context) throws RepositoryException { CmsView cmsView = CmsView.getCmsView(parent); CmsTheme theme = CmsTheme.getCmsTheme(parent); + String titleStr = (String) properties.get(TITLE_PROPERTY); + if (titleStr != null) { + if (titleStr.startsWith("%")) { + title = new Localized() { + + @Override + public String name() { + return titleStr; + } + + @Override + public ClassLoader getL10nClassLoader() { + return getClass().getClassLoader(); + } + }; + } else { + title = new Localized.Untranslated(titleStr); + } + } + parent.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(3, true))); // TODO right to left @@ -44,9 +66,11 @@ public class DefaultHeader implements CmsUiProvider, ManagedService { lead.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, false)); lead.setLayout(new GridLayout()); Label lbl = new Label(lead, SWT.NONE); - String title = properties.get(TITLE_PROPERTY); - lbl.setText(LocaleUtils.isLocaleKey(title) ? LocaleUtils.local(title, getClass().getClassLoader()).toString() - : title); +// String title = properties.get(TITLE_PROPERTY); +// // TODO expose the localized +// lbl.setText(LocaleUtils.isLocaleKey(title) ? LocaleUtils.local(title, getClass().getClassLoader()).toString() +// : title); + lbl.setText(title.lead()); CmsUiUtils.style(lbl, SuiteStyle.headerTitle); lbl.setLayoutData(CmsUiUtils.fillWidth()); diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java index 9a5248e..e56a676 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java @@ -87,15 +87,16 @@ public class DefaultLeadPane implements CmsUiProvider { } RankedObject layerObj = layers.get(layerId); - // TODO deal with i10n - String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name()); Localized title = null; - if (titleStr != null) { - if (titleStr.startsWith("%")) { - // LocaleUtils.local(titleStr, getClass().getClassLoader()); - title = () -> titleStr; - } else { - title = new Localized.Untranslated(titleStr); + if (!adminLayers.contains(layerId)) { + String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name()); + if (titleStr != null) { + if (titleStr.startsWith("%")) { + // LocaleUtils.local(titleStr, getClass().getClassLoader()); + title = () -> titleStr; + } else { + title = new Localized.Untranslated(titleStr); + } } } @@ -193,7 +194,7 @@ public class DefaultLeadPane implements CmsUiProvider { if (msg != null) { Label lbl = new Label(parent, SWT.CENTER); CmsUiUtils.style(lbl, SuiteStyle.leadPane); - //CmsUiUtils.markup(lbl); + // CmsUiUtils.markup(lbl); ClassLoader l10nClassLoader = getClass().getClassLoader(); String txt = LocaleUtils.lead(msg, l10nClassLoader); // String txt = msg.lead(); diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java index c941a15..7087783 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeUtils; import org.argeo.cms.CmsUserManager; import org.argeo.cms.LocaleUtils; +import org.argeo.cms.Localized; import org.argeo.cms.auth.CmsSession; import org.argeo.cms.ui.AbstractCmsApp; import org.argeo.cms.ui.CmsTheme; @@ -60,7 +61,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { private String headerPid; private String leadPanePid; private String loginScreenPid; -// private String DASHBOARD_PID = pidPrefix + "dashboard"; + + private String defaultLayerPid = "argeo.suite.ui.dashboardLayer"; // private String RECENT_ITEMS_PID = pidPrefix + "recentItems"; private String defaultUiName = "app"; @@ -76,7 +78,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { // TODO make more optimal or via CmsSession/CmsView private Map managedUis = new HashMap<>(); -// private CmsUiProvider headerPart = null; +// private Localized defaultTitle; +//// private CmsUiProvider headerPart = null; public void init(Map properties) { if (log.isDebugEnabled()) @@ -150,9 +153,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { Node context = null; SuiteUi ui = (SuiteUi) parent; CmsView cmsView = CmsView.getCmsView(parent); + CmsUiProvider headerUiProvider = findUiProvider(headerPid); +// if (headerUiProvider instanceof Localized) { +// defaultTitle = (Localized) headerUiProvider; +// } if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login ui.logout(); - refreshPart(findUiProvider(headerPid), ui.getHeader(), context); + refreshPart(headerUiProvider, ui.getHeader(), context); ui.refreshBelowHeader(false); refreshPart(findUiProvider(loginScreenPid), ui.getBelowHeader(), context); ui.layout(true, true); @@ -178,7 +185,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { if (context == null) context = ui.getUserDir(); - refreshPart(findUiProvider(headerPid), ui.getHeader(), context); + refreshPart(headerUiProvider, ui.getHeader(), context); ui.refreshBelowHeader(true); for (String key : layersByPid.keySet()) { SuiteLayer layer = layersByPid.get(key).get(); @@ -186,7 +193,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } refreshPart(findUiProvider(leadPanePid), ui.getLeadPane(), context); ui.layout(true, true); - setState(parent, state); + setState(parent, state != null ? state : defaultLayerPid); } } catch (Exception e) { CmsFeedback.show("Unexpected exception", e); @@ -213,6 +220,12 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { return uiProvidersByPid.get(pid).get(); } + private SuiteLayer findLayer(String pid) { + if (!layersByPid.containsKey(pid)) + throw new IllegalArgumentException("No UI provider registered as " + pid); + return layersByPid.get(pid).get(); + } + private T findByType(Map> byType, Node context) { if (context == null) throw new IllegalArgumentException("A node should be provided"); @@ -366,8 +379,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { String layerId = get(event, SuiteEvent.LAYER); if (layerId != null) { // ui.switchToLayer(layerId, ui.getUserDir()); + SuiteLayer suiteLayer = findLayer(layerId); + Localized layerTitle = suiteLayer.getTitle(); ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir())); - ui.getCmsView().navigateTo(layerId); + String title = null; + if (layerTitle != null) + title = layerTitle.lead(); + ui.getCmsView().stateChanged(layerId, title); } else { Node node = getNode(ui, event); if (node != null) { diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java index 8af7611..994ea84 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java @@ -2,6 +2,7 @@ package org.argeo.suite.ui; import javax.jcr.Node; +import org.argeo.cms.Localized; import org.argeo.cms.ui.CmsUiProvider; import org.eclipse.swt.widgets.Composite; @@ -16,4 +17,8 @@ public interface SuiteLayer extends CmsUiProvider { default void open(CmsUiProvider uiProvider, Composite workArea, Node context) { view(uiProvider, workArea, context); } + + default Localized getTitle() { + return null; + } } -- 2.30.2