2002-04-23 18:24:41 -04:00
|
|
|
/* ====================================================================
|
2006-12-22 14:18:16 -05:00
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
|
|
this work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You 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
|
2004-04-09 09:05:39 -04:00
|
|
|
|
|
|
|
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.
|
|
|
|
==================================================================== */
|
2002-04-23 18:24:41 -04:00
|
|
|
|
|
|
|
package org.apache.poi.hssf.record.formula;
|
|
|
|
|
2002-06-26 14:05:40 -04:00
|
|
|
import org.apache.poi.hssf.model.Workbook;
|
2005-08-18 03:06:44 -04:00
|
|
|
import org.apache.poi.hssf.record.RecordInputStream;
|
2008-02-15 08:50:38 -05:00
|
|
|
import org.apache.poi.hssf.util.AreaReference;
|
|
|
|
import org.apache.poi.hssf.util.CellReference;
|
2002-06-26 14:05:40 -04:00
|
|
|
import org.apache.poi.util.BitField;
|
2005-09-01 23:48:31 -04:00
|
|
|
import org.apache.poi.util.BitFieldFactory;
|
2008-02-15 08:50:38 -05:00
|
|
|
import org.apache.poi.util.LittleEndian;
|
2005-09-01 23:48:31 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
|
|
|
|
/**
|
2002-04-30 00:43:17 -04:00
|
|
|
* Title: Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
|
2002-04-23 18:24:41 -04:00
|
|
|
* Description: Defined a area in Extern Sheet. <P>
|
|
|
|
* REFERENCE: <P>
|
|
|
|
* @author Libin Roman (Vista Portal LDT. Developer)
|
2002-06-26 14:05:40 -04:00
|
|
|
* @author avik
|
2002-09-04 20:26:28 -04:00
|
|
|
* @author Jason Height (jheight at chariot dot net dot au)
|
2002-04-23 18:24:41 -04:00
|
|
|
* @version 1.0-pre
|
|
|
|
*/
|
|
|
|
|
2008-02-15 08:50:38 -05:00
|
|
|
public class Area3DPtg extends Ptg implements AreaI
|
2002-04-23 18:24:41 -04:00
|
|
|
{
|
2003-03-06 15:41:17 -05:00
|
|
|
public final static byte sid = 0x3b;
|
|
|
|
private final static int SIZE = 11; // 10 + 1 for Ptg
|
|
|
|
private short field_1_index_extern_sheet;
|
2008-03-07 07:06:18 -05:00
|
|
|
private int field_2_first_row;
|
|
|
|
private int field_3_last_row;
|
|
|
|
private int field_4_first_column;
|
|
|
|
private int field_5_last_column;
|
2003-03-06 15:41:17 -05:00
|
|
|
|
2005-09-01 23:48:31 -04:00
|
|
|
private BitField rowRelative = BitFieldFactory.getInstance( 0x8000 );
|
|
|
|
private BitField colRelative = BitFieldFactory.getInstance( 0x4000 );
|
2003-03-06 15:41:17 -05:00
|
|
|
|
|
|
|
/** Creates new AreaPtg */
|
|
|
|
public Area3DPtg()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public Area3DPtg( String arearef, short externIdx )
|
|
|
|
{
|
|
|
|
setArea(arearef);
|
|
|
|
setExternSheetIndex( externIdx );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2005-08-18 03:06:44 -04:00
|
|
|
public Area3DPtg(RecordInputStream in)
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
2005-08-18 03:06:44 -04:00
|
|
|
field_1_index_extern_sheet = in.readShort();
|
2008-03-07 07:06:18 -05:00
|
|
|
field_2_first_row = in.readUShort();
|
|
|
|
field_3_last_row = in.readUShort();
|
|
|
|
field_4_first_column = in.readUShort();
|
|
|
|
field_5_last_column = in.readUShort();
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
2008-02-21 10:08:44 -05:00
|
|
|
public Area3DPtg(short firstRow, short lastRow, short firstColumn, short lastColumn,
|
2008-03-07 07:06:18 -05:00
|
|
|
boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative,
|
|
|
|
short externalSheetIndex) {
|
|
|
|
setFirstRow(firstRow);
|
|
|
|
setLastRow(lastRow);
|
|
|
|
setFirstColumn(firstColumn);
|
|
|
|
setLastColumn(lastColumn);
|
|
|
|
setFirstRowRelative(firstRowRelative);
|
|
|
|
setLastRowRelative(lastRowRelative);
|
|
|
|
setFirstColRelative(firstColRelative);
|
|
|
|
setLastColRelative(lastColRelative);
|
|
|
|
setExternSheetIndex(externalSheetIndex);
|
|
|
|
}
|
|
|
|
|
|
|
|
public String toString()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
StringBuffer buffer = new StringBuffer();
|
|
|
|
|
|
|
|
buffer.append( "AreaPtg\n" );
|
|
|
|
buffer.append( "Index to Extern Sheet = " + getExternSheetIndex() ).append( "\n" );
|
|
|
|
buffer.append( "firstRow = " + getFirstRow() ).append( "\n" );
|
|
|
|
buffer.append( "lastRow = " + getLastRow() ).append( "\n" );
|
|
|
|
buffer.append( "firstCol = " + getFirstColumn() ).append( "\n" );
|
|
|
|
buffer.append( "lastCol = " + getLastColumn() ).append( "\n" );
|
|
|
|
buffer.append( "firstColRel= "
|
|
|
|
+ isFirstRowRelative() ).append( "\n" );
|
|
|
|
buffer.append( "lastColRowRel = "
|
|
|
|
+ isLastRowRelative() ).append( "\n" );
|
|
|
|
buffer.append( "firstColRel = " + isFirstColRelative() ).append( "\n" );
|
2008-03-07 07:06:18 -05:00
|
|
|
buffer.append( "lastColRel = " + isLastColRelative() ).append( "\n" );
|
2003-03-06 15:41:17 -05:00
|
|
|
return buffer.toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void writeBytes( byte[] array, int offset )
|
|
|
|
{
|
|
|
|
array[0 + offset] = (byte) ( sid + ptgClass );
|
|
|
|
LittleEndian.putShort( array, 1 + offset, getExternSheetIndex() );
|
2008-03-07 07:06:18 -05:00
|
|
|
LittleEndian.putShort( array, 3 + offset, (short)getFirstRow() );
|
|
|
|
LittleEndian.putShort( array, 5 + offset, (short)getLastRow() );
|
|
|
|
LittleEndian.putShort( array, 7 + offset, (short)getFirstColumnRaw() );
|
|
|
|
LittleEndian.putShort( array, 9 + offset, (short)getLastColumnRaw() );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public int getSize()
|
|
|
|
{
|
|
|
|
return SIZE;
|
|
|
|
}
|
|
|
|
|
|
|
|
public short getExternSheetIndex()
|
|
|
|
{
|
|
|
|
return field_1_index_extern_sheet;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setExternSheetIndex( short index )
|
|
|
|
{
|
|
|
|
field_1_index_extern_sheet = index;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getFirstRow()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
return field_2_first_row;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public void setFirstRow( int row )
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
field_2_first_row = row;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getLastRow()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
return field_3_last_row;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public void setLastRow( int row )
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
field_3_last_row = row;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getFirstColumn()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
return field_4_first_column & 0xFF;
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getFirstColumnRaw()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
return field_4_first_column;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isFirstRowRelative()
|
|
|
|
{
|
|
|
|
return rowRelative.isSet( field_4_first_column );
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isFirstColRelative()
|
|
|
|
{
|
|
|
|
return colRelative.isSet( field_4_first_column );
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setFirstColumn( short column )
|
|
|
|
{
|
|
|
|
field_4_first_column &= 0xFF00;
|
|
|
|
field_4_first_column |= column & 0xFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setFirstColumnRaw( short column )
|
|
|
|
{
|
|
|
|
field_4_first_column = column;
|
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getLastColumn()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
return field_5_last_column & 0xFF;
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
public int getLastColumnRaw()
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
|
|
|
return field_5_last_column;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isLastRowRelative()
|
|
|
|
{
|
|
|
|
return rowRelative.isSet( field_5_last_column );
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isLastColRelative()
|
|
|
|
{
|
|
|
|
return colRelative.isSet( field_5_last_column );
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setLastColumn( short column )
|
|
|
|
{
|
|
|
|
field_5_last_column &= 0xFF00;
|
|
|
|
field_5_last_column |= column & 0xFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setLastColumnRaw( short column )
|
|
|
|
{
|
|
|
|
field_5_last_column = column;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* sets the first row to relative or not
|
2005-01-01 20:00:53 -05:00
|
|
|
* @param rel FIXME: Document this!
|
2003-03-06 15:41:17 -05:00
|
|
|
*/
|
|
|
|
public void setFirstRowRelative( boolean rel )
|
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
field_4_first_column = rowRelative.setBoolean( field_4_first_column, rel );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set whether the first column is relative
|
|
|
|
*/
|
|
|
|
public void setFirstColRelative( boolean rel )
|
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
field_4_first_column = colRelative.setBoolean( field_4_first_column, rel );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set whether the last row is relative or not
|
2005-01-01 20:00:53 -05:00
|
|
|
* @param rel FIXME: Document this!
|
2003-03-06 15:41:17 -05:00
|
|
|
*/
|
|
|
|
public void setLastRowRelative( boolean rel )
|
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
field_5_last_column = rowRelative.setBoolean( field_5_last_column, rel );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* set whether the last column should be relative or not
|
|
|
|
*/
|
|
|
|
public void setLastColRelative( boolean rel )
|
|
|
|
{
|
2008-03-07 07:06:18 -05:00
|
|
|
field_5_last_column = colRelative.setBoolean( field_5_last_column, rel );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*public String getArea(){
|
|
|
|
RangeAddress ra = new RangeAddress( getFirstColumn(),getFirstRow() + 1, getLastColumn(), getLastRow() + 1);
|
|
|
|
String result = ra.getAddress();
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}*/
|
|
|
|
|
|
|
|
public void setArea( String ref )
|
|
|
|
{
|
|
|
|
AreaReference ar = new AreaReference( ref );
|
2008-01-08 10:47:00 -05:00
|
|
|
|
2008-02-15 07:04:42 -05:00
|
|
|
CellReference frstCell = ar.getFirstCell();
|
|
|
|
CellReference lastCell = ar.getLastCell();
|
2003-03-06 15:41:17 -05:00
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
setFirstRow( (short) frstCell.getRow() );
|
|
|
|
setFirstColumn( frstCell.getCol() );
|
|
|
|
setLastRow( (short) lastCell.getRow() );
|
|
|
|
setLastColumn( lastCell.getCol() );
|
2008-02-15 07:04:42 -05:00
|
|
|
setFirstColRelative( !frstCell.isColAbsolute() );
|
2008-01-08 10:47:00 -05:00
|
|
|
setLastColRelative( !lastCell.isColAbsolute() );
|
2008-02-15 07:04:42 -05:00
|
|
|
setFirstRowRelative( !frstCell.isRowAbsolute() );
|
2008-01-08 10:47:00 -05:00
|
|
|
setLastRowRelative( !lastCell.isRowAbsolute() );
|
2003-03-06 15:41:17 -05:00
|
|
|
}
|
|
|
|
|
2008-03-07 07:06:18 -05:00
|
|
|
/**
|
|
|
|
* @return text representation of this area reference that can be used in text
|
|
|
|
* formulas. The sheet name will get properly delimited if required.
|
|
|
|
*/
|
2003-08-31 02:16:57 -04:00
|
|
|
public String toFormulaString(Workbook book)
|
2003-03-06 15:41:17 -05:00
|
|
|
{
|
2008-02-15 08:50:38 -05:00
|
|
|
// First do the sheet name
|
2003-03-06 15:41:17 -05:00
|
|
|
StringBuffer retval = new StringBuffer();
|
2008-02-01 08:02:06 -05:00
|
|
|
String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet);
|
|
|
|
if(sheetName != null) {
|
|
|
|
SheetNameFormatter.appendFormat(retval, sheetName);
|
2003-03-06 15:41:17 -05:00
|
|
|
retval.append( '!' );
|
|
|
|
}
|
2008-02-15 08:50:38 -05:00
|
|
|
|
|
|
|
// Now the normal area bit
|
|
|
|
retval.append( AreaPtg.toFormulaString(this, book) );
|
|
|
|
|
|
|
|
// All done
|
2003-03-06 15:41:17 -05:00
|
|
|
return retval.toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
public byte getDefaultOperandClass()
|
|
|
|
{
|
|
|
|
return Ptg.CLASS_REF;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Object clone()
|
|
|
|
{
|
|
|
|
Area3DPtg ptg = new Area3DPtg();
|
|
|
|
ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
|
|
|
|
ptg.field_2_first_row = field_2_first_row;
|
|
|
|
ptg.field_3_last_row = field_3_last_row;
|
|
|
|
ptg.field_4_first_column = field_4_first_column;
|
|
|
|
ptg.field_5_last_column = field_5_last_column;
|
2008-03-07 07:06:18 -05:00
|
|
|
ptg.setClass(ptgClass);
|
2003-03-06 15:41:17 -05:00
|
|
|
return ptg;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public boolean equals( Object o )
|
|
|
|
{
|
|
|
|
if ( this == o ) return true;
|
|
|
|
if ( !( o instanceof Area3DPtg ) ) return false;
|
|
|
|
|
|
|
|
final Area3DPtg area3DPtg = (Area3DPtg) o;
|
|
|
|
|
|
|
|
if ( field_1_index_extern_sheet != area3DPtg.field_1_index_extern_sheet ) return false;
|
|
|
|
if ( field_2_first_row != area3DPtg.field_2_first_row ) return false;
|
|
|
|
if ( field_3_last_row != area3DPtg.field_3_last_row ) return false;
|
|
|
|
if ( field_4_first_column != area3DPtg.field_4_first_column ) return false;
|
|
|
|
if ( field_5_last_column != area3DPtg.field_5_last_column ) return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int hashCode()
|
|
|
|
{
|
|
|
|
int result;
|
|
|
|
result = (int) field_1_index_extern_sheet;
|
|
|
|
result = 29 * result + (int) field_2_first_row;
|
|
|
|
result = 29 * result + (int) field_3_last_row;
|
|
|
|
result = 29 * result + (int) field_4_first_column;
|
|
|
|
result = 29 * result + (int) field_5_last_column;
|
|
|
|
return result;
|
|
|
|
}
|
2002-05-27 17:00:12 -04:00
|
|
|
|
2002-09-04 20:26:28 -04:00
|
|
|
|
2002-04-23 18:24:41 -04:00
|
|
|
}
|