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;
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;
}
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 {
}
- 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())