Remove more deprecated code
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1813092 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6c0ac68e05
commit
af2813634b
@ -1,31 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.hwpf.model;
|
|
||||||
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author andy
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
@Deprecated
|
|
||||||
public interface HDFType {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -34,266 +34,237 @@ import org.apache.poi.util.StringUtil;
|
|||||||
* @author Ryan Ackley
|
* @author Ryan Ackley
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public final class StyleDescription implements HDFType
|
public final class StyleDescription {
|
||||||
{
|
|
||||||
|
|
||||||
private static final POILogger logger = POILogFactory.getLogger( StyleDescription.class );
|
private static final POILogger logger = POILogFactory.getLogger(StyleDescription.class);
|
||||||
//arbitrarily selected; may need to increase
|
//arbitrarily selected; may need to increase
|
||||||
private static final int MAX_RECORD_LENGTH = 100_000;
|
private static final int MAX_RECORD_LENGTH = 100_000;
|
||||||
|
|
||||||
private final static int PARAGRAPH_STYLE = 1;
|
private final static int PARAGRAPH_STYLE = 1;
|
||||||
private final static int CHARACTER_STYLE = 2;
|
private final static int CHARACTER_STYLE = 2;
|
||||||
// private final static int TABLE_STYLE = 3;
|
// private final static int TABLE_STYLE = 3;
|
||||||
// private final static int NUMBERING_STYLE = 4;
|
// private final static int NUMBERING_STYLE = 4;
|
||||||
|
|
||||||
private int _baseLength;
|
private int _baseLength;
|
||||||
private StdfBase _stdfBase;
|
private StdfBase _stdfBase;
|
||||||
private StdfPost2000 _stdfPost2000;
|
private StdfPost2000 _stdfPost2000;
|
||||||
|
|
||||||
UPX[] _upxs;
|
UPX[] _upxs;
|
||||||
String _name;
|
String _name;
|
||||||
@Deprecated
|
@Deprecated
|
||||||
ParagraphProperties _pap;
|
ParagraphProperties _pap;
|
||||||
@Deprecated
|
@Deprecated
|
||||||
CharacterProperties _chp;
|
CharacterProperties _chp;
|
||||||
|
|
||||||
public StyleDescription()
|
public StyleDescription() {
|
||||||
{
|
|
||||||
// _pap = new ParagraphProperties();
|
// _pap = new ParagraphProperties();
|
||||||
// _chp = new CharacterProperties();
|
// _chp = new CharacterProperties();
|
||||||
}
|
}
|
||||||
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9)
|
|
||||||
{
|
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9) {
|
||||||
_baseLength = baseLength;
|
_baseLength = baseLength;
|
||||||
int nameStart = offset + baseLength;
|
int nameStart = offset + baseLength;
|
||||||
|
|
||||||
boolean readStdfPost2000 = false;
|
boolean readStdfPost2000 = false;
|
||||||
if ( baseLength == 0x0012 )
|
if (baseLength == 0x0012) {
|
||||||
{
|
|
||||||
readStdfPost2000 = true;
|
readStdfPost2000 = true;
|
||||||
}
|
} else if (baseLength == 0x000A) {
|
||||||
else if ( baseLength == 0x000A )
|
|
||||||
{
|
|
||||||
readStdfPost2000 = false;
|
readStdfPost2000 = false;
|
||||||
}
|
} else {
|
||||||
else
|
logger.log(POILogger.WARN,
|
||||||
{
|
|
||||||
logger.log( POILogger.WARN,
|
|
||||||
"Style definition has non-standard size of ",
|
"Style definition has non-standard size of ",
|
||||||
Integer.valueOf( baseLength ) );
|
Integer.valueOf(baseLength));
|
||||||
}
|
}
|
||||||
|
|
||||||
_stdfBase = new StdfBase(std, offset);
|
_stdfBase = new StdfBase(std, offset);
|
||||||
offset += StdfBase.getSize();
|
offset += StdfBase.getSize();
|
||||||
|
|
||||||
if ( readStdfPost2000 )
|
if (readStdfPost2000) {
|
||||||
{
|
_stdfPost2000 = new StdfPost2000(std, offset);
|
||||||
_stdfPost2000 = new StdfPost2000( std, offset );
|
|
||||||
// offset += StdfPost2000.getSize();
|
// offset += StdfPost2000.getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
//first byte(s) of variable length section of std is the length of the
|
//first byte(s) of variable length section of std is the length of the
|
||||||
//style name and aliases string
|
//style name and aliases string
|
||||||
int nameLength = 0;
|
int nameLength = 0;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
if(word9)
|
if (word9) {
|
||||||
{
|
nameLength = LittleEndian.getShort(std, nameStart);
|
||||||
nameLength = LittleEndian.getShort(std, nameStart);
|
multiplier = 2;
|
||||||
multiplier = 2;
|
nameStart += LittleEndian.SHORT_SIZE;
|
||||||
nameStart += LittleEndian.SHORT_SIZE;
|
} else {
|
||||||
}
|
nameLength = std[nameStart];
|
||||||
else
|
|
||||||
{
|
|
||||||
nameLength = std[nameStart];
|
|
||||||
}
|
|
||||||
|
|
||||||
_name = StringUtil.getFromUnicodeLE(std, nameStart, (nameLength*multiplier)/2);
|
|
||||||
|
|
||||||
//length then null terminator.
|
|
||||||
|
|
||||||
// the spec only refers to two possible upxs but it mentions
|
|
||||||
// that more may be added in the future
|
|
||||||
int varOffset = ((nameLength + 1) * multiplier) + nameStart;
|
|
||||||
int countOfUPX = _stdfBase.getCupx();
|
|
||||||
_upxs = new UPX[countOfUPX];
|
|
||||||
for(int x = 0; x < countOfUPX; x++)
|
|
||||||
{
|
|
||||||
int upxSize = LittleEndian.getShort(std, varOffset);
|
|
||||||
varOffset += LittleEndian.SHORT_SIZE;
|
|
||||||
|
|
||||||
byte[] upx = IOUtils.safelyAllocate(upxSize, Short.MAX_VALUE);
|
|
||||||
System.arraycopy(std, varOffset, upx, 0, upxSize);
|
|
||||||
_upxs[x] = new UPX(upx);
|
|
||||||
varOffset += upxSize;
|
|
||||||
|
|
||||||
|
|
||||||
// the upx will always start on a word boundary.
|
|
||||||
if((upxSize & 1) == 1)
|
|
||||||
{
|
|
||||||
++varOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
public int getBaseStyle()
|
|
||||||
{
|
|
||||||
return _stdfBase.getIstdBase();
|
|
||||||
}
|
|
||||||
public byte[] getCHPX()
|
|
||||||
{
|
|
||||||
switch (_stdfBase.getStk())
|
|
||||||
{
|
|
||||||
case PARAGRAPH_STYLE:
|
|
||||||
if (_upxs.length > 1)
|
|
||||||
{
|
|
||||||
return _upxs[1].getUPX();
|
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
case CHARACTER_STYLE:
|
_name = StringUtil.getFromUnicodeLE(std, nameStart, (nameLength * multiplier) / 2);
|
||||||
return _upxs[0].getUPX();
|
|
||||||
default:
|
//length then null terminator.
|
||||||
return null;
|
|
||||||
|
// the spec only refers to two possible upxs but it mentions
|
||||||
|
// that more may be added in the future
|
||||||
|
int varOffset = ((nameLength + 1) * multiplier) + nameStart;
|
||||||
|
int countOfUPX = _stdfBase.getCupx();
|
||||||
|
_upxs = new UPX[countOfUPX];
|
||||||
|
for (int x = 0; x < countOfUPX; x++) {
|
||||||
|
int upxSize = LittleEndian.getShort(std, varOffset);
|
||||||
|
varOffset += LittleEndian.SHORT_SIZE;
|
||||||
|
|
||||||
|
byte[] upx = IOUtils.safelyAllocate(upxSize, Short.MAX_VALUE);
|
||||||
|
System.arraycopy(std, varOffset, upx, 0, upxSize);
|
||||||
|
_upxs[x] = new UPX(upx);
|
||||||
|
varOffset += upxSize;
|
||||||
|
|
||||||
|
|
||||||
|
// the upx will always start on a word boundary.
|
||||||
|
if ((upxSize & 1) == 1) {
|
||||||
|
++varOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public int getBaseStyle() {
|
||||||
public byte[] getPAPX()
|
return _stdfBase.getIstdBase();
|
||||||
{
|
|
||||||
switch (_stdfBase.getStk())
|
|
||||||
{
|
|
||||||
case PARAGRAPH_STYLE:
|
|
||||||
return _upxs[0].getUPX();
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
public ParagraphProperties getPAP()
|
|
||||||
{
|
|
||||||
return _pap;
|
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
public CharacterProperties getCHP()
|
|
||||||
{
|
|
||||||
return _chp;
|
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
void setPAP(ParagraphProperties pap)
|
|
||||||
{
|
|
||||||
_pap = pap;
|
|
||||||
}
|
|
||||||
@Deprecated
|
|
||||||
void setCHP(CharacterProperties chp)
|
|
||||||
{
|
|
||||||
_chp = chp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName()
|
|
||||||
{
|
|
||||||
return _name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] toByteArray()
|
|
||||||
{
|
|
||||||
// size equals _baseLength bytes for known variables plus 2 bytes for name
|
|
||||||
// length plus name length * 2 plus 2 bytes for null plus upx's preceded by
|
|
||||||
// length
|
|
||||||
int size = _baseLength + 2 + ((_name.length() + 1) * 2);
|
|
||||||
|
|
||||||
// determine the size needed for the upxs. They always fall on word
|
|
||||||
// boundaries.
|
|
||||||
size += _upxs[0].size() + 2;
|
|
||||||
for (int x = 1; x < _upxs.length; x++)
|
|
||||||
{
|
|
||||||
size += _upxs[x-1].size() % 2;
|
|
||||||
size += _upxs[x].size() + 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] getCHPX() {
|
||||||
|
switch (_stdfBase.getStk()) {
|
||||||
|
case PARAGRAPH_STYLE:
|
||||||
|
if (_upxs.length > 1) {
|
||||||
|
return _upxs[1].getUPX();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
case CHARACTER_STYLE:
|
||||||
|
return _upxs[0].getUPX();
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
byte[] buf = new byte[size];
|
|
||||||
_stdfBase.serialize( buf, 0 );
|
|
||||||
|
|
||||||
int offset = _baseLength;
|
|
||||||
|
|
||||||
char[] letters = _name.toCharArray();
|
|
||||||
LittleEndian.putShort(buf, _baseLength, (short)letters.length);
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
|
||||||
for (int x = 0; x < letters.length; x++)
|
|
||||||
{
|
|
||||||
LittleEndian.putShort(buf, offset, (short)letters[x]);
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
|
||||||
}
|
|
||||||
// get past the null delimiter for the name.
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
|
||||||
|
|
||||||
for (int x = 0; x < _upxs.length; x++)
|
|
||||||
{
|
|
||||||
short upxSize = (short)_upxs[x].size();
|
|
||||||
LittleEndian.putShort(buf, offset, upxSize);
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
|
||||||
System.arraycopy(_upxs[x].getUPX(), 0, buf, offset, upxSize);
|
|
||||||
offset += upxSize + (upxSize % 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf;
|
public byte[] getPAPX() {
|
||||||
}
|
switch (_stdfBase.getStk()) {
|
||||||
|
case PARAGRAPH_STYLE:
|
||||||
|
return _upxs[0].getUPX();
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public ParagraphProperties getPAP() {
|
||||||
|
return _pap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public CharacterProperties getCHP() {
|
||||||
|
return _chp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
void setPAP(ParagraphProperties pap) {
|
||||||
|
_pap = pap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
void setCHP(CharacterProperties chp) {
|
||||||
|
_chp = chp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] toByteArray() {
|
||||||
|
// size equals _baseLength bytes for known variables plus 2 bytes for name
|
||||||
|
// length plus name length * 2 plus 2 bytes for null plus upx's preceded by
|
||||||
|
// length
|
||||||
|
int size = _baseLength + 2 + ((_name.length() + 1) * 2);
|
||||||
|
|
||||||
|
// determine the size needed for the upxs. They always fall on word
|
||||||
|
// boundaries.
|
||||||
|
size += _upxs[0].size() + 2;
|
||||||
|
for (int x = 1; x < _upxs.length; x++) {
|
||||||
|
size += _upxs[x - 1].size() % 2;
|
||||||
|
size += _upxs[x].size() + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte[] buf = new byte[size];
|
||||||
|
_stdfBase.serialize(buf, 0);
|
||||||
|
|
||||||
|
int offset = _baseLength;
|
||||||
|
|
||||||
|
char[] letters = _name.toCharArray();
|
||||||
|
LittleEndian.putShort(buf, _baseLength, (short) letters.length);
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
for (int x = 0; x < letters.length; x++) {
|
||||||
|
LittleEndian.putShort(buf, offset, (short) letters[x]);
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
}
|
||||||
|
// get past the null delimiter for the name.
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
|
||||||
|
for (int x = 0; x < _upxs.length; x++) {
|
||||||
|
short upxSize = (short) _upxs[x].size();
|
||||||
|
LittleEndian.putShort(buf, offset, upxSize);
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
System.arraycopy(_upxs[x].getUPX(), 0, buf, offset, upxSize);
|
||||||
|
offset += upxSize + (upxSize % 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode()
|
public int hashCode() {
|
||||||
{
|
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ( ( _name == null ) ? 0 : _name.hashCode() );
|
result = prime * result + ((_name == null) ? 0 : _name.hashCode());
|
||||||
result = prime * result
|
result = prime * result
|
||||||
+ ( ( _stdfBase == null ) ? 0 : _stdfBase.hashCode() );
|
+ ((_stdfBase == null) ? 0 : _stdfBase.hashCode());
|
||||||
result = prime * result + Arrays.hashCode( _upxs );
|
result = prime * result + Arrays.hashCode(_upxs);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals( Object obj )
|
public boolean equals(Object obj) {
|
||||||
{
|
if (this == obj)
|
||||||
if ( this == obj )
|
|
||||||
return true;
|
return true;
|
||||||
if ( obj == null )
|
if (obj == null)
|
||||||
return false;
|
return false;
|
||||||
if ( getClass() != obj.getClass() )
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
StyleDescription other = (StyleDescription) obj;
|
StyleDescription other = (StyleDescription) obj;
|
||||||
if ( _name == null )
|
if (_name == null) {
|
||||||
{
|
if (other._name != null)
|
||||||
if ( other._name != null )
|
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if (!_name.equals(other._name))
|
||||||
else if ( !_name.equals( other._name ) )
|
|
||||||
return false;
|
return false;
|
||||||
if ( _stdfBase == null )
|
if (_stdfBase == null) {
|
||||||
{
|
if (other._stdfBase != null)
|
||||||
if ( other._stdfBase != null )
|
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if (!_stdfBase.equals(other._stdfBase))
|
||||||
else if ( !_stdfBase.equals( other._stdfBase ) )
|
|
||||||
return false;
|
return false;
|
||||||
if ( !Arrays.equals( _upxs, other._upxs ) )
|
if (!Arrays.equals(_upxs, other._upxs))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString() {
|
||||||
{
|
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
result.append( "[STD]: '" );
|
result.append("[STD]: '");
|
||||||
result.append( _name );
|
result.append(_name);
|
||||||
result.append( "'" );
|
result.append("'");
|
||||||
result.append( ( "\nStdfBase:\t" + _stdfBase ).replaceAll( "\n",
|
result.append(("\nStdfBase:\t" + _stdfBase).replaceAll("\n",
|
||||||
"\n " ) );
|
"\n "));
|
||||||
result.append( ( "\nStdfPost2000:\t" + _stdfPost2000 ).replaceAll(
|
result.append(("\nStdfPost2000:\t" + _stdfPost2000).replaceAll(
|
||||||
"\n", "\n " ) );
|
"\n", "\n "));
|
||||||
for ( UPX upx : _upxs )
|
for (UPX upx : _upxs) {
|
||||||
{
|
result.append(("\nUPX:\t" + upx).replaceAll("\n", "\n "));
|
||||||
result.append( ( "\nUPX:\t" + upx ).replaceAll( "\n", "\n " ) );
|
|
||||||
}
|
}
|
||||||
return result.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
|
@ -39,9 +39,9 @@ import org.apache.poi.util.LittleEndian;
|
|||||||
* @author Ryan Ackley
|
* @author Ryan Ackley
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public final class StyleSheet implements HDFType {
|
public final class StyleSheet {
|
||||||
|
|
||||||
public static final int NIL_STYLE = 4095;
|
public static final int NIL_STYLE = 4095;
|
||||||
// private static final int PAP_TYPE = 1;
|
// private static final int PAP_TYPE = 1;
|
||||||
// private static final int CHP_TYPE = 2;
|
// private static final int CHP_TYPE = 2;
|
||||||
// private static final int SEP_TYPE = 4;
|
// private static final int SEP_TYPE = 4;
|
||||||
@ -52,8 +52,8 @@ public final class StyleSheet implements HDFType {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
private final static CharacterProperties NIL_CHP = new CharacterProperties();
|
private final static CharacterProperties NIL_CHP = new CharacterProperties();
|
||||||
|
|
||||||
private final static byte[] NIL_CHPX = new byte[] {};
|
private final static byte[] NIL_CHPX = new byte[]{};
|
||||||
private final static byte[] NIL_PAPX = new byte[] {0, 0};
|
private final static byte[] NIL_PAPX = new byte[]{0, 0};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Size of the STSHI structure
|
* Size of the STSHI structure
|
||||||
@ -65,19 +65,18 @@ public final class StyleSheet implements HDFType {
|
|||||||
*/
|
*/
|
||||||
private Stshif _stshif;
|
private Stshif _stshif;
|
||||||
|
|
||||||
StyleDescription[] _styleDescriptions;
|
StyleDescription[] _styleDescriptions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* StyleSheet constructor. Loads a document's stylesheet information,
|
* StyleSheet constructor. Loads a document's stylesheet information,
|
||||||
*
|
*
|
||||||
* @param tableStream A byte array containing a document's raw stylesheet
|
* @param tableStream A byte array containing a document's raw stylesheet
|
||||||
* info. Found by using FileInformationBlock.getFcStshf() and
|
* info. Found by using FileInformationBlock.getFcStshf() and
|
||||||
* FileInformationBLock.getLcbStshf()
|
* FileInformationBLock.getLcbStshf()
|
||||||
*/
|
*/
|
||||||
public StyleSheet(byte[] tableStream, int offset)
|
public StyleSheet(byte[] tableStream, int offset) {
|
||||||
{
|
|
||||||
int startOffset = offset;
|
int startOffset = offset;
|
||||||
_cbStshi = LittleEndian.getShort( tableStream, offset );
|
_cbStshi = LittleEndian.getShort(tableStream, offset);
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -88,46 +87,41 @@ public final class StyleSheet implements HDFType {
|
|||||||
* be empty, i.e. cbSTD==0.
|
* be empty, i.e. cbSTD==0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
_stshif = new Stshif( tableStream, offset );
|
_stshif = new Stshif(tableStream, offset);
|
||||||
offset += Stshif.getSize();
|
offset += Stshif.getSize();
|
||||||
|
|
||||||
// shall we discard cbLSD and mpstilsd?
|
// shall we discard cbLSD and mpstilsd?
|
||||||
|
|
||||||
offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi;
|
offset = startOffset + LittleEndian.SHORT_SIZE + _cbStshi;
|
||||||
_styleDescriptions = new StyleDescription[_stshif.getCstd()];
|
_styleDescriptions = new StyleDescription[_stshif.getCstd()];
|
||||||
for(int x = 0; x < _stshif.getCstd(); x++)
|
for (int x = 0; x < _stshif.getCstd(); x++) {
|
||||||
{
|
int stdSize = LittleEndian.getShort(tableStream, offset);
|
||||||
int stdSize = LittleEndian.getShort(tableStream, offset);
|
//get past the size
|
||||||
//get past the size
|
offset += 2;
|
||||||
offset += 2;
|
if (stdSize > 0) {
|
||||||
if(stdSize > 0)
|
//byte[] std = new byte[stdSize];
|
||||||
{
|
|
||||||
//byte[] std = new byte[stdSize];
|
|
||||||
|
|
||||||
StyleDescription aStyle = new StyleDescription(tableStream,
|
StyleDescription aStyle = new StyleDescription(tableStream,
|
||||||
_stshif.getCbSTDBaseInFile(), offset, true);
|
_stshif.getCbSTDBaseInFile(), offset, true);
|
||||||
|
|
||||||
_styleDescriptions[x] = aStyle;
|
_styleDescriptions[x] = aStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += stdSize;
|
offset += stdSize;
|
||||||
|
|
||||||
}
|
}
|
||||||
for(int x = 0; x < _styleDescriptions.length; x++)
|
for (int x = 0; x < _styleDescriptions.length; x++) {
|
||||||
{
|
if (_styleDescriptions[x] != null) {
|
||||||
if(_styleDescriptions[x] != null)
|
createPap(x);
|
||||||
{
|
createChp(x);
|
||||||
createPap(x);
|
}
|
||||||
createChp(x);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void writeTo(OutputStream out)
|
public void writeTo(OutputStream out)
|
||||||
throws IOException
|
throws IOException {
|
||||||
{
|
|
||||||
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we don't support 2003 Word extensions in STSHI (but may be we should
|
* we don't support 2003 Word extensions in STSHI (but may be we should
|
||||||
@ -136,270 +130,239 @@ public final class StyleSheet implements HDFType {
|
|||||||
*/
|
*/
|
||||||
this._cbStshi = 18;
|
this._cbStshi = 18;
|
||||||
|
|
||||||
// add two bytes so we can prepend the stylesheet w/ its size
|
// add two bytes so we can prepend the stylesheet w/ its size
|
||||||
byte[] buf = new byte[_cbStshi + 2];
|
byte[] buf = new byte[_cbStshi + 2];
|
||||||
|
|
||||||
LittleEndian.putUShort(buf, offset, (short)_cbStshi);
|
LittleEndian.putUShort(buf, offset, (short) _cbStshi);
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
|
||||||
_stshif.setCstd( _styleDescriptions.length );
|
_stshif.setCstd(_styleDescriptions.length);
|
||||||
_stshif.serialize( buf, offset );
|
_stshif.serialize(buf, offset);
|
||||||
// offset += Stshif.getSize();
|
// offset += Stshif.getSize();
|
||||||
|
|
||||||
out.write(buf);
|
out.write(buf);
|
||||||
|
|
||||||
byte[] sizeHolder = new byte[2];
|
byte[] sizeHolder = new byte[2];
|
||||||
for (int x = 0; x < _styleDescriptions.length; x++)
|
for (int x = 0; x < _styleDescriptions.length; x++) {
|
||||||
{
|
if (_styleDescriptions[x] != null) {
|
||||||
if(_styleDescriptions[x] != null)
|
byte[] std = _styleDescriptions[x].toByteArray();
|
||||||
{
|
|
||||||
byte[] std = _styleDescriptions[x].toByteArray();
|
|
||||||
|
|
||||||
// adjust the size so it is always on a word boundary
|
// adjust the size so it is always on a word boundary
|
||||||
LittleEndian.putShort(sizeHolder, 0, (short)((std.length) + (std.length % 2)));
|
LittleEndian.putShort(sizeHolder, 0, (short) ((std.length) + (std.length % 2)));
|
||||||
out.write(sizeHolder);
|
out.write(sizeHolder);
|
||||||
out.write(std);
|
out.write(std);
|
||||||
|
|
||||||
// Must always start on a word boundary.
|
// Must always start on a word boundary.
|
||||||
if (std.length % 2 == 1)
|
if (std.length % 2 == 1) {
|
||||||
{
|
out.write('\0');
|
||||||
out.write('\0');
|
}
|
||||||
}
|
} else {
|
||||||
}
|
sizeHolder[0] = 0;
|
||||||
else
|
sizeHolder[1] = 0;
|
||||||
{
|
out.write(sizeHolder);
|
||||||
sizeHolder[0] = 0;
|
}
|
||||||
sizeHolder[1] = 0;
|
}
|
||||||
out.write(sizeHolder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o)
|
|
||||||
{
|
|
||||||
if (!(o instanceof StyleSheet)) return false;
|
|
||||||
StyleSheet ss = (StyleSheet)o;
|
|
||||||
|
|
||||||
if (!ss._stshif.equals( this._stshif )
|
|
||||||
|| ss._cbStshi != this._cbStshi
|
|
||||||
|| ss._styleDescriptions.length != this._styleDescriptions.length
|
|
||||||
) return false;
|
|
||||||
|
|
||||||
for (int i=0; i<_styleDescriptions.length; i++) {
|
|
||||||
StyleDescription tsd = this._styleDescriptions[i];
|
|
||||||
StyleDescription osd = ss._styleDescriptions[i];
|
|
||||||
if (tsd == null && osd == null) continue;
|
|
||||||
if (tsd == null || osd == null || !osd.equals(tsd)) return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
@Override
|
||||||
}
|
public boolean equals(Object o) {
|
||||||
|
if (!(o instanceof StyleSheet)) return false;
|
||||||
|
StyleSheet ss = (StyleSheet) o;
|
||||||
|
|
||||||
@Override
|
if (!ss._stshif.equals(this._stshif)
|
||||||
public int hashCode() {
|
|| ss._cbStshi != this._cbStshi
|
||||||
assert false : "hashCode not designed";
|
|| ss._styleDescriptions.length != this._styleDescriptions.length
|
||||||
return 42; // any arbitrary constant will do
|
) return false;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
for (int i = 0; i < _styleDescriptions.length; i++) {
|
||||||
* Creates a PartagraphProperties object from a papx stored in the
|
StyleDescription tsd = this._styleDescriptions[i];
|
||||||
* StyleDescription at the index istd in the StyleDescription array. The PAP
|
StyleDescription osd = ss._styleDescriptions[i];
|
||||||
* is placed in the StyleDescription at istd after its been created. Not
|
if (tsd == null && osd == null) continue;
|
||||||
* every StyleDescription will contain a papx. In these cases this function
|
if (tsd == null || osd == null || !osd.equals(tsd)) return false;
|
||||||
* does nothing
|
}
|
||||||
*
|
|
||||||
* @param istd The index of the StyleDescription to create the
|
|
||||||
* ParagraphProperties from (and also place the finished PAP in)
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
private void createPap(int istd)
|
|
||||||
{
|
|
||||||
StyleDescription sd = _styleDescriptions[istd];
|
|
||||||
ParagraphProperties pap = sd.getPAP();
|
|
||||||
byte[] papx = sd.getPAPX();
|
|
||||||
int baseIndex = sd.getBaseStyle();
|
|
||||||
if(pap == null && papx != null)
|
|
||||||
{
|
|
||||||
ParagraphProperties parentPAP = new ParagraphProperties();
|
|
||||||
if(baseIndex != NIL_STYLE)
|
|
||||||
{
|
|
||||||
|
|
||||||
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
return true;
|
||||||
if(parentPAP == null) {
|
}
|
||||||
if(baseIndex == istd) {
|
|
||||||
// Oh dear, style claims that it is its own parent
|
|
||||||
throw new IllegalStateException("Pap style " + istd + " claimed to have itself as its parent, which isn't allowed");
|
|
||||||
}
|
|
||||||
// Create the parent style
|
|
||||||
createPap(baseIndex);
|
|
||||||
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
assert false : "hashCode not designed";
|
||||||
|
return 42; // any arbitrary constant will do
|
||||||
|
}
|
||||||
|
|
||||||
if (parentPAP == null) {
|
/**
|
||||||
parentPAP = new ParagraphProperties();
|
* Creates a PartagraphProperties object from a papx stored in the
|
||||||
}
|
* StyleDescription at the index istd in the StyleDescription array. The PAP
|
||||||
|
* is placed in the StyleDescription at istd after its been created. Not
|
||||||
|
* every StyleDescription will contain a papx. In these cases this function
|
||||||
|
* does nothing
|
||||||
|
*
|
||||||
|
* @param istd The index of the StyleDescription to create the
|
||||||
|
* ParagraphProperties from (and also place the finished PAP in)
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
private void createPap(int istd) {
|
||||||
|
StyleDescription sd = _styleDescriptions[istd];
|
||||||
|
ParagraphProperties pap = sd.getPAP();
|
||||||
|
byte[] papx = sd.getPAPX();
|
||||||
|
int baseIndex = sd.getBaseStyle();
|
||||||
|
if (pap == null && papx != null) {
|
||||||
|
ParagraphProperties parentPAP = new ParagraphProperties();
|
||||||
|
if (baseIndex != NIL_STYLE) {
|
||||||
|
|
||||||
pap = ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2);
|
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
||||||
sd.setPAP(pap);
|
if (parentPAP == null) {
|
||||||
}
|
if (baseIndex == istd) {
|
||||||
}
|
// Oh dear, style claims that it is its own parent
|
||||||
/**
|
throw new IllegalStateException("Pap style " + istd + " claimed to have itself as its parent, which isn't allowed");
|
||||||
* Creates a CharacterProperties object from a chpx stored in the
|
}
|
||||||
* StyleDescription at the index istd in the StyleDescription array. The
|
// Create the parent style
|
||||||
* CharacterProperties object is placed in the StyleDescription at istd after
|
createPap(baseIndex);
|
||||||
* its been created. Not every StyleDescription will contain a chpx. In these
|
parentPAP = _styleDescriptions[baseIndex].getPAP();
|
||||||
* cases this function does nothing.
|
}
|
||||||
*
|
|
||||||
* @param istd The index of the StyleDescription to create the
|
|
||||||
* CharacterProperties object from.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
private void createChp(int istd)
|
|
||||||
{
|
|
||||||
StyleDescription sd = _styleDescriptions[istd];
|
|
||||||
CharacterProperties chp = sd.getCHP();
|
|
||||||
byte[] chpx = sd.getCHPX();
|
|
||||||
int baseIndex = sd.getBaseStyle();
|
|
||||||
|
|
||||||
if(baseIndex == istd) {
|
}
|
||||||
// Oh dear, this isn't allowed...
|
|
||||||
// The word file seems to be corrupted
|
|
||||||
// Switch to using the nil style so that
|
|
||||||
// there's a chance we can read it
|
|
||||||
baseIndex = NIL_STYLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build and decompress the Chp if required
|
if (parentPAP == null) {
|
||||||
if(chp == null && chpx != null)
|
parentPAP = new ParagraphProperties();
|
||||||
{
|
}
|
||||||
CharacterProperties parentCHP = new CharacterProperties();
|
|
||||||
if(baseIndex != NIL_STYLE)
|
|
||||||
{
|
|
||||||
parentCHP = _styleDescriptions[baseIndex].getCHP();
|
|
||||||
if(parentCHP == null)
|
|
||||||
{
|
|
||||||
createChp(baseIndex);
|
|
||||||
parentCHP = _styleDescriptions[baseIndex].getCHP();
|
|
||||||
}
|
|
||||||
if(parentCHP == null) {
|
|
||||||
parentCHP = new CharacterProperties();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chp = CharacterSprmUncompressor.uncompressCHP(parentCHP, chpx, 0);
|
pap = ParagraphSprmUncompressor.uncompressPAP(parentPAP, papx, 2);
|
||||||
sd.setCHP(chp);
|
sd.setPAP(pap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of styles in the style sheet.
|
* Creates a CharacterProperties object from a chpx stored in the
|
||||||
* @return The number of styles in the style sheet.
|
* StyleDescription at the index istd in the StyleDescription array. The
|
||||||
*/
|
* CharacterProperties object is placed in the StyleDescription at istd after
|
||||||
public int numStyles() {
|
* its been created. Not every StyleDescription will contain a chpx. In these
|
||||||
return _styleDescriptions.length;
|
* cases this function does nothing.
|
||||||
}
|
*
|
||||||
|
* @param istd The index of the StyleDescription to create the
|
||||||
|
* CharacterProperties object from.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
private void createChp(int istd) {
|
||||||
|
StyleDescription sd = _styleDescriptions[istd];
|
||||||
|
CharacterProperties chp = sd.getCHP();
|
||||||
|
byte[] chpx = sd.getCHPX();
|
||||||
|
int baseIndex = sd.getBaseStyle();
|
||||||
|
|
||||||
|
if (baseIndex == istd) {
|
||||||
|
// Oh dear, this isn't allowed...
|
||||||
|
// The word file seems to be corrupted
|
||||||
|
// Switch to using the nil style so that
|
||||||
|
// there's a chance we can read it
|
||||||
|
baseIndex = NIL_STYLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build and decompress the Chp if required
|
||||||
|
if (chp == null && chpx != null) {
|
||||||
|
CharacterProperties parentCHP = new CharacterProperties();
|
||||||
|
if (baseIndex != NIL_STYLE) {
|
||||||
|
parentCHP = _styleDescriptions[baseIndex].getCHP();
|
||||||
|
if (parentCHP == null) {
|
||||||
|
createChp(baseIndex);
|
||||||
|
parentCHP = _styleDescriptions[baseIndex].getCHP();
|
||||||
|
}
|
||||||
|
if (parentCHP == null) {
|
||||||
|
parentCHP = new CharacterProperties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chp = CharacterSprmUncompressor.uncompressCHP(parentCHP, chpx, 0);
|
||||||
|
sd.setCHP(chp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of styles in the style sheet.
|
||||||
|
*
|
||||||
|
* @return The number of styles in the style sheet.
|
||||||
|
*/
|
||||||
|
public int numStyles() {
|
||||||
|
return _styleDescriptions.length;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the StyleDescription at index x.
|
* Gets the StyleDescription at index x.
|
||||||
*
|
*
|
||||||
* @param styleIndex
|
* @param styleIndex the index of the desired StyleDescription.
|
||||||
* the index of the desired StyleDescription.
|
|
||||||
*/
|
*/
|
||||||
public StyleDescription getStyleDescription( int styleIndex )
|
public StyleDescription getStyleDescription(int styleIndex) {
|
||||||
{
|
|
||||||
return _styleDescriptions[styleIndex];
|
return _styleDescriptions[styleIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public CharacterProperties getCharacterStyle( int styleIndex )
|
public CharacterProperties getCharacterStyle(int styleIndex) {
|
||||||
{
|
if (styleIndex == NIL_STYLE) {
|
||||||
if ( styleIndex == NIL_STYLE )
|
|
||||||
{
|
|
||||||
return NIL_CHP;
|
return NIL_CHP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( styleIndex >= _styleDescriptions.length )
|
if (styleIndex >= _styleDescriptions.length) {
|
||||||
{
|
|
||||||
return NIL_CHP;
|
return NIL_CHP;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ( _styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex]
|
return (_styleDescriptions[styleIndex] != null ? _styleDescriptions[styleIndex]
|
||||||
.getCHP() : NIL_CHP );
|
.getCHP() : NIL_CHP);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public ParagraphProperties getParagraphStyle( int styleIndex )
|
public ParagraphProperties getParagraphStyle(int styleIndex) {
|
||||||
{
|
if (styleIndex == NIL_STYLE) {
|
||||||
if ( styleIndex == NIL_STYLE )
|
|
||||||
{
|
|
||||||
return NIL_PAP;
|
return NIL_PAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( styleIndex >= _styleDescriptions.length )
|
if (styleIndex >= _styleDescriptions.length) {
|
||||||
{
|
|
||||||
return NIL_PAP;
|
return NIL_PAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex] == null )
|
if (_styleDescriptions[styleIndex] == null) {
|
||||||
{
|
|
||||||
return NIL_PAP;
|
return NIL_PAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex].getPAP() == null )
|
if (_styleDescriptions[styleIndex].getPAP() == null) {
|
||||||
{
|
|
||||||
return NIL_PAP;
|
return NIL_PAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _styleDescriptions[styleIndex].getPAP();
|
return _styleDescriptions[styleIndex].getPAP();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getCHPX( int styleIndex )
|
public byte[] getCHPX(int styleIndex) {
|
||||||
{
|
if (styleIndex == NIL_STYLE) {
|
||||||
if ( styleIndex == NIL_STYLE )
|
|
||||||
{
|
|
||||||
return NIL_CHPX;
|
return NIL_CHPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( styleIndex >= _styleDescriptions.length )
|
if (styleIndex >= _styleDescriptions.length) {
|
||||||
{
|
|
||||||
return NIL_CHPX;
|
return NIL_CHPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex] == null )
|
if (_styleDescriptions[styleIndex] == null) {
|
||||||
{
|
|
||||||
return NIL_CHPX;
|
return NIL_CHPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex].getCHPX() == null )
|
if (_styleDescriptions[styleIndex].getCHPX() == null) {
|
||||||
{
|
|
||||||
return NIL_CHPX;
|
return NIL_CHPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _styleDescriptions[styleIndex].getCHPX();
|
return _styleDescriptions[styleIndex].getCHPX();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getPAPX( int styleIndex )
|
public byte[] getPAPX(int styleIndex) {
|
||||||
{
|
if (styleIndex == NIL_STYLE) {
|
||||||
if ( styleIndex == NIL_STYLE )
|
|
||||||
{
|
|
||||||
return NIL_PAPX;
|
return NIL_PAPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( styleIndex >= _styleDescriptions.length )
|
if (styleIndex >= _styleDescriptions.length) {
|
||||||
{
|
|
||||||
return NIL_PAPX;
|
return NIL_PAPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex] == null )
|
if (_styleDescriptions[styleIndex] == null) {
|
||||||
{
|
|
||||||
return NIL_PAPX;
|
return NIL_PAPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _styleDescriptions[styleIndex].getPAPX() == null )
|
if (_styleDescriptions[styleIndex].getPAPX() == null) {
|
||||||
{
|
|
||||||
return NIL_PAPX;
|
return NIL_PAPX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user