Improve layers UI.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 7 Feb 2021 11:31:08 +0000 (12:31 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 7 Feb 2021 11:31:08 +0000 (12:31 +0100)
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java

index 0ab5ab43c1b47c0db39e2ea9a69f5d4bab419077..9c2ad475e6e5c219622c1cd38f73609f48ccf7da 100644 (file)
@@ -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<String> 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<String, Object> properties) {
+       @Override
+       public Localized getTitle() {
+               return title;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, Object> 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;
        }
index 692a23badf2c4c1f3c5d2446420a5404ddb676d5..d3b474000e1ed57b13b65940b867163e5b597817 100644 (file)
@@ -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<String, String> 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());
 
index 9a5248e7db8d85d2cc1f2fd1dd22806ea633f846..e56a676c4259915c4dc25fc3a143d91fc73a1341 100644 (file)
@@ -87,15 +87,16 @@ public class DefaultLeadPane implements CmsUiProvider {
                                }
                                RankedObject<SuiteLayer> 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();
index c941a154d351810d5c5990b31e83ab742ced3927..7087783ff55cc258ce5ae9ec3c88ffe15138b0b6 100644 (file)
@@ -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<String, SuiteUi> managedUis = new HashMap<>();
 
-//     private CmsUiProvider headerPart = null;
+//     private Localized defaultTitle;
+////   private CmsUiProvider headerPart = null;
 
        public void init(Map<String, Object> 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> T findByType(Map<String, RankedObject<T>> 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) {
index 8af761171fb7a540957719123ddfc4f13b13ef5f..994ea8459c06e313f04dcef783c815b85d05feed 100644 (file)
@@ -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;
+       }
 }