package org.gwtoolbox.sample.widget.client.table;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.gwtoolbox.commons.collections.client.Page;
import org.gwtoolbox.commons.types.client.Gender;
import org.gwtoolbox.widget.client.data.DataSourceAdapter;
import org.gwtoolbox.widget.client.data.FieldSort;
import org.gwtoolbox.widget.client.data.MapRecord;
import org.gwtoolbox.widget.client.data.Record;
import org.gwtoolbox.widget.client.data.SortSpec;
import org.gwtoolbox.widget.client.data.SortSpecComparator;
/**
* @author Uri Boness
*/
public class PersonDataSource extends DataSourceAdapter<Record> {
private final static List<Person> people = new ArrayList<Person>();
static {
people.add(new Person(1, "Person 1", 31, Gender.MALE));
people.add(new Person(2, "Person 2", 32, Gender.FEMALE));
people.add(new Person(3, "Person 3", 33, Gender.MALE));
people.add(new Person(4, "Person 4", 34, Gender.FEMALE));
people.add(new Person(5, "Person 5", 35, Gender.MALE));
people.add(new Person(6, "Person 6", 36, Gender.MALE));
people.add(new Person(7, "Person 7", 37, Gender.MALE));
people.add(new Person(8, "Person 8", 38, Gender.FEMALE));
people.add(new Person(9, "Person 9", 39, Gender.FEMALE));
people.add(new Person(10, "Person 10", 43, Gender.MALE));
people.add(new Person(11, "Person 11", 41, Gender.FEMALE));
people.add(new Person(12, "Person 12", 32, Gender.FEMALE));
people.add(new Person(13, "Person 13", 53, Gender.MALE));
people.add(new Person(14, "Person 14", 37, Gender.FEMALE));
people.add(new Person(15, "Person 15", 39, Gender.MALE));
people.add(new Person(16, "Person 16", 43, Gender.MALE));
}
public void getPage(int pageIndex, int pageSize, final AsyncCallback<Page<Record>> callback) {
doFetch(pageIndex, pageSize, people, callback);
}
public void getPage(int pageIndex, int pageSize, SortSpec sortSpec, AsyncCallback<Page<Record>> callback) {
if (sortSpec == null) {
getPage(pageIndex, pageSize, callback);
return;
}
List<Person> sortedList = new ArrayList<Person>(people);
Collections.sort(sortedList, new PersonComparator(sortSpec.getSorts()));
doFetch(pageIndex, pageSize, sortedList, callback);
}
public void getAll(AsyncCallback<List<Record>> callback) {
getAll((SortSpec) null, callback);
}
public void getAll(SortSpec sortSpec, final AsyncCallback<List<Record>> callback) {
final ArrayList<Record> records = new ArrayList<Record>(people.size());
for (Person person : people) {
Record record = personToRecord(person);
records.add(record);
}
if (sortSpec != null) {
Collections.sort(records, new SortSpecComparator<Record>(sortSpec));
}
callback.onSuccess(records);
// new Timer() {
// public void effect() {
// callback.onSuccess(records);
// }
// }.schedule(500);
}
//============================================== Helper Methods ====================================================
private void doFetch(int pageIndex, int pageSize, List<Person> list, final AsyncCallback<Page<Record>> callback) {
List<Record> records = new ArrayList<Record>(pageSize);
int start = pageIndex * pageSize;
int lastPage = list.size() / pageSize;
int end = (lastPage == pageIndex) ? list.size() : start + pageSize;
for (int i = start; i < end; i++) {
Person person = list.get(i);
Record record = personToRecord(person);
records.add(record);
}
final Page<Record> page = new Page<Record>(pageIndex, pageSize, list.size(), records);
callback.onSuccess(page);
// new Timer() {
// public void effect() {
// callback.onSuccess(page);
// }
// }.schedule(500);
}
private Record personToRecord(Person person) {
MapRecord record = new MapRecord();
record.setValue("id", person.getId());
record.setValue("name", person.getName());
record.setValue("age", person.getAge());
record.setValue("gender", person.getGender());
return record;
}
//============================================== Inner Classes =====================================================
private class PersonComparator implements Comparator<Person> {
private final List<FieldSort> sorts;
private PersonComparator(List<FieldSort> sorts) {
this.sorts = sorts;
}
public int compare(Person p1, Person p2) {
for (FieldSort sort : sorts) {
String fieldName = sort.getFieldName();
boolean asc = sort.isAsc();
int result = 0;
if ("name".equals(fieldName)) {
result = compareByName(p1, p2);
} else if ("age".equals(fieldName)) {
result = compareByAge(p1, p2);
} else if ("gender".equals(fieldName)) {
result = compareByGender(p1, p2);
} else {
result = compareById(p1, p2);
}
if (result != 0) {
return asc ? result : -result;
}
}
return 0;
}
private int compareById(Person p1, Person p2) {
return (int) (p1.getId() - p2.getId());
}
private int compareByName(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
private int compareByAge(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
private int compareByGender(Person p1, Person p2) {
return p1.getGender().compareTo(p2.getGender());
}
}
}