Package org.gwtoolbox.sample.widget.client.table

Source Code of org.gwtoolbox.sample.widget.client.table.PersonDataSource$PersonComparator

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());
        }
    }

}
TOP

Related Classes of org.gwtoolbox.sample.widget.client.table.PersonDataSource$PersonComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.