/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef W1STRUCT_HXX
#define W1STRUCT_HXX

// star view
#include <string.h>
#include <tools/solar.h>

class Ww1Shell;
class Ww1Manager;

struct W1_FIB /////////////////////////////////////////////////////////
{
	SVBT16 wIdent;// 0x0 int magic number
	sal_uInt16 wIdentGet() {
		return SVBT16ToShort(wIdent); }
	SVBT16 nFib;// 0x2 FIB version written
	sal_uInt16 nFibGet() {
		return SVBT16ToShort(nFib); }
	SVBT16 nProduct;// 0x4 product version written by
	sal_uInt16 nProductGet() {
		return SVBT16ToShort(nProduct); }
	SVBT16 nlocale;// 0x6 language stamp---localized version;
	sal_uInt16 nlocaleGet() {
		return SVBT16ToShort(nlocale); }
	SVBT16 pnNext;// 0x8
	sal_uInt16 pnNextGet() {
		return SVBT16ToShort(pnNext); }
	SVBT16 fFlags;
	sal_uInt16 fFlagsGet() {
		return SVBT16ToShort(fFlags); }
	// SVBT16 fDot :1;// 0xa	0001
	sal_Bool fDotGet() {
		return 0 != ((fFlagsGet() >> 0) & 1); }
	// SVBT16 fGlsy :1;//		0002
	sal_Bool fGlsyGet() {
		return 0 != ((fFlagsGet() >> 1) & 1); }
	// SVBT16 fComplex :1;//		0004 when 1, file is in complex, fast-saved format.
	sal_Bool fComplexGet() {
		return 0 != ((fFlagsGet() >> 2) & 1); }
	// SVBT16 fHasPic :1;//		0008 file contains 1 or more pictures
	sal_Bool fHasPicGet() {
		return 0 != ((fFlagsGet() >> 3) & 1); }
	// SVBT16 cQuickSaves :4;//		00F0 count of times file was quicksaved
	sal_uInt16 cQuickSavesGet() {
		return (sal_uInt16)((fFlagsGet() >> 4) & 0xf); }
	// SVBT16 u1 :8;//		FF00 unused
	sal_uInt16 u1Get() {
		return (sal_uInt16)((fFlagsGet() >> 8) & 0xff); }
	SVBT16 nFibBack;// 0xc
	sal_uInt16 nFibBackGet() {
		return SVBT16ToShort(nFibBack); }
	SVBT16 u2[5];// 0xe reserved
	SVBT32 fcMin;// 0x18 file offset of first character of text
	sal_uLong fcMinGet() {
		return SVBT32ToUInt32(fcMin); }
	SVBT32 fcMac;// 0x1c file offset of last character of text + 1
	sal_uLong fcMacGet() {
		return SVBT32ToUInt32(fcMac); }
	SVBT32 cbMac;// 0x20 file offset of last byte written to file + 1.
	sal_uLong cbMacGet() {
		return SVBT32ToUInt32(cbMac); }
	SVBT32 u4[4];// 0x24 reserved
	SVBT32 ccpText;// 0x34 length of main document text stream
	sal_uLong ccpTextGet() {
		return SVBT32ToUInt32(ccpText); }
	SVBT32 ccpFtn;// 0x38 length of footnote subdocument text stream
	sal_uLong ccpFtnGet() {
		return SVBT32ToUInt32(ccpFtn); }
	SVBT32 ccpHdd;// 0x3c length of header subdocument text stream
	sal_uLong ccpHddGet() {
		return SVBT32ToUInt32(ccpHdd); }
	SVBT32 ccpMcr;// 0x40 length of macro subdocument text stream
	sal_uLong ccpMcrGet() {
		return SVBT32ToUInt32(ccpMcr); }
	SVBT32 ccpAtn;// 0x44 length of annotation subdocument text stream
	sal_uLong ccpAtnGet() {
		return SVBT32ToUInt32(ccpAtn); }
	SVBT32 cp5[4];// 0x48
	SVBT32 fcStshfOrig;// 0x58 file offset of original allocation for STSH in file
	sal_uLong fcStshfOrigGet() {
		return SVBT32ToUInt32(fcStshfOrig); }
	SVBT16 cbStshfOrig;// 0x5c count of bytes of original STSH allocation
	sal_uInt16 cbStshfOrigGet() {
		return SVBT16ToShort(cbStshfOrig); }
	SVBT32 fcStshf;// 0x5e file offset of STSH in file.
	sal_uLong fcStshfGet() {
		return SVBT32ToUInt32(fcStshf); }
	SVBT16 cbStshf;// 0x62 count of bytes of current STSH allocation
	sal_uInt16 cbStshfGet() {
		return SVBT16ToShort(cbStshf); }
	SVBT32 fcPlcffndRef;// 0x64 file offset of footnote reference PLC.
	sal_uLong fcPlcffndRefGet() {
		return SVBT32ToUInt32(fcPlcffndRef); }
	SVBT16 cbPlcffndRef;// 0x68 count of bytes of footnote reference PLC
	sal_uInt16 cbPlcffndRefGet() {
		return SVBT16ToShort(cbPlcffndRef); }
							// == 0 if no footnotes defined in document.

	SVBT32 fcPlcffndTxt;// 0x6a file offset of footnote text PLC.
	sal_uLong fcPlcffndTxtGet() {
		return SVBT32ToUInt32(fcPlcffndTxt); }
	SVBT16 cbPlcffndTxt;// 0x6e count of bytes of footnote text PLC.
	sal_uInt16 cbPlcffndTxtGet() {
		return SVBT16ToShort(cbPlcffndTxt); }
							// == 0 if no footnotes defined in document

	SVBT32 fcPlcfandRef;// 0x70 file offset of annotation reference PLC.
	sal_uLong fcPlcfandRefGet() {
		return SVBT32ToUInt32(fcPlcfandRef); }
	SVBT16 cbPlcfandRef;// 0x74 count of bytes of annotation reference PLC.
	sal_uInt16 cbPlcfandRefGet() {
		return SVBT16ToShort(cbPlcfandRef); }

	SVBT32 fcPlcfandTxt;// 0x76 file offset of annotation text PLC.
	sal_uLong fcPlcfandTxtGet() {
		return SVBT32ToUInt32(fcPlcfandTxt); }
	SVBT16 cbPlcfandTxt;// 0x7a count of bytes of the annotation text PLC
	sal_uInt16 cbPlcfandTxtGet() {
		return SVBT16ToShort(cbPlcfandTxt); }

	SVBT32 fcPlcfsed;// 8x7c file offset of section descriptor PLC.
	sal_uLong fcPlcfsedGet() {
		return SVBT32ToUInt32(fcPlcfsed); }
	SVBT16 cbPlcfsed;// 0x80 count of bytes of section descriptor PLC.
	sal_uInt16 cbPlcfsedGet() {
		return SVBT16ToShort(cbPlcfsed); }

	SVBT32 fcPlcfpgd;// 0x82 file offset of paragraph descriptor PLC
	sal_uLong fcPlcfpgdGet() {
		return SVBT32ToUInt32(fcPlcfpgd); }
	SVBT16 cbPlcfpgd;// 0x86 count of bytes of paragraph descriptor PLC.
	sal_uInt16 cbPlcfpgdGet() {
		return SVBT16ToShort(cbPlcfpgd); }
							// ==0 if file was never repaginated
							// Should not be written by third party creators

	SVBT32 fcPlcfphe;// 0x88 file offset of PLC of paragraph heights.
	sal_uLong fcPlcfpheGet() {
		return SVBT32ToUInt32(fcPlcfphe); }
	SVBT16 cbPlcfphe;// 0x8c count of bytes of paragraph height PLC.
	sal_uInt16 cbPlcfpheGet() {
		return SVBT16ToShort(cbPlcfphe); }
							// ==0 when file is non-complex.

	SVBT32 fcSttbfglsy;// 0x8e file offset of glossary string table.
	sal_uLong fcSttbfglsyGet() {
		return SVBT32ToUInt32(fcSttbfglsy); }
	SVBT16 cbSttbfglsy;// 0x92 count of bytes of glossary string table.
	sal_uInt16 cbSttbfglsyGet() {
		return SVBT16ToShort(cbSttbfglsy); }
							// == 0 for non-glossary documents.
							// !=0 for glossary documents.

	SVBT32 fcPlcfglsy;// 0x94 file offset of glossary PLC.
	sal_uLong fcPlcfglsyGet() {
		return SVBT32ToUInt32(fcPlcfglsy); }
	SVBT16 cbPlcfglsy;// 0x98 count of bytes of glossary PLC.
	sal_uInt16 cbPlcfglsyGet() {
		return SVBT16ToShort(cbPlcfglsy); }
							// == 0 for non-glossary documents.
							// !=0 for glossary documents.

	SVBT32 fcPlcfhdd;// 0x9a byte offset of header PLC.
	sal_uLong fcPlcfhddGet() {
		return SVBT32ToUInt32(fcPlcfhdd); }
	SVBT16 cbPlcfhdd;// 0x9e count of bytes of header PLC.
	sal_uInt16 cbPlcfhddGet() {
		return SVBT16ToShort(cbPlcfhdd); }
							// == 0 if document contains no headers

	SVBT32 fcPlcfbteChpx;// 0xa0 file offset of character property bin table.PLC.
	sal_uLong fcPlcfbteChpxGet() {
		return SVBT32ToUInt32(fcPlcfbteChpx); }
	SVBT16 cbPlcfbteChpx;// 0xa4 count of bytes of character property bin table PLC.
	sal_uInt16 cbPlcfbteChpxGet() {
		return SVBT16ToShort(cbPlcfbteChpx); }

	SVBT32 fcPlcfbtePapx;// 0xa6 file offset of paragraph property bin table.PLC.
	sal_uLong fcPlcfbtePapxGet() {
		return SVBT32ToUInt32(fcPlcfbtePapx); }
	SVBT16 cbPlcfbtePapx;// 0xaa count of bytes of paragraph property bin table PLC.
	sal_uInt16 cbPlcfbtePapxGet() {
		return SVBT16ToShort(cbPlcfbtePapx); }

	SVBT32 fcPlcfsea;// 0xac file offset of PLC reserved for private use. The SEA is 6 bytes long.
	sal_uLong fcPlcfseaGet() {
		return SVBT32ToUInt32(fcPlcfsea); }
	SVBT16 cbPlcfsea;// 0xb0	count of bytes of private use PLC.
	sal_uInt16 cbPlcfseaGet() {
		return SVBT16ToShort(cbPlcfsea); }

	SVBT32 fcSttbfffn;// 0xb2	file offset of font information STTBF. See the FFN file structure definition.
	sal_uLong fcSttbfffnGet() {
		return SVBT32ToUInt32(fcSttbfffn); }
	SVBT16 cbSttbfffn;// 0xb6	count of bytes in sttbfffn.
	sal_uInt16 cbSttbfffnGet() {
		return SVBT16ToShort(cbSttbfffn); }

	SVBT32 fcPlcffldMom;// 0xb8	offset in doc stream to the PLC of field positions in the main document.
	sal_uLong fcPlcffldMomGet() {
		return SVBT32ToUInt32(fcPlcffldMom); }
	SVBT16 cbPlcffldMom;// 0xbc
	sal_uInt16 cbPlcffldMomGet() {
		return SVBT16ToShort(cbPlcffldMom); }

	SVBT32 fcPlcffldHdr;// 0xbe	offset in doc stream to the PLC of field positions in the header subdocument.
	sal_uLong fcPlcffldHdrGet() {
		return SVBT32ToUInt32(fcPlcffldHdr); }
	SVBT16 cbPlcffldHdr;// 0xc2
	sal_uInt16 cbPlcffldHdrGet() {
		return SVBT16ToShort(cbPlcffldHdr); }

	SVBT32 fcPlcffldFtn;// 0xc4	offset in doc stream to the PLC of field positions in the footnote subdocument.
	sal_uLong fcPlcffldFtnGet() {
		return SVBT32ToUInt32(fcPlcffldFtn); }
	SVBT16 cbPlcffldFtn;// 0xc8
	sal_uInt16 cbPlcffldFtnGet() {
		return SVBT16ToShort(cbPlcffldFtn); }

	SVBT32 fcPlcffldAtn;// 0xca	offset in doc stream to the PLC of field positions in the annotation subdocument.
	sal_uLong fcPlcffldAtnGet() {
		return SVBT32ToUInt32(fcPlcffldAtn); }
	SVBT16 cbPlcffldAtn;// 0xce
	sal_uInt16 cbPlcffldAtnGet() {
		return SVBT16ToShort(cbPlcffldAtn); }

	SVBT32 fcPlcffldMcr;// 0xd0	offset in doc stream to the PLC of field positions in the macro subdocument.
	sal_uLong fcPlcffldMcrGet() {
		return SVBT32ToUInt32(fcPlcffldMcr); }
	SVBT16 cbPlcffldMcr;// 0xd4
	sal_uInt16 cbPlcffldMcrGet() {
		return SVBT16ToShort(cbPlcffldMcr); }

	SVBT32 fcSttbfbkmk;// 0xd6 offset in document stream of the STTBF that records bookmark names in the main document
	sal_uLong fcSttbfbkmkGet() {
		return SVBT32ToUInt32(fcSttbfbkmk); }
	SVBT16 cbSttbfbkmk;// 0xda
	sal_uInt16 cbSttbfbkmkGet() {
		return SVBT16ToShort(cbSttbfbkmk); }

	SVBT32 fcPlcfbkf;// 0xdc offset in document stream of the PLCF that records the beginning CP offsets of bookmarks in the main document. See BKF
	sal_uLong fcPlcfbkfGet() {
		return SVBT32ToUInt32(fcPlcfbkf); }
	SVBT16 cbPlcfbkf;// 0xe0
	sal_uInt16 cbPlcfbkfGet() {
		return SVBT16ToShort(cbPlcfbkf); }

	SVBT32 fcPlcfbkl;// 0xe2 offset in document stream of the PLCF that records the ending CP offsets of bookmarks recorded in the main document. See the BKL structure definition.
	sal_uLong fcPlcfbklGet() {
		return SVBT32ToUInt32(fcPlcfbkl); }
	SVBT16 cbPlcfbkl;// 0xe6 SVBT16
	sal_uInt16 cbPlcfbklGet() {
		return SVBT16ToShort(cbPlcfbkl); }

	SVBT32 fcCmds;// 0xe8 FC
	sal_uLong fcCmdsGet() {
		return SVBT32ToUInt32(fcCmds); }
	SVBT16 cbCmds;// 0xec
	sal_uInt16 cbCmdsGet() {
		return SVBT16ToShort(cbCmds); }

	SVBT32 fcPlcmcr;// 0xee FC
	sal_uLong fcPlcmcrGet() {
		return SVBT32ToUInt32(fcPlcmcr); }
	SVBT16 cbPlcmcr;// 0xf2
	sal_uInt16 cbPlcmcrGet() {
		return SVBT16ToShort(cbPlcmcr); }

	SVBT32 fcSttbfmcr;// 0xf4 FC
	sal_uLong fcSttbfmcrGet() {
		return SVBT32ToUInt32(fcSttbfmcr); }
	SVBT16 cbSttbfmcr;// 0xf8
	sal_uInt16 cbSttbfmcrGet() {
		return SVBT16ToShort(cbSttbfmcr); }

	SVBT32 fcPrEnv;// 0xfa
	sal_uLong fcPrEnvGet() {
		return SVBT32ToUInt32(fcPrEnv); }
	SVBT16 cbPrEnv;// 0xfe
	sal_uInt16 cbPrEnvGet() {
		return SVBT16ToShort(cbPrEnv); }

	SVBT32 fcWss;// 0x100 file offset of Window Save State data structure. See WSS.
	sal_uLong fcWssGet() {
		return SVBT32ToUInt32(fcWss); }
	SVBT16 cbWss;// 0x100 count of bytes of WSS. ==0 if unable to store the window state.
	sal_uInt16 cbWssGet() {
		return SVBT16ToShort(cbWss); }

	SVBT32 fcDop;// 0x106 file offset of document property data structure.
	sal_uLong fcDopGet() {
		return SVBT32ToUInt32(fcDop); }
	SVBT16 cbDop;// 0x10a count of bytes of document properties.
	sal_uInt16 cbDopGet() {
		return SVBT16ToShort(cbDop); }


	SVBT32 fcSttbfAssoc;// 0x10c offset to STTBF of associated strings. See STTBFASSOC.
	sal_uLong fcSttbfAssocGet() {
		return SVBT32ToUInt32(fcSttbfAssoc); }
	SVBT16 cbSttbfAssoc;// 0x110
	sal_uInt16 cbSttbfAssocGet() {
		return SVBT16ToShort(cbSttbfAssoc); }

	SVBT32 fcClx;// 0x112 file offset of beginning of information for complex files.
	sal_uLong fcClxGet() {
		return SVBT32ToUInt32(fcClx); }
	SVBT16 cbClx;// 0x116 count of bytes of complex file information. 0 if file is non-complex.
	sal_uInt16 cbClxGet() {
		return SVBT16ToShort(cbClx); }

	SVBT32 fcPlcfpgdFtn;// 0x118 file offset of page descriptor PLC for footnote subdocument.
	sal_uLong fcPlcfpgdFtnGet() {
		return SVBT32ToUInt32(fcPlcfpgdFtn); }
	SVBT16 cbPlcfpgdFtn;// 0x11C count of bytes of page descriptor PLC for footnote subdocument.
	sal_uInt16 cbPlcfpgdFtnGet() {
		return SVBT16ToShort(cbPlcfpgdFtn); }
							// ==0 if document has not been paginated. The length of the PGD is 8 bytes.

	SVBT32 fcSpare1;// 0x11e file offset of the name of the original file.
	sal_uLong fcSpare1Get() {
		return SVBT32ToUInt32(fcSpare1); }
	SVBT16 cbSpare1;// 0x122 count of bytes of the name of the original file.
	sal_uInt16 cbSpare1Get() {
		return SVBT16ToShort(cbSpare1); }
	SVBT32 fcSpare2;// 0x124 file offset of the name of the original file.
	sal_uLong fcSpare2Get() {
		return SVBT32ToUInt32(fcSpare2); }
	SVBT16 cbSpare2;// 0x128 count of bytes of the name of the original file.
	sal_uInt16 cbSpare2Get() {
		return SVBT16ToShort(cbSpare2); }
	SVBT32 fcSpare3;// 0x12a file offset of the name of the original file.
	sal_uLong fcSpare3Get() {
		return SVBT32ToUInt32(fcSpare3); }
	SVBT16 cbSpare3;// 0x12e count of bytes of the name of the original file.
	sal_uInt16 cbSpare3Get() {
		return SVBT16ToShort(cbSpare3); }
	SVBT32 fcSpare4;// 0x130 file offset of the name of the original file.
	sal_uLong fcSpare4Get() {
		return SVBT32ToUInt32(fcSpare4); }
	SVBT16 cbSpare4;// 0x134 count of bytes of the name of the original file.
	sal_uInt16 cbSpare4Get() {
		return SVBT16ToShort(cbSpare4); }

	SVBT16 cpnBteChp;// 0x18E count of CHPX FKPs recorded in file. In non-complex files if the number of
	sal_uInt16 cpnBteChpGet() {
		return SVBT16ToShort(cpnBteChp); }
							// entries in the plcfbteChpx is less than this, the plcfbteChpx is incomplete.
	SVBT16 cpnBtePap;// 0x190 count of PAPX FKPs recorded in file. In non-complex files if the number of
	sal_uInt16 cpnBtePapGet() {
		return SVBT16ToShort(cpnBtePap); }
							// entries in the plcfbtePapx is less than this, the plcfbtePapx is incomplete.
};

struct W1_DOP ///////////////////////////////////// Document Properties
{
	SVBT16 fFlags;
	sal_uInt16 fFlagsGet() {
		return SVBT16ToShort(fFlags); }
	// SVBT16 fFacingPages : 1;// 1 when facing pages should be printed
	sal_Bool fFacingPagesGet() {
		return 0 != ((fFlagsGet() >> 0) & 1); }
	// SVBT16 fWidowControl : 1;// 1 when widow control is in effect. 0 when widow control disabled.
	sal_Bool fWidowControlGet() {
		return 0 != ((fFlagsGet() >> 1) & 1); }
	// SVBT16 : 3;// unused
	// SVBT16 fpc : 2;// 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
	sal_uInt16 fpcGet() {
		return (sal_uInt16)((fFlagsGet() >> 5) & 3); }
	// SVBT16 fWide : 1;// Landscape
	sal_Bool fWideGet() {
		return 0 != ((fFlagsGet() >> 7) & 1); }
	// SVBT16 grpfIhdt : 8;// 0 specification of document headers and footers. See explanation under Headers and Footers topic.
	sal_uInt16 grpfIhdtGet() {
		return (sal_uInt16)((fFlagsGet() >> 8) & 0xff); }
	SVBT16 fFtnFlags;
	sal_uInt16 fFtnFlagsGet() {
		return SVBT16ToShort(fFtnFlags); }
	// SVBT16 fFtnRestart : 1;
	sal_Bool fFtnRestartGet() {
		return 0 != ((fFtnFlagsGet() >> 0) & 1); }
	// SVBT16 nFtn : 15;// 1 initial footnote number for document
	sal_uInt16 nFtnGet() {
		return (sal_uInt16)((fFtnFlagsGet() >> 1) & 0x7fff); }
	SVBT16 fRvsFlags;
	sal_uInt16 fRvsFlagsGet() {
		return SVBT16ToShort(fRvsFlags); }
	// SVBT16 irmBar : 8;
	sal_uInt16 irmBarGet() {
		return (sal_uInt16)((fRvsFlagsGet() >> 0) & 0xff); }
	// SVBT16 irmProps : 7;
	sal_uInt16 irmPropsGet() {
		return (sal_uInt16)((fRvsFlagsGet() >> 8) & 0x7f); }
	// SVBT16 fRevMarking	: 1;//	 when 1, Word will mark revisions as the document is edited
	sal_Bool fRevMarkingGet() {
		return 0 != ((fRvsFlagsGet() >> 15) & 1); }
	SVBT16 fSveFlags;
	sal_uInt16 fSveFlagsGet() {
		return SVBT16ToShort(fSveFlags); }
	// SVBT16 fBackup : 1;//	 always make backup when document saved when 1.
	sal_Bool fBackupGet() {
		return 0 != ((fSveFlagsGet() >> 0) & 1); }
	// SVBT16 fExactCWords : 1;
	sal_Bool fExactCWordsGet() {
		return 0 != ((fSveFlagsGet() >> 1) & 1); }
	// SVBT16 fPagHidden : 1;//
	sal_Bool fPagHiddenGet() {
		return 0 != ((fSveFlagsGet() >> 2) & 1); }
	// SVBT16 fPagResults : 1;
	sal_Bool fPagResultsGet() {
		return 0 != ((fSveFlagsGet() >> 3) & 1); }
	// SVBT16 fLockAtn : 1;//	 when 1, annotations are locked for editing
	sal_Bool fLockAtnGet() {
		return 0 != ((fSveFlagsGet() >> 4) & 1); }
	// SVBT16 fMirrorMargins : 1;//	 swap margins on left/right pages when 1.
	sal_Bool fMirrorMarginsGet() {
		return 0 != ((fSveFlagsGet() >> 5) & 1); }
	// SVBT16 : 10;// unused
	SVBT16 fSpares;
	sal_uInt16 fSparesGet() {
		return SVBT16ToShort(fSpares); }
	SVBT16 yaPage;
	sal_uInt16 yaPageGet() {
		return SVBT16ToShort(yaPage); }
	SVBT16 xaPage;
	sal_uInt16 xaPageGet() {
		return SVBT16ToShort(xaPage); }
	SVBT16 dyaTop;
	sal_uInt16 dyaTopGet() {
		return SVBT16ToShort(dyaTop); }
	SVBT16 dxaLeft;
	sal_uInt16 dxaLeftGet() {
		return SVBT16ToShort(dxaLeft); }
	SVBT16 dyaBottom;
	sal_uInt16 dyaBottomGet() {
		return SVBT16ToShort(dyaBottom); }
	SVBT16 dxaRight;
	sal_uInt16 dxaRightGet() {
		return SVBT16ToShort(dxaRight); }
	SVBT16 dxaGutter;
	sal_uInt16 dxaGutterGet() {
		return SVBT16ToShort(dxaGutter); }
	SVBT16	dxaTab;// 720 twips	default tab width
	sal_uInt16 dxaTabGet() {
		return SVBT16ToShort(dxaTab); }
	SVBT16	wSpare;//
	sal_uInt16 wSpareGet() {
		return SVBT16ToShort(wSpare); }
	SVBT16	dxaHotZ;// width of hyphenation hot zone measured in twips
	sal_uInt16 dxaHotZGet() {
		return SVBT16ToShort(dxaHotZ); }
	SVBT16	rgwSpare[2];// reserved
	SVBT32	dttmCreated;// DTTM date and time document was created
	sal_uLong dttmCreatedGet() {
		return SVBT32ToUInt32(dttmCreated); }
	SVBT32	dttmRevised;// DTTM date and time document was last revised
	sal_uLong dttmRevisedGet() {
		return SVBT32ToUInt32(dttmRevised); }
	SVBT32	dttmLastPrint;// DTTM date and time document was last printed
	sal_uLong dttmLastPrintGet() {
		return SVBT32ToUInt32(dttmLastPrint); }
	SVBT16	nRevision;// number of times document has been revised since its creation
	sal_uInt16 nRevisionGet() {
		return SVBT16ToShort(nRevision); }
	SVBT32	tmEdited;// time document was last edited
	sal_uLong tmEditedGet() {
		return SVBT32ToUInt32(tmEdited); }
	SVBT32	cWords;// count of words tallied by last Word Count execution
	sal_uLong cWordsGet() {
		return SVBT32ToUInt32(cWords); }
	SVBT32	cCh;// count of characters tallied by last Word Count execution
	sal_uLong cChGet() {
		return SVBT32ToUInt32(cCh); }
	SVBT16	cPg;// count of pages tallied by last Word Count execution
	sal_uInt16 cPgGet() {
		return SVBT16ToShort(cPg); }
	SVBT16	rgwSpareDocSum[2];
};
// cbDOP is 66.

struct W1_CHP /////////////////////////////////////////////////////////
{
	SVBT16	fChar;
	SVBT16	ftc;// Font Code
	SVBT8	hps;// Font size in half points
	SVBT8	hpsPos;// Sub/Superscript ( signed number, 0 = normal )
	SVBT16	fText;
	SVBT32	fcPic;// not stored in File
	SVBT8	fnPic;// internal
	SVBT16	hpsLargeChp;// ???

	W1_CHP() { memset( this, 0, sizeof( *this)); }

	sal_uInt16 fCharGet() 		{ return SVBT16ToShort(fChar); }
	void fCharSet(sal_uInt16 n) { ShortToSVBT16(n, fChar); }
	sal_Bool fBoldGet() 		{ return 0 != ((fCharGet() >> 0) & 1); }
	void fBoldSet(sal_Bool b) 	{ fCharSet( ( fCharGet() & 0xfffe ) | ( b << 0 ) ); }
	sal_Bool fItalicGet() 		{ return 0 != ((fCharGet() >> 1) & 1); }
	void fItalicSet(sal_Bool b) { fCharSet( ( fCharGet() & 0xfffd ) | ( b << 1 ) ); }
	sal_Bool fStrikeGet() 		{ return 0 != ((fCharGet() >> 2) & 1); }
	sal_Bool fOutlineGet() 		{ return 0 != ((fCharGet() >> 3) & 1); }
	sal_Bool fFldVanishGet() 	{ return 0 != ((fCharGet() >> 4) & 1); }
	sal_Bool fSmallCapsGet() 	{ return 0 != ((fCharGet() >> 5) & 1); }
	sal_Bool fCapsGet() 		{ return 0 != ((fCharGet() >> 6) & 1); }
	sal_Bool fVanishGet() 		{ return 0 != ((fCharGet() >> 7) & 1); }
	sal_Bool fRMarkGet() 		{ return 0 != ((fCharGet() >> 8) & 1); }
	sal_Bool fSpecGet() 		{ return 0 != ((fCharGet() >> 9) & 1); }
	sal_Bool fsIcoGet() 		{ return 0 != ((fCharGet() >> 10) & 1); }
	sal_Bool fsFtcGet() 		{ return 0 != ((fCharGet() >> 11) & 1); }
	void fsFtcSet(sal_Bool b) 	{ fCharSet( ( fCharGet() & 0xf7ff ) | ( b << 11 ) ); }
	sal_Bool fsHpsGet() 		{ return 0 != ((fCharGet() >> 12) & 1); }
	void fsHpsSet(sal_Bool b) 	{ fCharSet( ( fCharGet() & 0xefff ) | ( b << 12 ) ); }
	sal_Bool fsKulGet() 		{ return 0 != ((fCharGet() >> 13) & 1); }
	void fsKulSet(sal_Bool b) 	{ fCharSet( ( fCharGet() & 0xdfff ) | ( b << 13 ) ); }
	sal_Bool fsPosGet() 		{ return 0 != ((fCharGet() >> 14) & 1); }
	sal_Bool fsSpaceGet() 		{ return 0 != ((fCharGet() >> 15) & 1); }
	// SVBT16 fBold :1;// 1 == opposite boldness of style
	// SVBT16 fItalic :1;// 1 == opposite of style
	// SVBT16 fStrike :1;// 1 == opposite of style
	// SVBT16 fOutline :1;// 1 == opposite of style
	// SVBT16 fFldVanish :1;// 1 == opposite of style
	// SVBT16 fSmallCaps :1;// 1 == opposite of style
	// SVBT16 fCaps :1;// 1 == opposite of style
	// SVBT16 fVanish :1;// 1 == opposite of style
	// SVBT16 fRMark :1;// ???
	// SVBT16 fSpec :1;// 1 == opposite of style
	// SVBT16 fsIco :1;// 1 == Color (ico) different to style
	// SVBT16 fsFtc :1;// 1 == FontCode (ftc) different to style
	// SVBT16 fsHps :1;// 1 == FontSize (hps) different to style
	// SVBT16 fsKul :1;// 1 == Underline Code (kul) different to style
	// SVBT16 fsPos :1;// 1 == Char position (hpsPos) different to style
	// SVBT16 fsSpace :1;// 1 == Char Spacing (qpsSpace) different to style

	sal_uInt16 ftcGet() 		{ return SVBT16ToShort(ftc); }
	void ftcSet(sal_uInt16 n) 	{ ShortToSVBT16(n, ftc); }
	void hpsSet(sal_uInt8 n) 	{ ByteToSVBT8(n, hps); }
	sal_uInt8 hpsGet() 			{ return SVBT8ToByte(hps); }

	sal_uInt8 hpsPosGet() 		{ return SVBT8ToByte(hpsPos); }
	sal_uInt16 fTextGet() 		{ return SVBT16ToShort(fText); }
	void fTextSet(sal_uInt16 n) { ShortToSVBT16(n, fText); }
	sal_uInt16 qpsSpaceGet() 	{ return (sal_uInt16)((fTextGet() >> 0) & 0x3f); }
	sal_uInt16 wSpare2Get() 	{ return (sal_uInt16)((fTextGet() >> 6) & 3); }
	sal_uInt16 icoGet() 		{ return (sal_uInt16)((fTextGet() >> 8) & 0xf); }
	sal_uInt16 kulGet() 		{ return (sal_uInt16)((fTextGet() >> 12) & 7); }
	void kulSet(sal_uInt16 n) 	{ fTextSet( ( fTextGet() & 0x8fff ) | ( ( n & 7 ) << 12 ) ); }
	sal_Bool fSysVanishGet() 	{ return 0 != ((fTextGet() >> 15) & 1); }
	// SVBT16 qpsSpace :6;// Char Spacing, -7 .. 56; 57 = -7, 63 = -1
	// SVBT16 wSpare2 : 2;// reserved
	// SVBT16 ico :4;// color of Text: 0=black, 1=blue, 2=cyan, 3=green, 4=magenta, 5=red, 6=yellow, 7=white
	// SVBT16 kul: 3;// Underline code: 0=none, 1=single, 2=by word, 3=double, 4=dotted
	// SVBT16 fSysVanish: 1;// used internally

	sal_uLong fcPicGet() 		{ return SVBT32ToUInt32(fcPic); }
	sal_uInt16 fnPicGet() 		{ return SVBT8ToByte(fnPic); }
	sal_uInt16 hpsLargeChpGet() { return SVBT16ToShort(hpsLargeChp); }

	void Out(Ww1Shell&, Ww1Manager&);
};

struct W1_FFN ///////////////////////////////////////// Font Descriptor
{
	SVBT8 cbFfnM1;// 0x0 	total length of FFN - 1.
	sal_uInt16 cbFfnM1Get() {
		return SVBT8ToByte(cbFfnM1); }
	SVBT8 fFlags;
	sal_uInt16 fFlagsGet() {
		return SVBT8ToByte(fFlags); }
	// SVBT8 prg : 2;//	0x1:03	pitch request
	sal_uInt16 prgGet() {
		return (sal_uInt16)((fFlagsGet() >> 0) & 3); }
	// SVBT8 fTrueType : 1;//	0x1:04	when 1, font is a TrueType font
	sal_Bool fTrueTypeGet() {
		return 0 != ((fFlagsGet() >> 2) & 1); }
	// SVBT8 : 1;//	0x1:08	reserved
	// SVBT8 ff : 3;//	0x1:70	font family id
	sal_uInt16 ffGet() {
		return (sal_uInt16)((fFlagsGet() >> 4) & 7); }
	// SVBT8 : 1;//	0x1:80	reserved
	sal_uInt8 szFfn[65];// 0x6		zero terminated string that records name of font.
							// Vorsicht: Dieses Array kann auch kleiner sein!!!
							// Possibly followed by a second sz which records the name of an
							// alternate font to use if the first named font does not exist
							// on this system. Maximal size of szFfn is 65 characters.
	sal_uInt8* szFfnGet() { return szFfn; }
};

struct W1_PHE /////////////////////////////////////// Paragraph Height
{
	SVBT16 fFlags;
	sal_uInt16 fFlagsGet() {
		return SVBT16ToShort(fFlags); }
	sal_Bool fSpareGet() {
		return 0 != (fFlagsGet() & 1); }
	sal_Bool fUnkGet() {
		return 0 != ((fFlagsGet() >> 1) & 1); }
	sal_Bool fDiffLinesGet() {
		return 0 != ((fFlagsGet() >> 2) & 1); }
	sal_uInt8 clMacGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((fFlagsGet() >> 8) & 0xff); }
	SVBT16 dxaCol;
	sal_uInt16 dxaColGet() {
		return SVBT16ToShort(dxaCol); }
	SVBT16 xxx; // beachte die dreifachnutzung.... siehe doc.
	sal_uInt16 dylHeightGet() {
		return SVBT16ToShort(xxx); }
	sal_uInt16 dylLineGet() {
		return SVBT16ToShort(xxx); }
	sal_uInt16 fStyleDirtyGet() {
		return SVBT16ToShort(xxx); }
};

struct W1_PAPX ///////////////////////// Paragraph Property Difference
{
	SVBT8 stc;
	sal_uInt8 stcGet() {
		return SVBT8ToByte(stc); }
	W1_PHE phe;
	sal_uInt8 grpprl[1];
	sal_uInt8* grpprlGet() {
		return grpprl; }
};

struct W1_BRC //////////////////////////////////////////// Border Code
{
	SVBT16 aBits;
	sal_uInt16 aBitsGet() {
		return SVBT16ToShort(aBits); }
	// SVBT16 dxpLineWidth : 3;// 0007 When dxpLineWidth is 0, 1, 2, 3, 4, or 5,
								// this field is the width of a single line of border
								// in units of 0.75 points Must be nonzero when brcType
								// is nonzero. 6 == dotted, 7 == dashed.
	sal_uInt8 dxpLineWidthGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 0) & 0x0007); }
	// SVBT16 brcType : 2;// 0018 border type code: 0 == none, 1 == single, 2 == thick,
							// 3 == double
	sal_uInt8 brcTypeGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 3) & 0x0003); }
	// SVBT16 fShadow : 1;// 0020	when 1, border is drawn with shadow. Must be 0
							// when BRC is a substructure of the TC
	sal_uInt8 fShadowGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 5) & 0x0001); }
	// SVBT16 ico : 5;// 07C0 color code (see chp.ico)
	sal_uInt8 icoGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 6) & 0x001f); }
	// SVBT16 dxpSpace : 5;// F800	width of space to maintain between border and
								// text within border. Must be 0 when BRC is a
								// substructure of the TC. Stored in points for Windows.
	sal_uInt8 dxpSpaceGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 11) & 0x001f); }
};

struct W1_BRC10 ///////////////////////////////// Border Code Word 1.0
{
	SVBT16 aBits;
	sal_uInt16 aBitsGet() {
		return SVBT16ToShort(aBits); }
	sal_uInt8 dxpLine2WidthGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 0) & 0x0007); }
	sal_uInt8 dxpSpaceBetweenGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 3) & 0x0007); }
	sal_uInt8 dxpLine1WidthGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 6) & 0x0007); }
	sal_uInt8 dxpSpaceGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 9) & 0x001f); }
	sal_uInt8 fShadowGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 14) & 0x0001); }
	sal_uInt8 fSpareGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((aBitsGet() >> 15) & 0x0001); }
};

struct W1_FLD //////////////////////////////////////// FieldDescriptor
{
	SVBT8 ch; // boundary-type (begin(19), separator (20), end (21))
	sal_uInt8 chGet() {
		return SVBT8ToByte(ch); }
	SVBT8 flt; // field type / flags
	sal_uInt8 fltGet() {
		return SVBT8ToByte(flt); }
	// variant, when ch==21:
	sal_Bool fDifferGet() {
		return (fltGet() >> 0) & 1; }
	sal_Bool fResultDirtyGet() {
		return (fltGet() >> 2) & 1; }
	sal_Bool ResultEditedGet() {
		return (fltGet() >> 3) & 1; }
	sal_Bool fLockedGet() {
		return (fltGet() >> 4) & 1; }
	sal_Bool fPrivateResultGet() {
		return (fltGet() >> 5) & 1; }
	sal_Bool fNestedGet() {
		return (fltGet() >> 6) & 1; }
};

struct W1_PIC /////////////////////////////////////// PictureStructure
{
	SVBT32 lcb;// 0x0 number of bytes in the PIC structure plus size of following picture data which may be a Window's metafile, a bitmap, or the filename of a TIFF file.
	sal_uLong lcbGet() {
		return SVBT32ToUInt32(lcb); }
	SVBT16 cbHeader;// 0x4 number of bytes in the PIC (to allow for future expansion).
	sal_uInt16 cbHeaderGet() {
		return SVBT16ToShort(cbHeader); }
	struct MFP {
		SVBT16 mm;// 0x6	int
		sal_uInt16 mmGet() {
			return SVBT16ToShort(mm); }
		SVBT16 xExt;// 0x8	int
		sal_uInt16 xExtGet() {
			return SVBT16ToShort(xExt); }
		SVBT16 yExt;// 0xa	int
		sal_uInt16 yExtGet() {
			return SVBT16ToShort(yExt); }
		SVBT16 hMF;// 0xc	int
		sal_uInt16 hMFGet() {
			return SVBT16ToShort(hMF); }
	} mfp;
	union W1_MFP_BMP {
		SVBT8 bm[14];// 0xe	BITMAP(14 bytes)	Window's bitmap structure when PIC describes a BITMAP.
		SVBT8 rcWinMF[14];// 0xe	rc (rectangle - 8 bytes) rect for window origin and extents when metafile is stored -- ignored if 0
	} MFP_BMP;
	SVBT16 dxaGoal;// 0x1c	horizontal measurement in twips of the rectangle the picture should be imaged within.
	sal_uInt16 dxaGoalGet() {
		return SVBT16ToShort(dxaGoal); }
	SVBT16 dyaGoal;// 0x1e	vertical measurement in twips of the rectangle the picture should be imaged within.
	sal_uInt16 dyaGoalGet() {
		return SVBT16ToShort(dyaGoal); }
	SVBT16 mx;// 0x20	horizontal scaling factor supplied by user in .1% units.
	sal_uInt16 mxGet() {
		return SVBT16ToShort(mx); }
	SVBT16 my;// 0x22	vertical scaling factor supplied by user in .1% units.
	sal_uInt16 myGet() {
		return SVBT16ToShort(my); }
	SVBT16 dxaCropLeft;// 0x24	the amount the picture has been cropped on the left in twips.
	sal_uInt16 dxaCropLeftGet() {
		return SVBT16ToShort(dxaCropLeft); }
	SVBT16 dyaCropTop;// 0x26	the amount the picture has been cropped on the top in twips.
	sal_uInt16 dyaCropTopGet() {
		return SVBT16ToShort(dyaCropTop); }
	SVBT16 dxaCropRight;// 0x28 the amount the picture has been cropped on the right in twips.
	sal_uInt16 dxaCropRightGet() {
		return SVBT16ToShort(dxaCropRight); }
	SVBT16 dyaCropBottom;// 0x2a	the amount the picture has been cropped on the bottom in twips.
	sal_uInt16 dyaCropBottomGet() {
		return SVBT16ToShort(dyaCropBottom); }
	SVBT16 flags;
	sal_uInt16 flagsGet() {
		return SVBT16ToShort(flags); }
//	brcl : 4;// 000F	Obsolete, superseded by brcTop, etc. In
	sal_uInt8 brclGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >(flagsGet() & 0xf); }
//	fFrameEmpty : 1;// 0010	picture consists of a single frame
	sal_Bool fFrameEmptyGet() {
		return sal::static_int_cast< sal_uInt8, sal_uInt16 >((flagsGet() >> 4) & 1); }
// win6 stuff:
//	fBitmap : 1;// 0020	==1, when picture is just a bitmap
//	sal_Bool fBitmapGet() {
//		return (flagsGet() >> 5) & 1; }
//	fDrawHatch : 1;// 0040	==1, when picture is an active OLE object
//	sal_Bool fDrawHatchGet() {
//		return (flagsGet() >> 6) & 1; }
//	fError : 1;// 0080	==1, when picture is just an error message
//	sal_Bool fErrorGet() {
//		return (flagsGet() >> 7) & 1; }
//	bpp : 8;// FF00	bits per pixel, 0 = unknown
//	sal_uInt8 bppGet() {
//		return (flagsGet() >> 8) & 0xff; }
//	SVBT16 rgbrc[4];
//	sal_uInt16 rgbrcGet(sal_uInt16 nIndex) {
//		return SVBT16ToShort(rgbrc[nIndex]); }
//	W1_BRC brcTop;// 0x2e	specification for border above picture
//	W1_BRC brcLeft;// 0x30 specification for border to the left
//	W1_BRC brcBottom;// 0x32	specification for border below picture
//	W1_BRC brcRight;// 0x34	specification for border to the right
//	SVBT16 dxaOrigin;// 0x36	horizontal offset of hand annotation origin
//	sal_uInt16 dxaOriginGet() {
//		return SVBT16ToShort(dxaOrigin); }
//	SVBT16 dyaOrigin;// 0x38	vertical offset of hand annotation origin
//	sal_uInt16 dyaOriginGet() {
//		return SVBT16ToShort(dyaOrigin); }
	SVBT8 rgb;// 0x3a	variable array of bytes containing Window's metafile, bitmap or TIFF file filename.
	sal_uInt8* rgbGet() {
		return rgb; }
};

struct W1_TBD /////////////////////////////////////////////////////////
{
	SVBT8 aBits1;
	sal_uInt8 aBits1Get() {
		return SVBT8ToByte(aBits1); }
// SVBT8 jc : 3;// 0x07 justification code: 0=left tab, 1=centered tab, 2=right tab, 3=decimal tab, 4=bar
	sal_uInt8 jcGet() {
		return aBits1Get() & 0x07; }
// SVBT8 tlc : 3;// 0x38	tab leader code: 0=no leader, 1=dotted leader,
						// 2=hyphenated leader, 3=single line leader, 4=heavy line leader
	sal_uInt8 tlcGet() {
		return (aBits1Get() >> 3 ) & 0x07; }
// *	int	:2	C0	reserved
};

struct W1_TC //////////////////////////////////////////////////////////
{
	SVBT8 aBits1;
	sal_uInt8 aBits1Get() {
		return SVBT8ToByte(aBits1); }
	sal_uInt8 fFirstMergedGet() {
		return aBits1Get() & 0x01; }
	sal_uInt8 fMergedGet() {
		return (aBits1Get() >> 1 ) & 0x01; }
	SVBT8 aBits2;
// SVBT16 fFirstMerged : 1;// 0001	set to 1 when cell is first cell of a range of cells that have been merged.
// SVBT16 fMerged : 1;// 0002	set to 1 when cell has been merged with preceding cell.
// SVBT16 fUnused : 14;// FFFC	reserved
	W1_BRC10 rgbrc[4];// notational convenience for referring to brcTop, brcLeft, etc fields.
	W1_BRC10* rgbrcGet() {
		return rgbrc; }
// BRC brcTop;// specification of the top border of a table cell
// BRC brcLeft;// specification of left border of table row
// BRC brcBottom;// specification of bottom border of table row
// BRC brcRight;// specification of right border of table row.
};
// cbTC (count of bytes of a TC) is 10(decimal), A(hex).

#if 0
struct W1_SHD ////////////////////////////////////////////// struct SHD
{
	SVBT16 aBits1;
	// SVBT16 nFore : 5;// 0x001f ForegroundColor
	sal_uInt16 GetFore() { return SVBT16ToShort(aBits1) & 0x01; };
	void SetFore( short nVal ){
		ShortToSVBT16((SVBT16ToShort(aBits1)&0xffe0)|(nVal&0x1f), aBits1); };
	// SVBT16 nBack : 5;// 0x03e0 BackgroundColor
	W1_SHD() { ShortToSVBT16( 0, aBits1 ); };
	sal_uInt16 GetBack() { return (SVBT16ToShort(aBits1) >> 5 & 0x1f ); };
	void SetBack( short nVal ){
		ShortToSVBT16((SVBT16ToShort(aBits1)&0xfc1f)|(nVal&0x1f)<<5, aBits1); };
	// SVBT16 nStyle : 5;// 0x7c00 Percentage and Style
	sal_uInt16 GetStyle() { return (SVBT16ToShort(aBits1) >> 10 & 0x1f ); };
	void SetStyle( short nVal ){
		ShortToSVBT16((SVBT16ToShort(aBits1)&0x83ff)|(nVal&0x1f)<<10, aBits1); };
	// SVBT16 nDontKnow : 1;// 0x8000 ???
};

struct W1_ANLV ////////////////////////////////////////////////////////
{
	SVBT8 nfc;// 0 number format code, 0=Arabic, 1=Upper case Roman, 2=Lower case Roman
						// 3=Upper case Letter, 4=Lower case letter, 5=Ordinal
	SVBT8 cbTextBefore;// 1 offset into anld.rgch limit of prefix text
	SVBT8 cbTextAfter;// 2
	SVBT8 aBits1;
// SVBT8 jc : 2;// 3 : 0x03	justification code, 0=left, 1=center, 2=right, 3=left and right justify
// SVBT8 fPrev : 1;// 0x04	when ==1, include previous levels
// SVBT8 fHang : 1;// 0x08	when ==1, number will be displayed using a hanging indent
// SVBT8 fSetBold : 1;// 0x10	when ==1, boldness of number will be determined by anld.fBold.
// SVBT8 fSetItalic : 1;// 0x20	when ==1, italicness of number will be determined by anld.fItalic
// SVBT8 fSetSmallCaps : 1;// 0x40	when ==1, anld.fSmallCaps will determine whether number will be displayed in small caps or not.
// SVBT8 fSetCaps : 1;// 0x80	when ==1, anld.fCaps will determine whether number will be displayed capitalized or not
	SVBT8 aBits2;
// SVBT8 fSetStrike : 1;// 4 : 0x01	when ==1, anld.fStrike will determine whether the number will be displayed using strikethrough or not.
// SVBT8 fSetKul : 1;// 0x02 when ==1, anld.kul will determine the underlining state of the autonumber.
// SVBT8 fPrevSpace : 1;// 0x04	when ==1, autonumber will be displayed with a single prefixing space character
// SVBT8 fBold : 1;// 0x08	determines boldness of autonumber when anld.fSetBold == 1.
// SVBT8 fItalic : 1;// 0x10	determines italicness of autonumber when anld.fSetItalic == 1.
// SVBT8 fSmallCaps : 1;// 0x20	determines whether autonumber will be displayed using small caps when anld.fSetSmallCaps == 1.
// SVBT8 fCaps : 1;// 0x40	determines whether autonumber will be displayed using caps when anld.fSetCaps == 1.
// SVBT8 fStrike : 1;// 0x80	determines whether autonumber will be displayed using caps when anld.fSetStrike == 1.
	SVBT8 aBits3;
// SVBT8 kul : 3;// 5 : 0x07	determines whether autonumber will be displayed with underlining when anld.fSetKul == 1.
// SVBT8 ico : 5;// 0xF1	color of autonumber
	SVBT16 ftc;// 6 font code of autonumber
	SVBT16 hps;// 8	font half point size (or 0=auto)
	SVBT16 iStartAt;// 0x0a starting value (0 to 65535)
	SVBT16 dxaIndent;// 0x0c *short?* *sal_uInt16?* width of prefix text (same as indent)
	SVBT16 dxaSpace;// 0x0e		minimum space between number and paragraph
};
// *cbANLV (count of bytes of ANLV) is 16 (decimal), 10(hex).

struct W1_ANLD ////////////////////////////////////////////////////////
{
	W1_ANLV eAnlv;// 0
	SVBT8 fNumber1;// 0x10		number only 1 item per table cell
	SVBT8 fNumberAcross;// 0x11		number across cells in table rows(instead of down)
	SVBT8 fRestartHdn;// 0x12		restart heading number on section boundary
	SVBT8 fSpareX;// 0x13		unused( should be 0)
	sal_Char rgchAnld[32];// 0x14	characters displayed before/after autonumber
};


struct W1_OLST ////////////////////////////////////////////////////////
{
	W1_ANLV rganlv[9];// 0 an array of 9 ANLV structures (heading levels)
	SVBT8 fRestartHdr;// 0x90 when ==1, restart heading on section break
	SVBT8 fSpareOlst2;// 0x91 reserved
	SVBT8 fSpareOlst3;// 0x92 reserved
	SVBT8 fSpareOlst4;// 0x93 reserved
	sal_Char rgch[64];// 0x94 array of 64 chars		text before/after number
};
// cbOLST is 212(decimal), D4(hex).

#endif
#endif

