Work on userAdmin UI:
authorBruno Sinou <bsinou@argeo.org>
Fri, 4 Sep 2015 13:15:48 +0000 (13:15 +0000)
committerBruno Sinou <bsinou@argeo.org>
Fri, 4 Sep 2015 13:15:48 +0000 (13:15 +0000)
+ Add filter to user and group view
+ Display the list of all members of a group
+ Some code cleaning

git-svn-id: https://svn.argeo.org/commons/trunk@8365 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

16 files changed:
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java [deleted file]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java

diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/UserAdminConstants.java
deleted file mode 100644 (file)
index f17800b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.security.ui.admin;
-
-/** Temporary centralization of the user admin constants */
-public interface UserAdminConstants {
-
-       public final static String KEY_UID = "uid";
-       public final static String KEY_CN = "cn";
-       public final static String KEY_MAIL = "mail";
-       
-}
index 3d75b56fd1e6cf7739f6a81badf25de88c4e75c2..7e880bfc4e4074e01e4a7118f98c1d6db763936d 100644 (file)
@@ -22,28 +22,19 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.eclipse.ui.utils.ViewerUtils;
 import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.ui.admin.SecurityAdminImages;
-import org.argeo.security.ui.admin.UserAdminConstants;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.argeo.security.ui.admin.internal.ColumnDefinition;
+import org.argeo.security.ui.admin.internal.CommonNameLP;
+import org.argeo.security.ui.admin.internal.MailLP;
+import org.argeo.security.ui.admin.internal.RoleIconLP;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
+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.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.Font;
-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.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.forms.AbstractFormPart;
 import org.eclipse.ui.forms.IManagedForm;
 import org.eclipse.ui.forms.SectionPart;
@@ -52,11 +43,12 @@ 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;
 
-/** Display/edit the properties of the groups */
+/** Display/edit main properties of a given group */
 public class GroupMainPage extends FormPage implements ArgeoNames {
        final static String ID = "GroupEditor.mainPage";
 
@@ -73,10 +65,10 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        protected void createFormContent(final IManagedForm mf) {
                try {
                        ScrolledForm form = mf.getForm();
+                       form.getBody().getParent().setLayoutData(EclipseUiUtils.fillAll());
+                       form.setExpandHorizontal(true);
                        refreshFormTitle(form);
-                       GridLayout mainLayout = new GridLayout(1, true);
-                       form.getBody().setLayout(mainLayout);
-
+                       // GridLayout mainLayout = new GridLayout(1, true);
                        createGeneralPart(form.getBody());
                } catch (RepositoryException e) {
                        throw new ArgeoException("Cannot create form content", e);
@@ -86,303 +78,105 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        /** Creates the general section */
        protected void createGeneralPart(Composite parent)
                        throws RepositoryException {
+               parent.setLayout(new GridLayout());
+
                FormToolkit tk = getManagedForm().getToolkit();
                Section section = tk.createSection(parent, Section.TITLE_BAR);
-               section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               section.setLayoutData(EclipseUiUtils.fillAll());
                section.setText("Members of "
                                + editor.getProperty(UserAdminConstants.KEY_CN));
-               Composite body = tk.createComposite(section, SWT.WRAP);
+
+               // Composite body = tk.createComposite(section, SWT.NONE);
+               Composite body = new Composite(section, SWT.NO_FOCUS);
                section.setClient(body);
                body.setLayoutData(EclipseUiUtils.fillAll());
 
-               body.setLayout(new GridLayout());
-               new Label(body, SWT.NONE)
-                               .setText("Display a table with members for this group");
-
-               // final Text firstName = createLT(body, "First name",
-               // getProperty(ARGEO_FIRST_NAME));
-               // final Text lastName = createLT(body, "Last name",
-               // getProperty(ARGEO_LAST_NAME));
-               // final Text email = createLT(body, "Email",
-               // editor.getProperty(UserAdminConstants.KEY_MAIL));
-               // // final Text description = createLMT(body, "Description",
-               // getProperty(Property.JCR_DESCRIPTION));
+               createMemberPart(body);
 
                // create form part (controller)
                AbstractFormPart part = new SectionPart(section) {
                        public void commit(boolean onSave) {
-                               // TODO check mail validity
-                               // editor.setProperty(UserAdminConstants.KEY_MAIL,
-                               // email.getText());
-
-                               // userProfile.getSession().getWorkspace().getVersionManager()
-                               // .checkout(userProfile.getPath());
-                               // userProfile.setProperty(Property.JCR_TITLE,
-                               // commonName.getText());
-                               // userProfile.setProperty(ARGEO_FIRST_NAME,
-                               // firstName.getText());
-                               // userProfile
-                               // .setProperty(ARGEO_LAST_NAME, lastName.getText());
-                               // userProfile.setProperty(ARGEO_PRIMARY_EMAIL,
-                               // email.getText());
-                               // userProfile.setProperty(Property.JCR_DESCRIPTION,
-                               // description.getText());
-                               // userProfile.getSession().save();
-                               // userProfile.getSession().getWorkspace().getVersionManager()
-                               // .checkin(userProfile.getPath());
                                super.commit(onSave);
                        }
                };
-               // if (username != null)
-               // username.addModifyListener(new FormPartML(part));
-               // commonName.addModifyListener(new FormPartML(part));
-               // firstName.addModifyListener(new FormPartML(part));
-               // lastName.addModifyListener(new FormPartML(part));
 
-               // email.addModifyListener(new FormPartML(part));
                getManagedForm().addPart(part);
        }
 
-       private void refreshFormTitle(ScrolledForm form) throws RepositoryException {
-               // form.setText(getProperty(Property.JCR_TITLE)
-               // + (userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? ""
-               // : " [DISABLED]"));
-       }
-
-       // /** @return the property, or the empty string if not set */
-       // protected String getProperty(String name) throws RepositoryException {
-       // return userProfile.hasProperty(name) ? userProfile.getProperty(name)
-       // .getString() : "";
-       // }
-
-       /** Creates label and text. */
-       protected 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));
-               Text text = toolkit.createText(body, value, SWT.BORDER);
-               text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               return text;
-       }
-
-       /** Creates label and multiline text. */
-       protected Text createLMT(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));
-               Text text = toolkit.createText(body, value, SWT.BORDER | SWT.MULTI);
-               text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
-               return text;
-       }
-
-       private class FormPartML implements ModifyListener {
-               private static final long serialVersionUID = 6299808129505381333L;
-               private AbstractFormPart formPart;
+       // UI Objects
+       private UserTableViewer userTableViewerCmp;
+       private TableViewer userViewer;
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
 
-               public FormPartML(AbstractFormPart generalPart) {
-                       this.formPart = generalPart;
-               }
+       public void createMemberPart(Composite parent) {
+               // parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // parent2.setLayoutData(EclipseUiUtils.fillAll());
+               // Composite parent = new Composite(parent2, SWT.NO_FOCUS);
+               // parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+               // parent.setLayoutData(EclipseUiUtils.fillAll());
 
-               public void modifyText(ModifyEvent e) {
-                       formPart.markDirty();
-               }
-       }
-
-       // Manage the user table
-       public List<ColumnDefinition> getColumnsDef() {
-               List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-
-               // Icon
-               columnDefs.add(new ColumnDefinition(new UserNameLP(), "", 0, 26));
-               // Distinguished Name
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(),
-                               "Distinguished Name", 150));
-               // Displayed name
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // Define the displayed columns
+               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));
-               return columnDefs;
-       }
+               columnDefs.add(new ColumnDefinition(new MailLP(), "Primary Mail", 150));
 
-       private void createUserTable(Composite parent) {
+               // Create and configure the table
+               userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
 
-               // Main Layout
-               GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
-               layout.verticalSpacing = 5;
-               parent.setLayout(layout);
-
-               // usersViewer = createTableViewer(parent);
-               // usersViewer.setContentProvider(new UsersContentProvider());
+               userTableViewerCmp.setColumnDefinitions(columnDefs);
+               userTableViewerCmp.populate(true, false);
+               // userTableViewerCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
+               // false, false));
+               userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
 
+               // Links
+               userViewer = userTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
                // Really?
-               refreshFilteredList(null);
-
-               // Configure
-               // usersViewer.addDoubleClickListener(new ViewDoubleClickListener());
-               // getViewSite().setSelectionProvider(usersViewer);
-       }
-
-       private TableViewer createTableViewer(final Composite parent) {
-               int style = SWT.H_SCROLL | SWT.V_SCROLL;
-
-               Composite tableCmp = new Composite(parent, SWT.NO_FOCUS);
-               tableCmp.setLayoutData(EclipseUiUtils.fillAll());
-
-               Table table = new Table(tableCmp, style);
-               TableViewer viewer = new TableViewer(table);
-               table.setLinesVisible(true);
-               table.setHeaderVisible(true);
-
-               TableColumnLayout tableColumnLayout = new TableColumnLayout();
-               TableViewerColumn column;
-
-               // Create other columns
-               List<ColumnDefinition> colDefs = getColumnsDef();
-               for (ColumnDefinition colDef : colDefs) {
-                       column = ViewerUtils.createTableViewerColumn(viewer, colDef.label,
-                                       SWT.NONE, colDef.weight);
-                       column.setLabelProvider(colDef.provider);
-                       tableColumnLayout.setColumnData(column.getColumn(),
-                                       new ColumnWeightData(colDef.weight, colDef.minWidth, true));
-               }
-
-               tableCmp.setLayout(tableColumnLayout);
-               return viewer;
-       }
-
-       @Override
-       public void dispose() {
-               super.dispose();
-       }
-
-       private class UsersContentProvider implements IStructuredContentProvider {
-               private static final long serialVersionUID = 1L;
-
-               public Object[] getElements(Object inputElement) {
-                       return (Object[]) inputElement;
-               }
-
-               public void dispose() {
-               }
-
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-       }
-
-       /**
-        * 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.USER && role.getType() != Role.GROUP)
-               // // users.add((User) role);
-               // // usersViewer.setInput(users.toArray());
-               // } catch (InvalidSyntaxException e) {
-               // throw new ArgeoException("Unable to get roles with filter: "
-               // + filter, e);
-               // }
-       }
-
-       // Local helpers
-
-       private abstract class UseradminAbstractLP extends ColumnLabelProvider {
-               private static final long serialVersionUID = 137336765024922368L;
-
-               @Override
-               public Font getFont(Object element) {
-                       // TODO manage fonts
-                       // // self
-                       // String username = getProperty(elem, ARGEO_USER_ID);
-                       // if (username.equals(session.getUserID()))
-                       // return bold;
-                       // // disabled
-                       // try {
-                       // Node userProfile = (Node) elem;
-                       // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
-                       // return italic;
-                       // else
-                       // return null;
-                       // } catch (RepositoryException e) {
-                       // throw new ArgeoException("Cannot get font for " + username, e);
-                       // }
-                       // }
-
-                       return super.getFont(element);
-               }
-
-               @Override
-               public String getText(Object element) {
-                       User user = (User) element;
-                       return getText(user);
-               }
-
-               public abstract String getText(User user);
+               userTableViewerCmp.refresh();
        }
 
-       private class IconLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 6550449442061090388L;
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
 
-               @Override
-               public String getText(User user) {
-                       return "";
+               public MyUserTableViewer(Composite parent, int style,
+                               UserAdmin userAdmin) {
+                       super(parent, style, userAdmin, true);
                }
 
                @Override
-               public Image getImage(Object element) {
-                       User user = (User) element;
-                       if (user.getType() == Role.GROUP)
-                               return SecurityAdminImages.ICON_GROUP;
-                       else
-                               return SecurityAdminImages.ICON_USER;
+               protected List<User> listFilteredElements(String filter) {
+                       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;
                }
        }
 
-       private class UserNameLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 6550449442061090388L;
-
-               @Override
-               public String getText(User user) {
-                       return user.getName();
-               }
-       }
-
-       private class CommonNameLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 5256703081044911941L;
-
-               @Override
-               public String getText(User user) {
-                       Object obj = user.getProperties().get(UserAdminConstants.KEY_CN);
-                       if (obj != null)
-                               return (String) obj;
-                       else
-                               return "";
-               }
+       private void refreshFormTitle(ScrolledForm form) throws RepositoryException {
+               // form.setText(getProperty(Property.JCR_TITLE)
+               // + (userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? ""
+               // : " [DISABLED]"));
        }
 
-       protected class ColumnDefinition {
-               protected ColumnLabelProvider provider;
-               protected String label;
-               protected int weight;
-               protected int minWidth;
-
-               public ColumnDefinition(ColumnLabelProvider provider, String label,
-                               int weight) {
-                       this.provider = provider;
-                       this.label = label;
-                       this.weight = weight;
-                       this.minWidth = weight;
-               }
-
-               public ColumnDefinition(ColumnLabelProvider provider, String label,
-                               int weight, int minWidth) {
-                       this.provider = provider;
-                       this.label = label;
-                       this.weight = weight;
-                       this.minWidth = minWidth;
-
-               }
-       }
+       // private class FormPartML implements ModifyListener {
+       // private static final long serialVersionUID = 6299808129505381333L;
+       // private AbstractFormPart formPart;
+       //
+       // public FormPartML(AbstractFormPart generalPart) {
+       // this.formPart = generalPart;
+       // }
+       //
+       // public void modifyText(ModifyEvent e) {
+       // formPart.markDirty();
+       // }
+       // }
 }
\ No newline at end of file
index 7518b8084aaf90892e0117f0ece1412b29f3d0e5..a811f86216b0eaf7ab2d77e244f854908eaaed6e 100644 (file)
@@ -16,9 +16,8 @@
 package org.argeo.security.ui.admin.editors;
 
 import org.argeo.ArgeoException;
-import org.argeo.security.ui.admin.SecurityAdminImages;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.UserAdminConstants;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
@@ -28,7 +27,7 @@ import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 
-/** Editor for an Argeo user. */
+/** Editor for a user, might be a user or a group. */
 public class UserEditor extends FormEditor implements UserAdminConstants {
        private static final long serialVersionUID = 8357851520380820241L;
 
@@ -59,16 +58,19 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
                setPartName(commonName != null ? commonName : "username");
        }
 
+       /** Exposes the user (or group) that is displayed by the current editor */
+       protected User getDisplayedUser() {
+               return user;
+       }
+
        protected void addPages() {
                try {
-                       
+
                        if (user.getType() == Role.GROUP)
                                addPage(new GroupMainPage(this, userAdmin));
                        else
                                addPage(new UserMainPage(this));
-                       
-                       
-                       
+
                } catch (Exception e) {
                        throw new ArgeoException("Cannot add pages", e);
                }
index 812cbe9ed89259c04aaf49dc01cdfe4aca8d47f6..745bbff53f7f52bd5eff77e6e8c4804a9cf6efb7 100644 (file)
@@ -21,7 +21,7 @@ import javax.jcr.RepositoryException;
 
 import org.argeo.ArgeoException;
 import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.ui.admin.UserAdminConstants;
+import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/ColumnDefinition.java
new file mode 100644 (file)
index 0000000..ad24c62
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+
+/** Centralize the colum definition for the various tables of the useradmin UI */
+public class ColumnDefinition {
+       private ColumnLabelProvider labelProvider;
+       private String label;
+       private int weight;
+       private int minWidth;
+
+       public ColumnDefinition(ColumnLabelProvider labelProvider, String label,
+                       int weight, int minimumWidth) {
+               this.labelProvider = labelProvider;
+               this.label = label;
+               this.weight = weight;
+               this.minWidth = minimumWidth;
+       }
+
+       public ColumnDefinition(ColumnLabelProvider labelProvider, String label,
+                       int weight) {
+               this.labelProvider = labelProvider;
+               this.label = label;
+               this.weight = weight;
+               this.minWidth = weight;
+       }
+
+       public ColumnLabelProvider getLabelProvider() {
+               return labelProvider;
+       }
+
+       public void setLabelProvider(ColumnLabelProvider labelProvider) {
+               this.labelProvider = labelProvider;
+       }
+
+       public String getLabel() {
+               return label;
+       }
+
+       public void setLabel(String label) {
+               this.label = label;
+       }
+
+       public int getWeight() {
+               return weight;
+       }
+
+       public void setWeight(int weight) {
+               this.weight = weight;
+       }
+
+       public int getMinWidth() {
+               return minWidth;
+       }
+
+       public void setMinWidth(int minWidth) {
+               this.minWidth = minWidth;
+       }
+}
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/CommonNameLP.java
new file mode 100644 (file)
index 0000000..7f99958
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.osgi.service.useradmin.User;
+
+/** Simply declare a label provider that returns the common name of a user */
+public class CommonNameLP extends UserAdminAbstractLP {
+       private static final long serialVersionUID = 5256703081044911941L;
+
+       @Override
+       public String getText(User user) {
+               Object obj = user.getProperties().get(KEY_CN);
+               if (obj != null)
+                       return (String) obj;
+               else
+                       return "";
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/MailLP.java
new file mode 100644 (file)
index 0000000..bf01c66
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.osgi.service.useradmin.User;
+
+/** Simply declare a label provider that returns the Primary Mail for a user */
+public class MailLP extends UserAdminAbstractLP {
+       private static final long serialVersionUID = 8329764452141982707L;
+
+       @Override
+       public String getText(User user) {
+               Object obj = user.getProperties().get(KEY_MAIL);
+               if (obj != null)
+                       return (String) obj;
+               else
+                       return "";
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/RoleIconLP.java
new file mode 100644 (file)
index 0000000..cce1916
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.argeo.security.ui.admin.SecurityAdminImages;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+
+public class RoleIconLP extends UserAdminAbstractLP {
+       private static final long serialVersionUID = 6550449442061090388L;
+
+       @Override
+       public String getText(User user) {
+               return "";
+       }
+
+       @Override
+       public Image getImage(Object element) {
+               User user = (User) element;
+               if (user.getType() == Role.GROUP)
+                       return SecurityAdminImages.ICON_GROUP;
+               else
+                       return SecurityAdminImages.ICON_USER;
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java
new file mode 100644 (file)
index 0000000..d159619
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.security.ui.admin.internal;
+
+import java.security.AccessController;
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+import javax.security.auth.x500.X500Principal;
+
+/** First effort to centralize back end methods used by the user admin UI */
+public class UiAdminUtils {
+       public final static String getUsername() {
+               Subject subject = Subject.getSubject(AccessController.getContext());
+               Principal principal = subject.getPrincipals(X500Principal.class)
+                               .iterator().next();
+               return principal.getName();
+
+       }
+
+       /*
+        * INTERNAL METHODS: Below methods are meant to stay here and are not part
+        * of a potential generic backend to manage the useradmin
+        */
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java
new file mode 100644 (file)
index 0000000..6c07b8c
--- /dev/null
@@ -0,0 +1,53 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.service.useradmin.User;
+
+/**
+ * Utility class that add font modifications to a column label provider
+ * depending on the given user properties
+ */
+public abstract class UserAdminAbstractLP extends ColumnLabelProvider implements
+               UserAdminConstants {
+       private static final long serialVersionUID = 137336765024922368L;
+
+       // private Font italic;
+       private Font bold;
+
+       @Override
+       public Font getFont(Object element) {
+
+               // Self as bold
+               String selfUserName = UiAdminUtils.getUsername();
+               String userName = ((User) element).getName();
+               if (userName.equals(selfUserName))
+                       return bold;
+
+               // Disabled as Italic
+               // Node userProfile = (Node) elem;
+               // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
+               // return italic;
+
+               return null;
+               // return super.getFont(element);
+       }
+
+       @Override
+       public String getText(Object element) {
+               User user = (User) element;
+               return getText(user);
+       }
+
+       public void setDisplay(Display display) {
+               // italic = JFaceResources.getFontRegistry().defaultFontDescriptor()
+               // .setStyle(SWT.ITALIC).createFont(display);
+               bold = JFaceResources.getFontRegistry().defaultFontDescriptor()
+                               .setStyle(SWT.BOLD).createFont(display);
+       }
+
+       public abstract String getText(User user);
+}
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminConstants.java
new file mode 100644 (file)
index 0000000..f5eae0f
--- /dev/null
@@ -0,0 +1,10 @@
+package org.argeo.security.ui.admin.internal;
+
+/** Temporary centralization of the user admin constants */
+public interface UserAdminConstants {
+
+       public final static String KEY_UID = "uid";
+       public final static String KEY_CN = "cn";
+       public final static String KEY_MAIL = "mail";
+       
+}
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserNameLP.java
new file mode 100644 (file)
index 0000000..083cc6a
--- /dev/null
@@ -0,0 +1,13 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.osgi.service.useradmin.User;
+
+/** Simply declare a label provider that returns the username of a user */
+public class UserNameLP extends UserAdminAbstractLP {
+       private static final long serialVersionUID = 6550449442061090388L;
+
+       @Override
+       public String getText(User user) {
+               return user.getName();
+       }
+}
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableDefaultDClickListener.java
new file mode 100644 (file)
index 0000000..fc4ebd8
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.security.ui.admin.internal;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.workbench.WorkbenchUiPlugin;
+import org.argeo.security.ui.admin.editors.UserEditor;
+import org.argeo.security.ui.admin.editors.UserEditorInput;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.osgi.service.useradmin.User;
+
+/**
+ * Default double click listener for the various user tables, will open the
+ * clicked item in the editor
+ */
+public class UserTableDefaultDClickListener implements IDoubleClickListener {
+       public void doubleClick(DoubleClickEvent evt) {
+               if (evt.getSelection().isEmpty())
+                       return;
+               Object obj = ((IStructuredSelection) evt.getSelection())
+                               .getFirstElement();
+               User user = (User) obj;
+               // IWorkbench iw =
+               IWorkbenchWindow iww = WorkbenchUiPlugin.getDefault().getWorkbench()
+                               .getActiveWorkbenchWindow();
+               IWorkbenchPage iwp = iww.getActivePage();
+               UserEditorInput uei = new UserEditorInput(user.getName());
+
+               try {
+                       // IEditorPart editor =
+                       iwp.openEditor(uei, UserEditor.ID);
+               } catch (PartInitException pie) {
+                       throw new ArgeoException("Unable to open UserEditor for " + user,
+                                       pie);
+               }
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserTableViewer.java
new file mode 100644 (file)
index 0000000..adaf81d
--- /dev/null
@@ -0,0 +1,323 @@
+package org.argeo.security.ui.admin.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.utils.ViewerUtils;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+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.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
+
+/**
+ * Generic composite that display a filter and a table viewer to display users
+ * (can also be groups)
+ * 
+ * Warning: this class does not extends <code>TableViewer</code>. Use the
+ * getTableViewer to acces it.
+ * 
+ */
+public class UserTableViewer extends Composite {
+       private static final long serialVersionUID = -7385959046279360420L;
+
+       // Context
+       private UserAdmin userAdmin;
+
+       // Configuration
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+       private boolean hasFilter;
+       private boolean preventTableLayout = false;
+       private boolean hasSelectionColumn;
+       private int tableStyle;
+
+       // Local UI Objects
+       private TableViewer usersViewer;
+       private Text filterTxt;
+
+       /* EXPOSED METHODS */
+
+       /**
+        * @param parent
+        * @param style
+        * @param userAdmin
+        */
+       public UserTableViewer(Composite parent, int style, UserAdmin userAdmin) {
+               super(parent, SWT.NO_FOCUS);
+               this.tableStyle = style;
+               this.userAdmin = userAdmin;
+       }
+
+       // TODO workaround the bug of the table layout in the Form
+       public UserTableViewer(Composite parent, int style, UserAdmin userAdmin,
+                       boolean preventTableLayout) {
+               super(parent, SWT.NO_FOCUS);
+               this.tableStyle = style;
+               this.userAdmin = userAdmin;
+               this.preventTableLayout = preventTableLayout;
+       }
+
+       /** This must be called before the call to populate method */
+       public void setColumnDefinitions(List<ColumnDefinition> columnDefinitions) {
+               this.columnDefs = columnDefinitions;
+       }
+
+       /**
+        * 
+        * @param addFilter
+        *            choose to add a field to filter results or not
+        * @param addSelection
+        *            choose to add a column to select some of the displayed results
+        *            or not
+        */
+       public void populate(boolean addFilter, boolean addSelection) {
+               // initialization
+               Composite parent = this;
+               hasFilter = addFilter;
+               hasSelectionColumn = addSelection;
+
+               // Main Layout
+               GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
+               layout.verticalSpacing = 5;
+               this.setLayout(layout);
+               if (hasFilter)
+                       createFilterPart(parent);
+
+               Composite tableComp = new Composite(parent, SWT.NO_FOCUS);
+               tableComp.setLayoutData(EclipseUiUtils.fillAll());
+               usersViewer = createTableViewer(tableComp);
+
+               usersViewer.setContentProvider(new UsersContentProvider());
+       }
+
+       /** Enable access to the selected users or groups */
+       public List<User> getSelectedUsers() {
+               if (hasSelectionColumn) {
+                       Object[] elements = ((CheckboxTableViewer) usersViewer)
+                                       .getCheckedElements();
+
+                       List<User> result = new ArrayList<User>();
+                       for (Object obj : elements) {
+                               result.add((User) obj);
+                       }
+                       return result;
+               } else
+                       throw new ArgeoException("Unvalid request: no selection column "
+                                       + "has been created for the current table");
+       }
+
+       /** Returns the User table viewer, typically to add doubleclick listener */
+       public TableViewer getTableViewer() {
+               return usersViewer;
+       }
+
+       /**
+        * Force the refresh of the underlying table using the current filter string
+        * if relevant
+        */
+       public void refresh() {
+               String filter = hasFilter ? filterTxt.getText() : null;
+               if ("".equals(filter.trim()))
+                       filter = null;
+               refreshFilteredList(filter);
+       }
+
+       // /** Returns filter String or null if no filter Text widget */
+       // private String getFilterString() {
+       // return hasFilter ? filterTxt.getText() : null;
+       // }
+
+       /**
+        * Build repository request : caller might overwrite in order to display a
+        * subset of all users
+        */
+       protected List<User> listFilteredElements(String filter) {
+               List<User> users = new ArrayList<User>();
+               try {
+                       Role[] roles = userAdmin.getRoles(filter);
+                       // Display all users and groups
+                       for (Role role : roles)
+                               // if (role.getType() == Role.USER && role.getType() !=
+                               // Role.GROUP)
+                               users.add((User) role);
+               } catch (InvalidSyntaxException e) {
+                       throw new ArgeoException("Unable to get roles with filter: "
+                                       + filter, e);
+               }
+               return users;
+       }
+
+       /* GENERIC COMPOSITE METHODS */
+       @Override
+       public boolean setFocus() {
+               if (hasFilter)
+                       return filterTxt.setFocus();
+               else
+                       return usersViewer.getTable().setFocus();
+       }
+
+       @Override
+       public void dispose() {
+               super.dispose();
+       }
+
+       /* LOCAL CLASSES AND METHODS */
+       // Will be usefull to rather use a virtual table viewer
+       private void refreshFilteredList(String filter) {
+               List<User> users = listFilteredElements(filter);
+               usersViewer.setInput(users.toArray());
+       }
+
+       private class UsersContentProvider implements IStructuredContentProvider {
+               private static final long serialVersionUID = 1L;
+
+               public Object[] getElements(Object inputElement) {
+                       return (Object[]) inputElement;
+               }
+
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+       }
+
+       /* MANAGE FILTER */
+       private void createFilterPart(Composite parent) {
+               // Text Area for the filter
+               filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
+                               | SWT.ICON_CANCEL);
+               filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+                               | GridData.HORIZONTAL_ALIGN_FILL));
+               filterTxt.addModifyListener(new ModifyListener() {
+                       private static final long serialVersionUID = 1L;
+
+                       public void modifyText(ModifyEvent event) {
+                               refreshFilteredList(filterTxt.getText());
+                       }
+               });
+       }
+
+       private TableViewer createTableViewer(final Composite parent) {
+
+               int style = tableStyle | SWT.H_SCROLL | SWT.V_SCROLL;
+               if (hasSelectionColumn)
+                       style = style | SWT.CHECK;
+               Table table = new Table(parent, style);
+               TableColumnLayout layout = new TableColumnLayout();
+
+               // TODO the table layout does not works with the scrolled form
+
+               if (preventTableLayout) {
+                       parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+                       table.setLayoutData(EclipseUiUtils.fillAll());
+               } else
+                       parent.setLayout(layout);
+
+               TableViewer viewer;
+               if (hasSelectionColumn)
+                       viewer = new CheckboxTableViewer(table);
+               else
+                       viewer = new TableViewer(table);
+               table.setLinesVisible(true);
+               table.setHeaderVisible(true);
+
+               TableViewerColumn column;
+               int offset = 0;
+               if (hasSelectionColumn) {
+                       offset = 1;
+                       column = ViewerUtils.createTableViewerColumn(viewer, "", SWT.NONE,
+                                       25);
+                       column.setLabelProvider(new ColumnLabelProvider() {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               public String getText(Object element) {
+                                       return null;
+                               }
+                       });
+                       SelectionAdapter selectionAdapter = new SelectionAdapter() {
+                               private static final long serialVersionUID = 1L;
+
+                               boolean allSelected = false;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       allSelected = !allSelected;
+                                       ((CheckboxTableViewer) usersViewer)
+                                                       .setAllChecked(allSelected);
+                               }
+                       };
+                       column.getColumn().addSelectionListener(selectionAdapter);
+               }
+
+               // NodeViewerComparator comparator = new NodeViewerComparator();
+               // TODO enable the sort by click on the header
+               int i = offset;
+               for (ColumnDefinition colDef : columnDefs)
+                       createTableColumn(viewer, layout, colDef);
+
+               // column = ViewerUtils.createTableViewerColumn(viewer,
+               // colDef.getHeaderLabel(), SWT.NONE, colDef.getColumnSize());
+               // column.setLabelProvider(new CLProvider(colDef.getPropertyName()));
+               // column.getColumn().addSelectionListener(
+               // JcrUiUtils.getNodeSelectionAdapter(i,
+               // colDef.getPropertyType(), colDef.getPropertyName(),
+               // comparator, viewer));
+               // i++;
+               // }
+
+               // IMPORTANT: initialize comparator before setting it
+               // ColumnDefinition firstCol = colDefs.get(0);
+               // comparator.setColumn(firstCol.getPropertyType(),
+               // firstCol.getPropertyName());
+               // viewer.setComparator(comparator);
+
+               return viewer;
+       }
+
+       /** Default creation of a column for a user table */
+       private TableViewerColumn createTableColumn(TableViewer tableViewer,
+                       TableColumnLayout layout, ColumnDefinition columnDef) {
+
+               boolean resizable = true;
+               TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE);
+               TableColumn column = tvc.getColumn();
+
+               column.setText(columnDef.getLabel());
+               column.setWidth(columnDef.getMinWidth());
+               column.setResizable(resizable);
+
+               ColumnLabelProvider lp = columnDef.getLabelProvider();
+               // add a reference to the display to enable font management
+               if (lp instanceof UserAdminAbstractLP)
+                       ((UserAdminAbstractLP) lp).setDisplay(tableViewer.getTable()
+                                       .getDisplay());
+               tvc.setLabelProvider(lp);
+
+               layout.setColumnData(column, new ColumnWeightData(
+                               columnDef.getWeight(), columnDef.getMinWidth(), resizable));
+
+               return tvc;
+       }
+}
\ No newline at end of file
index 34bda0e6993d17fee97eae92dcf92865410ba90e..bb64a3d4b26518ef0dc9d9ca391fa589651ce19f 100644 (file)
@@ -19,82 +19,99 @@ 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.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.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
+       /* DEPENDENCY INJECTION */
+       private UserAdmin userAdmin;
+
+       // UI Objects
+       private UserTableViewer userTableViewerCmp;
+       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 UserNameLP(),
                                "Distinguished Name", 200));
-               // Displayed name
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
-               return columnDefs;
-       }
 
-       /**
-        * 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
+               userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
 
-       private abstract class GroupAdminAbstractLP extends ColumnLabelProvider {
-               private static final long serialVersionUID = 137336765024922368L;
+               userTableViewerCmp.setColumnDefinitions(columnDefs);
+               userTableViewerCmp.populate(true, false);
+               userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
 
-               @Override
-               public String getText(Object element) {
-                       User user = (User) element;
-                       return getText(user);
-               }
+               // Links
+               userViewer = userTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
+               getViewSite().setSelectionProvider(userViewer);
 
-               public abstract String getText(User user);
+               // Really?
+               userTableViewerCmp.refresh();
        }
 
-       private class UserNameLP extends GroupAdminAbstractLP {
-               private static final long serialVersionUID = 6550449442061090388L;
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
+
+               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 {
+                               roles = userAdmin.getRoles(filter);
+                       } 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;
+       // Override generic view methods
+       @Override
+       public void dispose() {
+               super.dispose();
+       }
 
-               @Override
-               public String getText(User user) {
-                       Object obj = user.getProperties().get(UserAdminConstants.KEY_CN);
-                       if (obj != null)
-                               return (String) obj;
-                       else
-                               return "";
-               }
+       @Override
+       public void setFocus() {
+               userTableViewerCmp.setFocus();
        }
 
+       /* DEPENDENCY INJECTION */
+       public void setUserAdmin(UserAdmin userAdmin) {
+               this.userAdmin = userAdmin;
+       }
 }
\ No newline at end of file
index 73f6a19d6f1417315ef98da5fbc1105e4ae5fd9f..31586085bddbd62969e627d2b6c39f11e52055f2 100644 (file)
@@ -20,30 +20,17 @@ import java.util.List;
 
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.eclipse.ui.utils.ViewerUtils;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.editors.UserEditor;
-import org.argeo.security.ui.admin.editors.UserEditorInput;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
+import org.argeo.security.ui.admin.internal.ColumnDefinition;
+import org.argeo.security.ui.admin.internal.CommonNameLP;
+import org.argeo.security.ui.admin.internal.MailLP;
+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.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.ViewPart;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
@@ -59,267 +46,71 @@ public class UsersView extends ViewPart implements ArgeoNames {
        private UserAdmin userAdmin;
 
        // UI Objects
-       private TableViewer usersViewer;
-       private Text filterTxt;
-       private Font italic;
-       private Font bold;
+       private UserTableViewer userTableViewerCmp;
+       private TableViewer userViewer;
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
 
-       // The displayed columns
-       /** Overwrite to display other columns */
-       public List<ColumnDefinition> getColumnsDef() {
-               List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-
-               // User ID
+       @Override
+       public void createPartControl(Composite parent) {
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // Define the displayed columns
                columnDefs.add(new ColumnDefinition(new UserNameLP(),
                                "Distinguished Name", 200));
-               // Displayed name
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
-               // E-mail
                columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
-               return columnDefs;
-       }
 
-       @Override
-       public void setFocus() {
-               // TODO Auto-generated method stub
-       }
+               // Create and configure the table
+               userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
+               userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
 
-       protected Viewer getViewer() {
-               return usersViewer;
-       }
+               userTableViewerCmp.setColumnDefinitions(columnDefs);
+               userTableViewerCmp.populate(true, false);
 
-       @Override
-       public void createPartControl(Composite parent) {
-               // cache UI Objects
-               italic = EclipseUiUtils.getItalicFont(parent);
-               bold = EclipseUiUtils.getBoldFont(parent);
-
-               // Main Layout
-               GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
-               layout.verticalSpacing = 5;
-               parent.setLayout(layout);
-
-               usersViewer = createTableViewer(parent);
-               usersViewer.setContentProvider(new UsersContentProvider());
+               // Links
+               userViewer = userTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
+               getViewSite().setSelectionProvider(userViewer);
 
                // Really?
-               refreshFilteredList(null);
-
-               // Configure
-               usersViewer.addDoubleClickListener(new ViewDoubleClickListener());
-               getViewSite().setSelectionProvider(usersViewer);
+               userTableViewerCmp.refresh();
        }
 
-       public void refresh() {
-               this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
-                       @Override
-                       public void run() {
-                               refreshFilteredList(null);
-                       }
-               });
-       }
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
 
-       class ViewDoubleClickListener implements IDoubleClickListener {
-               public void doubleClick(DoubleClickEvent evt) {
-                       if (evt.getSelection().isEmpty())
-                               return;
-                       Object obj = ((IStructuredSelection) evt.getSelection())
-                                       .getFirstElement();
-                       User user = (User) obj;
-                       IWorkbenchWindow iww = UsersView.this.getSite()
-                                       .getWorkbenchWindow();
-                       IWorkbenchPage iwp = iww.getActivePage();
-                       UserEditorInput uei = new UserEditorInput(user.getName());
+               public MyUserTableViewer(Composite parent, int style,
+                               UserAdmin userAdmin) {
+                       super(parent, style, userAdmin);
+               }
 
+               @Override
+               protected List<User> listFilteredElements(String filter) {
+                       Role[] roles;
                        try {
-                               // IEditorPart editor =
-                               iwp.openEditor(uei, UserEditor.ID);
-                       } catch (PartInitException pie) {
-                               throw new ArgeoException("Unable to open UserEditor for "
-                                               + user, pie);
+                               roles = userAdmin.getRoles(filter);
+                       } catch (InvalidSyntaxException e) {
+                               throw new ArgeoException("Unable to get roles with filter: "
+                                               + filter, e);
                        }
-               }
-       }
-
-       private TableViewer createTableViewer(final Composite parent) {
-               int style = SWT.H_SCROLL | SWT.V_SCROLL;
-
-               Composite tableCmp = new Composite(parent, SWT.NO_FOCUS);
-               tableCmp.setLayoutData(EclipseUiUtils.fillAll());
-
-               Table table = new Table(tableCmp, style);
-               TableViewer viewer = new TableViewer(table);
-               table.setLinesVisible(true);
-               table.setHeaderVisible(true);
-
-               TableColumnLayout tableColumnLayout = new TableColumnLayout();
-               TableViewerColumn column;
-
-               // Create other columns
-               List<ColumnDefinition> colDefs = getColumnsDef();
-               for (ColumnDefinition colDef : colDefs) {
-                       column = ViewerUtils.createTableViewerColumn(viewer, colDef.label,
-                                       SWT.NONE, colDef.weight);
-                       column.setLabelProvider(colDef.provider);
-                       tableColumnLayout.setColumnData(column.getColumn(),
-                                       new ColumnWeightData(colDef.weight, colDef.minWidth, true));
-               }
-
-               tableCmp.setLayout(tableColumnLayout);
-               return viewer;
-       }
-
-       @Override
-       public void dispose() {
-               super.dispose();
-       }
-
-       private class UsersContentProvider implements IStructuredContentProvider {
-               private static final long serialVersionUID = 1L;
-
-               public Object[] getElements(Object inputElement) {
-                       return (Object[]) inputElement;
-               }
-
-               public void dispose() {
-               }
-
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-       }
-
-       // /* MANAGE FILTER */
-       // private void createFilterPart(Composite parent) {
-       // // Text Area for the filter
-       // filterTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH
-       // | SWT.ICON_CANCEL);
-       // filterTxt.setMessage(filterHelpMsg);
-       // filterTxt.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-       // | GridData.HORIZONTAL_ALIGN_FILL));
-       // filterTxt.addModifyListener(new ModifyListener() {
-       // private static final long serialVersionUID = 1L;
-       //
-       // public void modifyText(ModifyEvent event) {
-       // refreshFilteredList();
-       // }
-       // });
-       // }
-
-       /**
-        * 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.USER && role.getType() != Role.GROUP)
                                        users.add((User) role);
-                       usersViewer.setInput(users.toArray());
-               } catch (InvalidSyntaxException e) {
-                       throw new ArgeoException("Unable to get roles with filter: "
-                                       + filter, e);
-               }
-       }
-
-       // Local helpers
-
-       private abstract class UseradminAbstractLP extends ColumnLabelProvider {
-               private static final long serialVersionUID = 137336765024922368L;
-
-               @Override
-               public Font getFont(Object element) {
-                       // TODO manage fonts
-                       // // self
-                       // String username = getProperty(elem, ARGEO_USER_ID);
-                       // if (username.equals(session.getUserID()))
-                       // return bold;
-                       // // disabled
-                       // try {
-                       // Node userProfile = (Node) elem;
-                       // if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
-                       // return italic;
-                       // else
-                       // return null;
-                       // } catch (RepositoryException e) {
-                       // throw new ArgeoException("Cannot get font for " + username, e);
-                       // }
-                       // }
-
-                       return super.getFont(element);
-               }
-
-               @Override
-               public String getText(Object element) {
-                       User user = (User) element;
-                       return getText(user);
-               }
-
-               public abstract String getText(User user);
-       }
-
-       private class UserNameLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 6550449442061090388L;
-
-               @Override
-               public String getText(User user) {
-                       return user.getName();
-               }
-       }
-
-       private class CommonNameLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 5256703081044911941L;
-
-               @Override
-               public String getText(User user) {
-                       Object obj = user.getProperties().get("cn");
-                       if (obj != null)
-                               return (String) obj;
-                       else
-                               return "";
+                       return users;
                }
        }
 
-       private class MailLP extends UseradminAbstractLP {
-               private static final long serialVersionUID = 8329764452141982707L;
-
-               @Override
-               public String getText(User user) {
-                       Object obj = user.getProperties().get("mail");
-                       if (obj != null)
-                               return (String) obj;
-                       else
-                               return "";
-               }
-       }
-
-       protected class ColumnDefinition {
-               protected ColumnLabelProvider provider;
-               protected String label;
-               protected int weight;
-               protected int minWidth;
-
-               // public ColumnDefinition(ColumnLabelProvider provider, String label,
-               // int weight, int minimumWidth) {
-               // this.provider = provider;
-               // this.label = label;
-               // this.weight = weight;
-               // this.minWidth = minimumWidth;
-               // }
-
-               public ColumnDefinition(ColumnLabelProvider provider, String label,
-                               int weight) {
-                       this.provider = provider;
-                       this.label = label;
-                       this.weight = weight;
-                       this.minWidth = weight;
-               }
+       // Override generic view methods
+       @Override
+       public void dispose() {
+               super.dispose();
        }
 
-       protected UserAdmin userAdmin() {
-               return userAdmin;
+       @Override
+       public void setFocus() {
+               userTableViewerCmp.setFocus();
        }
 
        /* DEPENDENCY INJECTION */