+
+ // pass a mapping between col index and property name to the comparator.
+ List<String> propertiesList = new ArrayList<String>();
+
+ // User ID
+ TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("User ID");
+ column.getColumn().setWidth(100);
+ column.getColumn().addSelectionListener(getSelectionAdapter(0));
+ propertiesList.add(ARGEO_USER_ID);
+ 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.getColumn().addSelectionListener(getSelectionAdapter(1));
+ propertiesList.add(Property.JCR_TITLE);
+ 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.getColumn().addSelectionListener(getSelectionAdapter(2));
+ propertiesList.add(ARGEO_PRIMARY_EMAIL);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, ARGEO_PRIMARY_EMAIL);
+ }
+ });
+
+ // Description
+ column = new TableViewerColumn(viewer, SWT.NONE);
+ column.getColumn().setText("Description");
+ column.getColumn().setWidth(200);
+ column.getColumn().addSelectionListener(getSelectionAdapter(3));
+ propertiesList.add(Property.JCR_DESCRIPTION);
+ column.setLabelProvider(new CLProvider() {
+ public String getText(Object elem) {
+ return getProperty(elem, Property.JCR_DESCRIPTION);
+ }
+ });
+
+ viewer.setComparator(new UsersViewerComparator(propertiesList));
+
+ 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 userProfile = (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);
+ }
+ }
+
+ }
+
+ private SelectionAdapter getSelectionAdapter(final int index) {
+ SelectionAdapter selectionAdapter = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ UsersViewerComparator comparator = (UsersViewerComparator) viewer
+ .getComparator();
+
+ if (index == comparator.getSortColumn()) {
+ comparator.setAscending(!comparator.isAscending());
+ }
+ comparator.setSortColumn(index);
+ viewer.getTable().setSortColumn(
+ viewer.getTable().getColumn(index));
+ viewer.getTable().setSortDirection(
+ comparator.isAscending() ? SWT.UP : SWT.DOWN);
+ viewer.refresh(false);
+ }
+ };
+ return selectionAdapter;
+ }
+
+ private class UsersViewerComparator extends ViewerComparator {
+
+ private List<String> propertyList;
+ private int sortColumn = 0;
+ private boolean ascending = true;
+ // use this to enable two levels sort
+ @SuppressWarnings("unused")
+ private int lastSortColumn = 0;
+ @SuppressWarnings("unused")
+ private boolean lastAscending = true;
+
+ public UsersViewerComparator(List<String> propertyList) {
+ super();
+ this.propertyList = propertyList;
+ }
+
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ String s1 = getProperty(e1, propertyList.get(sortColumn));
+ String s2 = getProperty(e2, propertyList.get(sortColumn));
+ int result = super.compare(viewer, s1, s2);
+ return ascending ? result : (-1) * result;
+ }
+
+ /**
+ * @return Returns the sortColumn.
+ */
+ public int getSortColumn() {
+ return sortColumn;
+ }
+
+ /**
+ * @param sortColumn
+ * The sortColumn to set.
+ */
+ public void setSortColumn(int sortColumn) {
+ if (this.sortColumn != sortColumn) {
+ lastSortColumn = this.sortColumn;
+ lastAscending = this.ascending;
+ this.sortColumn = sortColumn;
+ }
+ }
+
+ /**
+ * @return Returns the ascending.
+ */
+ public boolean isAscending() {
+ return ascending;
+ }
+
+ /**
+ * @param ascending
+ * The ascending to set.
+ */
+ public void setAscending(boolean ascending) {
+ this.ascending = ascending;
+ }