X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Feditors%2FUserMainPage.java;h=c657c35086650e1f01f636ffbf8c3b97f6235690;hb=eec0cd2b46a2186b4df1b1a59962c81ae2a9bcb7;hp=df8e505af04b6fd382ef6115167168e739e72abc;hpb=863c2382c277f82f0bba67b8d73ea61ce1eda1f3;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java index df8e505af..c657c3508 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java @@ -30,7 +30,14 @@ import org.argeo.security.ui.admin.internal.UserNameLP; import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener; import org.argeo.security.ui.admin.internal.UserTableViewer; 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; +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.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; @@ -46,6 +53,8 @@ import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; +import org.osgi.service.useradmin.Group; +import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; @@ -208,7 +217,7 @@ public class UserMainPage extends FormPage implements ArgeoNames { private UserTableViewer userTableViewerCmp; private TableViewer userViewer; - public void appendMemberOfPart(Composite parent) { + private void appendMemberOfPart(Composite parent) { FormToolkit tk = getManagedForm().getToolkit(); Composite body = addSection(tk, parent, "Roles"); body.setLayout(EclipseUiUtils.noSpaceGridLayout()); @@ -236,6 +245,13 @@ public class UserMainPage extends FormPage implements ArgeoNames { 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, userAdmin, editor.getDisplayedUser())); + } private class MyUserTableViewer extends UserTableViewer { @@ -248,10 +264,60 @@ public class UserMainPage extends FormPage implements ArgeoNames { @Override protected List listFilteredElements(String filter) { - return (List) editor.getFlatGroups(); + return (List) editor.getFlatGroups(null); + } + } + + /** + * Defines this table as being a potential target to add group membership + * (roles) to this user + */ + private class GroupDropListener extends ViewerDropAdapter { + private static final long serialVersionUID = 2893468717831451621L; + + private final UserAdmin myUserAdmin; + private final User myUser; + + public GroupDropListener(Viewer viewer, UserAdmin userAdmin, User user) { + super(viewer); + this.myUserAdmin = userAdmin; + this.myUser = user; + } + + @Override + public boolean validateDrop(Object target, int operation, + TransferData transferType) { + // Target is always OK in a list only view + // TODO check if not a string + boolean validDrop = true; + return validDrop; + } + + @Override + public void drop(DropTargetEvent event) { + String name = (String) event.data; + Role role = myUserAdmin.getRole(name); + // TODO this check should be done before. + if (role.getType() == Role.GROUP) { + // TODO check if the user is already member of this group + // we expect here that there is already a begun transaction + // TODO implement the dirty state + editor.beginTransactionIfNeeded(); + Group group = (Group) role; + group.addMember(myUser); + } + super.drop(event); + } + + @Override + public boolean performDrop(Object data) { + userTableViewerCmp.refresh(); + return true; } } + // LOCAL HELPERS + /** Appends a section with a title */ private Composite addSection(FormToolkit tk, Composite parent, String title) { Section section = tk.createSection(parent, Section.TITLE_BAR); GridData gd = EclipseUiUtils.fillWidth();