118 lines
3.7 KiB
Java
118 lines
3.7 KiB
Java
/* ====================================================================
|
|
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
|
|
|
|
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.apache.poi.hssf.record.formula;
|
|
|
|
import org.apache.poi.ss.util.CellReference;
|
|
import org.apache.poi.util.BitField;
|
|
import org.apache.poi.util.BitFieldFactory;
|
|
import org.apache.poi.util.LittleEndianInput;
|
|
import org.apache.poi.util.LittleEndianOutput;
|
|
|
|
/**
|
|
* ReferencePtgBase - handles references (such as A1, A2, IA4)
|
|
*
|
|
* @author Andrew C. Oliver (acoliver@apache.org)
|
|
* @author Jason Height (jheight at chariot dot net dot au)
|
|
*/
|
|
public abstract class RefPtgBase extends OperandPtg {
|
|
|
|
/** The row index - zero based unsigned 16 bit value */
|
|
private int field_1_row;
|
|
/**
|
|
* Field 2 - lower 8 bits is the zero based unsigned byte column index - bit
|
|
* 16 - isRowRelative - bit 15 - isColumnRelative
|
|
*/
|
|
private int field_2_col;
|
|
private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
|
|
private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
|
|
|
|
/**
|
|
* YK: subclasses of RefPtgBase are used by the FormulaParser and FormulaEvaluator accross HSSF and XSSF.
|
|
* The bit mask should accomodate the maximum number of avaiable columns, i.e. 0x3FFF.
|
|
*
|
|
* @see org.apache.poi.ss.SpreadsheetVersion
|
|
*/
|
|
private static final BitField column = BitFieldFactory.getInstance(0x3FFF);
|
|
|
|
protected RefPtgBase() {
|
|
// Required for clone methods
|
|
}
|
|
|
|
protected RefPtgBase(CellReference c) {
|
|
setRow(c.getRow());
|
|
setColumn(c.getCol());
|
|
setColRelative(!c.isColAbsolute());
|
|
setRowRelative(!c.isRowAbsolute());
|
|
}
|
|
|
|
protected final void readCoordinates(LittleEndianInput in) {
|
|
field_1_row = in.readUShort();
|
|
field_2_col = in.readUShort();
|
|
}
|
|
|
|
protected final void writeCoordinates(LittleEndianOutput out) {
|
|
out.writeShort(field_1_row);
|
|
out.writeShort(field_2_col);
|
|
}
|
|
|
|
public final void setRow(int rowIndex) {
|
|
field_1_row = rowIndex;
|
|
}
|
|
|
|
/**
|
|
* @return the row number as an int
|
|
*/
|
|
public final int getRow() {
|
|
return field_1_row;
|
|
}
|
|
|
|
public final boolean isRowRelative() {
|
|
return rowRelative.isSet(field_2_col);
|
|
}
|
|
|
|
public final void setRowRelative(boolean rel) {
|
|
field_2_col = rowRelative.setBoolean(field_2_col, rel);
|
|
}
|
|
|
|
public final boolean isColRelative() {
|
|
return colRelative.isSet(field_2_col);
|
|
}
|
|
|
|
public final void setColRelative(boolean rel) {
|
|
field_2_col = colRelative.setBoolean(field_2_col, rel);
|
|
}
|
|
|
|
public final void setColumn(int col) {
|
|
field_2_col = column.setValue(field_2_col, col);
|
|
}
|
|
|
|
public final int getColumn() {
|
|
return column.getValue(field_2_col);
|
|
}
|
|
|
|
protected final String formatReferenceAsString() {
|
|
// Only make cell references as needed. Memory is an issue
|
|
CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative());
|
|
return cr.formatAsString();
|
|
}
|
|
|
|
public final byte getDefaultOperandClass() {
|
|
return Ptg.CLASS_REF;
|
|
}
|
|
}
|