/*
* Copyright 2004 original author or authors.
*
* 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.extremecomponents.table.limit;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* @author Jeff Johnston
*/
public final class TableLimit implements Limit {
protected LimitFactory limitFactory;
protected FilterSet filterSet;
protected Sort sort;
protected boolean exported;
protected int rowStart;
protected int rowEnd;
protected int currentRowsDisplayed;
protected int page;
protected int totalRows;
public TableLimit(LimitFactory limitFactory) {
this.limitFactory = limitFactory;
this.filterSet = limitFactory.getFilterSet();
this.sort = limitFactory.getSort();
this.page = limitFactory.getPage();
this.exported = limitFactory.isExported();
}
public FilterSet getFilterSet() {
return filterSet;
}
public int getRowEnd() {
return rowEnd;
}
public int getRowStart() {
return rowStart;
}
public Sort getSort() {
return sort;
}
public int getPage() {
return page;
}
public int getCurrentRowsDisplayed() {
return currentRowsDisplayed;
}
public int getTotalRows() {
return totalRows;
}
public boolean isFiltered() {
return filterSet.isFiltered();
}
public boolean isCleared() {
return filterSet.isCleared();
}
public boolean isSorted() {
return sort.isSorted();
}
public boolean isExported() {
return exported;
}
/**
* When using the Limit you must call this method to set the following row
* attributes: rowStart, rowEnd, currentRowsDisplayed and page
*
* @param totalRows The total results for the table.
* @param rowsDisplayed The default rows displayed on the table. This
* value is either defined on the table, or defaulted in the
* Preferences.
*/
public void setRowAttributes(int totalRows, int rowsDisplayed) {
int currentRowsDisplayed = limitFactory.getCurrentRowsDisplayed(totalRows, rowsDisplayed);
int page = getValidPage(this.page, totalRows, currentRowsDisplayed);
int rowStart = (page - 1) * currentRowsDisplayed;
int rowEnd = rowStart + currentRowsDisplayed;
if (rowEnd > totalRows) {
rowEnd = totalRows;
}
this.page = page;
this.currentRowsDisplayed = currentRowsDisplayed;
this.totalRows = totalRows;
this.rowStart = rowStart;
this.rowEnd = rowEnd;
}
/**
* The page returned that is not greater than the pages that can display.
*/
private int getValidPage(int page, int totalRows, int currentRowsDisplayed) {
if (!isValidPage(page, totalRows, currentRowsDisplayed)) {
return getValidPage(--page, totalRows, currentRowsDisplayed);
}
return page;
}
/**
* Testing that the page returned is not greater than the pages that are
* able to be displayed. The problem arises if using the state feature and
* rows are deleted.
*/
private boolean isValidPage(int page, int totalRows, int currentRowsDisplayed) {
if (page == 1) {
return true;
}
int rowStart = (page - 1) * currentRowsDisplayed;
int rowEnd = rowStart + currentRowsDisplayed;
if (rowEnd > totalRows) {
rowEnd = totalRows;
}
return rowEnd > rowStart;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this);
builder.append("rowStart", rowStart);
builder.append("rowEnd", rowEnd);
builder.append("currentRowsDisplayed", currentRowsDisplayed);
builder.append("page", page);
builder.append("totalRows", totalRows);
builder.append("exported", exported);
builder.append("sort", sort);
builder.append("filterSet", filterSet);
return builder.toString();
}
}