X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Finternal%2Fparts%2FGroupMainPage.java;h=4a441a1a2d4a3c19651d7dfef7ba4e28528150bb;hb=89ad04528a66488eb3ad6f51c198d5df3c81b04c;hp=c7cecf21015e17806546af296569ed75172388fe;hpb=732542c8de267ed7d6cbb8c66b84cc90c8ad22d7;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java index c7cecf210..4a441a1a2 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java @@ -16,25 +16,32 @@ package org.argeo.security.ui.admin.internal.parts; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -import javax.jcr.RepositoryException; - -import org.argeo.ArgeoException; +import org.argeo.cms.util.useradmin.UserAdminUtils; +import org.argeo.eclipse.ui.ColumnDefinition; import org.argeo.eclipse.ui.EclipseUiUtils; +import org.argeo.eclipse.ui.parts.LdifUsersTable; import org.argeo.jcr.ArgeoNames; -import org.argeo.security.ui.admin.internal.ColumnDefinition; -import org.argeo.security.ui.admin.internal.UserAdminConstants; +import org.argeo.osgi.useradmin.LdifName; +import org.argeo.security.ui.admin.SecurityAdminImages; import org.argeo.security.ui.admin.internal.UserAdminWrapper; -import org.argeo.security.ui.admin.internal.UserTableViewer; +import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener; +import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener; import org.argeo.security.ui.admin.internal.providers.CommonNameLP; import org.argeo.security.ui.admin.internal.providers.MailLP; import org.argeo.security.ui.admin.internal.providers.RoleIconLP; +import org.argeo.security.ui.admin.internal.providers.UserFilter; import org.argeo.security.ui.admin.internal.providers.UserNameLP; import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; @@ -42,12 +49,17 @@ import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.forms.AbstractFormPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.SectionPart; @@ -79,117 +91,145 @@ public class GroupMainPage extends FormPage implements ArgeoNames { } protected void createFormContent(final IManagedForm mf) { - try { - ScrolledForm form = mf.getForm(); - refreshFormTitle(); - - // Body - Composite body = form.getBody(); - GridLayout mainLayout = new GridLayout(); - body.setLayout(mainLayout); - appendOverviewPart(body); - appendMembersPart(body); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot create form content", e); - } + ScrolledForm form = mf.getForm(); + Composite body = form.getBody(); + GridLayout mainLayout = new GridLayout(); + body.setLayout(mainLayout); + Group group = (Group) editor.getDisplayedUser(); + appendOverviewPart(body, group); + appendMembersPart(body, group); } /** Creates the general section */ - protected void appendOverviewPart(Composite parent) { + protected void appendOverviewPart(final Composite parent, final Group group) { FormToolkit tk = getManagedForm().getToolkit(); Composite body = addSection(tk, parent, "Main information"); GridLayout layout = new GridLayout(2, false); body.setLayout(layout); - Text distinguishedName = createLT(body, "Group Name", - editor.getProperty(UserAdminConstants.KEY_UID)); - distinguishedName.setEnabled(false); + final Text dnTxt = createLT(body, "DN", group.getName()); + dnTxt.setEnabled(false); + + final Text cnTxt = createLT(body, "Common Name", + UserAdminUtils.getProperty(group, LdifName.cn.name())); + cnTxt.setEnabled(false); - final Text commonName = createLT(body, "Common Name", - editor.getProperty(UserAdminConstants.KEY_CN)); - commonName.setEnabled(false); + Label descLbl = new Label(body, SWT.LEAD); + descLbl.setText("Description"); + descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + final Text descTxt = new Text(body, SWT.LEAD | SWT.MULTI | SWT.WRAP + | SWT.BORDER); + GridData gd = EclipseUiUtils.fillAll(); + gd.heightHint = 100; + descTxt.setLayoutData(gd); // create form part (controller) AbstractFormPart part = new SectionPart((Section) body.getParent()) { + + private MainInfoListener listener; + + @Override + public void initialize(IManagedForm form) { + super.initialize(form); + listener = editor.new MainInfoListener(parent.getDisplay(), this); + userAdminWrapper.addListener(listener); + } + + @Override + public void dispose() { + userAdminWrapper.removeListener(listener); + super.dispose(); + } + + @SuppressWarnings("unchecked") public void commit(boolean onSave) { + group.getProperties().put(LdifName.description.name(), + descTxt.getText()); + // Enable common name ? + // editor.setProperty(UserAdminConstants.KEY_CN, + // email.getText()); super.commit(onSave); } + + @Override + public void refresh() { + refreshFormTitle(group); + dnTxt.setText(group.getName()); + cnTxt.setText(UserAdminUtils.getProperty(group, + LdifName.cn.name())); + descTxt.setText(UserAdminUtils.getProperty(group, + LdifName.description.name())); + super.refresh(); + } }; + + ModifyListener defaultListener = editor.new FormPartML(part); + descTxt.addModifyListener(defaultListener); getManagedForm().addPart(part); } /** Filtered table with members. Has drag & drop ability */ - protected void appendMembersPart(Composite parent) - throws RepositoryException { + protected void appendMembersPart(Composite parent, Group group) { FormToolkit tk = getManagedForm().getToolkit(); Section section = tk.createSection(parent, Section.TITLE_BAR); section.setLayoutData(EclipseUiUtils.fillAll()); - section.setText("Members of group " - + editor.getProperty(UserAdminConstants.KEY_CN)); - // Composite body = tk.createComposite(section, SWT.NONE); Composite body = new Composite(section, SWT.NO_FOCUS); section.setClient(body); body.setLayoutData(EclipseUiUtils.fillAll()); - createMemberPart(body); - - // create form part (controller) - AbstractFormPart part = new SectionPart(section) { - public void commit(boolean onSave) { - super.commit(onSave); - } - }; + LdifUsersTable userTableViewerCmp = createMemberPart(body, group); + SectionPart part = new GroupMembersPart(section, userTableViewerCmp, + group); getManagedForm().addPart(part); + addRemoveAbitily(part, userTableViewerCmp.getTableViewer(), group); } - // UI Objects - private UserTableViewer userTableViewerCmp; - private TableViewer userViewer; - private List columnDefs = new ArrayList(); - - public void createMemberPart(Composite parent) { + public LdifUsersTable createMemberPart(Composite parent, Group group) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); + // Define the displayed columns + List columnDefs = new ArrayList(); columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24)); - columnDefs.add(new ColumnDefinition(new UserNameLP(), - "Distinguished Name", 240)); columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150)); columnDefs.add(new ColumnDefinition(new MailLP(), "Primary Mail", 150)); + columnDefs.add(new ColumnDefinition(new UserNameLP(), + "Distinguished Name", 240)); // Create and configure the table - userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI + LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin()); - userTableViewerCmp.setColumnDefinitions(columnDefs); - userTableViewerCmp.populate(true, false); - // userTableViewerCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, - // false, false)); - userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); + userViewerCmp.setColumnDefinitions(columnDefs); + userViewerCmp.populate(true, false); + userViewerCmp.setLayoutData(EclipseUiUtils.fillAll()); - // Links - userViewer = userTableViewerCmp.getTableViewer(); + // Controllers + TableViewer userViewer = userViewerCmp.getTableViewer(); userViewer.addDoubleClickListener(new UserTableDefaultDClickListener()); - // Really? - userTableViewerCmp.refresh(); - - // Drag and drop int operations = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; userViewer.addDropSupport(operations, tt, - new GroupDropListener(userViewer, userAdminWrapper, + new GroupDropListener(userAdminWrapper, userViewerCmp, (Group) editor.getDisplayedUser())); + + return userViewerCmp; } - private class MyUserTableViewer extends UserTableViewer { + // Local viewers + private class MyUserTableViewer extends LdifUsersTable { private static final long serialVersionUID = 8467999509931900367L; + private final UserFilter userFilter; + public MyUserTableViewer(Composite parent, int style, UserAdmin userAdmin) { - super(parent, style, userAdmin, true); + super(parent, style, true); + userFilter = new UserFilter(); + } @Override @@ -197,33 +237,136 @@ public class GroupMainPage extends FormPage implements ArgeoNames { Group group = (Group) editor.getDisplayedUser(); Role[] roles = group.getMembers(); List users = new ArrayList(); + userFilter.setSearchText(filter); for (Role role : roles) // if (role.getType() == Role.GROUP) - users.add((User) role); + if (userFilter.select(null, null, role)) + users.add((User) role); return users; } } - private void refreshFormTitle() throws RepositoryException { - getManagedForm().getForm().setText( - editor.getProperty(UserAdminConstants.KEY_CN)); + private void addRemoveAbitily(SectionPart sectionPart, + TableViewer userViewer, Group group) { + Section section = sectionPart.getSection(); + ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT); + ToolBar toolbar = toolBarManager.createControl(section); + final Cursor handCursor = new Cursor(section.getDisplay(), + SWT.CURSOR_HAND); + toolbar.setCursor(handCursor); + toolbar.addDisposeListener(new DisposeListener() { + private static final long serialVersionUID = 3882131405820522925L; + + public void widgetDisposed(DisposeEvent e) { + if ((handCursor != null) && (handCursor.isDisposed() == false)) { + handCursor.dispose(); + } + } + }); + + Action action = new RemoveMembershipAction(userViewer, group, + "Remove selected items from this group", + SecurityAdminImages.ICON_REMOVE_DESC); + toolBarManager.add(action); + toolBarManager.update(true); + section.setTextClient(toolbar); + } + + private class RemoveMembershipAction extends Action { + private static final long serialVersionUID = -1337713097184522588L; + + private final TableViewer userViewer; + private final Group group; + + RemoveMembershipAction(TableViewer userViewer, Group group, + String name, ImageDescriptor img) { + super(name, img); + this.userViewer = userViewer; + this.group = group; + } + + @Override + public void run() { + ISelection selection = userViewer.getSelection(); + if (selection.isEmpty()) + return; + + @SuppressWarnings("unchecked") + Iterator it = ((IStructuredSelection) selection).iterator(); + List users = new ArrayList(); + // StringBuilder builder = new StringBuilder(); + while (it.hasNext()) { + User currUser = it.next(); + // String groupName = UserAdminUtils.getUsername(currGroup); + // builder.append(groupName).append("; "); + users.add(currUser); + } + + userAdminWrapper.beginTransactionIfNeeded(); + for (User user : users) { + group.removeMember(user); + } + userAdminWrapper.notifyListeners(new UserAdminEvent(null, + UserAdminEvent.ROLE_CHANGED, group)); + } + } + + // LOCAL CONTROLLERS + private class GroupMembersPart extends SectionPart { + private final LdifUsersTable userViewer; + private final Group group; + + private GroupChangeListener listener; + + public GroupMembersPart(Section section, LdifUsersTable userViewer, + Group group) { + super(section); + this.userViewer = userViewer; + this.group = group; + } + + @Override + public void initialize(IManagedForm form) { + super.initialize(form); + listener = editor.new GroupChangeListener(userViewer.getDisplay(), GroupMembersPart.this); + userAdminWrapper.addListener(listener); + } + + @Override + public void dispose() { + userAdminWrapper.removeListener(listener); + super.dispose(); + } + + @Override + public void refresh() { + refreshFormTitle(group); + getSection().setText( + "Members of group " + + UserAdminUtils.getProperty(group, + LdifName.cn.name())); + userViewer.refresh(); + super.refresh(); + } } /** * Defines this table as being a potential target to add group membership - * (roles) to this user + * (roles) to this group */ private class GroupDropListener extends ViewerDropAdapter { private static final long serialVersionUID = 2893468717831451621L; private final UserAdminWrapper userAdminWrapper; + // private final LdifUsersTable myUserViewerCmp; private final Group myGroup; - public GroupDropListener(Viewer viewer, - UserAdminWrapper userAdminWrapper, Group group) { - super(viewer); + public GroupDropListener(UserAdminWrapper userAdminWrapper, + LdifUsersTable userTableViewerCmp, Group group) { + super(userTableViewerCmp.getTableViewer()); this.userAdminWrapper = userAdminWrapper; this.myGroup = group; + // this.myUserViewerCmp = userTableViewerCmp; } @Override @@ -237,21 +380,13 @@ public class GroupMainPage extends FormPage implements ArgeoNames { @Override public void drop(DropTargetEvent event) { - // TODO Is there an opportunity to perform ceck before? + // TODO Is there an opportunity to perform the check before? String newUserName = (String) event.data; UserAdmin myUserAdmin = userAdminWrapper.getUserAdmin(); Role role = myUserAdmin.getRole(newUserName); - if (role.getType() == Role.USER) { - // TODO check if the user is already member of this group - userAdminWrapper.beginTransactionIfNeeded(); - User user = (User) role; - myGroup.addMember(user); - userAdminWrapper.notifyListeners(new UserAdminEvent(null, - UserAdminEvent.ROLE_CHANGED, myGroup)); - } else if (role.getType() == Role.GROUP) { + if (role.getType() == Role.GROUP) { Group newGroup = (Group) role; - Shell shell = getViewer().getControl().getShell(); // Sanity checks if (myGroup == newGroup) { // Equality @@ -278,24 +413,35 @@ public class GroupMainPage extends FormPage implements ArgeoNames { + ", this membership already exists"); return; } - userAdminWrapper.beginTransactionIfNeeded(); // TODO implement the dirty state myGroup.addMember(newGroup); userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_CHANGED, myGroup)); + } else if (role.getType() == Role.USER) { + // TODO check if the group is already member of this group + userAdminWrapper.beginTransactionIfNeeded(); + User user = (User) role; + myGroup.addMember(user); + userAdminWrapper.notifyListeners(new UserAdminEvent(null, + UserAdminEvent.ROLE_CHANGED, myGroup)); } super.drop(event); } @Override public boolean performDrop(Object data) { - userTableViewerCmp.refresh(); + // myUserViewerCmp.refresh(); return true; } } // LOCAL HELPERS + private void refreshFormTitle(Group group) { + getManagedForm().getForm().setText( + UserAdminUtils.getProperty(group, LdifName.cn.name())); + } + private Composite addSection(FormToolkit tk, Composite parent, String title) { Section section = tk.createSection(parent, Section.TITLE_BAR); GridData gd = EclipseUiUtils.fillWidth(); @@ -309,7 +455,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames { } /** Creates label and text. */ - protected Text createLT(Composite body, String label, String value) { + private Text createLT(Composite body, String label, String value) { FormToolkit toolkit = getManagedForm().getToolkit(); Label lbl = toolkit.createLabel(body, label); lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));