/* * Copyright 2012 AndroidPlot.com * * 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 com.androidplot.ui; import android.graphics.RectF; import java.util.Iterator; public class FixedTableModel extends TableModel { private float cellWidth; private float cellHeight; protected FixedTableModel(float cellWidth, float cellHeight, TableOrder order) { super(order); setCellWidth(cellWidth); setCellHeight(cellHeight); } @Override public Iterator<RectF> getIterator(RectF tableRect, int totalElements) { return new FixedTableModelIterator(this, tableRect, totalElements); } public float getCellWidth() { return cellWidth; } public void setCellWidth(float cellWidth) { this.cellWidth = cellWidth; } public float getCellHeight() { return cellHeight; } public void setCellHeight(float cellHeight) { this.cellHeight = cellHeight; } private class FixedTableModelIterator implements Iterator<RectF> { private FixedTableModel model; private RectF tableRect; private RectF lastRect; private int numElements; private int lastElement; protected FixedTableModelIterator(FixedTableModel model, RectF tableRect, int numElements) { this.model = model; this.tableRect = tableRect; this.numElements = numElements; lastRect = new RectF( tableRect.left, tableRect.top, tableRect.left + model.getCellWidth(), tableRect.top + model.getCellHeight()); } @Override public boolean hasNext() { // was this the last element or is there no room in either axis for another cell? return !(lastElement >= numElements || (isColumnFinished() && isRowFinished())); } private boolean isColumnFinished() { return lastRect.bottom + model.getCellHeight() > tableRect.height(); } private boolean isRowFinished() { return lastRect.right + model.getCellWidth() > tableRect.width(); } @Override public RectF next() { try { if (lastElement == 0) { return lastRect; } if (lastElement >= numElements) { throw new IndexOutOfBoundsException(); } switch (model.getOrder()) { case ROW_MAJOR: if (isColumnFinished()) { moveOverAndUp(); } else { moveDown(); } break; case COLUMN_MAJOR: if (isRowFinished()) { moveDownAndBack(); } else { moveOver(); } break; default: throw new UnsupportedOperationException(); } return lastRect; } finally { lastElement++; } } private void moveDownAndBack() { //RectF rect = new RectF(lastRect); lastRect.offsetTo(tableRect.left, lastRect.bottom); //return rect; } private void moveOverAndUp() { //RectF rect = new RectF(lastRect); lastRect.offsetTo(lastRect.right, tableRect.top); //return rect; } private void moveOver() { //RectF rect = new RectF(lastRect); lastRect.offsetTo(lastRect.right, lastRect.top); //return rect; } private void moveDown() { //RectF rect = new RectF(lastRect); lastRect.offsetTo(lastRect.left, lastRect.bottom); //return rect; } @Override public void remove() { throw new UnsupportedOperationException(); } } }