X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=security%2Fplugins%2Forg.argeo.security.ui.admin%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Fviews%2FUsersView.java;h=254149b095f4c279476d395b391224c46e8aa028;hb=1d5afdce3e91054f07ddd3c98309c363b4cf1d46;hp=77b718e1262648d25b5c69844780c44411a7e28b;hpb=fb4f7c451ea7d9025f7cf7fe032020f229df794a;p=lgpl%2Fargeo-commons.git diff --git a/security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java b/security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java index 77b718e12..254149b09 100644 --- a/security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java +++ b/security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/views/UsersView.java @@ -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,34 +20,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,46 +60,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; } @@ -88,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 { @@ -123,42 +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); - } - } - - public Image getColumnImage(Object element, int columnIndex) { - return null; - } - - } - class ViewDoubleClickListener implements IDoubleClickListener { public void doubleClick(DoubleClickEvent evt) { if (evt.getSelection().isEmpty())