package org.exitsoft.orm.core;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 与具体ORM实现无关的分页查询结果封装.
*
* @param <T> Page中记录的类型.
*
* @author vincent
*/
@SuppressWarnings("serial")
public class Page<T> extends PageRequest implements Serializable{
protected List<T> result = null;
protected long totalItems = -1;
public Page() {
}
public Page(PageRequest request) {
this.pageNo = request.pageNo;
this.pageSize = request.pageSize;
this.countTotal = request.countTotal;
this.orderBy = request.orderBy;
this.orderDir = request.orderDir;
}
/**
* 获得页内的记录列表.
*/
public List<T> getResult() {
return result;
}
/**
* 设置页内的记录列表.
*/
public void setResult(final List<T> result) {
this.result = result;
}
/**
* 获得总记录数, 默认值为-1.
*/
public long getTotalItems() {
return totalItems;
}
/**
* 设置总记录数.
*/
public void setTotalItems(final long totalItems) {
this.totalItems = totalItems;
}
/**
* 根据pageSize与totalItems计算总页数.
*/
public int getTotalPages() {
return (int) Math.ceil((double) totalItems / (double) getPageSize());
}
/**
* 是否还有下一页.
*/
public boolean hasNextPage() {
return (getPageNo() + 1 <= getTotalPages());
}
/**
* 取得下页的页号, 序号从1开始.
* 当前页为尾页时仍返回尾页序号.
*/
public int getNextPage() {
if (hasNextPage()) {
return getPageNo() + 1;
} else {
return getPageNo();
}
}
/**
* 是否还有上一页.
*/
public boolean hasPrePage() {
return (getPageNo() > 1);
}
/**
* 取得上页的页号, 序号从1开始.
* 当前页为首页时返回首页序号.
*/
public int getPrePage() {
if (hasPrePage()) {
return getPageNo() - 1;
} else {
return getPageNo();
}
}
/**
* 计算以当前页为中心的页面列表,如"首页,23,24,25,26,27,末页"
* @param count 需要计算的列表大小
* @return pageNo列表
*/
public List<Integer> getSlider(int count) {
int halfSize = count / 2;
int totalPage = getTotalPages();
int startPageNo = Math.max(getPageNo() - halfSize, 1);
int endPageNo = Math.min(startPageNo + count - 1, totalPage);
if (endPageNo - startPageNo < count) {
startPageNo = Math.max(endPageNo - count, 1);
}
List<Integer> result = new ArrayList<Integer>();
for (int i = startPageNo; i <= endPageNo; i++) {
result.add(i);
}
return result;
}
}