PaginatedArrayList.java Source code

Java tutorial

Introduction

Here is the source code for PaginatedArrayList.java

Source

/*
 *  Copyright 2004 Clinton Begin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * Implementation of PaginatedList backed by an ArrayList
 * 
 */
public class PaginatedArrayList implements PaginatedList {

    private static final ArrayList EMPTY_LIST = new ArrayList(0);

    private List list;

    private List page;

    private int pageSize;

    private int index;

    /**
     * @param pageSize
     */
    public PaginatedArrayList(int pageSize) {
        this.pageSize = pageSize;
        this.index = 0;
        this.list = new ArrayList();
        repaginate();
    }

    /**
     * Constructor to set the initial size and the page size
     * 
     * @param initialCapacity -
     *          the initial size
     * @param pageSize -
     *          the page size
     */
    public PaginatedArrayList(int initialCapacity, int pageSize) {
        this.pageSize = pageSize;
        this.index = 0;
        this.list = new ArrayList(initialCapacity);
        repaginate();
    }

    /**
     * Constructor to create an instance using an existing collection
     * 
     * @param c -
     *          the collection to build the instance with
     * @param pageSize -
     *          the page size
     */
    public PaginatedArrayList(Collection c, int pageSize) {
        this.pageSize = pageSize;
        this.index = 0;
        this.list = new ArrayList(c);
        repaginate();
    }

    private void repaginate() {
        if (list.isEmpty()) {
            page = EMPTY_LIST;
        } else {
            int start = index * pageSize;
            int end = start + pageSize - 1;
            if (end >= list.size()) {
                end = list.size() - 1;
            }
            if (start >= list.size()) {
                index = 0;
                repaginate();
            } else if (start < 0) {
                index = list.size() / pageSize;
                if (list.size() % pageSize == 0) {
                    index--;
                }
                repaginate();
            } else {
                page = list.subList(start, end + 1);
            }
        }
    }

    /* List accessors (uses page) */

    public int size() {
        return page.size();
    }

    public boolean isEmpty() {
        return page.isEmpty();
    }

    public boolean contains(Object o) {
        return page.contains(o);
    }

    public Iterator iterator() {
        return page.iterator();
    }

    public Object[] toArray() {
        return page.toArray();
    }

    public Object[] toArray(Object a[]) {
        return page.toArray(a);
    }

    public boolean containsAll(Collection c) {
        return page.containsAll(c);
    }

    public Object get(int index) {
        return page.get(index);
    }

    public int indexOf(Object o) {
        return page.indexOf(o);
    }

    public int lastIndexOf(Object o) {
        return page.lastIndexOf(o);
    }

    public ListIterator listIterator() {
        return page.listIterator();
    }

    public ListIterator listIterator(int index) {
        return page.listIterator(index);
    }

    public List subList(int fromIndex, int toIndex) {
        return page.subList(fromIndex, toIndex);
    }

    /* List mutators (uses master list) */

    public boolean add(Object o) {
        boolean b = list.add(o);
        repaginate();
        return b;
    }

    public boolean remove(Object o) {
        boolean b = list.remove(o);
        repaginate();
        return b;
    }

    public boolean addAll(Collection c) {
        boolean b = list.addAll(c);
        repaginate();
        return b;
    }

    public boolean addAll(int index, Collection c) {
        boolean b = list.addAll(index, c);
        repaginate();
        return b;
    }

    public boolean removeAll(Collection c) {
        boolean b = list.removeAll(c);
        repaginate();
        return b;
    }

    public boolean retainAll(Collection c) {
        boolean b = list.retainAll(c);
        repaginate();
        return b;
    }

    public void clear() {
        list.clear();
        repaginate();
    }

    public Object set(int index, Object element) {
        Object o = list.set(index, element);
        repaginate();
        return o;
    }

    public void add(int index, Object element) {
        list.add(index, element);
        repaginate();
    }

    public Object remove(int index) {
        Object o = list.remove(index);
        repaginate();
        return o;
    }

    /* Paginated List methods */

    public int getPageSize() {
        return pageSize;
    }

    public boolean isFirstPage() {
        return index == 0;
    }

    public boolean isMiddlePage() {
        return !(isFirstPage() || isLastPage());
    }

    public boolean isLastPage() {
        return list.size() - ((index + 1) * pageSize) < 1;
    }

    public boolean isNextPageAvailable() {
        return !isLastPage();
    }

    public boolean isPreviousPageAvailable() {
        return !isFirstPage();
    }

    public boolean nextPage() {
        if (isNextPageAvailable()) {
            index++;
            repaginate();
            return true;
        } else {
            return false;
        }
    }

    public boolean previousPage() {
        if (isPreviousPageAvailable()) {
            index--;
            repaginate();
            return true;
        } else {
            return false;
        }
    }

    public void gotoPage(int pageNumber) {
        index = pageNumber;
        repaginate();
    }

    public int getPageIndex() {
        return index;
    }

}

/*
 * Copyright 2004 Clinton Begin
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

/**
 * Interface for lists that support paging
 * 
 */
interface PaginatedList extends List {

    /**
     * Returns the maximum number of items per page
     * 
     * @return The maximum number of items per page.
     */
    public int getPageSize();

    /**
     * Is the current page the first page?
     * 
     * @return True if the current page is the first page or if only a single page
     *         exists.
     */
    public boolean isFirstPage();

    /**
     * Is the current page a middle page (ie not first or last)?
     * 
     * @return True if the current page is not the first or last page, and more
     *         than one page exists (always returns false if only a single page
     *         exists).
     */
    public boolean isMiddlePage();

    /**
     * Is the current page the last page?
     * 
     * @return True if the current page is the last page or if only a single page
     *         exists.
     */
    public boolean isLastPage();

    /**
     * Is a page available after the current page?
     * 
     * @return True if the next page is available
     */
    public boolean isNextPageAvailable();

    /**
     * Is a page available before the current page?
     * 
     * @return True if the previous page is available
     */
    public boolean isPreviousPageAvailable();

    /**
     * Moves to the next page after the current page. If the current page is the
     * last page, wrap to the first page.
     * 
     * @return True if the page changed
     */
    public boolean nextPage();

    /**
     * Moves to the page before the current page. If the current page is the first
     * page, wrap to the last page.
     * 
     * @return True if the page changed
     */
    public boolean previousPage();

    /**
     * Moves to a specified page. If the specified page is beyond the last page,
     * wrap to the first page. If the specified page is before the first page,
     * wrap to the last page.
     * 
     * @param pageNumber
     *          The page to go to
     */
    public void gotoPage(int pageNumber);

    /**
     * Returns the current page index, which is a zero based integer. All
     * paginated list implementations should know what index they are on, even if
     * they don't know the ultimate boundaries (min/max).
     * 
     * @return The current page
     */
    public int getPageIndex();

}