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;
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;
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;
// 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();
// 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())
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)