/*
* Copyright 2014 cruxframework.org.
*
* 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.
*/
package org.cruxframework.crux.core.client.datasource;
/**
* @author Thiago da Rosa de Bustamante
*
*/
abstract class AbstractPagedDataSource<E> extends AbstractScrollableDataSource<E>
implements MeasurablePagedDataSource<E>
{
protected int pageSize = 10;
protected int currentPage = 0;
public int getCurrentPage()
{
return currentPage;
}
public int getPageCount()
{
int numRecords = getRecordCount();
int pageSize = getPageSize();
return (numRecords / pageSize) + (numRecords%pageSize==0?0:1);
}
public int getPageSize()
{
return pageSize;
}
/**
* @see org.cruxframework.crux.core.client.datasource.MeasurablePagedDataSource#getCurrentPageSize()
*/
public int getCurrentPageSize()
{
int pageEndRecord = getPageEndRecord();
if (pageEndRecord < 0)
{
return 0;
}
return pageEndRecord - getPageStartRecord() + 1;
}
public boolean hasNextPage()
{
ensureLoaded();
return (currentPage < getPageCount());
}
public boolean hasPreviousPage()
{
ensureLoaded();
return (currentPage > 1 );
}
public boolean nextPage()
{
if (hasNextPage())
{
currentPage++;
updateCurrentRecord();
return true;
}
return false;
}
public boolean previousPage()
{
if (hasPreviousPage())
{
currentPage--;
updateCurrentRecord();
return true;
}
return false;
}
public boolean setCurrentPage(int pageNumber)
{
ensureLoaded();
if (pageNumber > 0 && pageNumber <= getPageCount())
{
currentPage = pageNumber;
updateCurrentRecord();
return true;
}
return false;
}
public void setPageSize(int pageSize)
{
if (pageSize < 1)
{
pageSize = 1;
}
this.pageSize = pageSize;
if (this.loaded)
{
updateCurrentRecord();
}
}
@Override
public boolean hasNextRecord()
{
return isRecordOnPage(currentRecord+1);
}
@Override
public boolean hasPreviousRecord()
{
return isRecordOnPage(currentRecord-1);
}
@Override
public void reset()
{
super.reset();
currentPage = 0;
}
@Override
public void firstRecord()
{
ensureLoaded();
currentRecord = getPageStartRecord();
}
@Override
public void lastRecord()
{
ensureLoaded();
currentRecord = getPageEndRecord();
}
protected boolean isRecordOnPage(int record)
{
ensureLoaded();
if (data == null)
{
return false;
}
int startPageRecord = getPageStartRecord();
int endPageRescord = getPageEndRecord();
return (record >= startPageRecord && record <= endPageRescord);
}
protected int getPageEndRecord()
{
int pageEndRecord = (currentPage * pageSize) - 1;
if (this.data != null && pageEndRecord >= this.data.length)
{
pageEndRecord = this.data.length-1;
}
return pageEndRecord;
}
protected int getPageStartRecord()
{
return (currentPage - 1) * pageSize;
}
protected void updateCurrentRecord()
{
currentRecord = getPageStartRecord();
}
}