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