/*********************************************************************
*
* Copyright (C) 2002 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
package jxl.biff;
import jxl.Cell;
import jxl.Range;
import jxl.Sheet;
/**
* Implementation class for the Range interface. This merely
* holds the raw range information. This implementation is used
* for ranges which are present on the current working sheet, so the
* getSheetIndex merely returns -1
*/
public class SheetRangeImpl implements Range
{
/**
* A handle to the sheet containing this range
*/
private Sheet sheet;
/**
* The column number of the cell at the top left of the range
*/
private int column1;
/**
* The row number of the cell at the top left of the range
*/
private int row1;
/**
* The column index of the cell at the bottom right
*/
private int column2;
/**
* The row index of the cell at the bottom right
*/
private int row2;
/**
* Constructor
* @param s the sheet containing the range
* @param c1 the column number of the top left cell of the range
* @param r1 the row number of the top left cell of the range
* @param c2 the column number of the bottom right cell of the range
* @param r2 the row number of the bottomr right cell of the range
*/
public SheetRangeImpl(Sheet s, int c1, int r1,
int c2, int r2)
{
sheet = s;
row1 = r1;
row2 = r2;
column1 = c1;
column2 = c2;
}
/**
* A copy constructor used for copying ranges between sheets
*
* @param c the range to copy from
* @param s the writable sheet
*/
public SheetRangeImpl(SheetRangeImpl c, Sheet s)
{
sheet = s;
row1 = c.row1;
row2 = c.row2;
column1 = c.column1;
column2 = c.column2;
}
/**
* Gets the cell at the top left of this range
*
* @return the cell at the top left
*/
public Cell getTopLeft()
{
// If the print area exceeds the bounds of the sheet, then handle
// it here. The sheet implementation will give a NPE
if (column1 >= sheet.getColumns() ||
row1 >= sheet.getRows())
{
return new EmptyCell(column1,row1);
}
return sheet.getCell(column1, row1);
}
/**
* Gets the cell at the bottom right of this range
*
* @return the cell at the bottom right
*/
public Cell getBottomRight()
{
// If the print area exceeds the bounds of the sheet, then handle
// it here. The sheet implementation will give a NPE
if (column2 >= sheet.getColumns() ||
row2 >= sheet.getRows())
{
return new EmptyCell(column2,row2);
}
return sheet.getCell(column2, row2);
}
/**
* Not supported. Returns -1, indicating that it refers to the current
* sheet
*
* @return -1
*/
public int getFirstSheetIndex()
{
return -1;
}
/**
* Not supported. Returns -1, indicating that it refers to the current
* sheet
*
* @return -1
*/
public int getLastSheetIndex()
{
return -1;
}
/**
* Sees whether there are any intersections between this range and the
* range passed in. This method is used internally by the WritableSheet to
* verify the integrity of merged cells, hyperlinks etc. Ranges are
* only ever compared for the same sheet
*
* @param range the range to compare against
* @return TRUE if the ranges intersect, FALSE otherwise
*/
public boolean intersects(SheetRangeImpl range)
{
if (range == this)
{
return true;
}
if (row2 < range.row1 ||
row1 > range.row2 ||
column2 < range.column1 ||
column1 > range.column2)
{
return false;
}
return true;
}
/**
* To string method - primarily used during debugging
*
* @return the string version of this object
*/
public String toString()
{
StringBuffer sb = new StringBuffer();
CellReferenceHelper.getCellReference(column1, row1, sb);
sb.append('-');
CellReferenceHelper.getCellReference(column2, row2, sb);
return sb.toString();
}
/**
* A row has been inserted, so adjust the range objects accordingly
*
* @param r the row which has been inserted
*/
public void insertRow(int r)
{
if (r > row2)
{
return;
}
if (r <= row1)
{
row1++;
}
if (r <= row2)
{
row2++;
}
}
/**
* A column has been inserted, so adjust the range objects accordingly
*
* @param c the column which has been inserted
*/
public void insertColumn(int c)
{
if (c > column2)
{
return;
}
if (c <= column1)
{
column1++;
}
if (c <= column2)
{
column2++;
}
}
/**
* A row has been removed, so adjust the range objects accordingly
*
* @param r the row which has been inserted
*/
public void removeRow(int r)
{
if (r > row2)
{
return;
}
if (r < row1)
{
row1--;
}
if (r < row2)
{
row2--;
}
}
/**
* A column has been removed, so adjust the range objects accordingly
*
* @param c the column which has been removed
*/
public void removeColumn(int c)
{
if (c > column2)
{
return;
}
if (c < column1)
{
column1--;
}
if (c < column2)
{
column2--;
}
}
/**
* Standard hash code method
*
* @return the hash code
*/
public int hashCode()
{
return 0xffff ^ row1 ^ row2 ^ column1 ^ column2;
}
/**
* Standard equals method
*
* @param o the object to compare
* @return TRUE if the two objects are the same, FALSE otherwise
*/
public boolean equals(Object o)
{
if (o == this)
{
return true;
}
if (!(o instanceof SheetRangeImpl))
{
return false;
}
SheetRangeImpl compare = (SheetRangeImpl) o;
return (column1 == compare.column1 &&
column2 == compare.column2 &&
row1 == compare.row1 &&
row2 == compare.row2);
}
}
|