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 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 extends CFRuleBase implements FutureRecord {
|
||||
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 extends CFRuleBase implements FutureRecord {
|
||||
} 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 extends CFRuleBase implements FutureRecord {
|
||||
} 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 extends CFRuleBase implements FutureRecord {
|
||||
} 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 extends CFRuleBase implements FutureRecord {
|
||||
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();
|
||||
}
|
||||
|
@ -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 ;
|
||||
|
@ -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;
|
||||
|
||||
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 IconMultiStateFormatting {
|
||||
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
|
||||
|
@ -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>();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user