]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java
Plug automatic refresh of the transaction edition commands.
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / views / GroupsView.java
index 34bda0e6993d17fee97eae92dcf92865410ba90e..74d2c995dfc9da95b9ea024b467bd3cccb0e3444 100644 (file)
@@ -19,82 +19,134 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.UserAdminConstants;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.argeo.security.ui.admin.internal.ColumnDefinition;
+import org.argeo.security.ui.admin.internal.CommonNameLP;
+import org.argeo.security.ui.admin.internal.UiAdminUtils;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
+import org.argeo.security.ui.admin.internal.UserDragListener;
+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.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Composite;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
 
 /** List all groups with filter */
 public class GroupsView extends UsersView implements ArgeoNames {
        public final static String ID = SecurityAdminPlugin.PLUGIN_ID
                        + ".groupsView";
 
-       // The displayed columns
-       /** Overwrite to display other columns */
-       public List<ColumnDefinition> getColumnsDef() {
-               List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-               // Group ID
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 200));
-               // Displayed name
+       /* DEPENDENCY INJECTION */
+       private UserAdmin userAdmin;
+
+       // UI Objects
+       private UserTableViewer groupTableViewerCmp;
+       private TableViewer userViewer;
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+
+       @Override
+       public void createPartControl(Composite parent) {
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // Define the displayed columns
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
-               return columnDefs;
-       }
+               columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                               "Distinguished Name", 300));
 
-       /**
-        * Refresh the user list: caller might overwrite in order to display a
-        * subset of all users, typically to remove current user from the list
-        */
-       protected void refreshFilteredList(String filter) {
-               try {
-                       Role[] roles = userAdmin().getRoles(filter);
-                       List<User> users = new ArrayList<User>();
-                       for (Role role : roles)
-                               if (role.getType() == Role.GROUP)
-                                       users.add((User) role);
-                       getViewer().setInput(users.toArray());
-               } catch (InvalidSyntaxException e) {
-                       throw new ArgeoException("Unable to get roles with filter: "
-                                       + filter, e);
-               }
-       }
+               // Create and configure the table
+               groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
 
-       private abstract class GroupAdminAbstractLP extends ColumnLabelProvider {
-               private static final long serialVersionUID = 137336765024922368L;
+               groupTableViewerCmp.setColumnDefinitions(columnDefs);
+               groupTableViewerCmp.populate(true, false);
+               groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
 
-               @Override
-               public String getText(Object element) {
-                       User user = (User) element;
-                       return getText(user);
-               }
+               // Links
+               userViewer = groupTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
+               getViewSite().setSelectionProvider(userViewer);
+
+               // Really?
+               groupTableViewerCmp.refresh();
 
-               public abstract String getText(User user);
+               // Drag and drop
+               int operations = DND.DROP_COPY | DND.DROP_MOVE;
+               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+               userViewer.addDragSupport(operations, tt, new UserDragListener(
+                               userViewer));
        }
 
-       private class UserNameLP extends GroupAdminAbstractLP {
-               private static final long serialVersionUID = 6550449442061090388L;
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
+
+               private final String[] knownProps = { UserAdminConstants.KEY_UID,
+                               UserAdminConstants.KEY_CN, UserAdminConstants.KEY_DN };
+
+               public MyUserTableViewer(Composite parent, int style,
+                               UserAdmin userAdmin) {
+                       super(parent, style, userAdmin);
+               }
 
                @Override
-               public String getText(User user) {
-                       return user.getName();
+               protected List<User> listFilteredElements(String filter) {
+                       Role[] roles;
+                       try {
+                               StringBuilder builder = new StringBuilder();
+                               StringBuilder tmpBuilder = new StringBuilder();
+                               if (UiAdminUtils.notNull(filter))
+                                       for (String prop : knownProps) {
+                                               tmpBuilder.append("(");
+                                               tmpBuilder.append(prop);
+                                               tmpBuilder.append("=*");
+                                               tmpBuilder.append(filter);
+                                               tmpBuilder.append("*)");
+                                       }
+                               if (tmpBuilder.length() > 1) {
+                                       builder.append("(&(objectclass=groupOfNames)(|");
+                                       builder.append(tmpBuilder.toString());
+                                       builder.append("))");
+                               } else
+                                       builder.append("(objectclass=groupOfNames)");
+                               roles = userAdmin.getRoles(builder.toString());
+                       } catch (InvalidSyntaxException e) {
+                               throw new ArgeoException("Unable to get roles with filter: "
+                                               + filter, e);
+                       }
+                       List<User> users = new ArrayList<User>();
+                       for (Role role : roles)
+                               // if (role.getType() == Role.GROUP)
+                               users.add((User) role);
+                       return users;
                }
        }
 
-       private class CommonNameLP extends GroupAdminAbstractLP {
-               private static final long serialVersionUID = 5256703081044911941L;
+       public void refresh() {
+               groupTableViewerCmp.refresh();
+       }
 
-               @Override
-               public String getText(User user) {
-                       Object obj = user.getProperties().get(UserAdminConstants.KEY_CN);
-                       if (obj != null)
-                               return (String) obj;
-                       else
-                               return "";
-               }
+       // Override generic view methods
+       @Override
+       public void dispose() {
+               super.dispose();
        }
 
+       @Override
+       public void setFocus() {
+               groupTableViewerCmp.setFocus();
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setUserAdmin(UserAdmin userAdmin) {
+               this.userAdmin = userAdmin;
+       }
 }
\ No newline at end of file