First working Eclipse 4 suite
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 25 Mar 2018 19:56:11 +0000 (21:56 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 25 Mar 2018 19:56:11 +0000 (21:56 +0200)
40 files changed:
org.argeo.suite.apps/META-INF/spring/workbench-services.xml
org.argeo.suite.apps/plugin.xml [deleted file]
org.argeo.suite.cms/.classpath [new file with mode: 0644]
org.argeo.suite.cms/.gitignore [new file with mode: 0644]
org.argeo.suite.cms/.project [new file with mode: 0644]
org.argeo.suite.cms/META-INF/.gitignore [new file with mode: 0644]
org.argeo.suite.cms/META-INF/MANIFEST.MF [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/activitiesMaintenanceService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/activitiesService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/peopleMaintenanceService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/peopleService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/resourcesMaintenanceService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/resourcesService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/systemAppService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/systemMaintenanceService.xml [new file with mode: 0644]
org.argeo.suite.cms/OSGI-INF/userManagerService.xml [new file with mode: 0644]
org.argeo.suite.cms/bnd.bnd [new file with mode: 0644]
org.argeo.suite.cms/build.properties [new file with mode: 0644]
org.argeo.suite.e4.rap/.classpath [new file with mode: 0644]
org.argeo.suite.e4.rap/.gitignore [new file with mode: 0644]
org.argeo.suite.e4.rap/.project [new file with mode: 0644]
org.argeo.suite.e4.rap/META-INF/.gitignore [new file with mode: 0644]
org.argeo.suite.e4.rap/META-INF/MANIFEST.MF [new file with mode: 0644]
org.argeo.suite.e4.rap/OSGI-INF/activitiesE4Service.xml [new file with mode: 0644]
org.argeo.suite.e4.rap/OSGI-INF/argeo-office-rap.xml [new file with mode: 0644]
org.argeo.suite.e4.rap/OSGI-INF/peopleE4Service.xml [new file with mode: 0644]
org.argeo.suite.e4.rap/OSGI-INF/systemE4Service.xml [new file with mode: 0644]
org.argeo.suite.e4.rap/bnd.bnd [new file with mode: 0644]
org.argeo.suite.e4.rap/build.properties [new file with mode: 0644]
org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoOfficeRapE4App.java [new file with mode: 0644]
org.argeo.suite.e4/.classpath [new file with mode: 0644]
org.argeo.suite.e4/.gitignore [new file with mode: 0644]
org.argeo.suite.e4/.project [new file with mode: 0644]
org.argeo.suite.e4/META-INF/.gitignore [new file with mode: 0644]
org.argeo.suite.e4/META-INF/MANIFEST.MF [new file with mode: 0644]
org.argeo.suite.e4/build.properties [new file with mode: 0644]
org.argeo.suite.e4/e4xmi/argeo-office.e4xmi [new file with mode: 0644]
org.argeo.suite.e4/src/org/argeo/suite/e4/parts/EntitySingleColumnLabelProvider.java [new file with mode: 0644]
org.argeo.suite.e4/src/org/argeo/suite/e4/parts/QuickSearchView.java [new file with mode: 0644]
sdk/argeo-office-e4-rap.properties [new file with mode: 0644]

index a9ce94d8752abcce6e7948f17a1109d5ab420a67..054a601d2c55e8b37e186be9a9fb1f40edfe6b67 100644 (file)
@@ -35,7 +35,7 @@
        </util:list>\r
 \r
        <bean id="suiteWorkbenchService"\r
-               class="org.argeo.connect.ui.DefaultSystemWorkbenchService">\r
+               class="org.argeo.connect.workbench.DefaultSystemWorkbenchService">\r
                <property name="knownAppWbServices" ref="knownWbServices" />\r
                <property name="defaultEditorId"\r
                        value="org.argeo.suite.workbench.rap.defaultDashboardEditor" />\r
diff --git a/org.argeo.suite.apps/plugin.xml b/org.argeo.suite.apps/plugin.xml
deleted file mode 100644 (file)
index c33d96d..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.6"?>
-<plugin>
-       <!-- RAP workbench main entry point for the Argeo Suite core application --> 
-       <!--
-       <extension
-               point="org.eclipse.rap.ui.entrypoint">
-               <entrypoint
-                       id="org.argeo.suite.workbench.rap.entrypoint"
-                       class="org.argeo.suite.workbench.rap.AsSecureEntryPoint"
-                       path="/suite"
-                       brandingId="org.argeo.suite.workbench.rap.defaultBranding">
-               </entrypoint>
-       </extension>
- -->   
-       <!-- PERSPECTIVES -->
-       <extension
-         point="org.eclipse.ui.perspectives">
-       </extension>
-       
-       <!-- VIEWS -->
-        <extension
-               point="org.eclipse.ui.views">
-       </extension>
-               
-       <!-- EDITORS --> 
-       <extension
-               point="org.eclipse.ui.editors">
-       </extension>
-       
-       <!-- COMMANDS -->       
-       <extension
-         point="org.eclipse.ui.commands">
-       </extension>
-
-       <!-- MENU CONTRIBUTION --> 
-       <extension
-               id="menu:org.eclipse.ui.main.menu"
-               point="org.eclipse.ui.menus">
-       </extension>
-       
-       <!-- BRANDING AND THEMES -->
-       <!-- 
-       <extension
-               point="org.eclipse.rap.ui.branding">
-               <branding
-                       id="org.argeo.suite.workbench.rap.defaultBranding"
-                       themeId="org.eclipse.rap.rwt.theme.Default"
-                       title="Argeo Suite"
-                       favicon="theme/argeo-classic/icons/favicon.ico">
-                       <additionalHeaders>
-                        <link 
-                               href="suite/theme/classic-headerExt.css"  
-                               rel="stylesheet" />
-                       </additionalHeaders>
-               </branding>
-       </extension> 
-       
-       <extension  
-            point="org.eclipse.equinox.http.registry.resources">  
-        <resource  
-               alias="/ui/suite/theme/classic-headerExt.css"  
-               base-name="theme/argeo-classic/workbench-headerExt.css">  
-         </resource>  
-         <resource  
-               alias="/ui/suite/img/logo-argeo.png"  
-               base-name="theme/argeo-classic/img/logo-argeo.png">  
-         </resource>  
-    </extension>  
-       
-       <extension
-               point="org.eclipse.rap.ui.themes">
-               <themeContribution
-                       themeId="org.eclipse.rap.rwt.theme.Default"
-                       file="theme/argeo-classic/workbench-ext.css" />
-       </extension>
-        -->
-</plugin>
diff --git a/org.argeo.suite.cms/.classpath b/org.argeo.suite.cms/.classpath
new file mode 100644 (file)
index 0000000..eca7bdb
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.suite.cms/.gitignore b/org.argeo.suite.cms/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.suite.cms/.project b/org.argeo.suite.cms/.project
new file mode 100644 (file)
index 0000000..159bcce
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.suite.cms</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.suite.cms/META-INF/.gitignore b/org.argeo.suite.cms/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.suite.cms/META-INF/MANIFEST.MF b/org.argeo.suite.cms/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..e0594fc
--- /dev/null
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Cms
+Bundle-SymbolicName: org.argeo.suite.cms
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Service-Component: OSGI-INF/resourcesService.xml,
+ OSGI-INF/activitiesService.xml,
+ OSGI-INF/systemAppService.xml,
+ OSGI-INF/userManagerService.xml,
+ OSGI-INF/peopleService.xml,
+ OSGI-INF/systemMaintenanceService.xml,
+ OSGI-INF/activitiesMaintenanceService.xml,
+ OSGI-INF/resourcesMaintenanceService.xml,
+ OSGI-INF/peopleMaintenanceService.xml
+Import-Package: javax.jcr;version="2.0.0",
+ javax.transaction,
+ org.argeo.activities;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.activities.core;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.connect;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.connect.core;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.connect.resources;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.connect.resources.core;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.people;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.people.core;version="2.1.79.SNAPSHOT-r201803241506",
+ org.osgi.service.useradmin;version="1.1.0"
+Bundle-ActivationPolicy: lazy
diff --git a/org.argeo.suite.cms/OSGI-INF/activitiesMaintenanceService.xml b/org.argeo.suite.cms/OSGI-INF/activitiesMaintenanceService.xml
new file mode 100644 (file)
index 0000000..6d8105f
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="Activities Maintenance Service">
+   <implementation class="org.argeo.activities.core.ActivitiesMaintenanceService"/>
+   <service>
+      <provide interface="org.argeo.connect.AppMaintenanceService"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/activitiesService.xml b/org.argeo.suite.cms/OSGI-INF/activitiesService.xml
new file mode 100644 (file)
index 0000000..c84eaa2
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="Activities Service">
+   <implementation class="org.argeo.activities.core.ActivitiesServiceImpl"/>
+   <reference bind="setResourcesService" cardinality="1..1" interface="org.argeo.connect.resources.ResourcesService" name="ResourcesService" policy="static"/>
+   <service>
+      <provide interface="org.argeo.activities.ActivitiesService"/>
+      <provide interface="org.argeo.connect.AppService"/>
+   </service>
+   <reference bind="setUserAdminService" cardinality="1..1" interface="org.argeo.connect.UserAdminService" name="UserAdminService" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/peopleMaintenanceService.xml b/org.argeo.suite.cms/OSGI-INF/peopleMaintenanceService.xml
new file mode 100644 (file)
index 0000000..0aa8705
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="People Maintenance Service">
+   <implementation class="org.argeo.people.core.PeopleMaintenanceService"/>
+   <service>
+      <provide interface="org.argeo.connect.AppMaintenanceService"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/peopleService.xml b/org.argeo.suite.cms/OSGI-INF/peopleService.xml
new file mode 100644 (file)
index 0000000..b734946
--- /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" immediate="true" name="peopleService">
+   <implementation class="org.argeo.people.core.PeopleServiceImpl"/>
+   <service>
+      <provide interface="org.argeo.connect.AppService"/>
+      <provide interface="org.argeo.people.PeopleService"/>
+   </service>
+   <reference bind="setResourcesService" cardinality="1..1" interface="org.argeo.connect.resources.ResourcesService" name="ResourcesService" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/resourcesMaintenanceService.xml b/org.argeo.suite.cms/OSGI-INF/resourcesMaintenanceService.xml
new file mode 100644 (file)
index 0000000..52450ee
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="Resources Maintenance Service">
+   <implementation class="org.argeo.connect.resources.core.ResourcesMaintenanceService"/>
+   <service>
+      <provide interface="org.argeo.connect.AppMaintenanceService"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/resourcesService.xml b/org.argeo.suite.cms/OSGI-INF/resourcesService.xml
new file mode 100644 (file)
index 0000000..5f7bce1
--- /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" immediate="true" name="Resources Service">
+   <implementation class="org.argeo.connect.resources.core.ResourcesServiceImpl"/>
+   <service>
+      <provide interface="org.argeo.connect.resources.ResourcesService"/>
+      <provide interface="org.argeo.connect.AppService"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/systemAppService.xml b/org.argeo.suite.cms/OSGI-INF/systemAppService.xml
new file mode 100644 (file)
index 0000000..fd7f32a
--- /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" immediate="true" name="System App Service">
+   <implementation class="org.argeo.connect.core.DynamicSystemAppService"/>
+   <service>
+      <provide interface="org.argeo.connect.SystemAppService"/>
+   </service>
+   <reference bind="addAppService" cardinality="0..n" interface="org.argeo.connect.AppService" name="AppService" policy="dynamic" unbind="removeAppService"/>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/systemMaintenanceService.xml b/org.argeo.suite.cms/OSGI-INF/systemMaintenanceService.xml
new file mode 100644 (file)
index 0000000..511d285
--- /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" activate="init" immediate="true" name="System Maintenance Service">
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static"/>
+   <service>
+      <provide interface="org.argeo.connect.SystemMaintenanceService"/>
+   </service>
+   <reference bind="addAppService" cardinality="0..n" interface="org.argeo.connect.AppMaintenanceService" name="AppMaintenanceService" policy="static"/>
+   <implementation class="org.argeo.connect.core.DynamicSystemMaintenanceService"/>
+</scr:component>
diff --git a/org.argeo.suite.cms/OSGI-INF/userManagerService.xml b/org.argeo.suite.cms/OSGI-INF/userManagerService.xml
new file mode 100644 (file)
index 0000000..f568a05
--- /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" immediate="true" name="User Manager Service">
+   <implementation class="org.argeo.connect.core.UserAdminServiceImpl"/>
+   <service>
+      <provide interface="org.argeo.connect.UserAdminService"/>
+   </service>
+   <reference bind="setUserAdmin" cardinality="1..1" interface="org.osgi.service.useradmin.UserAdmin" name="UserAdmin" policy="static"/>
+   <reference bind="setUserTransaction" cardinality="1..1" interface="javax.transaction.UserTransaction" name="UserTransaction" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.cms/bnd.bnd b/org.argeo.suite.cms/bnd.bnd
new file mode 100644 (file)
index 0000000..687d79b
--- /dev/null
@@ -0,0 +1,11 @@
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/systemAppService.xml,\
+ OSGI-INF/userManagerService.xml,\
+ OSGI-INF/resourcesService.xml,\
+ OSGI-INF/activitiesService.xml,\
+ OSGI-INF/peopleService.xml,\
+ OSGI-INF/systemMaintenanceService.xml,\
+ OSGI-INF/activitiesMaintenanceService.xml,\
+ OSGI-INF/resourcesMaintenanceService.xml,\
+ OSGI-INF/peopleMaintenanceService.xml
\ No newline at end of file
diff --git a/org.argeo.suite.cms/build.properties b/org.argeo.suite.cms/build.properties
new file mode 100644 (file)
index 0000000..f673b42
--- /dev/null
@@ -0,0 +1,13 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/resourcesService.xml,\
+               OSGI-INF/activitiesService.xml,\
+               OSGI-INF/systemAppService.xml,\
+               OSGI-INF/userManagerService.xml,\
+               OSGI-INF/peopleService.xml,\
+               OSGI-INF/systemMaintenanceService.xml,\
+               OSGI-INF/activitiesMaintenanceService.xml,\
+               OSGI-INF/resourcesMaintenanceService.xml,\
+               OSGI-INF/peopleMaintenanceService.xml
+source.. = src/
diff --git a/org.argeo.suite.e4.rap/.classpath b/org.argeo.suite.e4.rap/.classpath
new file mode 100644 (file)
index 0000000..eca7bdb
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.suite.e4.rap/.gitignore b/org.argeo.suite.e4.rap/.gitignore
new file mode 100644 (file)
index 0000000..ae3c172
--- /dev/null
@@ -0,0 +1 @@
+/bin/
diff --git a/org.argeo.suite.e4.rap/.project b/org.argeo.suite.e4.rap/.project
new file mode 100644 (file)
index 0000000..ab1169e
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.suite.e4.rap</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.suite.e4.rap/META-INF/.gitignore b/org.argeo.suite.e4.rap/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.suite.e4.rap/META-INF/MANIFEST.MF b/org.argeo.suite.e4.rap/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..9656163
--- /dev/null
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Rap
+Bundle-SymbolicName: org.argeo.suite.e4.rap
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.argeo.activities.e4,
+ org.argeo.activities.e4.parts,
+ org.argeo.cms.e4.rap;version="2.1.73.SNAPSHOT-r201803221729",
+ org.argeo.connect.e4,
+ org.argeo.connect.ui;version="2.1.79.SNAPSHOT-r201803241506",
+ org.argeo.people.e4,
+ org.eclipse.rap.rwt.application;version="3.4.0"
+Service-Component: OSGI-INF/argeo-office-rap.xml,OSGI-INF/systemE4Service.xml,OSGI-INF/activitiesE4Service.xml,
+ OSGI-INF/peopleE4Service.xml
diff --git a/org.argeo.suite.e4.rap/OSGI-INF/activitiesE4Service.xml b/org.argeo.suite.e4.rap/OSGI-INF/activitiesE4Service.xml
new file mode 100644 (file)
index 0000000..109745d
--- /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" immediate="true" name="Activities Service">
+   <implementation class="org.argeo.activities.e4.ActivitiesE4Service"/>
+   <service>
+      <provide interface="org.argeo.connect.ui.AppWorkbenchService"/>
+   </service>
+   <reference bind="setUserAdminService" cardinality="1..1" interface="org.argeo.connect.UserAdminService" name="UserAdminService" policy="static"/>
+   <reference bind="setActivitiesService" cardinality="1..1" interface="org.argeo.activities.ActivitiesService" name="ActivitiesService" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.e4.rap/OSGI-INF/argeo-office-rap.xml b/org.argeo.suite.e4.rap/OSGI-INF/argeo-office-rap.xml
new file mode 100644 (file)
index 0000000..126ca5b
--- /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" configuration-policy="optional" name="CMS Admin RAP">
+   <implementation class="org.argeo.suite.e4.rap.ArgeoOfficeRapE4App"/>
+   <service>
+      <provide interface="org.eclipse.rap.rwt.application.ApplicationConfiguration"/>
+      <property name="contextName" type="String" value="suite"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.e4.rap/OSGI-INF/peopleE4Service.xml b/org.argeo.suite.e4.rap/OSGI-INF/peopleE4Service.xml
new file mode 100644 (file)
index 0000000..32c6e5f
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="People E4 Service">
+   <implementation class="org.argeo.people.e4.PeopleE4Service"/>
+   <service>
+      <provide interface="org.argeo.connect.ui.AppWorkbenchService"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.suite.e4.rap/OSGI-INF/systemE4Service.xml b/org.argeo.suite.e4.rap/OSGI-INF/systemE4Service.xml
new file mode 100644 (file)
index 0000000..1d758e2
--- /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" immediate="true" name="System E4 Service">
+   <implementation class="org.argeo.connect.e4.SystemE4Service"/>
+   <service>
+      <provide interface="org.eclipse.e4.core.contexts.IContextFunction"/>
+   </service>
+   <reference bind="addAppService" cardinality="0..n" interface="org.argeo.connect.ui.AppWorkbenchService" name="AppWorkbenchService" policy="dynamic" unbind="removeAppService"/>
+   <property name="service.context.key" type="String" value="org.argeo.connect.ui.SystemWorkbenchService"/>
+</scr:component>
diff --git a/org.argeo.suite.e4.rap/bnd.bnd b/org.argeo.suite.e4.rap/bnd.bnd
new file mode 100644 (file)
index 0000000..e313a60
--- /dev/null
@@ -0,0 +1,7 @@
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/argeo-office-rap.xml
+
+Import-Package: org.argeo.node,\
+org.eclipse.swt,\
+org.eclipse.rap.rwt.client,\
+*
diff --git a/org.argeo.suite.e4.rap/build.properties b/org.argeo.suite.e4.rap/build.properties
new file mode 100644 (file)
index 0000000..7d8239f
--- /dev/null
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/systemE4Service.xml,\
+               OSGI-INF/activitiesE4Service.xml,\
+               OSGI-INF/peopleE4Service.xml
+source.. = src/
diff --git a/org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoOfficeRapE4App.java b/org.argeo.suite.e4.rap/src/org/argeo/suite/e4/rap/ArgeoOfficeRapE4App.java
new file mode 100644 (file)
index 0000000..473406f
--- /dev/null
@@ -0,0 +1,13 @@
+package org.argeo.suite.e4.rap;
+
+import org.argeo.cms.e4.rap.AbstractRapE4App;
+
+public class ArgeoOfficeRapE4App extends AbstractRapE4App {
+
+       public ArgeoOfficeRapE4App() {
+               setPageTitle("Argeo Office");
+               setE4Xmi("org.argeo.suite.e4/e4xmi/argeo-office.e4xmi");
+               setPath("/office");
+       }
+
+}
diff --git a/org.argeo.suite.e4/.classpath b/org.argeo.suite.e4/.classpath
new file mode 100644 (file)
index 0000000..eca7bdb
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.suite.e4/.gitignore b/org.argeo.suite.e4/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.suite.e4/.project b/org.argeo.suite.e4/.project
new file mode 100644 (file)
index 0000000..78b3980
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.suite.e4</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.suite.e4/META-INF/.gitignore b/org.argeo.suite.e4/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.suite.e4/META-INF/MANIFEST.MF b/org.argeo.suite.e4/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..b5f2931
--- /dev/null
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0\r
+Bundle-SymbolicName: org.argeo.suite.e4\r
+Bundle-Name: E4\r
+Bundle-Version: 1.0.0.qualifier\r
+Bundle-ManifestVersion: 2\r
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8\r
+Import-Package: javax.inject;version="1.0.0",\r
+ javax.jcr;version="2.0.0",\r
+ javax.jcr.nodetype;version="2.0.0",\r
+ javax.jcr.observation;version="2.0.0",\r
+ javax.jcr.query;version="2.0.0",\r
+ org.apache.commons.logging;version="1.1.1",\r
+ org.argeo.activities;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.activities.ui;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.cms.util;version="2.1.73.SNAPSHOT-r201803221729",\r
+ org.argeo.connect;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.connect.e4.handlers,\r
+ org.argeo.connect.resources;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.connect.ui,\r
+ org.argeo.connect.ui.util;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.connect.ui.widgets;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.connect.util;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.eclipse.ui;version="2.1.73.SNAPSHOT-r201803221729",\r
+ org.argeo.jcr;version="2.1.73.SNAPSHOT-r201803221729",\r
+ org.argeo.people;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.people.e4,\r
+ org.argeo.people.e4.parts,\r
+ org.argeo.people.ui.providers;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.tracker;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.argeo.tracker.ui;version="2.1.79.SNAPSHOT-r201803241506",\r
+ org.eclipse.jface,\r
+ org.eclipse.jface.layout,\r
+ org.eclipse.jface.viewers,\r
+ org.eclipse.jface.viewers.deferred,\r
+ org.eclipse.swt,\r
+ org.eclipse.swt.events,\r
+ org.eclipse.swt.graphics,\r
+ org.eclipse.swt.layout,\r
+ org.eclipse.swt.widgets\r
+\r
diff --git a/org.argeo.suite.e4/build.properties b/org.argeo.suite.e4/build.properties
new file mode 100644 (file)
index 0000000..da84b25
--- /dev/null
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               e4xmi/argeo-office.e4xmi
+source.. = src/
diff --git a/org.argeo.suite.e4/e4xmi/argeo-office.e4xmi b/org.argeo.suite.e4/e4xmi/argeo-office.e4xmi
new file mode 100644 (file)
index 0000000..263881f
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="ASCII"?>
+<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_bQjNYDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.application">
+  <children xsi:type="basic:TrimmedWindow" xmi:id="_dKIlMDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.trimmedwindow.0">
+    <persistedState key="styleOverride" value="8"/>
+    <tags>shellMaximized</tags>
+    <children xsi:type="advanced:PerspectiveStack" xmi:id="_gm_toDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.perspectivestack.0">
+      <children xsi:type="advanced:Perspective" xmi:id="_hr-YsDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.perspective.dashboard" label="Dashboard">
+        <children xsi:type="basic:PartSashContainer" xmi:id="_mAC18DAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partsashcontainer.0" horizontal="true">
+          <children xsi:type="basic:PartStack" xmi:id="_orJxUDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partstack.0" containerData="4000">
+            <children xsi:type="basic:Part" xmi:id="_qAM4sDAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.part.search" containerData="" contributionURI="bundleclass://org.argeo.suite.e4/org.argeo.suite.e4.parts.QuickSearchView" label="Search"/>
+          </children>
+          <children xsi:type="basic:PartStack" xmi:id="_vLza4DAVEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partstack.1" containerData="6000">
+            <tags>entityEditorArea</tags>
+          </children>
+        </children>
+      </children>
+    </children>
+    <trimBars xmi:id="_24OSADArEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.trimbar.0">
+      <children xsi:type="menu:ToolBar" xmi:id="_3e5QcDArEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.toolbar.0">
+        <children xsi:type="menu:HandledToolItem" xmi:id="_4Ssr8DArEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.handledtoolitem.createTask" label="New Task" iconURI="platform:/plugin/org.argeo.theme.argeo2/icons/types/task.png" command="_2Xkt8DApEei3AbO1ldMI0w">
+          <parameters xmi:id="_NYpK8DAsEei3AbO1ldMI0w" elementId="targetNodeType" name="targetNodeType" value="activities:task"/>
+        </children>
+        <children xsi:type="menu:HandledToolItem" xmi:id="_p_MsIDBiEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.handledtoolitem.createPerson" label="New Person" iconURI="platform:/plugin/org.argeo.theme.argeo2/icons/types/person.png" command="_2Xkt8DApEei3AbO1ldMI0w">
+          <parameters xmi:id="_6LHhIDBiEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.parameter.0" name="targetNodeType" value="people:person"/>
+        </children>
+        <children xsi:type="menu:HandledToolItem" xmi:id="_cnaWMDBjEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.handledtoolitem.neworg" label="New Org" iconURI="platform:/plugin/org.argeo.theme.argeo2/icons/types/organisation.png" command="_2Xkt8DApEei3AbO1ldMI0w">
+          <parameters xmi:id="_iEUDwDBjEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.parameter.1" name="targetNodeType" value="people:org"/>
+        </children>
+      </children>
+    </trimBars>
+  </children>
+  <handlers xmi:id="_ipB00DArEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.handler.0" contributionURI="bundleclass://org.argeo.connect.e4/org.argeo.connect.e4.handlers.CreateEntity" command="_2Xkt8DApEei3AbO1ldMI0w"/>
+  <descriptors xmi:id="_pud7kDAtEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partdescriptor.taskEditor" label="Task" allowMultiple="true" category="entityEditorArea" closeable="true" dirtyable="true" contributionURI="bundleclass://org.argeo.connect.e4/org.argeo.activities.e4.parts.TaskEditor"/>
+  <descriptors xmi:id="_JsNs8DBiEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partdescriptor.personEditor" label="Person" allowMultiple="true" category="entityEditorArea" closeable="true" dirtyable="true" contributionURI="bundleclass://org.argeo.connect.e4/org.argeo.people.e4.parts.PersonEditor"/>
+  <descriptors xmi:id="_RxqxIDBiEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.partdescriptor.orgEditor" label="Organisation" allowMultiple="true" category="entityEditorArea" closeable="true" dirtyable="true" contributionURI="bundleclass://org.argeo.connect.e4/org.argeo.people.e4.parts.OrgEditor"/>
+  <commands xmi:id="_2Xkt8DApEei3AbO1ldMI0w" elementId="org.argeo.suite.e4.command.createEntity" commandName="Create">
+    <parameters xmi:id="_GnXrcDAsEei3AbO1ldMI0w" elementId="targetNodeType" name="targetNodeType" optional="false"/>
+  </commands>
+  <addons xmi:id="_bQjNYTAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+  <addons xmi:id="_bQjNYjAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+  <addons xmi:id="_bQjNYzAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
+  <addons xmi:id="_bQjNZDAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
+  <addons xmi:id="_bQjNZTAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
+  <addons xmi:id="_bQjNZjAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
+  <addons xmi:id="_bQjNZzAVEei3AbO1ldMI0w" elementId="org.eclipse.e4.ui.workbench.handler.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
+</application:Application>
diff --git a/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/EntitySingleColumnLabelProvider.java b/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/EntitySingleColumnLabelProvider.java
new file mode 100644 (file)
index 0000000..490ae13
--- /dev/null
@@ -0,0 +1,114 @@
+package org.argeo.suite.e4.parts;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.activities.ActivitiesService;
+import org.argeo.activities.ActivitiesTypes;
+import org.argeo.activities.ui.ActivityListLabelProvider;
+import org.argeo.connect.resources.ResourcesService;
+import org.argeo.connect.ui.ConnectUiConstants;
+import org.argeo.connect.ui.SystemWorkbenchService;
+import org.argeo.connect.ui.util.TagLabelProvider;
+import org.argeo.connect.util.ConnectUtils;
+import org.argeo.people.PeopleException;
+import org.argeo.people.PeopleNames;
+import org.argeo.people.PeopleService;
+import org.argeo.people.PeopleTypes;
+import org.argeo.people.ui.providers.GroupLabelProvider;
+import org.argeo.people.ui.providers.OrgListLabelProvider;
+import org.argeo.people.ui.providers.PersonListLabelProvider;
+import org.argeo.tracker.TrackerTypes;
+import org.argeo.tracker.ui.TrackerSingleColLP;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Provide a single column label provider for entity lists. Icon and displayed
+ * text vary with the element node type
+ */
+public class EntitySingleColumnLabelProvider implements PeopleNames, ILabelProvider {
+       private static final long serialVersionUID = 3111885324210673320L;
+
+       private SystemWorkbenchService systemWorkbenchService;
+
+       private ActivityListLabelProvider activityLP;
+       private TrackerSingleColLP trackerLP;
+       private OrgListLabelProvider orgLp;
+       private PersonListLabelProvider personLp;
+       private GroupLabelProvider groupLp = new GroupLabelProvider(ConnectUiConstants.LIST_TYPE_SMALL);
+       private TagLabelProvider mlInstanceLp;
+
+       public EntitySingleColumnLabelProvider(ResourcesService resourceService, ActivitiesService activitiesService,
+                       PeopleService peopleService, SystemWorkbenchService systemWorkbenchService) {
+               this.systemWorkbenchService = systemWorkbenchService;
+               activityLP = new ActivityListLabelProvider(activitiesService);
+               trackerLP = new TrackerSingleColLP(activitiesService);
+               personLp = new PersonListLabelProvider(peopleService);
+               orgLp = new OrgListLabelProvider(resourceService, peopleService);
+               mlInstanceLp = new TagLabelProvider(resourceService, ConnectUiConstants.LIST_TYPE_SMALL);
+       }
+
+       @Override
+       public String getText(Object element) {
+               try {
+                       Node entity = (Node) element;
+                       String result;
+
+                       if (entity.isNodeType(TrackerTypes.TRACKER_TASK) || entity.isNodeType(TrackerTypes.TRACKER_PROJECT)
+                                       || entity.isNodeType(TrackerTypes.TRACKER_MILESTONE))
+                               result = trackerLP.getText(element);
+                       else if (entity.isNodeType(ActivitiesTypes.ACTIVITIES_ACTIVITY))
+                               result = activityLP.getText(element);
+                       else if (entity.isNodeType(PeopleTypes.PEOPLE_PERSON))
+                               result = personLp.getText(element);
+                       else if (entity.isNodeType(PeopleTypes.PEOPLE_ORG))
+                               result = orgLp.getText(element);
+                       else if (entity.isNodeType(PeopleTypes.PEOPLE_MAILING_LIST))
+                               result = mlInstanceLp.getText(element);
+                       else if (entity.isNodeType(PeopleTypes.PEOPLE_GROUP))
+                               result = groupLp.getText(element);
+                       else if (entity.isNodeType(NodeType.MIX_TITLE) && entity.hasProperty(Property.JCR_TITLE))
+                               result = entity.getProperty(Property.JCR_TITLE).getString();
+                       else
+                               result = "";
+                       return ConnectUtils.replaceAmpersand(result);
+               } catch (RepositoryException re) {
+                       throw new PeopleException("Unable to get formatted value for node", re);
+               }
+       }
+
+       /** Overwrite this method to provide project specific images */
+       @Override
+       public Image getImage(Object element) {
+               return systemWorkbenchService.getIconForType((Node) element);
+       }
+
+       @Override
+       public void addListener(ILabelProviderListener listener) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void dispose() {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public boolean isLabelProperty(Object element, String property) {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public void removeListener(ILabelProviderListener listener) {
+               // TODO Auto-generated method stub
+
+       }
+
+}
diff --git a/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/QuickSearchView.java b/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/QuickSearchView.java
new file mode 100644 (file)
index 0000000..3f95d8c
--- /dev/null
@@ -0,0 +1,256 @@
+package org.argeo.suite.e4.parts;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.notEmpty;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.jcr.NodeIterator;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.activities.ActivitiesService;
+import org.argeo.cms.util.CmsUtils;
+import org.argeo.connect.ConnectException;
+import org.argeo.connect.ConnectTypes;
+import org.argeo.connect.resources.ResourcesService;
+import org.argeo.connect.ui.ConnectUiConstants;
+import org.argeo.connect.ui.Refreshable;
+import org.argeo.connect.ui.SystemWorkbenchService;
+import org.argeo.connect.ui.util.BasicNodeListContentProvider;
+import org.argeo.connect.ui.util.JcrViewerDClickListener;
+import org.argeo.connect.ui.widgets.DelayedText;
+import org.argeo.connect.util.ConnectJcrUtils;
+import org.argeo.connect.util.XPathUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.people.PeopleService;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+
+/** A table with a quick search field. */
+public class QuickSearchView implements Refreshable {
+       private final static Log log = LogFactory.getLog(QuickSearchView.class);
+       // public static final String ID = AsUiPlugin.PLUGIN_ID + ".quickSearchView";
+
+       /* DEPENDENCY INJECTION */
+       @Inject
+       private Repository repository;
+       @Inject
+       private ResourcesService resourcesService;
+       @Inject
+       private ActivitiesService activitiesService;
+       @Inject
+       private PeopleService peopleService;
+       @Inject
+       private SystemWorkbenchService systemWorkbenchService;
+
+       // This page widgets
+       private TableViewer entityViewer;
+       private Text filterTxt;
+
+       private Session session;
+
+       // @Override
+       // public void init(IViewSite site) throws PartInitException {
+       // super.init(site);
+       // }
+
+       @PostConstruct
+       public void createPartControl(Composite parent) {
+               session = ConnectJcrUtils.login(repository);
+               // MainLayout
+               parent.setLayout(new GridLayout());
+               addFilterPanel(parent);
+               entityViewer = createListPart(parent, new EntitySingleColumnLabelProvider(resourcesService, activitiesService,
+                               peopleService, systemWorkbenchService));
+               refreshFilteredList();
+
+               try {
+                       session.getWorkspace().getObservationManager().addEventListener(new EventListener() {
+
+                               @Override
+                               public void onEvent(EventIterator events) {
+                                       parent.getDisplay().asyncExec(() -> refreshFilteredList());
+                               }
+                       }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true, null,
+                                       new String[] { ConnectTypes.CONNECT_ENTITY }, true);
+               } catch (RepositoryException e) {
+                       throw new ConnectException("Cannot add JCR observer", e);
+               }
+
+       }
+
+       private void addFilterPanel(Composite parent) {
+               // Use a delayed text: the query won't be done until the user stop
+               // typing for 800ms
+               int style = SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL;
+               DelayedText delayedText = new DelayedText(parent, style, ConnectUiConstants.SEARCH_TEXT_DELAY);
+               filterTxt = delayedText.getText();
+               filterTxt.setLayoutData(EclipseUiUtils.fillWidth());
+
+               // final ServerPushSession pushSession = new ServerPushSession();
+               delayedText.addDelayedModifyListener(null, new ModifyListener() {
+                       private static final long serialVersionUID = 5003010530960334977L;
+
+                       public void modifyText(ModifyEvent event) {
+                               delayedText.getText().getDisplay().asyncExec(new Runnable() {
+                                       @Override
+                                       public void run() {
+                                               refreshFilteredList();
+                                       }
+                               });
+                               // pushSession.stop();
+                       }
+               });
+
+               // Jump to the first item of the list using the down arrow
+               filterTxt.addKeyListener(new KeyListener() {
+                       private static final long serialVersionUID = -4523394262771183968L;
+
+                       @Override
+                       public void keyReleased(KeyEvent e) {
+                       }
+
+                       @Override
+                       public void keyPressed(KeyEvent e) {
+                               // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
+                               // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
+                               if (e.keyCode == SWT.ARROW_DOWN || e.keyCode == SWT.TAB) {
+                                       Object first = entityViewer.getElementAt(0);
+                                       if (first != null) {
+                                               entityViewer.getTable().setFocus();
+                                               entityViewer.setSelection(new StructuredSelection(first), true);
+                                       }
+                                       e.doit = false;
+                               }
+                       }
+               });
+       }
+
+       protected TableViewer createListPart(Composite parent, ILabelProvider labelProvider) {
+               parent.setLayout(new GridLayout());
+
+               Composite tableComposite = new Composite(parent, SWT.NONE);
+               GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_VERTICAL
+                               | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+               tableComposite.setLayoutData(gd);
+
+               TableViewer v = new TableViewer(tableComposite);
+               v.setLabelProvider(labelProvider);
+
+               TableColumn singleColumn = new TableColumn(v.getTable(), SWT.V_SCROLL);
+               TableColumnLayout tableColumnLayout = new TableColumnLayout();
+               tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(85));
+               tableComposite.setLayout(tableColumnLayout);
+
+               // Corresponding table & style
+               Table table = v.getTable();
+               table.setLinesVisible(true);
+               table.setHeaderVisible(false);
+               CmsUtils.markup(table);
+               CmsUtils.setItemHeight(table, 26);
+
+               v.setContentProvider(new BasicNodeListContentProvider());
+               v.addDoubleClickListener(new JcrViewerDClickListener(systemWorkbenchService));
+               return v;
+       }
+
+       @PreDestroy
+       public void dispose() {
+               JcrUtils.logoutQuietly(session);
+       }
+
+       
+       public void setFocus() {
+               refreshFilteredList();
+               filterTxt.setFocus();
+       }
+
+       @Override
+       public void forceRefresh(Object object) {
+               refreshFilteredList();
+       }
+
+       protected void refreshFilteredList() {
+               try {
+                       String filter = filterTxt.getText();
+                       // Prevents the query on the full repository
+                       // if (isEmpty(filter)) {
+                       // entityViewer.setInput(null);
+                       // return;
+                       // }
+
+                       // XPATH Query
+                       String xpathQueryStr = "//element(*, " + ConnectTypes.CONNECT_ENTITY + ")";
+                       String xpathFilter = XPathUtils.getFreeTextConstraint(filter);
+                       if (notEmpty(xpathFilter))
+                               xpathQueryStr += "[" + xpathFilter + "]";
+
+                       // boolean doOrder = orderResultsBtn != null
+                       // && !(orderResultsBtn.isDisposed())
+                       // && orderResultsBtn.getSelection();
+                       // if (doOrder) {
+                       // xpathQueryStr += " order by jcr:title";
+                       // }
+
+                       long begin = System.currentTimeMillis();
+                       Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
+
+                       xpathQuery.setLimit(ConnectUiConstants.SEARCH_DEFAULT_LIMIT);
+                       QueryResult result = xpathQuery.execute();
+
+                       NodeIterator nit = result.getNodes();
+                       entityViewer.setInput(JcrUtils.nodeIteratorToList(nit));
+                       if (log.isDebugEnabled()) {
+                               long end = System.currentTimeMillis();
+                               log.debug("Quick Search - Found: " + nit.getSize() + " in " + (end - begin)
+                                               + " ms by executing XPath query (" + xpathQueryStr + ").");
+                       }
+               } catch (RepositoryException e) {
+                       throw new ConnectException("Unable to list entities", e);
+               }
+       }
+
+//     public void setRepository(Repository repository) {
+//             this.repository = repository;
+//     }
+//
+//     public void setResourcesService(ResourcesService resourcesService) {
+//             this.resourcesService = resourcesService;
+//     }
+//
+//     public void setActivitiesService(ActivitiesService activitiesService) {
+//             this.activitiesService = activitiesService;
+//     }
+//
+//     public void setPeopleService(PeopleService peopleService) {
+//             this.peopleService = peopleService;
+//     }
+//
+//     public void setSystemWorkbenchService(SystemWorkbenchService systemWorkbenchService) {
+//             this.systemWorkbenchService = systemWorkbenchService;
+//     }
+}
diff --git a/sdk/argeo-office-e4-rap.properties b/sdk/argeo-office-e4-rap.properties
new file mode 100644 (file)
index 0000000..55323c7
--- /dev/null
@@ -0,0 +1,30 @@
+argeo.osgi.start.2.node=\
+org.eclipse.equinox.http.servlet,\
+org.eclipse.equinox.http.jetty,\
+org.eclipse.equinox.metatype,\
+org.eclipse.equinox.cm,\
+org.eclipse.rap.rwt.osgi
+
+argeo.osgi.start.3.node=\
+org.argeo.cms,\
+org.argeo.suite.cms
+
+argeo.osgi.start.5.node=\
+org.argeo.suite.e4.rap
+
+# Local
+argeo.node.repo.type=h2
+org.osgi.service.http.port=7070
+#org.osgi.service.http.port.secure=7073
+
+# Logging
+log4j.configuration=file:../../log4j.properties
+
+# DON'T CHANGE BELOW
+org.eclipse.equinox.http.jetty.autostart=false
+org.osgi.framework.bootdelegation=com.sun.jndi.ldap,\
+com.sun.jndi.ldap.sasl,\
+com.sun.security.jgss,\
+com.sun.jndi.dns,\
+com.sun.nio.file,\
+com.sun.nio.sctp