--- /dev/null
+package org.argeo.eclipse.ui.jcr.lists;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.Row;
+
+import org.argeo.ArgeoException;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * Base comparator to enable ordering on Table or Tree viewer that display Jcr
+ * rows
+ */
+public class RowViewerComparator extends NodeViewerComparator {
+
+ protected String selectorName;
+
+ public RowViewerComparator() {
+ }
+
+ /**
+ * e1 and e2 must both be Jcr rows.
+ *
+ * @param viewer
+ * @param e1
+ * @param e2
+ * @return
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ try {
+ Node n1 = ((Row) e1).getNode(selectorName);
+ Node n2 = ((Row) e2).getNode(selectorName);
+ return super.compare(viewer, n1, n2);
+ } catch (RepositoryException re) {
+ throw new ArgeoException("Unexpected error "
+ + "while comparing nodes", re);
+ }
+ }
+
+ /**
+ * @param propertyType
+ * Corresponding JCR type
+ * @param propertyName
+ * name of the property to use.
+ */
+ public void setColumn(int propertyType, String selectorName,
+ String propertyName) {
+ if (this.selectorName != null && getPropertyName() != null
+ && this.selectorName.equals(selectorName)
+ && this.getPropertyName().equals(propertyName)) {
+ // Same column as last sort; toggle the direction
+ setDirection(1 - getDirection());
+ } else {
+ // New column; do a descending sort
+ setPropertyType(propertyType);
+ setPropertyName(propertyName);
+ this.selectorName = selectorName;
+ setDirection(NodeViewerComparator.ASCENDING);
+ }
+ }
+}
\ No newline at end of file