mirror of https://github.com/apache/poi.git
refactor list format override structures (was marked with @Internal annotation)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1389038 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7e47c6ee35
commit
2d6abcad45
|
@ -20,6 +20,8 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
@ -27,10 +29,8 @@ import org.apache.poi.hwpf.HWPFDocument;
|
||||||
import org.apache.poi.hwpf.HWPFDocumentCore;
|
import org.apache.poi.hwpf.HWPFDocumentCore;
|
||||||
import org.apache.poi.hwpf.HWPFOldDocument;
|
import org.apache.poi.hwpf.HWPFOldDocument;
|
||||||
import org.apache.poi.hwpf.OldWordFileFormatException;
|
import org.apache.poi.hwpf.OldWordFileFormatException;
|
||||||
import org.apache.poi.hwpf.model.ListLevel;
|
|
||||||
import org.apache.poi.hwpf.model.ListTables;
|
|
||||||
import org.apache.poi.hwpf.usermodel.BorderCode;
|
import org.apache.poi.hwpf.usermodel.BorderCode;
|
||||||
import org.apache.poi.hwpf.usermodel.Paragraph;
|
import org.apache.poi.hwpf.usermodel.HWPFList;
|
||||||
import org.apache.poi.hwpf.usermodel.Table;
|
import org.apache.poi.hwpf.usermodel.Table;
|
||||||
import org.apache.poi.hwpf.usermodel.TableCell;
|
import org.apache.poi.hwpf.usermodel.TableCell;
|
||||||
import org.apache.poi.hwpf.usermodel.TableRow;
|
import org.apache.poi.hwpf.usermodel.TableRow;
|
||||||
|
@ -226,32 +226,39 @@ public class AbstractWordUtils
|
||||||
return stringBuilder.toString();
|
return stringBuilder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getBulletText( ListTables listTables,
|
public static class NumberingState {
|
||||||
Paragraph paragraph, int listId )
|
|
||||||
|
private final Map<String, Integer> levels = new HashMap<String, Integer>();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBulletText(NumberingState numberingState, HWPFList list, char level )
|
||||||
{
|
{
|
||||||
final ListLevel listLevel = listTables.getLevel( listId,
|
|
||||||
paragraph.getIlvl() );
|
|
||||||
|
|
||||||
if ( listLevel==null || listLevel.getNumberText() == null )
|
|
||||||
return EMPTY;
|
|
||||||
|
|
||||||
StringBuffer bulletBuffer = new StringBuffer();
|
StringBuffer bulletBuffer = new StringBuffer();
|
||||||
char[] xst = listLevel.getNumberText().toCharArray();
|
char[] xst = list.getNumberText( level ).toCharArray();
|
||||||
for ( char element : xst )
|
for ( char element : xst )
|
||||||
{
|
{
|
||||||
if ( element < 9 )
|
if ( element < 9 )
|
||||||
{
|
{
|
||||||
ListLevel numLevel = listTables.getLevel( listId, element );
|
final String key = list.getLsid() + "#" + ( (int) element );
|
||||||
|
int num;
|
||||||
int num = numLevel.getStartAt();
|
if ( numberingState.levels.containsKey( key ) )
|
||||||
bulletBuffer.append( NumberFormatter.getNumber( num,
|
|
||||||
listLevel.getNumberFormat() ) );
|
|
||||||
|
|
||||||
if ( numLevel == listLevel )
|
|
||||||
{
|
{
|
||||||
numLevel.setStartAt( numLevel.getStartAt() + 1 );
|
num = numberingState.levels.get( key ).intValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
num = list.getStartAt( level );
|
||||||
|
numberingState.levels.put( key, Integer.valueOf( num ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bulletBuffer.append( NumberFormatter.getNumber( num,
|
||||||
|
list.getNumberFormat( level ) ) );
|
||||||
|
|
||||||
|
if ( level == element )
|
||||||
|
{
|
||||||
|
numberingState.levels.put( key, Integer.valueOf( num + 1 ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -259,7 +266,7 @@ public class AbstractWordUtils
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
byte follow = listLevel.getTypeOfCharFollowingTheNumber();
|
byte follow = list.getTypeOfCharFollowingTheNumber(level);
|
||||||
switch ( follow )
|
switch ( follow )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -120,7 +120,9 @@ public final class FIBFieldHandler
|
||||||
public static final int ROUTESLIP = 70;
|
public static final int ROUTESLIP = 70;
|
||||||
public static final int STTBSAVEDBY = 71;
|
public static final int STTBSAVEDBY = 71;
|
||||||
public static final int STTBFNM = 72;
|
public static final int STTBFNM = 72;
|
||||||
public static final int PLCFLST = 73;
|
public static final int PLFLST = 73;
|
||||||
|
@Deprecated
|
||||||
|
public static final int PLCFLST = PLFLST;
|
||||||
public static final int PLFLFO = 74;
|
public static final int PLFLFO = 74;
|
||||||
public static final int PLCFTXBXBKD = 75;//validated
|
public static final int PLCFTXBXBKD = 75;//validated
|
||||||
public static final int PLCFTXBXHDRBKD = 76;
|
public static final int PLCFTXBXHDRBKD = 76;
|
||||||
|
|
|
@ -229,7 +229,7 @@ public final class FileInformationBlock implements Cloneable
|
||||||
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFBTECHPX ) );
|
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFBTECHPX ) );
|
||||||
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFBTEPAPX ) );
|
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFBTEPAPX ) );
|
||||||
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFSED ) );
|
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFSED ) );
|
||||||
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLCFLST ) );
|
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLFLST ) );
|
||||||
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLFLFO ) );
|
knownFieldSet.add( Integer.valueOf( FIBFieldHandler.PLFLFO ) );
|
||||||
|
|
||||||
// field info
|
// field info
|
||||||
|
@ -457,26 +457,75 @@ public final class FileInformationBlock implements Cloneable
|
||||||
_fieldHandler.setFieldSize(FIBFieldHandler.PLCFSED, lcbPlcfSed);
|
_fieldHandler.setFieldSize(FIBFieldHandler.PLCFSED, lcbPlcfSed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public int getFcPlcfLst()
|
public int getFcPlcfLst()
|
||||||
{
|
{
|
||||||
return _fieldHandler.getFieldOffset(FIBFieldHandler.PLCFLST);
|
return _fieldHandler.getFieldOffset(FIBFieldHandler.PLCFLST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An unsigned integer that specifies an offset in the Table Stream. A
|
||||||
|
* PlfLst that contains list formatting information begins at this offset.
|
||||||
|
* An array of LVLs is appended to the PlfLst. lcbPlfLst does not account
|
||||||
|
* for the array of LVLs. The size of the array of LVLs is specified by the
|
||||||
|
* LSTFs in PlfLst. For each LSTF whose fSimpleList is set to 0x1, there is
|
||||||
|
* one LVL in the array of LVLs that specifies the level formatting of the
|
||||||
|
* single level in the list which corresponds to the LSTF. And, for each
|
||||||
|
* LSTF whose fSimpleList is set to 0x0, there are 9 LVLs in the array of
|
||||||
|
* LVLs that specify the level formatting of the respective levels in the
|
||||||
|
* list which corresponds to the LSTF. This array of LVLs is in the same
|
||||||
|
* respective order as the LSTFs in PlfLst. If lcbPlfLst is 0, fcPlfLst is
|
||||||
|
* undefined and MUST be ignored.
|
||||||
|
* <p>
|
||||||
|
* Quote from
|
||||||
|
* "[MS-DOC] -- v20110315, Word (.doc) Binary File Format; page 76 / 621"
|
||||||
|
*/
|
||||||
|
public int getFcPlfLst()
|
||||||
|
{
|
||||||
|
return _fieldHandler.getFieldOffset( FIBFieldHandler.PLFLST );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public int getLcbPlcfLst()
|
public int getLcbPlcfLst()
|
||||||
{
|
{
|
||||||
return _fieldHandler.getFieldSize(FIBFieldHandler.PLCFLST);
|
return _fieldHandler.getFieldSize(FIBFieldHandler.PLCFLST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getLcbPlfLst()
|
||||||
|
{
|
||||||
|
return _fieldHandler.getFieldSize( FIBFieldHandler.PLFLST );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public void setFcPlcfLst( int fcPlcfLst )
|
public void setFcPlcfLst( int fcPlcfLst )
|
||||||
{
|
{
|
||||||
_fieldHandler.setFieldOffset( FIBFieldHandler.PLCFLST, fcPlcfLst );
|
_fieldHandler.setFieldOffset( FIBFieldHandler.PLCFLST, fcPlcfLst );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFcPlfLst( int fcPlfLst )
|
||||||
|
{
|
||||||
|
_fieldHandler.setFieldOffset( FIBFieldHandler.PLFLST, fcPlfLst );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public void setLcbPlcfLst( int lcbPlcfLst )
|
public void setLcbPlcfLst( int lcbPlcfLst )
|
||||||
{
|
{
|
||||||
_fieldHandler.setFieldSize( FIBFieldHandler.PLCFLST, lcbPlcfLst );
|
_fieldHandler.setFieldSize( FIBFieldHandler.PLCFLST, lcbPlcfLst );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLcbPlfLst( int lcbPlfLst )
|
||||||
|
{
|
||||||
|
_fieldHandler.setFieldSize( FIBFieldHandler.PLFLST, lcbPlfLst );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An unsigned integer that specifies an offset in the Table Stream. A
|
||||||
|
* PlfLfo that contains list formatting override information begins at this
|
||||||
|
* offset. If lcbPlfLfo is zero, fcPlfLfo is undefined and MUST be ignored.
|
||||||
|
* <p>
|
||||||
|
* Quote from
|
||||||
|
* "[MS-DOC] -- v20110315, Word (.doc) Binary File Format; page 76 / 621"
|
||||||
|
*/
|
||||||
public int getFcPlfLfo()
|
public int getFcPlfLfo()
|
||||||
{
|
{
|
||||||
return _fieldHandler.getFieldOffset( FIBFieldHandler.PLFLFO );
|
return _fieldHandler.getFieldOffset( FIBFieldHandler.PLFLFO );
|
||||||
|
|
|
@ -29,7 +29,7 @@ import org.apache.poi.hwpf.model.types.LFOAbstractType;
|
||||||
* @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
|
* @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
class LFO extends LFOAbstractType
|
public class LFO extends LFOAbstractType
|
||||||
{
|
{
|
||||||
public LFO()
|
public LFO()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,97 +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;
|
|
||||||
|
|
||||||
@Internal
|
|
||||||
public final class ListFormatOverride
|
|
||||||
{
|
|
||||||
private LFO _lfo;
|
|
||||||
|
|
||||||
private LFOData _lfoData;
|
|
||||||
|
|
||||||
public ListFormatOverride( byte[] buf, int offset )
|
|
||||||
{
|
|
||||||
_lfo = new LFO( buf, offset );
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListFormatOverride( int lsid )
|
|
||||||
{
|
|
||||||
_lfo = new LFO();
|
|
||||||
_lfo.setLsid( lsid );
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListFormatOverrideLevel[] getLevelOverrides()
|
|
||||||
{
|
|
||||||
return _lfoData.getRgLfoLvl();
|
|
||||||
}
|
|
||||||
|
|
||||||
LFO getLfo()
|
|
||||||
{
|
|
||||||
return _lfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
LFOData getLfoData()
|
|
||||||
{
|
|
||||||
return _lfoData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLsid()
|
|
||||||
{
|
|
||||||
return _lfo.getLsid();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListFormatOverrideLevel getOverrideLevel( int level )
|
|
||||||
{
|
|
||||||
ListFormatOverrideLevel retLevel = null;
|
|
||||||
for ( int x = 0; x < getLevelOverrides().length; x++ )
|
|
||||||
{
|
|
||||||
if ( getLevelOverrides()[x].getLevelNum() == level )
|
|
||||||
{
|
|
||||||
retLevel = getLevelOverrides()[x];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int numOverrides()
|
|
||||||
{
|
|
||||||
return _lfo.getClfolvl();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setLfoData( LFOData _lfoData )
|
|
||||||
{
|
|
||||||
this._lfoData = _lfoData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLsid( int lsid )
|
|
||||||
{
|
|
||||||
_lfo.setLsid( lsid );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOverride( int index, ListFormatOverrideLevel lfolvl )
|
|
||||||
{
|
|
||||||
getLevelOverrides()[index] = lfolvl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] toByteArray()
|
|
||||||
{
|
|
||||||
return _lfo.serialize();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -21,31 +21,32 @@ import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List Format Override (LFO). <p>Class and fields descriptions are quoted from
|
* List Format Override (LFO).
|
||||||
Microsoft Office Word 97-2007 Binary File Format
|
|
||||||
|
|
||||||
* <p>
|
* <p>
|
||||||
* NOTE: This source is automatically generated please do not modify this file. Either subclass or
|
* Class and fields descriptions are quoted from [MS-DOC] --v20110315; Word
|
||||||
* remove the record in src/types/definitions.
|
* (.doc) Binary File Format
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* NOTE: This source is automatically generated please do not modify this file.
|
||||||
|
* Either subclass or remove the record in src/types/definitions.
|
||||||
* <p>
|
* <p>
|
||||||
* This class is internal. It content or properties may change without notice
|
* This class is internal. It content or properties may change without notice
|
||||||
* due to changes in our knowledge of internal Microsoft Word binary structures.
|
* due to changes in our knowledge of internal Microsoft Word binary structures.
|
||||||
|
*
|
||||||
* @author Sergey Vladimirov; according to Microsoft Office Word 97-2007 Binary File Format
|
* @author Sergey Vladimirov; according to [MS-DOC] --v20110315; Word (.doc)
|
||||||
Specification [*.doc]
|
* Binary File Format; Copyright (c) Microsoft Corporation
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public abstract class LFOAbstractType
|
public abstract class LFOAbstractType
|
||||||
{
|
{
|
||||||
|
|
||||||
protected int field_1_lsid;
|
protected int field_1_lsid;
|
||||||
protected int field_2_reserved1;
|
protected int field_2_unused1;
|
||||||
protected int field_3_reserved2;
|
protected int field_3_unused2;
|
||||||
protected byte field_4_clfolvl;
|
protected byte field_4_clfolvl;
|
||||||
protected byte field_5_ibstFltAutoNum;
|
protected byte field_5_ibstFltAutoNum;
|
||||||
protected Grfhic field_6_grfhic;
|
protected Grfhic field_6_grfhic;
|
||||||
protected byte field_7_reserved3;
|
protected byte field_7_unused3;
|
||||||
|
|
||||||
protected LFOAbstractType()
|
protected LFOAbstractType()
|
||||||
{
|
{
|
||||||
|
@ -55,23 +56,23 @@ public abstract class LFOAbstractType
|
||||||
protected void fillFields( byte[] data, int offset )
|
protected void fillFields( byte[] data, int offset )
|
||||||
{
|
{
|
||||||
field_1_lsid = LittleEndian.getInt( data, 0x0 + offset );
|
field_1_lsid = LittleEndian.getInt( data, 0x0 + offset );
|
||||||
field_2_reserved1 = LittleEndian.getInt( data, 0x4 + offset );
|
field_2_unused1 = LittleEndian.getInt( data, 0x4 + offset );
|
||||||
field_3_reserved2 = LittleEndian.getInt( data, 0x8 + offset );
|
field_3_unused2 = LittleEndian.getInt( data, 0x8 + offset );
|
||||||
field_4_clfolvl = data[0xc + offset];
|
field_4_clfolvl = data[0xc + offset];
|
||||||
field_5_ibstFltAutoNum = data[0xd + offset];
|
field_5_ibstFltAutoNum = data[0xd + offset];
|
||||||
field_6_grfhic = new Grfhic( data, 0xe + offset );
|
field_6_grfhic = new Grfhic( data, 0xe + offset );
|
||||||
field_7_reserved3 = data[ 0xf + offset ];
|
field_7_unused3 = data[0xf + offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void serialize( byte[] data, int offset )
|
public void serialize( byte[] data, int offset )
|
||||||
{
|
{
|
||||||
LittleEndian.putInt( data, 0x0 + offset, field_1_lsid );
|
LittleEndian.putInt( data, 0x0 + offset, field_1_lsid );
|
||||||
LittleEndian.putInt( data, 0x4 + offset, field_2_reserved1 );
|
LittleEndian.putInt( data, 0x4 + offset, field_2_unused1 );
|
||||||
LittleEndian.putInt( data, 0x8 + offset, field_3_reserved2 );
|
LittleEndian.putInt( data, 0x8 + offset, field_3_unused2 );
|
||||||
data[0xc + offset] = field_4_clfolvl;
|
data[0xc + offset] = field_4_clfolvl;
|
||||||
data[0xd + offset] = field_5_ibstFltAutoNum;
|
data[0xd + offset] = field_5_ibstFltAutoNum;
|
||||||
field_6_grfhic.serialize( data, 0xe + offset );
|
field_6_grfhic.serialize( data, 0xe + offset );
|
||||||
data[ 0xf + offset ] = field_7_reserved3;
|
data[0xf + offset] = field_7_unused3;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] serialize()
|
public byte[] serialize()
|
||||||
|
@ -101,9 +102,9 @@ public abstract class LFOAbstractType
|
||||||
LFOAbstractType other = (LFOAbstractType) obj;
|
LFOAbstractType other = (LFOAbstractType) obj;
|
||||||
if ( field_1_lsid != other.field_1_lsid )
|
if ( field_1_lsid != other.field_1_lsid )
|
||||||
return false;
|
return false;
|
||||||
if ( field_2_reserved1 != other.field_2_reserved1 )
|
if ( field_2_unused1 != other.field_2_unused1 )
|
||||||
return false;
|
return false;
|
||||||
if ( field_3_reserved2 != other.field_3_reserved2 )
|
if ( field_3_unused2 != other.field_3_unused2 )
|
||||||
return false;
|
return false;
|
||||||
if ( field_4_clfolvl != other.field_4_clfolvl )
|
if ( field_4_clfolvl != other.field_4_clfolvl )
|
||||||
return false;
|
return false;
|
||||||
|
@ -116,7 +117,7 @@ public abstract class LFOAbstractType
|
||||||
}
|
}
|
||||||
else if ( !field_6_grfhic.equals( other.field_6_grfhic ) )
|
else if ( !field_6_grfhic.equals( other.field_6_grfhic ) )
|
||||||
return false;
|
return false;
|
||||||
if ( field_7_reserved3 != other.field_7_reserved3 )
|
if ( field_7_unused3 != other.field_7_unused3 )
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -127,12 +128,12 @@ public abstract class LFOAbstractType
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + field_1_lsid;
|
result = prime * result + field_1_lsid;
|
||||||
result = prime * result + field_2_reserved1;
|
result = prime * result + field_2_unused1;
|
||||||
result = prime * result + field_3_reserved2;
|
result = prime * result + field_3_unused2;
|
||||||
result = prime * result + field_4_clfolvl;
|
result = prime * result + field_4_clfolvl;
|
||||||
result = prime * result + field_5_ibstFltAutoNum;
|
result = prime * result + field_5_ibstFltAutoNum;
|
||||||
result = prime * result + field_6_grfhic.hashCode();
|
result = prime * result + field_6_grfhic.hashCode();
|
||||||
result = prime * result + field_7_reserved3;
|
result = prime * result + field_7_unused3;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,25 +143,27 @@ public abstract class LFOAbstractType
|
||||||
builder.append( "[LFO]\n" );
|
builder.append( "[LFO]\n" );
|
||||||
builder.append( " .lsid = " );
|
builder.append( " .lsid = " );
|
||||||
builder.append( " (" ).append( getLsid() ).append( " )\n" );
|
builder.append( " (" ).append( getLsid() ).append( " )\n" );
|
||||||
builder.append(" .reserved1 = ");
|
builder.append( " .unused1 = " );
|
||||||
builder.append(" (").append(getReserved1()).append(" )\n");
|
builder.append( " (" ).append( getUnused1() ).append( " )\n" );
|
||||||
builder.append(" .reserved2 = ");
|
builder.append( " .unused2 = " );
|
||||||
builder.append(" (").append(getReserved2()).append(" )\n");
|
builder.append( " (" ).append( getUnused2() ).append( " )\n" );
|
||||||
builder.append( " .clfolvl = " );
|
builder.append( " .clfolvl = " );
|
||||||
builder.append( " (" ).append( getClfolvl() ).append( " )\n" );
|
builder.append( " (" ).append( getClfolvl() ).append( " )\n" );
|
||||||
builder.append( " .ibstFltAutoNum = " );
|
builder.append( " .ibstFltAutoNum = " );
|
||||||
builder.append( " (" ).append( getIbstFltAutoNum() ).append( " )\n" );
|
builder.append( " (" ).append( getIbstFltAutoNum() ).append( " )\n" );
|
||||||
builder.append( " .grfhic = " );
|
builder.append( " .grfhic = " );
|
||||||
builder.append( " (" ).append( getGrfhic() ).append( " )\n" );
|
builder.append( " (" ).append( getGrfhic() ).append( " )\n" );
|
||||||
builder.append(" .reserved3 = ");
|
builder.append( " .unused3 = " );
|
||||||
builder.append(" (").append(getReserved3()).append(" )\n");
|
builder.append( " (" ).append( getUnused3() ).append( " )\n" );
|
||||||
|
|
||||||
builder.append( "[/LFO]\n" );
|
builder.append( "[/LFO]\n" );
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List ID of corresponding LSTF (see LSTF).
|
* A signed integer that specifies the list identifier of an LSTF. This LFO
|
||||||
|
* corresponds to the LSTF in PlfLst.rgLstf that has an lsid whose value is
|
||||||
|
* equal to this value..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public int getLsid()
|
public int getLsid()
|
||||||
|
@ -169,7 +172,9 @@ public abstract class LFOAbstractType
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List ID of corresponding LSTF (see LSTF).
|
* A signed integer that specifies the list identifier of an LSTF. This LFO
|
||||||
|
* corresponds to the LSTF in PlfLst.rgLstf that has an lsid whose value is
|
||||||
|
* equal to this value..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setLsid( int field_1_lsid )
|
public void setLsid( int field_1_lsid )
|
||||||
|
@ -178,43 +183,43 @@ public abstract class LFOAbstractType
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public int getReserved1()
|
public int getUnused1()
|
||||||
{
|
{
|
||||||
return field_2_reserved1;
|
return field_2_unused1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setReserved1( int field_2_reserved1 )
|
public void setUnused1( int field_2_unused1 )
|
||||||
{
|
{
|
||||||
this.field_2_reserved1 = field_2_reserved1;
|
this.field_2_unused1 = field_2_unused1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public int getReserved2()
|
public int getUnused2()
|
||||||
{
|
{
|
||||||
return field_3_reserved2;
|
return field_3_unused2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setReserved2( int field_3_reserved2 )
|
public void setUnused2( int field_3_unused2 )
|
||||||
{
|
{
|
||||||
this.field_3_reserved2 = field_3_reserved2;
|
this.field_3_unused2 = field_3_unused2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Count of levels whose format is overridden (see LFOLVL).
|
* An unsigned integer that specifies the field that this LFO represents..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public byte getClfolvl()
|
public byte getClfolvl()
|
||||||
|
@ -223,7 +228,7 @@ public abstract class LFOAbstractType
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Count of levels whose format is overridden (see LFOLVL).
|
* An unsigned integer that specifies the field that this LFO represents..
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setClfolvl( byte field_4_clfolvl )
|
public void setClfolvl( byte field_4_clfolvl )
|
||||||
|
@ -268,21 +273,21 @@ public abstract class LFOAbstractType
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public byte getReserved3()
|
public byte getUnused3()
|
||||||
{
|
{
|
||||||
return field_7_reserved3;
|
return field_7_unused3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserved.
|
* This field MUST be ignored.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
public void setReserved3( byte field_7_reserved3 )
|
public void setUnused3( byte field_7_unused3 )
|
||||||
{
|
{
|
||||||
this.field_7_reserved3 = field_7_reserved3;
|
this.field_7_unused3 = field_7_unused3;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // END OF CLASS
|
} // END OF CLASS
|
||||||
|
|
|
@ -17,22 +17,30 @@
|
||||||
|
|
||||||
package org.apache.poi.hwpf.usermodel;
|
package org.apache.poi.hwpf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.hwpf.model.ListLevel;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.hwpf.model.ListData;
|
|
||||||
import org.apache.poi.hwpf.model.ListFormatOverride;
|
|
||||||
import org.apache.poi.hwpf.model.StyleSheet;
|
|
||||||
|
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.model.ListTables;
|
||||||
|
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
|
||||||
|
import org.apache.poi.hwpf.model.LFO;
|
||||||
|
import org.apache.poi.hwpf.model.LFOData;
|
||||||
|
import org.apache.poi.hwpf.model.ListData;
|
||||||
|
import org.apache.poi.hwpf.model.ListLevel;
|
||||||
|
import org.apache.poi.hwpf.model.StyleSheet;
|
||||||
import org.apache.poi.hwpf.sprm.CharacterSprmCompressor;
|
import org.apache.poi.hwpf.sprm.CharacterSprmCompressor;
|
||||||
import org.apache.poi.hwpf.sprm.ParagraphSprmCompressor;
|
import org.apache.poi.hwpf.sprm.ParagraphSprmCompressor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is used to create a list in a Word document. It is used in
|
* This class is used to create a list in a Word document. It is used in
|
||||||
* conjunction with {@link
|
* conjunction with
|
||||||
* org.apache.poi.hwpf.HWPFDocument#registerList(HWPFList) registerList} in
|
* {@link org.apache.poi.hwpf.HWPFDocument#registerList(HWPFList) registerList}
|
||||||
* {@link org.apache.poi.hwpf.HWPFDocument HWPFDocument}.
|
* in {@link org.apache.poi.hwpf.HWPFDocument HWPFDocument}.
|
||||||
*
|
*
|
||||||
* In Word, lists are not ranged entities, meaning you can't actually add one
|
* In Word, lists are not ranged entities, meaning you can't actually add one to
|
||||||
* to the document. Lists only act as properties for list entries. Once you
|
* the document. Lists only act as properties for list entries. Once you
|
||||||
* register a list, you can add list entries to a document that are a part of
|
* register a list, you can add list entries to a document that are a part of
|
||||||
* the list.
|
* the list.
|
||||||
*
|
*
|
||||||
|
@ -41,30 +49,153 @@ import org.apache.poi.hwpf.sprm.ParagraphSprmCompressor;
|
||||||
*
|
*
|
||||||
* @author Ryan Ackley
|
* @author Ryan Ackley
|
||||||
*/
|
*/
|
||||||
public final class HWPFList {
|
public final class HWPFList
|
||||||
|
{
|
||||||
|
private static POILogger log = POILogFactory.getLogger( HWPFList.class );
|
||||||
|
|
||||||
|
private boolean _ignoreLogicalLeftIdentation = false;
|
||||||
|
private LFO _lfo;
|
||||||
|
private LFOData _lfoData;
|
||||||
private ListData _listData;
|
private ListData _listData;
|
||||||
private ListFormatOverride _override;
|
private ListTables _listTables;
|
||||||
private boolean _registered;
|
private boolean _registered;
|
||||||
private StyleSheet _styleSheet;
|
private StyleSheet _styleSheet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param numbered true if the list should be numbered; false if it should be
|
* @param numbered
|
||||||
|
* true if the list should be numbered; false if it should be
|
||||||
* bulleted.
|
* bulleted.
|
||||||
* @param styleSheet The document's stylesheet.
|
* @param styleSheet
|
||||||
|
* The document's stylesheet.
|
||||||
*/
|
*/
|
||||||
public HWPFList( boolean numbered, StyleSheet styleSheet )
|
public HWPFList( boolean numbered, StyleSheet styleSheet )
|
||||||
{
|
{
|
||||||
_listData = new ListData((int)(Math.random() * System.currentTimeMillis()), numbered);
|
_listData = new ListData(
|
||||||
_override = new ListFormatOverride(_listData.getLsid());
|
(int) ( Math.random() * System.currentTimeMillis() ), numbered );
|
||||||
|
_lfo = new LFO();
|
||||||
|
_lfo.setLsid( _listData.getLsid() );
|
||||||
|
_lfoData = new LFOData();
|
||||||
_styleSheet = styleSheet;
|
_styleSheet = styleSheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HWPFList( StyleSheet styleSheet, ListTables listTables, int ilfo )
|
||||||
|
{
|
||||||
|
_listTables = listTables;
|
||||||
|
_styleSheet = styleSheet;
|
||||||
|
_registered = true;
|
||||||
|
|
||||||
|
/* See documentation for sprmPIlfo (0x460B) */
|
||||||
|
if ( ilfo == 0 || ilfo == 0xF801 )
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException( "Paragraph not in list" );
|
||||||
|
}
|
||||||
|
else if ( 0x0001 <= ilfo && ilfo <= 0x07FE )
|
||||||
|
{
|
||||||
|
_lfo = listTables.getLfo( ilfo );
|
||||||
|
_lfoData = listTables.getLfoData( ilfo );
|
||||||
|
}
|
||||||
|
else if ( 0xF802 <= ilfo && ilfo <= 0xFFFF )
|
||||||
|
{
|
||||||
|
int nilfo = ilfo ^ 0xFFFF;
|
||||||
|
_lfo = listTables.getLfo( nilfo );
|
||||||
|
_lfoData = listTables.getLfoData( nilfo );
|
||||||
|
_ignoreLogicalLeftIdentation = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException( "Incorrect ilfo: " + ilfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
_listData = listTables.getListData( _lfo.getLsid() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Internal
|
||||||
|
public LFO getLFO()
|
||||||
|
{
|
||||||
|
return _lfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Internal
|
||||||
|
public LFOData getLFOData()
|
||||||
|
{
|
||||||
|
return _lfoData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Internal
|
||||||
|
public ListData getListData()
|
||||||
|
{
|
||||||
|
return _listData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLsid()
|
||||||
|
{
|
||||||
|
return _lfo.getLsid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Internal
|
||||||
|
ListLevel getLVL( char level )
|
||||||
|
{
|
||||||
|
if ( level >= _listData.numLevels() )
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException( "Required level "
|
||||||
|
+ ( (int) level )
|
||||||
|
+ " is more than number of level for list ("
|
||||||
|
+ _listData.numLevels() + ")" );
|
||||||
|
}
|
||||||
|
ListLevel lvl = _listData.getLevels()[level];
|
||||||
|
return lvl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An MSONFC, as specified in [MS-OSHARED] section 2.2.1.3, that specifies
|
||||||
|
* the format of the level numbers that replace the placeholders for this
|
||||||
|
* level in the xst fields of the LVLs in this list. This value MUST not be
|
||||||
|
* equal to 0x08, 0x09, 0x0F, or 0x13. If this is equal to 0xFF or 0x17,
|
||||||
|
* this level does not have a number sequence and therefore has no number
|
||||||
|
* formatting. If this is equal to 0x17, the level uses bullets.
|
||||||
|
*/
|
||||||
|
public int getNumberFormat( char level )
|
||||||
|
{
|
||||||
|
return getLVL( level ).getNumberFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNumberText( char level )
|
||||||
|
{
|
||||||
|
return getLVL( level ).getNumberText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStartAt( char level )
|
||||||
|
{
|
||||||
|
return getLVL( level ).getStartAt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "The type of character following the number text for the paragraph: 0 == tab, 1 == space, 2 == nothing."
|
||||||
|
*/
|
||||||
|
public byte getTypeOfCharFollowingTheNumber( char level )
|
||||||
|
{
|
||||||
|
return getLVL( level ).getTypeOfCharFollowingTheNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIgnoreLogicalLeftIdentation()
|
||||||
|
{
|
||||||
|
return _ignoreLogicalLeftIdentation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIgnoreLogicalLeftIdentation(
|
||||||
|
boolean ignoreLogicalLeftIdentation )
|
||||||
|
{
|
||||||
|
this._ignoreLogicalLeftIdentation = ignoreLogicalLeftIdentation;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the character properties of the list numbers.
|
* Sets the character properties of the list numbers.
|
||||||
*
|
*
|
||||||
* @param level the level number that the properties should apply to.
|
* @param level
|
||||||
* @param chp The character properties.
|
* the level number that the properties should apply to.
|
||||||
|
* @param chp
|
||||||
|
* The character properties.
|
||||||
*/
|
*/
|
||||||
public void setLevelNumberProperties( int level, CharacterProperties chp )
|
public void setLevelNumberProperties( int level, CharacterProperties chp )
|
||||||
{
|
{
|
||||||
|
@ -72,15 +203,18 @@ public final class HWPFList {
|
||||||
int styleIndex = _listData.getLevelStyle( level );
|
int styleIndex = _listData.getLevelStyle( level );
|
||||||
CharacterProperties base = _styleSheet.getCharacterStyle( styleIndex );
|
CharacterProperties base = _styleSheet.getCharacterStyle( styleIndex );
|
||||||
|
|
||||||
byte[] grpprl = CharacterSprmCompressor.compressCharacterProperty(chp, base);
|
byte[] grpprl = CharacterSprmCompressor.compressCharacterProperty( chp,
|
||||||
|
base );
|
||||||
listLevel.setNumberProperties( grpprl );
|
listLevel.setNumberProperties( grpprl );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the paragraph properties for a particular level of the list.
|
* Sets the paragraph properties for a particular level of the list.
|
||||||
*
|
*
|
||||||
* @param level The level number.
|
* @param level
|
||||||
* @param pap The paragraph properties
|
* The level number.
|
||||||
|
* @param pap
|
||||||
|
* The paragraph properties
|
||||||
*/
|
*/
|
||||||
public void setLevelParagraphProperties( int level, ParagraphProperties pap )
|
public void setLevelParagraphProperties( int level, ParagraphProperties pap )
|
||||||
{
|
{
|
||||||
|
@ -88,7 +222,8 @@ public final class HWPFList {
|
||||||
int styleIndex = _listData.getLevelStyle( level );
|
int styleIndex = _listData.getLevelStyle( level );
|
||||||
ParagraphProperties base = _styleSheet.getParagraphStyle( styleIndex );
|
ParagraphProperties base = _styleSheet.getParagraphStyle( styleIndex );
|
||||||
|
|
||||||
byte[] grpprl = ParagraphSprmCompressor.compressParagraphProperty(pap, base);
|
byte[] grpprl = ParagraphSprmCompressor.compressParagraphProperty( pap,
|
||||||
|
base );
|
||||||
listLevel.setLevelProperties( grpprl );
|
listLevel.setLevelProperties( grpprl );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,15 +231,4 @@ public final class HWPFList {
|
||||||
{
|
{
|
||||||
_listData.setLevelStyle( level, styleIndex );
|
_listData.setLevelStyle( level, styleIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
public ListData getListData()
|
|
||||||
{
|
|
||||||
return _listData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListFormatOverride getOverride()
|
|
||||||
{
|
|
||||||
return _override;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue