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

svn commit: r1691858 - in /poi/trunk/src/java/org/apache/poi/hssf: record/ record/cf/ usermodel/

Author: nick
Date: Sun Jul 19 22:09:41 2015
New Revision: 1691858

URL: http://svn.apache.org/r1691858
Log:
#58130 CF Threshold formats differ slightly between types

Added:
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientThreshold.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateThreshold.java
      - copied, changed from r1691844, poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java

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=1691858&r1=1691857&r2=1691858&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 Sun Jul 19 22:09:41 2015
@@ -21,6 +21,7 @@ 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.IconMultiStateThreshold;
 import org.apache.poi.hssf.record.cf.Threshold;
 import org.apache.poi.hssf.record.common.FtrHeader;
 import org.apache.poi.hssf.record.common.FutureRecord;
@@ -125,7 +126,7 @@ public final class CFRule12Record extend
     public static CFRule12Record create(HSSFSheet sheet, IconSet iconSet) {
         Threshold[] ts = new Threshold[iconSet.num];
         for (int i=0; i<ts.length; i++) {
-            ts[i] = new Threshold();
+            ts[i] = new IconMultiStateThreshold();
         }
         
         CFRule12Record r = new CFRule12Record(CONDITION_TYPE_COLOR_SCALE, 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java?rev=1691858&r1=1691857&r2=1691858&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientFormatting.java Sun Jul 19 22:09:41 2015
@@ -17,6 +17,7 @@
 
 package org.apache.poi.hssf.record.cf;
 
+import org.apache.poi.hssf.record.common.ExtendedColor;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
 import org.apache.poi.util.LittleEndianInput;
@@ -33,15 +34,16 @@ public final class ColorGradientFormatti
     private static POILogger log = POILogFactory.getLogger(ColorGradientFormatting.class);
 
     private byte options = 0;
-    private Threshold[] thresholds;
-    private byte[] colors; // TODO Decode
+    private ColorGradientThreshold[] thresholds;
+    private ExtendedColor[] colors;
     
     private static BitField clamp = BitFieldFactory.getInstance(0x01);
     private static BitField background = BitFieldFactory.getInstance(0x02);
     
     public ColorGradientFormatting() {
         options = 3;
-        thresholds = new Threshold[3];
+        thresholds = new ColorGradientThreshold[3];
+        colors = new ExtendedColor[3];  
     }
     public ColorGradientFormatting(LittleEndianInput in) {
         in.readShort(); // Ignored
@@ -53,15 +55,15 @@ public final class ColorGradientFormatti
         }
         options = in.readByte();
         
-        // TODO Are these correct?
-        thresholds = new Threshold[numI];
+        thresholds = new ColorGradientThreshold[numI];
         for (int i=0; i<thresholds.length; i++) {
-            thresholds[i] = new Threshold(in);
-            in.readDouble(); // Rather pointless value...
+            thresholds[i] = new ColorGradientThreshold(in);
+        }
+        colors = new ExtendedColor[numG];
+        for (int i=0; i<colors.length; i++) {
+            in.readDouble(); // Slightly pointless step counter
+            colors[i] = new ExtendedColor(in);
         }
-        // TODO Decode colors
-        colors = new byte[in.available()];
-        in.readFully(colors);
     }
     
     public int getNumControlPoints() {
@@ -69,19 +71,34 @@ public final class ColorGradientFormatti
     }
     public void setNumControlPoints(int num) {
         if (num != thresholds.length) {
-            thresholds = new Threshold[num];
-            // TODO Colors
+            ColorGradientThreshold[] nt = new ColorGradientThreshold[num];
+            ExtendedColor[] nc = new ExtendedColor[num];
+            
+            int copy = Math.min(thresholds.length, num);
+            System.arraycopy(thresholds, 0, nt, 0, copy);
+            System.arraycopy(colors, 0, nc, 0, copy);
+            
+            this.thresholds = nt;
+            this.colors = nc;
+            
+            updateThresholdPositions();
         }
     }
     
-    public Threshold[] getThresholds() {
+    public ColorGradientThreshold[] getThresholds() {
         return thresholds;
     }
-    public void setThresholds(Threshold[] thresholds) {
+    public void setThresholds(ColorGradientThreshold[] thresholds) {
         this.thresholds = thresholds;
+        updateThresholdPositions();
     }
 
-    // TODO Colors
+    public ExtendedColor[] getColors() {
+        return colors;
+    }
+    public void setColors(ExtendedColor[] colors) {
+        this.colors = colors;
+    }
     
     public boolean isClampToCurve() {
         return getOptionFlag(clamp);
@@ -93,6 +110,13 @@ public final class ColorGradientFormatti
         int value = field.getValue(options);
         return value==0 ? false : true;
     }
+
+    private void updateThresholdPositions() {
+        double step = 1d / (thresholds.length-1);
+        for (int i=0; i<thresholds.length; i++) {
+            thresholds[i].setPosition(step*i);
+        }
+    }    
     
     public String toString() {
         StringBuffer buffer = new StringBuffer();
@@ -102,6 +126,9 @@ public final class ColorGradientFormatti
         for (Threshold t : thresholds) {
             buffer.append(t.toString());
         }
+        for (ExtendedColor c : colors) {
+            buffer.append(c.toString());
+        }
         buffer.append("    [/Color Gradient Formatting]\n");
         return buffer.toString();
     }
@@ -109,9 +136,10 @@ public final class ColorGradientFormatti
     public Object clone()  {
       ColorGradientFormatting rec = new ColorGradientFormatting();
       rec.options = options;
-      rec.thresholds = new Threshold[thresholds.length];
+      rec.thresholds = new ColorGradientThreshold[thresholds.length];
+      rec.colors = new ExtendedColor[colors.length];
       System.arraycopy(thresholds, 0, rec.thresholds, 0, thresholds.length);
-      // TODO Colors
+      System.arraycopy(colors, 0, rec.colors, 0, colors.length);
       return rec;
     }
     
@@ -119,9 +147,11 @@ public final class ColorGradientFormatti
         int len = 6;
         for (Threshold t : thresholds) {
             len += t.getDataLength();
+        }
+        for (ExtendedColor c : colors) {
+            len += c.getDataLength();
             len += 8;
         }
-        len += colors.length;
         return len;
     }
 
@@ -132,13 +162,16 @@ public final class ColorGradientFormatti
         out.writeByte(thresholds.length);
         out.writeByte(options);
         
-        double step = 1d / (thresholds.length-1);
-        for (int i=0; i<thresholds.length; i++) {
-            Threshold t = thresholds[i];
+        for (ColorGradientThreshold t : thresholds) {
             t.serialize(out);
-            out.writeDouble(step*i);
         }
         
-        out.write(colors);
+        double step = 1d / (colors.length-1);
+        for (int i=0; i<colors.length; i++) {
+            out.writeDouble(i*step);
+            
+            ExtendedColor c = colors[i];
+            c.serialize(out);
+        }
     }
 }

Added: poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientThreshold.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientThreshold.java?rev=1691858&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientThreshold.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/ColorGradientThreshold.java Sun Jul 19 22:09:41 2015
@@ -0,0 +1,63 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record.cf;
+
+import org.apache.poi.util.LittleEndianInput;
+import org.apache.poi.util.LittleEndianOutput;
+
+/**
+ * Color Gradient / Color Scale specific Threshold / value (CFVO),
+ *  for changes in Conditional Formatting
+ */
+public final class ColorGradientThreshold extends Threshold {
+    private double position;
+
+    public ColorGradientThreshold() {
+        super();
+        position = 0d;
+    }
+
+    /** Creates new Ico Multi-State Threshold */
+    public ColorGradientThreshold(LittleEndianInput in) {
+        super(in);
+        position = in.readDouble();
+    }
+
+    public double getPosition() {
+        return position;
+    }
+    public void setPosition(double position) {
+        this.position = position;
+    }
+
+    public int getDataLength() {
+        return super.getDataLength() + 8;
+    }
+
+    public Object clone() {
+      ColorGradientThreshold rec = new ColorGradientThreshold();
+      super.copyTo(rec);
+      rec.position = position;
+      return rec;
+    }
+
+    public void serialize(LittleEndianOutput out) {
+        super.serialize(out);
+        out.writeDouble(position);
+    }
+}

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java?rev=1691858&r1=1691857&r2=1691858&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java Sun Jul 19 22:09:41 2015
@@ -56,7 +56,7 @@ public final class IconMultiStateFormatt
         
         thresholds = new Threshold[iconSet.num];
         for (int i=0; i<thresholds.length; i++) {
-            thresholds[i] = new Threshold(in);
+            thresholds[i] = new IconMultiStateThreshold(in);
         }
     }
     

Copied: poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateThreshold.java (from r1691844, 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/IconMultiStateThreshold.java?p2=poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateThreshold.java&p1=poi/trunk/src/java/org/apache/poi/hssf/record/cf/Threshold.java&r1=1691844&r2=1691858&rev=1691858&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/IconMultiStateThreshold.java Sun Jul 19 22:09:41 2015
@@ -17,18 +17,14 @@
 
 package org.apache.poi.hssf.record.cf;
 
-import java.util.Arrays;
-
-import org.apache.poi.ss.formula.Formula;
-import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold.RangeType;
 import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Threshold / value for changes in Conditional Formatting
+ * Icon / Multi-State specific Threshold / value (CFVO),
+ *  for changes in Conditional Formatting
  */
-public final class Threshold {
+public final class IconMultiStateThreshold extends Threshold {
     /**
      * Cell values that are equal to the threshold value do not pass the threshold
      */
@@ -38,74 +34,21 @@ public final class Threshold {
      */
     public static final byte EQUALS_INCLUDE = 1;
     
-    private byte type;
-    private Formula formula;
-    private Double value;
     private byte equals;
 
-    public Threshold() {
-        type = (byte)RangeType.NUMBER.id;
-        formula = Formula.create(null);
-        value = 0d;
-    }
-
-    /** Creates new Threshold */
-    public Threshold(LittleEndianInput in) {
-        type = in.readByte();
-        short formulaLen = in.readShort();
-        if (formulaLen > 0) {
-            formula = Formula.read(formulaLen, in);
-        } else {
-            formula = Formula.create(null);
-        }
-        // Value is only there for non-formula, non min/max thresholds
-        if (formulaLen == 0 && type != RangeType.MIN.id &&
-                type != RangeType.MAX.id) {
-            value = in.readDouble();
-        }
+    public IconMultiStateThreshold() {
+        super();
+        equals = EQUALS_INCLUDE;
+    }
+
+    /** Creates new Ico Multi-State Threshold */
+    public IconMultiStateThreshold(LittleEndianInput in) {
+        super(in);
         equals = in.readByte();
         // Reserved, 4 bytes, all 0
         in.readInt();
     }
 
-    public byte getType() {
-        return type;
-    }
-    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;
-    }
-
-    protected Formula getFormula() {
-        return formula;
-    }
-    public Ptg[] getParsedExpression() {
-        return formula.getTokens();
-    }
-    public void setParsedExpression(Ptg[] ptgs) {
-        formula = Formula.create(ptgs);
-        if (ptgs.length > 0) {
-            this.value = null;
-        }
-    }
-
-    public Double getValue() {
-        return value;
-    }
-    public void setValue(Double value) {
-        this.value = value;
-    }
-    
     public byte getEquals() {
         return equals;
     }
@@ -114,43 +57,18 @@ public final class Threshold {
     }
 
     public int getDataLength() {
-        int len = 1 + formula.getEncodedSize();
-        if (value != null) {
-            len += 8;
-        }
-        len += 5;
-        return len;
-    }
-
-    public String toString() {
-        StringBuffer buffer = new StringBuffer();
-        buffer.append("    [CF Threshold]\n");
-        buffer.append("          .type    = ").append(Integer.toHexString(type)).append("\n");
-        buffer.append("          .formula = ").append(Arrays.toString(formula.getTokens())).append("\n");
-        buffer.append("          .value   = ").append(value).append("\n");
-        buffer.append("    [/CF Threshold]\n");
-        return buffer.toString();
+        return super.getDataLength() + 5;
     }
 
     public Object clone() {
-      Threshold rec = new Threshold();
-      rec.type = type;
-      rec.formula = formula;
-      rec.value = value;
+      IconMultiStateThreshold rec = new IconMultiStateThreshold();
+      super.copyTo(rec);
       rec.equals = equals;
       return rec;
     }
 
     public void serialize(LittleEndianOutput out) {
-        out.writeByte(type);
-        if (formula.getTokens().length == 0) {
-            out.writeShort(0);
-        } else {
-            formula.serialize(out);
-        }
-        if (value != null) {
-            out.writeDouble(value);
-        }
+        super.serialize(out);
         out.writeByte(equals);
         out.writeInt(0); // Reserved
     }

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=1691858&r1=1691857&r2=1691858&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 Sun Jul 19 22:09:41 2015
@@ -26,31 +26,21 @@ import org.apache.poi.util.LittleEndianI
 import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Threshold / value for changes in Conditional Formatting
+ * Threshold / value (CFVO) for changes in Conditional Formatting
  */
-public final class Threshold {
-    /**
-     * Cell values that are equal to the threshold value do not pass the threshold
-     */
-    public static final byte EQUALS_EXCLUDE = 0;
-    /**
-     * Cell values that are equal to the threshold value pass the threshold.
-     */
-    public static final byte EQUALS_INCLUDE = 1;
-    
+public abstract class Threshold {
     private byte type;
     private Formula formula;
     private Double value;
-    private byte equals;
 
-    public Threshold() {
+    protected Threshold() {
         type = (byte)RangeType.NUMBER.id;
         formula = Formula.create(null);
         value = 0d;
     }
 
     /** Creates new Threshold */
-    public Threshold(LittleEndianInput in) {
+    protected Threshold(LittleEndianInput in) {
         type = in.readByte();
         short formulaLen = in.readShort();
         if (formulaLen > 0) {
@@ -63,9 +53,6 @@ public final class Threshold {
                 type != RangeType.MAX.id) {
             value = in.readDouble();
         }
-        equals = in.readByte();
-        // Reserved, 4 bytes, all 0
-        in.readInt();
     }
 
     public byte getType() {
@@ -74,7 +61,7 @@ public final class Threshold {
     public void setType(byte type) {
         this.type = type;
 
-        // Ensure the value presense / absense is consistent for the new type
+        // Ensure the value presence / absence is consistent for the new type
         if (type == RangeType.MIN.id || type == RangeType.MAX.id ||
                type == RangeType.FORMULA.id) {
             this.value = null;
@@ -106,19 +93,11 @@ public final class Threshold {
         this.value = value;
     }
     
-    public byte getEquals() {
-        return equals;
-    }
-    public void setEquals(byte equals) {
-        this.equals = equals;
-    }
-
     public int getDataLength() {
         int len = 1 + formula.getEncodedSize();
         if (value != null) {
             len += 8;
         }
-        len += 5;
         return len;
     }
 
@@ -132,13 +111,10 @@ public final class Threshold {
         return buffer.toString();
     }
 
-    public Object clone() {
-      Threshold rec = new Threshold();
+    public void copyTo(Threshold rec) {
       rec.type = type;
       rec.formula = formula;
       rec.value = value;
-      rec.equals = equals;
-      return rec;
     }
 
     public void serialize(LittleEndianOutput out) {
@@ -151,7 +127,5 @@ public final class Threshold {
         if (value != null) {
             out.writeDouble(value);
         }
-        out.writeByte(equals);
-        out.writeInt(0); // Reserved
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java?rev=1691858&r1=1691857&r2=1691858&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFColorScaleFormatting.java Sun Jul 19 22:09:41 2015
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.hssf.record.CFRule12Record;
 import org.apache.poi.hssf.record.cf.ColorGradientFormatting;
+import org.apache.poi.hssf.record.cf.ColorGradientThreshold;
 import org.apache.poi.hssf.record.cf.Threshold;
 import org.apache.poi.ss.usermodel.Color;
 import org.apache.poi.ss.usermodel.ConditionalFormattingThreshold;
@@ -62,14 +63,15 @@ public final class HSSFColorScaleFormatt
     }
 
     public void setThresholds(ConditionalFormattingThreshold[] thresholds) {
-        Threshold[] t = new Threshold[thresholds.length];
+        ColorGradientThreshold[] t = new ColorGradientThreshold[thresholds.length];
         for (int i=0; i<t.length; i++) {
-            t[i] = ((HSSFConditionalFormattingThreshold)thresholds[i]).getThreshold();
+            HSSFConditionalFormattingThreshold hssfT = (HSSFConditionalFormattingThreshold)thresholds[i];
+            t[i] = (ColorGradientThreshold)hssfT.getThreshold();
         }
         colorFormatting.setThresholds(t);
     }
 
     public HSSFConditionalFormattingThreshold createThreshold() {
-        return new HSSFConditionalFormattingThreshold(new Threshold(), sheet);
+        return new HSSFConditionalFormattingThreshold(new ColorGradientThreshold(), sheet);
     }
 }



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