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/15 01:30:54 UTC

svn commit: r1691107 - in /poi/trunk/src/java/org/apache/poi: hssf/record/CFRule12Record.java hssf/record/cf/FontFormatting.java hssf/record/cf/IconMultiStateFormatting.java ss/usermodel/IconMultiStateFormatting.java util/BitFieldFactory.java

Author: nick
Date: Tue Jul 14 23:30:53 2015
New Revision: 1691107

URL: http://svn.apache.org/r1691107
Log:
HSSF record support for CF Iconset rules

Added:
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/record/CFRule12Record.java
    poi/trunk/src/java/org/apache/poi/hssf/record/cf/FontFormatting.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/IconMultiStateFormatting.java
    poi/trunk/src/java/org/apache/poi/util/BitFieldFactory.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=1691107&r1=1691106&r2=1691107&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 Tue Jul 14 23:30:53 2015
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.record;
 
 import java.util.Arrays;
 
+import org.apache.poi.hssf.record.cf.IconMultiStateFormatting;
 import org.apache.poi.hssf.record.common.FtrHeader;
 import org.apache.poi.hssf.record.common.FutureRecord;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
@@ -52,11 +53,12 @@ public final class CFRule12Record extend
     private byte template_param_length;
     private byte[] template_params;
     
+    private IconMultiStateFormatting multistate;
+    
     // TODO Parse these
     private byte[] gradient_data;
     private byte[] databar_data;
     private byte[] filter_data;
-    private byte[] multistate_data;
 
     /** Creates new CFRuleRecord */
     private CFRule12Record(byte conditionType, byte comparisonOperation) {
@@ -161,7 +163,7 @@ public final class CFRule12Record extend
         } else if (type == CONDITION_TYPE_FILTER) {
             filter_data = in.readRemainder();
         } else if (type == CONDITION_TYPE_ICON_SET) {
-            multistate_data = in.readRemainder();
+            multistate = new IconMultiStateFormatting(in);
         }
     }
 
@@ -231,7 +233,7 @@ public final class CFRule12Record extend
         } else if (type == CONDITION_TYPE_FILTER) {
             out.write(filter_data);
         } else if (type == CONDITION_TYPE_ICON_SET) {
-            out.write(multistate_data);
+            multistate.serialize(out);
         }
     }
 
@@ -255,7 +257,7 @@ public final class CFRule12Record extend
         } else if (type == CONDITION_TYPE_FILTER) {
             len += filter_data.length;
         } else if (type == CONDITION_TYPE_ICON_SET) {
-            len += multistate_data.length;
+            len += multistate.getDataLength();
         }
         return len;
     }
@@ -286,7 +288,9 @@ public final class CFRule12Record extend
         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");
-        buffer.append("    .multistate_data=").append(HexDump.toHex(multistate_data)).append("\n");
+        if (multistate != null) {
+            buffer.append(multistate);
+        }
         buffer.append("[/CFRULE12]\n");
         return buffer.toString();
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/cf/FontFormatting.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/cf/FontFormatting.java?rev=1691107&r1=1691106&r2=1691107&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/FontFormatting.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/FontFormatting.java Tue Jul 14 23:30:53 2015
@@ -368,8 +368,7 @@ public final class FontFormatting {
         setInt(OFFSET_FONT_COLOR_INDEX,fci);
     }
 
-    private boolean getOptionFlag(BitField field)
-    {
+    private boolean getOptionFlag(BitField field) {
         int optionFlags = getInt(OFFSET_OPTION_FLAGS);
         int value = field.getValue(optionFlags);
         return value==0? true : false ;

Added: 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=1691107&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/cf/IconMultiStateFormatting.java Tue Jul 14 23:30:53 2015
@@ -0,0 +1,123 @@
+/* ====================================================================
+   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.ss.usermodel.IconMultiStateFormatting.IconSet;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndianInput;
+import org.apache.poi.util.LittleEndianOutput;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+/**
+ * Icon / Multi-State Conditional Formatting Rule Record.
+ */
+public final class IconMultiStateFormatting implements Cloneable {
+    private static POILogger log = POILogFactory.getLogger(IconMultiStateFormatting.class);
+            
+    private IconSet iconSet;
+    private byte options;
+    private byte[] states; // TODO Decode
+    
+    private static BitField iconOnly = BitFieldFactory.getInstance(0x01);
+    private static BitField reversed = BitFieldFactory.getInstance(0x04);
+
+    public IconMultiStateFormatting() {
+        iconSet = IconSet.GYR_3_TRAFFIC_LIGHTS;
+        options = 0;
+        states = new byte[0];
+    }
+    public IconMultiStateFormatting(LittleEndianInput in) {
+        in.readShort(); // Ignored
+        in.readByte();  // Reserved
+        int num = in.readByte();
+        int set = in.readByte();
+        iconSet = IconSet.byId(set);
+        if (iconSet.num != num) {
+            log.log(POILogger.WARN, "Inconsistent Icon Set defintion, found " + iconSet + " but defined as " + num + " entries");
+        }
+        options = in.readByte();
+        // TODO Decode
+        states = new byte[in.available()];
+        in.readFully(states);
+    }
+    
+    public IconSet getIconSet() {
+        return iconSet;
+    }
+    public void setIconSet(IconSet set) {
+        this.iconSet = set;
+    }
+
+    public boolean isIconOnly() {
+        return getOptionFlag(iconOnly);
+    }
+    public void setIconOnly(boolean only) {
+        setOptionFlag(only, iconOnly);
+    }
+    
+    public boolean isReversed() {
+        return getOptionFlag(reversed);
+    }
+    public void setReversed(boolean rev) {
+        setOptionFlag(rev, reversed);
+    }
+    
+    private boolean getOptionFlag(BitField field) {
+        int value = field.getValue(options);
+        return value==0? true : false ;
+    }
+    private void setOptionFlag(boolean option, BitField field) {
+        options = field.setByteBoolean(options, option);
+    }
+    
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("    [Icon Formatting]\n");
+        buffer.append("          .icon_set = ").append(iconSet).append("\n");
+        buffer.append("          .icon_only= ").append(isIconOnly()).append("\n");
+        buffer.append("          .reversed = ").append(isReversed()).append("\n");
+        buffer.append("          .states   = ").append(HexDump.toHex(states)).append("\n");
+        buffer.append("    [/Icon Formatting]\n");
+        return buffer.toString();
+    }
+    
+    public Object clone()  {
+      IconMultiStateFormatting rec = new IconMultiStateFormatting();
+      rec.iconSet = iconSet;
+      rec.options = options;
+      rec.states = new byte[states.length];
+      System.arraycopy(states, 0, rec.states, 0, states.length);
+      return rec;
+    }
+    
+    public int getDataLength() {
+        return 6 + states.length;
+    }
+
+    public void serialize(LittleEndianOutput out) {
+        out.writeShort(0);
+        out.writeByte(0);
+        out.writeByte(iconSet.num);
+        out.writeByte(iconSet.id);
+        out.writeByte(options);
+        out.write(states);
+    }
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/IconMultiStateFormatting.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/IconMultiStateFormatting.java?rev=1691107&r1=1691106&r2=1691107&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/IconMultiStateFormatting.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/IconMultiStateFormatting.java Tue Jul 14 23:30:53 2015
@@ -19,17 +19,44 @@
 
 package org.apache.poi.ss.usermodel;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * High level representation for the Icon / Multi-State Formatting 
  *  component of Conditional Formatting settings
  */
 public interface IconMultiStateFormatting {
-    class IconSet {
+    public enum IconSet {
+        /** Green Up / Yellow Side / Red Down arrows */
+        GYR_3_ARROW(0, 3, "3Arrows"),
+        /** Grey Up / Side / Down arrows */
+        GREY_3_ARROWS(1, 3, "3ArrowsGray"),
+        /** Green / Yellow / Red flags */
+        GYR_3_FLAGS(2, 3, "3Flags"),
+        /** Green / Yellow / Red traffic lights (no background) */
+        GYR_3_TRAFFIC_LIGHTS(3, 3, null),
+        /** Green Circle / Yellow Triangle / Red Diamond */ 
+        GYR_3_SHAPES(4, 3, "3Signs"),
+        /** Green / Yellow / Red traffic lights on a black square background */
+        GYR_3_TRAFFIC_LIGHTS_BOX(5, 3, "3TrafficLights2"),
+        /** Green Tick / Yellow ! / Red Cross on a circle background */
+        GYR_3_SYMBOLS_CIRCLE(6, 3, "3Symbols"),
+        /** Green Tick / Yellow ! / Red Cross (no background) */
+        GYR_3_SYMBOLS(7, 3, "3Symbols2"),
+        /** Green Up / Yellow NE / Yellow SE / Red Down arrows */
+        GYR_4_ARROWS(8, 4, "4Arrows"),
+        /** Grey Up / NE / SE / Down arrows */
+        GREY_4_ARROWS(9, 4, "4ArrowsGray"),
+        /** Red / Light Red / Grey / Black traffic lights */
+        RB_4_TRAFFIC_LIGHTS(0xA, 4, "4RedToBlack"),
+        RATINGS_4(0xB, 4, "4Rating"),
+        /** Green / Yellow / Red / Black traffic lights */
+        GYRB_4_TRAFFIC_LIGHTS(0xC, 4, "4TrafficLights"),
+        GYYYR_5_ARROWS(0xD, 5, "5Arrows"),
+        GREY_5_ARROWS(0xE, 5, "5ArrowsGray"),
+        RATINGS_5(0xF, 5, "5Rating"),
+        QUARTERS_5(0x10, 5, "5Quarters");
+        
         /** Numeric ID of the icon set */
-        public final int id;
+        public int id;
         /** How many icons in the set */
         public final int num;
         /** Name (system) of the set */
@@ -42,46 +69,14 @@ public interface IconMultiStateFormattin
             return (name==null?"default":name);
         }
         
-        public static IconSet byId(int id) { return byId[id]; }
-        public static IconSet byName(String name) { return byName.get(name); }
+        public static IconSet byId(int id) {
+            return values()[id];
+        }
         
-        private static final IconSet[] byId = new IconSet[0x10];
-        private static final Map<String,IconSet> byName = new HashMap<String, IconMultiStateFormatting.IconSet>();
         private IconSet(int id, int num, String name) {
             this.id = id; this.num = num; this.name = name;
-            byId[id] = this;
-            byName.put(getName(),this);
         }
     }
-    /** Green Up / Yellow Side / Red Down arrows */
-    static final IconSet GYR_3_ARROWS = new IconSet(0, 3, "3Arrows");
-    /** Grey Up / Side / Down arrows */
-    static final IconSet GREY_3_ARROWS = new IconSet(1, 3, "3ArrowsGray");
-    /** Green / Yellow / Red flags */
-    static final IconSet GYR_3_FLAGS = new IconSet(2, 3, "3Flags");
-    /** Green / Yellow / Red traffic lights (no background) */
-    static final IconSet GYR_3_TRAFFIC_LIGHTS = new IconSet(3, 3, null);
-    /** Green Circle / Yellow Triangle / Red Diamond */ 
-    static final IconSet GYR_3_SHAPES = new IconSet(4, 3, "3Signs");
-    /** Green / Yellow / Red traffic lights on a black square background */
-    static final IconSet GYR_3_TRAFFIC_LIGHTS_BOX = new IconSet(5, 3, "3TrafficLights2");
-    /** Green Tick / Yellow ! / Red Cross on a circle background */
-    static final IconSet GYR_3_SYMBOLS_CIRCLE = new IconSet(6, 3, "3Symbols");
-    /** Green Tick / Yellow ! / Red Cross (no background) */
-    static final IconSet GYR_3_SYMBOLS = new IconSet(7, 3, "3Symbols2");
-    /** Green Up / Yellow NE / Yellow SE / Red Down arrows */
-    static final IconSet GYR_4_ARROWS = new IconSet(8, 4, "4Arrows");
-    /** Grey Up / NE / SE / Down arrows */
-    static final IconSet GREY_4_ARROWS = new IconSet(9, 4, "4ArrowsGray");
-    /** Red / Light Red / Grey / Black traffic lights */
-    static final IconSet RB_4_TRAFFIC_LIGHTS = new IconSet(0xA, 4, "4RedToBlack");
-    static final IconSet RATINGS_4 = new IconSet(0xB, 4, "4Rating");
-    /** Green / Yellow / Red / Black traffic lights */
-    static final IconSet GYRB_4_TRAFFIC_LIGHTS = new IconSet(0xC, 4, "4TrafficLights");
-    static final IconSet GYYYR_5_ARROWS = new IconSet(0xD, 5, "5Arrows");
-    static final IconSet GREY_5_ARROWS = new IconSet(0xE, 5, "5ArrowsGray");
-    static final IconSet RATINGS_5 = new IconSet(0xF, 5, "5Rating");
-    static final IconSet QUARTERS_5 = new IconSet(0x10, 5, "5Quarters");
     
     /**
      * Get the Icon Set used

Modified: poi/trunk/src/java/org/apache/poi/util/BitFieldFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/BitFieldFactory.java?rev=1691107&r1=1691106&r2=1691107&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/BitFieldFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/BitFieldFactory.java Tue Jul 14 23:30:53 2015
@@ -21,11 +21,8 @@ package org.apache.poi.util;
 import java.util.*;
 
 /**
- * Returns immutable Btfield instances.
- *
- * @author Jason Height (jheight at apache dot org)
+ * Returns immutable Bitfield instances.
  */
-
 public class BitFieldFactory {
     private static Map<Integer, BitField> instances = new HashMap<Integer, BitField>();
 



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