Author: nick
Date: Sat Jul 18 04:55:27 2015
New Revision: 1691679

URL: http://svn.apache.org/r1691679
Log:
#58130 Mostly there with CF Icon sets

Modified:
    
poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/ConditionalFormattingTable.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java
    
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormatting.java
    
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFConditionalFormattingThreshold.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFIconMultiStateFormatting.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
    
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java

Modified: 
poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java 
(original)
+++ 
poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java 
Sat Jul 18 04:55:27 2015
@@ -21,6 +21,8 @@ package org.apache.poi.ss.examples;
 
 import org.apache.poi.hssf.usermodel.*;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
+import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
@@ -31,10 +33,9 @@ import java.io.IOException;
  * Excel Conditional Formatting -- Examples
  *
  * <p>
- *   Based on the code snippets from 
http://www.contextures.com/xlcondformat03.html
+ *   Partly based on the code snippets from 
+ *   http://www.contextures.com/xlcondformat03.html
  * </p>
- *
- * @author Yegor Kozlov
  */
 public class ConditionalFormats {
 
@@ -54,8 +55,9 @@ public class ConditionalFormats {
         expiry(wb.createSheet("Expiry"));
         shadeAlt(wb.createSheet("Shade Alt"));
         shadeBands(wb.createSheet("Shade Bands"));
+        iconSets(wb.createSheet("Icon Sets"));
         
-        // TODO Add Icons, data bars etc, see bug #58130
+        // TODO Add colour scales, data bars etc, see bug #58130
 
         // Write the output to a file
         String file = "cf-poi.xls";
@@ -414,4 +416,64 @@ public class ConditionalFormats {
         sheet.createRow(0).createCell(1).setCellValue("Shade Bands of Rows");
         sheet.createRow(1).createCell(1).setCellValue("Condition: Formula Is  
=MOD(ROW(),6)<2   (Light Grey Fill)");
     }
+    
+    /**
+     * Icon Sets / Multi-States allow you to have icons shown which vary
+     *  based on the values, eg Red traffic light / Yellow traffic light /
+     *  Green traffic light
+     */
+    static void iconSets(Sheet sheet) {
+        sheet.createRow(0).createCell(0).setCellValue("Icon Sets");
+        Row r = sheet.createRow(1);
+        r.createCell(0).setCellValue("Reds");
+        r.createCell(1).setCellValue(0);
+        r.createCell(2).setCellValue(0);
+        r.createCell(3).setCellValue(0);
+        r = sheet.createRow(2);
+        r.createCell(0).setCellValue("Yellows");
+        r.createCell(1).setCellValue(5);
+        r.createCell(2).setCellValue(5);
+        r.createCell(3).setCellValue(5);
+        r = sheet.createRow(3);
+        r.createCell(0).setCellValue("Greens");
+        r.createCell(1).setCellValue(10);
+        r.createCell(2).setCellValue(10);
+        r.createCell(3).setCellValue(10);
+                
+        SheetConditionalFormatting sheetCF = 
sheet.getSheetConditionalFormatting();
+        
+        CellRangeAddress[] regions = { CellRangeAddress.valueOf("B1:B4") };
+        ConditionalFormattingRule rule1 =
+                
sheetCF.createConditionalFormattingRule(IconSet.GYR_3_TRAFFIC_LIGHTS);
+        IconMultiStateFormatting im1 = rule1.getMultiStateFormatting();
+        im1.getThresholds()[0].setRangeType(RangeType.MIN);
+        im1.getThresholds()[1].setRangeType(RangeType.PERCENT);
+        im1.getThresholds()[1].setValue(33d);
+        im1.getThresholds()[2].setRangeType(RangeType.MAX);
+        sheetCF.addConditionalFormatting(regions, rule1);
+        
+        regions = new CellRangeAddress[] { CellRangeAddress.valueOf("C1:C4") };
+        ConditionalFormattingRule rule2 =
+                sheetCF.createConditionalFormattingRule(IconSet.GYR_3_FLAGS);
+        IconMultiStateFormatting im2 = rule1.getMultiStateFormatting();
+        im2.getThresholds()[0].setRangeType(RangeType.PERCENT);
+        im2.getThresholds()[0].setValue(0d);
+        im2.getThresholds()[1].setRangeType(RangeType.PERCENT);
+        im2.getThresholds()[1].setValue(33d);
+        im2.getThresholds()[2].setRangeType(RangeType.PERCENT);
+        im2.getThresholds()[2].setValue(67d);
+        sheetCF.addConditionalFormatting(regions, rule2);
+        
+        regions = new CellRangeAddress[] { CellRangeAddress.valueOf("D1:D4") };
+        ConditionalFormattingRule rule3 =
+                
sheetCF.createConditionalFormattingRule(IconSet.GYR_3_SYMBOLS_CIRCLE);
+        IconMultiStateFormatting im3 = rule1.getMultiStateFormatting();
+        im3.setIconOnly(true);
+        im3.getThresholds()[0].setRangeType(RangeType.MIN);
+        im3.getThresholds()[1].setRangeType(RangeType.NUMBER);
+        im3.getThresholds()[1].setValue(3d);
+        im3.getThresholds()[2].setRangeType(RangeType.NUMBER);
+        im3.getThresholds()[2].setValue(7d);
+        sheetCF.addConditionalFormatting(regions, rule3);
+    }
 }

Modified: 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=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java Sat Jul 
18 04:55:27 2015
@@ -129,8 +129,9 @@ public final class CFRule12Record extend
         
         CFRule12Record r = new CFRule12Record(CONDITION_TYPE_COLOR_SCALE, 
                                               
ComparisonOperator.NO_COMPARISON);
-        r.getMultiStateFormatting().setIconSet(iconSet);
-        r.getMultiStateFormatting().setThresholds(ts);
+        IconMultiStateFormatting imf = r.createMultiStateFormatting();
+        imf.setIconSet(iconSet);
+        imf.setThresholds(ts);
         return r;
     }
     // TODO Static creators for the other record types

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/ConditionalFormattingTable.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/ConditionalFormattingTable.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/ConditionalFormattingTable.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/ConditionalFormattingTable.java
 Sat Jul 18 04:55:27 2015
@@ -61,6 +61,7 @@ public final class ConditionalFormatting
         * @return index of the newly added CF header aggregate
         */
        public int add(CFRecordsAggregate cfAggregate) {
+           cfAggregate.getHeader().setID(_cfHeaders.size());
                _cfHeaders.add(cfAggregate);
                return _cfHeaders.size() - 1;
        }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java Sat Jul 18 
04:55:27 2015
@@ -74,6 +74,9 @@ public final class Threshold {
     public void setType(byte type) {
         this.type = type;
     }
+    public void setType(int type) {
+        this.type = (byte)type;
+    }
 
     protected Formula getFormula() {
         return formula;
@@ -129,7 +132,7 @@ public final class Threshold {
 
     public void serialize(LittleEndianOutput out) {
         out.writeByte(type);
-        if (formula == null) {
+        if (formula.getTokens().length == 0) {
             out.writeShort(0);
         } else {
             formula.serialize(out);

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=1691679&r1=1691678&r2=1691679&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 
Sat Jul 18 04:55:27 2015
@@ -77,9 +77,6 @@ public final class HSSFConditionalFormat
     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(HSSFSheet sheet, CFRecordsAggregate cfAggregate) 
{
         if(sheet == null) {
             throw new IllegalArgumentException("sheet must not be null");

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFIconMultiStateFormatting.java
 Sat Jul 18 04:55:27 2015
@@ -58,7 +58,7 @@ public final class HSSFIconMultiStateFor
         iconFormatting.setReversed(reversed);
     }
 
-    public ConditionalFormattingThreshold[] getThresholds() {
+    public HSSFConditionalFormattingThreshold[] getThresholds() {
         Threshold[] t = iconFormatting.getThresholds();
         HSSFConditionalFormattingThreshold[] ht = new 
HSSFConditionalFormattingThreshold[t.length];
         for (int i=0; i<t.length; i++) {
@@ -74,4 +74,8 @@ public final class HSSFIconMultiStateFor
         }
         iconFormatting.setThresholds(t);
     }
+
+    public HSSFConditionalFormattingThreshold createThreshold() {
+        return new HSSFConditionalFormattingThreshold(new Threshold(), sheet);
+    }
 }

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFConditionalFormattingThreshold.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFConditionalFormattingThreshold.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFConditionalFormattingThreshold.java
 (original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFConditionalFormattingThreshold.java
 Sat Jul 18 04:55:27 2015
@@ -28,9 +28,17 @@ import org.openxmlformats.schemas.spread
  */
 public class XSSFConditionalFormattingThreshold implements 
org.apache.poi.ss.usermodel.ConditionalFormattingThreshold {
     private CTCfvo cfvo;
+    
+    protected XSSFConditionalFormattingThreshold(CTCfvo cfvo) {
+        this.cfvo = cfvo;
+    }
+    
+    protected CTCfvo getCTCfvo() {
+        return cfvo;
+    }
 
     public RangeType getRangeType() {
-        return RangeType.valueOf(cfvo.getType().toString());
+        return RangeType.byName(cfvo.getType().toString());
     }
     public void setRangeType(RangeType type) {
         STCfvoType.Enum xtype = STCfvoType.Enum.forString(type.name);

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFIconMultiStateFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFIconMultiStateFormatting.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFIconMultiStateFormatting.java
 (original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFIconMultiStateFormatting.java
 Sat Jul 18 04:55:27 2015
@@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel;
 
 import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold;
 import org.apache.poi.ss.usermodel.IconMultiStateFormatting;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCfvo;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIconSet;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STIconSetType;
 
@@ -35,9 +36,8 @@ public class XSSFIconMultiStateFormattin
     }
 
     public IconSet getIconSet() {
-        return IconSet.valueOf(
-                _iconset.getIconSet().toString()
-        );
+        String set = _iconset.getIconSet().toString();
+        return IconSet.byName(set);
     }
     public void setIconSet(IconSet set) {
         STIconSetType.Enum xIconSet = STIconSetType.Enum.forString(set.name);
@@ -62,11 +62,24 @@ public class XSSFIconMultiStateFormattin
         _iconset.setReverse(reversed);
     }
 
+    @SuppressWarnings("deprecation")
     public XSSFConditionalFormattingThreshold[] getThresholds() {
-        // TODO Implement
-        return null;
+        CTCfvo[] cfvos = _iconset.getCfvoArray();
+        XSSFConditionalFormattingThreshold[] t = 
+                new XSSFConditionalFormattingThreshold[cfvos.length];
+        for (int i=0; i<cfvos.length; i++) {
+            t[i] = new XSSFConditionalFormattingThreshold(cfvos[i]);
+        }
+        return t;
     }
     public void setThresholds(ConditionalFormattingThreshold[] thresholds) {
-        // TODO Implement
+        CTCfvo[] cfvos = new CTCfvo[thresholds.length];
+        for (int i=0; i<thresholds.length; i++) {
+            cfvos[i] = 
((XSSFConditionalFormattingThreshold)thresholds[i]).getCTCfvo();
+        }
+        _iconset.setCfvoArray(cfvos);
+    }
+    public XSSFConditionalFormattingThreshold createThreshold() {
+        return new XSSFConditionalFormattingThreshold(_iconset.addNewCfvo());
     }
 }

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=1691679&r1=1691678&r2=1691679&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 
Sat Jul 18 04:55:27 2015
@@ -32,6 +32,8 @@ import org.apache.poi.hssf.util.HSSFColo
 import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.ptg.RefNPtg;
 import org.apache.poi.ss.formula.ptg.RefPtg;
+import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
+import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -119,6 +121,46 @@ public final class TestCFRuleRecord exte
         }
     }
 
+    public void testCreateIconCFRule12Record() {
+        HSSFWorkbook workbook = new HSSFWorkbook();
+        HSSFSheet sheet = workbook.createSheet();
+        CFRule12Record record = CFRule12Record.create(sheet, 
IconSet.GREY_5_ARROWS);
+        
record.getMultiStateFormatting().getThresholds()[1].setType(RangeType.PERCENT.id);
+        record.getMultiStateFormatting().getThresholds()[1].setValue(10d);
+        
record.getMultiStateFormatting().getThresholds()[2].setType(RangeType.NUMBER.id);
+        record.getMultiStateFormatting().getThresholds()[2].setValue(-4d);
+        
+        // Check it 
+        testCFRule12Record(record);
+        assertEquals(IconSet.GREY_5_ARROWS, 
record.getMultiStateFormatting().getIconSet());
+        assertEquals(5, 
record.getMultiStateFormatting().getThresholds().length);
+
+        // Serialize
+        byte [] serializedRecord = record.serialize();
+
+        // Strip header
+        byte [] recordData = new byte[serializedRecord.length-4];
+        System.arraycopy(serializedRecord, 4, recordData, 0, 
recordData.length);
+
+        // Deserialize
+        record = new 
CFRule12Record(TestcaseRecordInputStream.create(CFRule12Record.sid, 
recordData));
+        
+        // Check it has the icon, and the right number of thresholds
+        assertEquals(IconSet.GREY_5_ARROWS, 
record.getMultiStateFormatting().getIconSet());
+        assertEquals(5, 
record.getMultiStateFormatting().getThresholds().length);
+
+        // Serialize again
+        byte[] output = record.serialize();
+
+        // Compare
+        assertEquals("Output size", recordData.length+4, output.length); 
//includes sid+recordlength
+
+        for (int i = 0; i < recordData.length;i++)
+        {
+            assertEquals("CFRule12Record doesn't match", recordData[i], 
output[i+4]);
+        }
+    }
+    
     private void testCFRuleRecord(CFRuleRecord record) {
         testCFRuleBase(record);
         

Modified: 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java?rev=1691679&r1=1691678&r2=1691679&view=diff
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java
 (original)
+++ 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java
 Sat Jul 18 04:55:27 2015
@@ -24,6 +24,7 @@ import junit.framework.TestCase;
 import org.apache.poi.hssf.usermodel.HSSFConditionalFormatting;
 import org.apache.poi.hssf.usermodel.HSSFConditionalFormattingRule;
 import org.apache.poi.ss.ITestDataProvider;
+import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
 import org.apache.poi.ss.usermodel.IconMultiStateFormatting.IconSet;
 import org.apache.poi.ss.util.CellRangeAddress;
 
@@ -546,6 +547,7 @@ public abstract class BaseTestConditiona
         ConditionalFormatting cf = null;
         ConditionalFormattingRule cr = null;
         IconMultiStateFormatting icon = null;
+        ConditionalFormattingThreshold th = null;
         
         // Sanity check data
         assertEquals("Values", s.getRow(0).getCell(0).toString());
@@ -572,7 +574,7 @@ public abstract class BaseTestConditiona
                     type == ConditionType.FORMULA) {
                     fCF++;
                 } else {
-                    // TODO Detect Ext ones
+                    // TODO Properly detect Ext ones from the xml
                     fCF12++;
                 }
             }
@@ -599,7 +601,7 @@ public abstract class BaseTestConditiona
         // When it matches:
         //   Sets the font colour to dark green
         //   Sets the background colour to lighter green
-        // TODO Should the colours be slightly different between formats?
+        // TODO Should the colours be slightly different between formats? 
Would CFEX support help for HSSF?
         if (cr instanceof HSSFConditionalFormattingRule) {
             assertColour("0:8080:0", cr.getFontFormatting().getFontColor());
             assertColour("CCCC:FFFF:CCCC", 
cr.getPatternFormatting().getFillBackgroundColorColor());
@@ -623,7 +625,7 @@ public abstract class BaseTestConditiona
         // When it matches:
         //   Sets the font colour to dark red
         //   Sets the background colour to lighter red
-        // TODO Should the colours be slightly different between formats?
+        // TODO Should the colours be slightly different between formats? 
Would CFEX support help for HSSF?
         if (cr instanceof HSSFConditionalFormattingRule) {
             assertColour("8080:0:8080", cr.getFontFormatting().getFontColor());
             assertColour("FFFF:9999:CCCC", 
cr.getPatternFormatting().getFillBackgroundColorColor());
@@ -641,13 +643,34 @@ public abstract class BaseTestConditiona
         assertEquals(1, cf.getNumberOfRules());
         cr = cf.getRule(0);
         assertEquals(ConditionType.DATA_BAR, cr.getConditionTypeType());
-        // TODO Support then check the rest
+        // TODO Support Data Bars, then check the rest of this rule
         
         
         // Colours R->G - Column F
+        cf = sheetCF.getConditionalFormattingAt(3);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("F2:F17", cf.getFormattingRanges()[0].formatAsString());
+        
+        assertEquals(1, cf.getNumberOfRules());
+        cr = cf.getRule(0);
+        assertEquals(ConditionType.COLOR_SCALE, cr.getConditionTypeType());
+        // TODO Support Color Scales, then check the rest of this rule
+
+        
         // Colours BWR - Column G
+        cf = sheetCF.getConditionalFormattingAt(4);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("G2:G17", cf.getFormattingRanges()[0].formatAsString());
         
-        // Icons : Default - Column H
+        assertEquals(1, cf.getNumberOfRules());
+        cr = cf.getRule(0);
+        assertEquals(ConditionType.COLOR_SCALE, cr.getConditionTypeType());
+        // TODO Support Color Scales, then check the rest of this rule
+
+        
+        // TODO Simplify asserts
+        
+        // Icons : Default - Column H, percentage thresholds
         cf = sheetCF.getConditionalFormattingAt(5);
         assertEquals(1, cf.getFormattingRanges().length);
         assertEquals("H2:H17", cf.getFormattingRanges()[0].formatAsString());
@@ -658,21 +681,107 @@ public abstract class BaseTestConditiona
         assertEquals(ComparisonOperator.NO_COMPARISON, 
cr.getComparisonOperation());
         assertEquals(null, cr.getFormula1());
         assertEquals(null, cr.getFormula2());
-        if (cr instanceof HSSFConditionalFormattingRule) {
-            HSSFConditionalFormattingRule hcr = 
(HSSFConditionalFormattingRule)cr;
-            icon = hcr.getMultiStateFormatting();
-            assertNotNull(icon);
-            assertEquals(IconSet.GYR_3_TRAFFIC_LIGHTS, icon.getIconSet());
-            assertEquals(false, icon.isIconOnly());
-            assertEquals(false, icon.isReversed());
-            // TODO Check the rest
-        } else {
-            // TODO XSSF Support
-        }
+        
+        icon = cr.getMultiStateFormatting();
+        assertNotNull(icon);
+        assertEquals(IconSet.GYR_3_TRAFFIC_LIGHTS, icon.getIconSet());
+        assertEquals(false, icon.isIconOnly());
+        assertEquals(false, icon.isReversed());
+        
+        assertNotNull(icon.getThresholds());
+        assertEquals(3, icon.getThresholds().length);
+        th = icon.getThresholds()[0];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(0.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[1];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(33.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[2];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(67.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        
         
         // Icons : 3 signs - Column I
+        cf = sheetCF.getConditionalFormattingAt(6);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("I2:I17", cf.getFormattingRanges()[0].formatAsString());
+        
+        assertEquals(1, cf.getNumberOfRules());
+        cr = cf.getRule(0);
+        assertEquals(ConditionType.ICON_SET, cr.getConditionTypeType());
+        assertEquals(ComparisonOperator.NO_COMPARISON, 
cr.getComparisonOperation());
+        assertEquals(null, cr.getFormula1());
+        assertEquals(null, cr.getFormula2());
+        
+        icon = cr.getMultiStateFormatting();
+        assertNotNull(icon);
+        assertEquals(IconSet.GYR_3_SHAPES, icon.getIconSet());
+        assertEquals(false, icon.isIconOnly());
+        assertEquals(false, icon.isReversed());
+        
+        assertNotNull(icon.getThresholds());
+        assertEquals(3, icon.getThresholds().length);
+        th = icon.getThresholds()[0];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(0.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[1];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(33.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[2];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(67.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        
+        
         // Icons : 3 traffic lights 2 - Column J
+        cf = sheetCF.getConditionalFormattingAt(7);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("J2:J17", cf.getFormattingRanges()[0].formatAsString());
+        
+        assertEquals(1, cf.getNumberOfRules());
+        cr = cf.getRule(0);
+        assertEquals(ConditionType.ICON_SET, cr.getConditionTypeType());
+        assertEquals(ComparisonOperator.NO_COMPARISON, 
cr.getComparisonOperation());
+        assertEquals(null, cr.getFormula1());
+        assertEquals(null, cr.getFormula2());
+        
+        icon = cr.getMultiStateFormatting();
+        assertNotNull(icon);
+        assertEquals(IconSet.GYR_3_TRAFFIC_LIGHTS_BOX, icon.getIconSet());
+        assertEquals(false, icon.isIconOnly());
+        assertEquals(false, icon.isReversed());
+        
+        assertNotNull(icon.getThresholds());
+        assertEquals(3, icon.getThresholds().length);
+        th = icon.getThresholds()[0];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(0.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[1];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(33.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        th = icon.getThresholds()[2];
+        assertEquals(RangeType.PERCENT, th.getRangeType());
+        assertEquals(67.0d, th.getValue());
+        assertEquals(null, th.getFormula());
+        
+        
         // Icons : 4 traffic lights - Column K
+        cf = sheetCF.getConditionalFormattingAt(8);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("K2:K17", cf.getFormattingRanges()[0].formatAsString());
+        
+        assertEquals(1, cf.getNumberOfRules());
+        cr = cf.getRule(0);
+        assertIconSetPercentages(cr, IconSet.GYRB_4_TRAFFIC_LIGHTS, 0d, 25d, 
50d, 75d);
+
+        
         // Icons : 3 symbols - Column L
         // Icons : 3 flags - Column M
         // Icons : 3 symbols 2 - Column N
@@ -685,6 +794,28 @@ public abstract class BaseTestConditiona
         // Mixed icons - Column U
 
     }
+    private void assertIconSetPercentages(ConditionalFormattingRule cr, 
IconSet iconset, Double...vals) {
+        assertEquals(ConditionType.ICON_SET, cr.getConditionTypeType());
+        assertEquals(ComparisonOperator.NO_COMPARISON, 
cr.getComparisonOperation());
+        assertEquals(null, cr.getFormula1());
+        assertEquals(null, cr.getFormula2());
+        
+        IconMultiStateFormatting icon = cr.getMultiStateFormatting();
+        assertNotNull(icon);
+        assertEquals(iconset, icon.getIconSet());
+        assertEquals(false, icon.isIconOnly());
+        assertEquals(false, icon.isReversed());
+        
+        assertNotNull(icon.getThresholds());
+        assertEquals(vals.length, icon.getThresholds().length);
+        for (int i=0; i<vals.length; i++) {
+            Double v = vals[i];
+            ConditionalFormattingThreshold th = icon.getThresholds()[i];
+            assertEquals(RangeType.PERCENT, th.getRangeType());
+            assertEquals(v, th.getValue());
+            assertEquals(null, th.getFormula());
+        }
+    }
 
     public void testCreateFontFormatting() {
         Workbook workbook = _testDataProvider.createWorkbook();
@@ -859,8 +990,55 @@ public abstract class BaseTestConditiona
         assertEquals(BorderFormatting.BORDER_HAIR, r1fp.getBorderRight());
     }
     
-    public void testCreateIconFormatting() {
-        // TODO Implement for XSSF, then test here
+    // TODO Fix this test to work for HSSF
+    public void DISABLEDtestCreateIconFormatting() {
+        Workbook workbook = _testDataProvider.createWorkbook();
+        Sheet sheet = workbook.createSheet();
+
+        SheetConditionalFormatting sheetCF = 
sheet.getSheetConditionalFormatting();
+        ConditionalFormattingRule rule1 = 
+                
sheetCF.createConditionalFormattingRule(IconSet.GYRB_4_TRAFFIC_LIGHTS);
+        IconMultiStateFormatting iconFmt = rule1.getMultiStateFormatting();
+        
+        assertEquals(IconSet.GYRB_4_TRAFFIC_LIGHTS, iconFmt.getIconSet());
+        assertEquals(4, iconFmt.getThresholds().length);
+        assertEquals(false, iconFmt.isIconOnly());
+        assertEquals(false, iconFmt.isReversed());
+        
+        iconFmt.setIconOnly(true);
+        iconFmt.getThresholds()[0].setRangeType(RangeType.MIN);
+        iconFmt.getThresholds()[1].setRangeType(RangeType.NUMBER);
+        iconFmt.getThresholds()[1].setValue(10d);
+        iconFmt.getThresholds()[2].setRangeType(RangeType.PERCENT);
+        iconFmt.getThresholds()[2].setValue(75d);
+        iconFmt.getThresholds()[3].setRangeType(RangeType.MAX);
+        
+        CellRangeAddress [] regions = { CellRangeAddress.valueOf("A1:A5") };
+        sheetCF.addConditionalFormatting(regions, rule1);
+        
+        // Save, re-load and re-check
+        workbook = _testDataProvider.writeOutAndReadBack(workbook);
+        sheetCF = sheet.getSheetConditionalFormatting();
+        assertEquals(1, sheetCF.getNumConditionalFormattings());
+        
+        ConditionalFormatting cf = sheetCF.getConditionalFormattingAt(0);
+        assertEquals(1, cf.getNumberOfRules());
+        rule1 = cf.getRule(0);
+        iconFmt = rule1.getMultiStateFormatting();
+        
+        assertEquals(IconSet.GYRB_4_TRAFFIC_LIGHTS, iconFmt.getIconSet());
+        assertEquals(4, iconFmt.getThresholds().length);
+        assertEquals(true, iconFmt.isIconOnly());
+        assertEquals(false, iconFmt.isReversed());
+
+        assertEquals(RangeType.MIN,    
iconFmt.getThresholds()[0].getRangeType());
+        assertEquals(RangeType.NUMBER, 
iconFmt.getThresholds()[1].getRangeType());
+        
assertEquals(RangeType.PERCENT,iconFmt.getThresholds()[2].getRangeType());
+        assertEquals(RangeType.MAX,    
iconFmt.getThresholds()[3].getRangeType());
+        assertEquals(null, iconFmt.getThresholds()[0].getValue());
+        assertEquals(10d,  iconFmt.getThresholds()[1].getValue());
+        assertEquals(75d,  iconFmt.getThresholds()[2].getValue());
+        assertEquals(null, iconFmt.getThresholds()[3].getValue());
     }
     
     public void testBug55380() {



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

Reply via email to