SWT styling.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2020 08:20:42 +0000 (10:20 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2020 08:20:42 +0000 (10:20 +0200)
rcp/org.argeo.cms.ui.rcp/bnd.bnd
rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java
rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiConstants.java [new file with mode: 0644]

index 8e906757a813b772c030c3d968acc4392ca87aa9..c3704d8bfc91d6c0b133fb57fd25ab6f270da6da 100644 (file)
@@ -6,4 +6,5 @@ org.argeo.api,\
 org.argeo.cms.auth,\
 org.eclipse.swt,\
 org.eclipse.swt.graphics,\
+org.w3c.css.sac,\
 *
index 4ce89789dfadbf871a859dd48b1caa77ce03b221..aa843c4590a7714556e1c8d46ec9be5ed535a263 100644 (file)
@@ -1,5 +1,7 @@
 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;
@@ -9,12 +11,18 @@ 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.cms.ui.CmsApp;
 import org.argeo.cms.ui.CmsImageManager;
+import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.UxContext;
 import org.argeo.cms.ui.util.CmsUiUtils;
+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;
@@ -23,7 +31,10 @@ 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 Display display;
        private Shell shell;
        private CmsApp cmsApp;
@@ -32,14 +43,21 @@ public class CmsRcpApp implements CmsView {
        // CMS View
        private String uid;
        private LoginContext loginContext;
-       
+
        private EventAdmin eventAdmin;
 
+       private CSSEngine cssEngine;
+
        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();
 
@@ -96,6 +114,26 @@ public class CmsRcpApp implements CmsView {
                                // ui.setData(CmsApp.UI_NAME_PROPERTY, uiName);
                                ui.setLayoutData(CmsUiUtils.fillAll());
 
+                               // Styling
+                               CmsTheme theme = CmsTheme.getCmsTheme(ui);
+                               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())
@@ -159,6 +197,12 @@ public class CmsRcpApp implements CmsView {
                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)
diff --git a/rcp/org.argeo.eclipse.ui.rcp/src/org/argeo/eclipse/ui/specific/EclipseUiConstants.java b/rcp/org.argeo.eclipse.ui.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;
+}