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