blob: 57c31f1b2c4c038624b4e8419d122aba993e9bae [file] [log] [blame]
package org.eclipse.team.internal.ccvs.ui;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.Date;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.ILogEntry;
/**
* This sorter is used by the HistoryView
*/
class HistorySorter extends ViewerSorter {
private boolean reversed = false;
private int columnNumber;
private VersionCollator versionCollator = new VersionCollator();
// column headings: "Revision" "Tags" "Date" "Author" "Comment"
private int[][] SORT_ORDERS_BY_COLUMN = {
{0, 2, 3, 4, 1}, /* revision */
{1, 0, 2, 3, 4}, /* tags */
{2, 0, 3, 4, 1}, /* date */
{3, 0, 2, 4, 1}, /* author */
{4, 0, 2, 3, 1} /* comment */
};
/**
* The constructor.
*/
public HistorySorter(int columnNumber) {
this.columnNumber = columnNumber;
}
/**
* Compares two log entries, sorting first by the main column of this sorter,
* then by subsequent columns, depending on the column sort order.
*/
public int compare(Viewer viewer, Object o1, Object o2) {
ILogEntry e1 = (ILogEntry)o1;
ILogEntry e2 = (ILogEntry)o2;
int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
int result = 0;
for (int i = 0; i < columnSortOrder.length; ++i) {
result = compareColumnValue(columnSortOrder[i], e1, e2);
if (result != 0)
break;
}
if (reversed)
result = -result;
return result;
}
/**
* Compares two markers, based only on the value of the specified column.
*/
int compareColumnValue(int columnNumber, ILogEntry e1, ILogEntry e2) {
switch (columnNumber) {
case 0: /* revision */
return versionCollator.compare(e1.getRevision(), e2.getRevision());
case 1: /* tags */
CVSTag[] tags1 = e1.getTags();
CVSTag[] tags2 = e2.getTags();
if (tags2.length == 0) {
return -1;
}
if (tags1.length == 0) {
return 1;
}
return getCollator().compare(tags1[0].getName(), tags2[0].getName());
case 2: /* date */
Date date1 = e1.getDate();
Date date2 = e2.getDate();
return date1.compareTo(date2);
case 3: /* author */
return getCollator().compare(e1.getAuthor(), e2.getAuthor());
case 4: /* comment */
return getCollator().compare(e1.getComment(), e2.getComment());
default:
return 0;
}
}
/**
* Returns the number of the column by which this is sorting.
*/
public int getColumnNumber() {
return columnNumber;
}
/**
* Returns true for descending, or false
* for ascending sorting order.
*/
public boolean isReversed() {
return reversed;
}
/**
* Sets the sorting order.
*/
public void setReversed(boolean newReversed) {
reversed = newReversed;
}
}