View Javadoc
1   package org.argeo.cms.ui.script;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import javax.jcr.Node;
7   import javax.jcr.Repository;
8   import javax.jcr.RepositoryException;
9   import javax.script.Invocable;
10  import javax.script.ScriptException;
11  
12  import org.argeo.cms.ui.CmsUiProvider;
13  import org.argeo.cms.ui.util.CmsPane;
14  import org.argeo.cms.ui.util.CmsUiUtils;
15  import org.argeo.cms.ui.util.SimpleErgonomics;
16  import org.argeo.eclipse.ui.Selected;
17  import org.eclipse.rap.rwt.RWT;
18  import org.eclipse.rap.rwt.application.Application;
19  import org.eclipse.rap.rwt.application.EntryPoint;
20  import org.eclipse.rap.rwt.application.EntryPointFactory;
21  import org.eclipse.rap.rwt.client.WebClient;
22  import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
23  import org.eclipse.swt.SWT;
24  import org.eclipse.swt.events.SelectionEvent;
25  import org.eclipse.swt.widgets.Button;
26  import org.eclipse.swt.widgets.Composite;
27  import org.eclipse.swt.widgets.Control;
28  import org.eclipse.swt.widgets.Label;
29  import org.osgi.framework.BundleContext;
30  
31  public class AppUi implements CmsUiProvider, Branding {
32  	private final CmsScriptApp app;
33  
34  	private CmsUiProvider ui;
35  	private String createUi;
36  	private Object impl;
37  	private String script;
38  	// private Branding branding = new Branding();
39  
40  	private EntryPointFactory factory;
41  
42  	// Branding
43  	private String themeId;
44  	private String additionalHeaders;
45  	private String bodyHtml;
46  	private String pageTitle;
47  	private String pageOverflow;
48  	private String favicon;
49  
50  	public AppUi(CmsScriptApp app) {
51  		this.app = app;
52  	}
53  
54  	public AppUi(CmsScriptApp app, String scriptPath) {
55  		this.app = app;
56  		this.ui = new ScriptUi((BundleContext) app.getScriptEngine().get(CmsScriptRwtApplication.BC), app.getScriptEngine(), scriptPath);
57  	}
58  
59  	public AppUi(CmsScriptApp app, CmsUiProvider uiProvider) {
60  		this.app = app;
61  		this.ui = uiProvider;
62  	}
63  
64  	public AppUi(CmsScriptApp app, EntryPointFactory factory) {
65  		this.app = app;
66  		this.factory = factory;
67  	}
68  
69  	public void apply(Repository repository, Application application, Branding appBranding, String path) {
70  		Map<String, String> factoryProperties = new HashMap<>();
71  		if (appBranding != null)
72  			appBranding.applyBranding(factoryProperties);
73  		applyBranding(factoryProperties);
74  		if (factory != null) {
75  			application.addEntryPoint("/" + path, factory, factoryProperties);
76  		} else {
77  			EntryPointFactory entryPointFactory = new EntryPointFactory() {
78  				@Override
79  				public EntryPoint create() {
80  					SimpleErgonomics ergonomics = new SimpleErgonomics(repository, "main", "/home/root/argeo:keyring",
81  							AppUi.this, factoryProperties);
82  //					CmsUiProvider header = app.getHeader();
83  //					if (header != null)
84  //						ergonomics.setHeader(header);
85  					app.applySides(ergonomics);
86  					Integer headerHeight = app.getHeaderHeight();
87  					if (headerHeight != null)
88  						ergonomics.setHeaderHeight(headerHeight);
89  					return ergonomics;
90  				}
91  			};
92  			application.addEntryPoint("/" + path, entryPointFactory, factoryProperties);
93  		}
94  	}
95  
96  	public void setUi(CmsUiProvider uiProvider) {
97  		this.ui = uiProvider;
98  	}
99  
100 	public void applyBranding(Map<String, String> properties) {
101 		if (themeId != null)
102 			properties.put(WebClient.THEME_ID, themeId);
103 		if (additionalHeaders != null)
104 			properties.put(WebClient.HEAD_HTML, additionalHeaders);
105 		if (bodyHtml != null)
106 			properties.put(WebClient.BODY_HTML, bodyHtml);
107 		if (pageTitle != null)
108 			properties.put(WebClient.PAGE_TITLE, pageTitle);
109 		if (pageOverflow != null)
110 			properties.put(WebClient.PAGE_OVERFLOW, pageOverflow);
111 		if (favicon != null)
112 			properties.put(WebClient.FAVICON, favicon);
113 	}
114 
115 	// public Branding getBranding() {
116 	// return branding;
117 	// }
118 
119 	@Override
120 	public Control createUi(Composite parent, Node context) throws RepositoryException {
121 		CmsPane cmsPane = new CmsPane(parent, SWT.NONE);
122 
123 		if (false) {
124 			// QA
125 			CmsUiUtils.style(cmsPane.getQaArea(), "qa");
126 			Button reload = new Button(cmsPane.getQaArea(), SWT.FLAT);
127 			CmsUiUtils.style(reload, "qa");
128 			reload.setText("Reload");
129 			reload.addSelectionListener(new Selected() {
130 				private static final long serialVersionUID = 1L;
131 
132 				@Override
133 				public void widgetSelected(SelectionEvent e) {
134 					new Thread() {
135 						@Override
136 						public void run() {
137 							app.reload();
138 						}
139 					}.start();
140 					RWT.getClient().getService(JavaScriptExecutor.class)
141 							.execute("setTimeout('location.reload()',1000)");
142 				}
143 			});
144 
145 			// Support
146 			CmsUiUtils.style(cmsPane.getSupportArea(), "support");
147 			Label msg = new Label(cmsPane.getSupportArea(), SWT.NONE);
148 			CmsUiUtils.style(msg, "support");
149 			msg.setText("UNSUPPORTED DEVELOPMENT VERSION");
150 		}
151 
152 		if (ui != null) {
153 			ui.createUi(cmsPane.getMainArea(), context);
154 		}
155 		if (createUi != null) {
156 			Invocable invocable = (Invocable) app.getScriptEngine();
157 			try {
158 				invocable.invokeFunction(createUi, cmsPane.getMainArea(), context);
159 
160 			} catch (NoSuchMethodException e) {
161 				// TODO Auto-generated catch block
162 				e.printStackTrace();
163 			} catch (ScriptException e) {
164 				// TODO Auto-generated catch block
165 				e.printStackTrace();
166 			}
167 		}
168 		if (impl != null) {
169 			Invocable invocable = (Invocable) app.getScriptEngine();
170 			try {
171 				invocable.invokeMethod(impl, "createUi", cmsPane.getMainArea(), context);
172 
173 			} catch (NoSuchMethodException e) {
174 				// TODO Auto-generated catch block
175 				e.printStackTrace();
176 			} catch (ScriptException e) {
177 				// TODO Auto-generated catch block
178 				e.printStackTrace();
179 			}
180 		}
181 
182 		// Invocable invocable = (Invocable) app.getScriptEngine();
183 		// try {
184 		// invocable.invokeMethod(AppUi.this, "initUi", parent, context);
185 		//
186 		// } catch (NoSuchMethodException e) {
187 		// // TODO Auto-generated catch block
188 		// e.printStackTrace();
189 		// } catch (ScriptException e) {
190 		// // TODO Auto-generated catch block
191 		// e.printStackTrace();
192 		// }
193 
194 		return null;
195 	}
196 
197 	public void setCreateUi(String createUi) {
198 		this.createUi = createUi;
199 	}
200 
201 	public void setImpl(Object impl) {
202 		this.impl = impl;
203 	}
204 
205 	public Object getImpl() {
206 		return impl;
207 	}
208 
209 	public String getScript() {
210 		return script;
211 	}
212 
213 	public void setScript(String script) {
214 		this.script = script;
215 	}
216 
217 	// Branding
218 	public String getThemeId() {
219 		return themeId;
220 	}
221 
222 	public void setThemeId(String themeId) {
223 		this.themeId = themeId;
224 	}
225 
226 	public String getAdditionalHeaders() {
227 		return additionalHeaders;
228 	}
229 
230 	public void setAdditionalHeaders(String additionalHeaders) {
231 		this.additionalHeaders = additionalHeaders;
232 	}
233 
234 	public String getBodyHtml() {
235 		return bodyHtml;
236 	}
237 
238 	public void setBodyHtml(String bodyHtml) {
239 		this.bodyHtml = bodyHtml;
240 	}
241 
242 	public String getPageTitle() {
243 		return pageTitle;
244 	}
245 
246 	public void setPageTitle(String pageTitle) {
247 		this.pageTitle = pageTitle;
248 	}
249 
250 	public String getPageOverflow() {
251 		return pageOverflow;
252 	}
253 
254 	public void setPageOverflow(String pageOverflow) {
255 		this.pageOverflow = pageOverflow;
256 	}
257 
258 	public String getFavicon() {
259 		return favicon;
260 	}
261 
262 	public void setFavicon(String favicon) {
263 		this.favicon = favicon;
264 	}
265 
266 }