Author: nick
Date: Mon Jul 13 18:38:15 2015
New Revision: 1690793

URL: http://svn.apache.org/r1690793
Log:
Begin updating the HSSF CF code to work on the base types, so it can handle 
both CF and CF12

Modified:
    
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFBorderFormatting.java
    
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
    
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFontFormatting.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatternFormatting.java
    
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
    
poi/trunk/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
 Mon Jul 13 18:38:15 2015
@@ -21,7 +21,11 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.poi.hssf.model.RecordStream;
+import org.apache.poi.hssf.record.CFHeader12Record;
+import org.apache.poi.hssf.record.CFHeaderBase;
 import org.apache.poi.hssf.record.CFHeaderRecord;
+import org.apache.poi.hssf.record.CFRule12Record;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.CFRuleRecord;
 import org.apache.poi.hssf.record.Record;
 import org.apache.poi.ss.formula.FormulaShifter;
@@ -45,12 +49,12 @@ public final class CFRecordsAggregate ex
        private static final int MAX_97_2003_CONDTIONAL_FORMAT_RULES = 3;
        private static final POILogger logger = 
POILogFactory.getLogger(CFRecordsAggregate.class);
 
-       private final CFHeaderRecord header;
+       private final CFHeaderBase header;
 
        /** List of CFRuleRecord objects */
-       private final List<CFRuleRecord> rules;
+       private final List<CFRuleBase> rules;
 
-       private CFRecordsAggregate(CFHeaderRecord pHeader, CFRuleRecord[] 
pRules) {
+       private CFRecordsAggregate(CFHeaderBase pHeader, CFRuleBase[] pRules) {
                if(pHeader == null) {
                        throw new IllegalArgumentException("header must not be 
null");
                }
@@ -67,14 +71,21 @@ public final class CFRecordsAggregate ex
                        throw new RuntimeException("Mismatch number of rules");
                }
                header = pHeader;
-               rules = new ArrayList<CFRuleRecord>(3);
+               rules = new ArrayList<CFRuleBase>(pRules.length);
                for (int i = 0; i < pRules.length; i++) {
+                   checkRuleType(pRules[i]);
                        rules.add(pRules[i]);
                }
        }
 
-       public CFRecordsAggregate(CellRangeAddress[] regions, CFRuleRecord[] 
rules) {
-               this(new CFHeaderRecord(regions, rules.length), rules);
+       public CFRecordsAggregate(CellRangeAddress[] regions, CFRuleBase[] 
rules) {
+               this(createHeader(regions, rules), rules);
+       }
+       private static CFHeaderBase createHeader(CellRangeAddress[] regions, 
CFRuleBase[] rules) {
+           if (rules.length == 0 || rules[0] instanceof CFRuleRecord) {
+               return new CFHeaderRecord(regions, rules.length);
+           }
+           return new CFHeader12Record(regions, rules.length);
        }
 
        /**
@@ -84,17 +95,19 @@ public final class CFRecordsAggregate ex
         */
        public static CFRecordsAggregate createCFAggregate(RecordStream rs) {
                Record rec = rs.getNext();
-               if (rec.getSid() != CFHeaderRecord.sid) {
+               if (rec.getSid() != CFHeaderRecord.sid &&
+                   rec.getSid() != CFHeader12Record.sid) {
                        throw new IllegalStateException("next record sid was " 
+ rec.getSid() 
-                                       + " instead of " + CFHeaderRecord.sid + 
" as expected");
+                                       + " instead of " + CFHeaderRecord.sid + 
" or " +
+                               CFHeader12Record.sid + " as expected");
                }
 
-               CFHeaderRecord header = (CFHeaderRecord)rec;
+               CFHeaderBase header = (CFHeaderBase)rec;
                int nRules = header.getNumberOfConditionalFormats();
 
-               CFRuleRecord[] rules = new CFRuleRecord[nRules];
+               CFRuleBase[] rules = new CFRuleBase[nRules];
                for (int i = 0; i < rules.length; i++) {
-                       rules[i] = (CFRuleRecord) rs.getNext();
+                       rules[i] = (CFRuleBase) rs.getNext();
                }
                
                return new CFRecordsAggregate(header, rules);
@@ -105,18 +118,17 @@ public final class CFRecordsAggregate ex
         */
        public CFRecordsAggregate cloneCFAggregate()
        {
-         
-               CFRuleRecord[] newRecs = new CFRuleRecord[rules.size()];
+           CFRuleBase[] newRecs = new CFRuleBase[rules.size()];
                for (int i = 0; i < newRecs.length; i++) {
                        newRecs[i] = (CFRuleRecord) getRule(i).clone();
                }
-               return new CFRecordsAggregate((CFHeaderRecord) header.clone(), 
newRecs);
+               return new CFRecordsAggregate((CFHeaderBase)header.clone(), 
newRecs);
        }
 
        /**
         * @return the header. Never <code>null</code>.
         */
-       public CFHeaderRecord getHeader()
+       public CFHeaderBase getHeader()
        {
                return header;
        }
@@ -127,18 +139,31 @@ public final class CFRecordsAggregate ex
                                        + ") nRules=" + rules.size());
                }
        }
-       public CFRuleRecord getRule(int idx) {
+       private void checkRuleType(CFRuleBase r) {
+           if (header instanceof CFHeaderRecord &&
+                    r instanceof CFRuleRecord) {
+               return;
+           }
+        if (header instanceof CFHeader12Record &&
+                 r instanceof CFRule12Record) {
+           return;
+        }
+        throw new IllegalArgumentException("Header and Rule must both be CF or 
both be CF12, can't mix");
+       }
+       
+       public CFRuleBase getRule(int idx) {
                checkRuleIndex(idx);
                return rules.get(idx);
        }
-       public void setRule(int idx, CFRuleRecord r) {
+       public void setRule(int idx, CFRuleBase r) {
                if (r == null) {
                        throw new IllegalArgumentException("r must not be 
null");
                }
                checkRuleIndex(idx);
+               checkRuleType(r);
                rules.set(idx, r);
        }
-       public void addRule(CFRuleRecord r) {
+       public void addRule(CFRuleBase r) {
                if (r == null) {
                        throw new IllegalArgumentException("r must not be 
null");
                }
@@ -147,6 +172,7 @@ public final class CFRecordsAggregate ex
                            + " any more than " + 
MAX_97_2003_CONDTIONAL_FORMAT_RULES 
                     + " - this file will cause problems with old Excel 
versions");
                }
+        checkRuleType(r);
                rules.add(r);
                header.setNumberOfConditionalFormats(rules.size());
        }
@@ -160,25 +186,29 @@ public final class CFRecordsAggregate ex
        public String toString()
        {
                StringBuffer buffer = new StringBuffer();
+               String type = "CF";
+               if (header instanceof CFHeader12Record) {
+                   type = "CF12";
+               }
 
-               buffer.append("[CF]\n");
+               buffer.append("[").append(type).append("]\n");
                if( header != null )
                {
                        buffer.append(header.toString());
                }
                for(int i=0; i<rules.size(); i++)
                {
-                       CFRuleRecord cfRule = rules.get(i);
+                       CFRuleBase cfRule = rules.get(i);
                        buffer.append(cfRule.toString());
                }
-               buffer.append("[/CF]\n");
+        buffer.append("[/").append(type).append("]\n");
                return buffer.toString();
        }
 
        public void visitContainedRecords(RecordVisitor rv) {
                rv.visitRecord(header);
                for(int i=0; i<rules.size(); i++) {
-                       CFRuleRecord rule = rules.get(i);
+                       CFRuleBase rule = rules.get(i);
                        rv.visitRecord(rule);
                }
        }
@@ -214,7 +244,7 @@ public final class CFRecordsAggregate ex
                }
                
                for(int i=0; i<rules.size(); i++) {
-                       CFRuleRecord rule = rules.get(i);
+                       CFRuleBase rule = rules.get(i);
                        Ptg[] ptgs;
                        ptgs = rule.getParsedExpression1();
                        if (ptgs != null && shifter.adjustFormula(ptgs, 
currentExternSheetIx)) {
@@ -224,6 +254,13 @@ public final class CFRecordsAggregate ex
                        if (ptgs != null && shifter.adjustFormula(ptgs, 
currentExternSheetIx)) {
                                rule.setParsedExpression2(ptgs);
                        }
+                       if (rule instanceof CFRule12Record) {
+                           CFRule12Record rule12 = (CFRule12Record)rule;
+                   ptgs = rule12.getParsedExpressionScale();
+                   if (ptgs != null && shifter.adjustFormula(ptgs, 
currentExternSheetIx)) {
+                       rule12.setParsedExpressionScale(ptgs);
+                   }
+                       }
                }
                return true;
        }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFBorderFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFBorderFormatting.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFBorderFormatting.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFBorderFormatting.java 
Mon Jul 13 18:38:15 2015
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.record.CFRuleRecord;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 
 /**
@@ -26,10 +26,10 @@ import org.apache.poi.hssf.record.cf.Bor
  */
 public final class HSSFBorderFormatting implements 
org.apache.poi.ss.usermodel.BorderFormatting
 {
-       private final CFRuleRecord cfRuleRecord;
+       private final CFRuleBase cfRuleRecord;
        private final BorderFormatting borderFormatting;
        
-       protected HSSFBorderFormatting(CFRuleRecord cfRuleRecord)
+       protected HSSFBorderFormatting(CFRuleBase cfRuleRecord)
        {
                this.cfRuleRecord = cfRuleRecord;
                this.borderFormatting = cfRuleRecord.getBorderFormatting();

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java 
(original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java 
Mon Jul 13 18:38:15 2015
@@ -16,7 +16,7 @@
 ==================================================================== */
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.record.CFRuleRecord;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.aggregates.CFRecordsAggregate;
 import org.apache.poi.ss.usermodel.ConditionalFormatting;
 import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
@@ -147,7 +147,7 @@ public final class HSSFConditionalFormat
         */
        public HSSFConditionalFormattingRule getRule(int idx)
        {
-               CFRuleRecord ruleRecord = cfAggregate.getRule(idx);
+               CFRuleBase ruleRecord = cfAggregate.getRule(idx);
                return new HSSFConditionalFormattingRule(_workbook, ruleRecord);
        }
 

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=1690793&r1=1690792&r2=1690793&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
 Mon Jul 13 18:38:15 2015
@@ -18,6 +18,7 @@
 package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.hssf.model.HSSFFormulaParser;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.CFRuleBase.ComparisonOperator;
 import org.apache.poi.hssf.record.CFRuleRecord;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
@@ -36,10 +37,10 @@ public final class HSSFConditionalFormat
 {
        private static final byte CELL_COMPARISON = 
CFRuleRecord.CONDITION_TYPE_CELL_VALUE_IS;
 
-       private final CFRuleRecord cfRuleRecord;
+       private final CFRuleBase cfRuleRecord;
        private final HSSFWorkbook workbook;
 
-       HSSFConditionalFormattingRule(HSSFWorkbook pWorkbook, CFRuleRecord 
pRuleRecord) {
+       HSSFConditionalFormattingRule(HSSFWorkbook pWorkbook, CFRuleBase 
pRuleRecord) {
                if (pWorkbook == null) {
                        throw new IllegalArgumentException("pWorkbook must not 
be null");
                }
@@ -50,7 +51,7 @@ public final class HSSFConditionalFormat
                cfRuleRecord = pRuleRecord;
        }
 
-       CFRuleRecord getCfRuleRecord()
+       CFRuleBase getCfRuleRecord()
        {
                return cfRuleRecord;
        }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFontFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFontFormatting.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFontFormatting.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFontFormatting.java 
Mon Jul 13 18:38:15 2015
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.record.CFRuleRecord;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.cf.FontFormatting;
 /**
  * High level representation for Font Formatting component
@@ -25,7 +25,6 @@ import org.apache.poi.hssf.record.cf.Fon
  */
 public final class HSSFFontFormatting implements 
org.apache.poi.ss.usermodel.FontFormatting
 {
-
        /** Underline type - None */
        public final static byte U_NONE              = FontFormatting.U_NONE;
        /** Underline type - Single */
@@ -39,7 +38,7 @@ public final class HSSFFontFormatting im
 
        private final FontFormatting fontFormatting;
        
-       protected HSSFFontFormatting(CFRuleRecord cfRuleRecord)
+       protected HSSFFontFormatting(CFRuleBase cfRuleRecord)
        {
                this.fontFormatting = cfRuleRecord.getFontFormatting();
        }

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatternFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatternFormatting.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatternFormatting.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatternFormatting.java 
Mon Jul 13 18:38:15 2015
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.record.CFRuleRecord;
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.cf.PatternFormatting;
 
 /**
@@ -25,10 +25,10 @@ import org.apache.poi.hssf.record.cf.Pat
  */
 public class HSSFPatternFormatting implements 
org.apache.poi.ss.usermodel.PatternFormatting
 {
-       private final CFRuleRecord cfRuleRecord;
+       private final CFRuleBase cfRuleRecord;
        private final PatternFormatting patternFormatting;
        
-       protected HSSFPatternFormatting(CFRuleRecord cfRuleRecord)
+       protected HSSFPatternFormatting(CFRuleBase cfRuleRecord)
        {
                this.cfRuleRecord = cfRuleRecord; 
                this.patternFormatting = cfRuleRecord.getPatternFormatting();

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java?rev=1690793&r1=1690792&r2=1690793&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
 Mon Jul 13 18:38:15 2015
@@ -17,14 +17,15 @@
 
 package org.apache.poi.hssf.usermodel;
 
+import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.CFRuleRecord;
 import org.apache.poi.hssf.record.aggregates.CFRecordsAggregate;
 import org.apache.poi.hssf.record.aggregates.ConditionalFormattingTable;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.ConditionalFormatting;
 import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
 import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
 import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.ss.SpreadsheetVersion;
 
 /**
  * The 'Conditional Formatting' facet of <tt>HSSFSheet</tt>
@@ -146,7 +147,7 @@ public final class HSSFSheetConditionalF
                        throw new IllegalArgumentException("Number of rules 
must not exceed 3");
                }
 
-               CFRuleRecord[] rules = new CFRuleRecord[cfRules.length];
+               CFRuleBase[] rules = new CFRuleBase[cfRules.length];
                for (int i = 0; i != cfRules.length; i++) {
                        rules[i] = cfRules[i].getCfRuleRecord();
                }

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=1690793&r1=1690792&r2=1690793&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
 Mon Jul 13 18:38:15 2015
@@ -28,6 +28,7 @@ import junit.framework.TestCase;
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.record.CFHeaderBase;
 import org.apache.poi.hssf.record.CFHeaderRecord;
+import org.apache.poi.hssf.record.CFRule12Record;
 import org.apache.poi.hssf.record.CFRuleBase;
 import org.apache.poi.hssf.record.CFRuleBase.ComparisonOperator;
 import org.apache.poi.hssf.record.CFRuleRecord;
@@ -128,4 +129,30 @@ public final class TestCFRecordsAggregat
         }
         assertEquals(rules.length, nRules);
     }
+    
+    public void testCantMixTypes() {
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        HSSFSheet sheet = workbook.createSheet();
+        CellRangeAddress[] cellRanges = {
+                new CellRangeAddress(0,1,0,0),
+                new CellRangeAddress(0,1,2,2),
+        };
+        CFRuleBase[] rules = {
+                CFRuleRecord.create(sheet, "7"),
+                CFRule12Record.create(sheet, ComparisonOperator.BETWEEN, "2", 
"5"),
+        };
+        try {
+            new CFRecordsAggregate(cellRanges, rules);
+            fail("Shouldn't be able to mix between types");
+        } catch (IllegalArgumentException e) {}
+        
+        
+        rules = new CFRuleBase[] { CFRuleRecord.create(sheet, "7") };
+        CFRecordsAggregate agg = new CFRecordsAggregate(cellRanges, rules);
+        
+        try {
+            agg.addRule(CFRule12Record.create(sheet, "7"));
+            fail("Shouldn't be able to mix between types");
+        } catch (IllegalArgumentException e) {}
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to