]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java
Update license headers
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.admin / src / main / java / org / argeo / security / ui / admin / views / UsersView.java
index 8ddba7683ab8be9ebb869c5f200d14fe84f7f3c3..254149b095f4c279476d395b391224c46e8aa028 100644 (file)
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.security.ui.admin.views;
 
 import java.util.ArrayList;
@@ -5,86 +20,240 @@ 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.dialogs.Error;
+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.security.ArgeoUser;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.commands.OpenArgeoUserEditor;
-import org.argeo.security.ui.admin.editors.ArgeoUserEditor;
-import org.argeo.security.ui.admin.editors.ArgeoUserEditorInput;
 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.PartInitException;
 import org.eclipse.ui.commands.ICommandService;
 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;
        }
@@ -93,9 +262,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 {
@@ -128,64 +317,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;
-                               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 userHome.getNode(ARGEO_PROFILE)
-                                                       .getProperty(ARGEO_FIRST_NAME).getString();
-                               case 2:
-                                       return userHome.getNode(ARGEO_PROFILE)
-                                                       .getProperty(ARGEO_LAST_NAME).getString();
-                               case 3:
-                                       return userHome.getNode(ARGEO_PROFILE)
-                                                       .getProperty(ARGEO_PRIMARY_EMAIL).getString();
-                               default:
-                                       throw new ArgeoException("Unmanaged column " + columnIndex);
-                               }
-                       } catch (RepositoryException e) {
-                               throw new ArgeoException("Cannot get text", e);
-                       }
-
-                       // String currentUsername = CurrentUser.getUsername();
-                       // String currentUsername = "";
-                       // ArgeoUser user = (ArgeoUser) element;
-                       // SimpleUserNature simpleNature = SimpleUserNature
-                       // .findSimpleUserNature(user, simpleNatureType);
-                       // switch (columnIndex) {
-                       // case 0:
-                       // String userName = user.getUsername();
-                       // if (userName.equals(currentUsername))
-                       // userName = userName + "*";
-                       // return userName;
-                       // case 1:
-                       // return simpleNature.getFirstName();
-                       // case 2:
-                       // return simpleNature.getLastName();
-                       // case 3:
-                       // return simpleNature.getEmail();
-                       // default:
-                       // throw new ArgeoException("Unmanaged column " + columnIndex);
-                       // }
-               }
-
-               public Image getColumnImage(Object element, int columnIndex) {
-                       // TODO Auto-generated method stub
-                       return null;
-               }
-
-       }
-
        class ViewDoubleClickListener implements IDoubleClickListener {
                public void doubleClick(DoubleClickEvent evt) {
                        if (evt.getSelection().isEmpty())
@@ -194,23 +325,12 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
                        Object obj = ((IStructuredSelection) evt.getSelection())
                                        .getFirstElement();
                        if (obj instanceof Node) {
-                               try {
-                                       IWorkbench iw = SecurityAdminPlugin.getDefault()
-                                                       .getWorkbench();
-                                       iw.getActiveWorkbenchWindow()
-                                                       .getActivePage()
-                                                       .openEditor(new ArgeoUserEditorInput((Node) obj),
-                                                                       ArgeoUserEditor.ID);
-                               } catch (PartInitException e) {
-                                       Error.show("Cannot open user editor for " + obj, e);
-                               }
-                       } else if (obj instanceof ArgeoUser) {
-                               ArgeoUser argeoUser = (ArgeoUser) obj;
-
                                IWorkbench iw = SecurityAdminPlugin.getDefault().getWorkbench();
                                IHandlerService handlerService = (IHandlerService) iw
                                                .getService(IHandlerService.class);
                                try {
+                                       String username = ((Node) obj).getProperty(ARGEO_USER_ID)
+                                                       .getString();
                                        String commandId = OpenArgeoUserEditor.COMMAND_ID;
                                        String paramName = OpenArgeoUserEditor.PARAM_USERNAME;
 
@@ -223,7 +343,7 @@ public class UsersView extends ViewPart implements ArgeoNames, ArgeoTypes,
                                        ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
                                        IParameter iparam = cmd.getParameter(paramName);
                                        Parameterization param = new Parameterization(iparam,
-                                                       argeoUser.getUsername());
+                                                       username);
                                        parameters.add(param);
                                        ParameterizedCommand pc = new ParameterizedCommand(cmd,
                                                        parameters.toArray(new Parameterization[parameters