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