2 * Copyright (C) 2007-2012 Argeo GmbH
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.security
.ui
.admin
.editors
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 import org
.apache
.commons
.logging
.Log
;
22 import org
.apache
.commons
.logging
.LogFactory
;
23 import org
.argeo
.jcr
.ArgeoNames
;
24 import org
.argeo
.security
.UserAdminService
;
25 import org
.argeo
.security
.ui
.admin
.SecurityAdminPlugin
;
26 import org
.eclipse
.jface
.viewers
.CellEditor
;
27 import org
.eclipse
.jface
.viewers
.CheckboxCellEditor
;
28 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
29 import org
.eclipse
.jface
.viewers
.EditingSupport
;
30 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
31 import org
.eclipse
.jface
.viewers
.TableViewer
;
32 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
33 import org
.eclipse
.jface
.viewers
.Viewer
;
34 import org
.eclipse
.swt
.SWT
;
35 import org
.eclipse
.swt
.graphics
.Image
;
36 import org
.eclipse
.swt
.layout
.FillLayout
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.swt
.widgets
.Table
;
39 import org
.eclipse
.swt
.widgets
.TableColumn
;
40 import org
.eclipse
.ui
.forms
.AbstractFormPart
;
41 import org
.eclipse
.ui
.forms
.IManagedForm
;
42 import org
.eclipse
.ui
.forms
.editor
.FormEditor
;
43 import org
.eclipse
.ui
.forms
.editor
.FormPage
;
44 import org
.eclipse
.ui
.forms
.widgets
.ScrolledForm
;
45 import org
.springframework
.security
.GrantedAuthority
;
46 import org
.springframework
.security
.userdetails
.UserDetails
;
49 * Display/edit the roles of a user.
51 public class UserRolesPage
extends FormPage
implements ArgeoNames
{
52 final static String ID
= "argeoUserEditor.rolesPage";
54 private final static Log log
= LogFactory
.getLog(UserRolesPage
.class);
55 private final static Image ROLE_CHECKED
= SecurityAdminPlugin
56 .getImageDescriptor("icons/security.gif").createImage();
58 private TableViewer rolesViewer
;
59 private UserAdminService userAdminService
;
60 private List
<String
> roles
;
62 public UserRolesPage(FormEditor editor
, UserDetails userDetails
,
63 UserAdminService userAdminService
) {
64 super(editor
, ID
, "Roles");
65 setUserDetails(userDetails
);
66 this.userAdminService
= userAdminService
;
69 public void setUserDetails(UserDetails userDetails
) {
70 this.roles
= new ArrayList
<String
>();
71 for (GrantedAuthority ga
: userDetails
.getAuthorities())
72 roles
.add(ga
.getAuthority());
73 if (rolesViewer
!= null)
74 rolesViewer
.refresh();
77 protected void createFormContent(final IManagedForm mf
) {
78 ScrolledForm form
= mf
.getForm();
79 form
.setText("Roles");
80 FillLayout mainLayout
= new FillLayout();
81 // ColumnLayout mainLayout = new ColumnLayout();
82 // mainLayout.minNumColumns = 1;
83 // mainLayout.maxNumColumns = 4;
84 // mainLayout.topMargin = 0;
85 // mainLayout.bottomMargin = 5;
86 // mainLayout.leftMargin = mainLayout.rightMargin =
87 // mainLayout.horizontalSpacing = mainLayout.verticalSpacing = 10;
88 form
.getBody().setLayout(mainLayout
);
89 createRolesPart(form
.getBody());
92 /** Creates the role section */
93 protected void createRolesPart(Composite parent
) {
94 Table table
= new Table(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
96 AbstractFormPart part
= new AbstractFormPart() {
97 public void commit(boolean onSave
) {
98 // roles have already been modified in editing
100 if (log
.isTraceEnabled())
101 log
.trace("Role part committed");
104 getManagedForm().addPart(part
);
106 // GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
107 // gridData.verticalSpan = 20;
108 // table.setLayoutData(gridData);
109 table
.setLinesVisible(true);
110 table
.setHeaderVisible(false);
111 rolesViewer
= new TableViewer(table
);
114 TableViewerColumn column
= createTableViewerColumn(rolesViewer
,
116 column
.setLabelProvider(new ColumnLabelProvider() {
117 public String
getText(Object element
) {
121 public Image
getImage(Object element
) {
122 String role
= element
.toString();
123 if (roles
.contains(role
)) {
130 column
.setEditingSupport(new RoleEditingSupport(rolesViewer
, part
));
133 column
= createTableViewerColumn(rolesViewer
, "Role", 200);
134 column
.setLabelProvider(new ColumnLabelProvider() {
135 public String
getText(Object element
) {
136 return element
.toString();
139 public Image
getImage(Object element
) {
143 rolesViewer
.setContentProvider(new RolesContentProvider());
144 rolesViewer
.setInput(getEditorSite());
147 protected TableViewerColumn
createTableViewerColumn(TableViewer viewer
,
148 String title
, int bound
) {
149 final TableViewerColumn viewerColumn
= new TableViewerColumn(viewer
,
151 final TableColumn column
= viewerColumn
.getColumn();
152 column
.setText(title
);
153 column
.setWidth(bound
);
154 column
.setResizable(true);
155 column
.setMoveable(true);
160 public List
<String
> getRoles() {
164 public void refresh() {
165 rolesViewer
.refresh();
168 private class RolesContentProvider
implements IStructuredContentProvider
{
169 public Object
[] getElements(Object inputElement
) {
170 return userAdminService
.listEditableRoles().toArray();
173 public void dispose() {
176 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
180 /** Select the columns by editing the checkbox in the first column */
181 class RoleEditingSupport
extends EditingSupport
{
183 private final TableViewer viewer
;
184 private final AbstractFormPart formPart
;
186 public RoleEditingSupport(TableViewer viewer
, AbstractFormPart formPart
) {
188 this.viewer
= viewer
;
189 this.formPart
= formPart
;
193 protected CellEditor
getCellEditor(Object element
) {
194 return new CheckboxCellEditor(null, SWT
.CHECK
| SWT
.READ_ONLY
);
199 protected boolean canEdit(Object element
) {
204 protected Object
getValue(Object element
) {
205 String role
= element
.toString();
206 return roles
.contains(role
);
211 protected void setValue(Object element
, Object value
) {
212 Boolean inRole
= (Boolean
) value
;
213 String role
= element
.toString();
214 if (inRole
&& !roles
.contains(role
)) {
216 formPart
.markDirty();
217 } else if (!inRole
&& roles
.contains(role
)) {
219 formPart
.markDirty();