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