diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/LVLF.java b/src/scratchpad/src/org/apache/poi/hwpf/model/LVLF.java new file mode 100644 index 000000000..d06d58403 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/LVLF.java @@ -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; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java b/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java index 43593bef2..bae770dea 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java @@ -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 ) {