package org.limewire.ui.swing.util; import java.util.Comparator; import ca.odell.glazedlists.gui.TableFormat; /** * A comparator that sorts a table by the column that was clicked. This is a * revised version of the GlazedLists TableColumnComparator. The main * difference here is that the <code>compare(E, E)</code> method throws an * enhanced exception message if the object comparison fails. */ public class EventListColumnComparator<E> implements Comparator<E> { /** the table format knows to map objects to their fields */ private TableFormat<E> tableFormat; /** the field of interest */ private int column; /** comparison is delegated to a Comparator */ private Comparator comparator = null; /** * Creates a new EventListColumnComparator that sorts objects by the * specified column using the specified table format and the specified * comparator. */ public EventListColumnComparator(TableFormat<E> tableFormat, int column, Comparator comparator) { this.column = column; this.tableFormat = tableFormat; this.comparator = comparator; } /** * Compares the two objects, returning a result based on how they compare. */ @Override @SuppressWarnings("unchecked") public int compare(E alpha, E beta) { final Object alphaField = tableFormat.getColumnValue(alpha, column); final Object betaField = tableFormat.getColumnValue(beta, column); try { return comparator.compare(alphaField, betaField); } catch (Exception e) { // Throw exception with table format name and column. IllegalStateException ise = new IllegalStateException( "Cannot compare \"" + alphaField + "\" to \"" + betaField + "\" in " + tableFormat.getClass().getName() + ", column " + column); ise.initCause(e); throw ise; } } /** * Tests if this EventListColumnComparator is equal to the other specified * EventListColumnComparator. */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final EventListColumnComparator that = (EventListColumnComparator) o; if (column != that.column) return false; if (!comparator.equals(that.comparator)) return false; if (!tableFormat.equals(that.tableFormat)) return false; return true; } @Override public int hashCode() { int result; result = tableFormat.hashCode(); result = 29 * result + column; result = 29 * result + comparator.hashCode(); return result; } }