/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.data; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import com.extjs.gxt.ui.client.util.DefaultComparator; import com.google.gwt.user.client.rpc.AsyncCallback; /** * A specialized <code>DataProxy</code> the supports paging when the entire data * set is in memory. */ public class PagingModelMemoryProxy implements DataProxy<PagingLoadResult<? extends ModelData>> { private Comparator<Object> comparator; private List<? extends ModelData> data; @SuppressWarnings("unchecked") public PagingModelMemoryProxy(List data) { this.data = data; } /** * Returns the comparator. * * @return the comparator */ public Comparator<Object> getComparator() { return comparator; } /** * Returns the data. * * @return the data */ public List<? extends ModelData> getData() { return data; } public void load(DataReader<PagingLoadResult<? extends ModelData>> reader, Object loadConfig, AsyncCallback<PagingLoadResult<? extends ModelData>> callback) { PagingLoadConfig config = (PagingLoadConfig) loadConfig; if (config.getSortInfo().getSortField() != null) { final String sortField = config.getSortInfo().getSortField(); if (sortField != null) { Collections.sort(data, config.getSortInfo().getSortDir().comparator( new Comparator<ModelData>() { public int compare(ModelData o1, ModelData o2) { Object v1 = (Object) o1.get(sortField); Object v2 = (Object) o2.get(sortField); if (comparator != null) { return comparator.compare(v1, v2); } else { return DefaultComparator.INSTANCE.compare(v1, v2); } } })); } } ArrayList<ModelData> sublist = new ArrayList<ModelData>(); int start = config.getOffset(); int limit = data.size(); if (config.getLimit() > 0) { limit = Math.min(start + config.getLimit(), limit); } for (int i = config.getOffset(); i < limit; i++) { sublist.add(data.get(i)); } callback.onSuccess(new BasePagingLoadResult<ModelData>(sublist, config.getOffset(), data.size())); } /** * Sets the comparator used to sort the list of models (default to * DefaultComparator). * * @param comparator the comparator */ public void setComparator(Comparator<Object> comparator) { this.comparator = comparator; } }