/* * Ext GWT 2.2.4 - Ext for GWT * Copyright(c) 2007-2010, 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 extends MemoryProxy<PagingLoadResult<? extends ModelData>> { private Comparator<Object> comparator; public PagingModelMemoryProxy(Object data) { super(data); } /** * Returns the comparator. * * @return the comparator */ public Comparator<Object> getComparator() { return comparator; } @SuppressWarnings({"unchecked", "rawtypes"}) @Override public void load(DataReader<PagingLoadResult<? extends ModelData>> reader, Object loadConfig, AsyncCallback<PagingLoadResult<? extends ModelData>> callback) { try { PagingLoadResult d = null; if (reader != null) { d = reader.read(loadConfig, data); } else { if (data instanceof List) { d = new BasePagingLoadResult(new ArrayList((List) data)); } else { PagingLoadResult r = (PagingLoadResult) data; d = new BasePagingLoadResult(new ArrayList(r.getData()), r.getOffset(), r.getTotalLength()); } } PagingLoadConfig config = (PagingLoadConfig) loadConfig; if (config.getSortInfo().getSortField() != null) { final String sortField = config.getSortInfo().getSortField(); if (sortField != null) { Collections.sort(d.getData(), 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); } } })); } } List<ModelData> sublist = new ArrayList<ModelData>(); int start = config.getOffset(); int limit = d.getData().size(); if (config.getLimit() > 0) { limit = Math.min(start + config.getLimit(), limit); } for (int i = config.getOffset(); i < limit; i++) { sublist.add((ModelData) d.getData().get(i)); } callback.onSuccess(new BasePagingLoadResult<ModelData>(sublist, config.getOffset(), d.getData().size())); } catch (Exception e) { callback.onFailure(e); } } /** * 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; } }