]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui.rap/src/org/argeo/cms/web/SimpleErgonomics.java
Stop trying if UI loop is not supported.
[lgpl/argeo-commons.git] / org.argeo.cms.ui.rap / src / org / argeo / cms / web / SimpleErgonomics.java
1 package org.argeo.cms.web;
2
3 import java.util.Map;
4 import java.util.UUID;
5
6 import javax.jcr.Node;
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryException;
9
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12 import org.argeo.cms.CmsException;
13 import org.argeo.cms.ui.CmsImageManager;
14 import org.argeo.cms.ui.CmsStyles;
15 import org.argeo.cms.ui.CmsUiProvider;
16 import org.argeo.cms.ui.UxContext;
17 import org.argeo.cms.ui.util.CmsUiUtils;
18 import org.argeo.cms.ui.util.DefaultImageManager;
19 import org.argeo.cms.ui.util.SimpleUxContext;
20 import org.argeo.cms.ui.util.SystemNotifications;
21 import org.eclipse.rap.rwt.RWT;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.layout.FillLayout;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Control;
28
29 /** Simple header/body ergonomics. */
30 public class SimpleErgonomics extends AbstractCmsEntryPoint {
31 private static final long serialVersionUID = 8743413921359548523L;
32
33 private final static Log log = LogFactory.getLog(SimpleErgonomics.class);
34
35 private boolean uiInitialized = false;
36 private Composite headerArea;
37 private Composite leftArea;
38 private Composite rightArea;
39 private Composite footerArea;
40 private Composite bodyArea;
41 private final CmsUiProvider uiProvider;
42
43 private CmsUiProvider header;
44 private Integer headerHeight = 0;
45 private Integer footerHeight = 0;
46 private CmsUiProvider lead;
47 private CmsUiProvider end;
48 private CmsUiProvider footer;
49
50 private CmsImageManager imageManager = new DefaultImageManager();
51 private UxContext uxContext = null;
52 private String uid;
53
54 public SimpleErgonomics(Repository repository, String workspace, String defaultPath, CmsUiProvider uiProvider,
55 Map<String, String> factoryProperties) {
56 super(repository, workspace, defaultPath, factoryProperties);
57 this.uiProvider = uiProvider;
58 }
59
60 @Override
61 protected void initUi(Composite parent) {
62 uid = UUID.randomUUID().toString();
63 parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
64 parent.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(3, false)));
65
66 uxContext = new SimpleUxContext();
67 if (!getUxContext().isMasterData())
68 createAdminArea(parent);
69 headerArea = new Composite(parent, SWT.NONE);
70 headerArea.setLayout(new FillLayout());
71 GridData headerData = new GridData(SWT.FILL, SWT.FILL, false, false, 3, 1);
72 headerData.heightHint = headerHeight;
73 headerArea.setLayoutData(headerData);
74
75 // TODO: bi-directional
76 leftArea = new Composite(parent, SWT.NONE);
77 leftArea.setLayoutData(new GridData(SWT.LEAD, SWT.TOP, false, false));
78 leftArea.setLayout(CmsUiUtils.noSpaceGridLayout());
79
80 bodyArea = new Composite(parent, SWT.NONE);
81 bodyArea.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_BODY);
82 bodyArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
83 bodyArea.setLayout(CmsUiUtils.noSpaceGridLayout());
84
85 // TODO: bi-directional
86 rightArea = new Composite(parent, SWT.NONE);
87 rightArea.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));
88 rightArea.setLayout(CmsUiUtils.noSpaceGridLayout());
89
90 footerArea = new Composite(parent, SWT.NONE);
91 // footerArea.setLayout(new FillLayout());
92 GridData footerData = new GridData(SWT.FILL, SWT.FILL, false, false, 3, 1);
93 footerData.heightHint = footerHeight;
94 footerArea.setLayoutData(footerData);
95
96 uiInitialized = true;
97 refresh();
98 }
99
100 @Override
101 protected void refresh() {
102 if (!uiInitialized)
103 return;
104 if (getState() == null)
105 setState("");
106 refreshSides();
107 refreshBody();
108 if (log.isTraceEnabled())
109 log.trace("UI refreshed " + getNode());
110 }
111
112 protected void createAdminArea(Composite parent) {
113 }
114
115 @Deprecated
116 protected void refreshHeader() {
117 if (header == null)
118 return;
119
120 for (Control child : headerArea.getChildren())
121 child.dispose();
122 try {
123 header.createUi(headerArea, getNode());
124 } catch (RepositoryException e) {
125 throw new CmsException("Cannot refresh header", e);
126 }
127 headerArea.layout(true, true);
128 }
129
130 protected void refreshSides() {
131 refresh(headerArea, header, CmsStyles.CMS_HEADER);
132 refresh(leftArea, lead, CmsStyles.CMS_LEAD);
133 refresh(rightArea, end, CmsStyles.CMS_END);
134 refresh(footerArea, footer, CmsStyles.CMS_FOOTER);
135 }
136
137 private void refresh(Composite area, CmsUiProvider uiProvider, String style) {
138 if (uiProvider == null)
139 return;
140
141 for (Control child : area.getChildren())
142 child.dispose();
143 CmsUiUtils.style(area, style);
144 try {
145 uiProvider.createUi(area, getNode());
146 } catch (RepositoryException e) {
147 throw new CmsException("Cannot refresh header", e);
148 }
149 area.layout(true, true);
150 }
151
152 protected void refreshBody() {
153 // Exception
154 Throwable exception = getException();
155 if (exception != null) {
156 SystemNotifications systemNotifications = new SystemNotifications(bodyArea);
157 systemNotifications.notifyException(exception);
158 resetException();
159 return;
160 // TODO report
161 }
162
163 // clear
164 for (Control child : bodyArea.getChildren())
165 child.dispose();
166 bodyArea.setLayout(CmsUiUtils.noSpaceGridLayout());
167
168 try {
169 Node node = getNode();
170 // if (node == null)
171 // log.error("Context cannot be null");
172 // else
173 uiProvider.createUi(bodyArea, node);
174 } catch (RepositoryException e) {
175 throw new CmsException("Cannot refresh body", e);
176 }
177
178 bodyArea.layout(true, true);
179 }
180
181 @Override
182 public UxContext getUxContext() {
183 return uxContext;
184 }
185 @Override
186 public String getUid() {
187 return uid;
188 }
189
190 @Override
191 public CmsImageManager getImageManager() {
192 return imageManager;
193 }
194
195 public void setHeader(CmsUiProvider header) {
196 this.header = header;
197 }
198
199 public void setHeaderHeight(Integer headerHeight) {
200 this.headerHeight = headerHeight;
201 }
202
203 public void setImageManager(CmsImageManager imageManager) {
204 this.imageManager = imageManager;
205 }
206
207 public CmsUiProvider getLead() {
208 return lead;
209 }
210
211 public void setLead(CmsUiProvider lead) {
212 this.lead = lead;
213 }
214
215 public CmsUiProvider getEnd() {
216 return end;
217 }
218
219 public void setEnd(CmsUiProvider end) {
220 this.end = end;
221 }
222
223 public CmsUiProvider getFooter() {
224 return footer;
225 }
226
227 public void setFooter(CmsUiProvider footer) {
228 this.footer = footer;
229 }
230
231 public CmsUiProvider getHeader() {
232 return header;
233 }
234
235 public void setFooterHeight(Integer footerHeight) {
236 this.footerHeight = footerHeight;
237 }
238
239 }