]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java
Plug automatic refresh of the transaction edition commands.
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / editors / UserMainPage.java
index d4ca071270fc8db97c7e5d89939a182e96e343dc..c657c35086650e1f01f636ffbf8c3b97f6235690 100644 (file)
@@ -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,16 +217,16 @@ 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, "Groups");
+               Composite body = addSection(tk, parent, "Roles");
                body.setLayout(EclipseUiUtils.noSpaceGridLayout());
 
                // Define the displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
                columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 240));
+                               "Distinguished Name", 300));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
 
@@ -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,20 +264,60 @@ public class UserMainPage extends FormPage implements ArgeoNames {
 
                @Override
                protected List<User> listFilteredElements(String filter) {
-                       List<User> users = new ArrayList<User>();
-
-                       // "member of" method?
-                       // Group group = (Group) editor.getDisplayedUser();
-                       // Role[] roles = group.getMembers();
-                       // List<User> users = new ArrayList<User>();
-                       // for (Role role : roles)
-                       // // if (role.getType() == Role.GROUP)
-                       // users.add((User) role);
-                       // return users;
-                       return users;
+                       return (List<User>) 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();
@@ -303,7 +359,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                return text;
        }
-       
+
        private class FormPartML implements ModifyListener {
                private static final long serialVersionUID = 6299808129505381333L;
                private AbstractFormPart formPart;