aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/poi/hssf
diff options
context:
space:
mode:
authorJosh Micich <josh@apache.org>2008-06-07 00:53:01 +0000
committerJosh Micich <josh@apache.org>2008-06-07 00:53:01 +0000
commite7f24cd7d4758eed8f65946222c52efca0a1d7b2 (patch)
tree573d058b6121667c49a1535d7a01c8d7929c09cd /src/java/org/apache/poi/hssf
parent2507426ed8a2b0fbe13dca5906122c5fa730c6ab (diff)
downloadpoi-e7f24cd7d4758eed8f65946222c52efca0a1d7b2.tar.gz
poi-e7f24cd7d4758eed8f65946222c52efca0a1d7b2.zip
Fix for bug 45091 - serialization of RefN~ tokens. Simplified Ptg class hierarchy
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@664220 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/poi/hssf')
-rw-r--r--src/java/org/apache/poi/hssf/model/FormulaParser.java60
-rw-r--r--src/java/org/apache/poi/hssf/record/FormulaRecord.java2
-rw-r--r--src/java/org/apache/poi/hssf/record/NameRecord.java2
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/SharedFormulaRecord.java34
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java6
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AddPtg.java46
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java34
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaAPtg.java68
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java71
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaNAPtg.java53
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaNPtg.java44
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaNVPtg.java52
-rwxr-xr-x[-rw-r--r--]src/java/org/apache/poi/hssf/record/formula/AreaPtg.java299
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java286
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/AreaVPtg.java71
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java29
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ArrayPtgA.java48
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ArrayPtgV.java54
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/BoolPtg.java17
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java44
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/DividePtg.java48
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/EqualPtg.java49
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ErrPtg.java8
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ExpPtg.java22
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/FuncPtg.java8
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java16
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java46
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java71
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/IntPtg.java7
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java21
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java51
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java77
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java11
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java29
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java43
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java17
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java62
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/NamePtg.java35
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/NameXPtg.java32
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java53
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/NumberPtg.java22
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/OperationPtg.java16
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java18
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/PercentPtg.java53
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/PowerPtg.java50
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/Ptg.java611
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RangePtg.java22
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java15
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java20
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefNAPtg.java52
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefNPtg.java26
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefNVPtg.java54
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefPtg.java (renamed from src/java/org/apache/poi/hssf/record/formula/RefAPtg.java)108
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java (renamed from src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java)94
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/RefVPtg.java57
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java1
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/StringPtg.java24
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java45
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java49
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java49
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/UnionPtg.java22
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java19
-rw-r--r--src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java6
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java10
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java6
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java7
66 files changed, 1000 insertions, 2482 deletions
diff --git a/src/java/org/apache/poi/hssf/model/FormulaParser.java b/src/java/org/apache/poi/hssf/model/FormulaParser.java
index 508061c033..72fe1856b4 100644
--- a/src/java/org/apache/poi/hssf/model/FormulaParser.java
+++ b/src/java/org/apache/poi/hssf/model/FormulaParser.java
@@ -274,7 +274,7 @@ public final class FormulaParser {
boolean cellRef = CELL_REFERENCE_PATTERN.matcher(name).matches();
if (cellRef) {
- return new ReferencePtg(name);
+ return new RefPtg(name);
}
for(int i = 0; i < book.getNumberOfNames(); i++) {
@@ -324,9 +324,9 @@ public final class FormulaParser {
FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByName(name.toUpperCase());
int numArgs = args.length;
if(fm == null) {
- if (namePtg == null) {
- throw new IllegalStateException("NamePtg must be supplied for external functions");
- }
+ if (namePtg == null) {
+ throw new IllegalStateException("NamePtg must be supplied for external functions");
+ }
// must be external function
ParseNode[] allArgs = new ParseNode[numArgs+1];
allArgs[0] = new ParseNode(namePtg);
@@ -335,8 +335,8 @@ public final class FormulaParser {
}
if (namePtg != null) {
- throw new IllegalStateException("NamePtg no applicable to internal functions");
- }
+ throw new IllegalStateException("NamePtg no applicable to internal functions");
+ }
boolean isVarArgs = !fm.hasFixedArgsLength();
int funcIx = fm.getIndex();
validateNumArgs(args.length, fm);
@@ -392,7 +392,7 @@ public final class FormulaParser {
SkipWhite();
if (isArgumentDelimiter(look)) {
if (missedPrevArg) {
- temp.add(new ParseNode(new MissingArgPtg()));
+ temp.add(new ParseNode(MissingArgPtg.instance));
numArgs++;
}
if (look == ')') {
@@ -417,7 +417,7 @@ public final class FormulaParser {
/** Parse and Translate a Math Factor */
private ParseNode powerFactor() {
- ParseNode result = percentFactor();
+ ParseNode result = percentFactor();
while(true) {
SkipWhite();
if(look != '^') {
@@ -425,19 +425,19 @@ public final class FormulaParser {
}
Match('^');
ParseNode other = percentFactor();
- result = new ParseNode(new PowerPtg(), result, other);
+ result = new ParseNode(PowerPtg.instance, result, other);
}
}
private ParseNode percentFactor() {
- ParseNode result = parseSimpleFactor();
+ ParseNode result = parseSimpleFactor();
while(true) {
SkipWhite();
if(look != '%') {
return result;
}
Match('%');
- result = new ParseNode(new PercentPtg(), result);
+ result = new ParseNode(PercentPtg.instance, result);
}
}
@@ -452,15 +452,15 @@ public final class FormulaParser {
return new ParseNode(parseErrorLiteral());
case '-':
Match('-');
- return new ParseNode(new UnaryMinusPtg(), powerFactor());
+ return new ParseNode(UnaryMinusPtg.instance, powerFactor());
case '+':
Match('+');
- return new ParseNode(new UnaryPlusPtg(), powerFactor());
+ return new ParseNode(UnaryPlusPtg.instance, powerFactor());
case '(':
Match('(');
ParseNode inside = comparisonExpression();
Match(')');
- return new ParseNode(new ParenthesisPtg(), inside);
+ return new ParseNode(ParenthesisPtg.instance, inside);
case '"':
return new ParseNode(parseStringLiteral());
}
@@ -625,18 +625,18 @@ public final class FormulaParser {
/** Parse and Translate a Math Term */
private ParseNode Term() {
- ParseNode result = powerFactor();
+ ParseNode result = powerFactor();
while(true) {
SkipWhite();
Ptg operator;
switch(look) {
case '*':
Match('*');
- operator = new MultiplyPtg();
+ operator = MultiplyPtg.instance;
break;
case '/':
Match('/');
- operator = new DividePtg();
+ operator = DividePtg.instance;
break;
default:
return result; // finished with Term
@@ -647,7 +647,7 @@ public final class FormulaParser {
}
private ParseNode comparisonExpression() {
- ParseNode result = concatExpression();
+ ParseNode result = concatExpression();
while (true) {
SkipWhite();
switch(look) {
@@ -666,26 +666,26 @@ public final class FormulaParser {
private Ptg getComparisonToken() {
if(look == '=') {
Match(look);
- return new EqualPtg();
+ return EqualPtg.instance;
}
boolean isGreater = look == '>';
Match(look);
if(isGreater) {
if(look == '=') {
Match('=');
- return new GreaterEqualPtg();
+ return GreaterEqualPtg.instance;
}
- return new GreaterThanPtg();
+ return GreaterThanPtg.instance;
}
switch(look) {
case '=':
Match('=');
- return new LessEqualPtg();
+ return LessEqualPtg.instance;
case '>':
Match('>');
- return new NotEqualPtg();
+ return NotEqualPtg.instance;
}
- return new LessThanPtg();
+ return LessThanPtg.instance;
}
@@ -698,7 +698,7 @@ public final class FormulaParser {
}
Match('&');
ParseNode other = additiveExpression();
- result = new ParseNode(new ConcatPtg(), result, other);
+ result = new ParseNode(ConcatPtg.instance, result, other);
}
return result;
}
@@ -706,18 +706,18 @@ public final class FormulaParser {
/** Parse and Translate an Expression */
private ParseNode additiveExpression() {
- ParseNode result = Term();
+ ParseNode result = Term();
while (true) {
SkipWhite();
Ptg operator;
switch(look) {
case '+':
Match('+');
- operator = new AddPtg();
+ operator = AddPtg.instance;
break;
case '-':
Match('-');
- operator = new SubtractPtg();
+ operator = SubtractPtg.instance;
break;
default:
return result; // finished with additive expression
@@ -771,9 +771,9 @@ end;
}
public Ptg[] getRPNPtg(int formulaType) {
- OperandClassTransformer oct = new OperandClassTransformer(formulaType);
+ OperandClassTransformer oct = new OperandClassTransformer(formulaType);
// RVA is for 'operand class': 'reference', 'value', 'array'
- oct.transformFormula(_rootNode);
+ oct.transformFormula(_rootNode);
return ParseNode.toTokenArray(_rootNode);
}
diff --git a/src/java/org/apache/poi/hssf/record/FormulaRecord.java b/src/java/org/apache/poi/hssf/record/FormulaRecord.java
index c20f5e6d32..1583aa039b 100644
--- a/src/java/org/apache/poi/hssf/record/FormulaRecord.java
+++ b/src/java/org/apache/poi/hssf/record/FormulaRecord.java
@@ -557,7 +557,7 @@ public final class FormulaRecord
if (field_8_parsed_expr != null)
size = field_8_parsed_expr.size();
for (int i=0; i< size; i++) {
- Ptg ptg = (Ptg)((Ptg)field_8_parsed_expr.get(i)).clone();
+ Ptg ptg = ((Ptg)field_8_parsed_expr.get(i)).copy();
rec.field_8_parsed_expr.add(i, ptg);
}
rec.value_data = value_data;
diff --git a/src/java/org/apache/poi/hssf/record/NameRecord.java b/src/java/org/apache/poi/hssf/record/NameRecord.java
index 23af4b17cc..786c0b3d6b 100644
--- a/src/java/org/apache/poi/hssf/record/NameRecord.java
+++ b/src/java/org/apache/poi/hssf/record/NameRecord.java
@@ -737,7 +737,7 @@ public class NameRecord extends Record {
}
// And then a union if we had more than one area
if(refs.length > 1) {
- ptg = new UnionPtg();
+ ptg = UnionPtg.instance;
field_13_name_definition.push(ptg);
this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
}
diff --git a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
index e4c0f28ea4..a8aeed0dae 100755
--- a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
+++ b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java
@@ -207,22 +207,10 @@ public final class SharedFormulaRecord extends Record {
}
if (ptg instanceof RefNPtg) {
RefNPtg refNPtg = (RefNPtg)ptg;
- ptg = new ReferencePtg(fixupRelativeRow(formulaRow,refNPtg.getRow(),refNPtg.isRowRelative()),
+ ptg = new RefPtg(fixupRelativeRow(formulaRow,refNPtg.getRow(),refNPtg.isRowRelative()),
fixupRelativeColumn(formulaColumn,refNPtg.getColumn(),refNPtg.isColRelative()),
refNPtg.isRowRelative(),
refNPtg.isColRelative());
- } else if (ptg instanceof RefNVPtg) {
- RefNVPtg refNVPtg = (RefNVPtg)ptg;
- ptg = new RefVPtg(fixupRelativeRow(formulaRow,refNVPtg.getRow(),refNVPtg.isRowRelative()),
- fixupRelativeColumn(formulaColumn,refNVPtg.getColumn(),refNVPtg.isColRelative()),
- refNVPtg.isRowRelative(),
- refNVPtg.isColRelative());
- } else if (ptg instanceof RefNAPtg) {
- RefNAPtg refNAPtg = (RefNAPtg)ptg;
- ptg = new RefAPtg( fixupRelativeRow(formulaRow,refNAPtg.getRow(),refNAPtg.isRowRelative()),
- fixupRelativeColumn(formulaColumn,refNAPtg.getColumn(),refNAPtg.isColRelative()),
- refNAPtg.isRowRelative(),
- refNAPtg.isColRelative());
} else if (ptg instanceof AreaNPtg) {
AreaNPtg areaNPtg = (AreaNPtg)ptg;
ptg = new AreaPtg(fixupRelativeRow(formulaRow,areaNPtg.getFirstRow(),areaNPtg.isFirstRowRelative()),
@@ -233,26 +221,6 @@ public final class SharedFormulaRecord extends Record {
areaNPtg.isLastRowRelative(),
areaNPtg.isFirstColRelative(),
areaNPtg.isLastColRelative());
- } else if (ptg instanceof AreaNVPtg) {
- AreaNVPtg areaNVPtg = (AreaNVPtg)ptg;
- ptg = new AreaVPtg(fixupRelativeRow(formulaRow,areaNVPtg.getFirstRow(),areaNVPtg.isFirstRowRelative()),
- fixupRelativeRow(formulaRow,areaNVPtg.getLastRow(),areaNVPtg.isLastRowRelative()),
- fixupRelativeColumn(formulaColumn,areaNVPtg.getFirstColumn(),areaNVPtg.isFirstColRelative()),
- fixupRelativeColumn(formulaColumn,areaNVPtg.getLastColumn(),areaNVPtg.isLastColRelative()),
- areaNVPtg.isFirstRowRelative(),
- areaNVPtg.isLastRowRelative(),
- areaNVPtg.isFirstColRelative(),
- areaNVPtg.isLastColRelative());
- } else if (ptg instanceof AreaNAPtg) {
- AreaNAPtg areaNAPtg = (AreaNAPtg)ptg;
- ptg = new AreaAPtg(fixupRelativeRow(formulaRow,areaNAPtg.getFirstRow(),areaNAPtg.isFirstRowRelative()),
- fixupRelativeRow(formulaRow,areaNAPtg.getLastRow(),areaNAPtg.isLastRowRelative()),
- fixupRelativeColumn(formulaColumn,areaNAPtg.getFirstColumn(),areaNAPtg.isFirstColRelative()),
- fixupRelativeColumn(formulaColumn,areaNAPtg.getLastColumn(),areaNAPtg.isLastColRelative()),
- areaNAPtg.isFirstRowRelative(),
- areaNAPtg.isLastRowRelative(),
- areaNAPtg.isFirstColRelative(),
- areaNAPtg.isLastColRelative());
}
if (!ptg.isBaseToken()) {
ptg.setClass(originalOperandClass);
diff --git a/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java b/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
index 3c1293807c..f89e201bc9 100644
--- a/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
@@ -56,12 +56,6 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
return sb.toString();
}
- public int getType() {
- return -1;
- }
-
-
-
public short getFunctionIndex() {
return field_2_fnc_index;
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AddPtg.java b/src/java/org/apache/poi/hssf/record/formula/AddPtg.java
index c6acbaeb80..db2d9d1044 100644
--- a/src/java/org/apache/poi/hssf/record/formula/AddPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/AddPtg.java
@@ -17,9 +17,6 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Addition operator PTG the "+" binomial operator. If you need more
* explanation than that then well...We really can't help you here.
@@ -27,49 +24,23 @@ import org.apache.poi.hssf.record.RecordInputStream;
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class AddPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x03;
private final static String ADD = "+";
- /** Creates new AddPtg */
-
- public AddPtg()
- {
- }
-
- public AddPtg(RecordInputStream in)
- {
+ public static final ValueOperatorPtg instance = new AddPtg();
- // doesn't need anything
+ private AddPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
+ protected byte getSid() {
+ return sid;
}
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
-
- /** Implementation of method from Ptg */
- public String toFormulaString(HSSFWorkbook book)
- {
- return "+";
- }
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
@@ -80,9 +51,4 @@ public final class AddPtg extends ValueOperatorPtg {
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new AddPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
index 4ee0bef153..60911edc72 100644
--- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
@@ -95,7 +95,7 @@ public class Area3DPtg extends OperandPtg implements AreaI {
public void writeBytes( byte[] array, int offset )
{
- array[0 + offset] = (byte) ( sid + ptgClass );
+ array[0 + offset] = (byte) ( sid + getPtgClass() );
LittleEndian.putShort( array, 1 + offset, getExternSheetIndex() );
LittleEndian.putShort( array, 3 + offset, (short)getFirstRow() );
LittleEndian.putShort( array, 5 + offset, (short)getLastRow() );
@@ -280,24 +280,10 @@ public class Area3DPtg extends OperandPtg implements AreaI {
return retval.toString();
}
- public byte getDefaultOperandClass()
- {
+ 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;
- ptg.setClass(ptgClass);
- return ptg;
- }
-
-
+ // TODO - one junit relies on this. remove
public boolean equals( Object o )
{
if ( this == o ) return true;
@@ -313,18 +299,4 @@ public class Area3DPtg extends OperandPtg implements AreaI {
return true;
}
-
- public int hashCode()
- {
- // TODO - hashCode seems to be unused
- 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;
- }
-
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaAPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaAPtg.java
deleted file mode 100644
index 6ff0b05b16..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/AreaAPtg.java
+++ /dev/null
@@ -1,68 +0,0 @@
-
-/* ====================================================================
- 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.
-==================================================================== */
-
-/*
- * AreaPtg.java
- *
- * Created on November 17, 2001, 9:30 PM
- */
-package org.apache.poi.hssf.record.formula;
-
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
-import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.util.AreaReference;
-import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * Specifies a rectangular area of cells A1:A4 for instance.
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-
-public final class AreaAPtg extends AreaPtg {
- public final static short sid = 0x65;
-
- protected AreaAPtg() {
- //Required for clone methods
- }
-
- public AreaAPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
- super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
- }
-
- public AreaAPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getAreaPtgName() {
- return "AreaAPtg";
- }
-
- public Object clone() {
- AreaAPtg ptg = new AreaAPtg();
- ptg.setFirstRow(getFirstRow());
- ptg.setLastRow(getLastRow());
- ptg.setFirstColumnRaw(getFirstColumnRaw());
- ptg.setLastColumnRaw(getLastColumnRaw());
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
index 187957e587..ea7add72dc 100644
--- a/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
@@ -17,73 +17,40 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.util.LittleEndian;
/**
* AreaErr - handles deleted cell area references.
*
* @author Daniel Noll (daniel at nuix dot com dot au)
*/
-public class AreaErrPtg extends AreaPtg
-{
+public final class AreaErrPtg extends OperandPtg {
public final static byte sid = 0x2b;
- private AreaErrPtg()
- {
- //Required for clone methods
- super();
- }
-
- public AreaErrPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String toString()
- {
- StringBuffer buffer = new StringBuffer();
-
- buffer.append("AreaErrPtg\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("firstColRowRel= "
- + isFirstRowRelative()).append("\n");
- buffer.append("lastColRowRel = "
- + isLastRowRelative()).append("\n");
- buffer.append("firstColRel = " + isFirstColRelative()).append("\n");
- buffer.append("lastColRel = " + isLastColRelative()).append("\n");
- return buffer.toString();
+ public AreaErrPtg(RecordInputStream in) {
+ // 8 bytes unused:
+ in.readInt();
+ in.readInt();
}
public void writeBytes(byte [] array, int offset) {
- super.writeBytes(array, offset);
- array[offset] = (byte) (sid + ptgClass);
+ array[offset] = (byte) (sid + getPtgClass());
+ LittleEndian.putInt(array, offset+1, 0);
+ LittleEndian.putInt(array, offset+5, 0);
}
- public String toFormulaString(HSSFWorkbook book)
- {
+ public String toFormulaString(HSSFWorkbook book) {
return "#REF!";
}
-
- public Object clone()
- {
- AreaErrPtg ptg = new AreaErrPtg();
- ptg.setFirstRow(getFirstRow());
- ptg.setFirstColumn(getFirstColumn());
- ptg.setLastRow(getLastRow());
- ptg.setLastColumn(getLastColumn());
- ptg.setFirstColRelative(isFirstColRelative());
- ptg.setLastColRelative(isLastColRelative());
- ptg.setFirstRowRelative(isFirstRowRelative());
- ptg.setLastRowRelative(isLastRowRelative());
- ptg.setClass(ptgClass);
- return ptg;
- }
+
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_REF;
+ }
+
+ public int getSize() {
+ return 9;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaNAPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaNAPtg.java
deleted file mode 100644
index bf3ebce871..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/AreaNAPtg.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * Specifies a rectangular area of cells A1:A4 for instance.
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-
-public final class AreaNAPtg extends AreaPtg
-{
- public final static short sid = 0x6D;
-
- protected AreaNAPtg() {
- //Required for clone methods
- }
-
- public AreaNAPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getAreaPtgName() {
- return "AreaNAPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
-
- public Object clone() {
- throw notImplemented();
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaNPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaNPtg.java
index b5e1ca490e..bf013838b2 100644
--- a/src/java/org/apache/poi/hssf/record/formula/AreaNPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/AreaNPtg.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -16,49 +15,22 @@
limitations under the License.
==================================================================== */
-/*
- * AreaPtg.java
- *
- * Created on November 17, 2001, 9:30 PM
- */
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.util.AreaReference;
-import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* Specifies a rectangular area of cells A1:A4 for instance.
* @author Jason Height (jheight at chariot dot net dot au)
*/
+public final class AreaNPtg extends AreaPtgBase {
+ public final static short sid = 0x2D;
-public final class AreaNPtg extends AreaPtg
-{
- public final static short sid = 0x2D;
-
- protected AreaNPtg() {
- //Required for clone methods
- }
-
- public AreaNPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getAreaPtgName() {
- return "AreaNPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
+ public AreaNPtg(RecordInputStream in) {
+ super(in);
+ }
- public Object clone() {
- throw notImplemented();
- }
+ protected byte getSid() {
+ return sid;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaNVPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaNVPtg.java
deleted file mode 100644
index d5f0c38cc8..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/AreaNVPtg.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * Specifies a rectangular area of cells A1:A4 for instance.
- * @author andy
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class AreaNVPtg extends AreaPtg {
- public final static short sid = 0x4D;
-
- protected AreaNVPtg() {
- //Required for clone methods
- }
-
- public AreaNVPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getAreaPtgName() {
- return "AreaNVPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
-
- public Object clone() {
- throw notImplemented();
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
index 29d5782e08..0839e5570a 100644..100755
--- a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
@@ -17,302 +17,25 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
-
-import org.apache.poi.hssf.util.AreaReference;
-import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
/**
* Specifies a rectangular area of cells A1:A4 for instance.
- * @author andy
* @author Jason Height (jheight at chariot dot net dot au)
*/
-public class AreaPtg extends OperandPtg implements AreaI {
- /**
- * TODO - (May-2008) fix subclasses of AreaPtg 'AreaN~' which are used in shared formulas.
- * see similar comment in ReferencePtg
- */
- protected final RuntimeException notImplemented() {
- return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
- }
-
+public final class AreaPtg extends AreaPtgBase {
public final static short sid = 0x25;
- private final static int SIZE = 9;
- /** zero based, unsigned 16 bit */
- private int field_1_first_row;
- /** zero based, unsigned 16 bit */
- private int field_2_last_row;
- /** zero based, unsigned 8 bit */
- private int field_3_first_column;
- /** zero based, unsigned 8 bit */
- private int field_4_last_column;
-
- private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
- private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
- private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF);
-
- protected AreaPtg() {
- //Required for clone methods
- }
-
- public AreaPtg(String arearef) {
- AreaReference ar = new AreaReference(arearef);
- CellReference firstCell = ar.getFirstCell();
- CellReference lastCell = ar.getLastCell();
- setFirstRow(firstCell.getRow());
- setFirstColumn(firstCell.getCol());
- setLastRow(lastCell.getRow());
- setLastColumn(lastCell.getCol());
- setFirstColRelative(!firstCell.isColAbsolute());
- setLastColRelative(!lastCell.isColAbsolute());
- setFirstRowRelative(!firstCell.isRowAbsolute());
- setLastRowRelative(!lastCell.isRowAbsolute());
- }
-
- public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn,
- boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
-
- checkColumnBounds(firstColumn);
- checkColumnBounds(lastColumn);
- checkRowBounds(firstRow);
- checkRowBounds(lastRow);
- setFirstRow(firstRow);
- setLastRow(lastRow);
- setFirstColumn(firstColumn);
- setLastColumn(lastColumn);
- setFirstRowRelative(firstRowRelative);
- setLastRowRelative(lastRowRelative);
- setFirstColRelative(firstColRelative);
- setLastColRelative(lastColRelative);
- }
- private static void checkColumnBounds(int colIx) {
- if((colIx & 0x0FF) != colIx) {
- throw new IllegalArgumentException("colIx (" + colIx + ") is out of range");
- }
- }
- private static void checkRowBounds(int rowIx) {
- if((rowIx & 0x0FFFF) != rowIx) {
- throw new IllegalArgumentException("rowIx (" + rowIx + ") is out of range");
- }
+ public AreaPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
+ super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
}
-
- public AreaPtg(RecordInputStream in)
- {
- field_1_first_row = in.readUShort();
- field_2_last_row = in.readUShort();
- field_3_first_column = in.readUShort();
- field_4_last_column = in.readUShort();
- //System.out.println(toString());
- }
-
- public String getAreaPtgName() {
- return "AreaPtg";
- }
-
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append(getClass().getName());
- sb.append(" [");
- sb.append(AreaReference.formatAsString(this));
- sb.append("]");
- return sb.toString();
- }
-
- public void writeBytes(byte [] array, int offset) {
- array[offset] = (byte) (sid + ptgClass);
- LittleEndian.putShort(array,offset+1,(short)field_1_first_row);
- LittleEndian.putShort(array,offset+3,(short)field_2_last_row);
- LittleEndian.putShort(array,offset+5,(short)field_3_first_column);
- LittleEndian.putShort(array,offset+7,(short)field_4_last_column);
- }
-
- public int getSize()
- {
- return SIZE;
- }
-
- /**
- * @return the first row in the area
- */
- public int getFirstRow()
- {
- return field_1_first_row;
- }
-
- /**
- * sets the first row
- * @param rowIx number (0-based)
- */
- public void setFirstRow(int rowIx) {
- checkRowBounds(rowIx);
- field_1_first_row = rowIx;
- }
-
- /**
- * @return last row in the range (x2 in x1,y1-x2,y2)
- */
- public int getLastRow()
- {
- return field_2_last_row;
- }
-
- /**
- * @param rowIx last row number in the area
- */
- public void setLastRow(int rowIx) {
- checkRowBounds(rowIx);
- field_2_last_row = rowIx;
- }
-
- /**
- * @return the first column number in the area.
- */
- public int getFirstColumn()
- {
- return columnMask.getValue(field_3_first_column);
- }
-
- /**
- * @return the first column number + the options bit settings unstripped
- */
- public short getFirstColumnRaw()
- {
- return (short) field_3_first_column; // TODO
- }
-
- /**
- * @return whether or not the first row is a relative reference or not.
- */
- public boolean isFirstRowRelative()
- {
- return rowRelative.isSet(field_3_first_column);
+ public AreaPtg(RecordInputStream in) {
+ super(in);
}
-
- /**
- * sets the first row to relative or not
- * @param rel is relative or not.
- */
- public void setFirstRowRelative(boolean rel) {
- field_3_first_column=rowRelative.setBoolean(field_3_first_column,rel);
- }
-
- /**
- * @return isrelative first column to relative or not
- */
- public boolean isFirstColRelative()
- {
- return colRelative.isSet(field_3_first_column);
- }
-
- /**
- * set whether the first column is relative
- */
- public void setFirstColRelative(boolean rel) {
- field_3_first_column=colRelative.setBoolean(field_3_first_column,rel);
- }
-
- /**
- * set the first column in the area
- */
- public void setFirstColumn(int colIx) {
- checkColumnBounds(colIx);
- field_3_first_column=columnMask.setValue(field_3_first_column, colIx);
- }
-
- /**
- * set the first column irespective of the bitmasks
- */
- public void setFirstColumnRaw(int column)
- {
- field_3_first_column = column;
- }
-
- /**
- * @return lastcolumn in the area
- */
- public int getLastColumn()
- {
- return columnMask.getValue(field_4_last_column);
- }
-
- /**
- * @return last column and bitmask (the raw field)
- */
- public short getLastColumnRaw()
- {
- return (short) field_4_last_column;
- }
-
- /**
- * @return last row relative or not
- */
- public boolean isLastRowRelative()
- {
- return rowRelative.isSet(field_4_last_column);
- }
-
- /**
- * set whether the last row is relative or not
- * @param rel <code>true</code> if the last row relative, else
- * <code>false</code>
- */
- public void setLastRowRelative(boolean rel) {
- field_4_last_column=rowRelative.setBoolean(field_4_last_column,rel);
- }
-
- /**
- * @return lastcol relative or not
- */
- public boolean isLastColRelative()
- {
- return colRelative.isSet(field_4_last_column);
- }
-
- /**
- * set whether the last column should be relative or not
- */
- public void setLastColRelative(boolean rel) {
- field_4_last_column=colRelative.setBoolean(field_4_last_column,rel);
- }
-
-
- /**
- * set the last column in the area
- */
- public void setLastColumn(int colIx) {
- checkColumnBounds(colIx);
- field_4_last_column=columnMask.setValue(field_4_last_column, colIx);
- }
-
- /**
- * set the last column irrespective of the bitmasks
- */
- public void setLastColumnRaw(short column)
- {
- field_4_last_column = column;
- }
-
- public String toFormulaString(HSSFWorkbook book) {
- return AreaReference.formatAsString(this);
- }
-
- public byte getDefaultOperandClass() {
- return Ptg.CLASS_REF;
- }
-
- public Object clone() {
- AreaPtg ptg = new AreaPtg();
- ptg.field_1_first_row = field_1_first_row;
- ptg.field_2_last_row = field_2_last_row;
- ptg.field_3_first_column = field_3_first_column;
- ptg.field_4_last_column = field_4_last_column;
- ptg.setClass(ptgClass);
- return ptg;
- }
-
+ public AreaPtg(String arearef) {
+ super(arearef);
+ }
+ protected byte getSid() {
+ return sid;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java b/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java
new file mode 100644
index 0000000000..62eb9be83f
--- /dev/null
+++ b/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java
@@ -0,0 +1,286 @@
+/* ====================================================================
+ 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.util.LittleEndian;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+
+import org.apache.poi.hssf.util.AreaReference;
+import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.record.RecordInputStream;
+
+/**
+ * Specifies a rectangular area of cells A1:A4 for instance.
+ * @author andy
+ * @author Jason Height (jheight at chariot dot net dot au)
+ */
+public abstract class AreaPtgBase extends OperandPtg implements AreaI {
+ /**
+ * TODO - (May-2008) fix subclasses of AreaPtg 'AreaN~' which are used in shared formulas.
+ * see similar comment in ReferencePtg
+ */
+ protected final RuntimeException notImplemented() {
+ return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
+ }
+
+ public final static short sid = 0x25;
+ private final static int SIZE = 9;
+ /** zero based, unsigned 16 bit */
+ private int field_1_first_row;
+ /** zero based, unsigned 16 bit */
+ private int field_2_last_row;
+ /** zero based, unsigned 8 bit */
+ private int field_3_first_column;
+ /** zero based, unsigned 8 bit */
+ private int field_4_last_column;
+
+ private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+ private final static BitField colRelative = BitFieldFactory.getInstance(0x4000);
+ private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF);
+
+ protected AreaPtgBase(String arearef) {
+ AreaReference ar = new AreaReference(arearef);
+ CellReference firstCell = ar.getFirstCell();
+ CellReference lastCell = ar.getLastCell();
+ setFirstRow(firstCell.getRow());
+ setFirstColumn(firstCell.getCol());
+ setLastRow(lastCell.getRow());
+ setLastColumn(lastCell.getCol());
+ setFirstColRelative(!firstCell.isColAbsolute());
+ setLastColRelative(!lastCell.isColAbsolute());
+ setFirstRowRelative(!firstCell.isRowAbsolute());
+ setLastRowRelative(!lastCell.isRowAbsolute());
+ }
+
+ protected AreaPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn,
+ boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
+
+ checkColumnBounds(firstColumn);
+ checkColumnBounds(lastColumn);
+ checkRowBounds(firstRow);
+ checkRowBounds(lastRow);
+ setFirstRow(firstRow);
+ setLastRow(lastRow);
+ setFirstColumn(firstColumn);
+ setLastColumn(lastColumn);
+ setFirstRowRelative(firstRowRelative);
+ setLastRowRelative(lastRowRelative);
+ setFirstColRelative(firstColRelative);
+ setLastColRelative(lastColRelative);
+ }
+
+ private static void checkColumnBounds(int colIx) {
+ if((colIx & 0x0FF) != colIx) {
+ throw new IllegalArgumentException("colIx (" + colIx + ") is out of range");
+ }
+ }
+ private static void checkRowBounds(int rowIx) {
+ if((rowIx & 0x0FFFF) != rowIx) {
+ throw new IllegalArgumentException("rowIx (" + rowIx + ") is out of range");
+ }
+ }
+
+ protected AreaPtgBase(RecordInputStream in)
+ {
+ field_1_first_row = in.readUShort();
+ field_2_last_row = in.readUShort();
+ field_3_first_column = in.readUShort();
+ field_4_last_column = in.readUShort();
+ }
+
+ public final String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(getClass().getName());
+ sb.append(" [");
+ sb.append(AreaReference.formatAsString(this));
+ sb.append("]");
+ return sb.toString();
+ }
+ protected abstract byte getSid();
+
+ public final void writeBytes(byte [] array, int offset) {
+ array[offset] = (byte) (getSid() + getPtgClass());
+ LittleEndian.putShort(array,offset+1,(short)field_1_first_row);
+ LittleEndian.putShort(array,offset+3,(short)field_2_last_row);
+ LittleEndian.putShort(array,offset+5,(short)field_3_first_column);
+ LittleEndian.putShort(array,offset+7,(short)field_4_last_column);
+ }
+
+
+ public final int getSize() {
+ return SIZE;
+ }
+
+ /**
+ * @return the first row in the area
+ */
+ public final int getFirstRow() {
+ return field_1_first_row;
+ }
+
+ /**
+ * sets the first row
+ * @param rowIx number (0-based)
+ */
+ public final void setFirstRow(int rowIx) {
+ checkRowBounds(rowIx);
+ field_1_first_row = rowIx;
+ }
+
+ /**
+ * @return last row in the range (x2 in x1,y1-x2,y2)
+ */
+ public final int getLastRow() {
+ return field_2_last_row;
+ }
+
+ /**
+ * @param rowIx last row number in the area
+ */
+ public final void setLastRow(int rowIx) {
+ checkRowBounds(rowIx);
+ field_2_last_row = rowIx;
+ }
+
+ /**
+ * @return the first column number in the area.
+ */
+ public final int getFirstColumn() {
+ return columnMask.getValue(field_3_first_column);
+ }
+
+ /**
+ * @return the first column number + the options bit settings unstripped
+ */
+ public final short getFirstColumnRaw() {
+ return (short) field_3_first_column; // TODO
+ }
+
+ /**
+ * @return whether or not the first row is a relative reference or not.
+ */
+ public final boolean isFirstRowRelative() {
+ return rowRelative.isSet(field_3_first_column);
+ }
+
+ /**
+ * sets the first row to relative or not
+ * @param rel is relative or not.
+ */
+ public final void setFirstRowRelative(boolean rel) {
+ field_3_first_column=rowRelative.setBoolean(field_3_first_column,rel);
+ }
+
+ /**
+ * @return isrelative first column to relative or not
+ */
+ public final boolean isFirstColRelative() {
+ return colRelative.isSet(field_3_first_column);
+ }
+
+ /**
+ * set whether the first column is relative
+ */
+ public final void setFirstColRelative(boolean rel) {
+ field_3_first_column=colRelative.setBoolean(field_3_first_column,rel);
+ }
+
+ /**
+ * set the first column in the area
+ */
+ public final void setFirstColumn(int colIx) {
+ checkColumnBounds(colIx);
+ field_3_first_column=columnMask.setValue(field_3_first_column, colIx);
+ }
+
+ /**
+ * set the first column irrespective of the bitmasks
+ */
+ public final void setFirstColumnRaw(int column) {
+ field_3_first_column = column;
+ }
+
+ /**
+ * @return lastcolumn in the area
+ */
+ public final int getLastColumn() {
+ return columnMask.getValue(field_4_last_column);
+ }
+
+ /**
+ * @return last column and bitmask (the raw field)
+ */
+ public final short getLastColumnRaw() {
+ return (short) field_4_last_column;
+ }
+
+ /**
+ * @return last row relative or not
+ */
+ public final boolean isLastRowRelative() {
+ return rowRelative.isSet(field_4_last_column);
+ }
+
+ /**
+ * set whether the last row is relative or not
+ * @param rel <code>true</code> if the last row relative, else
+ * <code>false</code>
+ */
+ public final void setLastRowRelative(boolean rel) {
+ field_4_last_column=rowRelative.setBoolean(field_4_last_column,rel);
+ }
+
+ /**
+ * @return lastcol relative or not
+ */
+ public final boolean isLastColRelative() {
+ return colRelative.isSet(field_4_last_column);
+ }
+
+ /**
+ * set whether the last column should be relative or not
+ */
+ public final void setLastColRelative(boolean rel) {
+ field_4_last_column=colRelative.setBoolean(field_4_last_column,rel);
+ }
+
+ /**
+ * set the last column in the area
+ */
+ public final void setLastColumn(int colIx) {
+ checkColumnBounds(colIx);
+ field_4_last_column=columnMask.setValue(field_4_last_column, colIx);
+ }
+
+ /**
+ * set the last column irrespective of the bitmasks
+ */
+ public final void setLastColumnRaw(short column) {
+ field_4_last_column = column;
+ }
+
+ public String toFormulaString(HSSFWorkbook book) {
+ return AreaReference.formatAsString(this);
+ }
+
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_REF;
+ }
+}
diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaVPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaVPtg.java
deleted file mode 100644
index e5e3d525cc..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/AreaVPtg.java
+++ /dev/null
@@ -1,71 +0,0 @@
-
-/* ====================================================================
- 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.
-==================================================================== */
-
-/*
- * AreaPtg.java
- *
- * Created on November 17, 2001, 9:30 PM
- */
-package org.apache.poi.hssf.record.formula;
-
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
-import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.util.AreaReference;
-import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * Specifies a rectangular area of cells A1:A4 for instance.
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-
-public final class AreaVPtg
- extends AreaPtg
-{
- public final static short sid = 0x45;
-
- protected AreaVPtg() {
- //Required for clone methods
- }
-
- public AreaVPtg(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
- super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
- }
-
-
- public AreaVPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getAreaPtgName() {
- return "AreaVPtg";
- }
-
- public Object clone() {
- AreaVPtg ptg = new AreaVPtg();
- ptg.setFirstRow(getFirstRow());
- ptg.setLastRow(getLastRow());
- ptg.setFirstColumnRaw(getFirstColumnRaw());
- ptg.setLastColumnRaw(getLastColumnRaw());
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java b/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
index 99495a5d22..43e3d04e3e 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
@@ -35,29 +35,28 @@ import org.apache.poi.util.LittleEndian;
*
* @author Jason Height (jheight at chariot dot net dot au)
*/
-public class ArrayPtg extends Ptg {
+public final class ArrayPtg extends Ptg {
public static final byte sid = 0x20;
private static final int RESERVED_FIELD_LEN = 7;
// TODO - fix up field visibility and subclasses
- protected byte[] field_1_reserved;
+ private byte[] field_1_reserved;
+
// data from these fields comes after the Ptg data of all tokens in current formula
- protected short token_1_columns;
- protected short token_2_rows;
- protected Object[] token_3_arrayValues;
-
- protected ArrayPtg() {
- //Required for clone methods
- }
+ private short token_1_columns;
+ private short token_2_rows;
+ private Object[] token_3_arrayValues;
- public ArrayPtg(RecordInputStream in)
- {
+ public ArrayPtg(RecordInputStream in) {
field_1_reserved = new byte[RESERVED_FIELD_LEN];
// TODO - add readFully method to RecordInputStream
for(int i=0; i< RESERVED_FIELD_LEN; i++) {
field_1_reserved[i] = in.readByte();
}
}
+ public Object[] getTokenArrayValues() {
+ return (Object[]) token_3_arrayValues.clone();
+ }
public boolean isBaseToken() {
return false;
@@ -117,7 +116,7 @@ public class ArrayPtg extends Ptg {
public void writeBytes(byte[] data, int offset) {
- LittleEndian.putByte(data, offset + 0, sid + ptgClass);
+ LittleEndian.putByte(data, offset + 0, sid + getPtgClass());
System.arraycopy(field_1_reserved, 0, data, offset+1, RESERVED_FIELD_LEN);
}
@@ -190,13 +189,9 @@ public class ArrayPtg extends Ptg {
}
public Object clone() {
- ArrayPtg ptg = new ArrayPtg();
+ ArrayPtg ptg = (ArrayPtg) super.clone();
ptg.field_1_reserved = (byte[]) field_1_reserved.clone();
-
- ptg.token_1_columns = token_1_columns;
- ptg.token_2_rows = token_2_rows;
ptg.token_3_arrayValues = (Object[]) token_3_arrayValues.clone();
- ptg.setClass(ptgClass);
return ptg;
}
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ArrayPtgA.java b/src/java/org/apache/poi/hssf/record/formula/ArrayPtgA.java
deleted file mode 100644
index 5be866e963..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/ArrayPtgA.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-
-/**
- * ArrayPtgA - handles arrays
- *
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class ArrayPtgA extends ArrayPtg {
- public final static byte sid = 0x60;
-
- private ArrayPtgA() {
- //Required for clone methods
- }
-
- public ArrayPtgA(RecordInputStream in) {
- super(in);
- }
-
- public Object clone() {
- ArrayPtgA ptg = new ArrayPtgA();
- ptg.field_1_reserved = (byte[]) field_1_reserved.clone();
-
- ptg.token_1_columns = token_1_columns;
- ptg.token_2_rows = token_2_rows;
- ptg.token_3_arrayValues = (Object[]) token_3_arrayValues.clone();
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ArrayPtgV.java b/src/java/org/apache/poi/hssf/record/formula/ArrayPtgV.java
deleted file mode 100644
index ba955654aa..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/ArrayPtgV.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-
-/**
- * ArrayPtg - handles arrays
- *
- * The ArrayPtg is a little weird, the size of the Ptg when parsing initially only
- * includes the Ptg sid and the reserved bytes. The next Ptg in the expression then follows.
- * It is only after the "size" of all the Ptgs is met, that the ArrayPtg data is actually
- * held after this. So Ptg.createParsedExpression keeps track of the number of
- * ArrayPtg elements and need to parse the data upto the FORMULA record size.
- *
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class ArrayPtgV extends ArrayPtg {
- public final static byte sid = 0x40;
-
- private ArrayPtgV() {
- //Required for clone methods
- }
-
- public ArrayPtgV(RecordInputStream in) {
- super(in);
- }
-
- public Object clone() {
- ArrayPtgV ptg = new ArrayPtgV();
- ptg.field_1_reserved = (byte[]) field_1_reserved.clone();
-
- ptg.token_1_columns = token_1_columns;
- ptg.token_2_rows = token_2_rows;
- ptg.token_3_arrayValues = (Object[]) token_3_arrayValues.clone();
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java b/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
index e3342a0339..ce8a6ac409 100644
--- a/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
@@ -30,11 +30,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
public final class BoolPtg extends ScalarConstantPtg {
public final static int SIZE = 2;
public final static byte sid = 0x1d;
- private boolean field_1_value;
-
- private BoolPtg() {
- //Required for clone methods
- }
+ private final boolean field_1_value;
public BoolPtg(RecordInputStream in)
{
@@ -46,11 +42,6 @@ public final class BoolPtg extends ScalarConstantPtg {
field_1_value = (formulaToken.equals("TRUE"));
}
- public void setValue(boolean value)
- {
- field_1_value = value;
- }
-
public boolean getValue()
{
return field_1_value;
@@ -71,10 +62,4 @@ public final class BoolPtg extends ScalarConstantPtg {
{
return field_1_value ? "TRUE" : "FALSE";
}
-
- public Object clone() {
- BoolPtg ptg = new BoolPtg();
- ptg.field_1_value = field_1_value;
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java b/src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java
index e77382a34a..28cca4f2e9 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ConcatPtg.java
@@ -17,54 +17,29 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
*
* @author andy
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class ConcatPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x08;
private final static String CONCAT = "&";
- public ConcatPtg(RecordInputStream in)
- {
- // No contents
- }
-
- public ConcatPtg() {
-
- }
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
+ public static final ValueOperatorPtg instance = new ConcatPtg();
- public int getSize()
- {
- return SIZE;
+ private ConcatPtg() {
+ // enforce singleton
}
-
- public int getType()
- {
- return TYPE_BINARY;
+
+ protected byte getSid() {
+ return sid;
}
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
-
- public String toFormulaString(HSSFWorkbook book)
- {
- return CONCAT;
- }
-
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
@@ -74,9 +49,4 @@ public final class ConcatPtg extends ValueOperatorPtg {
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new ConcatPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/DividePtg.java b/src/java/org/apache/poi/hssf/record/formula/DividePtg.java
index 60efad4f6a..fd5f86aabe 100644
--- a/src/java/org/apache/poi/hssf/record/formula/DividePtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/DividePtg.java
@@ -17,66 +17,34 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* This PTG implements the standard binomial divide "/"
* @author Andrew C. Oliver acoliver at apache dot org
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class DividePtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x06;
- /** Creates new AddPtg */
-
- public DividePtg()
- {
- }
-
- public DividePtg(RecordInputStream in)
- {
+ public static final ValueOperatorPtg instance = new DividePtg();
- // doesn't need anything
+ private DividePtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
+
+ protected byte getSid() {
+ return sid;
}
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
- public String toFormulaString(HSSFWorkbook book)
- {
- return "/";
- }
-
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(toFormulaString((HSSFWorkbook)null));
+ buffer.append("/");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- DividePtg ptg = new DividePtg();
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/EqualPtg.java b/src/java/org/apache/poi/hssf/record/formula/EqualPtg.java
index b8023d8455..7fbd17330d 100644
--- a/src/java/org/apache/poi/hssf/record/formula/EqualPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/EqualPtg.java
@@ -17,67 +17,34 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
*
* @author andy
*/
public final class EqualPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x0b;
- /** Creates new AddPtg */
-
- public EqualPtg()
- {
- }
-
- public EqualPtg(RecordInputStream in)
- {
+ public static final ValueOperatorPtg instance = new EqualPtg();
- // doesn't need anything
+ private EqualPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
+
+ protected byte getSid() {
+ return sid;
}
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
-
- public String toFormulaString(HSSFWorkbook book)
- {
- return "=";
- }
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(toFormulaString((HSSFWorkbook)null));
+ buffer.append("=");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new EqualPtg();
- }
-
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
index 650ba054f6..7e67343bd3 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
@@ -47,7 +47,7 @@ public final class ErrPtg extends ScalarConstantPtg {
public static final short sid = 0x1c;
private static final int SIZE = 2;
- private int field_1_error_code;
+ private final int field_1_error_code;
/** Creates new ErrPtg */
@@ -64,7 +64,7 @@ public final class ErrPtg extends ScalarConstantPtg {
public void writeBytes(byte [] array, int offset)
{
- array[offset] = (byte) (sid + ptgClass);
+ array[offset] = (byte) (sid + getPtgClass());
array[offset + 1] = (byte)field_1_error_code;
}
@@ -76,10 +76,6 @@ public final class ErrPtg extends ScalarConstantPtg {
return SIZE;
}
- public Object clone() {
- return new ErrPtg(field_1_error_code);
- }
-
public int getErrorCode() {
return field_1_error_code;
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
index c4a0c33fee..894b13ea47 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -30,20 +29,11 @@ import org.apache.poi.util.LittleEndian;
* @author Jason Height (jheight at chariot dot net dot au)
* @author dmui (save existing implementation)
*/
-
public final class ExpPtg extends ControlPtg {
private final static int SIZE = 5;
public final static short sid = 0x1;
- private short field_1_first_row;
- private short field_2_first_col;
-
- /** Creates new ExpPtg */
-
- public ExpPtg()
- {
- }
-
- /** Creates new ExpPtg */
+ private final short field_1_first_row;
+ private final short field_2_first_col;
public ExpPtg(RecordInputStream in)
{
@@ -83,12 +73,4 @@ public final class ExpPtg extends ControlPtg {
buffer.append("col = ").append(getColumn()).append("\n");
return buffer.toString();
}
-
- public Object clone() {
- ExpPtg result = new ExpPtg();
- result.field_1_first_row = field_1_first_row;
- result.field_2_first_col = field_2_first_col;
- return result;
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java b/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java
index cea44ed430..c0034b24fb 100644
--- a/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java
@@ -56,7 +56,7 @@ public final class FuncPtg extends AbstractFunctionPtg {
}
public void writeBytes(byte[] array, int offset) {
- array[offset+0]= (byte) (sid + ptgClass);
+ array[offset+0]= (byte) (sid + getPtgClass());
LittleEndian.putShort(array,offset+1,field_2_fnc_index);
}
@@ -64,12 +64,6 @@ public final class FuncPtg extends AbstractFunctionPtg {
return numParams;
}
- public Object clone() {
- FuncPtg ptg = new FuncPtg(field_2_fnc_index);
- ptg.setClass(ptgClass);
- return ptg;
- }
-
public int getSize() {
return SIZE;
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java b/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java
index e3d2e77310..fd3546250a 100644
--- a/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java
@@ -30,11 +30,7 @@ public final class FuncVarPtg extends AbstractFunctionPtg{
public final static byte sid = 0x22;
private final static int SIZE = 4;
- private FuncVarPtg() {
- //Required for clone methods
- }
-
- /**Creates new function pointer from a byte array
+ /**Creates new function pointer from a byte array
* usually called while reading an excel file.
*/
public FuncVarPtg(RecordInputStream in) {
@@ -69,7 +65,7 @@ public final class FuncVarPtg extends AbstractFunctionPtg{
}
public void writeBytes(byte[] array, int offset) {
- array[offset+0]=(byte) (sid + ptgClass);
+ array[offset+0]=(byte) (sid + getPtgClass());
array[offset+1]=field_1_num_args;
LittleEndian.putShort(array,offset+2,field_2_fnc_index);
}
@@ -78,14 +74,6 @@ public final class FuncVarPtg extends AbstractFunctionPtg{
return field_1_num_args;
}
- public Object clone() {
- FuncVarPtg ptg = new FuncVarPtg();
- ptg.field_1_num_args = field_1_num_args;
- ptg.field_2_fnc_index = field_2_fnc_index;
- ptg.setClass(ptgClass);
- return ptg;
- }
-
public int getSize() {
return SIZE;
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java b/src/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java
index 652c454ec4..f46191ed84 100755
--- a/src/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/GreaterEqualPtg.java
@@ -17,8 +17,6 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
* PTG class to implement greater or equal to
@@ -29,56 +27,28 @@ public final class GreaterEqualPtg extends ValueOperatorPtg {
public final static int SIZE = 1;
public final static byte sid = 0x0c;
- /** Creates new GreaterEqualPtg */
+ public static final ValueOperatorPtg instance = new GreaterEqualPtg();
- public GreaterEqualPtg()
- {
+ private GreaterEqualPtg() {
+ // enforce singleton
}
-
- public GreaterEqualPtg(RecordInputStream in)
- {
-
- // doesn't need anything
- }
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
+
+ protected byte getSid() {
+ return sid;
}
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
- public String toFormulaString(HSSFWorkbook book)
- {
- return ">=";
- }
-
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(toFormulaString((HSSFWorkbook)null));
+ buffer.append(">=");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new GreaterEqualPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java b/src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java
index 44a1d0e8ea..248cf6ff4a 100644
--- a/src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/GreaterThanPtg.java
@@ -17,82 +17,34 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* Greater than operator PTG ">"
* @author Cameron Riley (criley at ekmail.com)
*/
public final class GreaterThanPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x0D;
private final static String GREATERTHAN = ">";
- /**
- * Constructor. Creates new GreaterThanPtg
- */
- public GreaterThanPtg()
- {
- //deliberately empty
- }
+ public static final ValueOperatorPtg instance = new GreaterThanPtg();
- /**
- * Constructor. Create a new GreaterThanPtg.
- * @param in the RecordInputstream to read the record from
- */
- public GreaterThanPtg(RecordInputStream in)
- {
- //deliberately empty
+ private GreaterThanPtg() {
+ // enforce singleton
}
- /**
- * Write the sid to an array
- * @param array the array of bytes to write the sid to
- * @param offset the offset to add the sid to
- */
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- /**
- * Get the size of the sid
- * @return int the size of the sid in terms of byte additions to an array
- */
- public int getSize()
- {
- return SIZE;
- }
-
- /**
- * Get the type of PTG for Greater Than
- * @return int the identifier for the type
- */
- public int getType()
- {
- return TYPE_BINARY;
+ protected byte getSid() {
+ return sid;
}
/**
* Get the number of operands for the Less than operator
* @return int the number of operands
*/
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
/**
- * Implementation of method from Ptg
- * @param book the Sheet References
- */
- public String toFormulaString(HSSFWorkbook book)
- {
- return this.GREATERTHAN;
- }
-
- /**
* Implementation of method from OperationsPtg
* @param operands a String array of operands
* @return String the Formula as a String
@@ -102,17 +54,8 @@ public final class GreaterThanPtg extends ValueOperatorPtg {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(this.GREATERTHAN);
+ buffer.append(GREATERTHAN);
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- /**
- * Implementation of clone method from Object
- * @return Object a clone of this class as an Object
- */
- public Object clone()
- {
- return new GreaterThanPtg();
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/IntPtg.java b/src/java/org/apache/poi/hssf/record/formula/IntPtg.java
index 89c806dd2e..89081ffe07 100644
--- a/src/java/org/apache/poi/hssf/record/formula/IntPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/IntPtg.java
@@ -43,13 +43,12 @@ public final class IntPtg extends ScalarConstantPtg {
public final static int SIZE = 3;
public final static byte sid = 0x1e;
- private int field_1_value;
+ private final int field_1_value;
public IntPtg(RecordInputStream in) {
this(in.readUShort());
}
-
public IntPtg(int value) {
if(!isInRange(value)) {
throw new IllegalArgumentException("value is out of range: " + value);
@@ -61,7 +60,6 @@ public final class IntPtg extends ScalarConstantPtg {
return field_1_value;
}
-
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
@@ -76,9 +74,6 @@ public final class IntPtg extends ScalarConstantPtg {
return String.valueOf(getValue());
}
- public Object clone() {
- return new IntPtg(field_1_value);
- }
public String toString() {
StringBuffer sb = new StringBuffer(64);
sb.append(getClass().getName()).append(" [");
diff --git a/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java b/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
index 27e7ec4f91..e60b2c7d11 100644
--- a/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
@@ -18,7 +18,6 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
* @author Daniel Noll (daniel at nuix dot com dot au)
@@ -26,14 +25,10 @@ import org.apache.poi.hssf.record.RecordInputStream;
public final class IntersectionPtg extends OperationPtg {
public final static byte sid = 0x0f;
+ public static final OperationPtg instance = new IntersectionPtg();
- public IntersectionPtg()
- {
- }
-
- public IntersectionPtg(RecordInputStream in)
- {
- // doesn't need anything
+ private IntersectionPtg() {
+ // enforce singleton
}
public final boolean isBaseToken() {
@@ -50,16 +45,6 @@ public final class IntersectionPtg extends OperationPtg {
array[ offset + 0 ] = sid;
}
- public Object clone()
- {
- return new IntersectionPtg();
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
/** Implementation of method from Ptg */
public String toFormulaString(HSSFWorkbook book)
{
diff --git a/src/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java b/src/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java
index fad0b90f58..99070e192f 100755
--- a/src/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/LessEqualPtg.java
@@ -19,8 +19,6 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
@@ -29,58 +27,27 @@ import org.apache.poi.hssf.record.RecordInputStream;
* @author fred at stsci dot edu
*/
public final class LessEqualPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x0a;
- /**
- * Creates new LessEqualPtg
- */
- public LessEqualPtg()
- {
+ public static final ValueOperatorPtg instance = new LessEqualPtg();
+ private LessEqualPtg() {
+ // enforce singleton
}
-
- public LessEqualPtg( RecordInputStream in )
- {
- // doesn't need anything
- }
-
- public void writeBytes( byte[] array, int offset )
- {
- array[offset + 0] = sid;
+
+ protected byte getSid() {
+ return sid;
}
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
- public String toFormulaString( HSSFWorkbook book )
- {
- return "<=";
- }
-
- public String toFormulaString( String[] operands )
- {
+ public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append( operands[0] );
- buffer.append( toFormulaString( (HSSFWorkbook) null ) );
+ buffer.append("<=");
buffer.append( operands[1] );
return buffer.toString();
}
-
- public Object clone()
- {
- return new LessEqualPtg();
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java b/src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java
index d1c6c55817..f2fd06fe2b 100644
--- a/src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/LessThanPtg.java
@@ -17,9 +17,6 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Less than operator PTG "<". The SID is taken from the
* Openoffice.orgs Documentation of the Excel File Format,
@@ -27,79 +24,31 @@ import org.apache.poi.hssf.record.RecordInputStream;
* @author Cameron Riley (criley at ekmail.com)
*/
public final class LessThanPtg extends ValueOperatorPtg {
- /** the size of the Ptg */
- public final static int SIZE = 1;
-
/** the sid for the less than operator as hex */
public final static byte sid = 0x09;
/** identifier for LESS THAN char */
private final static String LESSTHAN = "<";
- /**
- * Constructor. Creates new LessThanPtg
- */
- public LessThanPtg()
- {
- //deliberately empty
- }
+ public static final ValueOperatorPtg instance = new LessThanPtg();
- /**
- * Constructor. Create a new LessThanPtg.
- * @param in the RecordInputstream to read the record from
- */
- public LessThanPtg(RecordInputStream in)
- {
- //deliberately empty
+ private LessThanPtg() {
+ // enforce singleton
}
- /**
- * Write the sid to an array
- * @param array the array of bytes to write the sid to
- * @param offset the offset to add the sid to
- */
- public void writeBytes(byte[] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- /**
- * Get the size of the sid
- * @return int the size of the sid in terms of byte additions to an array
- */
- public int getSize()
- {
- return SIZE;
- }
-
- /**
- * Get the type of PTG for Less Than
- * @return int the identifier for the type
- */
- public int getType()
- {
- return TYPE_BINARY;
+ protected byte getSid() {
+ return sid;
}
/**
* Get the number of operands for the Less than operator
* @return int the number of operands
*/
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
- /**
- * Implementation of method from Ptg
- * @param book the Sheet References
- */
- public String toFormulaString(HSSFWorkbook book)
- {
- return this.LESSTHAN;
- }
-
- /**
+ /**
* Implementation of method from OperationsPtg
* @param operands a String array of operands
* @return String the Formula as a String
@@ -108,18 +57,8 @@ public final class LessThanPtg extends ValueOperatorPtg {
{
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(this.LESSTHAN);
+ buffer.append(LESSTHAN);
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- /**
- * Implementation of clone method from Object
- * @return Object a clone of this class as an Object
- */
- public Object clone()
- {
- return new LessThanPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
index 98e217289b..3731070ddd 100644
--- a/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
@@ -64,7 +64,7 @@ public class MemAreaPtg extends OperandPtg {
public void writeBytes(byte [] array, int offset)
{
- array[offset] = (byte) (sid + ptgClass);
+ array[offset] = (byte) (sid + getPtgClass());
LittleEndian.putInt(array, offset + 1, field_1_reserved);
LittleEndian.putShort(array, offset + 5, field_2_subex_len);
}
@@ -79,12 +79,7 @@ public class MemAreaPtg extends OperandPtg {
return ""; // TODO: Not sure how to format this. -- DN
}
- public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
-
- public Object clone() {
- MemAreaPtg ptg = new MemAreaPtg();
- ptg.field_1_reserved = field_1_reserved;
- ptg.field_2_subex_len = field_2_subex_len;
- return ptg;
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_VALUE;
}
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
index 359c76e668..7e7b9bd649 100644
--- a/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -16,17 +15,10 @@
limitations under the License.
==================================================================== */
-
-/*
- * MemErrPtg.java
- *
- * Created on November 21, 2001, 8:46 AM
- */
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
*
@@ -35,9 +27,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
* @author Daniel Noll (daniel at nuix dot com dot au)
*/
-public class MemErrPtg
- extends MemAreaPtg
-{
+public final class MemErrPtg extends MemAreaPtg {
public final static short sid = 0x27;
/** Creates new MemErrPtg */
@@ -46,26 +36,17 @@ public class MemErrPtg
{
}
- public MemErrPtg(RecordInputStream in)
- {
+ public MemErrPtg(RecordInputStream in) {
super(in);
}
- public void writeBytes(byte [] array, int offset)
- {
+ public void writeBytes(byte [] array, int offset) {
super.writeBytes(array, offset);
- array[offset] = (byte) (sid + ptgClass);
+ array[offset] = (byte) (sid + getPtgClass());
}
public String toFormulaString(HSSFWorkbook book)
{
return "ERR#";
}
-
- public Object clone() {
- MemErrPtg ptg = new MemErrPtg();
- ptg.setReserved(getReserved());
- ptg.setSubexpressionLength(getSubexpressionLength());
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
index 020b90fc5c..c8f1981ffd 100644
--- a/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
@@ -15,12 +15,6 @@
limitations under the License.
==================================================================== */
-
-/*
- * Ptg.java
- *
- * Created on October 28, 2001, 6:30 PM
- */
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
@@ -30,25 +24,23 @@ import org.apache.poi.hssf.record.RecordInputStream;
/**
* @author Glen Stampoultzis (glens at apache.org)
*/
-public class MemFuncPtg extends OperandPtg {
+public final class MemFuncPtg extends OperandPtg {
public final static byte sid = 0x29;
- private short field_1_len_ref_subexpression = 0;
-
- public MemFuncPtg()
- {
- //Required for clone methods
- }
+ private final int field_1_len_ref_subexpression;
/**Creates new function pointer from a byte array
* usually called while reading an excel file.
*/
- public MemFuncPtg( RecordInputStream in )
- {
- field_1_len_ref_subexpression = in.readShort();
+ public MemFuncPtg(RecordInputStream in) {
+ this(in.readUShort());
}
- public int getSize()
+ public MemFuncPtg(int subExprLen) {
+ field_1_len_ref_subexpression = subExprLen;
+ }
+
+ public int getSize()
{
return 3;
}
@@ -56,7 +48,7 @@ public class MemFuncPtg extends OperandPtg {
public void writeBytes( byte[] array, int offset )
{
array[offset + 0] = sid ;
- LittleEndian.putShort( array, offset + 1, (short)field_1_len_ref_subexpression );
+ LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression );
}
public String toFormulaString(HSSFWorkbook book)
@@ -66,7 +58,7 @@ public class MemFuncPtg extends OperandPtg {
public byte getDefaultOperandClass()
{
- return 0;
+ return Ptg.CLASS_REF;
}
public int getNumberOfOperands()
@@ -74,21 +66,8 @@ public class MemFuncPtg extends OperandPtg {
return field_1_len_ref_subexpression;
}
- public Object clone()
- {
- MemFuncPtg ptg = new MemFuncPtg();
- ptg.field_1_len_ref_subexpression = this.field_1_len_ref_subexpression;
- return ptg;
- }
-
public int getLenRefSubexpression()
{
return field_1_len_ref_subexpression;
}
-
- public void setLenRefSubexpression(int len)
- {
- field_1_len_ref_subexpression = (short)len;
- }
-
} \ No newline at end of file
diff --git a/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java b/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
index a08090c857..ed49520b50 100644
--- a/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
@@ -18,7 +18,6 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
* Missing Function Arguments
@@ -31,16 +30,10 @@ public final class MissingArgPtg extends ScalarConstantPtg {
private final static int SIZE = 1;
public final static byte sid = 0x16;
- public MissingArgPtg()
+ public static final Ptg instance = new MissingArgPtg();
+ private MissingArgPtg()
{
}
-
- public MissingArgPtg(RecordInputStream in)
- {
- // doesn't need anything
- }
-
-
public void writeBytes(byte [] array, int offset)
{
@@ -51,15 +44,9 @@ public final class MissingArgPtg extends ScalarConstantPtg {
{
return SIZE;
}
-
public String toFormulaString(HSSFWorkbook book)
{
return " ";
}
-
- public Object clone() {
- return new MissingArgPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java b/src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java
index 1960dc9075..f627a91903 100644
--- a/src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/MultiplyPtg.java
@@ -14,83 +14,37 @@
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.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
+package org.apache.poi.hssf.record.formula;
/**
* Implements the standard mathmatical multiplication - *
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au)
*/
-
public final class MultiplyPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x05;
- /** Creates new AddPtg */
-
- public MultiplyPtg()
- {
- }
-
- public MultiplyPtg(RecordInputStream in)
- {
+ public static final ValueOperatorPtg instance = new MultiplyPtg();
- // doesn't need anything
+ private MultiplyPtg() {
+ // enforce singleton
}
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
+ protected byte getSid() {
+ return sid;
}
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
-
- public int getStringLength() {
- return 1;
- }
-
-
- public String toFormulaString(HSSFWorkbook book)
- {
- return "*";
- }
-
- public String toFormulaString(Ptg [] operands)
- {
- StringBuffer buffer = new StringBuffer();
-
- buffer.append(operands[ 0 ].toFormulaString((HSSFWorkbook)null));
- buffer.append("*");
- buffer.append(operands[ 1 ].toFormulaString((HSSFWorkbook)null));
- return buffer.toString();
- }
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
- buffer.append(toFormulaString((HSSFWorkbook)null));
+ buffer.append("*");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new MultiplyPtg();
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/NamePtg.java b/src/java/org/apache/poi/hssf/record/formula/NamePtg.java
index f3bfd8ba26..421c4c4f5d 100644
--- a/src/java/org/apache/poi/hssf/record/formula/NamePtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/NamePtg.java
@@ -17,11 +17,10 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
+import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFName;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.NameRecord;
-import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.util.LittleEndian;
/**
*
@@ -34,12 +33,6 @@ public final class NamePtg extends OperandPtg {
/** one-based index to defined name record */
private short field_1_label_index;
private short field_2_zero; // reserved must be 0
- boolean xtra=false;
-
-
- private NamePtg() {
- //Required for clone methods
- }
/**
* Creates new NamePtg and sets its name index to that of the corresponding defined name record
@@ -69,12 +62,9 @@ public final class NamePtg extends OperandPtg {
/** Creates new NamePtg */
- public NamePtg(RecordInputStream in)
- {
- //field_1_ixti = LittleEndian.getShort(data, offset);
+ public NamePtg(RecordInputStream in) {
field_1_label_index = in.readShort();
field_2_zero = in.readShort();
- //if (data[offset+6]==0) xtra=true;
}
/**
@@ -84,15 +74,13 @@ public final class NamePtg extends OperandPtg {
return field_1_label_index-1; // convert to zero based
}
- public void writeBytes(byte [] array, int offset)
- {
- array[offset+0]= (byte) (sid + ptgClass);
+ public void writeBytes(byte [] array, int offset) {
+ array[offset+0]= (byte) (sid + getPtgClass());
LittleEndian.putShort(array,offset+1,field_1_label_index);
LittleEndian.putShort(array,offset+3, field_2_zero);
}
- public int getSize()
- {
+ public int getSize() {
return SIZE;
}
@@ -101,12 +89,7 @@ public final class NamePtg extends OperandPtg {
return book.getNameName(field_1_label_index - 1);
}
- public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
-
- public Object clone() {
- NamePtg ptg = new NamePtg();
- ptg.field_1_label_index = field_1_label_index;
- ptg.field_2_zero = field_2_zero;
- return ptg;
- }
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_REF;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java b/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
index 2c95ba3afc..b4b698142e 100644
--- a/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
@@ -33,31 +33,20 @@ public final class NameXPtg extends OperandPtg {
private short field_3_reserved; // reserved must be 0
- private NameXPtg() {
- //Required for clone methods
- }
-
- /** Creates new NamePtg */
-
- public NameXPtg(RecordInputStream in)
- {
+ public NameXPtg(RecordInputStream in) {
field_1_ixals = in.readShort();
field_2_ilbl = in.readShort();
field_3_reserved = in.readShort();
-
- //field_2_reserved = LittleEndian.getByteArray(data, offset + 12,12);
}
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = (byte)(sid + ptgClass);
+ public void writeBytes(byte [] array, int offset) {
+ array[ offset + 0 ] = (byte)(sid + getPtgClass());
LittleEndian.putShort(array, offset + 1, field_1_ixals);
LittleEndian.putShort(array,offset+3, field_2_ilbl);
LittleEndian.putShort(array, offset + 5, field_3_reserved);
}
- public int getSize()
- {
+ public int getSize() {
return SIZE;
}
@@ -67,14 +56,7 @@ public final class NameXPtg extends OperandPtg {
return book.resolveNameXText(field_1_ixals, field_2_ilbl-1);
}
- public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
-
- public Object clone() {
- NameXPtg ptg = new NameXPtg();
- ptg.field_1_ixals = field_1_ixals;
- ptg.field_3_reserved = field_3_reserved;
- ptg.field_2_ilbl = field_2_ilbl;
- ptg.setClass(ptgClass);
- return ptg;
- }
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_VALUE;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java b/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java
index 273edc01d1..62739dbd70 100755
--- a/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -18,70 +17,36 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Ptg class to implement not equal
*
* @author fred at stsci dot edu
*/
public final class NotEqualPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x0e;
- /**
- * Creates new NotEqualPtg
- */
- public NotEqualPtg()
- {
- }
-
- public NotEqualPtg( RecordInputStream in )
- {
- // doesn't need anything
- }
-
- public void writeBytes( byte[] array, int offset )
- {
- array[offset + 0] = sid;
- }
+ public static final ValueOperatorPtg instance = new NotEqualPtg();
- public int getSize()
- {
- return SIZE;
+ private NotEqualPtg() {
+ // enforce singleton
}
-
- public int getType()
- {
- return TYPE_BINARY;
+
+ protected byte getSid() {
+ return sid;
}
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
- public String toFormulaString( HSSFWorkbook book )
- {
- return "<>";
- }
-
- public String toFormulaString( String[] operands )
- {
+ public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append( operands[0] );
- buffer.append( toFormulaString( (HSSFWorkbook) null ) );
+ buffer.append("<>");
buffer.append( operands[1] );
return buffer.toString();
}
-
- public Object clone()
- {
- return new NotEqualPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java b/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
index f5e4305ccb..02b0075011 100644
--- a/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
@@ -31,16 +31,12 @@ import org.apache.poi.hssf.record.RecordInputStream;
public final class NumberPtg extends ScalarConstantPtg {
public final static int SIZE = 9;
public final static byte sid = 0x1f;
- private double field_1_value;
-
- private NumberPtg() {
- //Required for clone methods
- }
+ private final double field_1_value;
/** Create a NumberPtg from a byte array read from disk */
public NumberPtg(RecordInputStream in)
{
- setValue(in.readDouble());
+ field_1_value = in.readDouble();
}
/** Create a NumberPtg from a string representation of the number
@@ -49,13 +45,7 @@ public final class NumberPtg extends ScalarConstantPtg {
* @param value : String representation of a floating point number
*/
public NumberPtg(String value) {
- setValue(Double.parseDouble(value));
- }
-
-
- public void setValue(double value)
- {
- field_1_value = value;
+ field_1_value = Double.parseDouble(value);
}
@@ -79,10 +69,4 @@ public final class NumberPtg extends ScalarConstantPtg {
{
return "" + getValue();
}
-
- public Object clone() {
- NumberPtg ptg = new NumberPtg();
- ptg.field_1_value = field_1_value;
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java b/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java
index 77df6b3b01..085fa1e16b 100644
--- a/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java
@@ -17,21 +17,15 @@
package org.apache.poi.hssf.record.formula;
-
-
/**
* defines a Ptg that is an operation instead of an operand
* @author andy
*/
-
-public abstract class OperationPtg extends Ptg
-{
+public abstract class OperationPtg extends Ptg {
public final static int TYPE_UNARY = 0;
public final static int TYPE_BINARY = 1;
public final static int TYPE_FUNCTION = 2;
- public abstract int getType();
-
/**
* returns a string representation of the operations
* the length of the input array should equal the number returned by
@@ -45,6 +39,12 @@ public abstract class OperationPtg extends Ptg
*/
public abstract int getNumberOfOperands();
- public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_VALUE;
+ }
+ public final int getType() {
+ // TODO remove "int getType();" from Eval hierarchy
+ throw new RuntimeException("remove this method");
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java b/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
index 4cd5b57279..58c440bf11 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
@@ -37,18 +37,11 @@ public final class ParenthesisPtg extends ControlPtg {
private final static int SIZE = 1;
public final static byte sid = 0x15;
- public ParenthesisPtg()
- {
- }
-
- public ParenthesisPtg(RecordInputStream in)
- {
-
- // doesn't need anything
+ public static final ControlPtg instance = new ParenthesisPtg();
+ private ParenthesisPtg() {
+ // enforce singleton
}
-
-
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
@@ -68,9 +61,4 @@ public final class ParenthesisPtg extends ControlPtg {
public String toFormulaString(String[] operands) {
return "("+operands[0]+")";
}
-
- public Object clone() {
- return new ParenthesisPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java b/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java
index aa1e87765a..9dd7bd2be9 100644
--- a/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -16,68 +15,33 @@
limitations under the License.
==================================================================== */
-/*
- * PercentPtg.java
- *
- * Created on March 29, 2006, 9:23 PM
- */
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Percent PTG.
*
* @author Daniel Noll (daniel at nuix.com.au)
*/
-
public final class PercentPtg extends ValueOperatorPtg {
public final static int SIZE = 1;
public final static byte sid = 0x14;
private final static String PERCENT = "%";
- /** Creates new PercentPtg */
+ public static final ValueOperatorPtg instance = new PercentPtg();
- public PercentPtg()
- {
- }
-
- public PercentPtg(RecordInputStream in)
- {
-
- // doesn't need anything
+ private PercentPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
+ protected byte getSid() {
+ return sid;
}
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return TYPE_UNARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 1;
}
-
- /** Implementation of method from Ptg */
- public String toFormulaString(HSSFWorkbook book)
- {
- return "%";
- }
- /** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
@@ -85,9 +49,4 @@ public final class PercentPtg extends ValueOperatorPtg {
buffer.append(PERCENT);
return buffer.toString();
}
-
- public Object clone() {
- return new PercentPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java b/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java
index 8d849fba2e..478b12fac3 100644
--- a/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java
@@ -17,53 +17,26 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
*
* @author andy
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class PowerPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x07;
- /** Creates new AddPtg */
-
- public PowerPtg()
- {
- }
-
- public PowerPtg(RecordInputStream in)
- {
-
- // doesn't need anything
- }
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
- }
+ public static final ValueOperatorPtg instance = new PowerPtg();
- public int getType()
- {
- return TYPE_BINARY;
+ private PowerPtg() {
+ // enforce singleton
}
-
- public int getNumberOfOperands()
- {
- return 2;
+
+ protected byte getSid() {
+ return sid;
}
- public String toFormulaString(HSSFWorkbook book)
- {
- return "^";
+ public int getNumberOfOperands() {
+ return 2; // TODO - 2 seems wrong (Jun 2008). Maybe this method is not relevant
}
public String toFormulaString(String[] operands) {
@@ -71,13 +44,8 @@ public final class PowerPtg extends ValueOperatorPtg {
buffer.append(operands[ 0 ]);
- buffer.append(toFormulaString((HSSFWorkbook)null));
+ buffer.append("^");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new PowerPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/Ptg.java b/src/java/org/apache/poi/hssf/record/formula/Ptg.java
index 568f639cd3..6964df2ef8 100644
--- a/src/java/org/apache/poi/hssf/record/formula/Ptg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/Ptg.java
@@ -17,226 +17,243 @@
package org.apache.poi.hssf.record.formula;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import java.util.Stack;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
+ * <tt>Ptg</tt> represents a syntactic token in a formula. 'PTG' is an acronym for
+ * '<b>p</b>arse <b>t</b>hin<b>g</b>'. Originally, the name referred to the single
+ * byte identifier at the start of the token, but in POI, <tt>Ptg</tt> encapsulates
+ * the whole formula token (initial byte + value data).
+ * <p/>
+ *
+ * <tt>Ptg</tt>s are logically arranged in a tree representing the structure of the
+ * parsed formula. However, in BIFF files <tt>Ptg</tt>s are written/read in
+ * <em>Reverse-Polish Notation</em> order. The RPN ordering also simplifies formula
+ * evaluation logic, so POI mostly accesses <tt>Ptg</tt>s in the same way.
*
* @author andy
* @author avik
* @author Jason Height (jheight at chariot dot net dot au)
*/
-public abstract class Ptg
-{
-
-
- /* convert infix order ptg list to rpn order ptg list
- * @return List ptgs in RPN order
- * @param infixPtgs List of ptgs in infix order
- */
-
- /* DO NOT REMOVE
- *we keep this method in case we wish to change the way we parse
- *It needs a getPrecedence in OperationsPtg
-
- public static List ptgsToRpn(List infixPtgs) {
- java.util.Stack operands = new java.util.Stack();
- java.util.List retval = new java.util.Stack();
-
- java.util.ListIterator i = infixPtgs.listIterator();
- Object p;
- OperationPtg o ;
- boolean weHaveABracket = false;
- while (i.hasNext()) {
- p=i.next();
- if (p instanceof OperationPtg) {
- if (p instanceof ParenthesisPtg) {
- if (!weHaveABracket) {
- operands.push(p);
- weHaveABracket = true;
- } else {
- o = (OperationPtg) operands.pop();
- while (!(o instanceof ParenthesisPtg)) {
- retval.add(o);
- }
- weHaveABracket = false;
- }
- } else {
-
- while (!operands.isEmpty() && ((OperationPtg) operands.peek()).getPrecedence() >= ((OperationPtg) p).getPrecedence() ) { //TODO handle ^ since it is right associative
- retval.add(operands.pop());
- }
- operands.push(p);
- }
- } else {
- retval.add(p);
- }
- }
- while (!operands.isEmpty()) {
- if (operands.peek() instanceof ParenthesisPtg ){
- //throw some error
- } else {
- retval.add(operands.pop());
- }
- }
- return retval;
- }
- */
-
- /**
- * Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
- * Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
- */
- public static Stack createParsedExpressionTokens(short size, RecordInputStream in )
- {
- Stack stack = new Stack();
- int pos = 0;
- List arrayPtgs = null;
- while ( pos < size )
- {
- Ptg ptg = Ptg.createPtg( in );
- if (ptg instanceof ArrayPtg) {
- if (arrayPtgs == null)
- arrayPtgs = new ArrayList(5);
- arrayPtgs.add(ptg);
- pos += 8;
- } else pos += ptg.getSize();
- stack.push( ptg );
- }
- if(pos != size) {
- throw new RuntimeException("Ptg array size mismatch");
- }
- if (arrayPtgs != null) {
- for (int i=0;i<arrayPtgs.size();i++) {
- ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
- p.readTokenValues(in);
- }
- }
- return stack;
- }
-
- public static Ptg createPtg(RecordInputStream in) {
- byte id = in.readByte();
-
- if (id < 0x20) {
- return createBasePtg(id, in);
- }
-
- Ptg retval = createClassifiedPtg(id, in);
-
- if (id > 0x60) {
- retval.setClass(CLASS_ARRAY);
- } else if (id > 0x40) {
- retval.setClass(CLASS_VALUE);
- } else {
- retval.setClass(CLASS_REF);
- }
-
- return retval;
-
- }
+public abstract class Ptg implements Cloneable {
+
+ /* convert infix order ptg list to rpn order ptg list
+ * @return List ptgs in RPN order
+ * @param infixPtgs List of ptgs in infix order
+ */
+
+ /* DO NOT REMOVE
+ *we keep this method in case we wish to change the way we parse
+ *It needs a getPrecedence in OperationsPtg
+
+ public static List ptgsToRpn(List infixPtgs) {
+ java.util.Stack operands = new java.util.Stack();
+ java.util.List retval = new java.util.Stack();
+
+ java.util.ListIterator i = infixPtgs.listIterator();
+ Object p;
+ OperationPtg o ;
+ boolean weHaveABracket = false;
+ while (i.hasNext()) {
+ p=i.next();
+ if (p instanceof OperationPtg) {
+ if (p instanceof ParenthesisPtg) {
+ if (!weHaveABracket) {
+ operands.push(p);
+ weHaveABracket = true;
+ } else {
+ o = (OperationPtg) operands.pop();
+ while (!(o instanceof ParenthesisPtg)) {
+ retval.add(o);
+ }
+ weHaveABracket = false;
+ }
+ } else {
+
+ while (!operands.isEmpty() && ((OperationPtg) operands.peek()).getPrecedence() >= ((OperationPtg) p).getPrecedence() ) { //TODO handle ^ since it is right associative
+ retval.add(operands.pop());
+ }
+ operands.push(p);
+ }
+ } else {
+ retval.add(p);
+ }
+ }
+ while (!operands.isEmpty()) {
+ if (operands.peek() instanceof ParenthesisPtg ){
+ //throw some error
+ } else {
+ retval.add(operands.pop());
+ }
+ }
+ return retval;
+ }
+ */
+
+ /**
+ * Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
+ * Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
+ */
+ public static Ptg[] readTokens(int size, RecordInputStream in) {
+ Stack temp = createParsedExpressionTokens((short)size, in);
+ return toPtgArray(temp);
+ }
+
+ /**
+ * @deprecated - use readTokens()
+ */
+ public static Stack createParsedExpressionTokens(short size, RecordInputStream in)
+ {
+ Stack stack = new Stack();
+ int pos = 0;
+ List arrayPtgs = null;
+ while ( pos < size )
+ {
+ Ptg ptg = Ptg.createPtg( in );
+ if (ptg instanceof ArrayPtg) {
+ if (arrayPtgs == null)
+ arrayPtgs = new ArrayList(5);
+ arrayPtgs.add(ptg);
+ pos += 8;
+ } else pos += ptg.getSize();
+ stack.push( ptg );
+ }
+ if(pos != size) {
+ throw new RuntimeException("Ptg array size mismatch");
+ }
+ if (arrayPtgs != null) {
+ for (int i=0;i<arrayPtgs.size();i++) {
+ ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
+ p.readTokenValues(in);
+ }
+ }
+ return stack;
+ }
+
+ public static Ptg createPtg(RecordInputStream in) {
+ byte id = in.readByte();
+
+ if (id < 0x20) {
+ return createBasePtg(id, in);
+ }
+
+ Ptg retval = createClassifiedPtg(id, in);
+
+ if (id > 0x60) {
+ retval.setClass(CLASS_ARRAY);
+ } else if (id > 0x40) {
+ retval.setClass(CLASS_VALUE);
+ } else {
+ retval.setClass(CLASS_REF);
+ }
+
+ return retval;
+ }
private static Ptg createClassifiedPtg(byte id, RecordInputStream in) {
int baseId = id & 0x1F | 0x20;
- switch (baseId) {
- case FuncPtg.sid: return new FuncPtg(in); // 0x21, 0x41, 0x61
- case FuncVarPtg.sid: return new FuncVarPtg(in); // 0x22, 0x42, 0x62
- case NamePtg.sid: return new NamePtg(in); // 0x23, 0x43, 0x63
-
- case MemAreaPtg.sid: return new MemAreaPtg(in); // 0x26, 0x46, 0x66
- case MemErrPtg.sid: return new MemErrPtg(in); // 0x27, 0x47, 0x67
- case MemFuncPtg.sid: return new MemFuncPtg(in); // 0x29, 0x49, 0x69
- case RefErrorPtg.sid: return new RefErrorPtg(in);// 0x2a, 0x4a, 0x6a
- case AreaErrPtg.sid: return new AreaErrPtg(in); // 0x2b, 0x4b, 0x6b
-
- case NameXPtg.sid: return new NameXPtg(in); // 0x39, 0x49, 0x79
- case Ref3DPtg.sid: return new Ref3DPtg(in); // 0x3a, 0x5a, 0x7a
- case Area3DPtg.sid: return new Area3DPtg(in); // 0x3b, 0x5b, 0x7b
- case DeletedRef3DPtg.sid: return new DeletedRef3DPtg(in); // 0x3c, 0x5c, 0x7c
- case DeletedArea3DPtg.sid: return new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d
- }
-
-
- switch (id) {
- // TODO - why are specific subclasses needed for these Ptgs?
- case ArrayPtg.sid: return new ArrayPtg(in); // 0x20
- case ArrayPtgV.sid: return new ArrayPtgV(in); // 0x40
- case ArrayPtgA.sid: return new ArrayPtgA(in); // 0x60
-
- case ReferencePtg.sid: return new ReferencePtg(in);// 0x24
- case RefAPtg.sid: return new RefAPtg(in); // 0x64
- case RefVPtg.sid: return new RefVPtg(in); // 0x44
-
- case RefNAPtg.sid: return new RefNAPtg(in); // 0x6C
- case RefNPtg.sid: return new RefNPtg(in); // 0x2C
- case RefNVPtg.sid: return new RefNVPtg(in); // 0x4C
-
- case AreaPtg.sid: return new AreaPtg(in); // 0x25
- case AreaVPtg.sid: return new AreaVPtg(in); // 0x45
- case AreaAPtg.sid: return new AreaAPtg(in); // 0x65
-
- case AreaNAPtg.sid: return new AreaNAPtg(in); // 0x6D
- case AreaNPtg.sid: return new AreaNPtg(in); // 0x2D
- case AreaNVPtg.sid: return new AreaNVPtg(in); // 0x4D
-
- }
- throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
- Integer.toHexString(id) + " (" + ( int ) id + ")");
+ switch (baseId) {
+ case ArrayPtg.sid: return new ArrayPtg(in); // 0x20, 0x40, 0x60
+ case FuncPtg.sid: return new FuncPtg(in); // 0x21, 0x41, 0x61
+ case FuncVarPtg.sid: return new FuncVarPtg(in); // 0x22, 0x42, 0x62
+ case NamePtg.sid: return new NamePtg(in); // 0x23, 0x43, 0x63
+ case RefPtg.sid: return new RefPtg(in); // 0x24, 0x44, 0x64
+ case AreaPtg.sid: return new AreaPtg(in); // 0x25, 0x45, 0x65
+ case MemAreaPtg.sid: return new MemAreaPtg(in); // 0x26, 0x46, 0x66
+ case MemErrPtg.sid: return new MemErrPtg(in); // 0x27, 0x47, 0x67
+ case MemFuncPtg.sid: return new MemFuncPtg(in); // 0x29, 0x49, 0x69
+ case RefErrorPtg.sid: return new RefErrorPtg(in);// 0x2a, 0x4a, 0x6a
+ case AreaErrPtg.sid: return new AreaErrPtg(in); // 0x2b, 0x4b, 0x6b
+ case RefNPtg.sid: return new RefNPtg(in); // 0x2c, 0x4c, 0x6c
+ case AreaNPtg.sid: return new AreaNPtg(in); // 0x2d, 0x4d, 0x6d
+
+ case NameXPtg.sid: return new NameXPtg(in); // 0x39, 0x49, 0x79
+ case Ref3DPtg.sid: return new Ref3DPtg(in); // 0x3a, 0x5a, 0x7a
+ case Area3DPtg.sid: return new Area3DPtg(in); // 0x3b, 0x5b, 0x7b
+ case DeletedRef3DPtg.sid: return new DeletedRef3DPtg(in); // 0x3c, 0x5c, 0x7c
+ case DeletedArea3DPtg.sid: return new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d
+ }
+ throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
+ Integer.toHexString(id) + " (" + ( int ) id + ")");
}
private static Ptg createBasePtg(byte id, RecordInputStream in) {
switch(id) {
- case 0x00: return new UnknownPtg(); // TODO - not a real Ptg
- case ExpPtg.sid: return new ExpPtg(in); // 0x01
- case AddPtg.sid: return new AddPtg(in); // 0x03
- case SubtractPtg.sid: return new SubtractPtg(in); // 0x04
- case MultiplyPtg.sid: return new MultiplyPtg(in); // 0x05
- case DividePtg.sid: return new DividePtg(in); // 0x06
- case PowerPtg.sid: return new PowerPtg(in); // 0x07
- case ConcatPtg.sid: return new ConcatPtg(in); // 0x08
- case LessThanPtg.sid: return new LessThanPtg(in); // 0x09
- case LessEqualPtg.sid: return new LessEqualPtg(in); // 0x0a
- case EqualPtg.sid: return new EqualPtg(in); // 0x0b
- case GreaterEqualPtg.sid: return new GreaterEqualPtg(in);// 0x0c
- case GreaterThanPtg.sid: return new GreaterThanPtg(in); // 0x0d
- case NotEqualPtg.sid: return new NotEqualPtg(in); // 0x0e
- case IntersectionPtg.sid: return new IntersectionPtg(in);// 0x0f
- case UnionPtg.sid: return new UnionPtg(in); // 0x10
- case RangePtg.sid: return new RangePtg(in); // 0x11
- case UnaryPlusPtg.sid: return new UnaryPlusPtg(in); // 0x12
- case UnaryMinusPtg.sid: return new UnaryMinusPtg(in); // 0x13
- case PercentPtg.sid: return new PercentPtg(in); // 0x14
- case ParenthesisPtg.sid: return new ParenthesisPtg(in); // 0x15
- case MissingArgPtg.sid: return new MissingArgPtg(in); // 0x16
- case StringPtg.sid: return new StringPtg(in); // 0x17
- case AttrPtg.sid:
- case 0x1a: return new AttrPtg(in); // 0x19
- case ErrPtg.sid: return new ErrPtg(in); // 0x1c
- case BoolPtg.sid: return new BoolPtg(in); // 0x1d
- case IntPtg.sid: return new IntPtg(in); // 0x1e
- case NumberPtg.sid: return new NumberPtg(in); // 0x1f
+ case 0x00: return new UnknownPtg(); // TODO - not a real Ptg
+ case ExpPtg.sid: return new ExpPtg(in); // 0x01
+ case AddPtg.sid: return AddPtg.instance; // 0x03
+ case SubtractPtg.sid: return SubtractPtg.instance; // 0x04
+ case MultiplyPtg.sid: return MultiplyPtg.instance; // 0x05
+ case DividePtg.sid: return DividePtg.instance; // 0x06
+ case PowerPtg.sid: return PowerPtg.instance; // 0x07
+ case ConcatPtg.sid: return ConcatPtg.instance; // 0x08
+ case LessThanPtg.sid: return LessThanPtg.instance; // 0x09
+ case LessEqualPtg.sid: return LessEqualPtg.instance; // 0x0a
+ case EqualPtg.sid: return EqualPtg.instance; // 0x0b
+ case GreaterEqualPtg.sid: return GreaterEqualPtg.instance;// 0x0c
+ case GreaterThanPtg.sid: return GreaterThanPtg.instance; // 0x0d
+ case NotEqualPtg.sid: return NotEqualPtg.instance; // 0x0e
+ case IntersectionPtg.sid: return IntersectionPtg.instance;// 0x0f
+ case UnionPtg.sid: return UnionPtg.instance; // 0x10
+ case RangePtg.sid: return RangePtg.instance; // 0x11
+ case UnaryPlusPtg.sid: return UnaryPlusPtg.instance; // 0x12
+ case UnaryMinusPtg.sid: return UnaryMinusPtg.instance; // 0x13
+ case PercentPtg.sid: return PercentPtg.instance; // 0x14
+ case ParenthesisPtg.sid: return ParenthesisPtg.instance; // 0x15
+ case MissingArgPtg.sid: return MissingArgPtg.instance; // 0x16
+
+ case StringPtg.sid: return new StringPtg(in); // 0x17
+ case AttrPtg.sid:
+ case 0x1a: return new AttrPtg(in); // 0x19
+ case ErrPtg.sid: return new ErrPtg(in); // 0x1c
+ case BoolPtg.sid: return new BoolPtg(in); // 0x1d
+ case IntPtg.sid: return new IntPtg(in); // 0x1e
+ case NumberPtg.sid: return new NumberPtg(in); // 0x1f
}
throw new RuntimeException("Unexpected base token id (" + id + ")");
}
- /**
- *
- *
- */
+ /**
+ *
+ *
+ */
public static int getEncodedSize(Stack ptgs) {
return getEncodedSize(toPtgArray(ptgs));
}
+ /**
+ * @return a distinct copy of this <tt>Ptg</tt> if the class is mutable, or the same instance
+ * if the class is immutable.
+ */
+ public final Ptg copy() {
+ // TODO - all base tokens are logically immutable, but AttrPtg needs some clean-up
+ if (this instanceof ValueOperatorPtg) {
+ return this;
+ }
+ if (this instanceof ScalarConstantPtg) {
+ return this;
+ }
+ return (Ptg) clone();
+ }
+
+ protected Object clone() {
+ try {
+ return super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeException(e);
+ }
+ }
private static Ptg[] toPtgArray(List l) {
Ptg[] result = new Ptg[l.size()];
l.toArray(result);
return result;
}
- private static Stack createStack(Ptg[] formulaTokens) {
+ private static Stack createStack(Ptg[] formulaTokens) {
Stack result = new Stack();
for (int i = 0; i < formulaTokens.length; i++) {
result.add(formulaTokens[i]);
@@ -251,110 +268,120 @@ public abstract class Ptg
}
return result;
}
+ /**
+ * Writes the ptgs to the data buffer, starting at the specified offset.
+ *
+ * <br/>
+ * The 2 byte encode length field is <b>not</b> written by this method.
+ * @return number of bytes written
+ */
+ public static int serializePtgs(Ptg[] ptgs, byte[] data, int offset) {
+ return serializePtgStack(createStack(ptgs), data, offset);
+ }
+
+ /**
+ * @deprecated use serializePtgs()
+ */
+ public static int serializePtgStack(Stack expression, byte[] array, int offset) {
+ int pos = 0;
+ int size = 0;
+ if (expression != null)
+ size = expression.size();
+
+ List arrayPtgs = null;
+
+ for (int k = 0; k < size; k++) {
+ Ptg ptg = ( Ptg ) expression.get(k);
+
+ ptg.writeBytes(array, pos + offset);
+ if (ptg instanceof ArrayPtg) {
+ if (arrayPtgs == null)
+ arrayPtgs = new ArrayList(5);
+ arrayPtgs.add(ptg);
+ pos += 8;
+ } else pos += ptg.getSize();
+ }
+ if (arrayPtgs != null) {
+ for (int i=0;i<arrayPtgs.size();i++) {
+ ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
+ pos += p.writeTokenValueBytes(array, pos + offset);
+ }
+ }
+ return pos;
+ }
- public static int serializePtgStack(Stack expression, byte[] array, int offset) {
- int pos = 0;
- int size = 0;
- if (expression != null)
- size = expression.size();
-
- List arrayPtgs = null;
-
- for (int k = 0; k < size; k++) {
- Ptg ptg = ( Ptg ) expression.get(k);
-
- ptg.writeBytes(array, pos + offset);
- if (ptg instanceof ArrayPtg) {
- if (arrayPtgs == null)
- arrayPtgs = new ArrayList(5);
- arrayPtgs.add(ptg);
- pos += 8;
- } else pos += ptg.getSize();
- }
- if (arrayPtgs != null) {
- for (int i=0;i<arrayPtgs.size();i++) {
- ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
- pos += p.writeTokenValueBytes(array, pos + offset);
- }
- }
- return pos;
- }
-
- /**
- * @return the encoded length of this Ptg, including the initial Ptg type identifier byte.
- */
- public abstract int getSize();
-
- /**
- * @return the encoded length of this Ptg, not including the initial Ptg type identifier byte.
- */
+ /**
+ * @return the encoded length of this Ptg, including the initial Ptg type identifier byte.
+ */
+ public abstract int getSize();
+
+ /**
+ * @return the encoded length of this Ptg, not including the initial Ptg type identifier byte.
+ */
// public abstract int getDataSize();
- public final byte [] getBytes()
- {
- int size = getSize();
- byte[] bytes = new byte[ size ];
-
- writeBytes(bytes, 0);
- return bytes;
- }
- /** write this Ptg to a byte array*/
- public abstract void writeBytes(byte [] array, int offset);
-
- /**
- * return a string representation of this token alone
- */
- public abstract String toFormulaString(HSSFWorkbook book);
- /**
- * dump a debug representation (hexdump) to a string
- */
- public String toDebugString() {
- byte[] ba = new byte[getSize()];
- String retval=null;
- writeBytes(ba,0);
- try {
- retval = org.apache.poi.util.HexDump.dump(ba,0,0);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return retval;
- }
-
- /** Overridden toString method to ensure object hash is not printed.
- * This helps get rid of gratuitous diffs when comparing two dumps
- * Subclasses may output more relevant information by overriding this method
- **/
- public String toString(){
- return this.getClass().toString();
- }
-
- public static final byte CLASS_REF = 0x00;
- public static final byte CLASS_VALUE = 0x20;
- public static final byte CLASS_ARRAY = 0x40;
-
- protected byte ptgClass = CLASS_REF; //base ptg
-
- public void setClass(byte thePtgClass) {
- if (isBaseToken()) {
- throw new RuntimeException("setClass should not be called on a base token");
- }
- ptgClass = thePtgClass;
- }
-
- /**
- * @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
- */
- public byte getPtgClass() {
- return ptgClass;
- }
-
- public abstract byte getDefaultOperandClass();
-
- public abstract Object clone();
-
-
- /**
- * @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
- */
- public abstract boolean isBaseToken();
+ public final byte [] getBytes()
+ {
+ int size = getSize();
+ byte[] bytes = new byte[ size ];
+
+ writeBytes(bytes, 0);
+ return bytes;
+ }
+ /** write this Ptg to a byte array*/
+ public abstract void writeBytes(byte [] array, int offset);
+
+ /**
+ * return a string representation of this token alone
+ */
+ public abstract String toFormulaString(HSSFWorkbook book);
+ /**
+ * dump a debug representation (hexdump) to a string
+ */
+ public final String toDebugString() {
+ byte[] ba = new byte[getSize()];
+ String retval=null;
+ writeBytes(ba,0);
+ try {
+ retval = org.apache.poi.util.HexDump.dump(ba,0,0);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return retval;
+ }
+
+ /** Overridden toString method to ensure object hash is not printed.
+ * This helps get rid of gratuitous diffs when comparing two dumps
+ * Subclasses may output more relevant information by overriding this method
+ **/
+ public String toString(){
+ return this.getClass().toString();
+ }
+
+ public static final byte CLASS_REF = 0x00;
+ public static final byte CLASS_VALUE = 0x20;
+ public static final byte CLASS_ARRAY = 0x40;
+
+ private byte ptgClass = CLASS_REF; //base ptg
+
+ public final void setClass(byte thePtgClass) {
+ if (isBaseToken()) {
+ throw new RuntimeException("setClass should not be called on a base token");
+ }
+ ptgClass = thePtgClass;
+ }
+
+ /**
+ * @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
+ */
+ public final byte getPtgClass() {
+ return ptgClass;
+ }
+
+ public abstract byte getDefaultOperandClass();
+
+ /**
+ * @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
+ */
+ public abstract boolean isBaseToken();
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RangePtg.java b/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
index 37ae53716d..fdc086c08a 100644
--- a/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
@@ -18,7 +18,6 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
* @author Daniel Noll (daniel at nuix dot com dot au)
@@ -27,20 +26,16 @@ public final class RangePtg extends OperationPtg {
public final static int SIZE = 1;
public final static byte sid = 0x11;
- public RangePtg()
- {
- }
+ public static final OperationPtg instance = new RangePtg();
- public RangePtg(RecordInputStream in)
- {
- // No contents
+ private RangePtg() {
+ // enforce singleton
}
public final boolean isBaseToken() {
return true;
}
-
public int getSize()
{
return SIZE;
@@ -51,17 +46,6 @@ public final class RangePtg extends OperationPtg {
array[ offset + 0 ] = sid;
}
- public Object clone()
- {
- return new RangePtg();
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- /** Implementation of method from Ptg */
public String toFormulaString(HSSFWorkbook book)
{
return ":";
diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
index 1731f658ea..87e455ba8c 100644
--- a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
@@ -82,7 +82,7 @@ public class Ref3DPtg extends OperandPtg {
}
public void writeBytes(byte [] array, int offset) {
- array[ 0 + offset ] = (byte) (sid + ptgClass);
+ array[ 0 + offset ] = (byte) (sid + getPtgClass());
LittleEndian.putShort(array, 1 + offset , getExternSheetIndex());
LittleEndian.putShort(array, 3 + offset , (short)getRow());
LittleEndian.putShort(array, 5 + offset , (short)getColumnRaw());
@@ -190,14 +190,7 @@ public class Ref3DPtg extends OperandPtg {
return retval.toString();
}
- public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
-
- public Object clone() {
- Ref3DPtg ptg = new Ref3DPtg();
- ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
- ptg.field_2_row = field_2_row;
- ptg.field_3_column = field_3_column;
- ptg.setClass(ptgClass);
- return ptg;
- }
+ public byte getDefaultOperandClass() {
+ return Ptg.CLASS_REF;
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
index 309744d784..1db27487eb 100755
--- a/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
@@ -17,12 +17,9 @@
package org.apache.poi.hssf.record.formula;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
-import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.util.LittleEndian;
/**
* RefError - handles deleted cell reference
@@ -34,10 +31,6 @@ public final class RefErrorPtg extends OperandPtg {
public final static byte sid = 0x2a;
private int field_1_reserved;
- private RefErrorPtg() {
- //Required for clone methods
- }
-
public RefErrorPtg(RecordInputStream in)
{
field_1_reserved = in.readInt();
@@ -54,7 +47,7 @@ public final class RefErrorPtg extends OperandPtg {
public void writeBytes(byte [] array, int offset)
{
- array[offset] = (byte) (sid + ptgClass);
+ array[offset] = (byte) (sid + getPtgClass());
LittleEndian.putInt(array,offset+1,field_1_reserved);
}
@@ -82,11 +75,4 @@ public final class RefErrorPtg extends OperandPtg {
public byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
-
- public Object clone() {
- RefErrorPtg ptg = new RefErrorPtg();
- ptg.field_1_reserved = field_1_reserved;
- ptg.setClass(ptgClass);
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefNAPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefNAPtg.java
deleted file mode 100644
index ec09a16ab7..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/RefNAPtg.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * RefNAPtg
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class RefNAPtg extends ReferencePtg
-{
- public final static byte sid = 0x6C;
-
- protected RefNAPtg() {
- //Required for clone methods
- }
-
- public RefNAPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getRefPtgName() {
- return "RefNAPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
-
- public Object clone() {
- throw notImplemented();
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java
index a80d29f6da..5ef4a413b3 100644
--- a/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java
@@ -18,37 +18,21 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* RefNPtg
* @author Jason Height (jheight at apache dot com)
*/
-public final class RefNPtg extends ReferencePtg
-{
+public final class RefNPtg extends RefPtgBase {
public final static byte sid = 0x2C;
- protected RefNPtg() {
- //Required for clone methods
- }
-
/** Creates new ValueReferencePtg */
- public RefNPtg(RecordInputStream in)
- {
+ public RefNPtg(RecordInputStream in) {
super(in);
}
-
- public String getRefPtgName() {
- return "RefNPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
-
- public Object clone() {
- throw notImplemented();
+
+ protected byte getSid() {
+ return sid;
}
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefNVPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefNVPtg.java
deleted file mode 100644
index 77ff46851b..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/RefNVPtg.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
-/**
- * RefNVPtg
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-
-public final class RefNVPtg extends ReferencePtg {
- public final static byte sid = 0x4C;
-
- protected RefNVPtg() {
- //Required for clone methods
- }
-
- /** Creates new ValueReferencePtg */
-
- public RefNVPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getRefPtgName() {
- return "RefNVPtg";
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- throw notImplemented();
- }
-
- public Object clone() {
- throw notImplemented();
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefAPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefPtg.java
index 596b386235..a324ce70f9 100644
--- a/src/java/org/apache/poi/hssf/record/formula/RefAPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/RefPtg.java
@@ -1,55 +1,53 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-
-/**
- * RefNAPtg
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-
-public final class RefAPtg extends ReferencePtg {
- public final static byte sid = 0x64;
-
- protected RefAPtg() {
- super();
- }
-
- public RefAPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
- super(row, column, isRowRelative, isColumnRelative);
- }
-
- public RefAPtg(RecordInputStream in)
- {
- super(in);
- }
-
-
- public String getRefPtgName() {
- return "RefAPtg";
- }
-
- public Object clone() {
- RefAPtg ptg = new RefAPtg();
- ptg.setRow(getRow());
- ptg.setColumnRaw(getColumnRaw());
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
+/* ====================================================================
+ 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.hssf.record.RecordInputStream;
+
+/**
+ * ReferencePtg - 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 final class RefPtg extends RefPtgBase {
+ public final static byte sid = 0x24;
+
+ /**
+ * Takes in a String representation of a cell reference and fills out the
+ * numeric fields.
+ */
+ public RefPtg(String cellref) {
+ super(cellref);
+ }
+
+ public RefPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
+ setRow(row);
+ setColumn(column);
+ setRowRelative(isRowRelative);
+ setColRelative(isColumnRelative);
+ }
+
+ public RefPtg(RecordInputStream in) {
+ super(in);
+ }
+
+ protected byte getSid() {
+ return sid;
+ }
+
+}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java b/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java
index 1af278a9b1..a105522df3 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java
@@ -26,26 +26,13 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.record.RecordInputStream;
/**
- * ReferencePtg - handles references (such as A1, A2, IA4)
+ * 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 class ReferencePtg extends OperandPtg {
- /**
- * TODO - (May-2008) fix subclasses of ReferencePtg 'RefN~' which are used in shared formulas.
- * (See bugzilla 44921)
- * The 'RefN~' instances do not work properly, and are expected to be converted by
- * SharedFormulaRecord.convertSharedFormulas().
- * This conversion currently does not take place for formulas of named ranges, conditional
- * format rules and data validation rules.
- * Furthermore, conversion is probably not appropriate in those instances.
- */
- protected final RuntimeException notImplemented() {
- return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
- }
+public abstract class RefPtgBase extends OperandPtg {
private final static int SIZE = 5;
- public final static byte sid = 0x24;
private final static int MAX_ROW_NUMBER = 65536;
/** The row index - zero based unsigned 16 bit value */
@@ -60,15 +47,15 @@ public class ReferencePtg extends OperandPtg {
private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
private static final BitField column = BitFieldFactory.getInstance(0x00FF);
- protected ReferencePtg() {
+ protected RefPtgBase() {
//Required for clone methods
}
/**
- * Takes in a String represnetation of a cell reference and fills out the
+ * Takes in a String representation of a cell reference and fills out the
* numeric fields.
*/
- public ReferencePtg(String cellref) {
+ protected RefPtgBase(String cellref) {
CellReference c= new CellReference(cellref);
setRow(c.getRow());
setColumn(c.getCol());
@@ -76,26 +63,19 @@ public class ReferencePtg extends OperandPtg {
setRowRelative(!c.isRowAbsolute());
}
- public ReferencePtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
+ protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
setRow(row);
setColumn(column);
setRowRelative(isRowRelative);
setColRelative(isColumnRelative);
}
- /** Creates new ValueReferencePtg */
-
- public ReferencePtg(RecordInputStream in)
- {
+ protected RefPtgBase(RecordInputStream in) {
field_1_row = in.readUShort();
field_2_col = in.readUShort();
}
- public String getRefPtgName() {
- return "ReferencePtg";
- }
-
- public String toString() {
+ public final String toString() {
CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(),!isColRelative());
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName());
@@ -105,16 +85,16 @@ public class ReferencePtg extends OperandPtg {
return sb.toString();
}
- public void writeBytes(byte [] array, int offset)
- {
- array[offset] = (byte) (sid + ptgClass);
+ public final void writeBytes(byte [] array, int offset) {
+ array[offset] = (byte) (getSid() + getPtgClass());
LittleEndian.putShort(array, offset+1, (short)field_1_row);
LittleEndian.putShort(array, offset+3, (short)field_2_col);
}
+
+ protected abstract byte getSid();
- public void setRow(int row)
- {
+ public final void setRow(int row) {
if(row < 0 || row >= MAX_ROW_NUMBER) {
throw new IllegalArgumentException("The row number, when specified as an integer, must be between 0 and " + MAX_ROW_NUMBER);
}
@@ -125,81 +105,61 @@ public class ReferencePtg extends OperandPtg {
* Returns the row number as a short, which will be
* wrapped (negative) for values between 32769 and 65535
*/
- public int getRow()
- {
+ public final int getRow(){
return field_1_row;
}
/**
* Returns the row number as an int, between 0 and 65535
*/
- public int getRowAsInt()
- {
- if(field_1_row < 0) {
- return field_1_row + MAX_ROW_NUMBER;
- }
+ public final int getRowAsInt() {
return field_1_row;
}
- public boolean isRowRelative()
- {
+ public final boolean isRowRelative() {
return rowRelative.isSet(field_2_col);
}
- public void setRowRelative(boolean rel) {
+ public final void setRowRelative(boolean rel) {
field_2_col=rowRelative.setBoolean(field_2_col,rel);
}
- public boolean isColRelative()
- {
+ public final boolean isColRelative() {
return colRelative.isSet(field_2_col);
}
- public void setColRelative(boolean rel) {
+ public final void setColRelative(boolean rel) {
field_2_col=colRelative.setBoolean(field_2_col,rel);
}
- public void setColumnRaw(int col)
- {
+ public final void setColumnRawX(int col) { // TODO
field_2_col = col;
}
- public int getColumnRaw()
- {
+ public int getColumnRawX() { // TODO
return field_2_col;
}
- public void setColumn(int col)
- {
- if(col < 0 || col > 0x100) {
+ public final void setColumn(int col) {
+ if(col < 0 || col >= 0x100) {
throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
}
field_2_col = column.setValue(field_2_col, col);
}
- public int getColumn() {
+ public final int getColumn() {
return column.getValue(field_2_col);
}
- public int getSize()
- {
+ public final int getSize() {
return SIZE;
}
- public String toFormulaString(HSSFWorkbook book)
- {
+ public final String toFormulaString(HSSFWorkbook book) {
//TODO -- should we store a cellreference instance in this ptg?? but .. memory is an issue, i believe!
return (new CellReference(getRowAsInt(),getColumn(),!isRowRelative(),!isColRelative())).formatAsString();
}
- public byte getDefaultOperandClass() {
+ public final byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
-
- public Object clone() {
- ReferencePtg ptg = new ReferencePtg();
- ptg.field_1_row = field_1_row;
- ptg.field_2_col = field_2_col;
- ptg.setClass(ptgClass);
- return ptg;
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/RefVPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefVPtg.java
deleted file mode 100644
index 75c6348907..0000000000
--- a/src/java/org/apache/poi/hssf/record/formula/RefVPtg.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ====================================================================
- 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.hssf.record.RecordInputStream;
-
-/**
- * RefVPtg
- * @author Jason Height (jheight at chariot dot net dot au)
- */
-public final class RefVPtg extends ReferencePtg {
- public final static byte sid = 0x44;
-
- protected RefVPtg() {
- super();
- }
-
- public RefVPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
- super(row, column, isRowRelative, isColumnRelative);
- setClass(CLASS_VALUE);
- }
-
-
- /** Creates new ValueReferencePtg */
-
- public RefVPtg(RecordInputStream in)
- {
- super(in);
- }
-
- public String getRefPtgName() {
- return "RefVPtg";
- }
-
- public Object clone() {
- RefVPtg ptg = new RefVPtg();
- ptg.setRow(getRow());
- ptg.setColumnRaw(getColumnRaw());
- ptg.setClass(ptgClass);
- return ptg;
- }
-}
diff --git a/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java b/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java
index 43b8c13920..8b00d327fc 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java
@@ -27,5 +27,4 @@ abstract class ScalarConstantPtg extends Ptg {
public final byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
index 14ed38203d..9102b083d5 100644
--- a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
@@ -42,15 +42,11 @@ public final class StringPtg extends ScalarConstantPtg {
* NOTE: OO doc says 16bit length, but BiffViewer says 8 Book says something
* totally different, so don't look there!
*/
- private int field_1_length;
- private byte field_2_options;
- private String field_3_string;
+ private final int field_1_length;
+ private final byte field_2_options;
+ private final String field_3_string;
- private StringPtg() {
- // Required for clone methods
- }
-
- /** Create a StringPtg from a byte array read from disk */
+ /** Create a StringPtg from a stream */
public StringPtg(RecordInputStream in) {
field_1_length = in.readUByte();
field_2_options = in.readByte();
@@ -76,9 +72,7 @@ public final class StringPtg extends ScalarConstantPtg {
throw new IllegalArgumentException(
"String literals in formulas can't be bigger than 255 characters ASCII");
}
- field_2_options = 0;
- field_2_options = (byte) fHighByte.setBoolean(field_2_options, StringUtil
- .hasMultibyte(value));
+ field_2_options = (byte) fHighByte.setBoolean(0, StringUtil.hasMultibyte(value));
field_3_string = value;
field_1_length = value.length(); // for the moment, we support only ASCII strings in formulas we create
}
@@ -124,14 +118,6 @@ public final class StringPtg extends ScalarConstantPtg {
return sb.toString();
}
- public Object clone() {
- StringPtg ptg = new StringPtg();
- ptg.field_1_length = field_1_length;
- ptg.field_2_options = field_2_options;
- ptg.field_3_string = field_3_string;
- return ptg;
- }
-
public String toString() {
StringBuffer sb = new StringBuffer(64);
sb.append(getClass().getName()).append(" [");
diff --git a/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java b/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
index 3d04a9f45a..46fa4cca6e 100644
--- a/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
@@ -17,54 +17,27 @@
package org.apache.poi.hssf.record.formula;
-import java.util.List;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
*
* @author andy
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class SubtractPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x04;
- public SubtractPtg()
- {
- }
-
- public SubtractPtg(RecordInputStream in)
- {
+ public static final ValueOperatorPtg instance = new SubtractPtg();
- // doesn't need anything
+ private SubtractPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
+
+ protected byte getSid() {
+ return sid;
}
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 2;
}
-
- public String toFormulaString(HSSFWorkbook book)
- {
- return "-";
- }
-
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
@@ -74,8 +47,4 @@ public final class SubtractPtg extends ValueOperatorPtg {
buffer.append(operands[ 1 ]);
return buffer.toString();
}
-
- public Object clone() {
- return new SubtractPtg();
- }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java b/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
index 51cb7018df..b8f28ec395 100644
--- a/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
@@ -17,62 +17,30 @@
package org.apache.poi.hssf.record.formula;
-import java.util.List;
-
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Unary Plus operator
* does not have any effect on the operand
* @author Avik Sengupta
*/
-
public final class UnaryMinusPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x13;
private final static String MINUS = "-";
- /** Creates new AddPtg */
+ public static final ValueOperatorPtg instance = new UnaryMinusPtg();
- public UnaryMinusPtg()
- {
- }
-
- public UnaryMinusPtg(RecordInputStream in)
- {
-
- // doesn't need anything
+ private UnaryMinusPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return this.TYPE_UNARY;
+ protected byte getSid() {
+ return sid;
}
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 1;
}
- /** Implementation of method from Ptg */
- public String toFormulaString(HSSFWorkbook book)
- {
- return "+";
- }
-
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
@@ -80,9 +48,4 @@ public final class UnaryMinusPtg extends ValueOperatorPtg {
buffer.append(operands[ 0]);
return buffer.toString();
}
-
- public Object clone() {
- return new UnaryPlusPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java b/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
index 70cdbf2ca8..0b050fd531 100644
--- a/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
@@ -17,62 +17,30 @@
package org.apache.poi.hssf.record.formula;
-import java.util.List;
-
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
/**
* Unary Plus operator
* does not have any effect on the operand
* @author Avik Sengupta
*/
-
public final class UnaryPlusPtg extends ValueOperatorPtg {
- public final static int SIZE = 1;
public final static byte sid = 0x12;
private final static String ADD = "+";
- /** Creates new AddPtg */
+ public static final ValueOperatorPtg instance = new UnaryPlusPtg();
- public UnaryPlusPtg()
- {
- }
-
- public UnaryPlusPtg(RecordInputStream in)
- {
-
- // doesn't need anything
+ private UnaryPlusPtg() {
+ // enforce singleton
}
-
- public void writeBytes(byte [] array, int offset)
- {
- array[ offset + 0 ] = sid;
- }
-
- public int getSize()
- {
- return SIZE;
- }
-
- public int getType()
- {
- return this.TYPE_UNARY;
+ protected byte getSid() {
+ return sid;
}
- public int getNumberOfOperands()
- {
+ public int getNumberOfOperands() {
return 1;
}
- /** Implementation of method from Ptg */
- public String toFormulaString(HSSFWorkbook book)
- {
- return "+";
- }
-
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
@@ -80,9 +48,4 @@ public final class UnaryPlusPtg extends ValueOperatorPtg {
buffer.append(operands[ 0]);
return buffer.toString();
}
-
- public Object clone() {
- return new UnaryPlusPtg();
- }
-
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java b/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
index c1fe011b5a..e2787cec35 100644
--- a/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
@@ -18,7 +18,6 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
/**
* @author Glen Stampoultzis (glens at apache.org)
@@ -26,14 +25,10 @@ import org.apache.poi.hssf.record.RecordInputStream;
public final class UnionPtg extends OperationPtg {
public final static byte sid = 0x10;
+ public static final OperationPtg instance = new UnionPtg();
- public UnionPtg()
- {
- }
-
- public UnionPtg(RecordInputStream in)
- {
- // doesn't need anything
+ private UnionPtg() {
+ // enforce singleton
}
public final boolean isBaseToken() {
@@ -50,17 +45,6 @@ public final class UnionPtg extends OperationPtg {
array[ offset + 0 ] = sid;
}
- public Object clone()
- {
- return new UnionPtg();
- }
-
- public int getType()
- {
- return TYPE_BINARY;
- }
-
- /** Implementation of method from Ptg */
public String toFormulaString(HSSFWorkbook book)
{
return ",";
diff --git a/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java b/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
index 4ef6ab595d..b2a78c166e 100644
--- a/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
+++ b/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
@@ -17,6 +17,8 @@
package org.apache.poi.hssf.record.formula;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
/**
* Common superclass of all value operators.
* Subclasses include all unary and binary operators except for the reference operators (IntersectionPtg, RangePtg, UnionPtg)
@@ -26,12 +28,27 @@ package org.apache.poi.hssf.record.formula;
public abstract class ValueOperatorPtg extends OperationPtg {
/**
- * All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classifed)
+ * All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classified)
*/
public final boolean isBaseToken() {
return true;
}
+
public final byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
+
+ public final void writeBytes(byte[] array, int offset) {
+ array[offset + 0] = getSid();
+ }
+
+ protected abstract byte getSid();
+
+ public final int getSize() {
+ return 1;
+ }
+ public final String toFormulaString(HSSFWorkbook book) {
+ // TODO - prune this method out of the hierarchy
+ throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs");
+ }
}
diff --git a/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java b/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java
index 898d7a8618..033ecc1f86 100644
--- a/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java
+++ b/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java
@@ -17,7 +17,7 @@
package org.apache.poi.hssf.record.formula.eval;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
/**
* @author adeshmukh
@@ -26,9 +26,9 @@ import org.apache.poi.hssf.record.formula.ReferencePtg;
public final class Ref2DEval implements RefEval {
private final ValueEval value;
- private final ReferencePtg delegate;
+ private final RefPtg delegate;
- public Ref2DEval(ReferencePtg ptg, ValueEval ve) {
+ public Ref2DEval(RefPtg ptg, ValueEval ve) {
if(ve == null) {
throw new IllegalArgumentException("ve must not be null");
}
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
index e23a58c595..c8214675fb 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
@@ -40,7 +40,7 @@ import org.apache.poi.hssf.record.formula.OperationPtg;
import org.apache.poi.hssf.record.formula.ParenthesisPtg;
import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.record.formula.Ref3DPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
import org.apache.poi.hssf.record.formula.StringPtg;
import org.apache.poi.hssf.record.formula.UnionPtg;
import org.apache.poi.hssf.record.formula.UnknownPtg;
@@ -386,8 +386,8 @@ public class HSSFFormulaEvaluator {
Eval opresult = invokeOperation(operation, ops, srcRowNum, srcColNum, workbook, sheet);
stack.push(opresult);
}
- else if (ptg instanceof ReferencePtg) {
- ReferencePtg refPtg = (ReferencePtg) ptg;
+ else if (ptg instanceof RefPtg) {
+ RefPtg refPtg = (RefPtg) ptg;
int colIx = refPtg.getColumn();
int rowIx = refPtg.getRow();
HSSFRow row = sheet.getRow(rowIx);
@@ -549,7 +549,7 @@ public class HSSFFormulaEvaluator {
Constructor constructor = clazz.getConstructor(AREA3D_CONSTRUCTOR_CLASS_ARRAY);
retval = (OperationEval) constructor.newInstance(new Ptg[] { ptg });
}
- else if (ptg instanceof ReferencePtg) {
+ else if (ptg instanceof RefPtg) {
Constructor constructor = clazz.getConstructor(REFERENCE_CONSTRUCTOR_CLASS_ARRAY);
retval = (OperationEval) constructor.newInstance(new Ptg[] { ptg });
}
@@ -607,7 +607,7 @@ public class HSSFFormulaEvaluator {
* Creates a Ref2DEval for ReferencePtg.
* Non existent cells are treated as RefEvals containing BlankEval.
*/
- private static Ref2DEval createRef2DEval(ReferencePtg ptg, HSSFCell cell,
+ private static Ref2DEval createRef2DEval(RefPtg ptg, HSSFCell cell,
HSSFRow row, HSSFSheet sheet, HSSFWorkbook workbook) {
if (cell == null) {
return new Ref2DEval(ptg, BlankEval.INSTANCE);
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
index ced8719809..cf4cff86d7 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
@@ -37,7 +37,7 @@ import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
import org.apache.poi.hssf.util.HSSFCellRangeAddress;
import org.apache.poi.hssf.util.HSSFDataValidation;
import org.apache.poi.hssf.util.PaneInformation;
@@ -1304,8 +1304,8 @@ public final class HSSFSheet {
Ptg[] ptgs = fp.getRPNPtg();
boolean changed = false;
for(int i=0; i<ptgs.length; i++) {
- if(ptgs[i] instanceof ReferencePtg) {
- ReferencePtg rptg = (ReferencePtg)ptgs[i];
+ if(ptgs[i] instanceof RefPtg) {
+ RefPtg rptg = (RefPtg)ptgs[i];
if(startRow <= rptg.getRowAsInt() &&
rptg.getRowAsInt() <= endRow) {
// References a row that moved
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
index 129212c0d5..68409156d3 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
@@ -909,9 +909,7 @@ public class HSSFWorkbook extends POIDocument
if (settingRowAndColumn)
{
- MemFuncPtg memFuncPtg = new MemFuncPtg();
- memFuncPtg.setLenRefSubexpression(23);
- ptgs.add(memFuncPtg);
+ ptgs.add(new MemFuncPtg(23)); // TODO - where did constant '23' come from?
}
if (startColumn >= 0)
{
@@ -935,8 +933,7 @@ public class HSSFWorkbook extends POIDocument
}
if (settingRowAndColumn)
{
- UnionPtg unionPtg = new UnionPtg();
- ptgs.add(unionPtg);
+ ptgs.add(UnionPtg.instance);
}
nameRecord.setNameDefinition(ptgs);