]> git.argeo.org Git - gpl/argeo-suite.git/blob - swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java
fd5dca7238c8483290e3ddd320a9a1219c732951
[gpl/argeo-suite.git] / swt / org.argeo.app.swt / src / org / argeo / app / swt / ux / DefaultEditionLayer.java
1 package org.argeo.app.swt.ux;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6
7 import org.argeo.api.acr.Content;
8 import org.argeo.app.ux.SuiteIcon;
9 import org.argeo.app.ux.SuiteStyle;
10 import org.argeo.cms.Localized;
11 import org.argeo.cms.swt.CmsSwtTheme;
12 import org.argeo.cms.swt.CmsSwtUtils;
13 import org.argeo.cms.swt.acr.SwtTabbedArea;
14 import org.argeo.cms.swt.acr.SwtUiProvider;
15 import org.argeo.cms.util.LangUtils;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.custom.SashForm;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Control;
21 import org.osgi.framework.BundleContext;
22 import org.osgi.framework.Constants;
23 import org.osgi.framework.wiring.BundleWiring;
24
25 /** An app layer based on an entry area and an editor area. */
26 public class DefaultEditionLayer implements SwtAppLayer {
27 private String id;
28 private SwtUiProvider entryArea;
29 private SwtUiProvider defaultView;
30 private SwtUiProvider workArea;
31 private List<String> weights = new ArrayList<>();
32 private boolean startMaximized = false;
33 private boolean fixedEntryArea = false;
34 private boolean singleTab = false;
35 private Localized title = null;
36 private Localized singleTabTitle = null;
37
38 @Override
39 public Control createUiPart(Composite parent, Content context) {
40 // TODO Factorize more, or split into more specialised classes?
41 if (entryArea != null) {
42 if (fixedEntryArea) {
43 FixedEditionArea editionArea = new FixedEditionArea(parent, parent.getStyle());
44 Control entryAreaC = entryArea.createUiPart(editionArea.getEntryArea(), context);
45 CmsSwtUtils.style(entryAreaC, SuiteStyle.entryArea);
46 if (this.defaultView != null) {
47 editionArea.getTabbedArea().view(defaultView, context);
48 }
49 return editionArea;
50 } else {
51 SashFormEditionArea editionArea = new SashFormEditionArea(parent, parent.getStyle());
52 entryArea.createUiPart(editionArea.getEntryArea(), context);
53 if (this.defaultView != null) {
54 editionArea.getTabbedArea().view(defaultView, context);
55 }
56 return editionArea;
57 }
58 } else {
59 if (this.workArea != null) {
60 Composite area = new Composite(parent, SWT.NONE);
61 this.workArea.createUiPart(area, context);
62 return area;
63 }
64 CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
65 SwtTabbedArea tabbedArea = createTabbedArea(parent, theme);
66 return tabbedArea;
67 }
68 }
69
70 @Override
71 public void view(SwtUiProvider uiProvider, Composite workAreaC, Content context) {
72 if (workArea != null) {
73 CmsSwtUtils.clear(workAreaC);
74 workArea.createUiPart(workAreaC, context);
75 workAreaC.layout(true, true);
76 return;
77 }
78
79 // tabbed area
80 SwtTabbedArea tabbedArea = findTabbedArea(workAreaC);
81 if (tabbedArea == null)
82 throw new IllegalArgumentException("Unsupported work area " + workAreaC.getClass().getName());
83 if (uiProvider == null) {
84 // reset
85 tabbedArea.closeAllTabs();
86 if (this.defaultView != null) {
87 tabbedArea.view(defaultView, context);
88 }
89 } else {
90 tabbedArea.view(uiProvider, context);
91 }
92 }
93
94 @Override
95 public Content getCurrentContext(Composite workArea) {
96 SwtTabbedArea tabbedArea = findTabbedArea(workArea);
97 if (tabbedArea == null)
98 return null;
99 return tabbedArea.getCurrentContext();
100 }
101
102 private SwtTabbedArea findTabbedArea(Composite workArea) {
103 SwtTabbedArea tabbedArea = null;
104 if (workArea instanceof SashFormEditionArea) {
105 tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
106 } else if (workArea instanceof FixedEditionArea) {
107 tabbedArea = ((FixedEditionArea) workArea).getTabbedArea();
108 } else if (workArea instanceof SwtTabbedArea) {
109 tabbedArea = (SwtTabbedArea) workArea;
110 }
111 return tabbedArea;
112 }
113
114 @Override
115 public void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
116 SwtTabbedArea tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
117 tabbedArea.open(uiProvider, context);
118 }
119
120 @Override
121 public Localized getTitle() {
122 return title;
123 }
124
125 @Override
126 public String getId() {
127 return id;
128 }
129
130 public void init(BundleContext bundleContext, Map<String, Object> properties) {
131 String pid = (String) properties.get(Constants.SERVICE_PID);
132 id = pid;
133
134 weights = LangUtils.toStringList(properties.get(Property.weights.name()));
135 startMaximized = properties.containsKey(Property.startMaximized.name())
136 && "true".equals(properties.get(Property.startMaximized.name()));
137 fixedEntryArea = properties.containsKey(Property.fixedEntryArea.name())
138 && "true".equals(properties.get(Property.fixedEntryArea.name()));
139 if (fixedEntryArea && weights.size() != 0) {
140 throw new IllegalArgumentException("Property " + Property.weights.name() + " should not be set if property "
141 + Property.fixedEntryArea.name() + " is set.");
142 }
143 singleTab = properties.containsKey(Property.singleTab.name())
144 && "true".equals(properties.get(Property.singleTab.name()));
145
146 String titleStr = (String) properties.get(SwtAppLayer.Property.title.name());
147 if (titleStr != null) {
148 if (titleStr.startsWith("%")) {
149 title = new Localized() {
150
151 @Override
152 public String name() {
153 return titleStr;
154 }
155
156 @Override
157 public ClassLoader getL10nClassLoader() {
158 return bundleContext != null
159 ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
160 : getClass().getClassLoader();
161 }
162 };
163 } else {
164 title = new Localized.Untranslated(titleStr);
165 }
166 }
167
168 String singleTabTitleStr = (String) properties.get(SwtAppLayer.Property.singleTabTitle.name());
169 if (singleTabTitleStr != null) {
170 if (singleTabTitleStr.startsWith("%")) {
171 singleTabTitle = new Localized() {
172
173 @Override
174 public String name() {
175 return singleTabTitleStr;
176 }
177
178 @Override
179 public ClassLoader getL10nClassLoader() {
180 return bundleContext != null
181 ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
182 : getClass().getClassLoader();
183 }
184 };
185 } else {
186 singleTabTitle = new Localized.Untranslated(singleTabTitleStr);
187 }
188 }
189
190 }
191
192 public void destroy(BundleContext bundleContext, Map<String, String> properties) {
193
194 }
195
196 public void setEntryArea(SwtUiProvider entryArea) {
197 this.entryArea = entryArea;
198 }
199
200 public void setWorkArea(SwtUiProvider workArea) {
201 this.workArea = workArea;
202 }
203
204 public void setDefaultView(SwtUiProvider defaultView) {
205 this.defaultView = defaultView;
206 }
207
208 SwtTabbedArea createTabbedArea(Composite parent, CmsSwtTheme theme) {
209 SwtTabbedArea tabbedArea = new SwtTabbedArea(parent, SWT.NONE);
210 tabbedArea.setSingleTab(singleTab);
211 if (singleTabTitle != null)
212 tabbedArea.setSingleTabTitle(singleTabTitle.lead());
213 tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style());
214 tabbedArea.setTabStyle(SuiteStyle.mainTab.style());
215 tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style());
216 tabbedArea.setCloseIcon(theme.getSmallIcon(SuiteIcon.close));
217 tabbedArea.setLayoutData(CmsSwtUtils.fillAll());
218 return tabbedArea;
219 }
220
221 // /** A work area based on an entry area and and a tabbed area. */
222 class SashFormEditionArea extends SashForm {
223 private static final long serialVersionUID = 2219125778722702618L;
224 private SwtTabbedArea tabbedArea;
225 private Composite entryC;
226
227 SashFormEditionArea(Composite parent, int style) {
228 super(parent, SWT.HORIZONTAL);
229 CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
230
231 Composite editorC;
232 if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
233 editorC = new Composite(this, SWT.BORDER);
234 entryC = new Composite(this, SWT.BORDER);
235 } else {
236 entryC = new Composite(this, SWT.NONE);
237 editorC = new Composite(this, SWT.NONE);
238 }
239
240 // sash form specific
241 if (weights.size() != 0) {
242 int[] actualWeight = new int[weights.size()];
243 for (int i = 0; i < weights.size(); i++) {
244 actualWeight[i] = Integer.parseInt(weights.get(i));
245 }
246 setWeights(actualWeight);
247 } else {
248 int[] actualWeights = new int[] { 3000, 7000 };
249 setWeights(actualWeights);
250 }
251 if (startMaximized)
252 setMaximizedControl(editorC);
253
254 GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
255 // editorAreaLayout.verticalSpacing = 0;
256 // editorAreaLayout.marginBottom = 0;
257 // editorAreaLayout.marginHeight = 0;
258 // editorAreaLayout.marginLeft = 0;
259 // editorAreaLayout.marginRight = 0;
260 editorC.setLayout(editorAreaLayout);
261
262 tabbedArea = createTabbedArea(editorC, theme);
263 }
264
265 SwtTabbedArea getTabbedArea() {
266 return tabbedArea;
267 }
268
269 Composite getEntryArea() {
270 return entryC;
271 }
272
273 }
274
275 class FixedEditionArea extends Composite {
276 private static final long serialVersionUID = -5525672639277322465L;
277 private SwtTabbedArea tabbedArea;
278 private Composite entryC;
279
280 public FixedEditionArea(Composite parent, int style) {
281 super(parent, style);
282 CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
283
284 setLayout(CmsSwtUtils.noSpaceGridLayout(2));
285
286 Composite editorC;
287 if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
288 editorC = new Composite(this, SWT.NONE);
289 entryC = new Composite(this, SWT.NONE);
290 } else {
291 entryC = new Composite(this, SWT.NONE);
292 editorC = new Composite(this, SWT.NONE);
293 }
294 entryC.setLayoutData(CmsSwtUtils.fillHeight());
295
296 GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
297 // editorAreaLayout.verticalSpacing = 0;
298 // editorAreaLayout.marginBottom = 0;
299 // editorAreaLayout.marginHeight = 0;
300 // editorAreaLayout.marginLeft = 0;
301 // editorAreaLayout.marginRight = 0;
302 editorC.setLayout(editorAreaLayout);
303 editorC.setLayoutData(CmsSwtUtils.fillAll());
304
305 tabbedArea = createTabbedArea(editorC, theme);
306 }
307
308 SwtTabbedArea getTabbedArea() {
309 return tabbedArea;
310 }
311
312 Composite getEntryArea() {
313 return entryC;
314 }
315 }
316
317 }