Introduce Admin UI and event recorder.
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 14 Oct 2021 09:11:15 +0000 (11:11 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 14 Oct 2021 09:11:15 +0000 (11:11 +0200)
13 files changed:
core/org.argeo.suite.ui/OSGI-INF/adminLeadPane.xml [new file with mode: 0644]
core/org.argeo.suite.ui/OSGI-INF/eventRecorder.xml [new file with mode: 0644]
core/org.argeo.suite.ui/OSGI-INF/termsEntryArea.xml [new file with mode: 0644]
core/org.argeo.suite.ui/OSGI-INF/termsLayer.xml [new file with mode: 0644]
core/org.argeo.suite.ui/bnd.bnd
core/org.argeo.suite.ui/config/adminLeadPane.properties [new file with mode: 0644]
core/org.argeo.suite.ui/config/eventRecorder.properties [new file with mode: 0644]
core/org.argeo.suite.ui/config/termsEntryArea.properties [new file with mode: 0644]
core/org.argeo.suite.ui/config/termsLayer.properties [new file with mode: 0644]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/EventRecorder.java [new file with mode: 0644]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java
core/org.argeo.suite.ui/src/org/argeo/suite/ui/TermsEntryArea.java [new file with mode: 0644]

diff --git a/core/org.argeo.suite.ui/OSGI-INF/adminLeadPane.xml b/core/org.argeo.suite.ui/OSGI-INF/adminLeadPane.xml
new file mode 100644 (file)
index 0000000..0d060fb
--- /dev/null
@@ -0,0 +1,11 @@
+<?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="Admin Lead Pane">
+   <implementation class="org.argeo.suite.ui.DefaultLeadPane"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/adminLeadPane.properties"/>
+   <property name="defaultLayers" type="String">argeo.suite.ui.termsLayer
+   </property>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/eventRecorder.xml b/core/org.argeo.suite.ui/OSGI-INF/eventRecorder.xml
new file mode 100644 (file)
index 0000000..49badfd
--- /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" name="Event Recorder">
+   <implementation class="org.argeo.suite.ui.EventRecorder"/>
+   <service>
+      <provide interface="org.osgi.service.event.EventHandler"/>
+   </service>
+   <properties entry="config/eventRecorder.properties"/>
+</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/termsEntryArea.xml b/core/org.argeo.suite.ui/OSGI-INF/termsEntryArea.xml
new file mode 100644 (file)
index 0000000..cfcae11
--- /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" name="Terms Entry Area">
+   <implementation class="org.argeo.suite.ui.TermsEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/termsEntryArea.properties"/>
+</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/termsLayer.xml b/core/org.argeo.suite.ui/OSGI-INF/termsLayer.xml
new file mode 100644 (file)
index 0000000..f320dd9
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Terms Layer">
+   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
+   <service>
+      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
+   </service>
+   <properties entry="config/termsLayer.properties"/>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.suite.ui.termsEntryArea)"/>
+</scr:component>
index abd4ae23e85a2f74b5236a889f03036c6a7b7393..7785626947e966f37fdb8a1faaea3a38a856d91e 100644 (file)
@@ -1,10 +1,14 @@
 Service-Component:\
 OSGI-INF/cmsApp.xml,\
+OSGI-INF/eventRecorder.xml,\
 OSGI-INF/header.xml,\
 OSGI-INF/footer.xml,\
 OSGI-INF/leadPane.xml,\
 OSGI-INF/loginScreen.xml,\
 OSGI-INF/recentItems.xml,\
+OSGI-INF/adminLeadPane.xml,\
+OSGI-INF/termsEntryArea.xml,\
+OSGI-INF/termsLayer.xml,\
 OSGI-INF/dashboard.xml,\
 OSGI-INF/dashboardLayer.xml
 
diff --git a/core/org.argeo.suite.ui/config/adminLeadPane.properties b/core/org.argeo.suite.ui/config/adminLeadPane.properties
new file mode 100644 (file)
index 0000000..90b9b04
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.adminLeadPane
diff --git a/core/org.argeo.suite.ui/config/eventRecorder.properties b/core/org.argeo.suite.ui/config/eventRecorder.properties
new file mode 100644 (file)
index 0000000..6503863
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.suite.ui.eventRecorder
+
+event.topics=argeo/suite/*
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/config/termsEntryArea.properties b/core/org.argeo.suite.ui/config/termsEntryArea.properties
new file mode 100644 (file)
index 0000000..cd31517
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.termsEntryArea
diff --git a/core/org.argeo.suite.ui/config/termsLayer.properties b/core/org.argeo.suite.ui/config/termsLayer.properties
new file mode 100644 (file)
index 0000000..2c0532e
--- /dev/null
@@ -0,0 +1,5 @@
+service.pid=argeo.suite.ui.termsLayer
+title=Terms
+icon=dashboard
+
+entity.type=entity:terms,entity:term
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/EventRecorder.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/EventRecorder.java
new file mode 100644 (file)
index 0000000..4c928a9
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.suite.ui;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/** Record UI events. */
+public class EventRecorder implements EventHandler {
+       private final static Log log = LogFactory.getLog(EventRecorder.class);
+
+       public void init() {
+
+       }
+
+       public void destroy() {
+
+       }
+
+       @Override
+       public void handleEvent(Event event) {
+               if (log.isTraceEnabled())
+                       log.trace(event);
+
+       }
+
+}
index 9a6208b7e0d86ef2e3a120a341e7124e87561e5f..e499463781ac7a59795839abb2a929e49c8f1286 100644 (file)
@@ -8,6 +8,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
@@ -65,11 +66,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        private String headerPid;
        private String footerPid;
        private String leadPanePid;
+       private String adminLeadPanePid;
        private String loginScreenPid;
 
        private String defaultLayerPid = "argeo.suite.ui.dashboardLayer";
 
        private String defaultUiName = "app";
+       private String adminUiName = "admin";
        private String defaultThemeId = "org.argeo.suite.theme.default";
 
        private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
@@ -107,6 +110,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                headerPid = pidPrefix + "header";
                footerPid = pidPrefix + "footer";
                leadPanePid = pidPrefix + "leadPane";
+               adminLeadPanePid = pidPrefix + "adminLeadPane";
                loginScreenPid = pidPrefix + "loginScreen";
        }
 
@@ -123,6 +127,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        public Set<String> getUiNames() {
                HashSet<String> uiNames = new HashSet<>();
                uiNames.add(defaultUiName);
+               uiNames.add(adminUiName);
                return uiNames;
        }
 
@@ -156,10 +161,19 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                try {
                        Node context = null;
                        SuiteUi ui = (SuiteUi) parent;
+
+                       String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null);
+                       if (uiName == null)
+                               throw new IllegalStateException("UI name should not be null");
                        CmsView cmsView = CmsView.getCmsView(parent);
                        CmsUiProvider headerUiProvider = findUiProvider(headerPid);
                        CmsUiProvider footerUiProvider = findUiProvider(footerPid);
-                       CmsUiProvider leadPaneUiProvider = findUiProvider(leadPanePid);
+                       CmsUiProvider leadPaneUiProvider;
+                       if (adminUiName.equals(uiName)) {
+                               leadPaneUiProvider = findUiProvider(adminLeadPanePid);
+                       } else {
+                               leadPaneUiProvider = findUiProvider(leadPanePid);
+                       }
 
                        Localized appTitle = null;
                        if (headerUiProvider instanceof DefaultHeader) {
index 187888e55e0190d4b5a2cd8b2998627622d46ddb..469e36f466ba770ff081f331a1d1c086076e789a 100644 (file)
@@ -29,6 +29,7 @@ class SuiteUi extends Composite {
        private Composite footer;
        private Composite belowHeader;
        private Composite leadPane;
+       private Composite sidePane;
        private Composite dynamicArea;
 
        private Session sysSession;
@@ -64,14 +65,20 @@ class SuiteUi extends Composite {
                CmsUiUtils.clear(belowHeader);
                int style = getStyle();
                if (initApp) {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(3));
 
                        if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsUiUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsUiUtils.fillHeight());
                                dynamicArea = new Composite(belowHeader, SWT.NONE);
                                leadPane = new Composite(belowHeader, SWT.NONE);
                        } else {
                                leadPane = new Composite(belowHeader, SWT.NONE);
                                dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsUiUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsUiUtils.fillHeight());
                        }
                        leadPane.setLayoutData(CmsUiUtils.fillHeight());
                        leadPane.setLayout(CmsUiUtils.noSpaceGridLayout());
@@ -149,7 +156,6 @@ class SuiteUi extends Composite {
                }
                throw new IllegalArgumentException("Layer is not registered.");
        }
-       
 
        void addLayer(String id, SuiteLayer layer) {
                layers.put(id, layer);
@@ -196,6 +202,10 @@ class SuiteUi extends Composite {
                return leadPane;
        }
 
+       Composite getSidePane() {
+               return sidePane;
+       }
+
        Composite getBelowHeader() {
                return belowHeader;
        }
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/TermsEntryArea.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/TermsEntryArea.java
new file mode 100644 (file)
index 0000000..0f7e927
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.suite.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.ui.CmsUiProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/** Entry area for managing th etypologies. */
+public class TermsEntryArea implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               parent.setLayout(new GridLayout());
+               Label lbl = new Label(parent, SWT.NONE);
+               lbl.setText("Typologies");
+               return lbl;
+       }
+
+}