]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UserMainPage.java
fix wrong hierarchy
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / parts / UserMainPage.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.security.ui.admin.internal.parts;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21
22 import org.argeo.ArgeoException;
23 import org.argeo.eclipse.ui.EclipseUiUtils;
24 import org.argeo.jcr.ArgeoNames;
25 import org.argeo.security.ui.admin.internal.ColumnDefinition;
26 import org.argeo.security.ui.admin.internal.UserAdminConstants;
27 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
28 import org.argeo.security.ui.admin.internal.UserTableViewer;
29 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
30 import org.argeo.security.ui.admin.internal.providers.RoleIconLP;
31 import org.argeo.security.ui.admin.internal.providers.UserNameLP;
32 import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
33 import org.eclipse.jface.viewers.TableViewer;
34 import org.eclipse.jface.viewers.Viewer;
35 import org.eclipse.jface.viewers.ViewerDropAdapter;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.dnd.DND;
38 import org.eclipse.swt.dnd.DropTargetEvent;
39 import org.eclipse.swt.dnd.TextTransfer;
40 import org.eclipse.swt.dnd.Transfer;
41 import org.eclipse.swt.dnd.TransferData;
42 import org.eclipse.swt.events.ModifyEvent;
43 import org.eclipse.swt.events.ModifyListener;
44 import org.eclipse.swt.layout.GridData;
45 import org.eclipse.swt.layout.GridLayout;
46 import org.eclipse.swt.widgets.Composite;
47 import org.eclipse.swt.widgets.Label;
48 import org.eclipse.swt.widgets.Text;
49 import org.eclipse.ui.forms.AbstractFormPart;
50 import org.eclipse.ui.forms.IManagedForm;
51 import org.eclipse.ui.forms.SectionPart;
52 import org.eclipse.ui.forms.editor.FormEditor;
53 import org.eclipse.ui.forms.editor.FormPage;
54 import org.eclipse.ui.forms.widgets.FormToolkit;
55 import org.eclipse.ui.forms.widgets.ScrolledForm;
56 import org.eclipse.ui.forms.widgets.Section;
57 import org.osgi.service.useradmin.Group;
58 import org.osgi.service.useradmin.Role;
59 import org.osgi.service.useradmin.User;
60 import org.osgi.service.useradmin.UserAdmin;
61 import org.osgi.service.useradmin.UserAdminEvent;
62
63 /** Display/edit the properties common to all users */
64 public class UserMainPage extends FormPage implements ArgeoNames {
65 final static String ID = "argeoUserEditor.mainPage";
66
67 // private final static Log log = LogFactory.getLog(UserMainPage.class);
68
69 private final UserEditor editor;
70 private UserAdminWrapper userAdminWrapper;
71
72 private char[] newPassword;
73
74 // Local configuration
75 private final int PRE_TITLE_INDENT = 10;
76
77 public UserMainPage(FormEditor editor, UserAdminWrapper userAdminWrapper) {
78 super(editor, ID, "Main");
79 this.editor = (UserEditor) editor;
80 this.userAdminWrapper = userAdminWrapper;
81 }
82
83 public String getNewPassword() {
84 if (newPassword != null)
85 return new String(newPassword);
86 else
87 return null;
88 }
89
90 public void resetNewPassword() {
91 if (newPassword != null)
92 Arrays.fill(newPassword, 'x');
93 newPassword = null;
94 }
95
96 protected void createFormContent(final IManagedForm mf) {
97 ScrolledForm form = mf.getForm();
98 // Form page main title
99 form.setText(editor.getProperty(UserAdminConstants.KEY_CN));
100
101 // Body
102 Composite body = form.getBody();
103 GridLayout mainLayout = new GridLayout(1, true);
104 body.setLayout(mainLayout);
105 appendOverviewPart(body);
106 appendPasswordPart(body);
107 appendMemberOfPart(body);
108 }
109
110 /** Creates the general section */
111 protected void appendOverviewPart(Composite parent) {
112 FormToolkit tk = getManagedForm().getToolkit();
113 Composite body = addSection(tk, parent, "Main information");
114 body.setLayout(new GridLayout(2, false));
115
116 Text distinguishedName = createLT(body, "User Name",
117 editor.getProperty(UserAdminConstants.KEY_UID));
118 distinguishedName.setEnabled(false);
119
120 final Text commonName = createLT(body, "Common Name",
121 editor.getProperty(UserAdminConstants.KEY_CN));
122 commonName.setEnabled(false);
123
124 final Text firstName = createLT(body, "First name",
125 editor.getProperty(UserAdminConstants.KEY_FIRSTNAME));
126
127 final Text lastName = createLT(body, "Last name",
128 editor.getProperty(UserAdminConstants.KEY_LASTNAME));
129
130 final Text email = createLT(body, "Email",
131 editor.getProperty(UserAdminConstants.KEY_MAIL));
132
133 // create form part (controller)
134 AbstractFormPart part = new SectionPart((Section) body.getParent()) {
135 public void commit(boolean onSave) {
136 // TODO check changed ?
137 // TODO Sanity checks
138
139 editor.setProperty(UserAdminConstants.KEY_FIRSTNAME,
140 firstName.getText());
141 editor.setProperty(UserAdminConstants.KEY_LASTNAME,
142 lastName.getText());
143 editor.setProperty(UserAdminConstants.KEY_CN,
144 commonName.getText());
145 // TODO check mail validity
146 editor.setProperty(UserAdminConstants.KEY_MAIL, email.getText());
147
148 // Enable common name ?
149 // editor.setProperty(UserAdminConstants.KEY_CN,
150 // email.getText());
151 super.commit(onSave);
152 }
153 };
154
155 ModifyListener cnML = new ModifyListener() {
156 private static final long serialVersionUID = 4298649222869835486L;
157
158 @Override
159 public void modifyText(ModifyEvent event) {
160 String first = firstName.getText();
161 String last = lastName.getText();
162 String cn = first.trim() + " " + last.trim() + " ";
163 cn = cn.trim();
164 commonName.setText(cn);
165 getManagedForm().getForm().setText(cn);
166 editor.updateEditorTitle(cn);
167 }
168 };
169 firstName.addModifyListener(cnML);
170 lastName.addModifyListener(cnML);
171 firstName.addModifyListener(new FormPartML(part));
172 lastName.addModifyListener(new FormPartML(part));
173 email.addModifyListener(new FormPartML(part));
174 getManagedForm().addPart(part);
175 }
176
177 /** Creates the password section */
178 protected void appendPasswordPart(Composite parent) {
179 FormToolkit tk = getManagedForm().getToolkit();
180 Composite body = addSection(tk, parent, "Password");
181
182 // Section section = tk.createSection(parent, Section.TITLE_BAR);
183 // section.setLayoutData(EclipseUiUtils.fillWidth());
184 // section.setText("Password");
185 // Composite body = tk.createComposite(section, SWT.NO_FOCUS);
186 // section.setClient(body);
187 // body.setLayoutData(EclipseUiUtils.fillWidth());
188
189 body.setLayout(new GridLayout(2, false));
190 // add widgets (view)
191 final Text password1 = createLP(body, "New password", "");
192 final Text password2 = createLP(body, "Repeat password", "");
193 // create form part (controller)
194 AbstractFormPart part = new SectionPart((Section) body.getParent()) {
195
196 public void commit(boolean onSave) {
197 if (!password1.getText().equals("")
198 || !password2.getText().equals("")) {
199 if (password1.getText().equals(password2.getText())) {
200 newPassword = password1.getText().toCharArray();
201 // TODO real set password
202 password1.setText("");
203 password2.setText("");
204 super.commit(onSave);
205 } else {
206 password1.setText("");
207 password2.setText("");
208 throw new ArgeoException("Passwords are not equals");
209 }
210 }
211 }
212
213 };
214 password1.addModifyListener(new FormPartML(part));
215 password2.addModifyListener(new FormPartML(part));
216 getManagedForm().addPart(part);
217 }
218
219 private UserTableViewer userTableViewerCmp;
220 private TableViewer userViewer;
221
222 private void appendMemberOfPart(Composite parent) {
223 FormToolkit tk = getManagedForm().getToolkit();
224 Composite body = addSection(tk, parent, "Roles");
225 body.setLayout(EclipseUiUtils.noSpaceGridLayout());
226
227 // Define the displayed columns
228 List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
229 columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
230 columnDefs.add(new ColumnDefinition(new UserNameLP(),
231 "Distinguished Name", 300));
232 columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
233 150));
234
235 // Create and configure the table
236 userTableViewerCmp = new MyUserTableViewer(body, SWT.MULTI
237 | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin());
238
239 userTableViewerCmp.setColumnDefinitions(columnDefs);
240 userTableViewerCmp.populate(true, false);
241 GridData gd = EclipseUiUtils.fillAll();
242 gd.heightHint = 300;
243 userTableViewerCmp.setLayoutData(gd);
244
245 // Links
246 userViewer = userTableViewerCmp.getTableViewer();
247 userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
248 // Really?
249 userTableViewerCmp.refresh();
250
251 // Drag and drop
252 int operations = DND.DROP_COPY | DND.DROP_MOVE;
253 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
254 userViewer.addDropSupport(operations, tt, new GroupDropListener(
255 userViewer, userAdminWrapper.getUserAdmin(), editor.getDisplayedUser()));
256
257 }
258
259 private class MyUserTableViewer extends UserTableViewer {
260 private static final long serialVersionUID = 8467999509931900367L;
261
262 public MyUserTableViewer(Composite parent, int style,
263 UserAdmin userAdmin) {
264 super(parent, style, userAdmin, true);
265 }
266
267 @Override
268 protected List<User> listFilteredElements(String filter) {
269 return (List<User>) editor.getFlatGroups(null);
270 }
271 }
272
273 /**
274 * Defines this table as being a potential target to add group membership
275 * (roles) to this user
276 */
277 private class GroupDropListener extends ViewerDropAdapter {
278 private static final long serialVersionUID = 2893468717831451621L;
279
280 private final UserAdmin myUserAdmin;
281 private final User myUser;
282
283 public GroupDropListener(Viewer viewer, UserAdmin userAdmin, User user) {
284 super(viewer);
285 this.myUserAdmin = userAdmin;
286 this.myUser = user;
287 }
288
289 @Override
290 public boolean validateDrop(Object target, int operation,
291 TransferData transferType) {
292 // Target is always OK in a list only view
293 // TODO check if not a string
294 boolean validDrop = true;
295 return validDrop;
296 }
297
298 @Override
299 public void drop(DropTargetEvent event) {
300 String name = (String) event.data;
301 Role role = myUserAdmin.getRole(name);
302 // TODO this check should be done before.
303 if (role.getType() == Role.GROUP) {
304 // TODO check if the user is already member of this group
305 userAdminWrapper.beginTransactionIfNeeded();
306 Group group = (Group) role;
307 group.addMember(myUser);
308 userAdminWrapper.notifyListeners(new UserAdminEvent(null,
309 UserAdminEvent.ROLE_CHANGED, group));
310 }
311 super.drop(event);
312 }
313
314 @Override
315 public boolean performDrop(Object data) {
316 userTableViewerCmp.refresh();
317 return true;
318 }
319 }
320
321 // LOCAL HELPERS
322 /** Appends a section with a title */
323 private Composite addSection(FormToolkit tk, Composite parent, String title) {
324 Section section = tk.createSection(parent, Section.TITLE_BAR);
325 GridData gd = EclipseUiUtils.fillWidth();
326 gd.verticalAlignment = PRE_TITLE_INDENT;
327 section.setLayoutData(gd);
328 section.setText(title);
329 Composite body = tk.createComposite(section, SWT.WRAP);
330 body.setLayoutData(EclipseUiUtils.fillAll());
331 section.setClient(body);
332 return body;
333 }
334
335 /** Creates label and multiline text. */
336 protected Text createLMT(Composite body, String label, String value) {
337 FormToolkit toolkit = getManagedForm().getToolkit();
338 Label lbl = toolkit.createLabel(body, label);
339 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
340 Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI);
341 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
342 return text;
343 }
344
345 /** Creates label and password. */
346 protected Text createLP(Composite body, String label, String value) {
347 FormToolkit toolkit = getManagedForm().getToolkit();
348 Label lbl = toolkit.createLabel(body, label);
349 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
350 Text text = toolkit.createText(body, value, SWT.BORDER | SWT.PASSWORD);
351 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
352 return text;
353 }
354
355 /** Creates label and text. */
356 protected Text createLT(Composite body, String label, String value) {
357 FormToolkit toolkit = getManagedForm().getToolkit();
358 Label lbl = toolkit.createLabel(body, label);
359 lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
360 Text text = toolkit.createText(body, value, SWT.BORDER);
361 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
362 return text;
363 }
364
365 private class FormPartML implements ModifyListener {
366 private static final long serialVersionUID = 6299808129505381333L;
367 private AbstractFormPart formPart;
368
369 public FormPartML(AbstractFormPart generalPart) {
370 this.formPart = generalPart;
371 }
372
373 public void modifyText(ModifyEvent e) {
374 formPart.markDirty();
375 }
376 }
377 }