Refactor SWT directory structure.
[lgpl/argeo-commons.git] / swt / rcp / org.argeo.cms.swt.rcp / src / org / argeo / cms / ui / rcp / CmsRcpDisplayFactory.java
diff --git a/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/CmsRcpDisplayFactory.java b/swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/CmsRcpDisplayFactory.java
new file mode 100644 (file)
index 0000000..ec471c0
--- /dev/null
@@ -0,0 +1,90 @@
+package org.argeo.cms.ui.rcp;
+
+import java.nio.file.Path;
+
+import org.argeo.api.cms.CmsApp;
+import org.argeo.util.OS;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.service.event.EventAdmin;
+import org.eclipse.swt.events.DisposeListener;
+
+/** Creates the SWT {@link Display} in a dedicated thread. */
+public class CmsRcpDisplayFactory {
+       /** File name in a run directory */
+       private final static String ARGEO_RCP_URL = "argeo.rcp.url";
+
+       /** There is only one display in RCP mode */
+       private static Display display;
+
+       private CmsUiThread uiThread;
+
+       private boolean shutdown = false;
+
+       public void init() {
+               uiThread = new CmsUiThread();
+               uiThread.start();
+               while (display == null)
+                       try {
+                               Thread.sleep(100);
+                       } catch (InterruptedException e) {
+                               // silent
+                       }
+       }
+
+       public void destroy() {
+               shutdown = true;
+               display.wake();
+               try {
+                       uiThread.join();
+               } catch (InterruptedException e) {
+                       // silent
+               } finally {
+                       uiThread = null;
+               }
+       }
+
+       class CmsUiThread extends Thread {
+
+               public CmsUiThread() {
+                       super("CMS UI");
+               }
+
+               @Override
+               public void run() {
+                       display = Display.getDefault();
+                       display.setRuntimeExceptionHandler((e) -> e.printStackTrace());
+                       display.setErrorHandler((e) -> e.printStackTrace());
+
+//                     for (String contextName : cmsApps.keySet()) {
+//                             openCmsApp(contextName);
+//                     }
+
+                       while (!shutdown) {
+                               if (!display.readAndDispatch())
+                                       display.sleep();
+                       }
+                       display.dispose();
+                       display = null;
+               }
+       }
+
+       public static Display getDisplay() {
+               return display;
+       }
+
+       public static void openCmsApp(EventAdmin eventAdmin, CmsApp cmsApp, String uiName,
+                       DisposeListener disposeListener) {
+               CmsRcpDisplayFactory.getDisplay().syncExec(() -> {
+                       CmsRcpApp cmsRcpApp = new CmsRcpApp(uiName);
+                       cmsRcpApp.setEventAdmin(eventAdmin);
+                       cmsRcpApp.setCmsApp(cmsApp, null);
+                       cmsRcpApp.initRcpApp();
+                       if (disposeListener != null)
+                               cmsRcpApp.getShell().addDisposeListener(disposeListener);
+               });
+       }
+
+       public static Path getUrlRunFile() {
+               return OS.getRunDir().resolve(CmsRcpDisplayFactory.ARGEO_RCP_URL);
+       }
+}