/* BlockSelectionModelProvider.java created 2007-10-04
*
*/
package org.signalml.app.model.components;
import javax.swing.AbstractSpinnerModel;
/** BlockSelectionModelProvider
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class BlockSelectionModelProvider {
protected int maxPage;
protected int maxBlock;
protected int blocksPerPage;
protected int currentPage;
protected int currentBlock;
protected int currentLength;
private StartPageSpinnerModel startPageSpinnerModel;
protected StartBlockSpinnerModel startBlockSpinnerModel;
protected LengthSpinnerModel lengthSpinnerModel;
public BlockSelectionModelProvider(int maxPage, int maxBlock, int blocksPerPage, int currentPage, int currentBlock, int currentLength) {
this.maxPage = maxPage;
this.maxBlock = maxBlock;
this.blocksPerPage = blocksPerPage;
this.currentPage = currentPage;
this.currentBlock = currentBlock;
this.currentLength = currentLength;
startPageSpinnerModel = new StartPageSpinnerModel();
startBlockSpinnerModel = new StartBlockSpinnerModel();
lengthSpinnerModel = new LengthSpinnerModel();
}
public int getMaxPage() {
return maxPage;
}
public int getCurrentPage() {
return currentPage;
}
public int getCurrentLength() {
return currentLength;
}
public StartPageSpinnerModel getStartPageSpinnerModel() {
return startPageSpinnerModel;
}
public StartBlockSpinnerModel getStartBlockSpinnerModel() {
return startBlockSpinnerModel;
}
public LengthSpinnerModel getLengthSpinnerModel() {
return lengthSpinnerModel;
}
protected class StartPageSpinnerModel extends AbstractSpinnerModel implements BoundedSpinnerModel {
@Override
public Object getNextValue() {
return (currentPage < maxPage ? new Integer(currentPage+1) : null);
}
@Override
public Object getPreviousValue() {
return (currentPage > 1 ? new Integer(currentPage-1) : null);
}
@Override
public Object getValue() {
return new Integer(currentPage);
}
@Override
public void setValue(Object value) throws IllegalArgumentException {
int page = ((Integer) value).intValue();
if (page < 1 || page > maxPage) {
throw new IllegalArgumentException();
}
if (page != currentPage) {
currentPage = page;
fireStateChanged();
startBlockSpinnerModel.update();
lengthSpinnerModel.update();
}
}
@Override
public Comparable<? extends Number> getMaximum() {
return new Integer(maxPage);
}
@Override
public Comparable<? extends Number> getMinimum() {
return new Integer(1);
}
}
protected class StartBlockSpinnerModel extends AbstractSpinnerModel implements BoundedSpinnerModel {
private int getMaxBlock() {
if (currentPage == maxPage) {
return (maxBlock - ((currentPage-1) * blocksPerPage));
} else {
return blocksPerPage;
}
}
@Override
public Object getNextValue() {
int max = getMaxBlock();
return (currentBlock < max ? new Integer(currentBlock+1) : null);
}
@Override
public Object getPreviousValue() {
return (currentBlock > 1 ? new Integer(currentBlock-1) : null);
}
@Override
public Object getValue() {
return new Integer(currentBlock);
}
@Override
public void setValue(Object value) throws IllegalArgumentException {
int max = getMaxBlock();
int block = ((Integer) value).intValue();
if (block < 1 || block > max) {
throw new IllegalArgumentException();
}
if (block != currentBlock) {
currentBlock = block;
fireStateChanged();
lengthSpinnerModel.update();
}
}
public void update() {
int max = getMaxBlock();
if (currentBlock > max) {
setValue(max);
}
fireStateChanged();
}
@Override
public Comparable<? extends Number> getMaximum() {
return new Integer(getMaxBlock());
}
@Override
public Comparable<? extends Number> getMinimum() {
return new Integer(1);
}
}
protected class LengthSpinnerModel extends AbstractSpinnerModel implements BoundedSpinnerModel {
private int getMaxLength() {
return (maxBlock - (((currentPage-1)*blocksPerPage) + (currentBlock-1)));
}
@Override
public Object getNextValue() {
int currentEnd = ((currentPage-1)*blocksPerPage) + (currentBlock-1) + currentLength - 1;
return (currentEnd < maxBlock ? new Integer(currentLength+1) : null);
}
@Override
public Object getPreviousValue() {
return (currentLength > 1 ? new Integer(currentLength-1) : null);
}
@Override
public Object getValue() {
return new Integer(currentLength);
}
@Override
public void setValue(Object value) {
int length = ((Integer) value).intValue();
int maxLength = getMaxLength();
if (length < 1 || length > maxLength) {
throw new IllegalArgumentException();
}
if (length != currentLength) {
currentLength = length;
fireStateChanged();
}
}
public void update() {
int maxLength = getMaxLength();
if (currentLength > maxLength) {
setValue(new Integer(maxLength));
}
fireStateChanged();
}
@Override
public Comparable<? extends Number> getMaximum() {
return new Integer(getMaxLength());
}
@Override
public Comparable<? extends Number> getMinimum() {
return new Integer(1);
}
}
}