use LVLF to hold internal lists data

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1173731 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Sergey Vladimirov 2011-09-21 15:47:12 +00:00
parent b2213329e2
commit 9c86d1ae32
2 changed files with 152 additions and 87 deletions

View File

@ -0,0 +1,96 @@
/* ====================================================================
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 java.util.Arrays;
import org.apache.poi.hwpf.model.types.LVLFAbstractType;
import org.apache.poi.util.Internal;
/**
* The LVLF structure contains formatting properties for an individual level in
* a list
*
* @author Sergey Vladimirov; according to Microsoft Office Word 97-2007 Binary
* File Format Specification [*.doc] and [MS-DOC] - v20110608 Word
* (.doc) Binary File Format
*/
@Internal
class LVLF extends LVLFAbstractType
{
public LVLF()
{
}
public LVLF( byte[] std, int offset )
{
fillFields( std, offset );
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( getClass() != obj.getClass() )
return false;
LVLF other = (LVLF) obj;
if ( field_10_grfhic != other.field_10_grfhic )
return false;
if ( field_1_iStartAt != other.field_1_iStartAt )
return false;
if ( field_2_info2 != other.field_2_info2 )
return false;
if ( !Arrays.equals( field_3_rgbxchNums, other.field_3_rgbxchNums ) )
return false;
if ( field_4_ixchFollow != other.field_4_ixchFollow )
return false;
if ( field_5_dxaIndentSav != other.field_5_dxaIndentSav )
return false;
if ( field_6_unused2 != other.field_6_unused2 )
return false;
if ( field_7_cbGrpprlChpx != other.field_7_cbGrpprlChpx )
return false;
if ( field_8_cbGrpprlPapx != other.field_8_cbGrpprlPapx )
return false;
if ( field_9_ilvlRestartLim != other.field_9_ilvlRestartLim )
return false;
return true;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + field_10_grfhic;
result = prime * result + field_1_iStartAt;
result = prime * result + field_2_info2;
result = prime * result + Arrays.hashCode( field_3_rgbxchNums );
result = prime * result + field_4_ixchFollow;
result = prime * result + field_5_dxaIndentSav;
result = prime * result + field_6_unused2;
result = prime * result + field_7_cbGrpprlChpx;
result = prime * result + field_8_cbGrpprlPapx;
result = prime * result + field_9_ilvlRestartLim;
return result;
}
}

View File

@ -19,6 +19,8 @@ package org.apache.poi.hwpf.model;
import java.util.Arrays;
import org.apache.poi.hwpf.model.types.LVLFAbstractType;
import org.apache.poi.util.BitField;
import org.apache.poi.util.Internal;
import org.apache.poi.util.LittleEndian;
@ -29,26 +31,25 @@ import org.apache.poi.util.LittleEndian;
* See page 170 for details.
*/
@Internal
public final class ListLevel
public final class ListLevel
{
private static final int RGBXCH_NUMS_SIZE = 9;
private int _iStartAt;
private byte _nfc;
private byte _info;
/* */private static BitField _jc;
/* */private static BitField _fLegal;
/* */private static BitField _fNoRestart;
/* */private static BitField _fPrev;
/* */private static BitField _fPrevSpace;
/* */private static BitField _fWord6;
private byte[] _rgbxchNums;
private byte _ixchFollow;
private int _dxaSpace;
private int _dxaIndent;
private int _cbGrpprlChpx;
private int _cbGrpprlPapx;
private short _reserved;
// private int _iStartAt;
// private byte _nfc;
// private byte _info;
// /* */private static BitField _jc;
// /* */private static BitField _fLegal;
// /* */private static BitField _fNoRestart;
// /* */private static BitField _fPrev;
// /* */private static BitField _fPrevSpace;
// /* */private static BitField _fWord6;
// private byte[] _rgbxchNums;
// private byte _ixchFollow;
// private int _dxaSpace;
// private int _dxaIndent;
// private int _cbGrpprlChpx;
// private int _cbGrpprlPapx;
// private short _reserved;
private LVLF _lvlf;
private byte[] _grpprlPapx;
private byte[] _grpprlChpx;
private char[] _numberText = null;
@ -57,31 +58,16 @@ public final class ListLevel
{
int offset = originalOffset;
_iStartAt = LittleEndian.getInt( buf, offset );
offset += LittleEndian.INT_SIZE;
_nfc = buf[offset++];
_info = buf[offset++];
_lvlf = new LVLF(buf, offset);
offset += LVLF.getSize();
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
System.arraycopy( buf, offset, _rgbxchNums, 0, RGBXCH_NUMS_SIZE );
offset += RGBXCH_NUMS_SIZE;
_grpprlPapx = new byte[_lvlf.getCbGrpprlPapx()];
System.arraycopy( buf, offset, _grpprlPapx, 0, _lvlf.getCbGrpprlPapx() );
offset += _lvlf.getCbGrpprlPapx();
_ixchFollow = buf[offset++];
_dxaSpace = LittleEndian.getInt( buf, offset );
offset += LittleEndian.INT_SIZE;
_dxaIndent = LittleEndian.getInt( buf, offset );
offset += LittleEndian.INT_SIZE;
_cbGrpprlChpx = LittleEndian.getUnsignedByte( buf, offset++ );
_cbGrpprlPapx = LittleEndian.getUnsignedByte( buf, offset++ );
_reserved = LittleEndian.getShort( buf, offset );
offset += LittleEndian.SHORT_SIZE;
_grpprlPapx = new byte[_cbGrpprlPapx];
_grpprlChpx = new byte[_cbGrpprlChpx];
System.arraycopy( buf, offset, _grpprlPapx, 0, _cbGrpprlPapx );
offset += _cbGrpprlPapx;
System.arraycopy( buf, offset, _grpprlChpx, 0, _cbGrpprlChpx );
offset += _cbGrpprlChpx;
_grpprlChpx = new byte[_lvlf.getCbGrpprlChpx()];
System.arraycopy( buf, offset, _grpprlChpx, 0, _lvlf.getCbGrpprlChpx() );
offset += _lvlf.getCbGrpprlChpx();
int numberTextLength = LittleEndian.getShort( buf, offset );
/* sometimes numberTextLength<0 */
@ -101,15 +87,15 @@ public final class ListLevel
public ListLevel( int level, boolean numbered )
{
_iStartAt = 1;
_lvlf = new LVLF();
setStartAt( 1 );
_grpprlPapx = new byte[0];
_grpprlChpx = new byte[0];
_numberText = new char[0];
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
if ( numbered )
{
_rgbxchNums[0] = 1;
_lvlf.getRgbxchNums()[0] = 1;
_numberText = new char[] { (char) level, '.' };
}
else
@ -121,9 +107,10 @@ public final class ListLevel
public ListLevel( int startAt, int numberFormatCode, int alignment,
byte[] numberProperties, byte[] entryProperties, String numberText )
{
_iStartAt = startAt;
_nfc = (byte) numberFormatCode;
_jc.setValue( _info, alignment );
_lvlf = new LVLF();
setStartAt( startAt );
_lvlf.setNfc( (short) numberFormatCode );
_lvlf.setJc( (byte) alignment );
_grpprlChpx = numberProperties;
_grpprlPapx = entryProperties;
_numberText = numberText.toCharArray();
@ -135,16 +122,10 @@ public final class ListLevel
return false;
ListLevel lvl = (ListLevel) obj;
return _cbGrpprlChpx == lvl._cbGrpprlChpx
&& lvl._cbGrpprlPapx == _cbGrpprlPapx
&& lvl._dxaIndent == _dxaIndent && lvl._dxaSpace == _dxaSpace
return lvl._lvlf.equals( this._lvlf )
&& Arrays.equals( lvl._grpprlChpx, _grpprlChpx )
&& Arrays.equals( lvl._grpprlPapx, _grpprlPapx )
&& lvl._info == _info && lvl._iStartAt == _iStartAt
&& lvl._ixchFollow == _ixchFollow && lvl._nfc == _nfc
&& Arrays.equals( lvl._numberText, _numberText )
&& Arrays.equals( lvl._rgbxchNums, _rgbxchNums )
&& lvl._reserved == _reserved;
&& Arrays.equals( lvl._numberText, _numberText );
}
/**
@ -152,7 +133,7 @@ public final class ListLevel
*/
public int getAlignment()
{
return _jc.getValue( _info );
return _lvlf.getJc();
}
public byte[] getLevelProperties()
@ -165,7 +146,7 @@ public final class ListLevel
*/
public int getNumberFormat()
{
return _nfc;
return _lvlf.getNfc();
}
public String getNumberText()
@ -178,9 +159,8 @@ public final class ListLevel
public int getSizeInBytes()
{
int result = 6 // int byte byte
+ RGBXCH_NUMS_SIZE + 13 // byte int int byte byte short
+ _cbGrpprlChpx + _cbGrpprlPapx + 2; // numberText length
int result = LVLF.getSize() + _lvlf.getCbGrpprlChpx()
+ _lvlf.getCbGrpprlPapx() + 2; // numberText length
if ( _numberText != null )
{
result += _numberText.length * LittleEndian.SHORT_SIZE;
@ -190,7 +170,7 @@ public final class ListLevel
public int getStartAt()
{
return _iStartAt;
return _lvlf.getIStartAt();
}
/**
@ -198,12 +178,12 @@ public final class ListLevel
*/
public byte getTypeOfCharFollowingTheNumber()
{
return this._ixchFollow;
return _lvlf.getIxchFollow();
}
public void setAlignment( int alignment )
{
_jc.setValue( _info, alignment );
_lvlf.setJc( (byte) alignment );
}
public void setLevelProperties( byte[] grpprl )
@ -213,7 +193,7 @@ public final class ListLevel
public void setNumberFormat( int numberFormatCode )
{
_nfc = (byte) numberFormatCode;
_lvlf.setNfc( (short) numberFormatCode );
}
public void setNumberProperties( byte[] grpprl )
@ -224,39 +204,28 @@ public final class ListLevel
public void setStartAt( int startAt )
{
_iStartAt = startAt;
_lvlf.setIStartAt( startAt );
}
public void setTypeOfCharFollowingTheNumber( byte value )
{
this._ixchFollow = value;
_lvlf.setIxchFollow( value );
}
public byte[] toByteArray()
{
byte[] buf = new byte[getSizeInBytes()];
int offset = 0;
LittleEndian.putInt( buf, offset, _iStartAt );
offset += LittleEndian.INT_SIZE;
buf[offset++] = _nfc;
buf[offset++] = _info;
System.arraycopy( _rgbxchNums, 0, buf, offset, RGBXCH_NUMS_SIZE );
offset += RGBXCH_NUMS_SIZE;
buf[offset++] = _ixchFollow;
LittleEndian.putInt( buf, offset, _dxaSpace );
offset += LittleEndian.INT_SIZE;
LittleEndian.putInt( buf, offset, _dxaIndent );
offset += LittleEndian.INT_SIZE;
buf[offset++] = (byte) _cbGrpprlChpx;
buf[offset++] = (byte) _cbGrpprlPapx;
LittleEndian.putShort( buf, offset, _reserved );
offset += LittleEndian.SHORT_SIZE;
_lvlf.setCbGrpprlChpx( (short) _grpprlChpx.length );
_lvlf.setCbGrpprlPapx( (short) _grpprlPapx.length );
_lvlf.serialize( buf, offset );
offset += LVLF.getSize();
System.arraycopy( _grpprlPapx, 0, buf, offset, _cbGrpprlPapx );
offset += _cbGrpprlPapx;
System.arraycopy( _grpprlChpx, 0, buf, offset, _cbGrpprlChpx );
offset += _cbGrpprlChpx;
System.arraycopy( _grpprlPapx, 0, buf, offset, _grpprlPapx.length );
offset += _grpprlPapx.length;
System.arraycopy( _grpprlChpx, 0, buf, offset, _grpprlChpx.length );
offset += _grpprlChpx.length;
if ( _numberText == null )
{