]> git.argeo.org Git - lgpl/argeo-commons.git/blob - rcp/CmsRcpDisplayFactory.java
Prepare next development cycle
[lgpl/argeo-commons.git] / rcp / CmsRcpDisplayFactory.java
1 package org.argeo.cms.ui.rcp;
2
3 import java.nio.file.Path;
4
5 import org.argeo.api.cms.CmsApp;
6 import org.argeo.util.OS;
7 import org.eclipse.swt.widgets.Display;
8 import org.osgi.service.event.EventAdmin;
9 import org.eclipse.swt.events.DisposeListener;
10
11 /** Creates the SWT {@link Display} in a dedicated thread. */
12 public class CmsRcpDisplayFactory {
13 /** File name in a run directory */
14 private final static String ARGEO_RCP_URL = "argeo.rcp.url";
15
16 /** There is only one display in RCP mode */
17 private static Display display;
18
19 private CmsUiThread uiThread;
20
21 private boolean shutdown = false;
22
23 public void init() {
24 uiThread = new CmsUiThread();
25 uiThread.start();
26 while (display == null)
27 try {
28 Thread.sleep(100);
29 } catch (InterruptedException e) {
30 // silent
31 }
32 }
33
34 public void destroy() {
35 shutdown = true;
36 display.wake();
37 try {
38 uiThread.join();
39 } catch (InterruptedException e) {
40 // silent
41 } finally {
42 uiThread = null;
43 }
44 }
45
46 class CmsUiThread extends Thread {
47
48 public CmsUiThread() {
49 super("CMS UI");
50 }
51
52 @Override
53 public void run() {
54 display = Display.getDefault();
55 display.setRuntimeExceptionHandler((e) -> e.printStackTrace());
56 display.setErrorHandler((e) -> e.printStackTrace());
57
58 // for (String contextName : cmsApps.keySet()) {
59 // openCmsApp(contextName);
60 // }
61
62 while (!shutdown) {
63 if (!display.readAndDispatch())
64 display.sleep();
65 }
66 display.dispose();
67 display = null;
68 }
69 }
70
71 public static Display getDisplay() {
72 return display;
73 }
74
75 public static void openCmsApp(EventAdmin eventAdmin, CmsApp cmsApp, String uiName,
76 DisposeListener disposeListener) {
77 CmsRcpDisplayFactory.getDisplay().syncExec(() -> {
78 CmsRcpApp cmsRcpApp = new CmsRcpApp(uiName);
79 cmsRcpApp.setEventAdmin(eventAdmin);
80 cmsRcpApp.setCmsApp(cmsApp, null);
81 cmsRcpApp.initRcpApp();
82 if (disposeListener != null)
83 cmsRcpApp.getShell().addDisposeListener(disposeListener);
84 });
85 }
86
87 public static Path getUrlRunFile() {
88 return OS.getRunDir().resolve(CmsRcpDisplayFactory.ARGEO_RCP_URL);
89 }
90 }