Reintegrate RCP into Commons
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 5 Jan 2022 07:15:17 +0000 (08:15 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 5 Jan 2022 07:15:17 +0000 (08:15 +0100)
105 files changed:
dep/org.argeo.dep.cms.e4.rcp/.gitignore [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/META-INF/.gitignore [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/bnd.bnd [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/p2.inf [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/pom.xml [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86.xml [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86_64.xml [new file with mode: 0644]
dep/org.argeo.dep.cms.e4.rcp/src/assembly/win32.x86.xml [new file with mode: 0644]
dep/org.argeo.dep.cms.ui.rcp/.gitignore [new file with mode: 0644]
dep/org.argeo.dep.cms.ui.rcp/META-INF/.gitignore [new file with mode: 0644]
dep/org.argeo.dep.cms.ui.rcp/bnd.bnd [new file with mode: 0644]
dep/org.argeo.dep.cms.ui.rcp/p2.inf [new file with mode: 0644]
dep/org.argeo.dep.cms.ui.rcp/pom.xml [new file with mode: 0644]
dep/pom.xml
pom.xml
rcp/cnf/maven.bnd [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/.classpath [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/.project [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/META-INF/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/argeo-companion.e4xmi [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/argeo-companion.properties [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/bnd.bnd [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/build.properties [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/log4j.properties [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/plugin.xml [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/pom.xml [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java [new file with mode: 0644]
rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsRcpLifeCycle.java [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/.classpath [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/.project [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/bnd.bnd [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/build.properties [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/pom.xml [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/.classpath [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/.gitignore [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/.project [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/META-INF/.gitignore [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/bnd.bnd [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/build.properties [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/pom.xml [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopImages.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniHomePart.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/cheatsheet_obj@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/console_view@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/delete@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/external_browser@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/file_obj@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/fldr_obj@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/nav_home@2x.png [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/.classpath [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/.gitignore [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/.project [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/META-INF/.gitignore [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/bnd.bnd [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/build.properties [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/pom.xml [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpClient.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpResourceManager.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileDialog.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileUpload.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/DefaultNLS.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiConstants.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiSpecificUtils.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/FileDropAdapter.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileDetails.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadEvent.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadHandler.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadListener.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadReceiver.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/RWT.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/SingletonUtil.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/AbstractEntryPoint.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/Application.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ApplicationConfiguration.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPoint.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPointFactory.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ExceptionHandler.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/Client.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/WebClient.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigation.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationEvent.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationListener.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/ClientService.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/JavaScriptExecutor.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/UrlLauncher.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceLoader.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceManager.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ServerPushSession.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/DropDown.java [new file with mode: 0644]
rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/FileUpload.java [new file with mode: 0644]
rcp/pom.xml [new file with mode: 0644]

diff --git a/dep/org.argeo.dep.cms.e4.rcp/.gitignore b/dep/org.argeo.dep.cms.e4.rcp/.gitignore
new file mode 100644 (file)
index 0000000..5e85f8d
--- /dev/null
@@ -0,0 +1,3 @@
+/org.argeo.security.dep.node.rcp-maven.target
+/target/
+/*.target
diff --git a/dep/org.argeo.dep.cms.e4.rcp/META-INF/.gitignore b/dep/org.argeo.dep.cms.e4.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/dep/org.argeo.dep.cms.e4.rcp/bnd.bnd b/dep/org.argeo.dep.cms.e4.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/dep/org.argeo.dep.cms.e4.rcp/p2.inf b/dep/org.argeo.dep.cms.e4.rcp/p2.inf
new file mode 100644 (file)
index 0000000..0423aa5
--- /dev/null
@@ -0,0 +1,2 @@
+properties.1.name=org.eclipse.equinox.p2.type.category
+properties.1.value=true
\ No newline at end of file
diff --git a/dep/org.argeo.dep.cms.e4.rcp/pom.xml b/dep/org.argeo.dep.cms.e4.rcp/pom.xml
new file mode 100644 (file)
index 0000000..70c3d3e
--- /dev/null
@@ -0,0 +1,587 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons</groupId>
+               <artifactId>dep</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.dep.cms.e4.rcp</artifactId>
+       <name>CMS Platform Eclipse 4 RCP</name>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.dep.cms.ui.rcp</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+                       <type>pom</type>
+               </dependency>
+
+               <!-- E4 specific -->
+               <dependency>
+                       <groupId>org.argeo.commons.rcp</groupId>
+                       <artifactId>org.argeo.cms.e4.rcp</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+
+               <!-- Argeo Commons -->
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.e4</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+
+               <!-- SDK -->
+               <dependency>
+                       <groupId>org.argeo.tp.equinox</groupId>
+                       <artifactId>org.eclipse.osgi</artifactId>
+                       <scope>test</scope>
+               </dependency>
+
+               <!-- Additional text components (not in RCP distribution) -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.text</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.jface.text</artifactId>
+               </dependency>
+
+
+               <!-- RCP -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.css.swt.theme</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench.swt</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.di</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.databinding</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.bindings</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.model.workbench</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.jface.databinding</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench.addons.swt</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.services</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.commands</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.felix.gogo.shell</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.widgets</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.di.extensions.supplier</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.expressions</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>com.ibm.icu</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.swt.gtk</artifactId>
+               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.emf.xpath</artifactId> -->
+               <!-- </dependency> -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.databinding.observable</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.rcp</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.help</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench.renderers.swt</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.databinding.property</artifactId>
+               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.apache.commons.io</artifactId> -->
+               <!-- </dependency> -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.di</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.dialogs</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.di.extensions</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.equinox.bidi</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.di.annotations</artifactId>
+               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.apache.commons.logging</artifactId> -->
+               <!-- <version>1.2.0.v20180409-1502</version> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.apache.felix.gogo.command</artifactId> -->
+               <!-- <version>1.0.2.v20170914-1324</version> -->
+               <!-- </dependency> -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench3</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.core.contexts</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.databinding.beans</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.ui.workbench</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.services</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.ui</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench</artifactId>
+               </dependency>
+
+               <!-- Platform dependent -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.workbench.renderers.swt.cocoa</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.ui.cocoa</artifactId>
+               </dependency>
+
+
+               <!-- RCP -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp</groupId> -->
+               <!-- <artifactId>argeo-tp-rcp-e4</artifactId> -->
+               <!-- <version>${version.argeo-tp}</version> -->
+               <!-- <exclusions> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.osgi</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.osgi.services</artifactId> -->
+               <!-- </exclusion> -->
+
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.osgi.compatibility.state</artifactId> -->
+               <!-- </exclusion> -->
+
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.update.configurator</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.carbon.macosx</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.solaris.sparc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.solaris.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.motif.solaris.sparc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.s390</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.s390x</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.motif.linux.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.photon.qnx.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.motif.aix.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.motif.aix.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.motif.hpux.ia64_32</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.aix.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.aix.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.hpux.ia64_32</artifactId> -->
+               <!-- </exclusion> -->
+
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.carbon.macosx</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.solaris.sparc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.solaris.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.motif.solaris.sparc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.s390</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.s390x</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.motif.linux.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.photon.qnx.x86</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.motif.aix.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.motif.aix.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.motif.hpux.ia64_32</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.aix.ppc</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.aix.ppc64</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.hpux.ia64_32</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- <exclusion> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.ui.carbon</artifactId> -->
+               <!-- </exclusion> -->
+               <!-- </exclusions> -->
+               <!-- </dependency> -->
+
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.ui.di</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.di</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.di.extensions.supplier</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.ui.model.workbench</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.contexts</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.services</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.di.annotations</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.ui.services</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.e4.core.di.extensions</artifactId> -->
+               <!-- </dependency> -->
+
+               <!-- Taking EMF from RAP -->
+               <!-- FIXME investigate why we have to -->
+               <dependency>
+                       <groupId>org.argeo.tp.rap.e4</groupId>
+                       <artifactId>org.eclipse.emf.common</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rap.e4</groupId>
+                       <artifactId>org.eclipse.emf.ecore</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rap.e4</groupId>
+                       <artifactId>org.eclipse.emf.ecore.change</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rap.e4</groupId>
+                       <artifactId>org.eclipse.emf.ecore.xmi</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rap.e4</groupId>
+                       <artifactId>org.eclipse.e4.emf.xpath</artifactId>
+               </dependency>
+
+
+       </dependencies>
+       <dependencyManagement>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.argeo.tp</groupId>
+                               <artifactId>argeo-tp-rcp-e4</artifactId>
+                               <version>${version.argeo-tp}</version>
+                               <type>pom</type>
+                               <scope>import</scope>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+       <profiles>
+               <profile>
+                       <id>rpmbuild</id>
+                       <build>
+                               <plugins>
+                                       <plugin>
+                                               <artifactId>maven-assembly-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>prepare-source</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>single</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <descriptorRefs>
+                                                                               <descriptorRef>a2-source</descriptorRef>
+                                                                       </descriptorRefs>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                                       <plugin>
+                                               <groupId>org.codehaus.mojo</groupId>
+                                               <artifactId>rpm-maven-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>rpm-argeo</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>rpm</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <name>argeo-cms-e4-rcp${argeo.rpm.suffix}</name>
+                                                                       <mappings>
+                                                                               <mapping>
+                                                                                       <directory>/usr/lib/osgi</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <sources>
+                                                                                               <source>
+                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source</location>
+                                                                                                       <includes>
+                                                                                                               <include>**/*.jar</include>
+                                                                                                       </includes>
+                                                                                               </source>
+                                                                                       </sources>
+                                                                               </mapping>
+                                                                       </mappings>
+                                                                       <requires>
+                                                                               <require>argeo-cms-ui-rcp${argeo.rpm.suffix}</require>
+                                                                               <require>argeo-cms-e4-rcp-tp${argeo.rpm.suffix}</require>
+                                                                       </requires>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+               <profile>
+                       <id>rpmbuild-tp</id>
+                       <build>
+                               <plugins>
+                                       <plugin>
+                                               <artifactId>maven-assembly-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>prepare-source-tp</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>single</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <descriptorRefs>
+                                                                               <descriptorRef>a2-source-tp</descriptorRef>
+                                                                       </descriptorRefs>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                                       <plugin>
+                                               <groupId>org.codehaus.mojo</groupId>
+                                               <artifactId>rpm-maven-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>rpm-tp</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>rpm</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <name>argeo-cms-e4-rcp-tp${argeo.rpm.suffix}</name>
+                                                                       <projversion>${version.argeo-tp}</projversion>
+                                                                       <release>${argeo.rpm.release.tp}</release>
+                                                                       <mappings>
+                                                                               <mapping>
+                                                                                       <directory>/usr/lib/osgi</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <sources>
+                                                                                               <source>
+                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source-tp</location>
+                                                                                                       <includes>
+                                                                                                               <include>**/*.jar</include>
+                                                                                                       </includes>
+                                                                                               </source>
+                                                                                       </sources>
+                                                                               </mapping>
+                                                                               <mapping>
+                                                                                       <directory>/usr/share/osgi/boot</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <dependency>
+                                                                                               <stripVersion>true</stripVersion>
+                                                                                               <includes>
+                                                                                                       <include>org.argeo.tp.rcp.e4:org.eclipse.equinox.launcher</include>
+                                                                                               </includes>
+                                                                                       </dependency>
+                                                                               </mapping>
+                                                                       </mappings>
+                                                                       <requires>
+                                                                               <require>argeo-cms-ui-rcp-tp${argeo.rpm.suffix}</require>
+                                                                       </requires>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+       </profiles>
+</project>
diff --git a/dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86.xml b/dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86.xml
new file mode 100644 (file)
index 0000000..0b321cd
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+
+    Copyright (C) 2007-2012 Argeo GmbH
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+            http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!-- Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org> Licensed under 
+       the Apache License, Version 2.0 (the "License"); you may not use this file 
+       except in compliance with the License. You may obtain a copy of the License 
+       at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
+       law or agreed to in writing, software distributed under the License is distributed 
+       on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
+       express or implied. See the License for the specific language governing permissions 
+       and limitations under the License. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>linux.x86</id>
+       <baseDirectory>argeo-node-ui</baseDirectory>
+       <formats>
+               <format>tar.gz</format>
+       </formats>
+       <dependencySets>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>*:jar</include>
+                       </includes>
+                       <excludes>
+                               <exclude>org.eclipse.swt:org.eclipse.swt*:jar</exclude>
+                       </excludes>
+               </dependencySet>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>org.eclipse.swt:org.eclipse.swt.gtk.linux.x86:jar</include>
+                       </includes>
+               </dependencySet>
+       </dependencySets>
+</assembly>
\ No newline at end of file
diff --git a/dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86_64.xml b/dep/org.argeo.dep.cms.e4.rcp/src/assembly/linux.x86_64.xml
new file mode 100644 (file)
index 0000000..12a0a32
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+
+    Copyright (C) 2007-2012 Argeo GmbH
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+            http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!-- Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org> Licensed under 
+       the Apache License, Version 2.0 (the "License"); you may not use this file 
+       except in compliance with the License. You may obtain a copy of the License 
+       at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
+       law or agreed to in writing, software distributed under the License is distributed 
+       on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
+       express or implied. See the License for the specific language governing permissions 
+       and limitations under the License. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>linux.x86_64</id>
+       <baseDirectory>argeo-node-ui</baseDirectory>
+       <formats>
+               <format>tar.gz</format>
+       </formats>
+       <dependencySets>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>*:jar</include>
+                       </includes>
+                       <excludes>
+                               <exclude>org.eclipse.swt:org.eclipse.swt*:jar</exclude>
+                       </excludes>
+               </dependencySet>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:jar</include>
+                       </includes>
+               </dependencySet>
+       </dependencySets>
+</assembly>
\ No newline at end of file
diff --git a/dep/org.argeo.dep.cms.e4.rcp/src/assembly/win32.x86.xml b/dep/org.argeo.dep.cms.e4.rcp/src/assembly/win32.x86.xml
new file mode 100644 (file)
index 0000000..15cec0d
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+
+    Copyright (C) 2007-2012 Argeo GmbH
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+            http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!-- Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org> Licensed under 
+       the Apache License, Version 2.0 (the "License"); you may not use this file 
+       except in compliance with the License. You may obtain a copy of the License 
+       at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
+       law or agreed to in writing, software distributed under the License is distributed 
+       on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
+       express or implied. See the License for the specific language governing permissions 
+       and limitations under the License. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>win32.x86</id>
+       <baseDirectory>argeo-node-ui</baseDirectory>
+       <formats>
+               <format>zip</format>
+       </formats>
+       <dependencySets>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>*:jar</include>
+                       </includes>
+                       <excludes>
+                               <exclude>org.eclipse.swt:org.eclipse.swt*:jar</exclude>
+                       </excludes>
+               </dependencySet>
+               <dependencySet>
+                       <unpack>false</unpack>
+                       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
+                       </outputFileNameMapping>
+                       <outputDirectory>lib</outputDirectory>
+                       <includes>
+                               <include>org.eclipse.swt:org.eclipse.swt.win32.win32.x86:jar</include>
+                       </includes>
+               </dependencySet>
+       </dependencySets>
+</assembly>
\ No newline at end of file
diff --git a/dep/org.argeo.dep.cms.ui.rcp/.gitignore b/dep/org.argeo.dep.cms.ui.rcp/.gitignore
new file mode 100644 (file)
index 0000000..5e85f8d
--- /dev/null
@@ -0,0 +1,3 @@
+/org.argeo.security.dep.node.rcp-maven.target
+/target/
+/*.target
diff --git a/dep/org.argeo.dep.cms.ui.rcp/META-INF/.gitignore b/dep/org.argeo.dep.cms.ui.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/dep/org.argeo.dep.cms.ui.rcp/bnd.bnd b/dep/org.argeo.dep.cms.ui.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/dep/org.argeo.dep.cms.ui.rcp/p2.inf b/dep/org.argeo.dep.cms.ui.rcp/p2.inf
new file mode 100644 (file)
index 0000000..0423aa5
--- /dev/null
@@ -0,0 +1,2 @@
+properties.1.name=org.eclipse.equinox.p2.type.category
+properties.1.value=true
\ No newline at end of file
diff --git a/dep/org.argeo.dep.cms.ui.rcp/pom.xml b/dep/org.argeo.dep.cms.ui.rcp/pom.xml
new file mode 100644 (file)
index 0000000..384f62e
--- /dev/null
@@ -0,0 +1,370 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons</groupId>
+               <artifactId>dep</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.dep.cms.ui.rcp</artifactId>
+       <name>CMS Platform UI RCP</name>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.dep.cms.node</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+                       <type>pom</type>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.dep.cms.ext</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+                       <type>pom</type>
+               </dependency>
+               
+               <!-- Argeo -->
+               <dependency>
+                       <groupId>org.argeo.commons.rcp</groupId>
+                       <artifactId>org.argeo.swt.specific.rcp</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.rcp</groupId>
+                       <artifactId>org.argeo.cms.ui.rcp</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+
+               <!-- Desktop -->
+               <dependency>
+                       <groupId>org.argeo.commons.rcp</groupId>
+                       <artifactId>org.argeo.swt.minidesktop</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+
+               <!-- Argeo Commons -->
+<!--           <dependency> -->
+<!--                   <groupId>org.argeo.commons</groupId> -->
+<!--                   <artifactId>org.argeo.eclipse.ui</artifactId> -->
+<!--                   <version>${version.argeo-commons}</version> -->
+<!--           </dependency> -->
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.ui</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.swt</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+
+               <!-- SDK -->
+               <dependency>
+                       <groupId>org.argeo.tp.equinox</groupId>
+                       <artifactId>org.eclipse.osgi</artifactId>
+                       <scope>test</scope>
+               </dependency>
+
+               <!-- SWT native -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
+               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.x86</artifactId> -->
+               <!-- </dependency> -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt.cocoa.macosx.x86_64</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
+               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.win32.win32.x86</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.swt.gtk.linux.ppc64le</artifactId> -->
+               <!-- </dependency> -->
+               <!-- SWT for ARM -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt.gtk.linux.arm</artifactId>
+                       <version>3.108.0.v20180905-1254</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt.gtk.linux.aarch64</artifactId>
+                       <version>3.109.0.202003311246</version>
+               </dependency>
+
+
+               <!-- Eclipse launcher -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.x86_64</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.gtk.linux.x86</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.cocoa.macosx.x86_64</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.win32.win32.x86_64</artifactId> -->
+               <!-- </dependency> -->
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.rcp.e4</groupId> -->
+               <!-- <artifactId>org.eclipse.equinox.launcher.win32.win32.x86</artifactId> -->
+               <!-- </dependency> -->
+
+               <!-- SWT JFace -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.swt</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.jface</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.commands</artifactId>
+               </dependency>
+
+               <!-- CSS -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.css.core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.e4.ui.css.swt</artifactId>
+               </dependency>
+               
+               <!--  Eclipse core -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.runtime</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.jobs</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.eclipse.core.contenttype</artifactId>
+               </dependency>
+
+               <!-- Third party -->
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.w3c.css.sac</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.w3c.dom.svg</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.w3c.dom.events</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.w3c.dom.smil</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.xmlgraphics</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.commons.jxpath</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.batik.util</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.batik.i18n</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.batik.css</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.batik.constants</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.felix.gogo.runtime</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.rcp.e4</groupId>
+                       <artifactId>org.apache.felix.scr</artifactId>
+               </dependency>
+
+       </dependencies>
+       <dependencyManagement>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.argeo.tp</groupId>
+                               <artifactId>argeo-tp-rcp-e4</artifactId>
+                               <version>${version.argeo-tp}</version>
+                               <type>pom</type>
+                               <scope>import</scope>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+       <profiles>
+               <profile>
+                       <id>rpmbuild</id>
+                       <build>
+                               <plugins>
+                                       <plugin>
+                                               <artifactId>maven-assembly-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>prepare-source</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>single</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <descriptorRefs>
+                                                                               <descriptorRef>a2-source</descriptorRef>
+                                                                       </descriptorRefs>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                                       <plugin>
+                                               <groupId>org.codehaus.mojo</groupId>
+                                               <artifactId>rpm-maven-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>rpm-argeo</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>rpm</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <name>argeo-cms-ui-rcp${argeo.rpm.suffix}</name>
+                                                                       <mappings>
+                                                                               <mapping>
+                                                                                       <directory>/usr/lib/osgi</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <sources>
+                                                                                               <source>
+                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source</location>
+                                                                                                       <includes>
+                                                                                                               <include>**/*.jar</include>
+                                                                                                       </includes>
+                                                                                               </source>
+                                                                                       </sources>
+                                                                               </mapping>
+                                                                       </mappings>
+                                                                       <requires>
+                                                                               <require>argeo-cms-node${argeo.rpm.suffix}</require>
+                                                                               <require>argeo-cms-ui-rcp-tp${argeo.rpm.suffix}</require>
+                                                                       </requires>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+               <profile>
+                       <id>rpmbuild-tp</id>
+                       <build>
+                               <plugins>
+                                       <plugin>
+                                               <artifactId>maven-assembly-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>prepare-source-tp</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>single</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <descriptorRefs>
+                                                                               <descriptorRef>a2-source-tp</descriptorRef>
+                                                                       </descriptorRefs>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                                       <plugin>
+                                               <groupId>org.codehaus.mojo</groupId>
+                                               <artifactId>rpm-maven-plugin</artifactId>
+                                               <executions>
+                                                       <execution>
+                                                               <id>rpm-tp</id>
+                                                               <phase>package</phase>
+                                                               <goals>
+                                                                       <goal>rpm</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <name>argeo-cms-ui-rcp-tp${argeo.rpm.suffix}</name>
+                                                                       <projversion>${version.argeo-tp}</projversion>
+                                                                       <release>${argeo.rpm.release.tp}</release>
+                                                                       <mappings>
+                                                                               <mapping>
+                                                                                       <directory>/usr/lib/osgi</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <sources>
+                                                                                               <source>
+                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source-tp</location>
+                                                                                                       <includes>
+                                                                                                               <include>**/*.jar</include>
+                                                                                                       </includes>
+                                                                                               </source>
+                                                                                       </sources>
+                                                                               </mapping>
+                                                                               <mapping>
+                                                                                       <directory>/usr/share/osgi/boot</directory>
+                                                                                       <username>root</username>
+                                                                                       <groupname>root</groupname>
+                                                                                       <filemode>644</filemode>
+                                                                                       <directoryIncluded>false</directoryIncluded>
+                                                                                       <dependency>
+                                                                                               <stripVersion>true</stripVersion>
+                                                                                               <includes>
+                                                                                                       <include>org.argeo.tp.rcp.e4:org.eclipse.equinox.launcher</include>
+                                                                                               </includes>
+                                                                                       </dependency>
+                                                                               </mapping>
+                                                                       </mappings>
+                                                                       <requires>
+                                                                               <require>argeo-cms-node-tp${argeo.rpm.suffix}</require>
+                                                                       </requires>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+       </profiles>
+</project>
index c91526ccc1005ed9d327c0fa29cd795a5b57cef0..a066a25a93fde5263694f1bf4253fb08f6b8ae99 100644 (file)
        <modules>
                <module>org.argeo.dep.cms.minimal</module>
                <module>org.argeo.dep.cms.node</module>
+               <module>org.argeo.dep.cms.ext</module>
+               <module>org.argeo.dep.cms.ui.rcp</module>
+               <module>org.argeo.dep.cms.e4.rcp</module>
                <module>org.argeo.dep.cms.ui.rap</module>
                <module>org.argeo.dep.cms.e4.rap</module>
-               <module>org.argeo.dep.cms.ext</module>
        </modules>
        <build>
                <plugins>
diff --git a/pom.xml b/pom.xml
index 5113e3462fdd868855f3b365ae6efbc89e04c29a..af7295ccdfa670496beb19a90b0bf37af4fd2e8a 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,7 @@
                <module>org.argeo.cms.ui</module>
                <module>org.argeo.cms.e4</module>
                <!-- Eclipse RAP/RCP specific -->
+               <module>rcp</module>
                <module>rap</module>
                <!-- Distribution -->
                <module>dep</module>
diff --git a/rcp/cnf/maven.bnd b/rcp/cnf/maven.bnd
new file mode 100644 (file)
index 0000000..4bd5c0c
--- /dev/null
@@ -0,0 +1 @@
+-include: ../../cnf/maven.bnd
\ No newline at end of file
diff --git a/rcp/org.argeo.cms.e4.rcp/.classpath b/rcp/org.argeo.cms.e4.rcp/.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/rcp/org.argeo.cms.e4.rcp/.gitignore b/rcp/org.argeo.cms.e4.rcp/.gitignore
new file mode 100644 (file)
index 0000000..710cd68
--- /dev/null
@@ -0,0 +1,3 @@
+/bin/
+/target/
+/exec
diff --git a/rcp/org.argeo.cms.e4.rcp/.project b/rcp/org.argeo.cms.e4.rcp/.project
new file mode 100644 (file)
index 0000000..64d5619
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.cms.e4.rcp</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/rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.jdt.core.prefs b/rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..0c68a61
--- /dev/null
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.pde.core.prefs b/rcp/org.argeo.cms.e4.rcp/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..f29e940
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/rcp/org.argeo.cms.e4.rcp/META-INF/.gitignore b/rcp/org.argeo.cms.e4.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/rcp/org.argeo.cms.e4.rcp/argeo-companion.e4xmi b/rcp/org.argeo.cms.e4.rcp/argeo-companion.e4xmi
new file mode 100644 (file)
index 0000000..5b250ee
--- /dev/null
@@ -0,0 +1,26 @@
+<?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" xmi:id="_c4iAgCnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.application">
+  <children xsi:type="basic:TrimmedWindow" xmi:id="_hSGBwCnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.trimmedwindow.argeocompanion" label="Argeo Companion">
+    <children xsi:type="advanced:PerspectiveStack" xmi:id="_nxzQICnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.perspectivestack.0">
+      <children xsi:type="advanced:Perspective" xmi:id="_oI_oICnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.perspective.cmsadmin" label="CMS Admin">
+        <children xsi:type="basic:PartSashContainer" xmi:id="_qc16ECnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.partsashcontainer.0" horizontal="true">
+          <children xsi:type="basic:PartStack" xmi:id="_RE87kDsXEeiUntFYWh-hFg" elementId="org.argeo.cms.e4.rcp.partstack.1">
+            <children xsi:type="basic:Part" xmi:id="_V1WvgDsXEeiUntFYWh-hFg" elementId="org.argeo.cms.e4.rcp.part.files" contributionURI="bundleclass://org.argeo.cms.e4/org.argeo.cms.e4.files.NodeFsBrowserView" label="Files"/>
+            <children xsi:type="basic:Part" xmi:id="_vOqDQCnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.part.jcr" containerData="4000" contributionURI="bundleclass://org.argeo.cms.e4/org.argeo.cms.e4.jcr.JcrBrowserView" label="JCR"/>
+          </children>
+          <children xsi:type="basic:PartStack" xmi:id="_0eRiwCnCEei1F8sdBz8Mpw" elementId="org.argeo.cms.e4.rcp.partstack.0" containerData="6000">
+            <tags>editorArea</tags>
+          </children>
+        </children>
+      </children>
+    </children>
+  </children>
+  <descriptors xmi:id="__9SDsC8JEeq0koquN4xGyg" elementId="org.argeo.cms.e4.partdescriptor.nodeEditor" allowMultiple="true" category="editorArea" closeable="true" contributionURI="bundleclass://org.argeo.cms.e4/org.argeo.cms.e4.jcr.JcrNodeEditor"/>
+  <addons xmi:id="_c4iAgSnCEei1F8sdBz8Mpw" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+  <addons xmi:id="_c4iAginCEei1F8sdBz8Mpw" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+  <addons xmi:id="_c4iAgynCEei1F8sdBz8Mpw" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
+  <addons xmi:id="_c4iAhCnCEei1F8sdBz8Mpw" 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="_c4iAhSnCEei1F8sdBz8Mpw" 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="_c4iAhinCEei1F8sdBz8Mpw" 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="_c4iAhynCEei1F8sdBz8Mpw" 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/rcp/org.argeo.cms.e4.rcp/argeo-companion.properties b/rcp/org.argeo.cms.e4.rcp/argeo-companion.properties
new file mode 100644 (file)
index 0000000..9288d85
--- /dev/null
@@ -0,0 +1,19 @@
+argeo.osgi.start.2.node=\
+org.eclipse.equinox.metatype,\
+org.eclipse.equinox.ds,\
+org.eclipse.equinox.cm,\
+
+argeo.osgi.start.3.node=\
+org.argeo.cms
+
+applicationXMI=org.argeo.cms.e4.rcp/argeo-companion.e4xmi
+lifeCycleURI=bundleclass://org.argeo.cms.e4.rcp/org.argeo.cms.e4.rcp.CmsRcpLifeCycle
+clearPersistedState=true
+#argeo.cms.desktop.inTray=true
+
+# Remote node:
+#argeo.node.repo.labeledUri=http://root:demo@localhost:7070/jcr/node
+
+log4j.configuration=file:../../log4j.properties
+argeo.node.useradmin.uris=os:///
+eclipse.application=org.argeo.cms.e4.rcp.CmsE4Application
diff --git a/rcp/org.argeo.cms.e4.rcp/bnd.bnd b/rcp/org.argeo.cms.e4.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..dca5b91
--- /dev/null
@@ -0,0 +1,8 @@
+Bundle-SymbolicName: org.argeo.cms.e4.rcp;singleton=true
+
+Require-Bundle: org.eclipse.core.runtime
+
+Import-Package: org.argeo.api,\
+!org.eclipse.core.runtime,\
+org.eclipse.swt,\
+*
diff --git a/rcp/org.argeo.cms.e4.rcp/build.properties b/rcp/org.argeo.cms.e4.rcp/build.properties
new file mode 100644 (file)
index 0000000..355413e
--- /dev/null
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               argeo-companion.e4xmi
+source.. = src/
diff --git a/rcp/org.argeo.cms.e4.rcp/log4j.properties b/rcp/org.argeo.cms.e4.rcp/log4j.properties
new file mode 100644 (file)
index 0000000..13f949f
--- /dev/null
@@ -0,0 +1,32 @@
+log4j.rootLogger=WARN, development
+
+## Levels
+log4j.logger.org.argeo=DEBUG
+log4j.logger.org.argeo.jackrabbit.remote.ExtendedDispatcherServlet=WARN
+log4j.logger.org.argeo.server.webextender.TomcatDeployer=INFO
+
+#log4j.logger.org.springframework.security=DEBUG
+#log4j.logger.org.apache.commons.exec=DEBUG
+#log4j.logger.org.apache.jackrabbit.webdav=DEBUG
+#log4j.logger.org.apache.jackrabbit.remote=DEBUG
+#log4j.logger.org.apache.jackrabbit.core.observation=DEBUG
+
+log4j.logger.org.apache.catalina=INFO
+log4j.logger.org.apache.coyote=INFO
+
+log4j.logger.org.apache.directory=INFO
+log4j.logger.org.apache.directory.server=ERROR
+log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR
+
+## Appenders
+# console is set to be a ConsoleAppender.
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+
+# console uses PatternLayout.
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n
+
+# development appender (slow!)
+log4j.appender.development=org.apache.log4j.ConsoleAppender
+log4j.appender.development.layout=org.apache.log4j.PatternLayout
+log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss} [%16.16t] %5p %m (%F:%L) %c%n
diff --git a/rcp/org.argeo.cms.e4.rcp/plugin.xml b/rcp/org.argeo.cms.e4.rcp/plugin.xml
new file mode 100644 (file)
index 0000000..3e6896b
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         id="CmsE4Application"
+         name="CMS E4 Application"
+         point="org.eclipse.core.runtime.applications">
+      <application
+            cardinality="singleton-global"
+            thread="main"
+            visible="true">
+         <run class="org.argeo.cms.e4.rcp.CmsE4Application"></run>
+      </application>
+   </extension>
+</plugin>
diff --git a/rcp/org.argeo.cms.e4.rcp/pom.xml b/rcp/org.argeo.cms.e4.rcp/pom.xml
new file mode 100644 (file)
index 0000000..4914c0d
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.rcp</groupId>
+               <artifactId>argeo-rcp</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.cms.e4.rcp</artifactId>
+       <name>CMS E4 RCP</name>
+       <packaging>jar</packaging>
+       <dependencies>
+               <!-- Base Argeo UI -->
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.ui</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+               <!-- RCP specific -->
+               <dependency>
+                       <groupId>org.argeo.commons.rcp</groupId>
+                       <artifactId>org.argeo.swt.specific.rcp</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java b/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java
new file mode 100644 (file)
index 0000000..9cf4c8c
--- /dev/null
@@ -0,0 +1,205 @@
+package org.argeo.cms.e4.rcp;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.UUID;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.argeo.api.NodeConstants;
+import org.argeo.api.cms.CmsImageManager;
+import org.argeo.api.cms.CmsView;
+import org.argeo.api.cms.UxContext;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SimpleSwtUxContext;
+import org.argeo.cms.swt.auth.CmsLoginShell;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.swt.widgets.Display;
+
+public class CmsE4Application implements IApplication, CmsView {
+       private LoginContext loginContext;
+       private IApplication e4Application;
+       private UxContext uxContext;
+       private String uid;
+
+       @Override
+       public Object start(IApplicationContext context) throws Exception {
+               uid = UUID.randomUUID().toString();
+               Subject subject = new Subject();
+               Display display = createDisplay();
+               CmsLoginShell loginShell = new CmsLoginShell(this);
+               // TODO customize CmsLoginShell to be smaller and centered
+               loginShell.setSubject(subject);
+               try {
+                       // try pre-auth
+                       loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
+                       loginContext.login();
+               } catch (LoginException e) {
+                       e.printStackTrace();
+                       loginShell.createUi();
+                       loginShell.open();
+
+                       while (!loginShell.getShell().isDisposed()) {
+                               if (!display.readAndDispatch())
+                                       display.sleep();
+                       }
+               }
+               if (CurrentUser.getUsername(getSubject()) == null)
+                       throw new CmsException("Cannot log in");
+
+               // try {
+               // CallbackHandler callbackHandler = new DefaultLoginDialog(
+               // display.getActiveShell());
+               // loginContext = new LoginContext(
+               // NodeConstants.LOGIN_CONTEXT_SINGLE_USER, subject,
+               // callbackHandler);
+               // } catch (LoginException e1) {
+               // throw new CmsException("Cannot initialize login context", e1);
+               // }
+               //
+               // // login
+               // try {
+               // loginContext.login();
+               // subject = loginContext.getSubject();
+               // } catch (LoginException e) {
+               // e.printStackTrace();
+               // display.dispose();
+               // try {
+               // Thread.sleep(2000);
+               // } catch (InterruptedException e1) {
+               // // silent
+               // }
+               // return null;
+               // }
+
+               uxContext = new SimpleSwtUxContext();
+               //UiContext.setData(CmsView.KEY, this);
+               CmsSwtUtils.registerCmsView(loginShell.getShell(), this);
+               e4Application = getApplication(null);
+               Object res = Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
+
+                       @Override
+                       public Object run() throws Exception {
+                               return e4Application.start(context);
+                       }
+
+               });
+               return res;
+       }
+
+       @Override
+       public void stop() {
+               if (e4Application != null)
+                       e4Application.stop();
+       }
+
+       static IApplication getApplication(String[] args) {
+               IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME,
+                               Platform.PT_APPLICATIONS, "org.eclipse.e4.ui.workbench.swt.E4Application");
+               try {
+                       IConfigurationElement[] elements = extension.getConfigurationElements();
+                       if (elements.length > 0) {
+                               IConfigurationElement[] runs = elements[0].getChildren("run");
+                               if (runs.length > 0) {
+                                       Object runnable;
+                                       runnable = runs[0].createExecutableExtension("class");
+                                       if (runnable instanceof IApplication)
+                                               return (IApplication) runnable;
+                               }
+                       }
+               } catch (Exception e) {
+                       throw new IllegalStateException("Cannot find e4 application", e);
+               }
+               throw new IllegalStateException("Cannot find e4 application");
+       }
+
+       public static Display createDisplay() {
+               Display.setAppName("Argeo CMS RCP");
+
+               // create the display
+               Display newDisplay = Display.getCurrent();
+               if (newDisplay == null) {
+                       newDisplay = new Display();
+               }
+               // Set the priority higher than normal so as to be higher
+               // than the JobManager.
+               Thread.currentThread().setPriority(Math.min(Thread.MAX_PRIORITY, Thread.NORM_PRIORITY + 1));
+               return newDisplay;
+       }
+
+       //
+       // CMS VIEW
+       //
+
+       @Override
+       public UxContext getUxContext() {
+               return uxContext;
+       }
+
+       @Override
+       public void navigateTo(String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+               if (loginContext == null)
+                       throw new CmsException("Login context cannot be null");
+               // logout previous login context
+               // if (this.loginContext != null)
+               // try {
+               // this.loginContext.logout();
+               // } catch (LoginException e1) {
+               // System.err.println("Could not log out: " + e1);
+               // }
+               this.loginContext = loginContext;
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not bet null");
+               try {
+                       CurrentUser.logoutCmsSession(loginContext.getSubject());
+                       loginContext.logout();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot log out", e);
+               }
+       }
+
+       @Override
+       public void exception(Throwable e) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public CmsImageManager getImageManager() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       protected Subject getSubject() {
+               return loginContext.getSubject();
+       }
+
+       @Override
+       public boolean isAnonymous() {
+               return CurrentUser.isAnonymous(getSubject());
+       }
+
+       @Override
+       public String getUid() {
+               return uid;
+       }
+
+       
+}
diff --git a/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsRcpLifeCycle.java b/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsRcpLifeCycle.java
new file mode 100644 (file)
index 0000000..1d38fe7
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.cms.e4.rcp;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
+import org.eclipse.e4.ui.workbench.lifecycle.PreSave;
+import org.eclipse.e4.ui.workbench.lifecycle.ProcessAdditions;
+import org.eclipse.e4.ui.workbench.lifecycle.ProcessRemovals;
+
+@SuppressWarnings("restriction")
+public class CmsRcpLifeCycle {
+
+       @PostContextCreate
+       void postContextCreate(IEclipseContext workbenchContext) {
+       }
+
+       @PreSave
+       void preSave(IEclipseContext workbenchContext) {
+       }
+
+       @ProcessAdditions
+       void processAdditions(IEclipseContext workbenchContext) {
+       }
+
+       @ProcessRemovals
+       void processRemovals(IEclipseContext workbenchContext) {
+       }
+}
diff --git a/rcp/org.argeo.cms.ui.rcp/.classpath b/rcp/org.argeo.cms.ui.rcp/.classpath
new file mode 100644 (file)
index 0000000..e801ebf
--- /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-11"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/rcp/org.argeo.cms.ui.rcp/.gitignore b/rcp/org.argeo.cms.ui.rcp/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/rcp/org.argeo.cms.ui.rcp/.project b/rcp/org.argeo.cms.ui.rcp/.project
new file mode 100644 (file)
index 0000000..c9c2a44
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.cms.ui.rcp</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/rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore b/rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml b/rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml
new file mode 100644 (file)
index 0000000..3b7f260
--- /dev/null
@@ -0,0 +1,6 @@
+<?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="CMS RCP App">
+   <implementation class="org.argeo.cms.ui.rcp.CmsRcpApp"/>
+   <reference bind="setCmsApp" cardinality="1..1" interface="org.argeo.cms.ui.CmsApp" name="CmsApp" policy="dynamic"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
+</scr:component>
diff --git a/rcp/org.argeo.cms.ui.rcp/bnd.bnd b/rcp/org.argeo.cms.ui.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..c3704d8
--- /dev/null
@@ -0,0 +1,10 @@
+
+Service-Component: OSGI-INF/cmsRcpApp.xml
+
+Import-Package:\
+org.argeo.api,\
+org.argeo.cms.auth,\
+org.eclipse.swt,\
+org.eclipse.swt.graphics,\
+org.w3c.css.sac,\
+*
diff --git a/rcp/org.argeo.cms.ui.rcp/build.properties b/rcp/org.argeo.cms.ui.rcp/build.properties
new file mode 100644 (file)
index 0000000..6210e84
--- /dev/null
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/rcp/org.argeo.cms.ui.rcp/pom.xml b/rcp/org.argeo.cms.ui.rcp/pom.xml
new file mode 100644 (file)
index 0000000..6a344d4
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.rcp</groupId>
+               <artifactId>argeo-rcp</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.cms.ui.rcp</artifactId>
+       <name>CMS UI RCP</name>
+       <packaging>jar</packaging>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.ui</artifactId>
+                       <version>2.3-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java b/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java
new file mode 100644 (file)
index 0000000..c2f3d65
--- /dev/null
@@ -0,0 +1,277 @@
+package org.argeo.cms.ui.rcp;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.PrivilegedAction;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeConstants;
+import org.argeo.api.cms.CmsApp;
+import org.argeo.api.cms.CmsImageManager;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.CmsTheme;
+import org.argeo.api.cms.CmsUi;
+import org.argeo.api.cms.CmsView;
+import org.argeo.api.cms.UxContext;
+import org.argeo.cms.osgi.CmsOsgiUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+import org.eclipse.e4.ui.css.core.engine.CSSErrorHandler;
+import org.eclipse.e4.ui.css.swt.engine.CSSSWTEngineImpl;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+/** Runs a {@link CmsApp} as an SWT desktop application. */
+@SuppressWarnings("restriction")
+public class CmsRcpApp implements CmsView {
+       private final static Log log = LogFactory.getLog(CmsRcpApp.class);
+
+       private BundleContext bundleContext = FrameworkUtil.getBundle(CmsRcpApp.class).getBundleContext();
+
+       private Display display;
+       private Shell shell;
+       private CmsApp cmsApp;
+       private CmsUiThread uiThread;
+
+       // CMS View
+       private String uid;
+       private LoginContext loginContext;
+
+       private EventAdmin eventAdmin;
+
+       private CSSEngine cssEngine;
+
+       private CmsUi ui;
+       // TODO make it configurable
+       private String uiName = "desktop";
+
+       public CmsRcpApp() {
+               uid = UUID.randomUUID().toString();
+       }
+
+       public void init(Map<String, String> properties) {
+               try {
+                       Thread.sleep(5000);
+               } catch (InterruptedException e) {
+                       // silent
+               }
+               uiThread = new CmsUiThread();
+               uiThread.start();
+
+       }
+
+       public void destroy(Map<String, String> properties) {
+               if (!shell.isDisposed())
+                       shell.dispose();
+               try {
+                       uiThread.join();
+               } catch (InterruptedException e) {
+                       // silent
+               } finally {
+                       uiThread = null;
+               }
+       }
+
+       class CmsUiThread extends Thread {
+
+               public CmsUiThread() {
+                       super("CMS UI");
+               }
+
+               @Override
+               public void run() {
+                       display = new Display();
+                       shell = new Shell(display);
+                       shell.setText("Argeo CMS");
+                       Composite parent = shell;
+                       parent.setLayout(new GridLayout());
+                       CmsSwtUtils.registerCmsView(shell, CmsRcpApp.this);
+
+//                     Subject subject = new Subject();
+//                     CmsLoginShell loginShell = new CmsLoginShell(CmsRcpApp.this);
+//                     loginShell.setSubject(subject);
+                       try {
+                               // try pre-auth
+//                             loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
+                               loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_SINGLE_USER);
+                               loginContext.login();
+                       } catch (LoginException e) {
+                               throw new IllegalStateException("Could not log in.", e);
+//                             loginShell.createUi();
+//                             loginShell.open();
+//
+//                             while (!loginShell.getShell().isDisposed()) {
+//                                     if (!display.readAndDispatch())
+//                                             display.sleep();
+//                             }
+                       }
+                       if (log.isDebugEnabled())
+                               log.debug("Logged in to desktop: " + loginContext.getSubject());
+
+                       Subject.doAs(loginContext.getSubject(), (PrivilegedAction<Void>) () -> {
+
+                               // TODO factorise with web app
+                               parent.setData(CmsApp.UI_NAME_PROPERTY, uiName);
+                               ui = cmsApp.initUi(parent);
+                               if (ui instanceof Composite)
+                                       ((Composite) ui).setLayoutData(CmsSwtUtils.fillAll());
+                               //ui.setLayoutData(CmsUiUtils.fillAll());
+                               // we need ui to be set before refresh so that CmsView can store UI context data
+                               // in it.
+                               cmsApp.refreshUi(ui, null);
+
+                               // Styling
+                               CmsTheme theme = CmsSwtUtils.getCmsTheme(parent);
+                               if (theme != null) {
+                                       cssEngine = new CSSSWTEngineImpl(display);
+                                       for (String path : theme.getSwtCssPaths()) {
+                                               try (InputStream in = theme.loadPath(path)) {
+                                                       cssEngine.parseStyleSheet(in);
+                                               } catch (IOException e) {
+                                                       throw new IllegalStateException("Cannot load stylesheet " + path, e);
+                                               }
+                                       }
+                                       cssEngine.setErrorHandler(new CSSErrorHandler() {
+                                               public void error(Exception e) {
+                                                       log.error("SWT styling error: ", e);
+                                               }
+                                       });
+                                       applyStyles(shell);
+                               }
+                               shell.layout(true, true);
+
+                               shell.open();
+                               while (!shell.isDisposed()) {
+                                       if (!display.readAndDispatch())
+                                               display.sleep();
+                               }
+                               display.dispose();
+                               return null;
+                       });
+               }
+
+       }
+
+       /*
+        * CMS VIEW
+        */
+
+       @Override
+       public String getUid() {
+               return uid;
+       }
+
+       @Override
+       public UxContext getUxContext() {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public void navigateTo(String state) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext != null)
+                       try {
+                               loginContext.logout();
+                       } catch (LoginException e) {
+                               log.error("Cannot log out", e);
+                       }
+       }
+
+       @Override
+       public void exception(Throwable e) {
+               log.error("Unexpected exception in CMS RCP", e);
+       }
+
+       @Override
+       public CmsImageManager getImageManager() {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public CmsSession getCmsSession() {
+               CmsSession cmsSession = CmsOsgiUtils.getCmsSession(bundleContext, getSubject());
+               return cmsSession;
+       }
+
+       @Override
+       public Object getData(String key) {
+               if (ui != null) {
+                       return ui.getData(key);
+               } else {
+                       throw new IllegalStateException("UI is not initialized");
+               }
+       }
+
+       @Override
+       public void setData(String key, Object value) {
+               if (ui != null) {
+                       ui.setData(key, value);
+               } else {
+                       throw new IllegalStateException("UI is not initialized");
+               }
+       }
+
+       @Override
+       public boolean isAnonymous() {
+               return false;
+       }
+
+       @Override
+       public void applyStyles(Object node) {
+               if (cssEngine != null)
+                       cssEngine.applyStyles(node, true);
+       }
+
+       @Override
+       public void sendEvent(String topic, Map<String, Object> properties) {
+               if (properties == null)
+                       properties = new HashMap<>();
+               if (properties.containsKey(CMS_VIEW_UID_PROPERTY) && !properties.get(CMS_VIEW_UID_PROPERTY).equals(uid))
+                       throw new IllegalArgumentException("Property " + CMS_VIEW_UID_PROPERTY + " is set to another CMS view uid ("
+                                       + properties.get(CMS_VIEW_UID_PROPERTY) + ") then " + uid);
+               properties.put(CMS_VIEW_UID_PROPERTY, uid);
+               eventAdmin.sendEvent(new Event(topic, properties));
+       }
+
+       public <T> T doAs(PrivilegedAction<T> action) {
+               return Subject.doAs(getSubject(), action);
+       }
+
+       protected Subject getSubject() {
+               return loginContext.getSubject();
+       }
+
+       /*
+        * DEPENDENCY INJECTION
+        */
+       public void setCmsApp(CmsApp cmsApp) {
+               this.cmsApp = cmsApp;
+       }
+
+       public void setEventAdmin(EventAdmin eventAdmin) {
+               this.eventAdmin = eventAdmin;
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/.classpath b/rcp/org.argeo.swt.minidesktop/.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/rcp/org.argeo.swt.minidesktop/.gitignore b/rcp/org.argeo.swt.minidesktop/.gitignore
new file mode 100644 (file)
index 0000000..97adb72
--- /dev/null
@@ -0,0 +1,3 @@
+/bin/
+/target/
+*.log
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.minidesktop/.project b/rcp/org.argeo.swt.minidesktop/.project
new file mode 100644 (file)
index 0000000..b6c2c1a
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.swt.minidesktop</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/rcp/org.argeo.swt.minidesktop/META-INF/.gitignore b/rcp/org.argeo.swt.minidesktop/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/rcp/org.argeo.swt.minidesktop/bnd.bnd b/rcp/org.argeo.swt.minidesktop/bnd.bnd
new file mode 100644 (file)
index 0000000..f3c13be
--- /dev/null
@@ -0,0 +1,2 @@
+Import-Package: org.eclipse.swt,\
+*
diff --git a/rcp/org.argeo.swt.minidesktop/build.properties b/rcp/org.argeo.swt.minidesktop/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/rcp/org.argeo.swt.minidesktop/pom.xml b/rcp/org.argeo.swt.minidesktop/pom.xml
new file mode 100644 (file)
index 0000000..75b2c24
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.rcp</groupId>
+               <artifactId>argeo-rcp</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.swt.minidesktop</artifactId>
+       <name>Mini Desktop</name>
+       <packaging>jar</packaging>
+</project>
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniBrowser.java
new file mode 100644 (file)
index 0000000..406382b
--- /dev/null
@@ -0,0 +1,187 @@
+package org.argeo.minidesktop;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationAdapter;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/** A very minimalistic web browser based on {@link Browser}. */
+public class MiniBrowser {
+       private static Point defaultShellSize = new Point(800, 480);
+
+       private Browser browser;
+       private Text addressT;
+
+       private final boolean fullscreen;
+       private final boolean appMode;
+
+       public MiniBrowser(Composite composite, String url, boolean fullscreen, boolean appMode) {
+               this.fullscreen = fullscreen;
+               this.appMode = appMode;
+               createUi(composite);
+               setUrl(url);
+       }
+
+       public Control createUi(Composite parent) {
+               parent.setLayout(noSpaceGridLayout(new GridLayout()));
+               if (!isAppMode()) {
+                       Control toolBar = createToolBar(parent);
+                       toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               }
+               Control body = createBody(parent);
+               body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               return body;
+       }
+
+       protected Control createToolBar(Composite parent) {
+               Composite toolBar = new Composite(parent, SWT.NONE);
+               toolBar.setLayout(new FillLayout());
+               addressT = new Text(toolBar, SWT.SINGLE);
+               addressT.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                               setUrl(addressT.getText().trim());
+                       }
+               });
+               return toolBar;
+       }
+
+       protected Control createBody(Composite parent) {
+               browser = new Browser(parent, SWT.NONE);
+               if (isFullScreen())
+                       browser.addKeyListener(new KeyAdapter() {
+                               @Override
+                               public void keyPressed(KeyEvent e) {
+                                       if (e.keyCode == 0x77 && e.stateMask == 0x40000) {// Ctrl+W
+                                               browser.getShell().dispose();
+                                       }
+                               }
+                       });
+               browser.addLocationListener(new LocationAdapter() {
+                       @Override
+                       public void changed(LocationEvent event) {
+                               System.out.println(event);
+                               if (addressT != null)
+                                       addressT.setText(event.location);
+                       }
+
+               });
+               browser.addTitleListener(e -> titleChanged(e.title));
+               browser.addOpenWindowListener((e) -> {
+                       e.browser = openNewBrowserWindow();
+               });
+               return browser;
+       }
+
+       protected Browser openNewBrowserWindow() {
+
+               if (isFullScreen()) {
+                       // TODO manage multiple tabs?
+                       return browser;
+               } else {
+                       Shell newShell = new Shell(browser.getDisplay(), SWT.SHELL_TRIM);
+                       MiniBrowser newMiniBrowser = new MiniBrowser(newShell, null, false, isAppMode());
+                       newShell.setSize(defaultShellSize);
+                       newShell.open();
+                       return newMiniBrowser.browser;
+               }
+       }
+
+       protected boolean isFullScreen() {
+               return fullscreen;
+       }
+
+       void setUrl(String url) {
+               if (browser != null && url != null && !url.equals(browser.getUrl()))
+                       browser.setUrl(url.toString());
+       }
+
+       /** Called when URL changed; to be overridden, does nothing by default. */
+       protected void urlChanged(String url) {
+       }
+
+       /** Called when title changed; to be overridden, does nothing by default. */
+       protected void titleChanged(String title) {
+       }
+
+       protected Browser getBrowser() {
+               return browser;
+       }
+
+       protected boolean isAppMode() {
+               return appMode;
+       }
+
+       private static GridLayout noSpaceGridLayout(GridLayout layout) {
+               layout.horizontalSpacing = 0;
+               layout.verticalSpacing = 0;
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               return layout;
+       }
+
+       public static void main(String[] args) {
+               List<String> options = Arrays.asList(args);
+               if (options.contains("--help")) {
+                       System.out.println("Usage: java " + MiniBrowser.class.getName().replace('.', '/') + " [OPTION] [URL]");
+                       System.out.println("A minimalistic web browser Eclipse SWT Browser integration.");
+                       System.out.println("  --fullscreen : take control of the whole screen (default is to run in a window)");
+                       System.out.println("  --app        : open without an address bar and a toolbar");
+                       System.out.println("  --help       : print this help and exit");
+                       System.exit(1);
+               }
+               boolean fullscreen = options.contains("--fullscreen");
+               boolean appMode = options.contains("--app");
+               String url = "https://start.duckduckgo.com/";
+               if (options.size() > 0) {
+                       String last = options.get(options.size() - 1);
+                       if (!last.startsWith("--"))
+                               url = last.trim();
+               }
+
+               Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+               Shell shell;
+               if (fullscreen) {
+                       shell = new Shell(display, SWT.NO_TRIM);
+                       shell.setFullScreen(true);
+                       Rectangle bounds = display.getBounds();
+                       shell.setSize(bounds.width, bounds.height);
+               } else {
+                       shell = new Shell(display, SWT.SHELL_TRIM);
+                       shell.setSize(defaultShellSize);
+               }
+
+               new MiniBrowser(shell, url, fullscreen, appMode) {
+
+                       @Override
+                       protected void titleChanged(String title) {
+                               shell.setText(title);
+                       }
+               };
+               shell.open();
+
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopImages.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopImages.java
new file mode 100644 (file)
index 0000000..db5e6f2
--- /dev/null
@@ -0,0 +1,53 @@
+package org.argeo.minidesktop;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/** Icons. */
+public class MiniDesktopImages {
+
+       public final Image homeIcon;
+       public final Image exitIcon;
+       
+       public final Image terminalIcon;
+       public final Image browserIcon;
+       public final Image explorerIcon;
+       public final Image textEditorIcon;
+
+       public final Image folderIcon;
+       public final Image fileIcon;
+
+       public MiniDesktopImages(Display display) {
+               homeIcon = loadImage(display, "nav_home@2x.png");
+               exitIcon = loadImage(display, "delete@2x.png");
+
+               terminalIcon = loadImage(display, "console_view@2x.png");
+               browserIcon = loadImage(display, "external_browser@2x.png");
+               explorerIcon = loadImage(display, "fldr_obj@2x.png");
+               textEditorIcon = loadImage(display, "cheatsheet_obj@2x.png");
+
+               folderIcon = loadImage(display, "fldr_obj@2x.png");
+               fileIcon = loadImage(display, "file_obj@2x.png");
+       }
+
+       static Image loadImage(Display display, String path) {
+               InputStream stream = MiniDesktopImages.class.getResourceAsStream(path);
+               if (stream == null)
+                       throw new IllegalArgumentException("Image " + path + " not found");
+               Image image = null;
+               try {
+                       image = new Image(display, stream);
+               } catch (SWTException ex) {
+               } finally {
+                       try {
+                               stream.close();
+                       } catch (IOException ex) {
+                       }
+               }
+               return image;
+       }
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniDesktopManager.java
new file mode 100644 (file)
index 0000000..e0f483d
--- /dev/null
@@ -0,0 +1,349 @@
+package org.argeo.minidesktop;
+
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** A very minimalistic desktop manager based on Java and Eclipse SWT. */
+public class MiniDesktopManager {
+       private Display display;
+
+       private Shell rootShell;
+       private Shell toolBarShell;
+       private CTabFolder tabFolder;
+       private int maxTabTitleLength = 16;
+
+       private final boolean fullscreen;
+       private final boolean stacking;
+
+       private MiniDesktopImages images;
+
+       public MiniDesktopManager(boolean fullscreen, boolean stacking) {
+               this.fullscreen = fullscreen;
+               this.stacking = stacking;
+       }
+
+       public void init() {
+               Display.setAppName("Mini SWT Desktop");
+               display = Display.getCurrent();
+               if (display != null)
+                       throw new IllegalStateException("Already a display " + display);
+               display = new Display();
+
+               if (display.getTouchEnabled()) {
+                       System.out.println("Touch enabled.");
+               }
+
+               images = new MiniDesktopImages(display);
+
+               int toolBarSize = 48;
+
+               if (isFullscreen()) {
+                       rootShell = new Shell(display, SWT.NO_TRIM);
+                       rootShell.setFullScreen(true);
+                       Rectangle bounds = display.getBounds();
+                       rootShell.setLocation(0, 0);
+                       rootShell.setSize(bounds.width, bounds.height);
+               } else {
+                       rootShell = new Shell(display, SWT.CLOSE | SWT.RESIZE);
+                       Rectangle shellArea = rootShell.computeTrim(200, 200, 800, 480);
+                       rootShell.setSize(shellArea.width, shellArea.height);
+                       rootShell.setText(Display.getAppName());
+                       rootShell.setImage(images.terminalIcon);
+               }
+
+               rootShell.setLayout(noSpaceGridLayout(new GridLayout(2, false)));
+               Composite toolBarArea = new Composite(rootShell, SWT.NONE);
+               toolBarArea.setLayoutData(new GridData(toolBarSize, rootShell.getSize().y));
+
+               ToolBar toolBar;
+               if (isFullscreen()) {
+                       toolBarShell = new Shell(rootShell, SWT.NO_TRIM | SWT.ON_TOP);
+                       toolBar = new ToolBar(toolBarShell, SWT.VERTICAL | SWT.FLAT | SWT.BORDER);
+                       createDock(toolBar);
+                       toolBarShell.pack();
+                       toolBarArea.setLayoutData(new GridData(toolBar.getSize().x, toolBar.getSize().y));
+               } else {
+                       toolBar = new ToolBar(toolBarArea, SWT.VERTICAL | SWT.FLAT | SWT.BORDER);
+                       createDock(toolBar);
+                       toolBarArea.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+               }
+
+               if (isStacking()) {
+                       tabFolder = new CTabFolder(rootShell, SWT.MULTI | SWT.BORDER | SWT.BOTTOM);
+                       tabFolder.setLayout(noSpaceGridLayout(new GridLayout()));
+                       tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+                       Color selectionBackground = display.getSystemColor(SWT.COLOR_LIST_SELECTION);
+                       tabFolder.setSelectionBackground(selectionBackground);
+
+                       // background
+                       Control background = createBackground(tabFolder);
+                       CTabItem homeTabItem = new CTabItem(tabFolder, SWT.NONE);
+                       homeTabItem.setText("Home");
+                       homeTabItem.setImage(images.homeIcon);
+                       homeTabItem.setControl(background);
+                       tabFolder.setFocus();
+               } else {
+                       createBackground(rootShell);
+               }
+
+               rootShell.open();
+               // rootShell.layout(true, true);
+
+               if (toolBarShell != null) {
+                       int toolBarShellY = (display.getBounds().height - toolBar.getSize().y) / 2;
+                       toolBarShell.setLocation(0, toolBarShellY);
+                       toolBarShell.open();
+               }
+
+               long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
+               System.out.println("SWT Mini Desktop Manager available in " + jvmUptime + " ms.");
+       }
+
+       protected void createDock(ToolBar toolBar) {
+               // Terminal
+               addToolItem(toolBar, images.terminalIcon, "Terminal", () -> {
+                       String url = System.getProperty("user.home");
+                       AppContext appContext = createAppParent(images.terminalIcon);
+                       new MiniTerminal(appContext.getAppParent(), url) {
+
+                               @Override
+                               protected void exitCalled() {
+                                       if (appContext.shell != null)
+                                               appContext.shell.dispose();
+                                       if (appContext.tabItem != null)
+                                               appContext.tabItem.dispose();
+                               }
+                       };
+                       String title;
+                       try {
+                               title = System.getProperty("user.name") + "@" + InetAddress.getLocalHost().getHostName();
+                       } catch (UnknownHostException e) {
+                               title = System.getProperty("user.name") + "@localhost";
+                       }
+                       if (appContext.shell != null)
+                               appContext.shell.setText(title);
+                       if (appContext.tabItem != null) {
+                               appContext.tabItem.setText(tabTitle(title));
+                               appContext.tabItem.setToolTipText(title);
+                       }
+                       openApp(appContext);
+               });
+
+               // Web browser
+               addToolItem(toolBar, images.browserIcon, "Browser", () -> {
+                       String url = "https://start.duckduckgo.com/";
+                       AppContext appContext = createAppParent(images.browserIcon);
+                       new MiniBrowser(appContext.getAppParent(), url, false, false) {
+                               @Override
+                               protected void titleChanged(String title) {
+                                       if (appContext.shell != null)
+                                               appContext.shell.setText(title);
+                                       if (appContext.tabItem != null) {
+                                               appContext.tabItem.setText(tabTitle(title));
+                                               appContext.tabItem.setToolTipText(title);
+                                       }
+                               }
+                       };
+                       openApp(appContext);
+               });
+
+               // File explorer
+               addToolItem(toolBar, images.explorerIcon, "Explorer", () -> {
+                       String url = System.getProperty("user.home");
+                       AppContext appContext = createAppParent(images.explorerIcon);
+                       new MiniExplorer(appContext.getAppParent(), url) {
+
+                               @Override
+                               protected void pathChanged(Path path) {
+                                       if (appContext.shell != null)
+                                               appContext.shell.setText(path.toString());
+                                       if (appContext.tabItem != null) {
+                                               appContext.tabItem.setText(path.getFileName().toString());
+                                               appContext.tabItem.setToolTipText(path.toString());
+                                       }
+                               }
+                       };
+                       openApp(appContext);
+               });
+
+               // Separator
+               new ToolItem(toolBar, SWT.SEPARATOR);
+
+               // Exit
+               addToolItem(toolBar, images.exitIcon, "Exit", () -> rootShell.dispose());
+
+               toolBar.pack();
+       }
+
+       protected String tabTitle(String title) {
+               return title.length() > maxTabTitleLength ? title.substring(0, maxTabTitleLength) : title;
+       }
+
+       protected void addToolItem(ToolBar toolBar, Image icon, String name, Runnable action) {
+               ToolItem searchI = new ToolItem(toolBar, SWT.PUSH);
+               searchI.setImage(icon);
+               searchI.setToolTipText(name);
+               searchI.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               action.run();
+                       }
+
+               });
+       }
+
+       protected AppContext createAppParent(Image icon) {
+               if (isStacking()) {
+                       Composite appParent = new Composite(tabFolder, SWT.CLOSE);
+                       appParent.setLayout(noSpaceGridLayout(new GridLayout()));
+                       CTabItem item = new CTabItem(tabFolder, SWT.CLOSE);
+                       item.setImage(icon);
+                       item.setControl(appParent);
+                       return new AppContext(item);
+               } else {
+                       Shell shell = isFullscreen() ? new Shell(rootShell, SWT.SHELL_TRIM)
+                                       : new Shell(rootShell.getDisplay(), SWT.SHELL_TRIM);
+                       shell.setImage(icon);
+                       return new AppContext(shell);
+               }
+       }
+
+       protected void openApp(AppContext appContext) {
+               if (appContext.shell != null) {
+                       Shell shell = (Shell) appContext.shell;
+                       shell.open();
+                       shell.setSize(new Point(800, 480));
+               }
+               if (appContext.tabItem != null) {
+                       tabFolder.setFocus();
+                       tabFolder.setSelection(appContext.tabItem);
+               }
+       }
+
+       protected Control createBackground(Composite parent) {
+               Composite backgroundArea = new Composite(parent, SWT.NONE);
+               backgroundArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               initBackground(backgroundArea);
+               return backgroundArea;
+       }
+
+       protected void initBackground(Composite backgroundArea) {
+               MiniHomePart homePart = new MiniHomePart() {
+
+                       @Override
+                       protected void fillAppsToolBar(ToolBar toolBar) {
+                               createDock(toolBar);
+                       }
+               };
+               homePart.createUiPart(backgroundArea, null);
+       }
+
+       public void run() {
+               while (!rootShell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+       public void dispose() {
+               if (!rootShell.isDisposed())
+                       rootShell.dispose();
+       }
+
+       protected boolean isFullscreen() {
+               return fullscreen;
+       }
+
+       protected boolean isStacking() {
+               return stacking;
+       }
+
+       protected Image getIconForExt(String ext) {
+               Program program = Program.findProgram(ext);
+               if (program == null)
+                       return display.getSystemImage(SWT.ICON_INFORMATION);
+
+               ImageData iconData = program.getImageData();
+               if (iconData == null) {
+                       return display.getSystemImage(SWT.ICON_INFORMATION);
+               } else {
+                       return new Image(display, iconData);
+               }
+
+       }
+
+       private static GridLayout noSpaceGridLayout(GridLayout layout) {
+               layout.horizontalSpacing = 0;
+               layout.verticalSpacing = 0;
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               return layout;
+       }
+
+       public static void main(String[] args) {
+               List<String> options = Arrays.asList(args);
+               if (options.contains("--help")) {
+                       System.out.println("Usage: java " + MiniDesktopManager.class.getName().replace('.', '/') + " [OPTION]");
+                       System.out.println("A minimalistic desktop manager based on Java and Eclipse SWT.");
+                       System.out.println("  --fullscreen : take control of the whole screen (default is to run in a window)");
+                       System.out.println("  --stacking   : open apps as tabs (default is to create new windows)");
+                       System.out.println("  --help       : print this help and exit");
+                       System.exit(1);
+               }
+               boolean fullscreen = options.contains("--fullscreen");
+               boolean stacking = options.contains("--stacking");
+
+               MiniDesktopManager desktopManager = new MiniDesktopManager(fullscreen, stacking);
+               desktopManager.init();
+               desktopManager.run();
+               desktopManager.dispose();
+               System.exit(0);
+       }
+
+       class AppContext {
+               private Shell shell;
+               private CTabItem tabItem;
+
+               public AppContext(Shell shell) {
+                       this.shell = shell;
+               }
+
+               public AppContext(CTabItem tabItem) {
+                       this.tabItem = tabItem;
+               }
+
+               Composite getAppParent() {
+                       if (shell != null)
+                               return shell;
+                       if (tabItem != null)
+                               return (Composite) tabItem.getControl();
+                       throw new IllegalStateException();
+               }
+       }
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniExplorer.java
new file mode 100644 (file)
index 0000000..1395c02
--- /dev/null
@@ -0,0 +1,165 @@
+package org.argeo.minidesktop;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+public class MiniExplorer {
+       private Path path;
+       private Text addressT;
+       private Table browser;
+
+       private boolean showHidden = false;
+
+       public MiniExplorer(Composite parent, String url) {
+               this(parent);
+               setUrl(url);
+       }
+
+       public MiniExplorer(Composite parent) {
+               parent.setLayout(noSpaceGridLayout(new GridLayout()));
+
+               Composite toolBar = new Composite(parent, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               toolBar.setLayout(new FillLayout());
+               addressT = new Text(toolBar, SWT.SINGLE);
+               addressT.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                               setUrl(addressT.getText().trim());
+                       }
+               });
+               browser = createTable(parent, this.path);
+
+       }
+
+       public void setPath(Path url) {
+               this.path = url;
+               if (addressT != null)
+                       addressT.setText(url.toString());
+               if (browser != null) {
+                       Composite parent = browser.getParent();
+                       browser.dispose();
+                       browser = createTable(parent, this.path);
+                       parent.layout(true, true);
+               }
+               pathChanged(url);
+       }
+
+       protected void pathChanged(Path path) {
+
+       }
+
+       protected Table createTable(Composite parent, Path path) {
+               Table table = new Table(parent, SWT.BORDER);
+               table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               table.addMouseListener(new MouseAdapter() {
+
+                       @Override
+                       public void mouseDoubleClick(MouseEvent e) {
+                               Point pt = new Point(e.x, e.y);
+                               TableItem item = table.getItem(pt);
+                               Path path = (Path) item.getData();
+                               if (Files.isDirectory(path)) {
+                                       setPath(path);
+                               } else {
+                                       Program.launch(path.toString());
+                               }
+                       }
+               });
+
+               if (path != null) {
+                       if (path.getParent() != null) {
+                               TableItem parentTI = new TableItem(table, SWT.NONE);
+                               parentTI.setText("..");
+                               parentTI.setData(path.getParent());
+                       }
+
+                       try {
+                               // directories
+                               DirectoryStream<Path> ds = Files.newDirectoryStream(path, p -> Files.isDirectory(p) && isShown(p));
+                               ds.forEach(p -> {
+                                       TableItem ti = new TableItem(table, SWT.NONE);
+                                       ti.setText(p.getFileName().toString() + "/");
+                                       ti.setData(p);
+                               });
+                               // files
+                               ds = Files.newDirectoryStream(path, p -> !Files.isDirectory(p) && isShown(p));
+                               ds.forEach(p -> {
+                                       TableItem ti = new TableItem(table, SWT.NONE);
+                                       ti.setText(p.getFileName().toString());
+                                       ti.setData(p);
+                               });
+                       } catch (IOException e1) {
+                               // TODO Auto-generated catch block
+                               e1.printStackTrace();
+                       }
+               }
+               return table;
+       }
+
+       protected boolean isShown(Path path) {
+               if (showHidden)
+                       return true;
+               try {
+                       return !Files.isHidden(path);
+               } catch (IOException e) {
+                       throw new IllegalArgumentException("Cannot check " + path, e);
+               }
+       }
+
+       public void setUrl(String url) {
+               setPath(Paths.get(url));
+       }
+
+       private static GridLayout noSpaceGridLayout(GridLayout layout) {
+               layout.horizontalSpacing = 0;
+               layout.verticalSpacing = 0;
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               return layout;
+       }
+
+       public static void main(String[] args) {
+               Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+               Shell shell = new Shell(display, SWT.SHELL_TRIM);
+
+               String url = args.length > 0 ? args[0] : System.getProperty("user.home");
+               new MiniExplorer(shell, url) {
+
+                       @Override
+                       protected void pathChanged(Path path) {
+                               shell.setText(path.toString());
+                       }
+
+               };
+
+               shell.open();
+               shell.setSize(new Point(800, 480));
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniHomePart.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniHomePart.java
new file mode 100644 (file)
index 0000000..877f643
--- /dev/null
@@ -0,0 +1,161 @@
+package org.argeo.minidesktop;
+
+import java.net.InetAddress;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+
+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;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.ToolBar;
+
+/** A start page displaying network information and resources. */
+public class MiniHomePart {
+
+       public Control createUiPart(Composite parent, Object context) {
+               parent.setLayout(new GridLayout(2, false));
+               Display display = parent.getDisplay();
+
+               // Apps
+               Group appsGroup = new Group(parent, SWT.NONE);
+               appsGroup.setText("Apps");
+               appsGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 2, 1));
+               ToolBar appsToolBar = new ToolBar(appsGroup, SWT.HORIZONTAL | SWT.FLAT);
+               fillAppsToolBar(appsToolBar);
+
+               // Host
+               Group hostGroup = new Group(parent, SWT.NONE);
+               hostGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+               hostGroup.setText("Host");
+               hostGroup.setLayout(new GridLayout(2, false));
+               label(hostGroup, "Hostname: ");
+               try {
+                       InetAddress defaultAddr = InetAddress.getLocalHost();
+                       String hostname = defaultAddr.getHostName();
+                       label(hostGroup, hostname);
+                       label(hostGroup, "Address: ");
+                       label(hostGroup, defaultAddr.getHostAddress());
+               } catch (UnknownHostException e) {
+                       label(hostGroup, e.getMessage());
+               }
+
+               Enumeration<NetworkInterface> netInterfaces = null;
+               try {
+                       netInterfaces = NetworkInterface.getNetworkInterfaces();
+               } catch (SocketException e) {
+                       label(hostGroup, "Interfaces: ");
+                       label(hostGroup, e.getMessage());
+               }
+               if (netInterfaces != null)
+                       while (netInterfaces.hasMoreElements()) {
+                               NetworkInterface netInterface = netInterfaces.nextElement();
+                               byte[] hardwareAddress = null;
+                               try {
+                                       hardwareAddress = netInterface.getHardwareAddress();
+                                       if (hardwareAddress != null) {
+                                               label(hostGroup, convertHardwareAddress(hardwareAddress));
+                                               label(hostGroup, netInterface.getName());
+                                               for (InterfaceAddress addr : netInterface.getInterfaceAddresses()) {
+                                                       label(hostGroup, cleanHostAddress(addr.getAddress().getHostAddress()));
+                                                       label(hostGroup, Short.toString(addr.getNetworkPrefixLength()));
+                                               }
+                                       }
+                               } catch (SocketException e) {
+                                       label(hostGroup, e.getMessage());
+                               }
+                       }
+
+               // Resources
+               Group resGroup = new Group(parent, SWT.NONE);
+               resGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               resGroup.setText("Resources");
+               resGroup.setLayout(new GridLayout(3, false));
+
+               Runtime runtime = Runtime.getRuntime();
+
+               String maxMemoryStr = Long.toString(runtime.maxMemory() / (1024 * 1024)) + " MB";
+               label(resGroup, "Max Java memory: ");
+               label(resGroup, maxMemoryStr);
+               label(resGroup, "Java version: " + Runtime.version().toString());
+
+               label(resGroup, "Usable Java memory: ");
+               Label totalMemory = label(resGroup, maxMemoryStr);
+               ProgressBar totalOnMax = new ProgressBar(resGroup, SWT.SMOOTH);
+               totalOnMax.setMaximum(100);
+               label(resGroup, "Used Java memory: ");
+               Label usedMemory = label(resGroup, maxMemoryStr);
+               ProgressBar usedOnTotal = new ProgressBar(resGroup, SWT.SMOOTH);
+               totalOnMax.setMaximum(100);
+               new Thread() {
+                       @Override
+                       public void run() {
+                               while (!totalOnMax.isDisposed()) {
+                                       display.asyncExec(() -> {
+                                               if (totalOnMax.isDisposed())
+                                                       return;
+                                               totalOnMax.setSelection(javaTotalOnMaxPerct(runtime));
+                                               usedOnTotal.setSelection(javaUsedOnTotalPerct(runtime));
+                                               totalMemory.setText(Long.toString(runtime.totalMemory() / (1024 * 1024)) + " MB");
+                                               usedMemory.setText(
+                                                               Long.toString((runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024)) + " MB");
+                                       });
+                                       try {
+                                               Thread.sleep(1000);
+                                       } catch (InterruptedException e) {
+                                               return;
+                                       }
+                               }
+                       }
+               }.start();
+               return parent;
+       }
+
+       protected void fillAppsToolBar(ToolBar toolBar) {
+
+       }
+
+       protected int javaUsedOnTotalPerct(Runtime runtime) {
+               return Math.toIntExact((runtime.totalMemory() - runtime.freeMemory()) * 100 / runtime.totalMemory());
+       }
+
+       protected int javaTotalOnMaxPerct(Runtime runtime) {
+               return Math.toIntExact((runtime.totalMemory()) * 100 / runtime.maxMemory());
+       }
+
+       protected Label label(Composite parent, String text) {
+               Label label = new Label(parent, SWT.WRAP);
+               label.setText(text);
+               return label;
+       }
+
+       protected String cleanHostAddress(String hostAddress) {
+               // remove % from Ipv6 addresses
+               int index = hostAddress.indexOf('%');
+               if (index > 0)
+                       return hostAddress.substring(0, index);
+               else
+                       return hostAddress;
+       }
+
+       protected String convertHardwareAddress(byte[] hardwareAddress) {
+               if (hardwareAddress == null)
+                       return "";
+               // from https://stackoverflow.com/a/2797498/7878010
+               StringBuilder sb = new StringBuilder(18);
+               for (byte b : hardwareAddress) {
+                       if (sb.length() > 0)
+                               sb.append(':');
+                       sb.append(String.format("%02x", b).toUpperCase());
+               }
+               return sb.toString();
+       }
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniImageViewer.java
new file mode 100644 (file)
index 0000000..86ff53f
--- /dev/null
@@ -0,0 +1,129 @@
+package org.argeo.minidesktop;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.graphics.Point;
+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.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class MiniImageViewer implements PaintListener {
+       private URL url;
+       private Canvas area;
+
+       private Image image;
+
+       public MiniImageViewer(Composite parent, int style) {
+               parent.setLayout(new GridLayout());
+
+               Composite toolBar = new Composite(parent, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               toolBar.setLayout(new RowLayout());
+               Button load = new Button(toolBar, SWT.FLAT);
+               load.setText("\u2191");// up arrow
+               load.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               FileDialog fileDialog = new FileDialog(area.getShell());
+                               String path = fileDialog.open();
+                               if (path != null) {
+                                       setUrl(path);
+                               }
+                       }
+
+               });
+
+               area = new Canvas(parent, SWT.NONE);
+               area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               area.addPaintListener(this);
+       }
+
+       protected void load(URL url) {
+               try {
+                       ImageLoader imageLoader = new ImageLoader();
+                       ImageData[] data = imageLoader.load(url.openStream());
+                       image = new Image(area.getDisplay(), data[0]);
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+       }
+
+       @Override
+       public void paintControl(PaintEvent e) {
+               e.gc.drawImage(image, 0, 0);
+
+       }
+
+       protected Path url2path(URL url) {
+               try {
+                       Path path = Paths.get(url.toURI());
+                       return path;
+               } catch (URISyntaxException e) {
+                       throw new IllegalStateException("Cannot convert " + url + " to uri", e);
+               }
+       }
+
+       public void setUrl(URL url) {
+               this.url = url;
+               if (area != null)
+                       load(this.url);
+       }
+
+       public void setUrl(String url) {
+               try {
+                       setUrl(new URL(url));
+               } catch (MalformedURLException e) {
+                       // try with http
+                       try {
+                               setUrl(new URL("file://" + url));
+                               return;
+                       } catch (MalformedURLException e1) {
+                               // nevermind...
+                       }
+                       throw new IllegalArgumentException("Cannot interpret URL " + url, e);
+               }
+       }
+
+       public static void main(String[] args) {
+               Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+               Shell shell = new Shell(display, SWT.SHELL_TRIM);
+
+               MiniImageViewer miniBrowser = new MiniImageViewer(shell, SWT.NONE);
+               String url = args.length > 0 ? args[0] : "";
+               if (!url.trim().equals("")) {
+                       miniBrowser.setUrl(url);
+                       shell.setText(url);
+               } else {
+                       shell.setText("*");
+               }
+
+               shell.open();
+               shell.setSize(new Point(800, 480));
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTerminal.java
new file mode 100644 (file)
index 0000000..196ad0c
--- /dev/null
@@ -0,0 +1,342 @@
+package org.argeo.minidesktop;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Caret;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class MiniTerminal implements KeyListener, PaintListener {
+
+       private Canvas area;
+       private Caret caret;
+
+       private StringBuffer buf = new StringBuffer("");
+       private StringBuffer userInput = new StringBuffer("");
+       private List<String> history = new ArrayList<>();
+
+       private Point charExtent = null;
+       private int charsPerLine = 0;
+       private String[] lines = new String[0];
+       private List<String> logicalLines = new ArrayList<>();
+
+       private Font mono;
+       private Charset charset;
+
+       private Path currentDir;
+       private Path homeDir;
+       private String host = "localhost";
+       private String username;
+
+       // Sub process
+       private Process process;
+       private boolean running = false;
+       private OutputStream stdIn = null;
+
+       private Thread readOut;
+
+       public MiniTerminal(Composite parent, String url) {
+               this(parent);
+               setPath(url);
+       }
+
+       public MiniTerminal(Composite parent) {
+               charset = StandardCharsets.UTF_8;
+
+               Display display = parent.getDisplay();
+               // Linux-specific
+               mono = new Font(display, "Monospace", 10, SWT.NONE);
+
+               parent.setLayout(new GridLayout());
+               area = new Canvas(parent, SWT.NONE);
+               area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               caret = new Caret(area, SWT.NONE);
+               area.setCaret(caret);
+
+               area.addKeyListener(this);
+               area.addPaintListener(this);
+
+               username = System.getProperty("user.name");
+               try {
+                       host = InetAddress.getLocalHost().getHostName();
+                       if (host.indexOf('.') > 0)
+                               host = host.substring(0, host.indexOf('.'));
+               } catch (UnknownHostException e) {
+                       host = "localhost";
+               }
+               homeDir = Paths.get(System.getProperty("user.home"));
+               currentDir = homeDir;
+
+               buf = new StringBuffer(prompt());
+       }
+
+       @Override
+       public void keyPressed(KeyEvent e) {
+       }
+
+       @Override
+       public void keyReleased(KeyEvent e) {
+               if (e.keyLocation != 0)
+                       return;// weird characters
+               // System.out.println(e.character);
+               if (e.keyCode == 0xd) {// return
+                       markLogicalLine();
+                       if (!running)
+                               processUserInput();
+                       // buf.append(prompt());
+               } else if (e.keyCode == 0x8) {// delete
+                       if (userInput.length() == 0)
+                               return;
+                       userInput.setLength(userInput.length() - 1);
+                       if (!running && buf.length() > 0)
+                               buf.setLength(buf.length() - 1);
+               } else if (e.stateMask == 0x40000 && e.keyCode == 0x63) {// Ctrl+C
+                       if (process != null)
+                               process.destroy();
+               } else if (e.stateMask == 0x40000 && e.keyCode == 0xdf) {// Ctrl+\
+                       if (process != null) {
+                               process.destroyForcibly();
+                       }
+               } else {
+                       // if (!running)
+                       buf.append(e.character);
+                       userInput.append(e.character);
+               }
+
+               if (area.isDisposed())
+                       return;
+               area.redraw();
+               // System.out.println("Append " + e);
+
+               if (running) {
+                       if (stdIn != null) {
+                               try {
+                                       stdIn.write(Character.toString(e.character).getBytes(charset));
+                               } catch (IOException e1) {
+                                       // TODO Auto-generated catch block
+                                       e1.printStackTrace();
+                               }
+                       }
+               }
+       }
+
+       protected String prompt() {
+               String fileName = currentDir.equals(homeDir) ? "~" : currentDir.getFileName().toString();
+               String end = username.equals("root") ? "]# " : "]$ ";
+               return "[" + username + "@" + host + " " + fileName + end;
+       }
+
+       private void displayPrompt() {
+               buf.append(prompt() + userInput);
+       }
+
+       protected void markLogicalLine() {
+               String str = buf.toString().trim();
+               logicalLines.add(str);
+               buf = new StringBuffer("");
+       }
+
+       private void processUserInput() {
+               String cmd = userInput.toString();
+               userInput = new StringBuffer("");
+               processUserInput(cmd);
+               history.add(cmd);
+       }
+
+       protected void processUserInput(String input) {
+               try {
+                       StringTokenizer st = new StringTokenizer(input);
+                       List<String> args = new ArrayList<>();
+                       while (st.hasMoreTokens())
+                               args.add(st.nextToken());
+                       if (args.size() == 0) {
+                               displayPrompt();
+                               return;
+                       }
+
+                       // change directory
+                       if (args.get(0).equals("cd")) {
+                               if (args.size() == 1) {
+                                       setPath(homeDir);
+                               } else {
+                                       Path newPath = currentDir.resolve(args.get(1));
+                                       if (!Files.exists(newPath) || !Files.isDirectory(newPath)) {
+                                               println(newPath + ": No such file or directory");
+                                               return;
+                                       }
+                                       setPath(newPath);
+                               }
+                               displayPrompt();
+                               return;
+                       }
+                       // show current directory
+                       else if (args.get(0).equals("pwd")) {
+                               println(currentDir);
+                               displayPrompt();
+                               return;
+                       }
+                       // exit
+                       else if (args.get(0).equals("exit")) {
+                               println("logout");
+                               exitCalled();
+                               return;
+                       }
+
+                       ProcessBuilder pb = new ProcessBuilder(args);
+                       pb.redirectErrorStream(true);
+                       pb.directory(currentDir.toFile());
+//                     Process process = Runtime.getRuntime().exec(input, null, currentPath.toFile());
+                       process = pb.start();
+
+                       stdIn = process.getOutputStream();
+                       readOut = new Thread("MiniTerminal read out") {
+                               @Override
+                               public void run() {
+                                       running = true;
+                                       try (BufferedReader in = new BufferedReader(
+                                                       new InputStreamReader(process.getInputStream(), charset))) {
+                                               String line = null;
+                                               while ((line = in.readLine()) != null) {
+                                                       println(line);
+                                               }
+                                       } catch (IOException e) {
+                                               println(e.getMessage());
+                                       }
+                                       stdIn = null;
+                                       displayPrompt();
+                                       running = false;
+                                       readOut = null;
+                                       process = null;
+                               }
+                       };
+                       readOut.start();
+               } catch (IOException e) {
+                       println(e.getMessage());
+                       displayPrompt();
+               }
+       }
+
+       protected int linesForLogicalLine(char[] line) {
+               return line.length / charsPerLine + 1;
+       }
+
+       protected void println(Object line) {
+               buf.append(line);
+               markLogicalLine();
+       }
+
+       protected void refreshLines(int charPerLine, int nbrOfLines) {
+               if (lines.length != nbrOfLines) {
+                       lines = new String[nbrOfLines];
+                       Arrays.fill(lines, null);
+               }
+               if (this.charsPerLine != charPerLine)
+                       this.charsPerLine = charPerLine;
+
+               int currentLine = nbrOfLines - 1;
+               // current line
+               if (buf.length() > 0) {
+                       lines[currentLine] = buf.toString();
+               } else {
+                       lines[currentLine] = "";
+               }
+               currentLine--;
+
+               logicalLines: for (int i = logicalLines.size() - 1; i >= 0; i--) {
+                       char[] logicalLine = logicalLines.get(i).toCharArray();
+                       int linesNeeded = linesForLogicalLine(logicalLine);
+                       for (int j = linesNeeded - 1; j >= 0; j--) {
+                               int from = j * charPerLine;
+                               int to = j == linesNeeded - 1 ? from + charPerLine : Math.min(from + charPerLine, logicalLine.length);
+                               lines[currentLine] = new String(Arrays.copyOfRange(logicalLine, from, to));
+//                             System.out.println("Set line " + currentLine + " to : " + lines[currentLine]);
+                               currentLine--;
+                               if (currentLine < 0)
+                                       break logicalLines;
+                       }
+               }
+       }
+
+       @Override
+       public void paintControl(PaintEvent e) {
+               GC gc = e.gc;
+               gc.setFont(mono);
+               if (charExtent == null)
+                       charExtent = gc.textExtent("a");
+
+               Point areaSize = area.getSize();
+               int charPerLine = areaSize.x / charExtent.x;
+               int nbrOfLines = areaSize.y / charExtent.y;
+               refreshLines(charPerLine, nbrOfLines);
+
+               for (int i = 0; i < lines.length; i++) {
+                       String line = lines[i];
+                       if (line != null)
+                               gc.drawString(line, 0, i * charExtent.y);
+               }
+//             String toDraw = buf.toString();
+//             gc.drawString(toDraw, 0, 0);
+//             area.setCaret(caret);
+       }
+
+       protected void exitCalled() {
+
+       }
+
+       public void setPath(String path) {
+               this.currentDir = Paths.get(path);
+       }
+
+       public void setPath(Path path) {
+               this.currentDir = path;
+       }
+
+       public static void main(String[] args) {
+               Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+               Shell shell = new Shell(display, SWT.SHELL_TRIM);
+
+               String url = args.length > 0 ? args[0] : System.getProperty("user.home");
+               new MiniTerminal(shell, url) {
+
+                       @Override
+                       protected void exitCalled() {
+                               shell.dispose();
+                               System.exit(0);
+                       }
+               };
+
+               shell.open();
+               shell.setSize(new Point(800, 480));
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/MiniTextEditor.java
new file mode 100644 (file)
index 0000000..91cd19e
--- /dev/null
@@ -0,0 +1,161 @@
+package org.argeo.minidesktop;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+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.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class MiniTextEditor {
+       private URL url;
+       private Text text;
+
+       public MiniTextEditor(Composite parent, int style) {
+               parent.setLayout(new GridLayout());
+
+               Composite toolBar = new Composite(parent, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               toolBar.setLayout(new RowLayout());
+               Button load = new Button(toolBar, SWT.FLAT);
+               load.setText("\u2191");// up arrow
+               load.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               FileDialog fileDialog = new FileDialog(text.getShell());
+                               String path = fileDialog.open();
+                               if (path != null) {
+                                       setUrl(path);
+                               }
+                       }
+
+               });
+
+               Button save = new Button(toolBar, SWT.FLAT);
+               save.setText("\u2193");// down arrow
+               // save.setText("\u1F609");// emoji
+               save.addSelectionListener(new SelectionAdapter() {
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               save(url);
+                       }
+
+               });
+
+               text = new Text(parent, SWT.WRAP | SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+       }
+
+       protected void load(URL url) {
+               text.setText("");
+               // TODO deal with encoding and binary data
+               try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) {
+                       String line = null;
+                       while ((line = in.readLine()) != null) {
+                               text.append(line + "\n");
+                       }
+                       text.setEditable(true);
+               } catch (IOException e) {
+                       if (e instanceof FileNotFoundException) {
+                               Path path = url2path(url);
+                               try {
+                                       Files.createFile(path);
+                                       load(url);
+                                       return;
+                               } catch (IOException e1) {
+                                       e = e1;
+                               }
+                       }
+                       text.setText(e.getMessage());
+                       text.setEditable(false);
+                       e.printStackTrace();
+                       // throw new IllegalStateException("Cannot load " + url, e);
+               }
+       }
+
+       protected Path url2path(URL url) {
+               try {
+                       Path path = Paths.get(url.toURI());
+                       return path;
+               } catch (URISyntaxException e) {
+                       throw new IllegalStateException("Cannot convert " + url + " to uri", e);
+               }
+       }
+
+       protected void save(URL url) {
+               if (!url.getProtocol().equals("file"))
+                       throw new IllegalArgumentException(url.getProtocol() + " protocol is not supported for write");
+               Path path = url2path(url);
+               try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(path)))) {
+                       out.write(text.getText());
+               } catch (IOException e) {
+                       throw new IllegalStateException("Cannot save " + url + " to " + path, e);
+               }
+       }
+
+       public void setUrl(URL url) {
+               this.url = url;
+               if (text != null)
+                       load(url);
+       }
+
+       public void setUrl(String url) {
+               try {
+                       setUrl(new URL(url));
+               } catch (MalformedURLException e) {
+                       // try with http
+                       try {
+                               setUrl(new URL("file://" + url));
+                               return;
+                       } catch (MalformedURLException e1) {
+                               // nevermind...
+                       }
+                       throw new IllegalArgumentException("Cannot interpret URL " + url, e);
+               }
+       }
+
+       public static void main(String[] args) {
+               Display display = Display.getCurrent() == null ? new Display() : Display.getCurrent();
+               Shell shell = new Shell(display, SWT.SHELL_TRIM);
+
+               MiniTextEditor miniBrowser = new MiniTextEditor(shell, SWT.NONE);
+               String url = args.length > 0 ? args[0] : "";
+               if (!url.trim().equals("")) {
+                       miniBrowser.setUrl(url);
+                       shell.setText(url);
+               } else {
+                       shell.setText("*");
+               }
+
+               shell.open();
+               shell.setSize(new Point(800, 480));
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch())
+                               display.sleep();
+               }
+       }
+
+}
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/cheatsheet_obj@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/cheatsheet_obj@2x.png
new file mode 100644 (file)
index 0000000..55c614d
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/cheatsheet_obj@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/console_view@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/console_view@2x.png
new file mode 100644 (file)
index 0000000..54ecae2
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/console_view@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/delete@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/delete@2x.png
new file mode 100644 (file)
index 0000000..eb2fc72
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/delete@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/external_browser@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/external_browser@2x.png
new file mode 100644 (file)
index 0000000..06d337a
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/external_browser@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/file_obj@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/file_obj@2x.png
new file mode 100644 (file)
index 0000000..31e671c
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/file_obj@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/fldr_obj@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/fldr_obj@2x.png
new file mode 100644 (file)
index 0000000..adb7c2c
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/fldr_obj@2x.png differ
diff --git a/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/nav_home@2x.png b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/nav_home@2x.png
new file mode 100644 (file)
index 0000000..4c9a16c
Binary files /dev/null and b/rcp/org.argeo.swt.minidesktop/src/org/argeo/minidesktop/nav_home@2x.png differ
diff --git a/rcp/org.argeo.swt.specific.rcp/.classpath b/rcp/org.argeo.swt.specific.rcp/.classpath
new file mode 100644 (file)
index 0000000..457b115
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src" />
+       <classpathentry kind="con"
+               path="org.eclipse.pde.core.requiredPlugins" />
+       <classpathentry kind="con"
+               path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" />
+       <classpathentry kind="output" path="bin" />
+</classpath>
diff --git a/rcp/org.argeo.swt.specific.rcp/.gitignore b/rcp/org.argeo.swt.specific.rcp/.gitignore
new file mode 100644 (file)
index 0000000..5e77890
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/bin/
+*.log
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.specific.rcp/.project b/rcp/org.argeo.swt.specific.rcp/.project
new file mode 100644 (file)
index 0000000..c79ee3f
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.swt.specific.rcp</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/rcp/org.argeo.swt.specific.rcp/META-INF/.gitignore b/rcp/org.argeo.swt.specific.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/rcp/org.argeo.swt.specific.rcp/bnd.bnd b/rcp/org.argeo.swt.specific.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..a950648
--- /dev/null
@@ -0,0 +1,16 @@
+Import-Package: org.apache.commons.io,\
+                               org.eclipse.core.commands,\
+                               !org.eclipse.core.runtime,\
+                               !org.eclipse.ui.plugin,\
+                               org.eclipse.swt,\
+                               *
+
+Export-Package: org.argeo.*,\
+org.eclipse.rap.fileupload.*;version="3.10",\
+org.eclipse.rap.rwt.*;version="3.10"
+
+# Was !org.eclipse.core.commands,\ why ?
+
+#Bundle-Activator: org.argeo.eclipse.ui.ArgeoUiPlugin
+#Bundle-ActivationPolicy: lazy
+#Ignore-Package: org.eclipse.core.commands
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.specific.rcp/build.properties b/rcp/org.argeo.swt.specific.rcp/build.properties
new file mode 100644 (file)
index 0000000..c6b651a
--- /dev/null
@@ -0,0 +1,3 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/
diff --git a/rcp/org.argeo.swt.specific.rcp/pom.xml b/rcp/org.argeo.swt.specific.rcp/pom.xml
new file mode 100644 (file)
index 0000000..e81624e
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.rcp</groupId>
+               <artifactId>argeo-rcp</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.swt.specific.rcp</artifactId>
+       <name>SWT RCP Specific</name>
+       <description>Provide RCP specific classes and behaviour in order to enable single sourcing</description>
+       <packaging>jar</packaging>
+<!--   <dependencies> -->
+<!--           <dependency> -->
+<!--                   <groupId>org.argeo.commons</groupId> -->
+<!--                   <artifactId>org.argeo.eclipse.ui</artifactId> -->
+<!--                   <version>${version.argeo-commons}</version> -->
+<!--           </dependency> -->
+<!--   </dependencies> -->
+</project>
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpClient.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpClient.java
new file mode 100644 (file)
index 0000000..0d9ce48
--- /dev/null
@@ -0,0 +1,44 @@
+package org.argeo.eclipse.ui.rcp.internal.rwt;
+
+import org.eclipse.rap.rwt.client.Client;
+import org.eclipse.rap.rwt.client.service.BrowserNavigation;
+import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
+import org.eclipse.rap.rwt.client.service.ClientService;
+import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
+
+public class RcpClient implements Client {
+
+       @Override
+       public <T extends ClientService> T getService(Class<T> type) {
+               if (type.isAssignableFrom(JavaScriptExecutor.class))
+                       return (T) javaScriptExecutor;
+               else if (type.isAssignableFrom(BrowserNavigation.class))
+                       return (T) browserNavigation;
+               else
+                       return null;
+       }
+
+       private JavaScriptExecutor javaScriptExecutor = new JavaScriptExecutor() {
+
+               @Override
+               public void execute(String code) {
+                       // TODO Auto-generated method stub
+
+               }
+       };
+       private BrowserNavigation browserNavigation = new BrowserNavigation() {
+
+               @Override
+               public void pushState(String state, String title) {
+                       // TODO Auto-generated method stub
+
+               }
+
+               @Override
+               public void addBrowserNavigationListener(
+                               BrowserNavigationListener listener) {
+                       // TODO Auto-generated method stub
+
+               }
+       };
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpResourceManager.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/rcp/internal/rwt/RcpResourceManager.java
new file mode 100644 (file)
index 0000000..91109a9
--- /dev/null
@@ -0,0 +1,46 @@
+package org.argeo.eclipse.ui.rcp.internal.rwt;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.commons.io.IOUtils;
+import org.eclipse.rap.rwt.service.ResourceManager;
+
+public class RcpResourceManager implements ResourceManager {
+       private Map<String, byte[]> register = Collections
+                       .synchronizedMap(new TreeMap<String, byte[]>());
+
+       @Override
+       public void register(String name, InputStream in) {
+               try {
+                       register.put(name, IOUtils.toByteArray(in));
+               } catch (IOException e) {
+                       throw new RuntimeException("Cannot register " + name, e);
+               }
+       }
+
+       @Override
+       public boolean unregister(String name) {
+               return register.remove(name) != null;
+       }
+
+       @Override
+       public InputStream getRegisteredContent(String name) {
+               return new ByteArrayInputStream(register.get(name));
+       }
+
+       @Override
+       public String getLocation(String name) {
+               return name;
+       }
+
+       @Override
+       public boolean isRegistered(String name) {
+               return register.containsKey(name);
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileDialog.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileDialog.java
new file mode 100644 (file)
index 0000000..0c5d346
--- /dev/null
@@ -0,0 +1,15 @@
+package org.argeo.eclipse.ui.specific;
+
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class CmsFileDialog extends FileDialog {
+       public CmsFileDialog(Shell parent, int style) {
+               super(parent, style);
+       }
+
+       public CmsFileDialog(Shell parent) {
+               super(parent);
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileUpload.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/CmsFileUpload.java
new file mode 100644 (file)
index 0000000..638859a
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.eclipse.ui.specific;
+
+import org.eclipse.rap.rwt.widgets.FileUpload;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+
+public class CmsFileUpload extends FileUpload {
+       public CmsFileUpload(Composite parent, int style) {
+               super(parent, style);
+       }
+
+       @Override
+       public void setText(String text) {
+               super.setText(text);
+       }
+
+       @Override
+       public String getFileName() {
+               return super.getFileName();
+       }
+
+       @Override
+       public String[] getFileNames() {
+               return super.getFileNames();
+       }
+
+       @Override
+       public void addSelectionListener(SelectionListener listener) {
+               super.addSelectionListener(listener);
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/DefaultNLS.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/DefaultNLS.java
new file mode 100644 (file)
index 0000000..fbb4fbf
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.eclipse.ui.specific;
+
+/** RCP specific {@link NLS} to be extended */
+public class DefaultNLS {// extends NLS {
+//     public final static String DEFAULT_BUNDLE_LOCATION = "/properties/plugin";
+//
+//     public DefaultNLS() {
+//             this(DEFAULT_BUNDLE_LOCATION);
+//     }
+//
+//     public DefaultNLS(String bundleName) {
+//             NLS.initializeMessages(bundleName, getClass());
+//     }
+}
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiConstants.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiConstants.java
new file mode 100644 (file)
index 0000000..ac862d7
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.eclipse.ui.specific;
+
+/** Constants which are specific to RWT.*/
+public interface EclipseUiConstants {
+       final static String CSS_CLASS = "org.eclipse.e4.ui.css.CssClassName";
+       final static String MARKUP_SUPPORT = null;
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiSpecificUtils.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiSpecificUtils.java
new file mode 100644 (file)
index 0000000..d1acbcf
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.eclipse.ui.specific;
+
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Widget;
+
+/** Static utilities to bridge differences between RCP and RAP */
+public class EclipseUiSpecificUtils {
+       private final static String CSS_CLASS = "org.eclipse.e4.ui.css.CssClassName";
+
+       public static void setStyleData(Widget widget, Object data) {
+               widget.setData(CSS_CLASS, data);
+       }
+
+       public static Object getStyleData(Widget widget) {
+               return widget.getData(CSS_CLASS);
+       }
+
+       public static void setMarkupData(Widget widget) {
+               // does nothing
+       }
+
+       public static void setMarkupValidationDisabledData(Widget widget) {
+               // does nothing
+       }
+
+       /**
+        * TootlTip support is supported for {@link ColumnViewer} in RCP
+        * 
+        * @see ColumnViewerToolTipSupport#enableFor(Viewer)
+        */
+       public static void enableToolTipSupport(Viewer viewer) {
+               if (viewer instanceof ColumnViewer)
+                       ColumnViewerToolTipSupport.enableFor((ColumnViewer) viewer);
+       }
+
+       private EclipseUiSpecificUtils() {
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/FileDropAdapter.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/FileDropAdapter.java
new file mode 100644 (file)
index 0000000..524447e
--- /dev/null
@@ -0,0 +1,48 @@
+package org.argeo.eclipse.ui.specific;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Control;
+
+public class FileDropAdapter {
+
+       public void prepareDropTarget(Control control, DropTarget dropTarget) {
+               dropTarget.setTransfer(new Transfer[] { FileTransfer.getInstance() });
+               dropTarget.addDropListener(new DropTargetAdapter() {
+                       @Override
+                       public void dropAccept(DropTargetEvent event) {
+                               if (!FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+                                       event.detail = DND.DROP_NONE;
+                               }
+                       }
+
+                       @Override
+                       public void drop(DropTargetEvent event) {
+                               handleFileDrop(control, event);
+                       }
+               });
+       }
+
+       public void handleFileDrop(Control control, DropTargetEvent event) {
+               String fileList[] = null;
+               FileTransfer ft = FileTransfer.getInstance();
+               if (ft.isSupportedType(event.currentDataType)) {
+                       fileList = (String[]) event.data;
+               }
+               System.out.println(Arrays.toString(fileList));
+       }
+
+       /** Executed in UI thread */
+       protected void processUpload(InputStream in, String fileName, String contentType) throws IOException {
+
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java b/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java
new file mode 100644 (file)
index 0000000..20163cf
--- /dev/null
@@ -0,0 +1,52 @@
+package org.argeo.eclipse.ui.specific;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.swt.widgets.Display;
+
+/** Singleton class providing single sources infos about the UI context. */
+public class UiContext {
+
+       public static HttpServletRequest getHttpRequest() {
+               return null;
+       }
+
+       public static HttpServletResponse getHttpResponse() {
+               return null;
+       }
+
+       public static Locale getLocale() {
+               return Locale.getDefault();
+       }
+
+       public static void setLocale(Locale locale) {
+               Locale.setDefault(locale);
+       }
+
+       /** Can always be null */
+       @SuppressWarnings("unchecked")
+       public static <T> T getData(String key) {
+               Display display = getDisplay();
+               if (display == null)
+                       return null;
+               return (T) display.getData(key);
+       }
+
+       public static void setData(String key, Object value) {
+               Display display = getDisplay();
+               if (display == null)
+                       throw new IllegalStateException("Not display available");
+               display.setData(key, value);
+       }
+
+       private static Display getDisplay() {
+               return Display.getCurrent();
+       }
+
+       private UiContext() {
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileDetails.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileDetails.java
new file mode 100644 (file)
index 0000000..fbb36dd
--- /dev/null
@@ -0,0 +1,9 @@
+package org.eclipse.rap.fileupload;
+
+public interface FileDetails {
+       String getContentType();
+
+       long getContentLength();
+
+       String getFileName();
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadEvent.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadEvent.java
new file mode 100644 (file)
index 0000000..a745280
--- /dev/null
@@ -0,0 +1,21 @@
+package org.eclipse.rap.fileupload;
+
+import java.util.EventObject;
+
+public abstract class FileUploadEvent extends EventObject {
+
+       private static final long serialVersionUID = 1L;
+
+       protected FileUploadEvent(FileUploadHandler source) {
+               super(source);
+       }
+
+       public abstract FileDetails[] getFileDetails();
+
+       public abstract long getContentLength();
+
+       public abstract long getBytesRead();
+
+       public abstract Exception getException();
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadHandler.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadHandler.java
new file mode 100644 (file)
index 0000000..7d89300
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.fileupload;
+
+/**
+ * A file upload handler is used to accept file uploads from a client. After
+ * creating a file upload handler, the server will accept file uploads to the
+ * URL returned by <code>getUploadUrl()</code>. Upload listeners can be attached
+ * to react on progress. When the upload has finished, a FileUploadHandler has
+ * to be disposed of by calling its <code>dispose()</code> method.
+ *
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class FileUploadHandler {
+
+       public FileUploadHandler(FileUploadReceiver fileUploadReceiver) {
+       }
+
+       public void dispose() {
+
+       }
+
+       public void addUploadListener(FileUploadListener listener) {
+
+       }
+
+       public String getUploadUrl() {
+               return null;
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadListener.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadListener.java
new file mode 100644 (file)
index 0000000..b59fd39
--- /dev/null
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.fileupload;
+
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * Listener to react on progress and completion of a file upload.
+ * <p>
+ * <strong>Note:</strong> This listener will be called from a different thread than the UI thread.
+ * Implementations must use {@link Display#asyncExec(Runnable)} to access the UI.
+ * </p>
+ *
+ * @see FileUploadEvent
+ */
+public interface FileUploadListener {
+
+  /**
+   * Called when new information about an in-progress upload is available.
+   *
+   * @param event event object that contains information about the uploaded file
+   * @see FileUploadEvent#getBytesRead()
+   */
+  void uploadProgress( FileUploadEvent event );
+
+  /**
+   * Called when a file upload has finished successfully.
+   *
+   * @param event event object that contains information about the uploaded file
+   * @see FileUploadEvent
+   */
+  void uploadFinished( FileUploadEvent event );
+
+  /**
+   * Called when a file upload failed.
+   *
+   * @param event event object that contains information about the uploaded file
+   * @see FileUploadEvent#getErrorMessage()
+   */
+  void uploadFailed( FileUploadEvent event );
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadReceiver.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/fileupload/FileUploadReceiver.java
new file mode 100644 (file)
index 0000000..3f4cf47
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2013 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.fileupload;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+
+/**
+ * Instances of this interface are responsible for reading and processing the data from a file
+ * upload.
+ */
+public abstract class FileUploadReceiver {
+
+  /**
+   * Reads and processes all data from the provided input stream.
+   *
+   * @param stream the stream to read from
+   * @param details the details of the uploaded file like file name, content-type and size
+   * @throws IOException if an input / output error occurs
+   */
+  public abstract void receive( InputStream stream, FileDetails details ) throws IOException;
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/RWT.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/RWT.java
new file mode 100644 (file)
index 0000000..1688594
--- /dev/null
@@ -0,0 +1,45 @@
+package org.eclipse.rap.rwt;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.argeo.eclipse.ui.rcp.internal.rwt.RcpClient;
+import org.argeo.eclipse.ui.rcp.internal.rwt.RcpResourceManager;
+import org.eclipse.rap.rwt.client.Client;
+import org.eclipse.rap.rwt.service.ResourceManager;
+
+public class RWT {
+       public final static String CUSTOM_VARIANT = "argeo-rcp:CUSTOM_VARIANT";
+       public final static String MARKUP_ENABLED = "argeo-rcp:MARKUP_ENABLED";
+       public static final String TOOLTIP_MARKUP_ENABLED = "argeo-rcp:TOOLTIP_MARKUP_ENABLED";
+       public final static String CUSTOM_ITEM_HEIGHT = "argeo-rcp:CUSTOM_ITEM_HEIGHT";
+       public final static String ACTIVE_KEYS = "argeo-rcp:ACTIVE_KEYS";
+       public final static String CANCEL_KEYS = "argeo-rcp:CANCEL_KEYS";
+       public final static String DEFAULT_THEME_ID  = "argeo-rcp:DEFAULT_THEME_ID";
+
+       public final static int HYPERLINK = 0;
+
+       private static Locale locale = Locale.getDefault();
+       private static RcpClient client = new RcpClient();
+       private static ResourceManager resourceManager = new RcpResourceManager();
+       static {
+
+       }
+
+       public static Locale getLocale() {
+               return locale;
+       }
+
+       public static HttpServletRequest getRequest() {
+               return null;
+       }
+
+       public static ResourceManager getResourceManager() {
+               return resourceManager;
+       }
+
+       public static Client getClient() {
+               return client;
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/SingletonUtil.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/SingletonUtil.java
new file mode 100644 (file)
index 0000000..6e30aa6
--- /dev/null
@@ -0,0 +1,7 @@
+package org.eclipse.rap.rwt;
+
+public class SingletonUtil {
+       public static <T> T getSessionInstance(Class<T> clss) {
+               return null;
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/AbstractEntryPoint.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/AbstractEntryPoint.java
new file mode 100644 (file)
index 0000000..980a818
--- /dev/null
@@ -0,0 +1,43 @@
+package org.eclipse.rap.rwt.application;
+
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public abstract class AbstractEntryPoint implements EntryPoint {
+       private Display display;
+       private Shell shell;
+
+       protected Shell createShell(Display display) {
+               return new Shell(display);
+       }
+
+       protected void createContents(Composite parent) {
+
+       }
+
+       public int createUI() {
+               display = new Display();
+               shell = createShell(display);
+               shell.setLayout(new GridLayout(1, false));
+               createContents(shell);
+               if (shell.getMaximized()) {
+                       shell.layout();
+               } else {
+                       shell.pack();
+               }
+               shell.open();
+               while (!shell.isDisposed()) {
+                       if (!display.readAndDispatch()) {
+                               display.sleep();
+                       }
+               }
+               display.dispose();
+               return 0;
+       }
+
+       protected Shell getShell() {
+               return shell;
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/Application.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/Application.java
new file mode 100644 (file)
index 0000000..6cb5f29
--- /dev/null
@@ -0,0 +1,27 @@
+package org.eclipse.rap.rwt.application;
+
+import java.util.Map;
+
+import org.eclipse.rap.rwt.service.ResourceLoader;
+
+public interface Application {
+       public static enum OperationMode {
+               JEE_COMPATIBILITY, SWT_COMPATIBILITY,
+       }
+
+       void setOperationMode(OperationMode operationMode);
+
+       void addResource(String name, ResourceLoader resourceLoader);
+
+       void setExceptionHandler(ExceptionHandler exceptionHandler);
+
+       void addEntryPoint(String path, EntryPointFactory entryPointFactory,
+                       Map<String, String> properties);
+
+       void addEntryPoint(String path, Class<? extends EntryPoint> entryPoint,
+                       Map<String, String> properties);
+
+       void addStyleSheet(String themeId, String styleSheetLocation,
+                       ResourceLoader resourceLoader);
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ApplicationConfiguration.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ApplicationConfiguration.java
new file mode 100644 (file)
index 0000000..961ad70
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.application;
+
+public interface ApplicationConfiguration {
+       void configure(Application application);
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPoint.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPoint.java
new file mode 100644 (file)
index 0000000..c0d559a
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.application;
+
+public interface EntryPoint {
+       int createUI();
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPointFactory.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/EntryPointFactory.java
new file mode 100644 (file)
index 0000000..d5b24d8
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.application;
+
+public interface EntryPointFactory {
+       public EntryPoint create();
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ExceptionHandler.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/application/ExceptionHandler.java
new file mode 100644 (file)
index 0000000..13daf21
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.application;
+
+public interface ExceptionHandler {
+       public void handleException(Throwable throwable);
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/Client.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/Client.java
new file mode 100644 (file)
index 0000000..934feae
--- /dev/null
@@ -0,0 +1,18 @@
+package org.eclipse.rap.rwt.client;
+
+import java.io.Serializable;
+
+import org.eclipse.rap.rwt.client.service.ClientService;
+
+public interface Client extends Serializable {
+
+  /**
+   * Returns this client's implementation of a given service, if available.
+   *
+   * @param type the type of the requested service, must be a subtype of ClientService
+   * @return the requested service if provided by this client, otherwise <code>null</code>
+   * @see ClientService
+   */
+  <T extends ClientService> T getService( Class<T> type );
+
+}
\ No newline at end of file
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/WebClient.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/WebClient.java
new file mode 100644 (file)
index 0000000..1f19bdd
--- /dev/null
@@ -0,0 +1,10 @@
+package org.eclipse.rap.rwt.client;
+
+public interface WebClient {
+       public final static String FAVICON = "rcp:FAVICON";
+       public final static String PAGE_TITLE = "rcp:PAGE_TITLE";
+       public final static String BODY_HTML = "rcp:BODY_HTML";
+       public final static String THEME_ID = "rcp:THEME_ID";
+       public final static String HEAD_HTML = "rcp:HEAD_HTML";
+       public final static String PAGE_OVERFLOW = "rcp:PAGE_OVERFLOW";
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigation.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigation.java
new file mode 100644 (file)
index 0000000..ffba4e4
--- /dev/null
@@ -0,0 +1,7 @@
+package org.eclipse.rap.rwt.client.service;
+
+public interface BrowserNavigation extends ClientService {
+       void pushState(String state, String title);
+
+       void addBrowserNavigationListener(BrowserNavigationListener listener);
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationEvent.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationEvent.java
new file mode 100644 (file)
index 0000000..3e1b3eb
--- /dev/null
@@ -0,0 +1,10 @@
+package org.eclipse.rap.rwt.client.service;
+
+public class BrowserNavigationEvent {
+       private String state;
+
+       public String getState() {
+               return state;
+       }
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationListener.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/BrowserNavigationListener.java
new file mode 100644 (file)
index 0000000..8319c03
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.client.service;
+
+public interface BrowserNavigationListener {
+       public void navigated(BrowserNavigationEvent event);
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/ClientService.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/ClientService.java
new file mode 100644 (file)
index 0000000..9f479d1
--- /dev/null
@@ -0,0 +1,6 @@
+package org.eclipse.rap.rwt.client.service;
+
+import java.io.Serializable;
+
+public interface ClientService extends Serializable {
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/JavaScriptExecutor.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/JavaScriptExecutor.java
new file mode 100644 (file)
index 0000000..6c44c72
--- /dev/null
@@ -0,0 +1,5 @@
+package org.eclipse.rap.rwt.client.service;
+
+public interface JavaScriptExecutor extends ClientService {
+       public void execute( String code );
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/UrlLauncher.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/client/service/UrlLauncher.java
new file mode 100644 (file)
index 0000000..9dae811
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.rwt.client.service;
+
+/**
+ * The UrlLauncher service allows loading an URL in an external window, application or save dialog.
+ *
+ * @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface UrlLauncher extends ClientService {
+
+  /**
+   * Opens the given URL.
+   *
+   * Any HTTP URL or relative URL will be opened in a new window.
+   * Modern browser may block any attempt to open new windows, but will usually prompt the user to
+   * accept or ignore. Even if accepted, the decision may be applied to only this attempt, or only
+   * to future attempts. It could also trigger a document reload, causing a session restart.
+   *
+   * Non-HTTP URLs like "mailto" will not create a new browser window, but require the client
+   * to have a matching protocol handler registered.
+   *
+   * @param url the URL to open
+   */
+  void openURL( String url );
+
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceLoader.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceLoader.java
new file mode 100644 (file)
index 0000000..7e7116c
--- /dev/null
@@ -0,0 +1,9 @@
+package org.eclipse.rap.rwt.service;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public interface ResourceLoader {
+       public InputStream getResourceAsStream(String resourceName)
+                       throws IOException;
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceManager.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ResourceManager.java
new file mode 100644 (file)
index 0000000..c3379ea
--- /dev/null
@@ -0,0 +1,15 @@
+package org.eclipse.rap.rwt.service;
+
+import java.io.InputStream;
+
+public interface ResourceManager {
+       public void register(String name, InputStream in);
+
+       boolean unregister(String name);
+
+       public InputStream getRegisteredContent(String name);
+
+       public String getLocation(String name);
+
+       public boolean isRegistered(String name);
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ServerPushSession.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/service/ServerPushSession.java
new file mode 100644 (file)
index 0000000..bed194f
--- /dev/null
@@ -0,0 +1,12 @@
+package org.eclipse.rap.rwt.service;
+
+/** Mock, does nothing as this is irrelevant for RCP. */
+public class ServerPushSession {
+       public void start() {
+
+       }
+
+       public void stop() {
+
+       }
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/DropDown.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/DropDown.java
new file mode 100644 (file)
index 0000000..b2a2005
--- /dev/null
@@ -0,0 +1,33 @@
+package org.eclipse.rap.rwt.widgets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Widget;
+
+public class DropDown {
+       private boolean visible=false;
+
+       public DropDown(Widget parent, int style) {
+               // FIXME implement a shell
+       }
+
+       public DropDown(Widget parent) {
+               this(parent, SWT.NONE);
+       }
+
+       public void setVisible(boolean visible) {
+               this.visible = visible;
+       }
+
+       public boolean isVisible() {
+               return visible;
+       }
+       
+       public void setItems( String[] items ) {
+               
+       }
+       
+       public void setSelectionIndex( int selection ) {
+               
+       }
+       
+}
diff --git a/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/FileUpload.java b/rcp/org.argeo.swt.specific.rcp/src/org/eclipse/rap/rwt/widgets/FileUpload.java
new file mode 100644 (file)
index 0000000..cbf1449
--- /dev/null
@@ -0,0 +1,37 @@
+package org.eclipse.rap.rwt.widgets;
+
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+public class FileUpload extends Composite {
+
+       public FileUpload(Composite parent, int style) {
+               super(parent, style);
+       }
+
+       public void addSelectionListener(SelectionListener listener) {
+
+       }
+
+       public void submit(String url) {
+
+       }
+
+       public void setImage(Image image) {
+
+       }
+
+       public void setText(String text) {
+
+       }
+
+       public String getFileName() {
+               return null;
+       }
+
+       public String[] getFileNames() {
+               return null;
+       }
+
+}
diff --git a/rcp/pom.xml b/rcp/pom.xml
new file mode 100644 (file)
index 0000000..185c10c
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons</groupId>
+               <artifactId>argeo-commons</artifactId>
+               <version>2.3-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <groupId>org.argeo.commons.rcp</groupId>
+       <artifactId>argeo-rcp</artifactId>
+       <version>2.3-SNAPSHOT</version>
+       <name>Argeo RCP</name>
+       <packaging>pom</packaging>
+       <modules>
+               <module>org.argeo.swt.minidesktop</module>
+               <module>org.argeo.swt.specific.rcp</module>
+               <module>org.argeo.cms.ui.rcp</module>
+               <module>org.argeo.cms.e4.rcp</module>
+<!--           <module>dep</module> -->
+       </modules>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.tp</groupId>
+                       <artifactId>argeo-tp</artifactId>
+                       <version>${version.argeo-tp}</version>
+                       <scope>provided</scope>
+                       <exclusions>
+                               <!-- Equinox base -->
+                               <!-- <exclusion> -->
+                               <!-- <groupId>org.argeo.tp.equinox</groupId> -->
+                               <!-- <artifactId>org.eclipse.osgi</artifactId> -->
+                               <!-- </exclusion> -->
+                               <!-- <exclusion> -->
+                               <!-- <groupId>org.argeo.tp.equinox</groupId> -->
+                               <!-- <artifactId>org.eclipse.osgi.services</artifactId> -->
+                               <!-- </exclusion> -->
+
+                               <!-- RAP UI -->
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.ui.forms</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.rwt</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.jface</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.ui</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.ui.views</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.ui.workbench</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.rwt.osgi</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.jface.databinding</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.jobs</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.expressions</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.databinding.observable</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.help</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.databinding</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.databinding.beans</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.runtime</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.databinding.property</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>com.ibm.icu.base</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.contenttype</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.core.commands</artifactId>
+                               </exclusion>
+
+                               <!-- Addons -->
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.filedialog</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rap.platform</groupId>
+                                       <artifactId>org.eclipse.rap.fileupload</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp</groupId>
+                       <artifactId>argeo-tp-rcp-e4</artifactId>
+                       <version>${version.argeo-tp}</version>
+                       <scope>provided</scope>
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rcp.platform</groupId>
+                                       <artifactId>org.eclipse.osgi</artifactId>
+                               </exclusion>
+                               <exclusion>
+                                       <groupId>org.argeo.tp.rcp.platform</groupId>
+                                       <artifactId>org.eclipse.osgi.services</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+       </dependencies>
+       <dependencyManagement>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.argeo.tp</groupId>
+                               <artifactId>argeo-tp-rcp-e4</artifactId>
+                               <version>${version.argeo-tp}</version>
+                               <type>pom</type>
+                               <scope>import</scope>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+</project>