package org.appfuse.webapp.client.application.utils.tables; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent; import com.google.gwt.user.cellview.client.ColumnSortEvent.Handler; import com.google.gwt.view.client.HasData; /** * * @author ivangsa * * @param <T> */ public abstract class LocalColumnSortHandler<T> implements Handler { private final HasData<T> hasData; private final Map<Column<?, ?>, Comparator<T>> comparators = new HashMap<Column<?, ?>, Comparator<T>>(); /** * @param cellTable */ public LocalColumnSortHandler(HasData<T> hasData) { super(); this.hasData = hasData; } /** * Returns the comparator that has been set for the specified column, or * null if no comparator has been set. * * @param column * the {@link Column} */ public Comparator<T> getComparator(final Column<T, ?> column) { if (!comparators.containsKey(column)) { setComparator(column, new Comparator<T>() { @Override public int compare(T o1, T o2) { Object value1 = column.getValue(o1); Object value2 = column.getValue(o2); if (value1 == null) { return -1; } if (value2 == null) { return 1; } if (value1 instanceof Number || value2 instanceof Number) { // numeric comparison return ((Number) value1).intValue() - ((Number) value2).intValue(); } else { // string comparison return value1.toString().compareTo(value2.toString()); } } }); } return comparators.get(column); } public abstract List<T> getList(); public void onColumnSort(ColumnSortEvent event) { // Get the sorted column. Column<T, ?> column = (Column<T, ?>) event.getColumn(); if (column == null) { return; } // Get the comparator. final Comparator<T> comparator = getComparator(column); if (comparator == null) { return; } // Sort using the comparator. List<T> sortedList = new ArrayList<T>(getList()); if (event.isSortAscending()) { Collections.sort(sortedList, comparator); } else { Collections.sort(sortedList, new Comparator<T>() { public int compare(T o1, T o2) { return -comparator.compare(o1, o2); } }); } hasData.setRowData(0, sortedList); } /** * Set the comparator used to sort the specified column in ascending order. * * @param column * the {@link Column} * @param comparator * the {@link Comparator} to use for the {@link Column} */ public void setComparator(Column<T, ?> column, Comparator<T> comparator) { comparators.put(column, comparator); } }