mirror of https://github.com/apache/poi.git
format and sort members
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1147378 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
73cf1f85f1
commit
efe6694350
|
@ -23,247 +23,255 @@ import org.apache.poi.util.BitField;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* "List LeVeL (on File) (LVLF)"
|
||||||
|
*
|
||||||
|
* See page 170 for details.
|
||||||
*/
|
*/
|
||||||
public final class ListLevel
|
public final class ListLevel
|
||||||
{
|
{
|
||||||
private static final int RGBXCH_NUMS_SIZE = 9;
|
private static final int RGBXCH_NUMS_SIZE = 9;
|
||||||
|
|
||||||
private int _iStartAt;
|
private int _iStartAt;
|
||||||
private byte _nfc;
|
private byte _nfc;
|
||||||
private byte _info;
|
private byte _info;
|
||||||
private static BitField _jc;
|
/* */private static BitField _jc;
|
||||||
private static BitField _fLegal;
|
/* */private static BitField _fLegal;
|
||||||
private static BitField _fNoRestart;
|
/* */private static BitField _fNoRestart;
|
||||||
private static BitField _fPrev;
|
/* */private static BitField _fPrev;
|
||||||
private static BitField _fPrevSpace;
|
/* */private static BitField _fPrevSpace;
|
||||||
private static BitField _fWord6;
|
/* */private static BitField _fWord6;
|
||||||
private byte[] _rgbxchNums;
|
private byte[] _rgbxchNums;
|
||||||
private byte _ixchFollow;
|
private byte _ixchFollow;
|
||||||
private int _dxaSpace;
|
private int _dxaSpace;
|
||||||
private int _dxaIndent;
|
private int _dxaIndent;
|
||||||
private int _cbGrpprlChpx;
|
private int _cbGrpprlChpx;
|
||||||
private int _cbGrpprlPapx;
|
private int _cbGrpprlPapx;
|
||||||
private short _reserved;
|
private short _reserved;
|
||||||
private byte[] _grpprlPapx;
|
private byte[] _grpprlPapx;
|
||||||
private byte[] _grpprlChpx;
|
private byte[] _grpprlChpx;
|
||||||
private char[] _numberText=null;
|
private char[] _numberText = null;
|
||||||
|
|
||||||
public ListLevel(int startAt, int numberFormatCode, int alignment,
|
public ListLevel( final byte[] buf, final int originalOffset )
|
||||||
byte[] numberProperties, byte[] entryProperties,
|
|
||||||
String numberText)
|
|
||||||
{
|
|
||||||
_iStartAt = startAt;
|
|
||||||
_nfc = (byte)numberFormatCode;
|
|
||||||
_jc.setValue(_info, alignment);
|
|
||||||
_grpprlChpx = numberProperties;
|
|
||||||
_grpprlPapx = entryProperties;
|
|
||||||
_numberText = numberText.toCharArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListLevel(int level, boolean numbered)
|
|
||||||
{
|
|
||||||
_iStartAt = 1;
|
|
||||||
_grpprlPapx = new byte[0];
|
|
||||||
_grpprlChpx = new byte[0];
|
|
||||||
_numberText = new char[0];
|
|
||||||
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
|
|
||||||
|
|
||||||
if (numbered)
|
|
||||||
{
|
{
|
||||||
_rgbxchNums[0] = 1;
|
int offset = originalOffset;
|
||||||
_numberText = new char[]{(char)level, '.'};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_numberText = new char[]{'\u2022'};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListLevel(byte[] buf, int offset)
|
_iStartAt = LittleEndian.getInt( buf, offset );
|
||||||
{
|
offset += LittleEndian.INT_SIZE;
|
||||||
_iStartAt = LittleEndian.getInt(buf, offset);
|
_nfc = buf[offset++];
|
||||||
offset += LittleEndian.INT_SIZE;
|
_info = buf[offset++];
|
||||||
_nfc = buf[offset++];
|
|
||||||
_info = buf[offset++];
|
|
||||||
|
|
||||||
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
|
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
|
||||||
System.arraycopy(buf, offset, _rgbxchNums, 0, RGBXCH_NUMS_SIZE);
|
System.arraycopy( buf, offset, _rgbxchNums, 0, RGBXCH_NUMS_SIZE );
|
||||||
offset += RGBXCH_NUMS_SIZE;
|
offset += RGBXCH_NUMS_SIZE;
|
||||||
|
|
||||||
_ixchFollow = buf[offset++];
|
_ixchFollow = buf[offset++];
|
||||||
_dxaSpace = LittleEndian.getInt(buf, offset);
|
_dxaSpace = LittleEndian.getInt( buf, offset );
|
||||||
offset += LittleEndian.INT_SIZE;
|
offset += LittleEndian.INT_SIZE;
|
||||||
_dxaIndent = LittleEndian.getInt(buf, offset);
|
_dxaIndent = LittleEndian.getInt( buf, offset );
|
||||||
offset += LittleEndian.INT_SIZE;
|
offset += LittleEndian.INT_SIZE;
|
||||||
_cbGrpprlChpx = LittleEndian.getUnsignedByte(buf, offset++);
|
_cbGrpprlChpx = LittleEndian.getUnsignedByte( buf, offset++ );
|
||||||
_cbGrpprlPapx = LittleEndian.getUnsignedByte(buf, offset++);
|
_cbGrpprlPapx = LittleEndian.getUnsignedByte( buf, offset++ );
|
||||||
_reserved = LittleEndian.getShort(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;
|
|
||||||
|
|
||||||
int numberTextLength = LittleEndian.getShort(buf, offset);
|
|
||||||
/* sometimes numberTextLength<0 */
|
|
||||||
/* by derjohng */
|
|
||||||
if (numberTextLength>0)
|
|
||||||
{
|
|
||||||
_numberText = new char[numberTextLength];
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
for (int x = 0; x < numberTextLength; x++)
|
|
||||||
|
_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;
|
||||||
|
|
||||||
|
int numberTextLength = LittleEndian.getShort( buf, offset );
|
||||||
|
/* sometimes numberTextLength<0 */
|
||||||
|
/* by derjohng */
|
||||||
|
if ( numberTextLength > 0 )
|
||||||
{
|
{
|
||||||
_numberText[x] = (char)LittleEndian.getShort(buf, offset);
|
_numberText = new char[numberTextLength];
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
for ( int x = 0; x < numberTextLength; x++ )
|
||||||
|
{
|
||||||
|
_numberText[x] = (char) LittleEndian.getShort( buf, offset );
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListLevel( int level, boolean numbered )
|
||||||
|
{
|
||||||
|
_iStartAt = 1;
|
||||||
|
_grpprlPapx = new byte[0];
|
||||||
|
_grpprlChpx = new byte[0];
|
||||||
|
_numberText = new char[0];
|
||||||
|
_rgbxchNums = new byte[RGBXCH_NUMS_SIZE];
|
||||||
|
|
||||||
|
if ( numbered )
|
||||||
|
{
|
||||||
|
_rgbxchNums[0] = 1;
|
||||||
|
_numberText = new char[] { (char) level, '.' };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_numberText = new char[] { '\u2022' };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public ListLevel( int startAt, int numberFormatCode, int alignment,
|
||||||
|
byte[] numberProperties, byte[] entryProperties, String numberText )
|
||||||
public int getStartAt()
|
|
||||||
{
|
|
||||||
return _iStartAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNumberFormat()
|
|
||||||
{
|
|
||||||
return _nfc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getAlignment()
|
|
||||||
{
|
|
||||||
return _jc.getValue(_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNumberText()
|
|
||||||
{
|
|
||||||
if (_numberText != null)
|
|
||||||
return new String(_numberText);
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* "The type of character following the number text for the paragraph: 0 == tab, 1 == space, 2 == nothing."
|
|
||||||
*/
|
|
||||||
public byte getTypeOfCharFollowingTheNumber()
|
|
||||||
{
|
|
||||||
return this._ixchFollow;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStartAt(int startAt)
|
|
||||||
{
|
|
||||||
_iStartAt = startAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumberFormat(int numberFormatCode)
|
|
||||||
{
|
|
||||||
_nfc = (byte)numberFormatCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAlignment(int alignment)
|
|
||||||
{
|
|
||||||
_jc.setValue(_info, alignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTypeOfCharFollowingTheNumber( byte value )
|
|
||||||
{
|
|
||||||
this._ixchFollow = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumberProperties(byte[] grpprl)
|
|
||||||
{
|
|
||||||
_grpprlChpx = grpprl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLevelProperties(byte[] grpprl)
|
|
||||||
{
|
|
||||||
_grpprlPapx = grpprl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] getLevelProperties()
|
|
||||||
{
|
|
||||||
return _grpprlPapx;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean equals(Object obj)
|
|
||||||
{
|
|
||||||
if (obj == null)
|
|
||||||
{
|
{
|
||||||
return false;
|
_iStartAt = startAt;
|
||||||
|
_nfc = (byte) numberFormatCode;
|
||||||
|
_jc.setValue( _info, alignment );
|
||||||
|
_grpprlChpx = numberProperties;
|
||||||
|
_grpprlPapx = entryProperties;
|
||||||
|
_numberText = numberText.toCharArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
ListLevel lvl = (ListLevel)obj;
|
public boolean equals( Object obj )
|
||||||
return _cbGrpprlChpx == lvl._cbGrpprlChpx && lvl._cbGrpprlPapx == _cbGrpprlPapx &&
|
{
|
||||||
lvl._dxaIndent == _dxaIndent && lvl._dxaSpace == _dxaSpace &&
|
if ( obj == null )
|
||||||
Arrays.equals(lvl._grpprlChpx, _grpprlChpx) &&
|
return false;
|
||||||
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;
|
|
||||||
|
|
||||||
|
ListLevel lvl = (ListLevel) obj;
|
||||||
|
return _cbGrpprlChpx == lvl._cbGrpprlChpx
|
||||||
|
&& lvl._cbGrpprlPapx == _cbGrpprlPapx
|
||||||
|
&& lvl._dxaIndent == _dxaIndent && lvl._dxaSpace == _dxaSpace
|
||||||
|
&& 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
/**
|
||||||
public byte[] toByteArray()
|
* "Alignment (left, right, or centered) of the paragraph number."
|
||||||
{
|
*/
|
||||||
byte[] buf = new byte[getSizeInBytes()];
|
public int getAlignment()
|
||||||
int offset = 0;
|
{
|
||||||
LittleEndian.putInt(buf, offset, _iStartAt);
|
return _jc.getValue( _info );
|
||||||
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;
|
public byte[] getLevelProperties()
|
||||||
buf[offset++] = (byte)_cbGrpprlPapx;
|
{
|
||||||
LittleEndian.putShort(buf, offset, _reserved);
|
return _grpprlPapx;
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
}
|
||||||
|
|
||||||
System.arraycopy(_grpprlPapx, 0, buf, offset, _cbGrpprlPapx);
|
/**
|
||||||
offset += _cbGrpprlPapx;
|
* "Number format code (see anld.nfc for a list of options)"
|
||||||
System.arraycopy(_grpprlChpx, 0, buf, offset, _cbGrpprlChpx);
|
*/
|
||||||
offset += _cbGrpprlChpx;
|
public int getNumberFormat()
|
||||||
|
{
|
||||||
|
return _nfc;
|
||||||
|
}
|
||||||
|
|
||||||
if (_numberText == null) {
|
public String getNumberText()
|
||||||
// TODO - write junit to test this flow
|
{
|
||||||
LittleEndian.putUShort(buf, offset, 0);
|
if ( _numberText == null )
|
||||||
} else {
|
return null;
|
||||||
LittleEndian.putUShort(buf, offset, _numberText.length);
|
|
||||||
offset += LittleEndian.SHORT_SIZE;
|
return new String( _numberText );
|
||||||
for (int x = 0; x < _numberText.length; x++)
|
}
|
||||||
{
|
|
||||||
LittleEndian.putUShort(buf, offset, _numberText[x]);
|
public int getSizeInBytes()
|
||||||
|
{
|
||||||
|
int result = 6 // int byte byte
|
||||||
|
+ RGBXCH_NUMS_SIZE + 13 // byte int int byte byte short
|
||||||
|
+ _cbGrpprlChpx + _cbGrpprlPapx + 2; // numberText length
|
||||||
|
if ( _numberText != null )
|
||||||
|
{
|
||||||
|
result += _numberText.length * LittleEndian.SHORT_SIZE;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStartAt()
|
||||||
|
{
|
||||||
|
return _iStartAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "The type of character following the number text for the paragraph: 0 == tab, 1 == space, 2 == nothing."
|
||||||
|
*/
|
||||||
|
public byte getTypeOfCharFollowingTheNumber()
|
||||||
|
{
|
||||||
|
return this._ixchFollow;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlignment( int alignment )
|
||||||
|
{
|
||||||
|
_jc.setValue( _info, alignment );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLevelProperties( byte[] grpprl )
|
||||||
|
{
|
||||||
|
_grpprlPapx = grpprl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumberFormat( int numberFormatCode )
|
||||||
|
{
|
||||||
|
_nfc = (byte) numberFormatCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumberProperties( byte[] grpprl )
|
||||||
|
{
|
||||||
|
_grpprlChpx = grpprl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartAt( int startAt )
|
||||||
|
{
|
||||||
|
_iStartAt = startAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTypeOfCharFollowingTheNumber( byte value )
|
||||||
|
{
|
||||||
|
this._ixchFollow = 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;
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
}
|
|
||||||
|
System.arraycopy( _grpprlPapx, 0, buf, offset, _cbGrpprlPapx );
|
||||||
|
offset += _cbGrpprlPapx;
|
||||||
|
System.arraycopy( _grpprlChpx, 0, buf, offset, _cbGrpprlChpx );
|
||||||
|
offset += _cbGrpprlChpx;
|
||||||
|
|
||||||
|
if ( _numberText == null )
|
||||||
|
{
|
||||||
|
// TODO - write junit to test this flow
|
||||||
|
LittleEndian.putUShort( buf, offset, 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LittleEndian.putUShort( buf, offset, _numberText.length );
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
for ( int x = 0; x < _numberText.length; x++ )
|
||||||
|
{
|
||||||
|
LittleEndian.putUShort( buf, offset, _numberText[x] );
|
||||||
|
offset += LittleEndian.SHORT_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
public int getSizeInBytes()
|
|
||||||
{
|
|
||||||
int result =
|
|
||||||
6 // int byte byte
|
|
||||||
+ RGBXCH_NUMS_SIZE
|
|
||||||
+ 13 // byte int int byte byte short
|
|
||||||
+ _cbGrpprlChpx
|
|
||||||
+ _cbGrpprlPapx
|
|
||||||
+ 2; // numberText length
|
|
||||||
if (_numberText != null) {
|
|
||||||
result += _numberText.length * LittleEndian.SHORT_SIZE;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue