diff --git a/src/java/org/apache/poi/hssf/record/CFRuleBase.java b/src/java/org/apache/poi/hssf/record/CFRuleBase.java
index 28c21c8d9e..7dfcc376fd 100644
--- a/src/java/org/apache/poi/hssf/record/CFRuleBase.java
+++ b/src/java/org/apache/poi/hssf/record/CFRuleBase.java
@@ -425,7 +425,7 @@ public abstract class CFRuleBase extends StandardRecord {
*
* @return null
if formula was null.
*/
- protected static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
+ public static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
if(formula == null) {
return null;
}
diff --git a/src/java/org/apache/poi/hssf/record/cf/Threshold.java b/src/java/org/apache/poi/hssf/record/cf/Threshold.java
index 208b21fe62..52b89501de 100644
--- a/src/java/org/apache/poi/hssf/record/cf/Threshold.java
+++ b/src/java/org/apache/poi/hssf/record/cf/Threshold.java
@@ -17,7 +17,10 @@
package org.apache.poi.hssf.record.cf;
+import java.util.Arrays;
+
import org.apache.poi.ss.formula.Formula;
+import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
import org.apache.poi.util.LittleEndianInput;
import org.apache.poi.util.LittleEndianOutput;
@@ -42,19 +45,21 @@ public final class Threshold {
public Threshold() {
type = (byte)RangeType.NUMBER.id;
- formula = null; // TODO SHould this be empty instead?
+ formula = Formula.create(null);
value = 0d;
}
/** Creates new Threshold */
public Threshold(LittleEndianInput in) {
type = in.readByte();
- short formuaLen = in.readShort();
- if (formuaLen > 0) {
- formula = Formula.read(formuaLen, in);
+ short formulaLen = in.readShort();
+ if (formulaLen > 0) {
+ formula = Formula.read(formulaLen, in);
+ } else {
+ formula = Formula.create(null);
}
// Value is only there for non-formula, non min/max thresholds
- if (formula == null && type != RangeType.MIN.id &&
+ if (formulaLen == 0 && type != RangeType.MIN.id &&
type != RangeType.MAX.id) {
value = in.readDouble();
}
@@ -70,11 +75,14 @@ public final class Threshold {
this.type = type;
}
- public Formula getFormula() {
+ protected Formula getFormula() {
return formula;
}
- public void setFormula(Formula formula) {
- this.formula = formula;
+ public Ptg[] getParsedExpression() {
+ return formula.getTokens();
+ }
+ public void setParsedExpression(Ptg[] ptgs) {
+ formula = Formula.create(ptgs);
}
public Double getValue() {
@@ -92,12 +100,7 @@ public final class Threshold {
}
public int getDataLength() {
- int len = 1;
- if (formula != null) {
- len += formula.getEncodedSize();
- } else {
- len += 2;
- }
+ int len = 1 + formula.getEncodedSize();
if (value != null) {
len += 8;
}
@@ -105,13 +108,11 @@ public final class Threshold {
return len;
}
-
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(" [CF Threshold]\n");
buffer.append(" .type = ").append(Integer.toHexString(type)).append("\n");
- // TODO Output the formula better
- buffer.append(" .formula = ").append(formula).append("\n");
+ buffer.append(" .formula = ").append(Arrays.toString(formula.getTokens())).append("\n");
buffer.append(" .value = ").append(value).append("\n");
buffer.append(" [/CF Threshold]\n");
return buffer.toString();
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
index 67658bae4f..5c97b68e28 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
@@ -74,20 +74,20 @@ import org.apache.poi.ss.util.CellRangeAddress;
*
*/
public final class HSSFConditionalFormatting implements ConditionalFormatting {
- private final HSSFWorkbook _workbook;
+ private final HSSFSheet sheet;
private final CFRecordsAggregate cfAggregate;
// TODO Should this be assigning unique IDs to the rules
// as they get added to the file?
- HSSFConditionalFormatting(HSSFWorkbook workbook, CFRecordsAggregate cfAggregate) {
- if(workbook == null) {
- throw new IllegalArgumentException("workbook must not be null");
+ HSSFConditionalFormatting(HSSFSheet sheet, CFRecordsAggregate cfAggregate) {
+ if(sheet == null) {
+ throw new IllegalArgumentException("sheet must not be null");
}
if(cfAggregate == null) {
throw new IllegalArgumentException("cfAggregate must not be null");
}
- _workbook = workbook;
+ this.sheet = sheet;
this.cfAggregate = cfAggregate;
}
CFRecordsAggregate getCFRecordsAggregate() {
@@ -143,7 +143,7 @@ public final class HSSFConditionalFormatting implements ConditionalFormatting {
*/
public HSSFConditionalFormattingRule getRule(int idx) {
CFRuleBase ruleRecord = cfAggregate.getRule(idx);
- return new HSSFConditionalFormattingRule(_workbook, ruleRecord);
+ return new HSSFConditionalFormattingRule(sheet, ruleRecord);
}
/**
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
index c36748e97c..a999488d38 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
@@ -41,15 +41,17 @@ public final class HSSFConditionalFormattingRule implements ConditionalFormattin
private final CFRuleBase cfRuleRecord;
private final HSSFWorkbook workbook;
+ private final HSSFSheet sheet;
- HSSFConditionalFormattingRule(HSSFWorkbook pWorkbook, CFRuleBase pRuleRecord) {
- if (pWorkbook == null) {
- throw new IllegalArgumentException("pWorkbook must not be null");
+ HSSFConditionalFormattingRule(HSSFSheet pSheet, CFRuleBase pRuleRecord) {
+ if (pSheet == null) {
+ throw new IllegalArgumentException("pSheet must not be null");
}
if (pRuleRecord == null) {
throw new IllegalArgumentException("pRuleRecord must not be null");
}
- workbook = pWorkbook;
+ sheet = pSheet;
+ workbook = pSheet.getWorkbook();
cfRuleRecord = pRuleRecord;
}
@@ -179,12 +181,12 @@ public final class HSSFConditionalFormattingRule implements ConditionalFormattin
IconMultiStateFormatting iconFormatting = cfRule12Record.getMultiStateFormatting();
if (iconFormatting != null)
{
- return new HSSFIconMultiStateFormatting(cfRule12Record);
+ return new HSSFIconMultiStateFormatting(cfRule12Record, sheet);
}
else if( create )
{
iconFormatting = cfRule12Record.createMultiStateFormatting();
- return new HSSFIconMultiStateFormatting(cfRule12Record);
+ return new HSSFIconMultiStateFormatting(cfRule12Record, sheet);
}
else
{
@@ -245,7 +247,10 @@ public final class HSSFConditionalFormattingRule implements ConditionalFormattin
return null;
}
- private String toFormulaString(Ptg[] parsedExpression) {
+ protected String toFormulaString(Ptg[] parsedExpression) {
+ return toFormulaString(parsedExpression, workbook);
+ }
+ protected static String toFormulaString(Ptg[] parsedExpression, HSSFWorkbook workbook) {
if(parsedExpression == null || parsedExpression.length == 0) {
return null;
}
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingThreshold.java b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingThreshold.java
index 7b21d9365d..4ab124c05c 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingThreshold.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingThreshold.java
@@ -17,8 +17,10 @@
package org.apache.poi.hssf.usermodel;
+import static org.apache.poi.hssf.record.CFRuleBase.parseFormula;
+import static org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule.toFormulaString;
+
import org.apache.poi.hssf.record.cf.Threshold;
-import org.apache.poi.ss.formula.Formula;
/**
* High level representation for Icon / Multi-State / Databar /
@@ -26,9 +28,13 @@ import org.apache.poi.ss.formula.Formula;
*/
public final class HSSFConditionalFormattingThreshold implements org.apache.poi.ss.usermodel.ConditionalFormattingThreshold {
private final Threshold threshold;
+ private final HSSFSheet sheet;
+ private final HSSFWorkbook workbook;
- protected HSSFConditionalFormattingThreshold(Threshold threshold) {
+ protected HSSFConditionalFormattingThreshold(Threshold threshold, HSSFSheet sheet) {
this.threshold = threshold;
+ this.sheet = sheet;
+ this.workbook = sheet.getWorkbook();
}
protected Threshold getThreshold() {
return threshold;
@@ -41,11 +47,11 @@ public final class HSSFConditionalFormattingThreshold implements org.apache.poi.
threshold.setType((byte)type.id);
}
- public Formula getFormula() {
- return threshold.getFormula();
+ public String getFormula() {
+ return toFormulaString(threshold.getParsedExpression(), workbook);
}
- public void setFormula(Formula formula) {
- threshold.setFormula(formula);
+ public void setFormula(String formula) {
+ threshold.setParsedExpression(parseFormula(formula, sheet));
}
public Double getValue() {
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java b/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
index 6e2ea49ad0..f15732c626 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
@@ -27,10 +27,12 @@ import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold;
* component of Conditional Formatting settings
*/
public final class HSSFIconMultiStateFormatting implements org.apache.poi.ss.usermodel.IconMultiStateFormatting {
+ private final HSSFSheet sheet;
private final CFRule12Record cfRule12Record;
private final IconMultiStateFormatting iconFormatting;
- protected HSSFIconMultiStateFormatting(CFRule12Record cfRule12Record) {
+ protected HSSFIconMultiStateFormatting(CFRule12Record cfRule12Record, HSSFSheet sheet) {
+ this.sheet = sheet;
this.cfRule12Record = cfRule12Record;
this.iconFormatting = this.cfRule12Record.getMultiStateFormatting();
}
@@ -60,7 +62,7 @@ public final class HSSFIconMultiStateFormatting implements org.apache.poi.ss.use
Threshold[] t = iconFormatting.getThresholds();
HSSFConditionalFormattingThreshold[] ht = new HSSFConditionalFormattingThreshold[t.length];
for (int i=0; inull if no formula
*/
- Formula getFormula();
+ String getFormula();
/**
* Sets the formula used to calculate the threshold,
* or unsets it if null
is given.
*/
- void setFormula(Formula formula);
+ void setFormula(String formula);
/**
* Gets the value used for the threshold, or