]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java
3d1e938eaacd3bbd59e251c1ffe6c14ef09515d4
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / 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 if (!isDisposed())
110 getDisplay().syncExec(() -> {
111 toShow.moveAbove(null);
112 dynamicArea.layout(true, true);
113 });
114 currentLayerId = layer;
115 return toShow;
116 }
117
118 void addLayer(String id, SuiteLayer layer) {
119 layers.put(id, layer);
120 }
121
122 void removeLayer(String id) {
123 layers.remove(id);
124 if (workAreas.containsKey(id)) {
125 Composite workArea = workAreas.remove(id);
126 if (!workArea.isDisposed())
127 workArea.dispose();
128 }
129 }
130
131 protected Composite initLayer(String id, SuiteLayer layer, Node context) {
132 Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
133 workArea.setLayoutData(CmsUiUtils.coverAll());
134 workAreas.put(id, workArea);
135 return workArea;
136 }
137
138 /*
139 * GETTERS / SETTERS
140 */
141
142 Composite getHeader() {
143 return header;
144 }
145
146 Composite getLeadPane() {
147 return leadPane;
148 }
149
150 Composite getBelowHeader() {
151 return belowHeader;
152 }
153
154 // Session getSysSession() {
155 // return sysSession;
156 // }
157 //
158 void initSessions(Repository repository) throws RepositoryException {
159 this.sysSession = repository.login();
160 this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
161 userHome = NodeUtils.getUserHome(homeSession);
162 addDisposeListener((e) -> {
163 Jcr.logout(sysSession);
164 Jcr.logout(homeSession);
165 });
166 }
167
168 Node getUserHome() {
169 return userHome;
170 }
171
172 Session getSysSession() {
173 return sysSession;
174 }
175
176 Session getSession(String workspaceName) {
177 if (workspaceName == null)
178 return sysSession;
179 if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
180 return sysSession;
181 else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
182 return homeSession;
183 else
184 throw new IllegalArgumentException("Unknown workspace " + workspaceName);
185 }
186
187 }