Improve user admin
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / views / UsersView.java
index a41f20af5560daada24541d3a9f9a860f2445a2d..523b958ef82d02bc283e941b5698f7a7be5bf013 100644 (file)
@@ -5,34 +5,39 @@ import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
 import javax.jcr.query.Query;
 
 import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.ArgeoTypes;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor;
 import org.eclipse.core.commands.Command;
 import org.eclipse.core.commands.IParameter;
 import org.eclipse.core.commands.Parameterization;
 import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
 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.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
 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.Image;
+import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.commands.ICommandService;
@@ -40,47 +45,200 @@ import org.eclipse.ui.handlers.IHandlerService;
 import org.eclipse.ui.part.ViewPart;
 
 /** List all users. */
-public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
-               EventListener {
+public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes {
        public final static String ID = "org.argeo.security.ui.admin.adminUsersView";
 
        private TableViewer viewer;
        private Session session;
 
+       private UserStructureListener userStructureListener;
+
+       private Font italic;
+       private Font bold;
+
        @Override
        public void createPartControl(Composite parent) {
-               viewer = new TableViewer(createTable(parent));
+               italic = EclipseUiUtils.getItalicFont(parent);
+               bold = EclipseUiUtils.getBoldFont(parent);
+
+               // viewer = new TableViewer(createTable(parent));
+               viewer = createTableViewer(parent);
+               EclipseUiSpecificUtils.enableToolTipSupport(viewer);
                viewer.setContentProvider(new UsersContentProvider());
-               viewer.setLabelProvider(new UsersLabelProvider());
+               // viewer.setLabelProvider(new UsersLabelProvider());
                viewer.addDoubleClickListener(new ViewDoubleClickListener());
                getViewSite().setSelectionProvider(viewer);
                viewer.setInput(getViewSite());
+
+               userStructureListener = new UserStructureListener();
+               JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
+                               | Event.NODE_REMOVED, JcrUtils.DEFAULT_HOME_BASE_PATH,
+                               ArgeoTypes.ARGEO_USER_HOME);
        }
 
-       protected Table createTable(Composite parent) {
+       protected TableViewer createTableViewer(final Composite parent) {
+
                Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+               TableViewer viewer = new TableViewer(table);
                table.setLinesVisible(true);
                table.setHeaderVisible(true);
-               TableColumn column = new TableColumn(table, SWT.LEFT, 0);
-               column.setText("User");
-               column.setWidth(50);
-               column = new TableColumn(table, SWT.LEFT, 1);
-               column.setText("First Name");
-               column.setWidth(100);
-               column = new TableColumn(table, SWT.LEFT, 2);
-               column.setText("Last Name");
-               column.setWidth(100);
-               column = new TableColumn(table, SWT.LEFT, 3);
-               column.setText("E-mail");
-               column.setWidth(100);
-               return table;
+
+               // User ID
+               TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+               column.getColumn().setText("User ID");
+               column.getColumn().setWidth(100);
+               column.setLabelProvider(new CLProvider() {
+                       public String getText(Object elem) {
+                               return getProperty(elem, ARGEO_USER_ID);
+                               // if (username.equals(session.getUserID()))
+                               // return "[" + username + "]";
+                               // else
+                               // return username;
+                       }
+               });
+
+               // Displayed name
+               column = new TableViewerColumn(viewer, SWT.NONE);
+               column.getColumn().setText("Name");
+               column.getColumn().setWidth(150);
+               column.setLabelProvider(new CLProvider() {
+                       public String getText(Object elem) {
+                               return getProperty(elem, Property.JCR_TITLE);
+                       }
+               });
+
+               // E-mail
+               column = new TableViewerColumn(viewer, SWT.NONE);
+               column.getColumn().setText("E-mail");
+               column.getColumn().setWidth(150);
+               column.setLabelProvider(new CLProvider() {
+                       public String getText(Object elem) {
+                               return getProperty(elem, ARGEO_PRIMARY_EMAIL);
+                       }
+               });
+
+               // E-mail
+               column = new TableViewerColumn(viewer, SWT.NONE);
+               column.getColumn().setText("Description");
+               column.getColumn().setWidth(200);
+               column.setLabelProvider(new CLProvider() {
+                       public String getText(Object elem) {
+                               return getProperty(elem, Property.JCR_DESCRIPTION);
+                       }
+               });
+
+               return viewer;
+       }
+
+       private class CLProvider extends ColumnLabelProvider {
+
+               public String getToolTipText(Object element) {
+                       return getText(element);
+               }
+
+               @Override
+               public Font getFont(Object elem) {
+                       // self
+                       String username = getProperty(elem, ARGEO_USER_ID);
+                       if (username.equals(session.getUserID()))
+                               return bold;
+
+                       // disabled
+                       try {
+                               Node userHome = (Node) elem;
+                               Node userProfile = userHome.getNode(ARGEO_PROFILE);
+                               if (!userProfile.getProperty(ARGEO_ENABLED).getBoolean())
+                                       return italic;
+                               else
+                                       return null;
+                       } catch (RepositoryException e) {
+                               throw new ArgeoException("Cannot get font for " + username, e);
+                       }
+               }
+
        }
 
+       // protected Table createTable(Composite parent) {
+       // // TODO use a more flexible API
+       // Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+       // table.setLinesVisible(true);
+       // table.setHeaderVisible(true);
+       // TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+       // column.setText("Username");
+       // column.setWidth(100);
+       // column = new TableColumn(table, SWT.LEFT, 1);
+       // column.setText("Displayed name");
+       // column.setWidth(150);
+       // column = new TableColumn(table, SWT.LEFT, 2);
+       // column.setText("E-mail");
+       // column.setWidth(100);
+       // column = new TableColumn(table, SWT.LEFT, 3);
+       // column.setText("First Name");
+       // column.setWidth(100);
+       // column = new TableColumn(table, SWT.LEFT, 4);
+       // column.setText("Last Name");
+       // column.setWidth(100);
+       // column = new TableColumn(table, SWT.LEFT, 5);
+       // column.setText("Status");
+       // column.setWidth(50);
+       // column = new TableColumn(table, SWT.LEFT, 6);
+       // column.setText("Description");
+       // column.setWidth(200);
+       // return table;
+       // }
+
+       // private class UsersLabelProvider extends LabelProvider implements
+       // ITableLabelProvider {
+       // public String getColumnText(Object element, int columnIndex) {
+       // try {
+       // Node userHome = (Node) element;
+       // Node userProfile = userHome.getNode(ARGEO_PROFILE);
+       // switch (columnIndex) {
+       // case 0:
+       // String username = userHome.getProperty(ARGEO_USER_ID)
+       // .getString();
+       // if (username.equals(session.getUserID()))
+       // return "[" + username + "]";
+       // else
+       // return username;
+       // case 1:
+       // return getProperty(userProfile, Property.JCR_TITLE);
+       // case 2:
+       // return getProperty(userProfile, ARGEO_PRIMARY_EMAIL);
+       // case 3:
+       // return getProperty(userProfile, ARGEO_FIRST_NAME);
+       // case 4:
+       // return getProperty(userProfile, ARGEO_LAST_NAME);
+       // case 5:
+       // return userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? ""
+       // : "disabled";
+       // case 6:
+       // return getProperty(userProfile, Property.JCR_DESCRIPTION);
+       // default:
+       // throw new ArgeoException("Unmanaged column " + columnIndex);
+       // }
+       // } catch (RepositoryException e) {
+       // throw new ArgeoException("Cannot get text", e);
+       // }
+       // }
+       //
+       // public Image getColumnImage(Object element, int columnIndex) {
+       // return null;
+       // }
+       //
+       // }
+
        @Override
        public void setFocus() {
                viewer.getTable().setFocus();
        }
 
+       @Override
+       public void dispose() {
+               JcrUtils.removeListenerQuietly(session, userStructureListener);
+               super.dispose();
+       }
+
        public void setSession(Session session) {
                this.session = session;
        }
@@ -89,9 +247,29 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
                viewer.refresh();
        }
 
-       @Override
-       public void onEvent(EventIterator events) {
-               viewer.refresh();
+       protected String getProperty(Node userProfile, String name)
+                       throws RepositoryException {
+               return userProfile.hasProperty(name) ? userProfile.getProperty(name)
+                               .getString() : "";
+       }
+
+       protected String getProperty(Object element, String name) {
+               try {
+                       Node userHome = (Node) element;
+                       Node userProfile = userHome.getNode(ARGEO_PROFILE);
+                       return userProfile.hasProperty(name) ? userProfile
+                                       .getProperty(name).getString() : "";
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot get property " + name, e);
+               }
+       }
+
+       private class UserStructureListener implements EventListener {
+
+               @Override
+               public void onEvent(EventIterator events) {
+                       viewer.refresh();
+               }
        }
 
        private class UsersContentProvider implements IStructuredContentProvider {
@@ -124,43 +302,6 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
 
        }
 
-       private class UsersLabelProvider extends LabelProvider implements
-                       ITableLabelProvider {
-               public String getColumnText(Object element, int columnIndex) {
-                       try {
-                               Node userHome = (Node) element;
-                               Node userProfile = userHome.getNode(ARGEO_PROFILE);
-                               switch (columnIndex) {
-                               case 0:
-                                       String userName = userHome.getProperty(ARGEO_USER_ID)
-                                                       .getString();
-                                       if (userName.equals(session.getUserID()))
-                                               return "[" + userName + "]";
-                                       else
-                                               return userName;
-                               case 1:
-                                       return userProfile.hasProperty(ARGEO_FIRST_NAME) ? userProfile
-                                                       .getProperty(ARGEO_FIRST_NAME).getString() : "";
-                               case 2:
-                                       return userProfile.hasProperty(ARGEO_LAST_NAME) ? userProfile
-                                                       .getProperty(ARGEO_LAST_NAME).getString() : "";
-                               case 3:
-                                       return userProfile.hasProperty(ARGEO_PRIMARY_EMAIL) ? userProfile
-                                                       .getProperty(ARGEO_PRIMARY_EMAIL).getString() : "";
-                               default:
-                                       throw new ArgeoException("Unmanaged column " + columnIndex);
-                               }
-                       } catch (RepositoryException e) {
-                               throw new ArgeoException("Cannot get text", e);
-                       }
-               }
-
-               public Image getColumnImage(Object element, int columnIndex) {
-                       return null;
-               }
-
-       }
-
        class ViewDoubleClickListener implements IDoubleClickListener {
                public void doubleClick(DoubleClickEvent evt) {
                        if (evt.getSelection().isEmpty())