]> source.dussan.org Git - poi.git/commitdiff
Further HSSF support towards CF IconSets #58130
authorNick Burch <nick@apache.org>
Wed, 15 Jul 2015 00:04:53 +0000 (00:04 +0000)
committerNick Burch <nick@apache.org>
Wed, 15 Jul 2015 00:04:53 +0000 (00:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1691113 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/record/CFRule12Record.java
src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
src/java/org/apache/poi/hssf/usermodel/HSSFSheetConditionalFormatting.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java

index 2c684e3c17abd96f4586ad04bc3600e65ab77622..230cb1dff4f401fad9e63568278e1d5d4b1aac17 100644 (file)
@@ -173,6 +173,14 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
     public IconMultiStateFormatting getMultiStateFormatting() {
         return multistate;
     }
+    public IconMultiStateFormatting createMultiStateFormatting() {
+        if (multistate != null) return multistate;
+        
+        // Convert, setup and return
+        setConditionType(CONDITION_TYPE_ICON_SET);
+        multistate = new IconMultiStateFormatting();
+        return multistate;
+    }
 
     /**
      * get the stack of the scale expression as a list
index f3a81c0358e24489c543e25654b4ade08851bbff..c36748e97c534a4fd51e831a488cae3d52d64014 100644 (file)
 package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.hssf.model.HSSFFormulaParser;
+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;
 import org.apache.poi.hssf.record.cf.BorderFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
+import org.apache.poi.hssf.record.cf.IconMultiStateFormatting;
 import org.apache.poi.hssf.record.cf.PatternFormatting;
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.usermodel.ConditionType;
@@ -165,7 +167,46 @@ public final class HSSFConditionalFormattingRule implements ConditionalFormattin
     {
         return getPatternFormatting(true);
     }
+    
+    private HSSFIconMultiStateFormatting getMultiStateFormatting(boolean create) {
+        if (cfRuleRecord instanceof CFRule12Record) {
+            // Good
+        } else {
+            if (create) throw new IllegalArgumentException("Can't convert a CF into a CF12 record");
+            return null;
+        }
+        CFRule12Record cfRule12Record = (CFRule12Record)cfRuleRecord;
+        IconMultiStateFormatting iconFormatting = cfRule12Record.getMultiStateFormatting();
+        if (iconFormatting != null)
+        {
+            return new HSSFIconMultiStateFormatting(cfRule12Record);
+        }
+        else if( create )
+        {
+            iconFormatting = cfRule12Record.createMultiStateFormatting();
+            return new HSSFIconMultiStateFormatting(cfRule12Record);
+        }
+        else
+        {
+            return null;
+        }
+    }
+    
+    /**
+     * @return icon / multi-state formatting object if defined, <code>null</code> otherwise
+     */
+    public HSSFIconMultiStateFormatting getMultiStateFormatting() {
+        return getMultiStateFormatting(false);
+    }
 
+    /**
+     * create a new icon / multi-state formatting object if it does not exist,
+     * otherwise just return the existing object.
+     */
+    public HSSFIconMultiStateFormatting createMultiStateFormatting() {
+        return getMultiStateFormatting(true);
+    }
+    
     /**
      * @return -  the conditiontype for the cfrule
      */
@@ -205,7 +246,7 @@ public final class HSSFConditionalFormattingRule implements ConditionalFormattin
     }
 
     private String toFormulaString(Ptg[] parsedExpression) {
-        if(parsedExpression ==null) {
+        if(parsedExpression == null || parsedExpression.length == 0) {
             return null;
         }
         return HSSFFormulaParser.toFormulaString(workbook, parsedExpression);
index 1064467dbfcce9b8608cde47701580a875256ec7..f0df8e52233ca3f19d516ab777ab8b59970d23d8 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
+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.aggregates.CFRecordsAggregate;
@@ -24,6 +25,7 @@ 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.IconMultiStateFormatting.IconSet;
 import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
 import org.apache.poi.ss.util.CellRangeAddress;
 
@@ -94,6 +96,20 @@ public final class HSSFSheetConditionalFormatting implements SheetConditionalFor
                CFRuleRecord rr = CFRuleRecord.create(_sheet, formula);
                return new HSSFConditionalFormattingRule(wb, rr);
        }
+       
+       /**
+        * A factory method allowing the creation of conditional formatting
+        *  rules using an Icon Set / Multi-State formatting/
+        */
+       // TODO Implement
+/*
+       public HSSFConditionalFormattingRule createConditionalFormattingRule(
+               IconSet iconSet) { // TODO Multi-State data for it
+        HSSFWorkbook wb = _sheet.getWorkbook();
+        CFRule12Record rr = CFRule12Record.create(_sheet, iconSet);
+        return new HSSFConditionalFormattingRule(wb, rr);
+       }
+*/
 
        /**
         * Adds a copy of HSSFConditionalFormatting object to the sheet
index a803fc83cdcd92d1b0168c688417a9841d9a0911..6276b582915c38dbcba835860da4290a324d4f0e 100644 (file)
@@ -24,6 +24,7 @@ import junit.framework.TestCase;
 import org.apache.poi.hssf.usermodel.HSSFConditionalFormatting;\r
 import org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule;\r
 import org.apache.poi.ss.ITestDataProvider;\r
+import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;\r
 import org.apache.poi.ss.util.CellRangeAddress;\r
 \r
 /**\r
@@ -544,6 +545,7 @@ public abstract class BaseTestConditionalFormatting extends TestCase {
         Sheet s = wb.getSheet("CF");\r
         ConditionalFormatting cf = null;\r
         ConditionalFormattingRule cr = null;\r
+        IconMultiStateFormatting icon = null;\r
         \r
         // Sanity check data\r
         assertEquals("Values", s.getRow(0).getCell(0).toString());\r
@@ -644,7 +646,30 @@ public abstract class BaseTestConditionalFormatting extends TestCase {
         \r
         // Colours R->G - Column F\r
         // Colours BWR - Column G\r
+        \r
         // Icons : Default - Column H\r
+        cf = sheetCF.getConditionalFormattingAt(5);\r
+        assertEquals(1, cf.getFormattingRanges().length);\r
+        assertEquals("H2:H17", cf.getFormattingRanges()[0].formatAsString());\r
+        \r
+        assertEquals(1, cf.getNumberOfRules());\r
+        cr = cf.getRule(0);\r
+        assertEquals(ConditionType.ICON_SET, cr.getConditionTypeType());\r
+        assertEquals(ComparisonOperator.NO_COMPARISON, cr.getComparisonOperation());\r
+        assertEquals(null, cr.getFormula1());\r
+        assertEquals(null, cr.getFormula2());\r
+        if (cr instanceof HSSFConditionalFormattingRule) {\r
+            HSSFConditionalFormattingRule hcr = (HSSFConditionalFormattingRule)cr;\r
+            icon = hcr.getMultiStateFormatting();\r
+            assertNotNull(icon);\r
+            assertEquals(IconSet.GYR_3_TRAFFIC_LIGHTS, icon.getIconSet());\r
+            assertEquals(false, icon.isIconOnly());\r
+            assertEquals(false, icon.isReversed());\r
+            // TODO Check the rest\r
+        } else {\r
+            // TODO XSSF Support\r
+        }\r
+        \r
         // Icons : 3 signs - Column I\r
         // Icons : 3 traffic lights 2 - Column J\r
         // Icons : 4 traffic lights - Column K\r
@@ -834,6 +859,10 @@ public abstract class BaseTestConditionalFormatting extends TestCase {
         assertEquals(BorderFormatting.BORDER_HAIR, r1fp.getBorderRight());\r
     }\r
     \r
+    public void testCreateIconFormatting() {\r
+        // TODO Implement for XSSF, then test here\r
+    }\r
+    \r
     public void testBug55380() {\r
         Workbook wb = _testDataProvider.createWorkbook();\r
         Sheet sheet = wb.createSheet();\r