Login/logout working in new Argeo Suite.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 5 Oct 2020 12:10:11 +0000 (14:10 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 5 Oct 2020 12:10:11 +0000 (14:10 +0200)
39 files changed:
org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoOfficeRapE4App.java
org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/settings/AppDeployer.java
org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/settings/ArgeoRapApp.java
org.argeo.suite.theme.default/build.properties
org.argeo.suite.theme.default/icons/types/16/delete.png
org.argeo.suite.theme.default/icons/types/16/location.png [new file with mode: 0644]
org.argeo.suite.theme.default/icons/types/32/delete.png
org.argeo.suite.theme.default/icons/types/32/location.png [new file with mode: 0644]
org.argeo.suite.theme.default/rap/work.css
org.argeo.suite.ui/OSGI-INF/cmsApp.xml
org.argeo.suite.ui/OSGI-INF/dashboard.xml [new file with mode: 0644]
org.argeo.suite.ui/OSGI-INF/l10n/bundle.properties
org.argeo.suite.ui/OSGI-INF/leadPane.properties [deleted file]
org.argeo.suite.ui/OSGI-INF/leadPane.xml
org.argeo.suite.ui/OSGI-INF/loginScreen.xml [new file with mode: 0644]
org.argeo.suite.ui/OSGI-INF/recentItems.xml [new file with mode: 0644]
org.argeo.suite.ui/OSGI-INF/workHeader.properties [deleted file]
org.argeo.suite.ui/OSGI-INF/workHeader.xml
org.argeo.suite.ui/bnd.bnd
org.argeo.suite.ui/build.properties
org.argeo.suite.ui/config/cmsApp.properties [new file with mode: 0644]
org.argeo.suite.ui/config/dashboard.properties [new file with mode: 0644]
org.argeo.suite.ui/config/leadPane.properties [new file with mode: 0644]
org.argeo.suite.ui/config/loginScreen.properties [new file with mode: 0644]
org.argeo.suite.ui/config/recentItems.properties [new file with mode: 0644]
org.argeo.suite.ui/config/workHeader.properties [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java
org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteIcon.java [deleted file]
org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java [new file with mode: 0644]
org.argeo.suite.ui/src/org/argeo/suite/ui/WorkMsg.java [deleted file]
org.argeo.suite.ui/src/org/argeo/suite/ui/WorkStyles.java [deleted file]

index 6bc92fd922e5e514971bfd4556b2260f7846a4b7..213e5d2c4e73d445aa265f326c7a99d415ddbecb 100644 (file)
@@ -2,7 +2,6 @@
 package org.argeo.suite.e4.rap;
 
 import org.argeo.cms.e4.rap.AbstractRapE4App;
-import org.argeo.cms.ui.util.CmsTheme;
 import org.eclipse.rap.rwt.application.Application;
 import org.eclipse.rap.rwt.client.WebClient;
 import org.osgi.framework.BundleContext;
@@ -21,8 +20,8 @@ public class ArgeoOfficeRapE4App extends AbstractRapE4App {
 
        @Override
        protected void addEntryPoints(Application application) {
-               CmsTheme cmsTheme = new CmsTheme(bc, "org.argeo.theme.argeo2");
-               cmsTheme.apply(application);
+//             CmsTheme cmsTheme = new CmsTheme(bc, "org.argeo.theme.argeo2");
+//             cmsTheme.apply(application);
 
                String font = "<link rel='stylesheet' href='http://fonts.googleapis.com/css?family=Source+Sans+Pro'/>";
                getBaseProperties().put(WebClient.HEAD_HTML, font);
index bb3248838fe71b58baf27703eaa592133f62571a..978a8e2d337ea5a62d424df56620ab16b392e35d 100644 (file)
@@ -7,7 +7,6 @@ import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.e4.rap.AbstractRapE4App;
-import org.argeo.cms.ui.util.CmsTheme;
 import org.argeo.util.LangUtils;
 import org.eclipse.rap.rwt.application.ApplicationConfiguration;
 import org.osgi.framework.Bundle;
@@ -45,15 +44,15 @@ public class AppDeployer implements ManagedServiceFactory {
        }
 
        protected void deploy(Bundle bundle, Map<String, String> properties) {
-               CmsTheme cmsTheme;
-               if (properties.containsKey(CmsTheme.CMS_THEME_BUNDLE_PROPERTY)) {
-                       String cmsThemeBundle = properties.get(CmsTheme.CMS_THEME_BUNDLE_PROPERTY);
-                       cmsTheme = new CmsTheme(bundleContext, cmsThemeBundle);
-               } else {
-                       cmsTheme = new CmsTheme(bundleContext, CmsTheme.DEFAULT_CMS_THEME_BUNDLE);
-               }
+//             CmsTheme cmsTheme;
+//             if (properties.containsKey(CmsTheme.CMS_THEME_BUNDLE_PROPERTY)) {
+//                     String cmsThemeBundle = properties.get(CmsTheme.CMS_THEME_BUNDLE_PROPERTY);
+//                     cmsTheme = new CmsTheme(bundleContext, cmsThemeBundle);
+//             } else {
+//                     cmsTheme = new CmsTheme(bundleContext, CmsTheme.DEFAULT_CMS_THEME_BUNDLE);
+//             }
 
-               ArgeoRapApp app = new ArgeoRapApp(bundleContext, bundle, cmsTheme);
+               ArgeoRapApp app = new ArgeoRapApp(bundleContext, bundle, null);
 
                Hashtable<String, String> props = new Hashtable<String, String>();
                props.put(AbstractRapE4App.CONTEXT_NAME_PROPERTY, app.getContextName());
index e575f5553da17b258ed501e8f76a477ea40948bf..3bdc90265832549fa8a47afb9b41006d60af0169 100644 (file)
@@ -7,7 +7,7 @@ import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.e4.rap.AbstractRapE4App;
-import org.argeo.cms.ui.util.CmsTheme;
+import org.argeo.cms.ui.CmsTheme;
 import org.eclipse.rap.rwt.application.Application;
 import org.eclipse.rap.rwt.client.WebClient;
 import org.osgi.framework.Bundle;
@@ -38,19 +38,19 @@ public class ArgeoRapApp extends AbstractRapE4App {
        public void init(BundleContext bundleContext, Map<String, Object> properties) {
                super.init(bundleContext, properties);
                // super must be first
-               if (getBaseProperties().containsKey(CmsTheme.CMS_THEME_BUNDLE_PROPERTY)) {
-                       String cmsThemeBundle = getBaseProperties().get(CmsTheme.CMS_THEME_BUNDLE_PROPERTY);
-                       cmsTheme = new CmsTheme(getBundleContext(), cmsThemeBundle);
-               } else {
-                       cmsTheme = new CmsTheme(getBundleContext(), CmsTheme.DEFAULT_CMS_THEME_BUNDLE);
-               }
+//             if (getBaseProperties().containsKey(CmsTheme.CMS_THEME_BUNDLE_PROPERTY)) {
+//                     String cmsThemeBundle = getBaseProperties().get(CmsTheme.CMS_THEME_BUNDLE_PROPERTY);
+//                     cmsTheme = new CmsTheme(getBundleContext(), cmsThemeBundle);
+//             } else {
+//                     cmsTheme = new CmsTheme(getBundleContext(), CmsTheme.DEFAULT_CMS_THEME_BUNDLE);
+//             }
                bundle = bundleContext.getBundle();
        }
 
        @Override
        protected void addEntryPoints(Application application) {
-               if (cmsTheme != null)
-                       cmsTheme.apply(application);
+//             if (cmsTheme != null)
+//                     cmsTheme.apply(application);
 
                String font = "<link rel='stylesheet' href='http://fonts.googleapis.com/css?family=Source+Sans+Pro'/>";
                getBaseProperties().put(WebClient.HEAD_HTML, font);
index bf450caba0a31366535499160a0d7dbbf1cbd160..9cb37cd6b84f7b2b1aa59e644886278629432c97 100644 (file)
@@ -1,2 +1,3 @@
 bin.includes = META-INF/,\
-               OSGI-INF/cmsTheme.xml
+               icons/,\
+               OSGI-INF/
index 676a39dcfa1f55439af9dbffc29dd6a3c0710498..dd2f428849427541b9c52545ff67580c8dc8c613 100644 (file)
Binary files a/org.argeo.suite.theme.default/icons/types/16/delete.png and b/org.argeo.suite.theme.default/icons/types/16/delete.png differ
diff --git a/org.argeo.suite.theme.default/icons/types/16/location.png b/org.argeo.suite.theme.default/icons/types/16/location.png
new file mode 100644 (file)
index 0000000..17c7070
Binary files /dev/null and b/org.argeo.suite.theme.default/icons/types/16/location.png differ
index c74ad1a7295da97d2009085651f2a90919534b34..2ee3d889f8b5ee8b42b10ca87b4b1d2725cb94c1 100644 (file)
Binary files a/org.argeo.suite.theme.default/icons/types/32/delete.png and b/org.argeo.suite.theme.default/icons/types/32/delete.png differ
diff --git a/org.argeo.suite.theme.default/icons/types/32/location.png b/org.argeo.suite.theme.default/icons/types/32/location.png
new file mode 100644 (file)
index 0000000..d9207f1
Binary files /dev/null and b/org.argeo.suite.theme.default/icons/types/32/location.png differ
index ab6bafdd8baca7e59671a89e8e14267f9e316c23..383fe17bf06f9ffa76b809890e069b3c373585f2 100644 (file)
@@ -1,16 +1,21 @@
-.argeo-work-header {
+.argeo-suite-header {
+       color: white;
+       background-color: #204a87;
+}
+
+.argeo-suite-headerTitle {
        font: bold 22px sans-serif;
        color: white;
        background-color: #204a87;
 }
 
-.argeo-work-leadPane {
+.argeo-suite-leadPane {
        font: bold 14px sans-serif;
        color: white;
        background-color: #204a87;
 }
 
-Button.argeo-work-leadPane {
+Button.argeo-suite-leadPane {
        font: bold 14px sans-serif;
        color: white;
        background-color: white;
index ab3a0b7d0976b2f6847e0f4bf21a40dcd9ed7135..54c16df552b1e7043e93cbf96e410410bff38b71 100644 (file)
@@ -1,10 +1,10 @@
 <?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="Argeo Suite App">
    <implementation class="org.argeo.suite.ui.ArgeoSuiteApp"/>
-   <property name="contextName" type="String" value="argeo"/>
    <service>
       <provide interface="org.argeo.cms.ui.CmsApp"/>
    </service>
-   <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" unbind="removeUiProvider"/>
+   <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(argeo.suite.ui=*)" unbind="removeUiProvider"/>
    <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+   <properties entry="config/cmsApp.properties"/>
 </scr:component>
diff --git a/org.argeo.suite.ui/OSGI-INF/dashboard.xml b/org.argeo.suite.ui/OSGI-INF/dashboard.xml
new file mode 100644 (file)
index 0000000..f678b5b
--- /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="Default Dashboard">
+   <implementation class="org.argeo.suite.ui.DefaultDashboard"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/dashboard.properties"/>
+</scr:component>
index cec63ab36db1a345aff3cebd9c6da94a8699dca7..6fe83d37a4bd1de221cf8649aeb2e93a91cc17bc 100644 (file)
@@ -1,5 +1,6 @@
 dashboard=dashboard
-people=contacts management
+people=contacts
 documents=documents
+locations=locations
 
 defaultWorkAppTitle=Argeo Suite
\ No newline at end of file
diff --git a/org.argeo.suite.ui/OSGI-INF/leadPane.properties b/org.argeo.suite.ui/OSGI-INF/leadPane.properties
deleted file mode 100644 (file)
index 24dad49..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.work.leadPane
index cf0f469b6a530e42359a9f9ce09cd5f210211975..a4b9ca03401fd197af043a5dec5f9bd4d622236f 100644 (file)
@@ -5,5 +5,5 @@
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
       <provide interface="org.osgi.service.cm.ManagedService"/>
    </service>
-   <properties entry="OSGI-INF/leadPane.properties"/>
+   <properties entry="config/leadPane.properties"/>
 </scr:component>
diff --git a/org.argeo.suite.ui/OSGI-INF/loginScreen.xml b/org.argeo.suite.ui/OSGI-INF/loginScreen.xml
new file mode 100644 (file)
index 0000000..0c5377a
--- /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="Default Login Screen">
+   <implementation class="org.argeo.suite.ui.DefaultLoginScreen"/>
+   <properties entry="config/loginScreen.properties"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.ui/OSGI-INF/recentItems.xml b/org.argeo.suite.ui/OSGI-INF/recentItems.xml
new file mode 100644 (file)
index 0000000..3f1baff
--- /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="Default Recent Items">
+   <implementation class="org.argeo.suite.ui.RecentItems"/>
+   <service>
+      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+   </service>
+   <properties entry="config/recentItems.properties"/>
+</scr:component>
diff --git a/org.argeo.suite.ui/OSGI-INF/workHeader.properties b/org.argeo.suite.ui/OSGI-INF/workHeader.properties
deleted file mode 100644 (file)
index fc69864..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-service.pid=argeo.work.header
-argeo.work.header.title=%defaultWorkAppTitle
\ No newline at end of file
index f4167509d4e45ff8ffa425699fab60620198dd2d..eaf3a309d7b73f4c5ba6a7235f7fda8259814df1 100644 (file)
@@ -5,5 +5,5 @@
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
       <provide interface="org.osgi.service.cm.ManagedService"/>
    </service>
-   <properties entry="OSGI-INF/workHeader.properties"/>
+   <properties entry="config/workHeader.properties"/>
 </scr:component>
index ecf6fe8db0c965cd5671dc6ae4f8faed2d104bfd..dca43fe510c7a879022fb47240e696f5a53a0e6d 100644 (file)
@@ -1,7 +1,10 @@
 Service-Component:\
 OSGI-INF/cmsApp.xml,\
 OSGI-INF/workHeader.xml,\
-OSGI-INF/leadPane.xml
+OSGI-INF/leadPane.xml,\
+OSGI-INF/loginScreen.xml,\
+OSGI-INF/recentItems.xml,\
+OSGI-INF/dashboard.xml
 
 Import-Package:\
 org.argeo.api,\
index 6210e849b591d26fa9e17057ad3e8d09511917b6..1a1bc1a2f3ceedefb5a38ee702c3dfebffb455de 100644 (file)
@@ -1,5 +1,9 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               OSGI-INF/
+               OSGI-INF/,\
+               config/,\
+               OSGI-INF/loginScreen.xml,\
+               OSGI-INF/dashboard.xml,\
+               OSGI-INF/recentItems.xml
 source.. = src/
diff --git a/org.argeo.suite.ui/config/cmsApp.properties b/org.argeo.suite.ui/config/cmsApp.properties
new file mode 100644 (file)
index 0000000..641bba6
--- /dev/null
@@ -0,0 +1,2 @@
+service.pid=argeo.suite.ui.app
+contextName=argeo
diff --git a/org.argeo.suite.ui/config/dashboard.properties b/org.argeo.suite.ui/config/dashboard.properties
new file mode 100644 (file)
index 0000000..ea5669d
--- /dev/null
@@ -0,0 +1,2 @@
+service.pid=argeo.suite.ui.dashboard
+argeo.suite.ui=true
diff --git a/org.argeo.suite.ui/config/leadPane.properties b/org.argeo.suite.ui/config/leadPane.properties
new file mode 100644 (file)
index 0000000..fc3a3ba
--- /dev/null
@@ -0,0 +1,2 @@
+service.pid=argeo.suite.ui.leadPane
+argeo.suite.ui=true
diff --git a/org.argeo.suite.ui/config/loginScreen.properties b/org.argeo.suite.ui/config/loginScreen.properties
new file mode 100644 (file)
index 0000000..81d54c0
--- /dev/null
@@ -0,0 +1,2 @@
+service.pid=argeo.suite.ui.loginScreen
+argeo.suite.ui=true
diff --git a/org.argeo.suite.ui/config/recentItems.properties b/org.argeo.suite.ui/config/recentItems.properties
new file mode 100644 (file)
index 0000000..1cf8766
--- /dev/null
@@ -0,0 +1,2 @@
+service.pid=argeo.suite.ui.recentItems
+argeo.suite.ui=true
diff --git a/org.argeo.suite.ui/config/workHeader.properties b/org.argeo.suite.ui/config/workHeader.properties
new file mode 100644 (file)
index 0000000..e5bc6b3
--- /dev/null
@@ -0,0 +1,4 @@
+service.pid=argeo.suite.ui.header
+argeo.suite.ui=true
+
+argeo.suite.ui.header.title=%defaultWorkAppTitle
\ No newline at end of file
index b669d45aa7078563f56065741428f986466381b4..fce2deb369fbb752c60017422725ecac42bb9a1a 100644 (file)
@@ -6,29 +6,35 @@ import java.util.Set;
 import java.util.TreeMap;
 
 import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 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.jcr.JcrUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.osgi.framework.Constants;
 
 /** The Argeo Suite App. */
 public class ArgeoSuiteApp extends AbstractCmsApp {
        private final static Log log = LogFactory.getLog(ArgeoSuiteApp.class);
 
-       public final static String PID_PREFIX = "argeo.work.";
+       public final static String PID_PREFIX = "argeo.suite.ui.";
        public final static String HEADER_PID = PID_PREFIX + "header";
        public final static String LEAD_PANE_PID = PID_PREFIX + "leadPane";
+       public final static String LOGIN_SCREEN_PID = PID_PREFIX + "loginScreen";
+       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_THEME_ID = "org.argeo.suite.theme.default";
 
-       private ArgeoSuiteUi argeoSuiteUi;
-
        private Map<String, CmsUiProvider> uiProviders = new TreeMap<>();
 
        public void init(Map<String, String> properties) {
@@ -50,15 +56,14 @@ public class ArgeoSuiteApp extends AbstractCmsApp {
        }
 
        @Override
-       public void initUi(String uiName, Composite parent) {
-               if (DEFAULT_UI_NAME.equals(uiName)) {
-                       CmsTheme theme = getTheme(uiName);
-                       if (theme != null)
-                               CmsTheme.registerCmsTheme(parent.getShell(), theme);
-                       argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE);
-                       refresh(uiName);
-               }
-
+       public Composite initUi(Composite parent) {
+               String uiName = parent.getData(UI_NAME_PROPERTY) != null ? parent.getData(UI_NAME_PROPERTY).toString() : null;
+               CmsTheme theme = getTheme(uiName);
+               if (theme != null)
+                       CmsTheme.registerCmsTheme(parent.getShell(), theme);
+               ArgeoSuiteUi argeoSuiteUi = new ArgeoSuiteUi(parent, SWT.NONE);
+               refreshUi(argeoSuiteUi, null);
+               return argeoSuiteUi;
        }
 
        @Override
@@ -67,14 +72,92 @@ public class ArgeoSuiteApp extends AbstractCmsApp {
                return DEFAULT_THEME_ID;
        }
 
-       public void refresh(String uiName) {
-               if (DEFAULT_UI_NAME.equals(uiName)) {
-                       Node context = null;
-                       uiProviders.get(HEADER_PID).createUiPart(argeoSuiteUi.getHeader(), context);
-                       uiProviders.get(LEAD_PANE_PID).createUiPart(argeoSuiteUi.getLeadPane(), context);
+       @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);
                }
+               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();
+               uiProvider.createUiPart(part, context);
+       }
+
+       private CmsUiProvider findUiProvider(String pid, Node context) {
+               if (pid != null) {
+                       if (uiProviders.containsKey(pid))
+                               return uiProviders.get(pid);
+               }
+
+               // nothing
+               return new CmsUiProvider() {
+
+                       @Override
+                       public Control createUi(Composite parent, Node context) throws RepositoryException {
+                               return parent;
+                       }
+               };
+       }
+
+       @Override
+       public void setState(Composite parent, String state) {
+               CmsView cmsView = CmsView.getCmsView(parent);
+               // for the time being we systematically open a session, in order to make sure
+               // that home is initialised
+               Session session = null;
+               try {
+                       if (state != null && state.startsWith("/")) {
+                               String path = state.substring(1);
+                               String workspace;
+                               if (path.equals("")) {
+                                       workspace = null;
+                                       path = "/";
+                               } else {
+                                       int index = path.indexOf('/');
+                                       if (index == 0) {
+                                               log.error("Cannot interpret // " + state);
+                                               cmsView.navigateTo("~");
+                                               return;
+                                       } else if (index > 0) {
+                                               workspace = path.substring(0, index);
+                                               path = path.substring(index);
+                                       } else {// index<0, assuming root node
+                                               workspace = path;
+                                               path = "/";
+                                       }
+                               }
+                               session = getRepository().login(workspace);
+
+                               Node node = session.getNode(path);
+                               refreshEntityUi(node);
+                       }
+               } catch (RepositoryException e) {
+                       log.error("Cannot load state " + state, e);
+                       cmsView.navigateTo("~");
+               } finally {
+                       JcrUtils.logoutQuietly(session);
+               }
+       }
+
+       private void refreshEntityUi(Node node) {
+
+       }
+
+       /*
+        * Dependency injection.
+        */
+
        public void addUiProvider(CmsUiProvider uiProvider, Map<String, String> properties) {
                String servicePid = properties.get(Constants.SERVICE_PID);
                if (servicePid == null) {
@@ -92,14 +175,4 @@ public class ArgeoSuiteApp extends AbstractCmsApp {
                uiProviders.remove(servicePid);
 
        }
-
-//     static class UiProviderKey {
-//             private Map<String, String> properties;
-//
-//             public UiProviderKey(Map<String, String> properties) {
-//                     super();
-//                     this.properties = properties;
-//             }
-//
-//     }
 }
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteIcon.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteIcon.java
deleted file mode 100644 (file)
index 220e879..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.ui.util.CmsIcon;
-
-/** Icon names used by Argeo Suite. */
-public enum ArgeoSuiteIcon implements CmsIcon {
-       add, save, search, delete, logout, dashboard,
-       // people
-       people, person, organisation,
-       // library
-       documents, document, folder,
-       // misc
-       task, tag;
-}
index a2caa15b17138118df01e78c53044a96b5f5e9af..08441a3e17a9f8868b9d511d0675d32bf297012f 100644 (file)
@@ -1,22 +1,28 @@
 package org.argeo.suite.ui;
 
-import static org.argeo.suite.ui.ArgeoSuiteIcon.dashboard;
+import static org.argeo.suite.ui.SuiteIcon.dashboard;
 
 import org.argeo.cms.ui.CmsTheme;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.layout.RowLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
 
-public class ArgeoSuiteUi {
-       private Composite parent;
+/** The {@link CmsView} for the work ergonomics of Argeo Suite. */
+public class ArgeoSuiteUi extends Composite {
+       private static final long serialVersionUID = 6207018859086689108L;
 
        private Composite header;
+       private Composite belowHeader;
        private Composite leadPane;
 
        private SashForm dynamicArea;
@@ -29,15 +35,15 @@ public class ArgeoSuiteUi {
        private CmsTheme theme;
 
        public ArgeoSuiteUi(Composite parent, int style) {
+               super(parent, style);
                theme = CmsTheme.getCmsTheme(parent);
-               this.parent = parent;
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
+               this.setLayout(CmsUiUtils.noSpaceGridLayout());
 
-               header = new Composite(parent, SWT.NONE);
-               CmsUiUtils.style(header, WorkStyles.header);
+               header = new Composite(this, SWT.NONE);
+               CmsUiUtils.style(header, SuiteStyle.header);
                header.setLayoutData(CmsUiUtils.fillWidth());
 
-               Composite belowHeader = new Composite(parent, SWT.NONE);
+               belowHeader = new Composite(this, SWT.NONE);
                belowHeader.setLayoutData(CmsUiUtils.fillAll());
                belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
 
@@ -49,7 +55,7 @@ public class ArgeoSuiteUi {
                        dynamicArea = new SashForm(belowHeader, SWT.HORIZONTAL);
                }
                leadPane.setLayoutData(CmsUiUtils.fillHeight());
-               CmsUiUtils.style(leadPane, WorkStyles.leadPane);
+               CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
                dynamicArea.setLayoutData(CmsUiUtils.fillAll());
 
                if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
@@ -63,21 +69,17 @@ public class ArgeoSuiteUi {
                dynamicArea.setWeights(weights);
                editorArea.setLayout(new GridLayout());
 
-               // TODO make it dynamic
-               RecentItems recentItems = new RecentItems();
-               recentItems.createUiPart(entryArea);
-
                editorTabFolder = new CTabFolder(editorArea, SWT.NONE);
                editorTabFolder.setLayoutData(CmsUiUtils.fillAll());
+
+               // TODO make it dynamic
                Composite buttons = new Composite(editorTabFolder, SWT.NONE);
-               RowLayout buttonsLayout = new RowLayout(SWT.HORIZONTAL);
-               buttonsLayout.pack = false;
-               buttons.setLayout(buttonsLayout);
-               Button delete = new Button(buttons, SWT.FLAT);
-               delete.setImage(ArgeoSuiteIcon.delete.getSmallIcon(theme));
-               // int size = ArgeoSuiteIcon.delete.getSmallIconSize();
-               // delete.setBounds(delete.getBounds().x,delete.getBounds().y,size,size);
-               // delete.setSize(size, size);
+               buttons.setLayout(CmsUiUtils.noSpaceGridLayout());
+               ToolBar toolBar = new ToolBar(buttons, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));
+               ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
+               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
+               deleteItem.setEnabled(false);
                editorTabFolder.setTopRight(buttons);
 
                CTabItem defaultTab = new CTabItem(editorTabFolder, SWT.NONE);
@@ -90,9 +92,9 @@ public class ArgeoSuiteUi {
                // editorArea.setSingle(true);
        }
 
-       Composite getParent() {
-               return parent;
-       }
+       /*
+        * GETTERS / SETTERS
+        */
 
        Composite getHeader() {
                return header;
@@ -118,4 +120,8 @@ public class ArgeoSuiteUi {
                return defaultBody;
        }
 
+       Composite getBelowHeader() {
+               return belowHeader;
+       }
+
 }
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java
new file mode 100644 (file)
index 0000000..9835b67
--- /dev/null
@@ -0,0 +1,31 @@
+package org.argeo.suite.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+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;
+
+/** Provides a dashboard. */
+public class DefaultDashboard implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               parent.setLayout(new GridLayout());
+               CmsView cmsView = CmsView.getCmsView(parent);
+               if (cmsView.isAnonymous())
+                       throw new IllegalStateException("No user is not logged in");
+
+               Label lbl = new Label(parent, SWT.NONE);
+               lbl.setText("Welcome " + CurrentUser.getDisplayName() + "!");
+
+               return lbl;
+       }
+
+}
index de38c44af65c27871b59cb91d017fa6455d2ac6a..a251e14c78ffa0de572f661a56c524e106e11e9a 100644 (file)
@@ -8,11 +8,18 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.LocaleUtils;
+import org.argeo.cms.auth.CurrentUser;
+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;
+import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
@@ -20,18 +27,60 @@ import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 
 public class DefaultHeader implements CmsUiProvider, ManagedService {
-       public final static String TITLE_PROPERTY = "argeo.work.header.title";
+       public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title";
        private Map<String, String> properties;
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
-               parent.setLayout(new GridLayout());
-               Label lbl = new Label(parent, SWT.NONE);
+               CmsView cmsView = CmsView.getCmsView(parent);
+               CmsTheme theme = CmsTheme.getCmsTheme(parent);
+
+               parent.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(3, true)));
+
+               // TODO right to left
+               Composite lead = new Composite(parent, SWT.NONE);
+               CmsUiUtils.style(lead, SuiteStyle.header);
+               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);
-               CmsUiUtils.style(lbl, WorkStyles.header);
+               CmsUiUtils.style(lbl, SuiteStyle.headerTitle);
                lbl.setLayoutData(CmsUiUtils.fillWidth());
+
+               Composite middle = new Composite(parent, SWT.NONE);
+               CmsUiUtils.style(middle, SuiteStyle.header);
+               middle.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
+               middle.setLayout(new GridLayout());
+
+               Composite end = new Composite(parent, SWT.NONE);
+               CmsUiUtils.style(end, SuiteStyle.header);
+               end.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
+
+               if (!cmsView.isAnonymous()) {
+                       end.setLayout(new GridLayout(2, false));
+                       Label userL = new Label(end, SWT.NONE);
+                       CmsUiUtils.style(userL, SuiteStyle.header);
+                       userL.setText(CurrentUser.getDisplayName());
+                       Button logoutB = new Button(end, SWT.FLAT);
+//                     CmsUiUtils.style(logoutB, SuiteStyle.header);
+                       logoutB.setImage(SuiteIcon.logout.getSmallIcon(theme));
+                       logoutB.addSelectionListener(new SelectionAdapter() {
+                               private static final long serialVersionUID = 7116760083964201233L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       cmsView.logout();
+                               }
+
+                       });
+               } else {
+                       end.setLayout(new GridLayout(1, false));
+                       // required in order to avoid wrong height after logout
+                       new Label(end, SWT.NONE).setText("");
+
+               }
                return lbl;
        }
 
index d84f69d5dd7b2a682ccd845c2c4fe1b857e5d655..cbc0a7846636223bf9862fc40b941a8dacd15a6d 100644 (file)
@@ -9,6 +9,7 @@ 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.CmsView;
 import org.argeo.cms.ui.util.CmsIcon;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.eclipse.swt.SWT;
@@ -21,11 +22,9 @@ import org.osgi.service.cm.ManagedService;
 
 /** Side pane listing various perspectives. */
 public class DefaultLeadPane implements CmsUiProvider, ManagedService {
-       private CmsTheme theme;
-
        @Override
        public Control createUi(Composite parent, Node node) throws RepositoryException {
-               theme = CmsTheme.getCmsTheme(parent);
+               CmsView cmsView = CmsView.getCmsView(parent);
                GridLayout layout = new GridLayout();
                layout.verticalSpacing = 10;
                layout.marginTop = 10;
@@ -33,15 +32,19 @@ public class DefaultLeadPane implements CmsUiProvider, ManagedService {
                layout.marginRight = 10;
                parent.setLayout(layout);
 
-               Button dashboardB = createButton(parent, WorkMsg.dashboard, ArgeoSuiteIcon.dashboard);
-               createButton(parent, WorkMsg.people, ArgeoSuiteIcon.people);
-               createButton(parent, WorkMsg.documents, ArgeoSuiteIcon.documents);
+               Button dashboardB = createButton(parent, SuiteMsg.dashboard, SuiteIcon.dashboard);
+               if (!cmsView.isAnonymous()) {
+                       createButton(parent, SuiteMsg.documents, SuiteIcon.documents);
+                       createButton(parent, SuiteMsg.people, SuiteIcon.people);
+                       createButton(parent, SuiteMsg.locations, SuiteIcon.location);
+               }
                return dashboardB;
        }
 
        protected Button createButton(Composite parent, Localized msg, CmsIcon icon) {
+               CmsTheme theme = CmsTheme.getCmsTheme(parent);
                Button button = new Button(parent, SWT.FLAT);
-               CmsUiUtils.style(button, WorkStyles.leadPane);
+               CmsUiUtils.style(button, SuiteStyle.leadPane);
                button.setToolTipText(msg.lead());
                button.setImage(icon.getBigIcon(theme));
                return button;
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java
new file mode 100644 (file)
index 0000000..3757a19
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.suite.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.widgets.auth.CmsLogin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Provides a login screen. */
+public class DefaultLoginScreen implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               CmsView cmsView = CmsView.getCmsView(parent);
+               if (!cmsView.isAnonymous())
+                       throw new IllegalStateException(CurrentUser.getUsername() + " is already logged in");
+
+               parent.setLayout(new GridLayout());
+               Composite loginArea = new Composite(parent, SWT.NONE);
+               loginArea.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+               
+               CmsLogin cmsLogin = new CmsLogin(cmsView);
+               cmsLogin.createUi(loginArea);
+               return cmsLogin.getCredentialsBlock();
+       }
+
+}
index 230a0dad91eb1efb523123ea9c83efd230ea337f..98122a3eb620833ce0ffe96f4c9bba8d8fab5e65 100644 (file)
@@ -13,6 +13,7 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
 
 /** List recent items. */
 public class RecentItems implements CmsUiProvider {
@@ -29,13 +30,15 @@ public class RecentItems implements CmsUiProvider {
                top.setLayout(new GridLayout(2, false));
 
                Label search = new Label(top, SWT.NONE);
-               search.setImage(ArgeoSuiteIcon.search.getSmallIcon(theme));
-               DelayedText delayedText = new DelayedText(top, SWT.SINGLE | SWT.BORDER, SEARCH_TEXT_DELAY);
-               delayedText.getText().setLayoutData(CmsUiUtils.fillWidth());
+               search.setImage(SuiteIcon.search.getSmallIcon(theme));
+               Text text = new Text(top, SWT.SINGLE | SWT.BORDER);
+               text.setLayoutData(CmsUiUtils.fillWidth());
+//             DelayedText delayedText = new DelayedText(top, SWT.SINGLE | SWT.BORDER, SEARCH_TEXT_DELAY);
+//             delayedText.getText().setLayoutData(CmsUiUtils.fillWidth());
 
                TableViewer viewer = new TableViewer(parent);
                viewer.getTable().setLayoutData(CmsUiUtils.fillAll());
-               return delayedText.getText();
+               return text;
        }
 
 }
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java
new file mode 100644 (file)
index 0000000..02f3114
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.suite.ui;
+
+import org.argeo.cms.ui.util.CmsIcon;
+
+/** Icon names used by Argeo Suite. */
+public enum SuiteIcon implements CmsIcon {
+       add, save, search, delete, logout, dashboard,
+       // people
+       people, person, organisation,
+       // library
+       documents, document, folder,
+       // misc
+       task, tag, location;
+}
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java
new file mode 100644 (file)
index 0000000..c6485c2
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.suite.ui;
+
+import org.argeo.cms.Localized;
+
+/** Localized messages. */
+public enum SuiteMsg implements Localized {
+       dashboard,people,documents,locations;
+}
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java
new file mode 100644 (file)
index 0000000..2251e67
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.suite.ui;
+
+import org.argeo.cms.ui.util.CmsStyle;
+
+/** Styles used by Argeo Suite work UI. */
+public enum SuiteStyle implements CmsStyle {
+       // Header
+       header,headerTitle,
+       // Lead pane
+       leadPane;
+
+       @Override
+       public String getClassPrefix() {
+               return "argeo-suite";
+       }
+
+}
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/WorkMsg.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/WorkMsg.java
deleted file mode 100644 (file)
index f651d9f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.Localized;
-
-/** Localized messages. */
-public enum WorkMsg implements Localized {
-       dashboard,people,documents;
-}
diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/WorkStyles.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/WorkStyles.java
deleted file mode 100644 (file)
index 7547154..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.ui.util.CmsStyle;
-
-/** Styles used by Argeo Suite work UI. */
-public enum WorkStyles implements CmsStyle {
-       header, leadPane;
-
-       @Override
-       public String getClassPrefix() {
-               return "argeo-work";
-       }
-
-}