package org.argeo.cms.users; import java.util.ArrayList; import java.util.List; import javax.jcr.Item; import javax.jcr.RepositoryException; import org.argeo.ArgeoException; import org.argeo.cms.CmsUtils; import org.argeo.cms.viewers.EditablePart; import org.argeo.cms.viewers.NodePart; import org.argeo.cms.widgets.StyledControl; import org.argeo.jcr.ArgeoNames; import org.argeo.security.UserAdminService; import org.argeo.security.jcr.JcrSecurityModel; import org.argeo.security.jcr.JcrUserDetails; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ICheckStateListener; 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.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.springframework.security.core.GrantedAuthority; /** Display a single user main info once it has been created. */ public class UserRolesPart extends StyledControl implements EditablePart, NodePart, FocusListener { private static final long serialVersionUID = -6013980335975055846L; private CheckboxTableViewer rolesViewer; private Table table; private JcrUserDetails userDetails; private UserAdminService userAdminService; private List roles; // FIXME // private final Image checked; // TODO implement to provide user creation ability for anonymous user? // public UserPart(Composite parent, int swtStyle) { // super(parent, swtStyle); // } public UserRolesPart(Composite parent, int style, Item item, UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel) throws RepositoryException { this(parent, style, item, true); } public UserRolesPart(Composite parent, int style, Item item, boolean cacheImmediately) throws RepositoryException { super(parent, style, item, cacheImmediately); // checked = new Image(parent, imageData); } @Override public Item getItem() throws RepositoryException { return getNode(); } public void setMouseListener(MouseListener mouseListener) { super.setMouseListener(mouseListener); table.addMouseListener(mouseListener); } @Override protected Control createControl(Composite box, String style) { // box.setLayout(CmsUtils.noSpaceGridLayout()); box.setLayout(new GridLayout()); Label header = new Label(box, SWT.NONE); header.setText(" Groups"); CmsUtils.style(header, UserStyles.USER_FORM_TITLE); header.setLayoutData(CmsUtils.fillWidth()); int swtStyle = SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; if (!isEditing()) swtStyle |= SWT.READ_ONLY; table = new Table(box, swtStyle); table.setLinesVisible(true); table.setHeaderVisible(false); CmsUtils.style(table, style); rolesViewer = new CheckboxTableViewer(table); TableViewerColumn column; // 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", 400); column.setLabelProvider(new ColumnLabelProvider() { private static final long serialVersionUID = -7334412925967366255L; public String getText(Object element) { return element.toString(); } }); rolesViewer.setContentProvider(new RolesContentProvider()); rolesViewer.setInput(userAdminService.listEditableRoles().toArray()); // try to prevent edition on read only nodes. Does not work. // rolesViewer.setAllGrayed(!isEditing()); rolesViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { String name = (String) event.getElement(); boolean contained = roles.contains(name); boolean checked = event.getChecked(); if (checked != contained) { if (!contained) roles.add(name); else roles.remove(name); userDetails = userDetails.cloneWithNewRoles(roles); userAdminService.updateUser(userDetails); } } }); return table; } // THE LISTENER @Override public void focusGained(FocusEvent e) { // Do nothing } @Override public void focusLost(FocusEvent e) { // Save change if needed // Text text = (Text) e.getSource(); } // private final static Image ROLE_CHECKED = SecurityAdminPlugin // .getImageDescriptor("icons/security.gif").createImage(); public void setUserAdminService(UserAdminService userAdminService) { this.userAdminService = userAdminService; try { String username = getNode().getProperty(ArgeoNames.ARGEO_USER_ID) .getString(); if (userAdminService.userExists(username)) { JcrUserDetails userDetails = (JcrUserDetails) userAdminService .loadUserByUsername(username); setUserDetails(userDetails); } } catch (Exception e) { throw new ArgeoException("Cannot retrieve userDetails for " + getNode(), e); } } public void setUserDetails(JcrUserDetails userDetails) { this.userDetails = userDetails; this.roles = new ArrayList(); for (GrantedAuthority ga : userDetails.getAuthorities()) roles.add(ga.getAuthority()); if (rolesViewer != null) rolesViewer.refresh(); } 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() { // return roles.toArray(); rolesViewer.setCheckedElements(roles.toArray()); // setSelection(1); // rolesViewer.setInput(roles); rolesViewer.refresh(); } private class RolesContentProvider implements IStructuredContentProvider { private static final long serialVersionUID = 4119915828862214310L; public Object[] getElements(Object inputElement) { return userAdminService.listEditableRoles().toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { viewer.refresh(); } } // /** Select the columns by editing the checkbox in the first column */ // class RoleEditingSupport extends EditingSupport { // // private final TableViewer viewer; // // public RoleEditingSupport(TableViewer viewer) { // super(viewer); // this.viewer = viewer; // } // // @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); // } else if (!inRole && roles.contains(role)) { // roles.remove(role); // } // viewer.refresh(); // } // } }