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/12 19:58:27 UTC
svn commit: r1690494 - in /poi/trunk/src/java/org/apache/poi/hssf:
dev/BiffViewer.java record/CFHeader12Record.java record/CFHeaderRecord.java
record/RecordFactory.java record/common/FtrHeader.java
Author: nick
Date: Sun Jul 12 17:58:27 2015
New Revision: 1690494
URL: http://svn.apache.org/r1690494
Log:
Start to support CF12 headers for #58130
Added:
poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java?rev=1690494&r1=1690493&r2=1690494&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java Sun Jul 12 17:58:27 2015
@@ -180,6 +180,7 @@ public final class BiffViewer {
case BottomMarginRecord.sid: return new BottomMarginRecord(in);
case BoundSheetRecord.sid: return new BoundSheetRecord(in);
case CFHeaderRecord.sid: return new CFHeaderRecord(in);
+ case CFHeader12Record.sid: return new CFHeader12Record(in);
case CFRuleRecord.sid: return new CFRuleRecord(in);
case CalcCountRecord.sid: return new CalcCountRecord(in);
case CalcModeRecord.sid: return new CalcModeRecord(in);
Added: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java?rev=1690494&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeader12Record.java Sun Jul 12 17:58:27 2015
@@ -0,0 +1,75 @@
+/* ====================================================================
+ 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.common.FtrHeader;
+import org.apache.poi.ss.util.CellRangeAddress;
+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 static final short sid = 0x0879;
+
+ private FtrHeader futureHeader;
+
+ /** Creates new CFHeaderRecord */
+ public CFHeader12Record() {
+ super();
+ futureHeader = new FtrHeader();
+ futureHeader.setRecordType(sid);
+ }
+ public CFHeader12Record(CellRangeAddress[] regions, int nRules) {
+ super(regions, nRules);
+ futureHeader = new FtrHeader();
+ futureHeader.setRecordType(sid);
+ }
+
+ public CFHeader12Record(RecordInputStream in)
+ {
+ futureHeader = new FtrHeader(in);
+ read(in);
+ }
+
+ @Override
+ protected String getRecordName() {
+ return "CFHEADER12";
+ }
+
+ protected int getDataSize() {
+ return FtrHeader.getDataSize() + super.getDataSize();
+ }
+
+ public void serialize(LittleEndianOutput out) {
+ futureHeader.serialize(out);
+ super.serialize(out);
+ }
+
+ public short getSid() {
+ return sid;
+ }
+
+ public Object clone() {
+ CFHeader12Record result = new CFHeader12Record();
+ result.futureHeader = (FtrHeader)futureHeader.clone();
+ // TODO Clone the rest via the base
+ return result;
+ }
+}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java?rev=1690494&r1=1690493&r2=1690494&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java Sun Jul 12 17:58:27 2015
@@ -26,12 +26,13 @@ import org.apache.poi.util.LittleEndianO
* Conditional Formatting Header record CFHEADER (0x01B0).
* Used to describe a {@link CFRuleRecord}.
* @see CFHeader12Record
+ * TODO Move most of the logic into a base class
*/
-public final class CFHeaderRecord extends StandardRecord {
+public class CFHeaderRecord extends StandardRecord {
public static final short sid = 0x01B0;
private int field_1_numcf;
- private int field_2_need_recalculation;
+ private int field_2_need_recalculation_and_id;
private CellRangeAddress field_3_enclosing_cell_range;
private CellRangeAddressList field_4_cell_ranges;
@@ -47,40 +48,51 @@ public final class CFHeaderRecord extend
field_1_numcf = nRules;
}
- public CFHeaderRecord(RecordInputStream in)
- {
+ public CFHeaderRecord(RecordInputStream in) {
+ read(in);
+ }
+ protected void read(RecordInputStream in) {
field_1_numcf = in.readShort();
- field_2_need_recalculation = 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()
- {
+ public int getNumberOfConditionalFormats() {
return field_1_numcf;
}
- public void setNumberOfConditionalFormats(int n)
- {
+ public void setNumberOfConditionalFormats(int n) {
field_1_numcf=n;
}
- public boolean getNeedRecalculation()
+ 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()
{
- return field_2_need_recalculation==1?true:false;
+ // Remaining 15 bits of field 2
+ return field_2_need_recalculation_and_id>>1;
}
-
- public void setNeedRecalculation(boolean b)
+ public void setID(int id)
{
- field_2_need_recalculation=b?1:0;
+ // 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()
- {
+ public CellRangeAddress getEnclosingCellRange() {
return field_3_enclosing_cell_range;
}
-
- public void setEnclosingCellRange(CellRangeAddress cr)
- {
+ public void setEnclosingCellRange(CellRangeAddress cr) {
field_3_enclosing_cell_range = cr;
}
@@ -89,8 +101,7 @@ public final class CFHeaderRecord extend
* modify the enclosing cell range accordingly.
* @param cellRanges - list of CellRange objects
*/
- public void setCellRanges(CellRangeAddress[] cellRanges)
- {
+ public void setCellRanges(CellRangeAddress[] cellRanges) {
if(cellRanges == null)
{
throw new IllegalArgumentException("cellRanges must not be null");
@@ -111,11 +122,13 @@ public final class CFHeaderRecord extend
return field_4_cell_ranges.getCellRangeAddresses();
}
- public String toString()
- {
+ protected String getRecordName() {
+ return "CFHEADER";
+ }
+ public String toString() {
StringBuffer buffer = new StringBuffer();
- buffer.append("[CFHEADER]\n");
+ 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");
@@ -126,7 +139,7 @@ public final class CFHeaderRecord extend
buffer.append(i==0?"":",").append(field_4_cell_ranges.getCellRangeAddress(i).toString());
}
buffer.append("]\n");
- buffer.append("[/CFHEADER]\n");
+ buffer.append("[/").append(getRecordName()).append("]\n");
return buffer.toString();
}
@@ -137,9 +150,8 @@ public final class CFHeaderRecord extend
}
public void serialize(LittleEndianOutput out) {
-
out.writeShort(field_1_numcf);
- out.writeShort(field_2_need_recalculation);
+ out.writeShort(field_2_need_recalculation_and_id);
field_3_enclosing_cell_range.serialize(out);
field_4_cell_ranges.serialize(out);
}
@@ -148,11 +160,10 @@ public final class CFHeaderRecord extend
return sid;
}
- public Object clone()
- {
+ public Object clone() {
CFHeaderRecord result = new CFHeaderRecord();
result.field_1_numcf = field_1_numcf;
- result.field_2_need_recalculation = field_2_need_recalculation;
+ result.field_2_need_recalculation_and_id = field_2_need_recalculation_and_id;
result.field_3_enclosing_cell_range = field_3_enclosing_cell_range;
result.field_4_cell_ranges = field_4_cell_ranges.copy();
return result;
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java?rev=1690494&r1=1690493&r2=1690494&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java Sun Jul 12 17:58:27 2015
@@ -155,6 +155,7 @@ public final class RecordFactory {
CalcCountRecord.class,
CalcModeRecord.class,
CFHeaderRecord.class,
+ CFHeader12Record.class,
CFRuleRecord.class,
ChartRecord.class,
ChartTitleFormatRecord.class,
@@ -166,7 +167,7 @@ public final class RecordFactory {
CRNRecord.class,
DateWindow1904Record.class,
DBCellRecord.class,
- DConRefRecord.class,
+ DConRefRecord.class,
DefaultColWidthRecord.class,
DefaultRowHeightRecord.class,
DeltaRecord.class,
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java?rev=1690494&r1=1690493&r2=1690494&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/common/FtrHeader.java Sun Jul 12 17:58:27 2015
@@ -32,7 +32,7 @@ public final class FtrHeader {
private short recordType;
/** This is a FrtFlags */
private short grbitFrt;
- /** MUST be 8 bytes and all zero */
+ /** MUST be 8 bytes and all zero TODO Correct this! */
private byte[] reserved;
public FtrHeader() {
@@ -86,4 +86,12 @@ public final class FtrHeader {
public void setReserved(byte[] reserved) {
this.reserved = reserved;
}
+
+ public Object clone() {
+ FtrHeader result = new FtrHeader();
+ result.recordType = recordType;
+ result.grbitFrt = grbitFrt;
+ result.reserved = reserved;
+ return result;
+ }
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org