package cn.org.rapid_framework.util.page;
/**
* 分页器,根据page,pageSize,totalItem用于页面上分页显示多项内容,计算页码和当前页的偏移量,方便页面分页使用.
*
* @author badqiu
* @version $Id: Paginator.java,v 0.1 2010-11-29 下午05:35:58 badqiu Exp $
*/
public class Paginator implements java.io.Serializable {
private static final long serialVersionUID = 6089482156906595931L;
private static final int DEFAULT_SLIDERS_COUNT = 7;
/** 分页大小 */
private int pageSize;
/** 页数 */
private int page;
/** 总记录数 */
private int totalItems;
public Paginator(int page, int pageSize, int totalItems) {
super();
this.pageSize = pageSize;
this.totalItems = totalItems;
this.page = computePageNo(page);
}
/**
* 取得当前页。
*/
public int getPage() {
return page;
}
public int getPageSize() {
return pageSize;
}
/**
* 取得总项数。
*
* @return 总项数
*/
public int getTotalItems() {
return totalItems;
}
/**
* 是否是首页(第一页),第一页页码为1
*
* @return 首页标识
*/
public boolean isFirstPage() {
return page <= 1;
}
/**
* 是否是最后一页
*
* @return 末页标识
*/
public boolean isLastPage() {
return page >= getTotalPages();
}
public int getPrePage() {
if (isHasPrePage()) {
return page - 1;
} else {
return page;
}
}
public int getNextPage() {
if (isHasNextPage()) {
return page + 1;
} else {
return page;
}
}
/**
* 判断指定页码是否被禁止,也就是说指定页码超出了范围或等于当前页码。
*
* @param page 页码
*
* @return boolean 是否为禁止的页码
*/
public boolean isDisabledPage(int page) {
return ((page < 1) || (page > getTotalPages()) || (page == this.page));
}
/**
* 是否有上一页
*
* @return 上一页标识
*/
public boolean isHasPrePage() {
return (page - 1 >= 1);
}
/**
* 是否有下一页
*
* @return 下一页标识
*/
public boolean isHasNextPage() {
return (page + 1 <= getTotalPages());
}
/**
* 开始行,可以用于oracle分页使用 (1-based)。
**/
public int getStartRow() {
if(getPageSize() <= 0 || totalItems <= 0) return 0;
return page > 0 ? (page - 1) * getPageSize() + 1 : 0;
}
/**
* 结束行,可以用于oracle分页使用 (1-based)。
**/
public int getEndRow() {
return page > 0 ? Math.min(pageSize * page, getTotalItems()) : 0;
}
/**
* offset,计数从0开始,可以用于mysql分页使用(0-based)
**/
public int getOffset() {
return page > 0 ? (page - 1) * getPageSize() : 0;
}
/**
* limit,可以用于mysql分页使用(0-based)
**/
public int getLimit() {
if (page > 0) {
return Math.min(pageSize * page, getTotalItems()) - (pageSize * (page - 1));
} else {
return 0;
}
}
/**
* 得到 总页数
* @return
*/
public int getTotalPages() {
if (totalItems <= 0) {
return 0;
}
if (pageSize <= 0) {
return 0;
}
int count = totalItems / pageSize;
if (totalItems % pageSize > 0) {
count++;
}
return count;
}
protected int computePageNo(int page) {
return computePageNumber(page,pageSize,totalItems);
}
/**
* 页码滑动窗口,并将当前页尽可能地放在滑动窗口的中间部位。
* @return
*/
public Integer[] getSlider() {
return slider(DEFAULT_SLIDERS_COUNT);
}
/**
* 页码滑动窗口,并将当前页尽可能地放在滑动窗口的中间部位。
* 注意:不可以使用 getSlider(1)方法名称,因为在JSP中会与 getSlider()方法冲突,报exception
* @return
*/
public Integer[] slider(int slidersCount) {
return generateLinkPageNumbers(getPage(),(int)getTotalPages(), slidersCount);
}
private static int computeLastPageNumber(int totalItems,int pageSize) {
if(pageSize <= 0) return 1;
int result = (int)(totalItems % pageSize == 0 ?
totalItems / pageSize
: totalItems / pageSize + 1);
if(result <= 1)
result = 1;
return result;
}
private static int computePageNumber(int page, int pageSize,int totalItems) {
if(page <= 1) {
return 1;
}
if (Integer.MAX_VALUE == page
|| page > computeLastPageNumber(totalItems,pageSize)) { //last page
return computeLastPageNumber(totalItems,pageSize);
}
return page;
}
private static Integer[] generateLinkPageNumbers(int currentPageNumber,int lastPageNumber,int count) {
int avg = count / 2;
int startPageNumber = currentPageNumber - avg;
if(startPageNumber <= 0) {
startPageNumber = 1;
}
int endPageNumber = startPageNumber + count - 1;
if(endPageNumber > lastPageNumber) {
endPageNumber = lastPageNumber;
}
if(endPageNumber - startPageNumber < count) {
startPageNumber = endPageNumber - count;
if(startPageNumber <= 0 ) {
startPageNumber = 1;
}
}
java.util.List<Integer> result = new java.util.ArrayList<Integer>();
for(int i = startPageNumber; i <= endPageNumber; i++) {
result.add(new Integer(i));
}
return result.toArray(new Integer[result.size()]);
}
public String toString() {
return "page:"+page+" pageSize:"+pageSize+" totalItems:"+totalItems;
}
}