1 package org
.argeo
.cms
.ui
.rcp
;
3 import java
.lang
.System
.Logger
;
4 import java
.lang
.System
.Logger
.Level
;
5 import java
.nio
.file
.Path
;
7 import org
.argeo
.api
.cms
.CmsApp
;
8 import org
.argeo
.cms
.util
.OS
;
9 import org
.eclipse
.swt
.events
.DisposeListener
;
10 import org
.eclipse
.swt
.widgets
.Display
;
12 /** Creates the SWT {@link Display} in a dedicated thread. */
13 public class CmsRcpDisplayFactory
{
14 private final static Logger logger
= System
.getLogger(CmsRcpDisplayFactory
.class.getName());
16 /** File name in a run directory */
17 private final static String ARGEO_RCP_URL
= "argeo.rcp.url";
19 /** There is only one display in RCP mode */
20 private static Display display
;
22 private CmsUiThread uiThread
;
24 private boolean shutdown
= false;
27 uiThread
= new CmsUiThread();
29 while (display
== null)
32 } catch (InterruptedException e
) {
37 public void destroy() {
42 } catch (InterruptedException e
) {
49 class CmsUiThread
extends Thread
{
51 public CmsUiThread() {
58 display
= Display
.getDefault();
59 display
.setRuntimeExceptionHandler((e
) -> e
.printStackTrace());
60 display
.setErrorHandler((e
) -> e
.printStackTrace());
63 if (!display
.readAndDispatch())
68 } catch (UnsatisfiedLinkError e
) {
69 logger
.log(Level
.ERROR
,
70 "Cannot load SWT, probably because the OSGi framework has been refresh. Restart the application.",
76 public static Display
getDisplay() {
80 public static void openCmsApp(CmsApp cmsApp
, String uiName
, DisposeListener disposeListener
) {
81 CmsRcpDisplayFactory
.getDisplay().syncExec(() -> {
82 CmsRcpApp cmsRcpApp
= new CmsRcpApp(uiName
);
83 cmsRcpApp
.setCmsApp(cmsApp
, null);
84 cmsRcpApp
.initRcpApp();
85 if (disposeListener
!= null)
86 cmsRcpApp
.getShell().addDisposeListener(disposeListener
);
90 public static Path
getUrlRunFile() {
91 return OS
.getRunDir().resolve(CmsRcpDisplayFactory
.ARGEO_RCP_URL
);