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