HSSF record support for CF Iconset rules
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1691107 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1d7cd9d933
commit
4ac9f854c3
@ -19,6 +19,7 @@ package org.apache.poi.hssf.record;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
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.FtrHeader;
|
||||||
import org.apache.poi.hssf.record.common.FutureRecord;
|
import org.apache.poi.hssf.record.common.FutureRecord;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
@ -52,11 +53,12 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
|
|||||||
private byte template_param_length;
|
private byte template_param_length;
|
||||||
private byte[] template_params;
|
private byte[] template_params;
|
||||||
|
|
||||||
|
private IconMultiStateFormatting multistate;
|
||||||
|
|
||||||
// TODO Parse these
|
// TODO Parse these
|
||||||
private byte[] gradient_data;
|
private byte[] gradient_data;
|
||||||
private byte[] databar_data;
|
private byte[] databar_data;
|
||||||
private byte[] filter_data;
|
private byte[] filter_data;
|
||||||
private byte[] multistate_data;
|
|
||||||
|
|
||||||
/** Creates new CFRuleRecord */
|
/** Creates new CFRuleRecord */
|
||||||
private CFRule12Record(byte conditionType, byte comparisonOperation) {
|
private CFRule12Record(byte conditionType, byte comparisonOperation) {
|
||||||
@ -161,7 +163,7 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
|
|||||||
} else if (type == CONDITION_TYPE_FILTER) {
|
} else if (type == CONDITION_TYPE_FILTER) {
|
||||||
filter_data = in.readRemainder();
|
filter_data = in.readRemainder();
|
||||||
} else if (type == CONDITION_TYPE_ICON_SET) {
|
} else if (type == CONDITION_TYPE_ICON_SET) {
|
||||||
multistate_data = in.readRemainder();
|
multistate = new IconMultiStateFormatting(in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +233,7 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
|
|||||||
} else if (type == CONDITION_TYPE_FILTER) {
|
} else if (type == CONDITION_TYPE_FILTER) {
|
||||||
out.write(filter_data);
|
out.write(filter_data);
|
||||||
} else if (type == CONDITION_TYPE_ICON_SET) {
|
} else if (type == CONDITION_TYPE_ICON_SET) {
|
||||||
out.write(multistate_data);
|
multistate.serialize(out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,7 +257,7 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
|
|||||||
} else if (type == CONDITION_TYPE_FILTER) {
|
} else if (type == CONDITION_TYPE_FILTER) {
|
||||||
len += filter_data.length;
|
len += filter_data.length;
|
||||||
} else if (type == CONDITION_TYPE_ICON_SET) {
|
} else if (type == CONDITION_TYPE_ICON_SET) {
|
||||||
len += multistate_data.length;
|
len += multistate.getDataLength();
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@ -286,7 +288,9 @@ public final class CFRule12Record extends CFRuleBase implements FutureRecord {
|
|||||||
buffer.append(" .gradient_data =").append(HexDump.toHex(gradient_data)).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(" .databar_data =").append(HexDump.toHex(databar_data)).append("\n");
|
||||||
buffer.append(" .filter_data =").append(HexDump.toHex(filter_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");
|
buffer.append("[/CFRULE12]\n");
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
@ -368,8 +368,7 @@ public final class FontFormatting {
|
|||||||
setInt(OFFSET_FONT_COLOR_INDEX,fci);
|
setInt(OFFSET_FONT_COLOR_INDEX,fci);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean getOptionFlag(BitField field)
|
private boolean getOptionFlag(BitField field) {
|
||||||
{
|
|
||||||
int optionFlags = getInt(OFFSET_OPTION_FLAGS);
|
int optionFlags = getInt(OFFSET_OPTION_FLAGS);
|
||||||
int value = field.getValue(optionFlags);
|
int value = field.getValue(optionFlags);
|
||||||
return value==0? true : false ;
|
return value==0? true : false ;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -19,17 +19,44 @@
|
|||||||
|
|
||||||
package org.apache.poi.ss.usermodel;
|
package org.apache.poi.ss.usermodel;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation for the Icon / Multi-State Formatting
|
* High level representation for the Icon / Multi-State Formatting
|
||||||
* component of Conditional Formatting settings
|
* component of Conditional Formatting settings
|
||||||
*/
|
*/
|
||||||
public interface IconMultiStateFormatting {
|
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 */
|
/** Numeric ID of the icon set */
|
||||||
public final int id;
|
public int id;
|
||||||
/** How many icons in the set */
|
/** How many icons in the set */
|
||||||
public final int num;
|
public final int num;
|
||||||
/** Name (system) of the set */
|
/** Name (system) of the set */
|
||||||
@ -42,46 +69,14 @@ public interface IconMultiStateFormatting {
|
|||||||
return (name==null?"default":name);
|
return (name==null?"default":name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IconSet byId(int id) { return byId[id]; }
|
public static IconSet byId(int id) {
|
||||||
public static IconSet byName(String name) { return byName.get(name); }
|
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) {
|
private IconSet(int id, int num, String name) {
|
||||||
this.id = id; this.num = num; this.name = 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
|
* Get the Icon Set used
|
||||||
|
@ -21,11 +21,8 @@ package org.apache.poi.util;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns immutable Btfield instances.
|
* Returns immutable Bitfield instances.
|
||||||
*
|
|
||||||
* @author Jason Height (jheight at apache dot org)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class BitFieldFactory {
|
public class BitFieldFactory {
|
||||||
private static Map<Integer, BitField> instances = new HashMap<Integer, BitField>();
|
private static Map<Integer, BitField> instances = new HashMap<Integer, BitField>();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user