]> git.argeo.org Git - gpl/argeo-suite.git/blob - ui/SuiteUi.java
Prepare next development cycle
[gpl/argeo-suite.git] / ui / SuiteUi.java
1 package org.argeo.suite.ui;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import javax.jcr.Node;
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.Session;
10
11 import org.argeo.api.NodeConstants;
12 import org.argeo.api.NodeUtils;
13 import org.argeo.cms.ui.CmsView;
14 import org.argeo.cms.ui.util.CmsUiUtils;
15 import org.argeo.jcr.Jcr;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.layout.FormLayout;
18 import org.eclipse.swt.widgets.Composite;
19
20 /** The {@link CmsView} for the work ergonomics of Argeo Suite. */
21 class SuiteUi extends Composite {
22 private static final long serialVersionUID = 6207018859086689108L;
23
24 private Composite header;
25 private Composite belowHeader;
26 private Composite leadPane;
27 private Composite dynamicArea;
28
29 private Session sysSession;
30 private Session homeSession;
31 private Node userHome;
32
33 private Map<String, SuiteLayer> layers = new HashMap<>();
34 private Map<String, Composite> workAreas = new HashMap<>();
35 private String currentLayerId = null;
36
37 private CmsView cmsView;
38
39 public SuiteUi(Composite parent, int style) {
40 super(parent, style);
41 cmsView = CmsView.getCmsView(parent);
42 this.setLayout(CmsUiUtils.noSpaceGridLayout());
43
44 header = new Composite(this, SWT.NONE);
45 CmsUiUtils.style(header, SuiteStyle.header);
46 header.setLayoutData(CmsUiUtils.fillWidth());
47
48 belowHeader = new Composite(this, SWT.NONE);
49 belowHeader.setLayoutData(CmsUiUtils.fillAll());
50 }
51
52 public void refreshBelowHeader(boolean initApp) {
53 CmsUiUtils.clear(belowHeader);
54 int style = getStyle();
55 if (initApp) {
56 belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
57
58 if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
59 dynamicArea = new Composite(belowHeader, SWT.NONE);
60 leadPane = new Composite(belowHeader, SWT.NONE);
61 } else {
62 leadPane = new Composite(belowHeader, SWT.NONE);
63 dynamicArea = new Composite(belowHeader, SWT.NONE);
64 }
65 leadPane.setLayoutData(CmsUiUtils.fillHeight());
66 CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
67 dynamicArea.setLayoutData(CmsUiUtils.fillAll());
68
69 dynamicArea.setLayout(new FormLayout());
70
71 } else {
72 belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout());
73 }
74 }
75
76 /*
77 * LAYERS
78 */
79
80 Composite getCurrentWorkArea() {
81 if (currentLayerId == null)
82 throw new IllegalStateException("No current layer");
83 return workAreas.get(currentLayerId);
84 }
85
86 String getCurrentLayerId() {
87 return currentLayerId;
88 }
89
90 private Composite getLayer(String id, Node context) {
91 if (!layers.containsKey(id))
92 throw new IllegalArgumentException("No layer " + id + " is available.");
93 if (!workAreas.containsKey(id))
94 initLayer(id, layers.get(id), context);
95 return workAreas.get(id);
96 }
97
98 Composite switchToLayer(String layer, Node context) {
99 if (currentLayerId != null) {
100 Composite current = getCurrentWorkArea();
101 if (currentLayerId.equals(layer))
102 return current;
103 }
104 if (context == null) {
105 if (!cmsView.isAnonymous())
106 context = userHome;
107 }
108 Composite toShow = getLayer(layer, context);
109 getDisplay().syncExec(() -> {
110 toShow.moveAbove(null);
111 dynamicArea.layout(true, true);
112 });
113 currentLayerId = layer;
114 return toShow;
115 }
116
117 void addLayer(String id, SuiteLayer layer) {
118 layers.put(id, layer);
119 }
120
121 void removeLayer(String id) {
122 layers.remove(id);
123 if (workAreas.containsKey(id)) {
124 Composite workArea = workAreas.remove(id);
125 if (!workArea.isDisposed())
126 workArea.dispose();
127 }
128 }
129
130 protected Composite initLayer(String id, SuiteLayer layer, Node context) {
131 Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
132 workArea.setLayoutData(CmsUiUtils.coverAll());
133 workAreas.put(id, workArea);
134 return workArea;
135 }
136
137 /*
138 * GETTERS / SETTERS
139 */
140
141 Composite getHeader() {
142 return header;
143 }
144
145 Composite getLeadPane() {
146 return leadPane;
147 }
148
149 Composite getBelowHeader() {
150 return belowHeader;
151 }
152
153 // Session getSysSession() {
154 // return sysSession;
155 // }
156 //
157 void initSessions(Repository repository) throws RepositoryException {
158 this.sysSession = repository.login();
159 this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
160 userHome = NodeUtils.getUserHome(homeSession);
161 addDisposeListener((e) -> {
162 Jcr.logout(sysSession);
163 Jcr.logout(homeSession);
164 });
165 }
166
167 Node getUserHome() {
168 return userHome;
169 }
170
171 Session getSysSession() {
172 return sysSession;
173 }
174
175 Session getSession(String workspaceName) {
176 if (workspaceName == null)
177 return sysSession;
178 if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
179 return sysSession;
180 else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
181 return homeSession;
182 else
183 throw new IllegalArgumentException("Unknown workspace " + workspaceName);
184 }
185
186 }