1 package org
.argeo
.app
.ui
;
3 import java
.util
.ArrayList
;
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
;
23 /** An app layer based on an entry area and an editor area. */
24 public class DefaultEditionLayer
implements SuiteLayer
{
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;
37 public Control
createUiPart(Composite parent
, Content context
) {
38 // TODO Factorize more, or split into more specialised classes?
39 if (entryArea
!= null) {
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
);
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
);
57 if (this.workArea
!= null) {
58 Composite area
= new Composite(parent
, SWT
.NONE
);
59 this.workArea
.createUiPart(area
, context
);
62 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
63 SwtTabbedArea tabbedArea
= createTabbedArea(parent
, theme
);
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);
78 SwtTabbedArea tabbedArea
= findTabbedArea(workAreaC
);
79 if (tabbedArea
== null)
80 throw new IllegalArgumentException("Unsupported work area " + workAreaC
.getClass().getName());
81 if (uiProvider
== null) {
83 tabbedArea
.closeAllTabs();
84 if (this.defaultView
!= null) {
85 tabbedArea
.view(defaultView
, context
);
88 tabbedArea
.view(uiProvider
, context
);
93 public Content
getCurrentContext(Composite workArea
) {
94 SwtTabbedArea tabbedArea
= findTabbedArea(workArea
);
95 if (tabbedArea
== null)
97 return tabbedArea
.getCurrentContext();
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
;
113 public void open(SwtUiProvider uiProvider
, Composite workArea
, Content context
) {
114 SwtTabbedArea tabbedArea
= ((SashFormEditionArea
) workArea
).getTabbedArea();
115 tabbedArea
.open(uiProvider
, context
);
119 public Localized
getTitle() {
124 public String
getId() {
128 public void init(BundleContext bundleContext
, Map
<String
, Object
> properties
) {
129 String pid
= (String
) properties
.get(Constants
.SERVICE_PID
);
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.");
141 singleTab
= properties
.containsKey(Property
.singleTab
.name())
142 && "true".equals(properties
.get(Property
.singleTab
.name()));
144 String titleStr
= (String
) properties
.get(SuiteLayer
.Property
.title
.name());
145 if (titleStr
!= null) {
146 if (titleStr
.startsWith("%")) {
147 title
= new Localized() {
150 public String
name() {
155 public ClassLoader
getL10nClassLoader() {
156 return bundleContext
!= null
157 ? bundleContext
.getBundle().adapt(BundleWiring
.class).getClassLoader()
158 : getClass().getClassLoader();
162 title
= new Localized
.Untranslated(titleStr
);
166 String singleTabTitleStr
= (String
) properties
.get(SuiteLayer
.Property
.singleTabTitle
.name());
167 if (singleTabTitleStr
!= null) {
168 if (singleTabTitleStr
.startsWith("%")) {
169 singleTabTitle
= new Localized() {
172 public String
name() {
173 return singleTabTitleStr
;
177 public ClassLoader
getL10nClassLoader() {
178 return bundleContext
!= null
179 ? bundleContext
.getBundle().adapt(BundleWiring
.class).getClassLoader()
180 : getClass().getClassLoader();
184 singleTabTitle
= new Localized
.Untranslated(singleTabTitleStr
);
190 public void destroy(BundleContext bundleContext
, Map
<String
, String
> properties
) {
194 public void setEntryArea(SwtUiProvider entryArea
) {
195 this.entryArea
= entryArea
;
198 public void setWorkArea(SwtUiProvider workArea
) {
199 this.workArea
= workArea
;
202 public void setDefaultView(SwtUiProvider defaultView
) {
203 this.defaultView
= defaultView
;
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());
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
;
225 SashFormEditionArea(Composite parent
, int style
) {
226 super(parent
, SWT
.HORIZONTAL
);
227 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
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
);
234 entryC
= new Composite(this, SWT
.NONE
);
235 editorC
= new Composite(this, SWT
.NONE
);
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
));
244 setWeights(actualWeight
);
246 int[] actualWeights
= new int[] { 3000, 7000 };
247 setWeights(actualWeights
);
250 setMaximizedControl(editorC
);
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
);
260 tabbedArea
= createTabbedArea(editorC
, theme
);
263 SwtTabbedArea
getTabbedArea() {
267 Composite
getEntryArea() {
273 class FixedEditionArea
extends Composite
{
274 private static final long serialVersionUID
= -5525672639277322465L;
275 private SwtTabbedArea tabbedArea
;
276 private Composite entryC
;
278 public FixedEditionArea(Composite parent
, int style
) {
279 super(parent
, style
);
280 CmsSwtTheme theme
= CmsSwtUtils
.getCmsTheme(parent
);
282 setLayout(CmsSwtUtils
.noSpaceGridLayout(2));
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
);
289 entryC
= new Composite(this, SWT
.NONE
);
290 editorC
= new Composite(this, SWT
.NONE
);
292 entryC
.setLayoutData(CmsSwtUtils
.fillHeight());
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());
303 tabbedArea
= createTabbedArea(editorC
, theme
);
306 SwtTabbedArea
getTabbedArea() {
310 Composite
getEntryArea() {