add additional TableProperties; implement TableAutoformatLookSpecifier

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1142827 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Sergey Vladimirov 2011-07-04 22:21:10 +00:00
parent 27cec2b36b
commit bc0abec2c4
9 changed files with 2618 additions and 162 deletions

View File

@ -0,0 +1,291 @@
/* ====================================================================
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.types;
import org.apache.poi.hdf.model.hdftypes.HDFType;
import org.apache.poi.util.BitField;
import org.apache.poi.util.LittleEndian;
/**
* Table Autoformat Look sPecifier (TLP).
* <p>
* Class and fields descriptions are quoted from Microsoft Office Word 97-2007
* Binary File Format
*
* NOTE: This source is automatically generated please do not modify this file.
* Either subclass or remove the record in src/records/definitions.
*
* @author Sergey Vladimirov; according to Microsoft Office Word 97-2007 Binary
* File Format Specification [*.doc]
*/
public abstract class TLPAbstractType implements HDFType
{
protected short field_1_itl;
protected byte field_2_tlp_flags;
private static BitField fBorders = new BitField( 0x0001 );
private static BitField fShading = new BitField( 0x0002 );
private static BitField fFont = new BitField( 0x0004 );
private static BitField fColor = new BitField( 0x0008 );
private static BitField fBestFit = new BitField( 0x0010 );
private static BitField fHdrRows = new BitField( 0x0020 );
private static BitField fLastRow = new BitField( 0x0040 );
public TLPAbstractType()
{
}
protected void fillFields( byte[] data, int offset )
{
field_1_itl = LittleEndian.getShort( data, 0x0 + offset );
field_2_tlp_flags = data[0x2 + offset];
}
public void serialize( byte[] data, int offset )
{
LittleEndian.putShort( data, 0x0 + offset, field_1_itl );
data[0x2 + offset] = field_2_tlp_flags;
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append( "[TLP]\n" );
buffer.append( " .itl = " );
buffer.append( " (" ).append( getItl() ).append( " )\n" );
buffer.append( " .tlp_flags = " );
buffer.append( " (" ).append( getTlp_flags() ).append( " )\n" );
buffer.append( " .fBorders = " )
.append( isFBorders() ).append( '\n' );
buffer.append( " .fShading = " )
.append( isFShading() ).append( '\n' );
buffer.append( " .fFont = " )
.append( isFFont() ).append( '\n' );
buffer.append( " .fColor = " )
.append( isFColor() ).append( '\n' );
buffer.append( " .fBestFit = " )
.append( isFBestFit() ).append( '\n' );
buffer.append( " .fHdrRows = " )
.append( isFHdrRows() ).append( '\n' );
buffer.append( " .fLastRow = " )
.append( isFLastRow() ).append( '\n' );
buffer.append( "[/TLP]\n" );
return buffer.toString();
}
/**
* Size of record (exluding 4 byte header)
*/
public int getSize()
{
return 4 + +2 + 1;
}
/**
* Get the itl field for the TLP record.
*/
public short getItl()
{
return field_1_itl;
}
/**
* Set the itl field for the TLP record.
*/
public void setItl( short field_1_itl )
{
this.field_1_itl = field_1_itl;
}
/**
* Get the tlp_flags field for the TLP record.
*/
public byte getTlp_flags()
{
return field_2_tlp_flags;
}
/**
* Set the tlp_flags field for the TLP record.
*/
public void setTlp_flags( byte field_2_tlp_flags )
{
this.field_2_tlp_flags = field_2_tlp_flags;
}
/**
* Sets the fBorders field value. When == 1, use the border properties from
* the selected table look
*/
public void setFBorders( boolean value )
{
field_2_tlp_flags = (byte) fBorders.setBoolean( field_2_tlp_flags,
value );
}
/**
* When == 1, use the border properties from the selected table look
*
* @return the fBorders field value.
*/
public boolean isFBorders()
{
return fBorders.isSet( field_2_tlp_flags );
}
/**
* Sets the fShading field value. When == 1, use the shading properties from
* the selected table look
*/
public void setFShading( boolean value )
{
field_2_tlp_flags = (byte) fShading.setBoolean( field_2_tlp_flags,
value );
}
/**
* When == 1, use the shading properties from the selected table look
*
* @return the fShading field value.
*/
public boolean isFShading()
{
return fShading.isSet( field_2_tlp_flags );
}
/**
* Sets the fFont field value. When == 1, use the font from the selected
* table look
*/
public void setFFont( boolean value )
{
field_2_tlp_flags = (byte) fFont.setBoolean( field_2_tlp_flags, value );
}
/**
* When == 1, use the font from the selected table look
*
* @return the fFont field value.
*/
public boolean isFFont()
{
return fFont.isSet( field_2_tlp_flags );
}
/**
* Sets the fColor field value. When == 1, use the color from the selected
* table look
*/
public void setFColor( boolean value )
{
field_2_tlp_flags = (byte) fColor.setBoolean( field_2_tlp_flags, value );
}
/**
* When == 1, use the color from the selected table look
*
* @return the fColor field value.
*/
public boolean isFColor()
{
return fColor.isSet( field_2_tlp_flags );
}
/**
* Sets the fBestFit field value. When == 1, do best fit from the selected
* table look
*/
public void setFBestFit( boolean value )
{
field_2_tlp_flags = (byte) fBestFit.setBoolean( field_2_tlp_flags,
value );
}
/**
* When == 1, do best fit from the selected table look
*
* @return the fBestFit field value.
*/
public boolean isFBestFit()
{
return fBestFit.isSet( field_2_tlp_flags );
}
/**
* Sets the fHdrRows field value. When == 1, apply properties from the
* selected table look to the header rows in the table
*/
public void setFHdrRows( boolean value )
{
field_2_tlp_flags = (byte) fHdrRows.setBoolean( field_2_tlp_flags,
value );
}
/**
* When == 1, apply properties from the selected table look to the header
* rows in the table
*
* @return the fHdrRows field value.
*/
public boolean isFHdrRows()
{
return fHdrRows.isSet( field_2_tlp_flags );
}
/**
* Sets the fLastRow field value. When == 1, apply properties from the
* selected table look to the last row in the table
*/
public void setFLastRow( boolean value )
{
field_2_tlp_flags = (byte) fLastRow.setBoolean( field_2_tlp_flags,
value );
}
/**
* When == 1, apply properties from the selected table look to the last row
* in the table
*
* @return the fLastRow field value.
*/
public boolean isFLastRow()
{
return fLastRow.isSet( field_2_tlp_flags );
}
} // END OF CLASS

View File

@ -17,14 +17,15 @@
package org.apache.poi.hwpf.sprm;
import org.apache.poi.hwpf.usermodel.TableProperties;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
import org.apache.poi.hwpf.usermodel.BorderCode;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.poi.hwpf.usermodel.BorderCode;
import org.apache.poi.hwpf.usermodel.TableAutoformatLookSpecifier;
import org.apache.poi.hwpf.usermodel.TableCellDescriptor;
import org.apache.poi.hwpf.usermodel.TableProperties;
import org.apache.poi.util.LittleEndian;
public final class TableSprmCompressor
{
public TableSprmCompressor()
@ -99,10 +100,13 @@ public final class TableSprmCompressor
// }
// size += SprmUtils.addSpecialSprm((short)0xD609, buf, sprmList);
}
if (newTAP.getTlp() != 0)
{
size += SprmUtils.addSprm((short)0x740a, newTAP.getTlp(), null, sprmList);
}
if ( newTAP.getTlp() != null )
{
byte[] buf = new byte[TableAutoformatLookSpecifier.SIZE];
newTAP.getTlp().serialize( buf, 0 );
size += SprmUtils.addSprm( (short) 0x740a, 0, buf, sprmList );
}
return SprmUtils.getGrpprl(sprmList, size);
}

View File

@ -0,0 +1,26 @@
package org.apache.poi.hwpf.usermodel;
import org.apache.poi.hwpf.model.types.TLPAbstractType;
public class TableAutoformatLookSpecifier extends TLPAbstractType
{
public static final int SIZE = 4;
public TableAutoformatLookSpecifier()
{
super();
}
public TableAutoformatLookSpecifier( byte[] data, int offset )
{
super();
fillFields( data, offset );
}
@Override
public TableAutoformatLookSpecifier clone()
throws CloneNotSupportedException
{
return (TableAutoformatLookSpecifier) super.clone();
}
}

View File

@ -19,59 +19,80 @@ package org.apache.poi.hwpf.usermodel;
import org.apache.poi.hwpf.model.types.TAPAbstractType;
public final class TableProperties
extends TAPAbstractType
implements Cloneable
public final class TableProperties extends TAPAbstractType implements Cloneable
{
public TableProperties()
{
public TableProperties()
{
}
public TableProperties(int columns)
{
field_7_itcMac = (short)columns;
field_10_rgshd = new ShadingDescriptor[columns];
for (int x = 0; x < columns; x++)
{
field_10_rgshd[x] = new ShadingDescriptor();
}
field_11_brcBottom = new BorderCode();
field_12_brcTop = new BorderCode();
field_13_brcLeft = new BorderCode();
field_14_brcRight = new BorderCode();
field_15_brcVertical = new BorderCode();
field_16_brcHorizontal = new BorderCode();
field_8_rgdxaCenter = new short[columns];
field_9_rgtc = new TableCellDescriptor[columns];
for (int x = 0; x < columns; x++)
{
field_9_rgtc[x] = new TableCellDescriptor();
}
}
public Object clone()
throws CloneNotSupportedException
{
TableProperties tap = (TableProperties)super.clone();
tap.field_10_rgshd = new ShadingDescriptor[field_10_rgshd.length];
for (int x = 0; x < field_10_rgshd.length; x++)
public TableProperties( short columns )
{
tap.field_10_rgshd[x] = (ShadingDescriptor)field_10_rgshd[x].clone();
setTlp( new TableAutoformatLookSpecifier() );
setItcMac( columns );
setRgshd( new ShadingDescriptor[columns] );
for ( int x = 0; x < columns; x++ )
{
getRgshd()[x] = new ShadingDescriptor();
}
setBrcBottom( new BorderCode() );
setBrcHorizontal( new BorderCode() );
setBrcLeft( new BorderCode() );
setBrcRight( new BorderCode() );
setBrcTop( new BorderCode() );
setBrcVertical( new BorderCode() );
setRgbrcInsideDefault_0( new BorderCode() );
setRgbrcInsideDefault_1( new BorderCode() );
TableCellDescriptor[] tableCellDescriptors = new TableCellDescriptor[columns];
for ( int x = 0; x < columns; x++ )
{
tableCellDescriptors[x] = new TableCellDescriptor();
}
setRgtc( tableCellDescriptors );
setRgdxaCenter( new short[columns] );
setRgdxaCenterPrint( new short[columns] );
}
tap.field_11_brcBottom = (BorderCode)field_11_brcBottom.clone();
tap.field_12_brcTop = (BorderCode)field_12_brcTop.clone();
tap.field_13_brcLeft = (BorderCode)field_13_brcLeft.clone();
tap.field_14_brcRight = (BorderCode)field_14_brcRight.clone();
tap.field_15_brcVertical = (BorderCode)field_15_brcVertical.clone();
tap.field_16_brcHorizontal = (BorderCode)field_16_brcHorizontal.clone();
tap.field_8_rgdxaCenter = field_8_rgdxaCenter.clone();
tap.field_9_rgtc = new TableCellDescriptor[field_9_rgtc.length];
for (int x = 0; x < field_9_rgtc.length; x++)
public Object clone() throws CloneNotSupportedException
{
tap.field_9_rgtc[x] = (TableCellDescriptor)field_9_rgtc[x].clone();
TableProperties tap = (TableProperties) super.clone();
tap.setTlp( getTlp().clone() );
tap.setRgshd( new ShadingDescriptor[getRgshd().length] );
for ( int x = 0; x < getRgshd().length; x++ )
{
tap.getRgshd()[x] = (ShadingDescriptor) getRgshd()[x].clone();
}
tap.setBrcBottom( (BorderCode) getBrcBottom().clone() );
tap.setBrcHorizontal( (BorderCode) getBrcHorizontal().clone() );
tap.setBrcLeft( (BorderCode) getBrcLeft().clone() );
tap.setBrcRight( (BorderCode) getBrcRight().clone() );
tap.setBrcTop( (BorderCode) getBrcTop().clone() );
tap.setBrcVertical( (BorderCode) getBrcVertical().clone() );
tap.setShdTable( (ShadingDescriptor) getShdTable().clone() );
tap.setRgbrcInsideDefault_0( (BorderCode) getRgbrcInsideDefault_0()
.clone() );
tap.setRgbrcInsideDefault_1( (BorderCode) getRgbrcInsideDefault_1()
.clone() );
tap.setRgdxaCenter( getRgdxaCenter().clone() );
tap.setRgdxaCenterPrint( getRgdxaCenterPrint().clone() );
tap.setRgtc( new TableCellDescriptor[getRgtc().length] );
for ( int x = 0; x < getRgtc().length; x++ )
{
tap.getRgtc()[x] = (TableCellDescriptor) getRgtc()[x].clone();
}
return tap;
}
return tap;
}
}

View File

@ -82,7 +82,7 @@ public final class TableRow
public void setRowJustification(int jc)
{
_tprops.setJc(jc);
_tprops.setJc((short) jc);
_papx.updateSprm(SPRM_TJC, (short)jc);
}

View File

@ -17,6 +17,9 @@
package org.apache.poi.hwpf.usermodel;
import java.io.InputStream;
import java.util.List;
import junit.framework.AssertionFailedError;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.poi.EncryptedDocumentException;
@ -30,9 +33,6 @@ import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.model.StyleSheet;
import org.apache.poi.util.IOUtils;
import java.io.InputStream;
import java.util.List;
/**
* Test various problem documents
*
@ -605,7 +605,7 @@ public final class TestProblems extends HWPFTestCase {
HWPFDocument doc = HWPFTestDataSamples.openSampleFile("empty.doc");
Range range = doc.getRange();
Table table = range.insertBefore(new TableProperties(columns), rows);
Table table = range.insertBefore(new TableProperties((short) columns), rows);
for (int rowIdx = 0; rowIdx < table.numRows(); rowIdx++) {
TableRow row = table.getRow(rowIdx);

View File

@ -26,8 +26,8 @@
<author>S. Ryan Ackley</author>
<fields>
<!-- page 198 -->
<field type="int" size="4" name="istd" description="Table style for the Table"/>
<field type="int" size="2" name="jc"
<field type="short" size="2" name="istd" description="Table style for the Table"/>
<field type="short" size="2" name="jc"
description="Justification code. specifies how table row should be justified within its column. 0 -- left justify, 1 -- center, 2 -- right justify"/>
<field type="int" size="4" name="dxaGapHalf"
description="Measures half of the white space that will be maintained between text in adjacent columns of a table row. A dxaGapHalf width of white space will be maintained on both sides of a column boundary."/>
@ -39,7 +39,8 @@
description="When 1, table row may not be split across page bounds. Used for Word 2000 and Word 97."/>
<field type="boolean" size="0" name="fTableHeader"
description="When 1, table row is to be used as the header of the table"/>
<field type="int" size="4" name="tlp" description="Table look specifier (see TLP definition)"/>
<field type="TableAutoformatLookSpecifier" size="4" name="tlp" description="Table look specifier"/>
<field type="short" size="2" name="wWidth" description="Preferred table width"/>
<field type="short" size="2" name="wWidthIndent" description="Left Indent"/>
@ -116,7 +117,7 @@
<field type="int" size="4" name="dxaRTEWrapWidth" description="Used internally by Word"/>
<field type="int" size="4" name="dxaColWidthWwd" description="Used internally by Word"/>
<field type="int" size="2" name="pctWwd"
<field type="short" size="2" name="pctWwd"
description="Used internally by Word: percent of Window size for AutoFit in WebView"/>
<field type="int" size="2" name="viewFlags" description="Used internally by Word">
@ -131,6 +132,12 @@
<bit number="6" mask="0xffe0" name="viewFlags_unused2" description="Not used"/>
</field>
<field type="short[]" size="130" name="rgdxaCenter"
description="rgdxaCenter[0] is the left boundary of cell 0 measured relative to margin rgdxaCenter[tap.itcMac - 1] is left boundary of last cell rgdxaCenter[tap.itcMac] is right boundary of last cell."/>
<field type="short[]" size="130" name="rgdxaCenterPrint" description="Used internally by Word"/>
<field type="ShadingDescriptor" size="10" name="shdTable" description="Table shading"/>
<!-- rgbrcTable[ibrcTableMax]; Array of borders; ibrcTableMax==6 -->
<field type="BorderCode" size="4" name="brcBottom"/>
<field type="BorderCode" size="4" name="brcTop"/>
@ -141,10 +148,10 @@
<!-- mpibrcwCellPaddingDefault[cbrcTc]; Array of default cell margins. Index into the next four
properties. -->
<field type="int" size="2" name="wCellPaddingDefaultTop" description="Default top cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingDefaultLeft" description="Default left cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingDefaultBottom" description="Default bottom cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingDefaultRight" description="Default right cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingDefaultTop" description="Default top cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingDefaultLeft" description="Default left cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingDefaultBottom" description="Default bottom cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingDefaultRight" description="Default right cell margin/padding"/>
<!-- mpibrcftsCellPaddingDefault[cbrcTc]; Array of default cell margin units. Index into the
next four properties -->
@ -159,10 +166,10 @@
<!-- mpibrcwCellSpacingDefault[cbrcTc]; Array of default cell spacing. Index into the next four
properties -->
<field type="int" size="2" name="wCellSpacingDefaultTop" description="Default top cell spacings"/>
<field type="int" size="2" name="wCellSpacingDefaultLeft" description="Default left cell spacings"/>
<field type="int" size="2" name="wCellSpacingDefaultBottom" description="Default bottom cell spacings"/>
<field type="int" size="2" name="wCellSpacingDefaultRight" description="Default right cell spacings"/>
<field type="short" size="2" name="wCellSpacingDefaultTop" description="Default top cell spacings"/>
<field type="short" size="2" name="wCellSpacingDefaultLeft" description="Default left cell spacings"/>
<field type="short" size="2" name="wCellSpacingDefaultBottom" description="Default bottom cell spacings"/>
<field type="short" size="2" name="wCellSpacingDefaultRight" description="Default right cell spacings"/>
<!-- mpibrcftsCellSpacingDefault[cbrcTc]; Array of default cell spacing units. Index into the
next four properties -->
@ -177,10 +184,10 @@
<!-- mpibrcwCellPaddingOuter[cbrcTc]; Array of default outer cell margins. Index into the next
four properties. -->
<field type="int" size="2" name="wCellPaddingOuterTop" description="Default outer top cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingOuterLeft" description="Default outer left cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingOuterBottom" description="Default outer bottom cell margin/padding"/>
<field type="int" size="2" name="wCellPaddingOuterRight" description="Default outer right cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingOuterTop" description="Default outer top cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingOuterLeft" description="Default outer left cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingOuterBottom" description="Default outer bottom cell margin/padding"/>
<field type="short" size="2" name="wCellPaddingOuterRight" description="Default outer right cell margin/padding"/>
<!-- mpibrcftsCellPaddingOuter[cbrcTc]; Array of default outer cell margin units. Index into
the next four properties -->
@ -195,10 +202,10 @@
<!-- mpibrcwCellSpacingOuter[cbrcTc]; Array of default outer cell spacing. Index into the next
four properties. -->
<field type="int" size="2" name="wCellSpacingOuterTop" description="Default outer top cell spacing"/>
<field type="int" size="2" name="wCellSpacingOuterLeft" description="Default outer left cell spacing"/>
<field type="int" size="2" name="wCellSpacingOuterBottom" description="Default outer bottom cell spacing"/>
<field type="int" size="2" name="wCellSpacingOuterRight" description="Default outer right cell spacing"/>
<field type="short" size="2" name="wCellSpacingOuterTop" description="Default outer top cell spacing"/>
<field type="short" size="2" name="wCellSpacingOuterLeft" description="Default outer left cell spacing"/>
<field type="short" size="2" name="wCellSpacingOuterBottom" description="Default outer bottom cell spacing"/>
<field type="short" size="2" name="wCellSpacingOuterRight" description="Default outer right cell spacing"/>
<!-- mpibrcftsCellSpacingOuter[cbrcTc]; Array of default outer cell spacing units. Index into
the next four properties. -->
@ -224,9 +231,10 @@
<!-- TODO: rsid -->
<!-- TODO: tcDefault -->
<field type="int" size="1" name="cHorzBands"
<field type="short" size="1" name="cHorzBands"
description="Size of each horizontal style band, in number of rows"/>
<field type="int" size="1" name="cVertBands" description="Size of a vertical style band, in number of columns"/>
<field type="short" size="1" name="cVertBands"
description="Size of a vertical style band, in number of columns"/>
<field type="BorderCode" size="8" name="rgbrcInsideDefault_0"
description="Border definition for inside horizontal borders"/>

View File

@ -0,0 +1,49 @@
<?xml version="1.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.
====================================================================
-->
<record fromfile="true" name="TLP" package="org.apache.poi.hwpf.model.types">
<suffix>AbstractType</suffix>
<extends>HDFType</extends>
<description>Table Autoformat Look sPecifier (TLP). &lt;p&gt;Class and fields descriptions are
quoted from Microsoft Office Word 97-2007 Binary File Format
</description>
<author>Sergey Vladimirov; according to Microsoft Office Word 97-2007 Binary File Format
Specification [*.doc]
</author>
<fields>
<field type="short" size="2" name="itl"
description="Index to Words table of table looks (see itl table below)"/>
<field type="byte" size="1" name="tlp_flags">
<bit number="0" mask="0x0001" name="fBorders"
description="When == 1, use the border properties from the selected table look"/>
<bit number="1" mask="0x0002" name="fShading"
description="When == 1, use the shading properties from the selected table look"/>
<bit number="2" mask="0x0004" name="fFont"
description="When == 1, use the font from the selected table look"/>
<bit number="3" mask="0x0008" name="fColor"
description="When == 1, use the color from the selected table look"/>
<bit number="4" mask="0x0010" name="fBestFit"
description="When == 1, do best fit from the selected table look"/>
<bit number="5" mask="0x0020" name="fHdrRows"
description="When == 1, apply properties from the selected table look to the header rows in the table"/>
<bit number="6" mask="0x0040" name="fLastRow"
description="When == 1, apply properties from the selected table look to the last row in the table"/>
</field>
</fields>
</record>