You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2015/07/12 22:38:57 UTC

svn commit: r1690527 - in /poi/trunk/src: java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/usermodel/ testcases/org/apache/poi/hssf/record/ testcases/org/apache/poi/hssf/record/aggregates/

Author: nick
Date: Sun Jul 12 20:38:57 2015
New Revision: 1690527

URL: http://svn.apache.org/r1690527
Log:
Refactor some of the CFRuleRecord logic out to CFRuleBase, and begin work on CFRule12Record #58130

Added:
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java
      - copied, changed from r1690512, poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java

Added: poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java?rev=1690527&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java Sun Jul 12 20:38:57 2015
@@ -0,0 +1,166 @@
+/* ====================================================================
+   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;
+
+import java.util.Arrays;
+
+import org.apache.poi.hssf.record.common.FtrHeader;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.ss.formula.Formula;
+import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.util.LittleEndianOutput;
+
+/**
+ * Conditional Formatting v12 Rule Record (0x087A). 
+ * 
+ * <p>This is for newer-style Excel conditional formattings,
+ *  from Excel 2007 onwards.
+ *  
+ * <p>{@link CFRuleRecord} is used where the condition type is
+ *  {@link #CONDITION_TYPE_CELL_VALUE_IS} or {@link #CONDITION_TYPE_FORMULA},
+ *  this is only used for the other types
+ */
+public final class CFRule12Record extends CFRuleBase {
+    public static final short sid = 0x087A;
+
+    private FtrHeader futureHeader;
+    private Formula formulaScale;
+
+    /** Creates new CFRuleRecord */
+    private CFRule12Record(byte conditionType, byte comparisonOperation) {
+        super(conditionType, comparisonOperation);
+        futureHeader = new FtrHeader();
+        futureHeader.setRecordType(sid);
+        // TODO Remaining fields
+    }
+
+    private CFRule12Record(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2, Ptg[] formulaScale) {
+        super(conditionType, comparisonOperation, formula1, formula2);
+        this.formulaScale = Formula.create(formulaScale);
+        // TODO Remaining fields
+    }
+
+    /**
+     * Creates a new comparison operation rule
+     */
+    public static CFRule12Record create(HSSFSheet sheet, String formulaText) {
+        Ptg[] formula1 = parseFormula(formulaText, sheet);
+        return new CFRule12Record(CONDITION_TYPE_FORMULA, ComparisonOperator.NO_COMPARISON,
+                formula1, null, null);
+    }
+    /**
+     * Creates a new comparison operation rule
+     */
+    public static CFRule12Record create(HSSFSheet sheet, byte comparisonOperation,
+            String formulaText1, String formulaText2) {
+        Ptg[] formula1 = parseFormula(formulaText1, sheet);
+        Ptg[] formula2 = parseFormula(formulaText2, sheet);
+        return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, 
+                formula1, formula2, null);
+    }
+    /**
+     * Creates a new comparison operation rule
+     */
+    public static CFRule12Record create(HSSFSheet sheet, byte comparisonOperation,
+            String formulaText1, String formulaText2, String formulaTextScale) {
+        Ptg[] formula1 = parseFormula(formulaText1, sheet);
+        Ptg[] formula2 = parseFormula(formulaText2, sheet);
+        Ptg[] formula3 = parseFormula(formulaTextScale, sheet);
+        return new CFRule12Record(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, 
+                formula1, formula2, formula3);
+    }
+
+    public CFRule12Record(RecordInputStream in) {
+        futureHeader = new FtrHeader(in);
+        setConditionType(in.readByte());
+        setComparisonOperation(in.readByte());
+        int field_3_formula1_len = in.readUShort();
+        int field_4_formula2_len = in.readUShort();
+        
+        // TODO Handle the remainder
+    }
+
+    /**
+     * get the stack of the scale expression as a list
+     *
+     * @return list of tokens (casts stack to a list and returns it!)
+     * this method can return null is we are unable to create Ptgs from
+     *	 existing excel file
+     * callers should check for null!
+     */
+    public Ptg[] getParsedExpressionScale() {
+        return formulaScale.getTokens();
+    }
+    public void setParsedExpressionScale(Ptg[] ptgs) {
+        formulaScale = Formula.create(ptgs);
+    }
+
+    public short getSid() {
+        return sid;
+    }
+
+    /**
+     * called by the class that is responsible for writing this sucker.
+     * Subclasses should implement this so that their data is passed back in a
+     * byte array.
+     *
+     * @param out the stream to write to
+     */
+    public void serialize(LittleEndianOutput out) {
+        futureHeader.serialize(out);
+        
+        int formula1Len=getFormulaSize(getFormula1());
+        int formula2Len=getFormulaSize(getFormula2());
+
+        out.writeByte(getConditionType());
+        out.writeByte(getComparisonOperation());
+        out.writeShort(formula1Len);
+        out.writeShort(formula2Len);
+        
+        // TODO Output the rest
+    }
+
+    protected int getDataSize() {
+        // TODO Calculate
+        return 0;
+    }
+
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("[CFRULE12]\n");
+        buffer.append("    .condition_type   =").append(getConditionType()).append("\n");
+        buffer.append("    TODO The rest!\n");
+        buffer.append("    Formula 1 =").append(Arrays.toString(getFormula1().getTokens())).append("\n");
+        buffer.append("    Formula 2 =").append(Arrays.toString(getFormula2().getTokens())).append("\n");
+        buffer.append("    Formula S =").append(Arrays.toString(formulaScale.getTokens())).append("\n");
+        buffer.append("[/CFRULE12]\n");
+        return buffer.toString();
+    }
+
+    public Object clone() {
+        CFRule12Record rec = new CFRule12Record(getConditionType(), getComparisonOperation());
+        
+        // TODO The other fields
+        
+        rec.setFormula1(getFormula1().copy());
+        rec.setFormula2(getFormula2().copy());
+        rec.formulaScale = formulaScale.copy();
+
+        return rec;
+    }
+}

Copied: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java (from r1690512, poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java?p2=poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java&p1=poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java&r1=1690512&r2=1690527&rev=1690527&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleBase.java Sun Jul 12 20:38:57 2015
@@ -17,30 +17,21 @@
 
 package org.apache.poi.hssf.record;
 
-import java.util.Arrays;
-
 import org.apache.poi.hssf.model.HSSFFormulaParser;
-import org.apache.poi.hssf.record.cf.BorderFormatting;
-import org.apache.poi.hssf.record.cf.FontFormatting;
-import org.apache.poi.hssf.record.cf.PatternFormatting;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.ss.formula.Formula;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
-import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Conditional Formatting Rule Record (0x01B1). 
+ * Conditional Formatting Rules. This can hold old-style rules
+ *   
  * 
  * <p>This is for the older-style Excel conditional formattings,
  *  new-style (Excel 2007+) also make use of {@link CFRule12Record}
  *  and {@link CFExRuleRecord} for their rules.
  */
-public final class CFRuleRecord extends StandardRecord {
-    public static final short sid = 0x01B1;
-
+public abstract class CFRuleBase extends StandardRecord {
     public static final class ComparisonOperator {
         public static final byte NO_COMPARISON = 0;
         public static final byte BETWEEN       = 1;
@@ -51,284 +42,62 @@ public final class CFRuleRecord extends
         public static final byte LT            = 6;
         public static final byte GE            = 7;
         public static final byte LE            = 8;
+        private static final byte max_operator = 8;
     }
 
-    private byte  field_1_condition_type;
+    private byte condition_type;
+    // The only kinds that CFRuleRecord handles
     public static final byte CONDITION_TYPE_CELL_VALUE_IS = 1;
     public static final byte CONDITION_TYPE_FORMULA = 2;
+    // These are CFRule12Rule only
+    public static final byte CONDITION_TYPE_COLOR_SCALE = 3;
+    public static final byte CONDITION_TYPE_DATA_BAR = 4;
+    public static final byte CONDITION_TYPE_FILTER = 5;
+    public static final byte CONDITION_TYPE_ICON_SET = 6;
 
-    private byte  field_2_comparison_operator;
-
-    private int   field_5_options;
-
-    private static final BitField modificationBits = bf(0x003FFFFF); // Bits: font,align,bord,patt,prot
-    private static final BitField alignHor      = bf(0x00000001); // 0 = Horizontal alignment modified
-    private static final BitField alignVer      = bf(0x00000002); // 0 = Vertical alignment modified
-    private static final BitField alignWrap     = bf(0x00000004); // 0 = Text wrapped flag modified
-    private static final BitField alignRot      = bf(0x00000008); // 0 = Text rotation modified
-    private static final BitField alignJustLast = bf(0x00000010); // 0 = Justify last line flag modified
-    private static final BitField alignIndent   = bf(0x00000020); // 0 = Indentation modified
-    private static final BitField alignShrin    = bf(0x00000040); // 0 = Shrink to fit flag modified
-    private static final BitField notUsed1      = bf(0x00000080); // Always 1
-    private static final BitField protLocked    = bf(0x00000100); // 0 = Cell locked flag modified
-    private static final BitField protHidden    = bf(0x00000200); // 0 = Cell hidden flag modified
-    private static final BitField bordLeft      = bf(0x00000400); // 0 = Left border style and colour modified
-    private static final BitField bordRight     = bf(0x00000800); // 0 = Right border style and colour modified
-    private static final BitField bordTop       = bf(0x00001000); // 0 = Top border style and colour modified
-    private static final BitField bordBot       = bf(0x00002000); // 0 = Bottom border style and colour modified
-    private static final BitField bordTlBr      = bf(0x00004000); // 0 = Top-left to bottom-right border flag modified
-    private static final BitField bordBlTr      = bf(0x00008000); // 0 = Bottom-left to top-right border flag modified
-    private static final BitField pattStyle     = bf(0x00010000); // 0 = Pattern style modified
-    private static final BitField pattCol       = bf(0x00020000); // 0 = Pattern colour modified
-    private static final BitField pattBgCol     = bf(0x00040000); // 0 = Pattern background colour modified
-    private static final BitField notUsed2      = bf(0x00380000); // Always 111
-    private static final BitField undocumented  = bf(0x03C00000); // Undocumented bits
-    private static final BitField fmtBlockBits  = bf(0x7C000000); // Bits: font,align,bord,patt,prot
-    private static final BitField font          = bf(0x04000000); // 1 = Record contains font formatting block
-    private static final BitField align         = bf(0x08000000); // 1 = Record contains alignment formatting block
-    private static final BitField bord          = bf(0x10000000); // 1 = Record contains border formatting block
-    private static final BitField patt          = bf(0x20000000); // 1 = Record contains pattern formatting block
-    private static final BitField prot          = bf(0x40000000); // 1 = Record contains protection formatting block
-    private static final BitField alignTextDir  = bf(0x80000000); // 0 = Text direction modified
-
-
-    private static BitField bf(int i) {
-        return BitFieldFactory.getInstance(i);
-    }
-
-    private short field_6_not_used;
-
-    private FontFormatting _fontFormatting;
-
-    private BorderFormatting _borderFormatting;
-
-    private PatternFormatting _patternFormatting;
+    private byte comparison_operator;
 
-    private Formula field_17_formula1;
-    private Formula field_18_formula2;
+    private Formula formula1;
+    private Formula formula2;
 
     /** Creates new CFRuleRecord */
-    private CFRuleRecord(byte conditionType, byte comparisonOperation)
-    {
-        field_1_condition_type=conditionType;
-        field_2_comparison_operator=comparisonOperation;
-
-        // Set modification flags to 1: by default options are not modified
-        field_5_options = modificationBits.setValue(field_5_options, -1);
-        // Set formatting block flags to 0 (no formatting blocks)
-        field_5_options = fmtBlockBits.setValue(field_5_options, 0);
-        field_5_options = undocumented.clear(field_5_options);
-
-        field_6_not_used = (short)0x8002; // Excel seems to write this value, but it doesn't seem to care what it reads
-        _fontFormatting=null;
-        _borderFormatting=null;
-        _patternFormatting=null;
-        field_17_formula1=Formula.create(Ptg.EMPTY_PTG_ARRAY);
-        field_18_formula2=Formula.create(Ptg.EMPTY_PTG_ARRAY);
+    protected CFRuleBase(byte conditionType, byte comparisonOperation) {
+        setConditionType(conditionType);
+        setComparisonOperation(comparisonOperation);
+        formula1 = Formula.create(Ptg.EMPTY_PTG_ARRAY);
+        formula2 = Formula.create(Ptg.EMPTY_PTG_ARRAY);
     }
-
-    private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
+    protected CFRuleBase(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
         this(conditionType, comparisonOperation);
-        field_17_formula1 = Formula.create(formula1);
-        field_18_formula2 = Formula.create(formula2);
-    }
-
-    /**
-     * Creates a new comparison operation rule
-     */
-    public static CFRuleRecord create(HSSFSheet sheet, String formulaText) {
-        Ptg[] formula1 = parseFormula(formulaText, sheet);
-        return new CFRuleRecord(CONDITION_TYPE_FORMULA, ComparisonOperator.NO_COMPARISON,
-                formula1, null);
-    }
-    /**
-     * Creates a new comparison operation rule
-     */
-    public static CFRuleRecord create(HSSFSheet sheet, byte comparisonOperation,
-            String formulaText1, String formulaText2) {
-        Ptg[] formula1 = parseFormula(formulaText1, sheet);
-        Ptg[] formula2 = parseFormula(formulaText2, sheet);
-        return new CFRuleRecord(CONDITION_TYPE_CELL_VALUE_IS, comparisonOperation, formula1, formula2);
-    }
-
-    public CFRuleRecord(RecordInputStream in) {
-        field_1_condition_type = in.readByte();
-        field_2_comparison_operator = in.readByte();
-        int field_3_formula1_len = in.readUShort();
-        int field_4_formula2_len = in.readUShort();
-        field_5_options = in.readInt();
-        field_6_not_used = in.readShort();
-
-        if (containsFontFormattingBlock()) {
-            _fontFormatting = new FontFormatting(in);
-        }
-
-        if (containsBorderFormattingBlock()) {
-            _borderFormatting = new BorderFormatting(in);
-        }
-
-        if (containsPatternFormattingBlock()) {
-            _patternFormatting = new PatternFormatting(in);
-        }
-
-        // "You may not use unions, intersections or array constants in Conditional Formatting criteria"
-        field_17_formula1 = Formula.read(field_3_formula1_len, in);
-        field_18_formula2 = Formula.read(field_4_formula2_len, in);
+        this.formula1 = Formula.create(formula1);
+        this.formula2 = Formula.create(formula2);
     }
+    protected CFRuleBase() {}
 
     public byte getConditionType() {
-        return field_1_condition_type;
-    }
-
-    public boolean containsFontFormattingBlock() {
-        return getOptionFlag(font);
+        return condition_type;
     }
-    public void setFontFormatting(FontFormatting fontFormatting) {
-        _fontFormatting = fontFormatting;
-        setOptionFlag(fontFormatting != null, font);
-    }
-    public FontFormatting getFontFormatting() {
-        if( containsFontFormattingBlock()) {
-            return _fontFormatting;
+    protected void setConditionType(byte condition_type) {
+        if ((this instanceof CFRuleRecord)) {
+            if (condition_type == CONDITION_TYPE_CELL_VALUE_IS ||
+                condition_type == CONDITION_TYPE_FORMULA) {
+                // Good, valid combination
+            } else {
+                throw new IllegalArgumentException("CFRuleRecord only accepts Value-Is and Formula types");
+            }
         }
-        return null;
-    }
-
-    public boolean containsAlignFormattingBlock() {
-        return getOptionFlag(align);
-    }
-    public void setAlignFormattingUnchanged() {
-        setOptionFlag(false,align);
-    }
-
-    public boolean containsBorderFormattingBlock() {
-        return getOptionFlag(bord);
-    }
-    public void setBorderFormatting(BorderFormatting borderFormatting) {
-        _borderFormatting = borderFormatting;
-        setOptionFlag(borderFormatting != null, bord);
-    }
-    public BorderFormatting getBorderFormatting() {
-        if( containsBorderFormattingBlock()) {
-            return _borderFormatting;
-        }
-        return null;
-    }
-
-    public boolean containsPatternFormattingBlock() {
-        return getOptionFlag(patt);
-    }
-    public void setPatternFormatting(PatternFormatting patternFormatting) {
-        _patternFormatting = patternFormatting;
-        setOptionFlag(patternFormatting!=null, patt);
-    }
-    public PatternFormatting getPatternFormatting() {
-        if( containsPatternFormattingBlock())
-        {
-            return _patternFormatting;
-        }
-        return null;
-    }
-
-    public boolean containsProtectionFormattingBlock() {
-        return getOptionFlag(prot);
-    }
-    public void setProtectionFormattingUnchanged() {
-        setOptionFlag(false,prot);
+        this.condition_type = condition_type;
     }
 
     public void setComparisonOperation(byte operation) {
-        field_2_comparison_operator = operation;
+        if (operation < 0 || operation > ComparisonOperator.max_operator)
+            throw new IllegalArgumentException(
+                    "Valid operators are only in the range 0 to " +ComparisonOperator.max_operator);
+        
+        this.comparison_operator = operation;
     }
     public byte getComparisonOperation() {
-        return field_2_comparison_operator;
-    }
-
-    /**
-     * get the option flags
-     *
-     * @return bit mask
-     */
-    public int getOptions() {
-        return field_5_options;
-    }
-
-    private boolean isModified(BitField field) {
-        return !field.isSet(field_5_options);
-    }
-    private void setModified(boolean modified, BitField field) {
-        field_5_options = field.setBoolean(field_5_options, !modified);
-    }
-
-    public boolean isLeftBorderModified() {
-        return isModified(bordLeft);
-    }
-    public void setLeftBorderModified(boolean modified) {
-        setModified(modified,bordLeft);
-    }
-
-    public boolean isRightBorderModified() {
-        return isModified(bordRight);
-    }
-    public void setRightBorderModified(boolean modified)
-    {
-        setModified(modified,bordRight);
-    }
-
-    public boolean isTopBorderModified() {
-        return isModified(bordTop);
-    }
-    public void setTopBorderModified(boolean modified) {
-        setModified(modified,bordTop);
-    }
-
-    public boolean isBottomBorderModified() {
-        return isModified(bordBot);
-    }
-    public void setBottomBorderModified(boolean modified) {
-        setModified(modified,bordBot);
-    }
-
-    public boolean isTopLeftBottomRightBorderModified() {
-        return isModified(bordTlBr);
-    }
-    public void setTopLeftBottomRightBorderModified(boolean modified) {
-        setModified(modified,bordTlBr);
-    }
-
-    public boolean isBottomLeftTopRightBorderModified() {
-        return isModified(bordBlTr);
-    }
-    public void setBottomLeftTopRightBorderModified(boolean modified) {
-        setModified(modified,bordBlTr);
-    }
-
-    public boolean isPatternStyleModified() {
-        return isModified(pattStyle);
-    }
-    public void setPatternStyleModified(boolean modified) {
-        setModified(modified,pattStyle);
-    }
-
-    public boolean isPatternColorModified() {
-        return isModified(pattCol);
-    }
-    public void setPatternColorModified(boolean modified) {
-        setModified(modified,pattCol);
-    }
-
-    public boolean isPatternBackgroundColorModified() {
-        return isModified(pattBgCol);
-    }
-    public void setPatternBackgroundColorModified(boolean modified) {
-        setModified(modified,pattBgCol);
-    }
-
-    private boolean getOptionFlag(BitField field) {
-        return field.isSet(field_5_options);
-    }
-    private void setOptionFlag(boolean flag, BitField field) {
-        field_5_options = field.setBoolean(field_5_options, flag);
+        return comparison_operator;
     }
 
     /**
@@ -340,10 +109,16 @@ public final class CFRuleRecord extends
      * callers should check for null!
      */
     public Ptg[] getParsedExpression1() {
-        return field_17_formula1.getTokens();
+        return formula1.getTokens();
     }
     public void setParsedExpression1(Ptg[] ptgs) {
-        field_17_formula1 = Formula.create(ptgs);
+        formula1 = Formula.create(ptgs);
+    }
+    protected Formula getFormula1() {
+        return formula1;
+    }
+    protected void setFormula1(Formula formula1) {
+        this.formula1 = formula1;
     }
 
     /**
@@ -352,109 +127,27 @@ public final class CFRuleRecord extends
      * @return array of {@link Ptg}s, possibly <code>null</code>
      */
     public Ptg[] getParsedExpression2() {
-        return Formula.getTokens(field_18_formula2);
+        return Formula.getTokens(formula2);
     }
     public void setParsedExpression2(Ptg[] ptgs) {
-        field_18_formula2 = Formula.create(ptgs);
+        formula2 = Formula.create(ptgs);
     }
-
-    public short getSid() {
-        return sid;
+    protected Formula getFormula2() {
+        return formula2;
+    }
+    protected void setFormula2(Formula formula2) {
+        this.formula2 = formula2;
     }
 
     /**
      * @param ptgs must not be <code>null</code>
      * @return encoded size of the formula tokens (does not include 2 bytes for ushort length)
      */
-    private static int getFormulaSize(Formula formula) {
+    protected static int getFormulaSize(Formula formula) {
         return formula.getEncodedTokenSize();
     }
 
     /**
-     * called by the class that is responsible for writing this sucker.
-     * Subclasses should implement this so that their data is passed back in a
-     * byte array.
-     *
-     * @param out the stream to write to
-     */
-    public void serialize(LittleEndianOutput out) {
-        int formula1Len=getFormulaSize(field_17_formula1);
-        int formula2Len=getFormulaSize(field_18_formula2);
-
-        out.writeByte(field_1_condition_type);
-        out.writeByte(field_2_comparison_operator);
-        out.writeShort(formula1Len);
-        out.writeShort(formula2Len);
-        out.writeInt(field_5_options);
-        out.writeShort(field_6_not_used);
-
-        if (containsFontFormattingBlock()) {
-            byte[] fontFormattingRawRecord  = _fontFormatting.getRawRecord();
-            out.write(fontFormattingRawRecord);
-        }
-
-        if (containsBorderFormattingBlock()) {
-            _borderFormatting.serialize(out);
-        }
-
-        if (containsPatternFormattingBlock()) {
-            _patternFormatting.serialize(out);
-        }
-
-        field_17_formula1.serializeTokens(out);
-        field_18_formula2.serializeTokens(out);
-    }
-
-    protected int getDataSize() {
-        int i = 12 +
-                (containsFontFormattingBlock()?_fontFormatting.getRawRecord().length:0)+
-                (containsBorderFormattingBlock()?8:0)+
-                (containsPatternFormattingBlock()?4:0)+
-                getFormulaSize(field_17_formula1)+
-                getFormulaSize(field_18_formula2);
-        return i;
-    }
-
-    public String toString() {
-        StringBuffer buffer = new StringBuffer();
-        buffer.append("[CFRULE]\n");
-        buffer.append("    .condition_type   =").append(field_1_condition_type).append("\n");
-        buffer.append("    OPTION FLAGS=0x").append(Integer.toHexString(getOptions())).append("\n");
-        if (containsFontFormattingBlock()) {
-            buffer.append(_fontFormatting.toString()).append("\n");
-        }
-        if (containsBorderFormattingBlock()) {
-            buffer.append(_borderFormatting.toString()).append("\n");
-        }
-        if (containsPatternFormattingBlock()) {
-            buffer.append(_patternFormatting.toString()).append("\n");
-        }
-        buffer.append("    Formula 1 =").append(Arrays.toString(field_17_formula1.getTokens())).append("\n");
-        buffer.append("    Formula 2 =").append(Arrays.toString(field_18_formula2.getTokens())).append("\n");
-        buffer.append("[/CFRULE]\n");
-        return buffer.toString();
-    }
-
-    public Object clone() {
-        CFRuleRecord rec = new CFRuleRecord(field_1_condition_type, field_2_comparison_operator);
-        rec.field_5_options = field_5_options;
-        rec.field_6_not_used = field_6_not_used;
-        if (containsFontFormattingBlock()) {
-            rec._fontFormatting = (FontFormatting) _fontFormatting.clone();
-        }
-        if (containsBorderFormattingBlock()) {
-            rec._borderFormatting = (BorderFormatting) _borderFormatting.clone();
-        }
-        if (containsPatternFormattingBlock()) {
-            rec._patternFormatting = (PatternFormatting) _patternFormatting.clone();
-        }
-        rec.field_17_formula1 = field_17_formula1.copy();
-        rec.field_18_formula2 = field_18_formula2.copy();
-
-        return rec;
-    }
-
-    /**
      * TODO - parse conditional format formulas properly i.e. produce tRefN and tAreaN instead of tRef and tArea
      * this call will produce the wrong results if the formula contains any cell references
      * One approach might be to apply the inverse of SharedFormulaRecord.convertSharedFormulas(Stack, int, int)
@@ -462,7 +155,7 @@ public final class CFRuleRecord extends
      *
      * @return <code>null</code> if <tt>formula</tt> was null.
      */
-    private static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
+    protected static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
         if(formula == null) {
             return null;
         }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java?rev=1690527&r1=1690526&r2=1690527&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRuleRecord.java Sun Jul 12 20:38:57 2015
@@ -19,13 +19,11 @@ package org.apache.poi.hssf.record;
 
 import java.util.Arrays;
 
-import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
 import org.apache.poi.hssf.record.cf.PatternFormatting;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.ss.formula.Formula;
-import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
@@ -38,28 +36,10 @@ import org.apache.poi.util.LittleEndianO
  *  new-style (Excel 2007+) also make use of {@link CFRule12Record}
  *  and {@link CFExRuleRecord} for their rules.
  */
-public final class CFRuleRecord extends StandardRecord {
+public final class CFRuleRecord extends CFRuleBase {
     public static final short sid = 0x01B1;
 
-    public static final class ComparisonOperator {
-        public static final byte NO_COMPARISON = 0;
-        public static final byte BETWEEN       = 1;
-        public static final byte NOT_BETWEEN   = 2;
-        public static final byte EQUAL         = 3;
-        public static final byte NOT_EQUAL     = 4;
-        public static final byte GT            = 5;
-        public static final byte LT            = 6;
-        public static final byte GE            = 7;
-        public static final byte LE            = 8;
-    }
-
-    private byte  field_1_condition_type;
-    public static final byte CONDITION_TYPE_CELL_VALUE_IS = 1;
-    public static final byte CONDITION_TYPE_FORMULA = 2;
-
-    private byte  field_2_comparison_operator;
-
-    private int   field_5_options;
+    private int field_5_options;
 
     private static final BitField modificationBits = bf(0x003FFFFF); // Bits: font,align,bord,patt,prot
     private static final BitField alignHor      = bf(0x00000001); // 0 = Horizontal alignment modified
@@ -104,15 +84,17 @@ public final class CFRuleRecord extends
 
     private PatternFormatting _patternFormatting;
 
-    private Formula field_17_formula1;
-    private Formula field_18_formula2;
-
     /** Creates new CFRuleRecord */
-    private CFRuleRecord(byte conditionType, byte comparisonOperation)
-    {
-        field_1_condition_type=conditionType;
-        field_2_comparison_operator=comparisonOperation;
+    private CFRuleRecord(byte conditionType, byte comparisonOperation) {
+        super(conditionType, comparisonOperation);
+        setDefaults();
+    }
 
+    private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
+        super(conditionType, comparisonOperation, formula1, formula2);
+        setDefaults();
+    }
+    private void setDefaults() {
         // Set modification flags to 1: by default options are not modified
         field_5_options = modificationBits.setValue(field_5_options, -1);
         // Set formatting block flags to 0 (no formatting blocks)
@@ -123,14 +105,6 @@ public final class CFRuleRecord extends
         _fontFormatting=null;
         _borderFormatting=null;
         _patternFormatting=null;
-        field_17_formula1=Formula.create(Ptg.EMPTY_PTG_ARRAY);
-        field_18_formula2=Formula.create(Ptg.EMPTY_PTG_ARRAY);
-    }
-
-    private CFRuleRecord(byte conditionType, byte comparisonOperation, Ptg[] formula1, Ptg[] formula2) {
-        this(conditionType, comparisonOperation);
-        field_17_formula1 = Formula.create(formula1);
-        field_18_formula2 = Formula.create(formula2);
     }
 
     /**
@@ -152,8 +126,8 @@ public final class CFRuleRecord extends
     }
 
     public CFRuleRecord(RecordInputStream in) {
-        field_1_condition_type = in.readByte();
-        field_2_comparison_operator = in.readByte();
+        setConditionType(in.readByte());
+        setComparisonOperation(in.readByte());
         int field_3_formula1_len = in.readUShort();
         int field_4_formula2_len = in.readUShort();
         field_5_options = in.readInt();
@@ -172,12 +146,8 @@ public final class CFRuleRecord extends
         }
 
         // "You may not use unions, intersections or array constants in Conditional Formatting criteria"
-        field_17_formula1 = Formula.read(field_3_formula1_len, in);
-        field_18_formula2 = Formula.read(field_4_formula2_len, in);
-    }
-
-    public byte getConditionType() {
-        return field_1_condition_type;
+        setFormula1(Formula.read(field_3_formula1_len, in));
+        setFormula2(Formula.read(field_4_formula2_len, in));
     }
 
     public boolean containsFontFormattingBlock() {
@@ -237,13 +207,6 @@ public final class CFRuleRecord extends
         setOptionFlag(false,prot);
     }
 
-    public void setComparisonOperation(byte operation) {
-        field_2_comparison_operator = operation;
-    }
-    public byte getComparisonOperation() {
-        return field_2_comparison_operator;
-    }
-
     /**
      * get the option flags
      *
@@ -331,46 +294,11 @@ public final class CFRuleRecord extends
         field_5_options = field.setBoolean(field_5_options, flag);
     }
 
-    /**
-     * get the stack of the 1st expression as a list
-     *
-     * @return list of tokens (casts stack to a list and returns it!)
-     * this method can return null is we are unable to create Ptgs from
-     *	 existing excel file
-     * callers should check for null!
-     */
-    public Ptg[] getParsedExpression1() {
-        return field_17_formula1.getTokens();
-    }
-    public void setParsedExpression1(Ptg[] ptgs) {
-        field_17_formula1 = Formula.create(ptgs);
-    }
-
-    /**
-     * get the stack of the 2nd expression as a list
-     *
-     * @return array of {@link Ptg}s, possibly <code>null</code>
-     */
-    public Ptg[] getParsedExpression2() {
-        return Formula.getTokens(field_18_formula2);
-    }
-    public void setParsedExpression2(Ptg[] ptgs) {
-        field_18_formula2 = Formula.create(ptgs);
-    }
-
     public short getSid() {
         return sid;
     }
 
     /**
-     * @param ptgs must not be <code>null</code>
-     * @return encoded size of the formula tokens (does not include 2 bytes for ushort length)
-     */
-    private static int getFormulaSize(Formula formula) {
-        return formula.getEncodedTokenSize();
-    }
-
-    /**
      * called by the class that is responsible for writing this sucker.
      * Subclasses should implement this so that their data is passed back in a
      * byte array.
@@ -378,11 +306,11 @@ public final class CFRuleRecord extends
      * @param out the stream to write to
      */
     public void serialize(LittleEndianOutput out) {
-        int formula1Len=getFormulaSize(field_17_formula1);
-        int formula2Len=getFormulaSize(field_18_formula2);
+        int formula1Len=getFormulaSize(getFormula1());
+        int formula2Len=getFormulaSize(getFormula2());
 
-        out.writeByte(field_1_condition_type);
-        out.writeByte(field_2_comparison_operator);
+        out.writeByte(getConditionType());
+        out.writeByte(getComparisonOperation());
         out.writeShort(formula1Len);
         out.writeShort(formula2Len);
         out.writeInt(field_5_options);
@@ -401,8 +329,8 @@ public final class CFRuleRecord extends
             _patternFormatting.serialize(out);
         }
 
-        field_17_formula1.serializeTokens(out);
-        field_18_formula2.serializeTokens(out);
+        getFormula1().serializeTokens(out);
+        getFormula2().serializeTokens(out);
     }
 
     protected int getDataSize() {
@@ -410,15 +338,15 @@ public final class CFRuleRecord extends
                 (containsFontFormattingBlock()?_fontFormatting.getRawRecord().length:0)+
                 (containsBorderFormattingBlock()?8:0)+
                 (containsPatternFormattingBlock()?4:0)+
-                getFormulaSize(field_17_formula1)+
-                getFormulaSize(field_18_formula2);
+                getFormulaSize(getFormula1())+
+                getFormulaSize(getFormula2());
         return i;
     }
 
     public String toString() {
         StringBuffer buffer = new StringBuffer();
         buffer.append("[CFRULE]\n");
-        buffer.append("    .condition_type   =").append(field_1_condition_type).append("\n");
+        buffer.append("    .condition_type   =").append(getConditionType()).append("\n");
         buffer.append("    OPTION FLAGS=0x").append(Integer.toHexString(getOptions())).append("\n");
         if (containsFontFormattingBlock()) {
             buffer.append(_fontFormatting.toString()).append("\n");
@@ -429,14 +357,14 @@ public final class CFRuleRecord extends
         if (containsPatternFormattingBlock()) {
             buffer.append(_patternFormatting.toString()).append("\n");
         }
-        buffer.append("    Formula 1 =").append(Arrays.toString(field_17_formula1.getTokens())).append("\n");
-        buffer.append("    Formula 2 =").append(Arrays.toString(field_18_formula2.getTokens())).append("\n");
+        buffer.append("    Formula 1 =").append(Arrays.toString(getFormula1().getTokens())).append("\n");
+        buffer.append("    Formula 2 =").append(Arrays.toString(getFormula2().getTokens())).append("\n");
         buffer.append("[/CFRULE]\n");
         return buffer.toString();
     }
 
     public Object clone() {
-        CFRuleRecord rec = new CFRuleRecord(field_1_condition_type, field_2_comparison_operator);
+        CFRuleRecord rec = new CFRuleRecord(getConditionType(), getComparisonOperation());
         rec.field_5_options = field_5_options;
         rec.field_6_not_used = field_6_not_used;
         if (containsFontFormattingBlock()) {
@@ -448,25 +376,9 @@ public final class CFRuleRecord extends
         if (containsPatternFormattingBlock()) {
             rec._patternFormatting = (PatternFormatting) _patternFormatting.clone();
         }
-        rec.field_17_formula1 = field_17_formula1.copy();
-        rec.field_18_formula2 = field_18_formula2.copy();
+        rec.setFormula1(getFormula1().copy());
+        rec.setFormula2(getFormula2().copy());
 
         return rec;
     }
-
-    /**
-     * TODO - parse conditional format formulas properly i.e. produce tRefN and tAreaN instead of tRef and tArea
-     * this call will produce the wrong results if the formula contains any cell references
-     * One approach might be to apply the inverse of SharedFormulaRecord.convertSharedFormulas(Stack, int, int)
-     * Note - two extra parameters (rowIx & colIx) will be required. They probably come from one of the Region objects.
-     *
-     * @return <code>null</code> if <tt>formula</tt> was null.
-     */
-    private static Ptg[] parseFormula(String formula, HSSFSheet sheet) {
-        if(formula == null) {
-            return null;
-        }
-        int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
-        return HSSFFormulaParser.parse(formula, sheet.getWorkbook(), FormulaType.CELL, sheetIndex);
-    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java?rev=1690527&r1=1690526&r2=1690527&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java Sun Jul 12 20:38:57 2015
@@ -18,8 +18,8 @@
 package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.hssf.model.HSSFFormulaParser;
+import org.apache.poi.hssf.record.CFRuleBase.ComparisonOperator;
 import org.apache.poi.hssf.record.CFRuleRecord;
-import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
 import org.apache.poi.hssf.record.cf.PatternFormatting;

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java?rev=1690527&r1=1690526&r2=1690527&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java Sun Jul 12 20:38:57 2015
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertArr
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
-import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
+import org.apache.poi.hssf.record.CFRuleBase.ComparisonOperator;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
 import org.apache.poi.hssf.record.cf.PatternFormatting;
@@ -36,8 +36,7 @@ import org.apache.poi.util.LittleEndian;
 /**
  * Tests the serialization and deserialization of the TestCFRuleRecord
  * class works correctly.
- *
- * @author Dmitriy Kumshayev
+ * TODO Add {@link CFRule12Record} tests
  */
 public final class TestCFRuleRecord extends TestCase {
     public void testConstructors () {

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java?rev=1690527&r1=1690526&r2=1690527&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java Sun Jul 12 20:38:57 2015
@@ -27,11 +27,11 @@ import junit.framework.TestCase;
 
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.record.CFHeaderRecord;
+import org.apache.poi.hssf.record.CFRuleBase.ComparisonOperator;
 import org.apache.poi.hssf.record.CFRuleRecord;
 import org.apache.poi.hssf.record.RecordFactory;
-import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.LittleEndian;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org