You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2015/07/19 21:32:42 UTC

svn commit: r1691845 - in /poi/branches/common_sl: ./ src/integrationtest/org/apache/poi/ src/integrationtest/org/apache/poi/stress/ src/java/org/apache/poi/hssf/record/ src/java/org/apache/poi/hssf/record/cf/ src/java/org/apache/poi/hssf/usermodel/ sr...

Author: kiwiwings
Date: Sun Jul 19 19:32:41 2015
New Revision: 1691845

URL: http://svn.apache.org/r1691845
Log:
merge trunk to common sl branch

Added:
    poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/XDGFFileHandler.java
      - copied unchanged from r1691843, poi/trunk/src/integrationtest/org/apache/poi/stress/XDGFFileHandler.java
    poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java
      - copied unchanged from r1691843, poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java
    poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java
      - copied unchanged from r1691843, poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java
Modified:
    poi/branches/common_sl/   (props changed)
    poi/branches/common_sl/src/integrationtest/org/apache/poi/TestAllFiles.java
    poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java
    poi/branches/common_sl/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/Threshold.java
    poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
    poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocument.java
    poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
    poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
    poi/branches/common_sl/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java

Propchange: poi/branches/common_sl/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Jul 19 19:32:41 2015
@@ -1,4 +1,4 @@
 /poi/branches/excelant:1069732-1073692
 /poi/branches/gsoc2012:1341450-1371650
 /poi/branches/xml_signature:1617139-1628347
-/poi/trunk:693591-694881,695264-695420,695621,695649-711764,1661320-1691786
+/poi/trunk:693591-694881,695264-695420,695621,695649-711764,1661320-1691843

Modified: poi/branches/common_sl/src/integrationtest/org/apache/poi/TestAllFiles.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/integrationtest/org/apache/poi/TestAllFiles.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/integrationtest/org/apache/poi/TestAllFiles.java (original)
+++ poi/branches/common_sl/src/integrationtest/org/apache/poi/TestAllFiles.java Sun Jul 19 19:32:41 2015
@@ -103,12 +103,12 @@ public class TestAllFiles {
         HANDLERS.put(".vsd", new HDGFFileHandler());
         
         // Visio - ooxml (currently unsupported)
-        HANDLERS.put(".vsdm", new NullFileHandler());
-        HANDLERS.put(".vsdx", new NullFileHandler());
-        HANDLERS.put(".vssm", new NullFileHandler());
-        HANDLERS.put(".vssx", new NullFileHandler());
-        HANDLERS.put(".vstm", new NullFileHandler());
-        HANDLERS.put(".vstx", new NullFileHandler());
+        HANDLERS.put(".vsdm", new XDGFFileHandler());
+        HANDLERS.put(".vsdx", new XDGFFileHandler());
+        HANDLERS.put(".vssm", new XDGFFileHandler());
+        HANDLERS.put(".vssx", new XDGFFileHandler());
+        HANDLERS.put(".vstm", new XDGFFileHandler());
+        HANDLERS.put(".vstx", new XDGFFileHandler());
 
         // POIFS
         HANDLERS.put(".ole2", new POIFSFileHandler());

Modified: poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java (original)
+++ poi/branches/common_sl/src/integrationtest/org/apache/poi/stress/POIXMLDocumentHandler.java Sun Jul 19 19:32:41 2015
@@ -20,17 +20,10 @@ import static org.junit.Assert.assertNot
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.List;
 
 import org.apache.poi.POIXMLDocument;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackageAccess;
-import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.poifs.crypt.Decryptor;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.junit.Ignore;
-import org.junit.Test;
 
 public final class POIXMLDocumentHandler {
 	protected void handlePOIXMLDocument(POIXMLDocument doc) throws Exception {
@@ -44,33 +37,15 @@ public final class POIXMLDocumentHandler
     protected static boolean isEncrypted(InputStream stream) throws IOException {
         if (POIFSFileSystem.hasPOIFSHeader(stream)) {
             POIFSFileSystem poifs = new POIFSFileSystem(stream);
-            if (poifs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
-                return true;
+            try {
+                if (poifs.getRoot().hasEntry(Decryptor.DEFAULT_POIFS_ENTRY)) {
+                    return true;
+                }
+            } finally {
+                poifs.close();
             }
             throw new IOException("wrong file format or file extension for OO XML file");
         }
         return false;
     }
-	
-	// a test-case to test this locally without executing the full TestAllFiles
-    @Ignore("POIXMLDocument cannot handle this Visio file currently...")
-	@Test
-	public void test() throws Exception {
-		OPCPackage pkg = OPCPackage.open("test-data/diagram/test.vsdx", PackageAccess.READ);
-		try {
-			handlePOIXMLDocument(new TestPOIXMLDocument(pkg));
-		} finally {
-			pkg.close();
-		}
-	}
-	
-	private final static class TestPOIXMLDocument extends POIXMLDocument {
-		public TestPOIXMLDocument(OPCPackage pkg) {
-			super(pkg);
-		}
-
-		public List<PackagePart> getAllEmbedds() throws OpenXML4JException {
-			return null;
-		}
-	}
 }

Modified: poi/branches/common_sl/src/java/org/apache/poi/hssf/record/CFRule12Record.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/java/org/apache/poi/hssf/record/CFRule12Record.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/java/org/apache/poi/hssf/record/CFRule12Record.java (original)
+++ poi/branches/common_sl/src/java/org/apache/poi/hssf/record/CFRule12Record.java Sun Jul 19 19:32:41 2015
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.record;
 
 import java.util.Arrays;
 
+import org.apache.poi.hssf.record.cf.ColorGradientFormatting;
 import org.apache.poi.hssf.record.cf.IconMultiStateFormatting;
 import org.apache.poi.hssf.record.cf.Threshold;
 import org.apache.poi.hssf.record.common.FtrHeader;
@@ -56,9 +57,9 @@ public final class CFRule12Record extend
     private byte[] template_params;
     
     private IconMultiStateFormatting multistate;
+    private ColorGradientFormatting color_gradient;
     
     // TODO Parse these
-    private byte[] gradient_data;
     private byte[] databar_data;
     private byte[] filter_data;
 
@@ -176,7 +177,7 @@ public final class CFRule12Record extend
         
         byte type = getConditionType();
         if (type == CONDITION_TYPE_COLOR_SCALE) {
-            gradient_data = in.readRemainder();
+            color_gradient = new ColorGradientFormatting(in);
         } else if (type == CONDITION_TYPE_DATA_BAR) {
             databar_data = in.readRemainder();
         } else if (type == CONDITION_TYPE_FILTER) {
@@ -201,6 +202,21 @@ public final class CFRule12Record extend
         return multistate;
     }
 
+    public boolean containsColorGradientBlock() {
+        return (color_gradient != null);
+    }
+    public ColorGradientFormatting getColorGradientFormatting() {
+        return color_gradient;
+    }
+    public ColorGradientFormatting createColorGradientFormatting() {
+        if (color_gradient != null) return color_gradient;
+        
+        // Convert, setup and return
+        setConditionType(CONDITION_TYPE_COLOR_SCALE);
+        color_gradient = new ColorGradientFormatting();
+        return color_gradient;
+    }
+
     /**
      * get the stack of the scale expression as a list
      *
@@ -261,7 +277,7 @@ public final class CFRule12Record extend
         
         byte type = getConditionType();
         if (type == CONDITION_TYPE_COLOR_SCALE) {
-            out.write(gradient_data);
+            color_gradient.serialize(out);
         } else if (type == CONDITION_TYPE_DATA_BAR) {
             out.write(databar_data);
         } else if (type == CONDITION_TYPE_FILTER) {
@@ -285,7 +301,7 @@ public final class CFRule12Record extend
         
         byte type = getConditionType();
         if (type == CONDITION_TYPE_COLOR_SCALE) {
-            len += gradient_data.length;
+            len += color_gradient.getDataLength();
         } else if (type == CONDITION_TYPE_DATA_BAR) {
             len += databar_data.length;
         } else if (type == CONDITION_TYPE_FILTER) {
@@ -319,9 +335,11 @@ public final class CFRule12Record extend
         buffer.append("    .priority  =").append(priority).append("\n");
         buffer.append("    .template_type  =").append(template_type).append("\n");
         buffer.append("    .template_params=").append(HexDump.toHex(template_params)).append("\n");
-        buffer.append("    .gradient_data  =").append(HexDump.toHex(gradient_data)).append("\n");
         buffer.append("    .databar_data   =").append(HexDump.toHex(databar_data)).append("\n");
         buffer.append("    .filter_data    =").append(HexDump.toHex(filter_data)).append("\n");
+        if (color_gradient != null) {
+            buffer.append(color_gradient);
+        }
         if (multistate != null) {
             buffer.append(multistate);
         }

Modified: poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/Threshold.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/Threshold.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/Threshold.java (original)
+++ poi/branches/common_sl/src/java/org/apache/poi/hssf/record/cf/Threshold.java Sun Jul 19 19:32:41 2015
@@ -73,6 +73,14 @@ public final class Threshold {
     }
     public void setType(byte type) {
         this.type = type;
+
+        // Ensure the value presense / absense is consistent for the new type
+        if (type == RangeType.MIN.id || type == RangeType.MAX.id ||
+               type == RangeType.FORMULA.id) {
+            this.value = null;
+        } else if (value == null) {
+            this.value = 0d;
+        }
     }
     public void setType(int type) {
         this.type = (byte)type;
@@ -86,6 +94,9 @@ public final class Threshold {
     }
     public void setParsedExpression(Ptg[] ptgs) {
         formula = Formula.create(ptgs);
+        if (ptgs.length > 0) {
+            this.value = null;
+        }
     }
 
     public Double getValue() {

Modified: poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java (original)
+++ poi/branches/common_sl/src/java/org/apache/poi/hssf/usermodel/HSSFConditionalFormattingRule.java Sun Jul 19 19:32:41 2015
@@ -23,6 +23,7 @@ import org.apache.poi.hssf.record.CFRule
 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.ColorGradientFormatting;
 import org.apache.poi.hssf.record.cf.FontFormatting;
 import org.apache.poi.hssf.record.cf.IconMultiStateFormatting;
 import org.apache.poi.hssf.record.cf.PatternFormatting;
@@ -55,10 +56,18 @@ public final class HSSFConditionalFormat
         cfRuleRecord = pRuleRecord;
     }
 
-    CFRuleBase getCfRuleRecord()
-    {
+    CFRuleBase getCfRuleRecord() {
         return cfRuleRecord;
     }
+    private CFRule12Record getCFRule12Record(boolean create) {
+        if (cfRuleRecord instanceof CFRule12Record) {
+            // Good
+        } else {
+            if (create) throw new IllegalArgumentException("Can't convert a CF into a CF12 record");
+            return null;
+        }
+        return (CFRule12Record)cfRuleRecord;
+    }
 
     private HSSFFontFormatting getFontFormatting(boolean create)
     {
@@ -171,13 +180,7 @@ public final class HSSFConditionalFormat
     }
     
     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;
+        CFRule12Record cfRule12Record = getCFRule12Record(create);
         IconMultiStateFormatting iconFormatting = cfRule12Record.getMultiStateFormatting();
         if (iconFormatting != null)
         {
@@ -193,14 +196,12 @@ public final class HSSFConditionalFormat
             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.
@@ -209,6 +210,37 @@ public final class HSSFConditionalFormat
         return getMultiStateFormatting(true);
     }
     
+    private HSSFColorScaleFormatting getColorScaleFormatting(boolean create) {
+        CFRule12Record cfRule12Record = getCFRule12Record(create);
+        ColorGradientFormatting colorFormatting = cfRule12Record.getColorGradientFormatting();
+        if (colorFormatting != null)
+        {
+            return new HSSFColorScaleFormatting(cfRule12Record, sheet);
+        }
+        else if( create )
+        {
+            colorFormatting = cfRule12Record.createColorGradientFormatting();
+            return new HSSFColorScaleFormatting(cfRule12Record, sheet);
+        }
+        else
+        {
+            return null;
+        }
+    }
+    /**
+     * @return color scale / gradient formatting object if defined, <code>null</code> otherwise
+     */
+    public HSSFColorScaleFormatting getColorScaleFormatting() {
+        return getColorScaleFormatting(false);
+    }
+    /**
+     * create a new color scale / gradient formatting object if it does not exist,
+     * otherwise just return the existing object.
+     */
+    public HSSFColorScaleFormatting createColorScaleFormatting() {
+        return getColorScaleFormatting(true);
+    }
+    
     /**
      * @return -  the conditiontype for the cfrule
      */

Modified: poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocument.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocument.java (original)
+++ poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocument.java Sun Jul 19 19:32:41 2015
@@ -57,6 +57,15 @@ public abstract class POIXMLDocument ext
 
     protected POIXMLDocument(OPCPackage pkg) {
         super(pkg);
+        init(pkg);
+    }
+    
+    protected POIXMLDocument(OPCPackage pkg, String coreDocumentRel) {
+        super(pkg, coreDocumentRel);
+        init(pkg);
+    }
+    
+    private void init(OPCPackage pkg) {
         this.pkg = pkg;
         
         // Workaround for XMLBEANS-512 - ensure that when we parse

Modified: poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (original)
+++ poi/branches/common_sl/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java Sun Jul 19 19:32:41 2015
@@ -63,7 +63,7 @@ public class POIXMLDocumentPart {
         DEFAULT_XML_OPTIONS.setCharacterEncoding("UTF-8");
     }
 
-
+    private String coreDocumentRel = PackageRelationshipTypes.CORE_DOCUMENT;
     private PackagePart packagePart;
     private PackageRelationship packageRel;
     private POIXMLDocumentPart parent;
@@ -93,7 +93,16 @@ public class POIXMLDocumentPart {
      * Construct POIXMLDocumentPart representing a "core document" package part.
      */
     public POIXMLDocumentPart(OPCPackage pkg) {
-        PackageRelationship coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0);
+        this(pkg, PackageRelationshipTypes.CORE_DOCUMENT);
+    }
+    
+    /**
+     * Construct POIXMLDocumentPart representing a custom "core document" package part.
+     */
+    public POIXMLDocumentPart(OPCPackage pkg, String coreDocumentRel) {
+        this.coreDocumentRel = coreDocumentRel;
+        PackageRelationship coreRel = pkg.getRelationshipsByType(this.coreDocumentRel).getRelationship(0);
+
         if (coreRel == null) {
             coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
             if (coreRel != null) {
@@ -151,10 +160,10 @@ public class POIXMLDocumentPart {
      */
     protected final void rebase(OPCPackage pkg) throws InvalidFormatException {
         PackageRelationshipCollection cores =
-            packagePart.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
+            packagePart.getRelationshipsByType(coreDocumentRel);
         if(cores.size() != 1) {
             throw new IllegalStateException(
-                "Tried to rebase using " + PackageRelationshipTypes.CORE_DOCUMENT +
+                "Tried to rebase using " + coreDocumentRel +
                 " but found " + cores.size() + " parts of the right type"
             );
         }

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/TestPOIXMLDocument.java Sun Jul 19 19:32:41 2015
@@ -31,6 +31,7 @@ import org.apache.poi.openxml4j.exceptio
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
 import org.apache.poi.util.PackageHelper;
 import org.apache.poi.util.TempFile;
 
@@ -44,6 +45,10 @@ public final class TestPOIXMLDocument ex
         public OPCParser(OPCPackage pkg) {
             super(pkg);
         }
+        
+        public OPCParser(OPCPackage pkg, String coreDocumentRel) {
+            super(pkg, coreDocumentRel);
+        }
 
         @Override
         public List<PackagePart> getAllEmbedds() {
@@ -181,4 +186,33 @@ public final class TestPOIXMLDocument ex
         part.onDocumentCreate();
         //part.getTargetPart(null);
     }
+    
+    public void testVSDX() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        POIXMLDocument part = new OPCParser(open, PackageRelationshipTypes.VISIO_CORE_DOCUMENT);
+        
+        assertNotNull(part);
+        assertEquals(0, part.getRelationCounter());
+    }
+    
+    public void testVSDXPart() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        POIXMLDocumentPart part = new POIXMLDocumentPart(open, PackageRelationshipTypes.VISIO_CORE_DOCUMENT);
+        
+        assertNotNull(part);
+        assertEquals(0, part.getRelationCounter());
+    }
+    
+    public void testInvalidCoreRel() throws Exception {
+        OPCPackage open = PackageHelper.open(POIDataSamples.getDiagramInstance().openResourceAsStream("test.vsdx"));
+        
+        try {
+            new POIXMLDocumentPart(open, "somethingillegal");
+            fail("Unknown core ref will throw exception");
+        } catch (POIXMLException e) {
+            // expected here
+        }
+    }
 }

Modified: poi/branches/common_sl/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java?rev=1691845&r1=1691844&r2=1691845&view=diff
==============================================================================
--- poi/branches/common_sl/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java (original)
+++ poi/branches/common_sl/src/testcases/org/apache/poi/ss/usermodel/BaseTestConditionalFormatting.java Sun Jul 19 19:32:41 2015
@@ -101,6 +101,7 @@ public abstract class BaseTestConditiona
     /**
      * Test format conditions based on a boolean formula
      */
+    @SuppressWarnings("deprecation")
     public void testBooleanFormulaConditions() {
         Workbook wb = _testDataProvider.createWorkbook();
         Sheet sh = wb.createSheet();
@@ -136,6 +137,7 @@ public abstract class BaseTestConditiona
         assertEquals("B1:B3", ranges2[0].formatAsString());
     }
 
+    @SuppressWarnings("deprecation")
     public void testSingleFormulaConditions() {
         Workbook wb = _testDataProvider.createWorkbook();
         Sheet sh = wb.createSheet();
@@ -207,6 +209,7 @@ public abstract class BaseTestConditiona
         assertEquals(ComparisonOperator.NOT_BETWEEN, rule9.getComparisonOperation());
     }
 
+    @SuppressWarnings("deprecation")
     public void testCopy() {
         Workbook wb = _testDataProvider.createWorkbook();
         Sheet sheet1 = wb.createSheet();
@@ -546,18 +549,17 @@ public abstract class BaseTestConditiona
         Sheet s = wb.getSheet("CF");
         ConditionalFormatting cf = null;
         ConditionalFormattingRule cr = null;
-        IconMultiStateFormatting icon = null;
-        ConditionalFormattingThreshold th = null;
+
         
         // Sanity check data
         assertEquals("Values", s.getRow(0).getCell(0).toString());
         assertEquals("10.0", s.getRow(2).getCell(0).toString());
 
-        // Check we found all the conditional formattings rules we should have
+        // Check we found all the conditional formatting rules we should have
         SheetConditionalFormatting sheetCF = s.getSheetConditionalFormatting();
         int numCF = 3;
         int numCF12 = 15;
-        int numCFEX = 0; // TODO This should be 1, but we don't support CFEX formattings yet
+        int numCFEX = 0; // TODO This should be 2, but we don't support CFEX formattings yet, see #58149
         assertEquals(numCF+numCF12+numCFEX, sheetCF.getNumConditionalFormattings());
         
         int fCF = 0, fCF12 = 0, fCFEX = 0;
@@ -646,26 +648,18 @@ public abstract class BaseTestConditiona
         // TODO Support Data Bars, then check the rest of this rule
         
         
-        // Colours R->G - Column F
+        // Colours Red->Yellow->Green - 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
+        assertColorScale(cf, "F8696B", "FFEB84", "63BE7B");
 
         
-        // Colours BWR - Column G
+        // Colours Blue->White->Red - Column G
         cf = sheetCF.getConditionalFormattingAt(4);
         assertEquals(1, cf.getFormattingRanges().length);
         assertEquals("G2:G17", 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
+        assertColorScale(cf, "5A8AC6", "FCFCFF", "F8696B");
 
         
         // Icons : Default - Column H, percentage thresholds
@@ -696,22 +690,95 @@ public abstract class BaseTestConditiona
         assertIconSetPercentages(cf, 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
-        // Icons : 3 arrows - Column O     
+        // Icons : 3 symbols with backgrounds - Column L
+        cf = sheetCF.getConditionalFormattingAt(9);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("L2:L17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GYR_3_SYMBOLS_CIRCLE, 0d, 33d, 67d);
+
+        
+        // Icons : 3 flags - Column M2 Only
+        cf = sheetCF.getConditionalFormattingAt(10);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("M2", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GYR_3_FLAGS, 0d, 33d, 67d);
+
+        // Icons : 3 flags - Column M (all)
+        cf = sheetCF.getConditionalFormattingAt(11);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("M2:M17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GYR_3_FLAGS, 0d, 33d, 67d);
+
+        
+        // Icons : 3 symbols 2 (no background) - Column N
+        cf = sheetCF.getConditionalFormattingAt(12);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("N2:N17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GYR_3_SYMBOLS, 0d, 33d, 67d);
+
+        
+        // Icons : 3 arrows - Column O
+        cf = sheetCF.getConditionalFormattingAt(13);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("O2:O17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GYR_3_ARROW, 0d, 33d, 67d);
+
+        
         // Icons : 5 arrows grey - Column P    
+        cf = sheetCF.getConditionalFormattingAt(14);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("P2:P17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.GREY_5_ARROWS, 0d, 20d, 40d, 60d, 80d);
+
+        
         // Icons : 3 stars (ext) - Column Q
+        // TODO Support EXT formattings
+
+        
         // Icons : 4 ratings - Column R
+        cf = sheetCF.getConditionalFormattingAt(15);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("R2:R17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.RATINGS_4, 0d, 25d, 50d, 75d);
+
+        
         // Icons : 5 ratings - Column S
+        cf = sheetCF.getConditionalFormattingAt(16);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("S2:S17", cf.getFormattingRanges()[0].formatAsString());
+        assertIconSetPercentages(cf, IconSet.RATINGS_5, 0d, 20d, 40d, 60d, 80d);
+
+        
         // Custom Icon+Format - Column T
+        cf = sheetCF.getConditionalFormattingAt(17);
+        assertEquals(1, cf.getFormattingRanges().length);
+        assertEquals("T2:T17", cf.getFormattingRanges()[0].formatAsString());
+        
+        // TODO Support IconSet + Other CFs with 2 rules
+//        assertEquals(2, cf.getNumberOfRules());
+//        cr = cf.getRule(0);
+//        assertIconSetPercentages(cr, IconSet.GYR_3_TRAFFIC_LIGHTS_BOX, 0d, 33d, 67d);
+//        cr = cf.getRule(1);
+//        assertEquals(ConditionType.FORMULA, cr.getConditionTypeType());
+//        assertEquals(ComparisonOperator.NO_COMPARISON, cr.getComparisonOperation());
+//        // TODO Why aren't these two the same between formats?
+//        if (cr instanceof HSSFConditionalFormattingRule) {
+//            assertEquals("MOD(ROW($T1),2)=1", cr.getFormula1());
+//        } else {
+//            assertEquals("MOD(ROW($T2),2)=1", cr.getFormula1());
+//        }
+//        assertEquals(null, cr.getFormula2());
+        
+        
         // Mixed icons - Column U
-
+        // TODO Support EXT formattings
     }
     private void assertIconSetPercentages(ConditionalFormatting cf, IconSet iconset, Double...vals) {
         assertEquals(1, cf.getNumberOfRules());
         ConditionalFormattingRule cr = cf.getRule(0);
-        
+        assertIconSetPercentages(cr, iconset, vals);
+    }        
+    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());
@@ -733,6 +800,50 @@ public abstract class BaseTestConditiona
             assertEquals(null, th.getFormula());
         }
     }
+    
+    private void assertColorScale(ConditionalFormatting cf, String... colors) {
+        assertEquals(1, cf.getNumberOfRules());
+        ConditionalFormattingRule cr = cf.getRule(0);
+        assertColorScale(cr, colors);
+    }        
+    private void assertColorScale(ConditionalFormattingRule cr, String... colors) {
+        assertEquals(ConditionType.COLOR_SCALE, cr.getConditionTypeType());
+        assertEquals(ComparisonOperator.NO_COMPARISON, cr.getComparisonOperation());
+        assertEquals(null, cr.getFormula1());
+        assertEquals(null, cr.getFormula2());
+        
+        // TODO Implement
+/*
+        ColorScaleFormatting color = cr.getColorScaleFormatting();
+        assertNotNull(color);
+        assertNotNull(color.getColors());
+        assertNotNull(color.getThresholds());
+        assertEquals(colors.length, color.getNumControlPoints());
+        assertEquals(colors.length, color.getColors().length);
+        assertEquals(colors.length, color.getThresholds().length);
+        
+        // Thresholds should be Min / (evenly spaced) / Max
+        int steps = 100 / (colors.length-1);
+        for (int i=0; i<colors.length; i++) {
+            ConditionalFormattingThreshold th = color.getThresholds()[i];
+            if (i == 0) {
+                assertEquals(RangeType.MIN, th.getRangeType());
+            } else if (i == colors.length-1) {
+                assertEquals(RangeType.MAX, th.getRangeType());
+            } else {
+                assertEquals(RangeType.PERCENT, th.getRangeType());
+                assertEquals(steps*i, th.getValue());
+            }
+            assertEquals(null, th.getFormula());
+        }
+        
+        // Colors should match
+        for (int i=0; i<colors.length; i++) {
+            Color c = color.getColors()[i];
+            assertEquals(colors[i], c.toString());
+        }
+*/
+    }
 
     public void testCreateFontFormatting() {
         Workbook workbook = _testDataProvider.createWorkbook();
@@ -907,8 +1018,7 @@ public abstract class BaseTestConditiona
         assertEquals(BorderFormatting.BORDER_HAIR, r1fp.getBorderRight());
     }
     
-    // TODO Fix this test to work for HSSF
-    public void DISABLEDtestCreateIconFormatting() {
+    public void testCreateIconFormatting() {
         Workbook workbook = _testDataProvider.createWorkbook();
         Sheet sheet = workbook.createSheet();
 



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