1 package org
.argeo
.app
.swt
.ux
;
3 import java
.util
.ArrayList
;
6 import java
.util
.Objects
;
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
;
27 /** An app layer based on an entry area and an editor area. */
28 public class DefaultEditionLayer
implements SwtAppLayer
{
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;
41 public Control
createUiPart(Composite parent
, Content context
) {
42 // TODO Factorize more, or split into more specialised classes?
43 if (entryArea
!= null) {
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
);
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
);
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
);
68 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
69 SwtTabbedArea tabbedArea
= createTabbedArea(parent
, theme
);
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);
84 SwtTabbedArea tabbedArea
= findTabbedArea(workAreaC
);
85 if (tabbedArea
== null)
86 throw new IllegalArgumentException("Unsupported work area " + workAreaC
.getClass().getName());
87 if (uiProvider
== null) {
89 tabbedArea
.closeAllTabs();
90 if (this.defaultView
!= null) {
91 tabbedArea
.view(defaultView
, context
);
94 tabbedArea
.view(uiProvider
, context
);
99 public Content
getCurrentContext(Composite workArea
) {
100 SwtTabbedArea tabbedArea
= findTabbedArea(workArea
);
101 if (tabbedArea
== null)
103 return tabbedArea
.getCurrentContext();
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
;
119 public void open(SwtUiProvider uiProvider
, Composite workArea
, Content context
) {
120 SwtTabbedArea tabbedArea
= ((SashFormEditionArea
) workArea
).getTabbedArea();
121 tabbedArea
.open(uiProvider
, context
);
125 public Localized
getTitle() {
130 public String
getId() {
134 public void init(BundleContext bundleContext
, Map
<String
, Object
> properties
) {
135 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
137 Objects
.requireNonNull(id
, "Layer id must be set.");
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.");
148 singleTab
= properties
.containsKey(Property
.singleTab
.name())
149 && "true".equals(properties
.get(Property
.singleTab
.name()));
151 String titleStr
= (String
) properties
.get(SwtAppLayer
.Property
.title
.name());
152 if (titleStr
!= null) {
153 if (titleStr
.startsWith("%")) {
154 title
= new Localized() {
157 public String
name() {
162 public ClassLoader
getL10nClassLoader() {
163 return bundleContext
!= null
164 ? bundleContext
.getBundle().adapt(BundleWiring
.class).getClassLoader()
165 : getClass().getClassLoader();
169 title
= new Localized
.Untranslated(titleStr
);
173 String singleTabTitleStr
= (String
) properties
.get(SwtAppLayer
.Property
.singleTabTitle
.name());
174 if (singleTabTitleStr
!= null) {
175 if (singleTabTitleStr
.startsWith("%")) {
176 singleTabTitle
= new Localized() {
179 public String
name() {
180 return singleTabTitleStr
;
184 public ClassLoader
getL10nClassLoader() {
185 return bundleContext
!= null
186 ? bundleContext
.getBundle().adapt(BundleWiring
.class).getClassLoader()
187 : getClass().getClassLoader();
191 singleTabTitle
= new Localized
.Untranslated(singleTabTitleStr
);
197 public void destroy(BundleContext bundleContext
, Map
<String
, String
> properties
) {
201 public void setEntryArea(SwtUiProvider entryArea
) {
202 this.entryArea
= entryArea
;
205 public void setWorkArea(SwtUiProvider workArea
) {
206 this.workArea
= workArea
;
209 public void setDefaultView(SwtUiProvider defaultView
) {
210 this.defaultView
= defaultView
;
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());
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
;
232 SashFormEditionArea(Composite parent
, int style
) {
233 super(parent
, SWT
.HORIZONTAL
);
234 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
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
);
241 entryC
= new Composite(this, SWT
.NONE
);
242 editorC
= new Composite(this, SWT
.NONE
);
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
));
251 setWeights(actualWeight
);
253 int[] actualWeights
= new int[] { 3000, 7000 };
254 setWeights(actualWeights
);
257 setMaximizedControl(editorC
);
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
);
267 tabbedArea
= createTabbedArea(editorC
, theme
);
270 SwtTabbedArea
getTabbedArea() {
274 Composite
getEntryArea() {
280 class FixedEditionArea
extends Composite
{
281 private static final long serialVersionUID
= -5525672639277322465L;
282 private SwtTabbedArea tabbedArea
;
283 private Composite entryC
;
285 public FixedEditionArea(Composite parent
, int style
) {
286 super(parent
, style
);
287 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
289 setLayout(CmsSwtUtils
.noSpaceGridLayout(2));
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
);
296 entryC
= new Composite(this, SWT
.NONE
);
297 editorC
= new Composite(this, SWT
.NONE
);
299 entryC
.setLayoutData(CmsSwtUtils
.fillHeight());
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());
310 tabbedArea
= createTabbedArea(editorC
, theme
);
313 SwtTabbedArea
getTabbedArea() {
317 Composite
getEntryArea() {