Introduce footer.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 14 Feb 2021 08:22:01 +0000 (09:22 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 14 Feb 2021 08:22:01 +0000 (09:22 +0100)
core/org.argeo.suite.ui/OSGI-INF/footer.xml [new file with mode: 0644]
core/org.argeo.suite.ui/OSGI-INF/header.xml
core/org.argeo.suite.ui/bnd.bnd
core/org.argeo.suite.ui/config/footer.properties [new file with mode: 0644]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java [new file with mode: 0644]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java

diff --git a/core/org.argeo.suite.ui/OSGI-INF/footer.xml b/core/org.argeo.suite.ui/OSGI-INF/footer.xml
new file mode 100644 (file)
index 0000000..3499b4f
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Footer">
+   <implementation class="org.argeo.suite.ui.DefaultFooter"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/footer.properties"/>
+</scr:component>
index a8fc66d32edccbf3c6e9b57e1e5471f7d599b219..526d9f9634ed6dd3d5dfbba00ec074fbf52969bd 100644 (file)
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" immediate="false" name="Default Work Header">
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Header">
    <implementation class="org.argeo.suite.ui.DefaultHeader"/>
    <service>
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-      <provide interface="org.osgi.service.cm.ManagedService"/>
    </service>
    <properties entry="config/header.properties"/>
 </scr:component>
index a94d10a990f80830137f16d1b56732b803b8d485..abd4ae23e85a2f74b5236a889f03036c6a7b7393 100644 (file)
@@ -1,6 +1,7 @@
 Service-Component:\
 OSGI-INF/cmsApp.xml,\
 OSGI-INF/header.xml,\
+OSGI-INF/footer.xml,\
 OSGI-INF/leadPane.xml,\
 OSGI-INF/loginScreen.xml,\
 OSGI-INF/recentItems.xml,\
diff --git a/core/org.argeo.suite.ui/config/footer.properties b/core/org.argeo.suite.ui/config/footer.properties
new file mode 100644 (file)
index 0000000..12aca56
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.footer
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java
new file mode 100644 (file)
index 0000000..7821e22
--- /dev/null
@@ -0,0 +1,38 @@
+package org.argeo.suite.ui;
+
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.BundleContext;
+
+/** Footer of a standard Argeo Suite application. */
+public class DefaultFooter implements CmsUiProvider {
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
+               Composite content = new Composite(parent, SWT.NONE);
+               Control contentControl = createContent(content, context);
+
+               // TODO support and guarantee
+
+               return contentControl;
+       }
+
+       protected Control createContent(Composite parent, Node context) throws RepositoryException {
+               return parent;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, String> properties) {
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+}
index 84a5ebd394197d0c51658f3c91bc26fa42740567..91154c3b9f7f09b7ca2ac936c56e28c58ac2cabe 100644 (file)
@@ -1,8 +1,6 @@
 package org.argeo.suite.ui;
 
-import java.util.Dictionary;
 import java.util.Map;
-import java.util.TreeMap;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -13,7 +11,6 @@ import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.util.LangUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -25,14 +22,10 @@ import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedService;
 
-/** HEader of a standard Argeo Suite application. */
-public class DefaultHeader implements CmsUiProvider, ManagedService {
+/** Header of a standard Argeo Suite application. */
+public class DefaultHeader implements CmsUiProvider {
        public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title";
-       private Map<String, String> properties;
-
        private Localized title = null;
 
        @Override
@@ -92,7 +85,6 @@ public class DefaultHeader implements CmsUiProvider, ManagedService {
        }
 
        public void init(BundleContext bundleContext, Map<String, String> properties) {
-               this.properties = new TreeMap<>(properties);
                String titleStr = (String) properties.get(TITLE_PROPERTY);
                if (titleStr != null) {
                        if (titleStr.startsWith("%")) {
@@ -120,12 +112,6 @@ public class DefaultHeader implements CmsUiProvider, ManagedService {
 
        }
 
-       @Override
-       public void updated(Dictionary<String, ?> properties) throws ConfigurationException {
-               if (properties != null)
-                       this.properties.putAll(LangUtils.dictToStringMap(properties));
-       }
-
        public Localized getTitle() {
                return title;
        }
index fcf7e1f7c150de332cf59747cb8c1788bfcddb2b..6082480304ba6b93e7b6f7aa2a21f5ad231d6069 100644 (file)
@@ -60,6 +60,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        private String pidPrefix;
        private String headerPid;
+       private String footerPid;
        private String leadPanePid;
        private String loginScreenPid;
 
@@ -99,6 +100,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                        throw new IllegalArgumentException("PID prefix must be set.");
 
                headerPid = pidPrefix + "header";
+               footerPid = pidPrefix + "footer";
                leadPanePid = pidPrefix + "leadPane";
                loginScreenPid = pidPrefix + "loginScreen";
        }
@@ -151,6 +153,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                        SuiteUi ui = (SuiteUi) parent;
                        CmsView cmsView = CmsView.getCmsView(parent);
                        CmsUiProvider headerUiProvider = findUiProvider(headerPid);
+                       CmsUiProvider footerUiProvider = findUiProvider(footerPid);
                        Localized appTitle = null;
                        if (headerUiProvider instanceof DefaultHeader) {
                                appTitle = ((DefaultHeader) headerUiProvider).getTitle();
@@ -159,9 +162,12 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
                        if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login
                                ui.logout();
-                               refreshPart(headerUiProvider, ui.getHeader(), context);
+                               if (headerUiProvider != null)
+                                       refreshPart(headerUiProvider, ui.getHeader(), context);
                                ui.refreshBelowHeader(false);
                                refreshPart(findUiProvider(loginScreenPid), ui.getBelowHeader(), context);
+                               if (footerUiProvider != null)
+                                       refreshPart(footerUiProvider, ui.getFooter(), context);
                                ui.layout(true, true);
                                setState(ui, LOGIN);
                        } else {
@@ -188,13 +194,16 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                if (context == null)
                                        context = ui.getUserDir();
 
-                               refreshPart(headerUiProvider, ui.getHeader(), context);
+                               if (headerUiProvider != null)
+                                       refreshPart(headerUiProvider, ui.getHeader(), context);
                                ui.refreshBelowHeader(true);
                                for (String key : layersByPid.keySet()) {
                                        SuiteLayer layer = layersByPid.get(key).get();
                                        ui.addLayer(key, layer);
                                }
                                refreshPart(findUiProvider(leadPanePid), ui.getLeadPane(), context);
+                               if (footerUiProvider != null)
+                                       refreshPart(footerUiProvider, ui.getFooter(), context);
                                ui.layout(true, true);
                                setState(parent, state != null ? state : defaultLayerPid);
                        }
@@ -219,13 +228,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        private CmsUiProvider findUiProvider(String pid) {
                if (!uiProvidersByPid.containsKey(pid))
-                       throw new IllegalArgumentException("No UI provider registered as " + pid);
+                       return null;
                return uiProvidersByPid.get(pid).get();
        }
 
        private SuiteLayer findLayer(String pid) {
                if (!layersByPid.containsKey(pid))
-                       throw new IllegalArgumentException("No UI provider registered as " + pid);
+                       return null;
                return layersByPid.get(pid).get();
        }
 
index 5183fa464a1dd6d4a62daccb741fdc2e7878f2f1..0156801c32d555656fde0b5e954e77d665805745 100644 (file)
@@ -4,15 +4,17 @@ import org.argeo.cms.ui.util.CmsStyle;
 
 /** Styles used by Argeo Suite work UI. */
 public enum SuiteStyle implements CmsStyle {
-       // Header
+       // header
        header, headerTitle, headerMenu, headerMenuItem,
-       // Recent items
+       // footer
+       footer,
+       // recent items
        recentItems,
-       // Lead pane
+       // lead pane
        leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
-       // Group composite
+       // group composite
        titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
-       // Forms elements
+       // forms elements
        simpleLabel, simpleText, simpleInput,
        // table
        titleCell,
@@ -20,7 +22,7 @@ public enum SuiteStyle implements CmsStyle {
        workArea,
        // tabbed area
        mainTabBody, mainTabSelected, mainTab,
-       // Buttons
+       // buttons
        inlineButton;
 
        @Override
index 3c4474ff66edc12e0e3beee9f33323c7ed024f3c..52a2fd6c0f2894adca62bf7e6042a24c1b80933b 100644 (file)
@@ -26,6 +26,7 @@ class SuiteUi extends Composite {
 
        private Localized title;
        private Composite header;
+       private Composite footer;
        private Composite belowHeader;
        private Composite leadPane;
        private Composite dynamicArea;
@@ -52,6 +53,11 @@ class SuiteUi extends Composite {
 
                belowHeader = new Composite(this, SWT.NONE);
                belowHeader.setLayoutData(CmsUiUtils.fillAll());
+
+               footer = new Composite(this, SWT.NONE);
+               footer.setLayout(CmsUiUtils.noSpaceGridLayout());
+               CmsUiUtils.style(header, SuiteStyle.header);
+               footer.setLayoutData(CmsUiUtils.fillWidth());
        }
 
        public void refreshBelowHeader(boolean initApp) {
@@ -181,6 +187,10 @@ class SuiteUi extends Composite {
                return header;
        }
 
+       Composite getFooter() {
+               return footer;
+       }
+
        Composite getLeadPane() {
                return leadPane;
        }