From 275d5519561126cd4c3fa8ea4b91d85385cb2765 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 12 Jul 2015 18:35:33 +0000 Subject: [PATCH] Introduce a CFHeaderBase common parent #58130 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1690503 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/record/CFHeader12Record.java | 10 +- .../apache/poi/hssf/record/CFHeaderBase.java | 153 ++++++++++++++++++ .../poi/hssf/record/CFHeaderRecord.java | 119 +------------- .../poi/hssf/record/TestCFHeaderRecord.java | 57 +++++-- 4 files changed, 207 insertions(+), 132 deletions(-) create mode 100644 src/java/org/apache/poi/hssf/record/CFHeaderBase.java diff --git a/src/java/org/apache/poi/hssf/record/CFHeader12Record.java b/src/java/org/apache/poi/hssf/record/CFHeader12Record.java index 22b165af4e..8559be9b07 100644 --- a/src/java/org/apache/poi/hssf/record/CFHeader12Record.java +++ b/src/java/org/apache/poi/hssf/record/CFHeader12Record.java @@ -25,14 +25,14 @@ import org.apache.poi.util.LittleEndianOutput; * Conditional Formatting Header v12 record CFHEADER12 (0x0879), * for conditional formattings introduced in Excel 2007 and newer. */ -public final class CFHeader12Record extends CFHeaderRecord { +public final class CFHeader12Record extends CFHeaderBase { public static final short sid = 0x0879; private FtrHeader futureHeader; /** Creates new CFHeaderRecord */ public CFHeader12Record() { - super(); + createEmpty(); futureHeader = new FtrHeader(); futureHeader.setRecordType(sid); } @@ -41,9 +41,7 @@ public final class CFHeader12Record extends CFHeaderRecord { futureHeader = new FtrHeader(); futureHeader.setRecordType(sid); } - - public CFHeader12Record(RecordInputStream in) - { + public CFHeader12Record(RecordInputStream in) { futureHeader = new FtrHeader(in); read(in); } @@ -69,7 +67,7 @@ public final class CFHeader12Record extends CFHeaderRecord { public Object clone() { CFHeader12Record result = new CFHeader12Record(); result.futureHeader = (FtrHeader)futureHeader.clone(); - // TODO Clone the rest via the base + super.copyTo(result); return result; } } diff --git a/src/java/org/apache/poi/hssf/record/CFHeaderBase.java b/src/java/org/apache/poi/hssf/record/CFHeaderBase.java new file mode 100644 index 0000000000..4e40a34613 --- /dev/null +++ b/src/java/org/apache/poi/hssf/record/CFHeaderBase.java @@ -0,0 +1,153 @@ +/* ==================================================================== + 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; + +import org.apache.poi.hssf.record.cf.CellRangeUtil; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.LittleEndianOutput; + +/** + * Parent of Conditional Formatting Header records, + * {@link CFHeaderRecord} and {@link CFHeader12Record}. + */ +public abstract class CFHeaderBase extends StandardRecord { + private int field_1_numcf; + private int field_2_need_recalculation_and_id; + private CellRangeAddress field_3_enclosing_cell_range; + private CellRangeAddressList field_4_cell_ranges; + + /** Creates new CFHeaderBase */ + protected CFHeaderBase() { + } + protected CFHeaderBase(CellRangeAddress[] regions, int nRules) { + CellRangeAddress[] unmergedRanges = regions; + CellRangeAddress[] mergeCellRanges = CellRangeUtil.mergeCellRanges(unmergedRanges); + setCellRanges(mergeCellRanges); + field_1_numcf = nRules; + } + + protected void createEmpty() { + field_3_enclosing_cell_range = new CellRangeAddress(0, 0, 0, 0); + field_4_cell_ranges = new CellRangeAddressList(); + } + protected void read(RecordInputStream in) { + field_1_numcf = in.readShort(); + field_2_need_recalculation_and_id = in.readShort(); + field_3_enclosing_cell_range = new CellRangeAddress(in); + field_4_cell_ranges = new CellRangeAddressList(in); + } + + public int getNumberOfConditionalFormats() { + return field_1_numcf; + } + public void setNumberOfConditionalFormats(int n) { + field_1_numcf=n; + } + + public boolean getNeedRecalculation() { + // Held on the 1st bit + return field_2_need_recalculation_and_id % 2 == 1; + } + public void setNeedRecalculation(boolean b) { + // held on the first bit + if (b == getNeedRecalculation()) return; + if (b) field_2_need_recalculation_and_id++; + else field_2_need_recalculation_and_id--; + } + + public int getID() { + // Remaining 15 bits of field 2 + return field_2_need_recalculation_and_id>>1; + } + public void setID(int id) { + // Remaining 15 bits of field 2 + boolean needsRecalc = getNeedRecalculation(); + field_2_need_recalculation_and_id = (id<<1); + if (needsRecalc) field_2_need_recalculation_and_id++; + } + + public CellRangeAddress getEnclosingCellRange() { + return field_3_enclosing_cell_range; + } + public void setEnclosingCellRange(CellRangeAddress cr) { + field_3_enclosing_cell_range = cr; + } + + /** + * Set cell ranges list to a single cell range and + * modify the enclosing cell range accordingly. + * @param cellRanges - list of CellRange objects + */ + public void setCellRanges(CellRangeAddress[] cellRanges) { + if(cellRanges == null) { + throw new IllegalArgumentException("cellRanges must not be null"); + } + CellRangeAddressList cral = new CellRangeAddressList(); + CellRangeAddress enclosingRange = null; + for (int i = 0; i < cellRanges.length; i++) { + CellRangeAddress cr = cellRanges[i]; + enclosingRange = CellRangeUtil.createEnclosingCellRange(cr, enclosingRange); + cral.addCellRangeAddress(cr); + } + field_3_enclosing_cell_range = enclosingRange; + field_4_cell_ranges = cral; + } + + public CellRangeAddress[] getCellRanges() { + return field_4_cell_ranges.getCellRangeAddresses(); + } + + protected abstract String getRecordName(); + public String toString() { + StringBuffer buffer = new StringBuffer(); + + buffer.append("[").append(getRecordName()).append("]\n"); + buffer.append("\t.numCF = ").append(getNumberOfConditionalFormats()).append("\n"); + buffer.append("\t.needRecalc = ").append(getNeedRecalculation()).append("\n"); + buffer.append("\t.id = ").append(getID()).append("\n"); + buffer.append("\t.enclosingCellRange= ").append(getEnclosingCellRange()).append("\n"); + buffer.append("\t.cfranges=["); + for( int i=0; i>1; - } - public void setID(int id) { - // Remaining 15 bits of field 2 - boolean needsRecalc = getNeedRecalculation(); - field_2_need_recalculation_and_id = (id<<1); - if (needsRecalc) field_2_need_recalculation_and_id++; - } - - public CellRangeAddress getEnclosingCellRange() { - return field_3_enclosing_cell_range; - } - public void setEnclosingCellRange(CellRangeAddress cr) { - field_3_enclosing_cell_range = cr; - } - - /** - * Set cell ranges list to a single cell range and - * modify the enclosing cell range accordingly. - * @param cellRanges - list of CellRange objects - */ - public void setCellRanges(CellRangeAddress[] cellRanges) { - if(cellRanges == null) { - throw new IllegalArgumentException("cellRanges must not be null"); - } - CellRangeAddressList cral = new CellRangeAddressList(); - CellRangeAddress enclosingRange = null; - for (int i = 0; i < cellRanges.length; i++) { - CellRangeAddress cr = cellRanges[i]; - enclosingRange = CellRangeUtil.createEnclosingCellRange(cr, enclosingRange); - cral.addCellRangeAddress(cr); - } - field_3_enclosing_cell_range = enclosingRange; - field_4_cell_ranges = cral; - } - - public CellRangeAddress[] getCellRanges() { - return field_4_cell_ranges.getCellRangeAddresses(); - } protected String getRecordName() { return "CFHEADER"; } - public String toString() { - StringBuffer buffer = new StringBuffer(); - - buffer.append("[").append(getRecordName()).append("]\n"); - buffer.append(" .id = ").append(Integer.toHexString(sid)).append("\n"); - buffer.append(" .numCF = ").append(getNumberOfConditionalFormats()).append("\n"); - buffer.append(" .needRecalc = ").append(getNeedRecalculation()).append("\n"); - buffer.append(" .enclosingCellRange= ").append(getEnclosingCellRange()).append("\n"); - buffer.append(" .cfranges=["); - for( int i=0; i