package edu.washington.cs.oneswarm.ui.gwt.client.newui.transfer_details; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import com.google.gwt.gen2.table.client.SortableGrid; import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorter; import com.google.gwt.gen2.table.client.SortableGrid.ColumnSorterCallback; import com.google.gwt.gen2.table.client.TableModelHelper.ColumnSortList; import com.google.gwt.user.client.ui.Widget; public class TransferColumnSorter extends ColumnSorter { @Override public void onSortColumn(SortableGrid grid, ColumnSortList sortList, ColumnSorterCallback callback) { // Get the primary column and sort order int column = sortList.getPrimaryColumn(); boolean ascending = sortList.isPrimaryAscending(); Integer[] perm = new Integer[grid.getRowCount()]; for (int i = 0; i < perm.length; i++) perm[i] = new Integer(i); final List<Widget> entries = new ArrayList<Widget>(grid.getRowCount()); boolean comparable = false; for (int rItr = 0; rItr < grid.getRowCount(); rItr++) { Widget w = grid.getWidget(rItr, column); entries.add(w); if (w instanceof Comparable) comparable = true; } if (comparable) { Arrays.sort(perm, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { /** * Typecheck so we can use labels to indicate completion * instead of 100% progress bars. */ if (!(entries.get(o1) instanceof Comparable)) return -1; else if (!(entries.get(o2) instanceof Comparable)) return 1; return ((Comparable) entries.get(o1)).compareTo(entries.get(o2)); } }); } else { Arrays.sort(perm, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return entries.get(o1).getElement().getInnerText() .compareTo(entries.get(o2).getElement().getInnerText()); } }); } int[] intperm = new int[perm.length]; for (int i = 0; i < perm.length; i++) { // System.out.println(i + " -> " + perm[i]); if (ascending) intperm[i] = perm[i]; else intperm[intperm.length - i - 1] = perm[i]; } // Use the callback to complete the sorting callback.onSortingComplete(intperm); } }