File Source: pageable.java
/*
P/P * Method: net.sourceforge.pebble.util.Pageable__static_init
*/
1 /*
2 * Copyright (c) 2003-2006, Simon Brown
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * - Neither the name of Pebble nor the names of its contributors may
17 * be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 package net.sourceforge.pebble.util;
33
34 import java.util.List;
35
36 /**
37 * Helper class that implements paging over a collection.
38 *
39 * @author Simon Brown
40 */
41 public class Pageable<T> {
42
43 /** the default page size */
44 public static final int DEFAULT_PAGE_SIZE = 10;
45
46 private static final int PAGE_WINDOW = 10;
47
48 /** the list over which this class is paging */
49 private List<T> list;
50
51 /** the page size */
52 private int pageSize = DEFAULT_PAGE_SIZE;
53
54 /** the current page */
55 private int page;
56
57 /** the starting index */
58 private int startingIndex;
59
60 /** the ending index */
61 private int endingIndex;
62
63 /** the maximum number of pages */
64 private int maxPages;
65
66 /**
67 * Creates a new instance with the specified list.
68 *
69 * @param list a List
70 */
/*
P/P * Method: void net.sourceforge.pebble.util.Pageable(List)
*
* Preconditions:
* (soft) list != null
*
* Postconditions:
* this.list == list
* (soft) this.list != null
* init'ed(this.maxPages)
* this.page == 1
* this.pageSize == 10
*/
71 public Pageable(List<T> list) {
72 this.list = list;
73 this.page = 1;
74 this.maxPages = 1;
75
76 calculatePages();
77 }
78
79 private void calculatePages() {
/*
P/P * Method: void calculatePages()
*
* Preconditions:
* init'ed(this.pageSize)
* (soft) this.list != null
*
* Presumptions:
* java.util.List:size(...)@85/this.pageSize in -232+1..232-2
*
* Postconditions:
* possibly_updated(this.maxPages)
*
* Test Vectors:
* this.pageSize: {-231..0}, {1..232-1}
*/
80 if (pageSize > 0) {
81 // calculate how many pages there are
82 if (list.size() % pageSize == 0) {
83 maxPages = list.size() / pageSize;
84 } else {
85 maxPages = (list.size() / pageSize) + 1;
86 }
87 }
88 }
89
90 /**
91 * Gets the list that this instance is paging over.
92 *
93 * @return a List
94 */
95 public List<T> getList() {
/*
P/P * Method: List getList()
*
* Preconditions:
* init'ed(this.list)
*
* Postconditions:
* return_value == this.list
* init'ed(return_value)
*/
96 return this.list;
97 }
98
99 /**
100 * Gets the subset of the list for the current page.
101 *
102 * @return a List
103 */
104 public List<T> getListForPage() {
/*
P/P * Method: List getListForPage()
*
* Preconditions:
* init'ed(this.endingIndex)
* this.list != null
* init'ed(this.startingIndex)
*
* Postconditions:
* init'ed(return_value)
*/
105 return list.subList(startingIndex, endingIndex);
106 }
107
108 /**
109 * Gets the page size.
110 *
111 * @return the page size as an int
112 */
113 public int getPageSize() {
/*
P/P * Method: int getPageSize()
*
* Preconditions:
* init'ed(this.pageSize)
*
* Postconditions:
* return_value == this.pageSize
* init'ed(return_value)
*/
114 return this.pageSize;
115 }
116
117 /**
118 * Sets the page size.
119 *
120 * @param pageSize the page size as an int
121 */
122 public void setPageSize(int pageSize) {
/*
P/P * Method: void setPageSize(int)
*
* Preconditions:
* (soft) this.list != null
*
* Postconditions:
* possibly_updated(this.maxPages)
* this.pageSize == pageSize
* init'ed(this.pageSize)
*/
123 this.pageSize = pageSize;
124 calculatePages();
125 }
126
127 /**
128 * Gets the page.
129 *
130 * @return the page as an int
131 */
132 public int getPage() {
/*
P/P * Method: int getPage()
*
* Preconditions:
* init'ed(this.page)
*
* Postconditions:
* return_value == this.page
* init'ed(return_value)
*/
133 return this.page;
134 }
135
136 /**
137 * Sets the page size.
138 *
139 * @param p the page as an int
140 */
141 public void setPage(int p) {
/*
P/P * Method: void setPage(int)
*
* Preconditions:
* this.list != null
* init'ed(this.maxPages)
* init'ed(this.pageSize)
*
* Postconditions:
* init'ed(this.endingIndex)
* this.page == One-of{this.maxPages, 1, p}
* init'ed(this.page)
* this.startingIndex == One-of{this.pageSize*(this.page - 1), 0}
* this.startingIndex >= 0
* this.pageSize + this.startingIndex in -231..232-1
* this.pageSize*(this.page - 1) in -231..232-1
*
* Test Vectors:
* p: {2..232-2}, {-231..1}
* this.maxPages - p: {1..232-3}, {-6_442_450_943..0}
*/
142 if (p >= maxPages) {
143 this.page = maxPages;
144 } else if (p <= 1) {
145 this.page = 1;
146 } else {
147 this.page = p;
148 }
149
150 // now work out where the sub-list should start and end
151 startingIndex = pageSize * (page-1);
152 if (startingIndex < 0) {
153 startingIndex = 0;
154 }
155 endingIndex = startingIndex + pageSize;
156 if (endingIndex > list.size()) {
157 endingIndex = list.size();
158 }
159 }
160
161 /**
162 * Gets the maximum number of pages.
163 *
164 * @return the maximum number of pages as an int
165 */
166 public int getMaxPages() {
/*
P/P * Method: int getMaxPages()
*
* Preconditions:
* init'ed(this.maxPages)
*
* Postconditions:
* return_value == this.maxPages
* init'ed(return_value)
*/
167 return this.maxPages;
168 }
169
170 /**
171 * Determines whether there is a previous page and gets the page number.
172 *
173 * @return the previous page number, or zero
174 */
175 public int getPreviousPage() {
/*
P/P * Method: int getPreviousPage()
*
* Preconditions:
* init'ed(this.page)
*
* Postconditions:
* return_value == One-of{this.page - 1, 0}
* return_value in 0..232-2
*
* Test Vectors:
* this.page: {-231..1}, {2..232-1}
*/
176 if (page > 1) {
177 return page-1;
178 } else {
179 return 0;
180 }
181 }
182
183 /**
184 * Determines whether there is a next page and gets the page number.
185 *
186 * @return the next page number, or 0
187 */
188 public int getNextPage() {
/*
P/P * Method: int getNextPage()
*
* Preconditions:
* init'ed(this.maxPages)
* init'ed(this.page)
*
* Postconditions:
* return_value == One-of{this.page + 1, 0}
* return_value >= -231+1
*
* Test Vectors:
* this.maxPages - this.page: {-6_442_450_943..0}, {1..6_442_450_943}
*/
189 if (page < maxPages) {
190 return page+1;
191 } else {
192 return 0;
193 }
194 }
195
196 /**
197 * Gets the minimum page in the window.
198 *
199 * @return the page number
200 */
201 public int getMinPageRange() {
/*
P/P * Method: int getMinPageRange()
*
* Preconditions:
* init'ed(this.page)
*
* Postconditions:
* return_value == One-of{this.page - 10, 1}
* return_value in 1..232-11
*
* Test Vectors:
* this.page: {-231..10}, {11..232-1}
*/
202 if (getPage() > PAGE_WINDOW) {
203 return getPage() - PAGE_WINDOW;
204 } else {
205 return 1;
206 }
207 }
208
209 /**
210 * Gets the maximum page in the window.
211 *
212 * @return the page number
213 */
214 public int getMaxPageRange() {
/*
P/P * Method: int getMaxPageRange()
*
* Preconditions:
* init'ed(this.maxPages)
* init'ed(this.page)
*
* Postconditions:
* return_value == One-of{this.page + 10, this.maxPages}
* init'ed(return_value)
*
* Test Vectors:
* this.maxPages - this.page: {-6_442_450_943..10}, {11..6_442_450_943}
*/
215 if (getPage() < (getMaxPages() - PAGE_WINDOW)) {
216 return getPage() + PAGE_WINDOW;
217 } else {
218 return getMaxPages();
219 }
220 }
221
222 }
SofCheck Inspector Build Version : 2.22510
| pageable.java |
2010-Jun-25 19:40:32 |
| pageable.class |
2010-Jul-19 20:23:38 |