186 lines
5.3 KiB
Java
186 lines
5.3 KiB
Java
/* ====================================================================
|
|
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.FeatFormulaErr2;
|
|
import org.apache.poi.hssf.record.common.FeatProtection;
|
|
import org.apache.poi.hssf.record.common.FeatSmartTag;
|
|
import org.apache.poi.hssf.record.common.FtrHeader;
|
|
import org.apache.poi.hssf.record.common.SharedFeature;
|
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import org.apache.poi.util.LittleEndianOutput;
|
|
import org.apache.poi.util.POILogFactory;
|
|
import org.apache.poi.util.POILogger;
|
|
|
|
/**
|
|
* Title: Feat (Feature) Record
|
|
* <P>
|
|
* This record specifies Shared Features data. It is normally paired
|
|
* up with a {@link FeatHdrRecord}.
|
|
*/
|
|
public final class FeatRecord extends StandardRecord implements Cloneable {
|
|
private static POILogger logger = POILogFactory.getLogger(FeatRecord.class);
|
|
public final static short sid = 0x0868;
|
|
// SIDs from newer versions
|
|
public final static short v11_sid = 0x0872;
|
|
public final static short v12_sid = 0x0878;
|
|
|
|
private FtrHeader futureHeader;
|
|
|
|
/**
|
|
* See SHAREDFEATURES_* on {@link FeatHdrRecord}
|
|
*/
|
|
private int isf_sharedFeatureType;
|
|
private byte reserved1; // Should always be zero
|
|
private long reserved2; // Should always be zero
|
|
/** Only matters if type is ISFFEC2 */
|
|
private long cbFeatData;
|
|
private int reserved3; // Should always be zero
|
|
private CellRangeAddress[] cellRefs;
|
|
|
|
/**
|
|
* Contents depends on isf_sharedFeatureType :
|
|
* ISFPROTECTION -> FeatProtection
|
|
* ISFFEC2 -> FeatFormulaErr2
|
|
* ISFFACTOID -> FeatSmartTag
|
|
*/
|
|
private SharedFeature sharedFeature;
|
|
|
|
public FeatRecord() {
|
|
futureHeader = new FtrHeader();
|
|
futureHeader.setRecordType(sid);
|
|
}
|
|
|
|
public short getSid() {
|
|
return sid;
|
|
}
|
|
|
|
public FeatRecord(RecordInputStream in) {
|
|
futureHeader = new FtrHeader(in);
|
|
|
|
isf_sharedFeatureType = in.readShort();
|
|
reserved1 = in.readByte();
|
|
reserved2 = in.readInt();
|
|
int cref = in.readUShort();
|
|
cbFeatData = in.readInt();
|
|
reserved3 = in.readShort();
|
|
|
|
cellRefs = new CellRangeAddress[cref];
|
|
for(int i=0; i<cellRefs.length; i++) {
|
|
cellRefs[i] = new CellRangeAddress(in);
|
|
}
|
|
|
|
switch(isf_sharedFeatureType) {
|
|
case FeatHdrRecord.SHAREDFEATURES_ISFPROTECTION:
|
|
sharedFeature = new FeatProtection(in);
|
|
break;
|
|
case FeatHdrRecord.SHAREDFEATURES_ISFFEC2:
|
|
sharedFeature = new FeatFormulaErr2(in);
|
|
break;
|
|
case FeatHdrRecord.SHAREDFEATURES_ISFFACTOID:
|
|
sharedFeature = new FeatSmartTag(in);
|
|
break;
|
|
default:
|
|
logger.log( POILogger.ERROR, "Unknown Shared Feature " + isf_sharedFeatureType + " found!");
|
|
}
|
|
}
|
|
|
|
public String toString() {
|
|
StringBuffer buffer = new StringBuffer();
|
|
buffer.append("[SHARED FEATURE]\n");
|
|
|
|
// TODO ...
|
|
|
|
buffer.append("[/SHARED FEATURE]\n");
|
|
return buffer.toString();
|
|
}
|
|
|
|
public void serialize(LittleEndianOutput out) {
|
|
futureHeader.serialize(out);
|
|
|
|
out.writeShort(isf_sharedFeatureType);
|
|
out.writeByte(reserved1);
|
|
out.writeInt((int)reserved2);
|
|
out.writeShort(cellRefs.length);
|
|
out.writeInt((int)cbFeatData);
|
|
out.writeShort(reserved3);
|
|
|
|
for(int i=0; i<cellRefs.length; i++) {
|
|
cellRefs[i].serialize(out);
|
|
}
|
|
|
|
sharedFeature.serialize(out);
|
|
}
|
|
|
|
protected int getDataSize() {
|
|
return 12 + 2+1+4+2+4+2+
|
|
(cellRefs.length * CellRangeAddress.ENCODED_SIZE)
|
|
+sharedFeature.getDataSize();
|
|
}
|
|
|
|
public int getIsf_sharedFeatureType() {
|
|
return isf_sharedFeatureType;
|
|
}
|
|
|
|
public long getCbFeatData() {
|
|
return cbFeatData;
|
|
}
|
|
public void setCbFeatData(long cbFeatData) {
|
|
this.cbFeatData = cbFeatData;
|
|
}
|
|
|
|
public CellRangeAddress[] getCellRefs() {
|
|
return cellRefs;
|
|
}
|
|
public void setCellRefs(CellRangeAddress[] cellRefs) {
|
|
this.cellRefs = cellRefs;
|
|
}
|
|
|
|
public SharedFeature getSharedFeature() {
|
|
return sharedFeature;
|
|
}
|
|
public void setSharedFeature(SharedFeature feature) {
|
|
this.sharedFeature = feature;
|
|
|
|
if(feature instanceof FeatProtection) {
|
|
isf_sharedFeatureType = FeatHdrRecord.SHAREDFEATURES_ISFPROTECTION;
|
|
}
|
|
if(feature instanceof FeatFormulaErr2) {
|
|
isf_sharedFeatureType = FeatHdrRecord.SHAREDFEATURES_ISFFEC2;
|
|
}
|
|
if(feature instanceof FeatSmartTag) {
|
|
isf_sharedFeatureType = FeatHdrRecord.SHAREDFEATURES_ISFFACTOID;
|
|
}
|
|
|
|
if(isf_sharedFeatureType == FeatHdrRecord.SHAREDFEATURES_ISFFEC2) {
|
|
cbFeatData = sharedFeature.getDataSize();
|
|
} else {
|
|
cbFeatData = 0;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
public FeatRecord clone() {
|
|
//HACK: do a "cheat" clone, see Record.java for more information
|
|
return (FeatRecord)cloneViaReserialise();
|
|
}
|
|
|
|
|
|
}
|