]> git.argeo.org Git - lgpl/argeo-commons.git/blob - security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/editors/DefaultUserMainPage.java
2887edaa6182e8afc0392b9b550d7f53dced124d
[lgpl/argeo-commons.git] / security / eclipse / plugins / org.argeo.security.ui / src / main / java / org / argeo / security / ui / editors / DefaultUserMainPage.java
1 package org.argeo.security.ui.editors;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.argeo.security.ArgeoSecurityService;
6 import org.argeo.security.ArgeoUser;
7 import org.argeo.security.SimpleArgeoUser;
8 import org.argeo.security.nature.SimpleUserNature;
9 import org.argeo.security.ui.SecurityUiPlugin;
10 import org.eclipse.jface.viewers.CellEditor;
11 import org.eclipse.jface.viewers.CheckboxCellEditor;
12 import org.eclipse.jface.viewers.ColumnLabelProvider;
13 import org.eclipse.jface.viewers.EditingSupport;
14 import org.eclipse.jface.viewers.IStructuredContentProvider;
15 import org.eclipse.jface.viewers.TableViewer;
16 import org.eclipse.jface.viewers.TableViewerColumn;
17 import org.eclipse.jface.viewers.Viewer;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.events.ModifyEvent;
20 import org.eclipse.swt.events.ModifyListener;
21 import org.eclipse.swt.graphics.Image;
22 import org.eclipse.swt.layout.GridData;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Table;
26 import org.eclipse.swt.widgets.TableColumn;
27 import org.eclipse.swt.widgets.Text;
28 import org.eclipse.ui.forms.AbstractFormPart;
29 import org.eclipse.ui.forms.IManagedForm;
30 import org.eclipse.ui.forms.SectionPart;
31 import org.eclipse.ui.forms.editor.FormEditor;
32 import org.eclipse.ui.forms.editor.FormPage;
33 import org.eclipse.ui.forms.widgets.ColumnLayout;
34 import org.eclipse.ui.forms.widgets.FormToolkit;
35 import org.eclipse.ui.forms.widgets.ScrolledForm;
36 import org.eclipse.ui.forms.widgets.Section;
37
38 /**
39 * Display/edit the properties common to all {@link ArgeoUser} (username and
40 * roles) as well as the properties of the {@link SimpleUserNature}.
41 */
42 public class DefaultUserMainPage extends FormPage {
43 final static String ID = "argeoUserEditor.mainPage";
44
45 private final static Image ROLE_CHECKED = SecurityUiPlugin
46 .getImageDescriptor("icons/security.gif").createImage();
47 private final static Log log = LogFactory.getLog(ArgeoUserEditor.class);
48
49 private ArgeoUser user;
50 private SimpleUserNature simpleNature;
51 private String simpleNatureType;
52 private ArgeoSecurityService securityService;
53
54 public DefaultUserMainPage(FormEditor editor,
55 ArgeoSecurityService securityService, ArgeoUser user) {
56 super(editor, ID, "Main");
57 this.securityService = securityService;
58 this.user = user;
59 this.simpleNature = SimpleUserNature.findSimpleUserNature(user,
60 simpleNatureType);
61 }
62
63 protected void createFormContent(final IManagedForm mf) {
64 ScrolledForm form = mf.getForm();
65 form.setText(simpleNature.getFirstName() + " "
66 + simpleNature.getLastName());
67 ColumnLayout mainLayout = new ColumnLayout();
68 mainLayout.minNumColumns = 1;
69 mainLayout.maxNumColumns = 4;
70 mainLayout.topMargin = 0;
71 mainLayout.bottomMargin = 5;
72 mainLayout.leftMargin = mainLayout.rightMargin = mainLayout.horizontalSpacing = mainLayout.verticalSpacing = 10;
73 form.getBody().setLayout(mainLayout);
74
75 createGeneralPart(form.getBody());
76 createRolesPart(form.getBody());
77 }
78
79 /** Creates the general section */
80 protected void createGeneralPart(Composite parent) {
81 FormToolkit tk = getManagedForm().getToolkit();
82 Section section = tk.createSection(parent, Section.TITLE_BAR);
83 section.setText("General");
84
85 Composite body = tk.createComposite(section, SWT.WRAP);
86 section.setClient(body);
87 GridLayout layout = new GridLayout();
88 layout.marginWidth = layout.marginHeight = 0;
89 layout.numColumns = 2;
90 body.setLayout(layout);
91
92 // add widgets (view)
93 final Text username;
94 if (user.getUsername() != null) {
95 tk.createLabel(body, "Username");
96 tk.createLabel(body, user.getUsername());
97 username = null;
98 } else {
99 username = createLT(body, "Username", "");
100 }
101 final Text firstName = createLT(body, "First name",
102 simpleNature.getFirstName());
103 final Text lastName = createLT(body, "Last name",
104 simpleNature.getLastName());
105 final Text email = createLT(body, "Email", simpleNature.getEmail());
106 final Text description = createLT(body, "Description",
107 simpleNature.getDescription());
108
109 // create form part (controller)
110 AbstractFormPart part = new SectionPart(section) {
111 public void commit(boolean onSave) {
112 if (username != null) {
113 ((SimpleArgeoUser) user).setUsername(username.getText());
114 username.setEditable(false);
115 username.setEnabled(false);
116 }
117 simpleNature.setFirstName(firstName.getText());
118 simpleNature.setLastName(lastName.getText());
119 simpleNature.setEmail(email.getText());
120 simpleNature.setDescription(description.getText());
121 super.commit(onSave);
122 if (log.isDebugEnabled())
123 log.debug("General part committed");
124 }
125 };
126 firstName.addModifyListener(new FormPartML(part));
127 lastName.addModifyListener(new FormPartML(part));
128 email.addModifyListener(new FormPartML(part));
129 description.addModifyListener(new FormPartML(part));
130 getManagedForm().addPart(part);
131 }
132
133 /** Creates the role section */
134 protected void createRolesPart(Composite parent) {
135 FormToolkit tk = getManagedForm().getToolkit();
136 Section section = tk.createSection(parent, Section.DESCRIPTION
137 | Section.TITLE_BAR);
138 section.setText("Roles");
139 section.setDescription("Roles define "
140 + "the authorizations for this user.");
141 Table table = new Table(section, SWT.MULTI | SWT.H_SCROLL
142 | SWT.V_SCROLL);
143 section.setClient(table);
144
145 AbstractFormPart part = new SectionPart(section) {
146 public void commit(boolean onSave) {
147 // roles have already been modified in editing
148 super.commit(onSave);
149 if (log.isDebugEnabled())
150 log.debug("Role part committed");
151 }
152 };
153 getManagedForm().addPart(part);
154
155 GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
156 gridData.verticalSpan = 20;
157 table.setLayoutData(gridData);
158 table.setLinesVisible(true);
159 table.setHeaderVisible(false);
160 TableViewer viewer = new TableViewer(table);
161
162 // check column
163 TableViewerColumn column = createTableViewerColumn(viewer, "checked",
164 20);
165 column.setLabelProvider(new ColumnLabelProvider() {
166 public String getText(Object element) {
167 return null;
168 }
169
170 public Image getImage(Object element) {
171 String role = element.toString();
172 if (user.getRoles().contains(role)) {
173 return ROLE_CHECKED;
174 } else {
175 return null;
176 }
177 }
178 });
179 column.setEditingSupport(new RoleEditingSupport(viewer, part));
180
181 // role column
182 column = createTableViewerColumn(viewer, "Role", 200);
183 column.setLabelProvider(new ColumnLabelProvider() {
184 public String getText(Object element) {
185 return element.toString();
186 }
187
188 public Image getImage(Object element) {
189 return null;
190 }
191 });
192 viewer.setContentProvider(new RolesContentProvider());
193 viewer.setInput(getEditorSite());
194 }
195
196 protected TableViewerColumn createTableViewerColumn(TableViewer viewer,
197 String title, int bound) {
198 final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
199 SWT.NONE);
200 final TableColumn column = viewerColumn.getColumn();
201 column.setText(title);
202 column.setWidth(bound);
203 column.setResizable(true);
204 column.setMoveable(true);
205 return viewerColumn;
206
207 }
208
209 /** Creates label and text. */
210 protected Text createLT(Composite body, String label, String value) {
211 FormToolkit toolkit = getManagedForm().getToolkit();
212 toolkit.createLabel(body, label);
213 Text text = toolkit.createText(body, value, SWT.BORDER);
214 text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
215 return text;
216 }
217
218 public void setSimpleNatureType(String simpleNatureType) {
219 this.simpleNatureType = simpleNatureType;
220 }
221
222 private class FormPartML implements ModifyListener {
223 private AbstractFormPart formPart;
224
225 public FormPartML(AbstractFormPart generalPart) {
226 this.formPart = generalPart;
227 }
228
229 public void modifyText(ModifyEvent e) {
230 formPart.markDirty();
231 }
232
233 }
234
235 private class RolesContentProvider implements IStructuredContentProvider {
236 public Object[] getElements(Object inputElement) {
237 return securityService.getSecurityDao().listEditableRoles()
238 .toArray();
239 }
240
241 public void dispose() {
242 }
243
244 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
245 }
246 }
247
248 /** Select the columns by editing the checkbox in the first column */
249 class RoleEditingSupport extends EditingSupport {
250
251 private final TableViewer viewer;
252 private final AbstractFormPart formPart;
253
254 public RoleEditingSupport(TableViewer viewer, AbstractFormPart formPart) {
255 super(viewer);
256 this.viewer = viewer;
257 this.formPart = formPart;
258 }
259
260 @Override
261 protected CellEditor getCellEditor(Object element) {
262 return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
263
264 }
265
266 @Override
267 protected boolean canEdit(Object element) {
268 return true;
269 }
270
271 @Override
272 protected Object getValue(Object element) {
273 String role = element.toString();
274 return user.getRoles().contains(role);
275
276 }
277
278 @Override
279 protected void setValue(Object element, Object value) {
280 Boolean inRole = (Boolean) value;
281 String role = element.toString();
282 if (inRole && !user.getRoles().contains(role)) {
283 user.getRoles().add(role);
284 formPart.markDirty();
285 } else if (!inRole && user.getRoles().contains(role)) {
286 user.getRoles().remove(role);
287 formPart.markDirty();
288 }
289 viewer.refresh();
290 }
291 }
292
293 }