Author: centic
Date: Mon Nov 13 11:46:04 2017
New Revision: 1815086

URL: http://svn.apache.org/viewvc?rev=1815086&view=rev
Log:
Fix setting a font-color if no previous color is defined for the font
Add unit-test to verify this

Modified:
    poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java
    
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java
    
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java
    
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java?rev=1815086&r1=1815085&r2=1815086&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/util/HSSFColor.java Mon Nov 13 
11:46:04 2017
@@ -366,7 +366,7 @@ public class HSSFColor implements Color
         // Currently the only benefit of this method is to throw an 
IllegalArgumentException
         // instead of a ClassCastException.
         if (color != null && !(color instanceof HSSFColor)) {
-            throw new IllegalArgumentException("Only HSSFColor objects are 
supported");
+            throw new IllegalArgumentException("Only HSSFColor objects are 
supported, but had " + color.getClass());
         }
         return (HSSFColor)color;
     }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java?rev=1815086&r1=1815085&r2=1815086&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java 
(original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFColor.java Mon 
Nov 13 11:46:04 2017
@@ -358,7 +358,7 @@ public class XSSFColor extends ExtendedC
         // Currently the only benefit of this method is to throw an 
IllegalArgumentException
         // instead of a ClassCastException.
         if (color != null && !(color instanceof XSSFColor)) {
-            throw new IllegalArgumentException("Only XSSFColor objects are 
supported");
+            throw new IllegalArgumentException("Only XSSFColor objects are 
supported, but had " + color.getClass());
         }
         return (XSSFColor)color;
     }

Modified: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java?rev=1815086&r1=1815085&r2=1815086&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java 
(original)
+++ 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFontFormatting.java 
Mon Nov 13 11:46:04 2017
@@ -121,6 +121,8 @@ public class XSSFFontFormatting implemen
         XSSFColor xcolor = XSSFColor.toXSSFColor(color);
         if (xcolor == null) {
             _font.getColorList().clear();
+        } else if(_font.sizeOfColorArray() == 0) {
+            _font.addNewColor().setRgb(xcolor.getRGB());
         } else {
             _font.setColorArray(0, xcolor.getCTColor());
         }

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java?rev=1815086&r1=1815085&r2=1815086&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java
 (original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFConditionalFormatting.java
 Mon Nov 13 11:46:04 2017
@@ -25,6 +25,15 @@ import java.io.IOException;
 
 import org.apache.poi.ss.usermodel.BaseTestConditionalFormatting;
 import org.apache.poi.ss.usermodel.Color;
+import org.apache.poi.ss.usermodel.ConditionalFormatting;
+import org.apache.poi.ss.usermodel.ConditionalFormattingRule;
+import org.apache.poi.ss.usermodel.ExtendedColor;
+import org.apache.poi.ss.usermodel.FontFormatting;
+import org.apache.poi.ss.usermodel.PatternFormatting;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.SheetConditionalFormatting;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.junit.Test;
 
@@ -56,4 +65,69 @@ public class TestXSSFConditionalFormatti
     public void testReadOffice2007() throws IOException {
         testReadOffice2007("NewStyleConditionalFormattings.xlsx");
     }
+
+    private final static java.awt.Color PEAK_ORANGE = new java.awt.Color(255, 
239, 221);
+
+    @Test
+    public void testFontFormattingColor() {
+        Workbook wb = XSSFITestDataProvider.instance.createWorkbook();
+        final Sheet sheet = wb.createSheet();
+
+        final SheetConditionalFormatting formatting = 
sheet.getSheetConditionalFormatting();
+
+        // the conditional formatting is not automatically added when it is 
created...
+        assertEquals(0, formatting.getNumConditionalFormattings());
+        ConditionalFormattingRule formattingRule = 
formatting.createConditionalFormattingRule("A1");
+        assertEquals(0, formatting.getNumConditionalFormattings());
+
+        // adding the formatting makes it available
+        int idx = formatting.addConditionalFormatting(new CellRangeAddress[] 
{}, formattingRule);
+
+        // verify that it can be accessed now
+        assertEquals(0, idx);
+        assertEquals(1, formatting.getNumConditionalFormattings());
+        assertEquals(1, 
formatting.getConditionalFormattingAt(idx).getNumberOfRules());
+
+        // this is confusing: the rule is not connected to the sheet, changes 
are not applied
+        // so we need to use setRule() explicitly!
+        FontFormatting fontFmt = formattingRule.createFontFormatting();
+        assertNotNull(formattingRule.getFontFormatting());
+        assertEquals(1, 
formatting.getConditionalFormattingAt(idx).getNumberOfRules());
+        formatting.getConditionalFormattingAt(idx).setRule(0, formattingRule);
+        
assertNotNull(formatting.getConditionalFormattingAt(idx).getRule(0).getFontFormatting());
+
+        fontFmt.setFontStyle(true, false);
+
+        assertEquals(-1, fontFmt.getFontColorIndex());
+
+        //fontFmt.setFontColorIndex((short)11);
+        final ExtendedColor extendedColor = new XSSFColor(PEAK_ORANGE);
+        fontFmt.setFontColor(extendedColor);
+
+        PatternFormatting patternFmt = 
formattingRule.createPatternFormatting();
+        assertNotNull(patternFmt);
+        patternFmt.setFillBackgroundColor(extendedColor);
+
+        assertEquals(1, 
formatting.getConditionalFormattingAt(0).getNumberOfRules());
+        
assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getFontFormatting());
+        
assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getFontFormatting().getFontColor());
+        
assertNotNull(formatting.getConditionalFormattingAt(0).getRule(0).getPatternFormatting().getFillBackgroundColorColor());
+
+        checkFontFormattingColorWriteOutAndReadBack(wb, extendedColor);
+    }
+
+    private void checkFontFormattingColorWriteOutAndReadBack(Workbook wb, 
ExtendedColor extendedColor) {
+        Workbook wbBack = 
XSSFITestDataProvider.instance.writeOutAndReadBack(wb);
+        assertNotNull(wbBack);
+
+        assertEquals(1, 
wbBack.getSheetAt(0).getSheetConditionalFormatting().getNumConditionalFormattings());
+        final ConditionalFormatting formattingBack = 
wbBack.getSheetAt(0).getSheetConditionalFormatting().getConditionalFormattingAt(0);
+        assertEquals(1, 
wbBack.getSheetAt(0).getSheetConditionalFormatting().getConditionalFormattingAt(0).getNumberOfRules());
+        final ConditionalFormattingRule ruleBack = formattingBack.getRule(0);
+        final FontFormatting fontFormattingBack = ruleBack.getFontFormatting();
+        assertNotNull(formattingBack);
+        assertNotNull(fontFormattingBack.getFontColor());
+        assertEquals(extendedColor, fontFormattingBack.getFontColor());
+        assertEquals(extendedColor, 
ruleBack.getPatternFormatting().getFillBackgroundColorColor());
+    }
 }

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java?rev=1815086&r1=1815085&r2=1815086&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java 
(original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java 
Mon Nov 13 11:46:04 2017
@@ -80,6 +80,7 @@ public final class TestXSSFFont extends
                assertEquals(true, ctFont.getBArray(0).getVal());
        }
 
+       @SuppressWarnings("deprecation")
        @Test
        public void testCharSet() throws IOException {
                CTFont ctFont=CTFont.Factory.newInstance();
@@ -108,7 +109,9 @@ public final class TestXSSFFont extends
         try {
            xssfFont.setCharSet(9999);
            fail("Shouldn't be able to set an invalid charset");
-        } catch(POIXMLException e) {}
+        } catch(POIXMLException e) {
+               // expected here
+               }
       
                
                // Now try with a few sample files
@@ -120,7 +123,7 @@ public final class TestXSSFFont extends
         );
         wb1.close();
                
-               // GB2312 charact set
+               // GB2312 charset
         XSSFWorkbook wb2 = 
XSSFTestDataSamples.openSampleWorkbook("49273.xlsx");
         assertEquals(134, 
               
wb2.getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFont().getCharSet()



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

Reply via email to