X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=security%2Fplugins%2Forg.argeo.security.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Feditors%2FDefaultUserMainPage.java;fp=security%2Fplugins%2Forg.argeo.security.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Feditors%2FDefaultUserMainPage.java;h=6180de49ad871c37e8cf1bc56c297df9e63ab0ba;hb=a7a5f4db586128a9bb2c171ee819eb3eb19f80aa;hp=0000000000000000000000000000000000000000;hpb=77eaf70d8b929dab68211d6a01f68eeb71a1dceb;p=lgpl%2Fargeo-commons.git diff --git a/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/editors/DefaultUserMainPage.java b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/editors/DefaultUserMainPage.java new file mode 100644 index 000000000..6180de49a --- /dev/null +++ b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/editors/DefaultUserMainPage.java @@ -0,0 +1,337 @@ +package org.argeo.security.ui.editors; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.security.ArgeoSecurityService; +import org.argeo.security.ArgeoUser; +import org.argeo.security.SimpleArgeoUser; +import org.argeo.security.nature.SimpleUserNature; +import org.argeo.security.ui.SecurityUiPlugin; +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.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.AbstractFormPart; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.SectionPart; +import org.eclipse.ui.forms.editor.FormEditor; +import org.eclipse.ui.forms.editor.FormPage; +import org.eclipse.ui.forms.widgets.ColumnLayout; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.ScrolledForm; +import org.eclipse.ui.forms.widgets.Section; + +/** + * Display/edit the properties common to all {@link ArgeoUser} (username and + * roles) as well as the properties of the {@link SimpleUserNature}. + */ +public class DefaultUserMainPage extends FormPage { + final static String ID = "argeoUserEditor.mainPage"; + + private final static Log log = LogFactory.getLog(DefaultUserMainPage.class); + private final static Image ROLE_CHECKED = SecurityUiPlugin + .getImageDescriptor("icons/security.gif").createImage(); + + private ArgeoUser user; + private SimpleUserNature simpleNature; + private String simpleNatureType; + private ArgeoSecurityService securityService; + + public DefaultUserMainPage(FormEditor editor, + ArgeoSecurityService securityService, ArgeoUser user) { + super(editor, ID, "Main"); + this.securityService = securityService; + this.user = user; + this.simpleNature = SimpleUserNature.findSimpleUserNature(user, + simpleNatureType); + } + + protected void createFormContent(final IManagedForm mf) { + ScrolledForm form = mf.getForm(); + form.setText(simpleNature.getFirstName() + " " + + simpleNature.getLastName()); + 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); + + createGeneralPart(form.getBody()); + createRolesPart(form.getBody()); + createPassworPart(form.getBody()); + } + + /** Creates the general section */ + protected void createGeneralPart(Composite parent) { + FormToolkit tk = getManagedForm().getToolkit(); + Section section = tk.createSection(parent, Section.TITLE_BAR); + section.setText("General"); + + Composite body = tk.createComposite(section, SWT.WRAP); + section.setClient(body); + GridLayout layout = new GridLayout(); + layout.marginWidth = layout.marginHeight = 0; + layout.numColumns = 2; + body.setLayout(layout); + + // add widgets (view) + final Text username; + if (user.getUsername() != null) { + tk.createLabel(body, "Username"); + tk.createLabel(body, user.getUsername()); + username = null; + } else { + username = createLT(body, "Username", ""); + } + final Text firstName = createLT(body, "First name", + simpleNature.getFirstName()); + final Text lastName = createLT(body, "Last name", + simpleNature.getLastName()); + final Text email = createLT(body, "Email", simpleNature.getEmail()); + final Text description = createLT(body, "Description", + simpleNature.getDescription()); + + // create form part (controller) + AbstractFormPart part = new SectionPart(section) { + public void commit(boolean onSave) { + if (username != null) { + ((SimpleArgeoUser) user).setUsername(username.getText()); + username.setEditable(false); + username.setEnabled(false); + } + simpleNature.setFirstName(firstName.getText()); + simpleNature.setLastName(lastName.getText()); + simpleNature.setEmail(email.getText()); + simpleNature.setDescription(description.getText()); + super.commit(onSave); + if (log.isTraceEnabled()) + log.trace("General part committed"); + } + }; + if (username != null) + username.addModifyListener(new FormPartML(part)); + firstName.addModifyListener(new FormPartML(part)); + lastName.addModifyListener(new FormPartML(part)); + email.addModifyListener(new FormPartML(part)); + description.addModifyListener(new FormPartML(part)); + getManagedForm().addPart(part); + } + + /** Creates the password section */ + protected void createPassworPart(Composite parent) { + FormToolkit tk = getManagedForm().getToolkit(); + Section section = tk.createSection(parent, Section.TITLE_BAR); + section.setText("Password"); + + Composite body = tk.createComposite(section, SWT.WRAP); + section.setClient(body); + GridLayout layout = new GridLayout(); + layout.marginWidth = layout.marginHeight = 0; + layout.numColumns = 2; + body.setLayout(layout); + + // add widgets (view) + final Text password1 = createLP(body, "New password", ""); + final Text password2 = createLP(body, "Repeat password", ""); + // create form part (controller) + AbstractFormPart part = new SectionPart(section) { + public void commit(boolean onSave) { + if (!password1.getText().equals("") + && password1.getText().equals(password2.getText())) { + ((SimpleArgeoUser) user).setPassword(password1.getText()); + } + super.commit(onSave); + if (log.isTraceEnabled()) + log.trace("Password part committed"); + } + }; + password1.addModifyListener(new FormPartML(part)); + password2.addModifyListener(new FormPartML(part)); + getManagedForm().addPart(part); + } + + /** Creates the role section */ + protected void createRolesPart(Composite parent) { + FormToolkit tk = getManagedForm().getToolkit(); + Section section = tk.createSection(parent, Section.DESCRIPTION + | Section.TITLE_BAR); + section.setText("Roles"); + section.setDescription("Roles define " + + "the authorizations for this user."); + Table table = new Table(section, SWT.MULTI | SWT.H_SCROLL + | SWT.V_SCROLL); + section.setClient(table); + + AbstractFormPart part = new SectionPart(section) { + 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); + TableViewer viewer = new TableViewer(table); + + // check column + TableViewerColumn column = createTableViewerColumn(viewer, "checked", + 20); + column.setLabelProvider(new ColumnLabelProvider() { + public String getText(Object element) { + return null; + } + + public Image getImage(Object element) { + String role = element.toString(); + if (user.getRoles().contains(role)) { + return ROLE_CHECKED; + } else { + return null; + } + } + }); + column.setEditingSupport(new RoleEditingSupport(viewer, part)); + + // role column + column = createTableViewerColumn(viewer, "Role", 200); + column.setLabelProvider(new ColumnLabelProvider() { + public String getText(Object element) { + return element.toString(); + } + + public Image getImage(Object element) { + return null; + } + }); + viewer.setContentProvider(new RolesContentProvider()); + viewer.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; + + } + + /** Creates label and text. */ + protected Text createLT(Composite body, String label, String value) { + FormToolkit toolkit = getManagedForm().getToolkit(); + toolkit.createLabel(body, label); + Text text = toolkit.createText(body, value, SWT.BORDER); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + return text; + } + + /** Creates label and password. */ + protected Text createLP(Composite body, String label, String value) { + FormToolkit toolkit = getManagedForm().getToolkit(); + toolkit.createLabel(body, label); + Text text = toolkit.createText(body, value, SWT.BORDER | SWT.PASSWORD); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + return text; + } + + public void setSimpleNatureType(String simpleNatureType) { + this.simpleNatureType = simpleNatureType; + } + + private class FormPartML implements ModifyListener { + private AbstractFormPart formPart; + + public FormPartML(AbstractFormPart generalPart) { + this.formPart = generalPart; + } + + public void modifyText(ModifyEvent e) { + formPart.markDirty(); + } + + } + + private class RolesContentProvider implements IStructuredContentProvider { + public Object[] getElements(Object inputElement) { + return securityService.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 user.getRoles().contains(role); + + } + + @Override + protected void setValue(Object element, Object value) { + Boolean inRole = (Boolean) value; + String role = element.toString(); + if (inRole && !user.getRoles().contains(role)) { + user.getRoles().add(role); + formPart.markDirty(); + } else if (!inRole && user.getRoles().contains(role)) { + user.getRoles().remove(role); + formPart.markDirty(); + } + viewer.refresh(); + } + } + +}