/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.eas.grid.processing; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.ColumnSortEvent; import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * * @author mg * @param <T> */ public class ListMultiSortHandler<T> extends ColumnSortEvent.ListHandler<T> { protected List<T> unsorted = new ArrayList<>(); protected Runnable onComplete; public ListMultiSortHandler(List<T> aList, Runnable aOnComplete) { this(aList); onComplete = aOnComplete; } public ListMultiSortHandler(List<T> aList) { super(aList); setList(aList); } @Override public void setList(List<T> aList) { super.setList(aList); unsorted.clear(); unsorted.addAll(aList); } protected void unsort() { List<T> sorted = getList(); sorted.clear(); sorted.addAll(unsorted); } @Override public void onColumnSort(final ColumnSortEvent event) { if (unsorted.size() != getList().size()) { setList(getList()); } if (event.getColumnSortList() == null || event.getColumnSortList().size() == 0) { unsort(); } else { // Sort using the multi comparator. List<T> sorted = getList(); Collections.sort(sorted, new Comparator<T>() { @Override public int compare(T o1, T o2) { for (int i = 0; i < event.getColumnSortList().size(); i++) { ColumnSortInfo sortInfo = event.getColumnSortList().get(i); Comparator<T> c = getComparator((Column<T, ?>) sortInfo.getColumn()); int res = 0; if (c != null) { res = c.compare(o1, o2); } if (res != 0) { return sortInfo.isAscending() ? res : -res; } } return 0; } }); } if(onComplete != null) onComplete.run(); } }