/* * Copyright (C) 2007-2012 Mathieu Baudier * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.argeo.security.ui.admin.editors; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.jcr.ArgeoNames; import org.argeo.security.UserAdminService; import org.argeo.security.ui.admin.SecurityAdminPlugin; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.AbstractFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.springframework.security.GrantedAuthority; import org.springframework.security.userdetails.UserDetails; /** * Display/edit the roles of a user. */ public class UserRolesPage extends FormPage implements ArgeoNames { final static String ID = "argeoUserEditor.rolesPage"; private final static Log log = LogFactory.getLog(UserRolesPage.class); private final static Image ROLE_CHECKED = SecurityAdminPlugin .getImageDescriptor("icons/security.gif").createImage(); private TableViewer rolesViewer; private UserAdminService userAdminService; private List roles; public UserRolesPage(FormEditor editor, UserDetails userDetails, UserAdminService userAdminService) { super(editor, ID, "Roles"); setUserDetails(userDetails); this.userAdminService = userAdminService; } public void setUserDetails(UserDetails userDetails) { this.roles = new ArrayList(); for (GrantedAuthority ga : userDetails.getAuthorities()) roles.add(ga.getAuthority()); if (rolesViewer != null) rolesViewer.refresh(); } protected void createFormContent(final IManagedForm mf) { ScrolledForm form = mf.getForm(); form.setText("Roles"); FillLayout mainLayout = new FillLayout(); // ColumnLayout mainLayout = new ColumnLayout(); // mainLayout.minNumColumns = 1; // mainLayout.maxNumColumns = 4; // mainLayout.topMargin = 0; // mainLayout.bottomMargin = 5; // mainLayout.leftMargin = mainLayout.rightMargin = // mainLayout.horizontalSpacing = mainLayout.verticalSpacing = 10; form.getBody().setLayout(mainLayout); createRolesPart(form.getBody()); } /** Creates the role section */ protected void createRolesPart(Composite parent) { Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); AbstractFormPart part = new AbstractFormPart() { public void commit(boolean onSave) { // roles have already been modified in editing super.commit(onSave); if (log.isTraceEnabled()) log.trace("Role part committed"); } }; getManagedForm().addPart(part); // GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); // gridData.verticalSpan = 20; // table.setLayoutData(gridData); table.setLinesVisible(true); table.setHeaderVisible(false); rolesViewer = new TableViewer(table); // check column TableViewerColumn column = createTableViewerColumn(rolesViewer, "checked", 20); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { return null; } public Image getImage(Object element) { String role = element.toString(); if (roles.contains(role)) { return ROLE_CHECKED; } else { return null; } } }); column.setEditingSupport(new RoleEditingSupport(rolesViewer, part)); // role column column = createTableViewerColumn(rolesViewer, "Role", 200); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { return element.toString(); } public Image getImage(Object element) { return null; } }); rolesViewer.setContentProvider(new RolesContentProvider()); rolesViewer.setInput(getEditorSite()); } protected TableViewerColumn createTableViewerColumn(TableViewer viewer, String title, int bound) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); return viewerColumn; } public List getRoles() { return roles; } public void refresh() { rolesViewer.refresh(); } private class RolesContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { return userAdminService.listEditableRoles().toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } /** Select the columns by editing the checkbox in the first column */ class RoleEditingSupport extends EditingSupport { private final TableViewer viewer; private final AbstractFormPart formPart; public RoleEditingSupport(TableViewer viewer, AbstractFormPart formPart) { super(viewer); this.viewer = viewer; this.formPart = formPart; } @Override protected CellEditor getCellEditor(Object element) { return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { String role = element.toString(); return roles.contains(role); } @Override protected void setValue(Object element, Object value) { Boolean inRole = (Boolean) value; String role = element.toString(); if (inRole && !roles.contains(role)) { roles.add(role); formPart.markDirty(); } else if (!inRole && roles.contains(role)) { roles.remove(role); formPart.markDirty(); } viewer.refresh(); } } }