]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/rcp/org.argeo.cms.swt.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java
Extends CLI default classpath with the new third-party libraries
[lgpl/argeo-commons.git] / swt / rcp / org.argeo.cms.swt.rcp / src / org / argeo / cms / ui / rcp / CmsRcpApp.java
1 package org.argeo.cms.ui.rcp;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.security.PrivilegedAction;
6 import java.util.Map;
7 import java.util.UUID;
8
9 import javax.security.auth.Subject;
10 import javax.security.auth.login.LoginContext;
11 import javax.security.auth.login.LoginException;
12
13 import org.argeo.api.cms.CmsApp;
14 import org.argeo.api.cms.CmsAuth;
15 import org.argeo.api.cms.CmsEventBus;
16 import org.argeo.api.cms.CmsLog;
17 import org.argeo.api.cms.CmsSession;
18 import org.argeo.api.cms.ux.CmsTheme;
19 import org.argeo.api.cms.ux.CmsView;
20 import org.argeo.cms.swt.AbstractSwtCmsView;
21 import org.argeo.cms.swt.CmsSwtUtils;
22 import org.eclipse.e4.ui.css.core.engine.CSSEngine;
23 import org.eclipse.e4.ui.css.core.engine.CSSErrorHandler;
24 import org.eclipse.e4.ui.css.swt.engine.CSSSWTEngineImpl;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Display;
27 import org.eclipse.swt.widgets.Shell;
28
29 /** Runs a {@link CmsApp} as an SWT desktop application. */
30 @SuppressWarnings("restriction")
31 public class CmsRcpApp extends AbstractSwtCmsView implements CmsView {
32 private final static CmsLog log = CmsLog.getLog(CmsRcpApp.class);
33
34 private Shell shell;
35 private CmsApp cmsApp;
36
37 private CSSEngine cssEngine;
38
39 public CmsRcpApp(String uiName) {
40 super(uiName);
41 uid = UUID.randomUUID().toString();
42 }
43
44 public void initRcpApp() {
45 display = Display.getCurrent();
46 shell = new Shell(display);
47 shell.setText("Argeo CMS");
48 Composite parent = shell;
49 parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
50 CmsSwtUtils.registerCmsView(shell, CmsRcpApp.this);
51
52 try {
53 loginContext = new LoginContext(CmsAuth.SINGLE_USER.getLoginContextName());
54 loginContext.login();
55 } catch (LoginException e) {
56 throw new IllegalStateException("Could not log in.", e);
57 }
58 if (log.isDebugEnabled())
59 log.debug("Logged in to desktop: " + loginContext.getSubject());
60
61 Subject.doAs(loginContext.getSubject(), (PrivilegedAction<Void>) () -> {
62
63 // TODO factorise with web app
64 parent.setData(CmsApp.UI_NAME_PROPERTY, uiName);
65 ui = cmsApp.initUi(parent);
66 if (ui instanceof Composite)
67 ((Composite) ui).setLayoutData(CmsSwtUtils.fillAll());
68 // we need ui to be set before refresh so that CmsView can store UI context data
69 // in it.
70 cmsApp.refreshUi(ui, null);
71
72 // Styling
73 CmsTheme theme = CmsSwtUtils.getCmsTheme(parent);
74 if (theme != null) {
75 cssEngine = new CSSSWTEngineImpl(display);
76 for (String path : theme.getSwtCssPaths()) {
77 try (InputStream in = theme.loadPath(path)) {
78 cssEngine.parseStyleSheet(in);
79 } catch (IOException e) {
80 throw new IllegalStateException("Cannot load stylesheet " + path, e);
81 }
82 }
83 cssEngine.setErrorHandler(new CSSErrorHandler() {
84 public void error(Exception e) {
85 log.error("SWT styling error: ", e);
86 }
87 });
88 applyStyles(shell);
89 }
90 shell.layout(true, true);
91
92 shell.open();
93 return null;
94 });
95 }
96
97 /*
98 * CMS VIEW
99 */
100
101 @Override
102 public void navigateTo(String state) {
103 throw new UnsupportedOperationException();
104 }
105
106 @Override
107 public void authChange(LoginContext loginContext) {
108 }
109
110 @Override
111 public void logout() {
112 if (loginContext != null)
113 try {
114 loginContext.logout();
115 } catch (LoginException e) {
116 log.error("Cannot log out", e);
117 }
118 }
119
120 @Override
121 public void exception(Throwable e) {
122 log.error("Unexpected exception in CMS RCP", e);
123 }
124
125 @Override
126 public CmsSession getCmsSession() {
127 CmsSession cmsSession = cmsApp.getCmsContext().getCmsSession(getSubject());
128 return cmsSession;
129 }
130
131 @Override
132 public boolean isAnonymous() {
133 return false;
134 }
135
136 @Override
137 public void applyStyles(Object node) {
138 if (cssEngine != null)
139 cssEngine.applyStyles(node, true);
140 }
141
142 public Shell getShell() {
143 return shell;
144 }
145
146 @Override
147 public CmsEventBus getCmsEventBus() {
148 return cmsApp.getCmsContext().getCmsEventBus();
149 }
150
151 @Override
152 public CmsApp getCmsApp() {
153 return cmsApp;
154 }
155
156 /*
157 * DEPENDENCY INJECTION
158 */
159 public void setCmsApp(CmsApp cmsApp, Map<String, String> properties) {
160 this.cmsApp = cmsApp;
161 }
162
163 public void unsetCmsApp(CmsApp cmsApp, Map<String, String> properties) {
164 this.cmsApp = null;
165 }
166
167 }