summaryrefslogtreecommitdiff
path: root/binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx')
-rw-r--r--binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx1351
1 files changed, 1351 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx b/binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx
new file mode 100644
index 000000000000..e3650e633e4c
--- /dev/null
+++ b/binfilter/bf_sw/source/core/swg/sw_rdhnt.cxx
@@ -0,0 +1,1351 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma hdrstop
+#endif
+
+#define ITEMID_BOXINFO SID_ATTR_BORDER_INNER
+
+#include <hintids.hxx>
+
+#include <bf_svx/paperinf.hxx>
+#include <bf_svtools/macitem.hxx>
+#include <bf_svx/wrlmitem.hxx>
+#include <bf_svx/brshitem.hxx>
+#include <bf_svx/protitem.hxx>
+#include <bf_svx/opaqitem.hxx>
+#include <bf_svx/prntitem.hxx>
+#include <bf_svx/ulspitem.hxx>
+#include <bf_svx/lrspitem.hxx>
+#include <bf_svx/pbinitem.hxx>
+#include <bf_svx/brkitem.hxx>
+#include <bf_svx/shaditem.hxx>
+#include <bf_svx/boxitem.hxx>
+#include <bf_svx/udlnitem.hxx>
+#include <bf_svx/hyznitem.hxx>
+#include <bf_svx/tstpitem.hxx>
+#include <bf_svx/orphitem.hxx>
+#include <bf_svx/widwitem.hxx>
+#include <bf_svx/spltitem.hxx>
+#include <bf_svx/adjitem.hxx>
+#include <bf_svx/lspcitem.hxx>
+#include <bf_svx/nhypitem.hxx>
+#include <bf_svx/prszitem.hxx>
+#include <bf_svx/fhgtitem.hxx>
+#include <bf_svx/escpitem.hxx>
+#include <bf_svx/langitem.hxx>
+#include <bf_svx/cmapitem.hxx>
+#include <bf_svx/crsditem.hxx>
+#include <bf_svx/kernitem.hxx>
+#include <bf_svx/cntritem.hxx>
+#include <bf_svx/shdditem.hxx>
+#include <bf_svx/cscoitem.hxx>
+#include <bf_svx/wghtitem.hxx>
+#include <bf_svx/postitem.hxx>
+#include <bf_svx/fontitem.hxx>
+
+
+#include <horiornt.hxx>
+
+#include <doc.hxx>
+#include <swtypes.hxx> //fuer MIN_BORDER_DIST
+
+#include <errhdl.hxx>
+
+#include <ndtxt.hxx>
+#include <paratr.hxx>
+#include <fldbas.hxx>
+#include <fmthbsh.hxx>
+#include <fmtrfmrk.hxx>
+#include <fmtfld.hxx>
+#include <fmtflcnt.hxx>
+#include <fchrfmt.hxx>
+#include <fmtftn.hxx>
+#include <fmtpdsc.hxx>
+#include <fmtclds.hxx>
+#include <fmtfsize.hxx>
+#include <fmtfordr.hxx>
+#include <fmthdft.hxx>
+#include <fmtcntnt.hxx>
+#include <fmtanchr.hxx>
+#include <fmtornt.hxx>
+#include <fmtsrnd.hxx>
+#include <rdswg.hxx>
+#include <pagedesc.hxx>
+#include <grfatr.hxx>
+#include <oldhntid.hxx>
+#include <swgids.hxx>
+#include <tox.hxx>
+namespace binfilter {
+
+
+
+//////////////////////////////// CHRATR.HXX ////////////////////////////////
+
+static USHORT InSWG_SwFont
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ long nNext = rPar.r.getskip();
+ BYTE eFamily, eFontPitch, eFontCharSet;
+ rPar.r >> eFamily
+ >> eFontPitch
+ >> eFontCharSet;
+ String aName = rPar.GetText( FALSE );
+ String aStyle;
+ if( rPar.r.tell() < nNext )
+ aStyle = rPar.GetText( FALSE );
+
+ // irgendwann wandelte sich der StarBats vom ANSI- zum SYMBOL-Font
+ if( SWG_VER_COMPAT >= rPar.aHdr.nVersion &&
+ RTL_TEXTENCODING_SYMBOL !=
+ eFontCharSet && aName.EqualsAscii( "StarBats" ) )
+ eFontCharSet = RTL_TEXTENCODING_SYMBOL;
+ SvxFontItem aAttr
+ ( (FontFamily) eFamily, aName, aStyle,
+ (FontPitch) eFontPitch,
+ (rtl_TextEncoding) eFontCharSet );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SvxPostureItem
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nPosture;
+ rPar.r >> nPosture;
+ // backxxx war nie drin und wird nie drin sein!
+ if( nPosture == 2 || nPosture == 4 ) return 0;
+ if( nPosture > 1 ) nPosture = 2;
+ SvxPostureItem aAttr( (const FontItalic) nPosture );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SvxWeightItem
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nWeight;
+ rPar.r >> nWeight;
+ nWeight = ( nWeight <= 4 ) ? WEIGHT_NORMAL : WEIGHT_BOLD;
+ SvxWeightItem aAttr( (const FontWeight) nWeight );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwShadowed
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nState;
+ rPar.r >> nState;
+ SvxShadowedItem aAttr( nState );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwContour
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nState;
+ rPar.r >> nState;
+ SvxContourItem aAttr( nState );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwKerning
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nState; // ignored
+ long frKernZ, frKernN;
+ rPar.r >> nState >> frKernZ >> frKernN;
+ // Alt = Punkte, neu = Twips
+ short nKern = nState ? (short) (frKernZ * 20 / frKernN ) : 0;
+ SvxKerningItem aAttr( nKern );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwCrossedOut
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE chCross, bCrossOutSpaces, nState;
+ rPar.r >> chCross >> bCrossOutSpaces >> nState;
+ SvxCrossedOutItem aAttr( (FontStrikeout) nState );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ if( bCrossOutSpaces ) {
+ SvxWordLineModeItem aMode( FALSE );
+ if( pSet ) pSet->Put( aMode );
+ else pNd->Insert( aMode, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ }
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SvxCaseMapItem
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nCaseMap;
+ rPar.r >> nCaseMap;
+ SvxCaseMapItem aAttr( (const SvxCaseMap) nCaseMap );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwUnderline
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE nState, bUnderlineSpaces;
+ rPar.r >> nState >> bUnderlineSpaces;
+ SvxUnderlineItem aAttr( (FontUnderline) nState );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ if( bUnderlineSpaces ) {
+ SvxWordLineModeItem aMode( FALSE );
+ if( pSet ) pSet->Put( aMode );
+ else pNd->Insert( aMode, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ }
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwLanguage
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ USHORT nLanguage;
+ rPar.r >> nLanguage;
+ if( !nLanguage )
+ nLanguage = LANGUAGE_SYSTEM;
+ else if( nLanguage == 0x400 )
+ nLanguage = LANGUAGE_DONTKNOW;
+// else
+// rPar.TestLanguage( nLanguage );
+ SvxLanguageItem aAttr( (LanguageType) nLanguage );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwEscapement
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE eEscape;
+ long frEscapementZ, frEscapementN, frProportionZ, frProportionN;
+ rPar.r >> eEscape >> frEscapementZ >> frEscapementN
+ >> frProportionZ >> frProportionN;
+ short nEsc = (short) ( frEscapementZ * 100 / frEscapementN );
+ short nProp = (short) ( frProportionZ * 100 / frProportionN );
+ switch( eEscape) {
+ case SVX_ESCAPEMENT_OFF:
+ nEsc = 0; nProp = 100; break;
+ case SVX_ESCAPEMENT_SUBSCRIPT:
+ nEsc = -nEsc; break;
+ }
+ SvxEscapementItem aAttr( nEsc, (BYTE) nProp );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwSize
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ long nSize;
+ rPar.r >> nSize;
+ SvxFontHeightItem aAttr( (USHORT) nSize );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwPropSize
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ long frPropSizeZ, frPropSizeN;
+ rPar.r >> frPropSizeZ >> frPropSizeN;
+ USHORT nFrac = (USHORT) ( frPropSizeZ * 100 / frPropSizeN );
+ SvxPropSizeItem aAttr( nFrac, ITEMID_PROPSIZE );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwColor
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ USHORT red, green, blue;
+ rPar.r >> red >> green >> blue;
+ if( rPar.r.size() )
+ {
+ // Es ist noch etwas da, also ist es ein CharSetColor-Attribut
+ BYTE cSet;
+ rPar.r >> cSet;
+ Color aColor( red, green, blue );
+ SvxCharSetColorItem aAttr( aColor, (rtl_TextEncoding) cSet );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+ }
+ else
+ {
+ SvxColorItem aAttr( Color( red, green, blue ) );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+ }
+}
+
+static USHORT InSWG_SwNoHyphenHere
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ BYTE bOn;
+ rPar.r >> bOn;
+ SvxNoHyphenItem aAttr;
+ aAttr.SetValue( (BOOL) bOn );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwSoftHyphen
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( !pSet )
+ pNd->Insert( CHAR_SOFTHYPHEN, SwIndex( pNd, nBgn ));
+ return 0;
+}
+
+static USHORT InSWG_SwHardBlank
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( !pSet )
+ pNd->Insert( CHAR_HARDBLANK, SwIndex( pNd, nBgn ));
+ return 0;
+}
+
+static USHORT InSWG_SwRefMark
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ USHORT nMark; // wird ignoriert
+ rPar.r >> nMark;
+ String aName = rPar.GetText( FALSE );
+ if( pSet ) return 0;
+ SwFmtRefMark aFmtAttr( aName );
+ pNd->Insert( aFmtAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aFmtAttr.Which();
+}
+
+static USHORT InSWG_SwField
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( !rPar.r.size() ) return 0;
+ SwField* pFld = rPar.InField();
+ if( !pFld ) return 0;
+ SwFmtFld aAttr( *pFld );
+ delete pFld;
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFlyCnt
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( pSet )
+ return 0;
+ if( rPar.r.peek() != SWG_FLYFMT )
+ return 0;
+
+ USHORT eSave_StartNodeType = rPar.eStartNodeType;
+ rPar.eStartNodeType = SwFlyStartNode;
+
+ rPar.r.next();
+ SwFlyFrmFmt* pFmt = (SwFlyFrmFmt*) rPar.InFormat( NULL );
+ SwFmtFlyCnt aAttr( pFmt );
+ rPar.eStartNodeType = eSave_StartNodeType;
+
+ if( pSet )
+ pSet->Put( aAttr );
+ else
+ pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwTOXMark
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( pSet ) return 0;
+ // Flags:
+ // 0x01 - hat eigenen Verz.-Namen
+ // 0x02 - hat alternate Text
+ // 0x04 - hat Primaeren Key
+ // 0x08 - hat Sekundaeren Key
+ BYTE nType, bFlags;
+ const SwTOXType* pType = NULL;
+ rPar.r >> nType >> bFlags;
+ TOXTypes eType = (TOXTypes) nType;
+ if( bFlags & 0x01 )
+ {
+ String aName( rPar.GetText( FALSE ) );
+ USHORT n = rPar.pDoc->GetTOXTypeCount( eType );
+ // Entsprechenden TOXtype suchen
+ for( USHORT i = 0; i < n; i++ )
+ {
+ pType = rPar.pDoc->GetTOXType( eType, i );
+ if( pType && pType->GetTypeName() == aName )
+ break;
+ pType = NULL;
+ }
+ // neu registrieren, falls noch nicht vorhanden
+ if( !pType )
+ {
+ rPar.pDoc->InsertTOXType( SwTOXType( eType, aName ) );
+ pType = rPar.pDoc->GetTOXType( eType, n );
+ }
+ }
+ else
+ pType = rPar.pDoc->GetTOXType( eType, 0 );
+ if( pType )
+ {
+ SwTOXMark aMark( pType );
+ if( bFlags & 0x02 )
+ aMark.SetAlternativeText( rPar.GetText( FALSE ) );
+ switch( nType )
+ {
+ case TOX_INDEX:
+ if( bFlags & 0x04 )
+ aMark.SetPrimaryKey( rPar.GetText( FALSE ) );
+
+ if( bFlags & 0x08 )
+ aMark.SetSecondaryKey( rPar.GetText( FALSE ) );
+
+ break;
+ case TOX_USER:
+ case TOX_CONTENT: {
+ USHORT nLevel;
+ rPar.r >> nLevel;
+ aMark.SetLevel( nLevel );
+ } break;
+ default:
+ rPar.Error(); return 0;
+ }
+ // TOXMark mit Alternativtext aber ohne 0xff. Sowas konnte man
+ // ueber die UI zwar erstellen, weil's aber ein Bug ist werden
+ // die jetzt ignoriert.
+ if( !aMark.IsAlternativeText() ||
+ (rPar.GetReadTxt() && rPar.GetReadTxt()->Len() >= nBgn &&
+ '\xff' == rPar.GetReadTxt()->GetChar(nBgn) ))
+ {
+ // Bug 31560: several txo marks w/o end at the same position
+ if( aMark.IsAlternativeText() &&
+ pNd->GetTxtAttr( nBgn, aMark.Which() ) )
+ {
+ ASSERT( !aMark.IsAlternativeText(),
+ "several TOXMark without end at same position" );
+ return 0;
+ }
+
+ pNd->Insert( aMark, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ }
+ return aMark.Which();
+ }
+ rPar.Error(); return 0;
+}
+
+static USHORT InSWG_SwCharFmt
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ USHORT nIdx;
+ rPar.r >> nIdx;
+ if( (nIdx == IDX_NO_VALUE) ||
+ ((nIdx&IDX_TYPEMASK) == IDX_COLLECTION) ) // bug fix #24427#
+ return 0;
+ SwCharFmt* pChFmt = (SwCharFmt*) rPar.FindFmt( nIdx, SWG_CHARFMT );
+ SwFmtCharFmt aAttr( pChFmt );
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFtn
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode* pNd, xub_StrLen nBgn, xub_StrLen nEnd )
+{
+ if( pSet ) return 0;
+ String aNumber = rPar.GetText( FALSE );
+ USHORT nNumber;
+ rPar.r >> nNumber;
+ SwFmtFtn aAttr;
+ aAttr.SetNumStr( aNumber );
+ aAttr.SetNumber( nNumber );
+ // Der Footnote-Hint ist somewhat special. Er erhaelt
+ // eine Section, wenn er in den TextNode eingefuegt wird (Brech!)
+ // Daher muss der Text getrennt geparst werden (in FillTxtNode())
+ if( pSet ) pSet->Put( aAttr );
+ else pNd->Insert( aAttr, nBgn, nEnd, SETATTR_NOTXTATRCHR );
+ return aAttr.Which();
+}
+
+///////////////////////////// PARATR.HXX ///////////////////////////////////
+
+static USHORT InSWG_SwLineSpacing
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long frPropLineSpaceZ, frPropLineSpaceN;
+ sal_Char nLineSpaceRule, nInterLineSpaceRule;
+ short nInterLineSpace, nLineHeight;
+ rPar.r >> frPropLineSpaceZ >> frPropLineSpaceN
+ >> nLineSpaceRule >> nInterLineSpaceRule
+ >> nInterLineSpace >> nLineHeight;
+ short nFrac = (short) ( frPropLineSpaceZ * 100 / frPropLineSpaceN );
+ SvxLineSpacingItem aAttr( nLineHeight );
+ aAttr.SetInterLineSpace( nInterLineSpace );
+ aAttr.SetPropLineSpace( (BYTE)nFrac );
+ aAttr.GetLineSpaceRule() = (SvxLineSpace) nLineSpaceRule;
+ aAttr.GetInterLineSpaceRule() = (SvxInterLineSpace) nInterLineSpaceRule;
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwAdjust
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ sal_Char eAdjustment;
+ rPar.r >> eAdjustment;
+ SvxAdjustItem aAttr( (SvxAdjust) eAdjustment );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwSplit
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ sal_Char bSplit;
+ rPar.r >> bSplit;
+ SvxFmtSplitItem aAttr( (BOOL) bSplit );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwWidows
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long nTwips;
+ short nLines;
+ rPar.r >> nLines >> nTwips;
+ SvxWidowsItem aAttr( (BYTE) nLines );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwOrphans
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long nTwips;
+ short nLines;
+ rPar.r >> nLines >> nTwips;
+ SvxOrphansItem aAttr( (BYTE) nLines );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwTabStop
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ short nTabs;
+ rPar.r >> nTabs;
+ SvxTabStopItem aAttr( 0, 0 );
+ for( int i = 0; i < nTabs; i++ )
+ {
+ long nPos;
+ BYTE eAdjust, cDecimal, cFill;
+ rPar.r >> nPos >> eAdjust >> cDecimal >> cFill;
+ if( !i || SVX_TAB_ADJUST_DEFAULT != eAdjust )
+ aAttr.Insert( SvxTabStop
+ ( (SwTwips) nPos, (SvxTabAdjust) eAdjust, cDecimal, cFill ) );
+ }
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwHyphenZone
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bHyphen, bHyphenPageEnd;
+ USHORT nMinLead, nMinTrail, nMaxHyphens;
+ rPar.r >> bHyphen >> bHyphenPageEnd >> nMinLead >> nMinTrail >> nMaxHyphens;
+ SvxHyphenZoneItem aAttr;
+ aAttr.SetHyphen( BOOL( bHyphen != 0 ) );
+ aAttr.SetPageEnd( BOOL( bHyphenPageEnd != 0 ) );
+ aAttr.GetMinLead() = (BYTE) nMinLead;
+ aAttr.GetMinTrail() = (BYTE) nMinTrail;
+ aAttr.GetMaxHyphens() = (BYTE) nMaxHyphens;
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwDropCaps
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ USHORT nLines, nChars, nDistance, nX, nY, nFmt;
+ rPar.r >> nLines >> nChars >> nDistance >> nX >> nY >> nFmt;
+ SwFmtDrop aAttr;
+ aAttr.GetLines() = (BYTE) nLines;
+ aAttr.GetChars() = (BYTE) nChars;
+ aAttr.GetDistance() = nDistance;
+ aAttr.GetWholeWord() = FALSE;
+ if( nFmt != IDX_NO_VALUE )
+ {
+ SwCharFmt* pSet = (SwCharFmt*) rPar.FindFmt( nFmt, SWG_CHARFMT );
+ aAttr.SetCharFmt( pSet );
+ }
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+/////////////////////////////// FRMATR.HXX ///////////////////////////////
+
+static USHORT InSWG_SwBox
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ short nDistance;
+ rPar.r >> nDistance;
+ SvxBoxItem aAttr;
+ aAttr.SetDistance( nDistance );
+
+ BOOL bDone = FALSE;
+ while( !bDone )
+ {
+ BYTE ch = rPar.r.next();
+ switch( ch )
+ {
+ case SWG_TOP:
+ case SWG_LEFT:
+ case SWG_RIGHT:
+ case SWG_BOTTOM:break;
+ default: bDone = TRUE;
+ }
+ if( !bDone )
+ {
+ USHORT red, green, blue;
+ short nOutline, nInline, nDistance;
+ rPar.r >> red >> green >> blue;
+ rPar.r >> nOutline >> nInline >> nDistance;
+ Color aClr( red, green, blue );
+ SvxBorderLine aBorder( &aClr, nOutline, nInline, nDistance );
+ switch( ch )
+ {
+ case SWG_TOP: aAttr.SetLine( &aBorder, BOX_LINE_TOP ); break;
+ case SWG_LEFT: aAttr.SetLine( &aBorder, BOX_LINE_LEFT ); break;
+ case SWG_RIGHT: aAttr.SetLine( &aBorder, BOX_LINE_RIGHT ); break;
+ case SWG_BOTTOM: aAttr.SetLine( &aBorder, BOX_LINE_BOTTOM ); break;
+ }
+ }
+ }
+ if ( rPar.aHdr.nVersion < SWG_VER_NEWALIGN )
+ {
+ //Wenn mindestens eine Line gesetzt wurde, so wird jetzt ein minimaler
+ //Abstand eingetragen.
+ if ( (aAttr.GetTop() || aAttr.GetLeft() ||
+ aAttr.GetBottom() || aAttr.GetRight() ) &&
+ nDistance < MIN_BORDER_DIST)
+ {
+ aAttr.SetDistance( MIN_BORDER_DIST );
+ }
+ }
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtShadow
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE cLoc;
+ USHORT nWidth;
+ rPar.r >> cLoc >> nWidth;
+ Color aCol( rPar.InBrush() );
+ SvxShadowItem aAttr( RES_SHADOW, &aCol, nWidth, (SvxShadowLocation) cLoc );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtPageDesc
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ // Dieser Hint kann bereits eingelesen werden, ehe die
+ // Seitenbeschreibungen drin sind. Also, bitte erst mal speichern!
+ // Das benoetigte Set muss leider "per Hand" nachgetragen werden
+ // (siehe rdfmts.cxx)
+
+ // Komischerweise gibt es immer noch leere PageDesc-Hints:
+ if( !rPar.r.size() )
+ {
+ SwFmtPageDesc aAttr( NULL );
+ pSet->Put( aAttr );
+ }
+ else
+ {
+ String aName( rPar.GetText( FALSE ) );
+ USHORT nOff = 0;
+ rPar.r >> nOff;
+ if( aName.Len() )
+ rPar.AddPageDescLink( aName, nOff );
+ //JP 29.05.00: set always the hint into the AttrSet, because in
+ // InsertMode the NodeAttrSet for PageDescLink only created
+ // if there Attributes exists.
+ SwFmtPageDesc aAttr( NULL );
+ pSet->Put( aAttr );
+ }
+ return 0;
+}
+
+static USHORT InSWG_SwFmtMacro
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ if( rPar.r.peek() != SWG_MACROTBL )
+ return 0;
+ rPar.r.next();
+ SvxMacroItem aAttr( RES_FRMMACRO );
+ short nMacro;
+ rPar.r >> nMacro;
+ for( short i = 0; i < nMacro; i++ )
+ {
+ USHORT nEvent;
+ rPar.r >> nEvent;
+ String aLib = rPar.GetText();
+ String aMac = rPar.GetText();
+ aAttr.SetMacro( nEvent, SvxMacro( aMac, aLib, STARBASIC ) );
+ }
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtCol
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ // Die Longs muessen runtergerechnet werden
+ sal_Char nLineAdj, bOrtho;
+ short nGutterWidth;
+ long nHeightNum, nHeightDenom, nWishWidth;
+ rPar.r.long4();
+ rPar.r >> nLineAdj
+ >> bOrtho
+ >> nGutterWidth
+ >> nWishWidth
+ >> nHeightNum
+ >> nHeightDenom;
+ USHORT nMax = ( nWishWidth == LONG_MAX )
+ ? USHRT_MAX
+ : (USHORT) nWishWidth;
+ ASSERT( nWishWidth == LONG_MAX || nWishWidth <= 65535L, "WishWidth zu gross" );
+ long nFactor = nWishWidth / nMax;
+ SwFmtCol aAttr;
+ USHORT nLineWidth;
+ Color aLineColor;
+ rPar.InPen(nLineWidth, aLineColor);
+ USHORT nCol;
+ rPar.r >> nCol;
+ if( nCol )
+ {
+ for( USHORT i = 0; i < nCol; i++ )
+ {
+ long nWishWidth;
+ USHORT nLeft, nUpper, nRight, nLower;
+ rPar.r >> nWishWidth >> nLeft >> nUpper >> nRight >> nLower;
+ SwColumn* pCol = new SwColumn;
+ pCol->SetWishWidth( (USHORT) ( nWishWidth / nFactor ) );
+ pCol->SetLeft( nLeft );
+ pCol->SetUpper( nUpper );
+ pCol->SetRight( nRight );
+ pCol->SetLower( nLower );
+ aAttr.GetColumns().Insert( pCol, i );
+ }
+ }
+ aAttr.SetLineColor( aLineColor );
+ aAttr.SetLineWidth( nLineWidth );
+ aAttr.SetWishWidth( (USHORT) nWishWidth );
+ aAttr.SetLineHeight( (BYTE) ( nHeightNum * 100 / nHeightDenom ) );
+ aAttr.SetLineAdj( (SwColLineAdj) nLineAdj );
+ // temporaerer Bug Fix
+ if( nCol )
+ // Wert direkt mit dem Silberhammer einschlagen.
+ aAttr._SetOrtho( (BOOL) bOrtho );
+ rPar.r.long3();
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtFrmSize
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nSizeType;
+ long nWidth, nHeight;
+ rPar.r >> nSizeType;
+ rPar.r.long4();
+ rPar.r >> nWidth >> nHeight;
+ rPar.r.long3();
+ if( rPar.IsTableBoxFrmFmt() )
+ {
+ // FrmSize-Attribut in TableBoxes: umdrehen!
+ long n = nWidth;
+ nWidth = nHeight;
+ nHeight = n;
+ }
+ else if( nSizeType == ATT_FIX_SIZE
+ && nWidth == LONG_MAX
+ && nHeight == LONG_MAX )
+ {
+ // Uninitialisertes FrmSize-Attribut: setze auf DIN A4
+ Size aSzA4 = SvxPaperInfo::GetPaperSize( SVX_PAPER_A4 );
+ nWidth = aSzA4.Width();
+ nHeight = aSzA4.Height();
+ }
+
+ SwFmtFrmSize aAttr( (SwFrmSize) nSizeType, nWidth, nHeight );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtFillOrder
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nFillOrder;
+ rPar.r >> nFillOrder;
+ SwFmtFillOrder aAttr( (SwFillOrder) nFillOrder );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwPageBreak
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nBreak, nIsAuto;
+ rPar.r >> nBreak >> nIsAuto;
+ if( nBreak != (SvxBreak) SVX_BREAK_NONE )
+ nBreak += (SvxBreak) SVX_BREAK_COLUMN_BOTH;
+ SvxFmtBreakItem aAttr( (SvxBreak) nBreak );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwColBreak
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nBreak, nIsAuto;
+ rPar.r >> nBreak >> nIsAuto;
+ SvxFmtBreakItem aAttr( (SvxBreak) nBreak );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtPaperBin
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ short nTray;
+ rPar.r >> nTray;
+ SvxPaperBinItem aAttr( RES_PAPER_BIN, (BYTE) nTray );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwLRSpace
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long left, right, firstline;
+ rPar.r >> left >> right >> firstline;
+ SvxLRSpaceItem aAttr;
+ aAttr.SetTxtLeft( (USHORT) left );
+ aAttr.SetRight( (USHORT) right );
+ aAttr.SetTxtFirstLineOfst( USHORT(firstline) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwULSpace
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long upper, lower;
+ rPar.r >> upper >> lower;
+ SvxULSpaceItem aAttr;
+ aAttr.SetUpper( (USHORT) upper );
+ aAttr.SetLower( (USHORT) lower );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtHeader
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bActive;
+ SwFrmFmt* pFmt = NULL;
+ rPar.r >> bActive;
+ if( rPar.r.peek() == SWG_FREEFMT )
+ {
+ USHORT eSave_StartNodeType = rPar.eStartNodeType;
+ rPar.eStartNodeType = SwHeaderStartNode;
+
+ rPar.r.next();
+ pFmt = (SwFrmFmt*) rPar.InFormat( NULL );
+ rPar.RegisterFmt( *pFmt );
+ SwFmtHeader aAttr( pFmt );
+ aAttr.SetActive( BOOL( bActive ) );
+ pSet->Put( aAttr );
+ rPar.eStartNodeType = eSave_StartNodeType;
+
+ return aAttr.Which();
+ }
+ else
+ {
+ SwFmtHeader aAttr( BOOL( bActive != 0 ) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+ }
+}
+
+static USHORT InSWG_SwFmtFooter
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bActive;
+ SwFrmFmt* pFmt = NULL;
+ rPar.r >> bActive;
+ if( rPar.r.peek() == SWG_FREEFMT )
+ {
+ USHORT eSave_StartNodeType = rPar.eStartNodeType;
+ rPar.eStartNodeType = SwFooterStartNode;
+
+ rPar.r.next();
+ pFmt = (SwFrmFmt*) rPar.InFormat( NULL );
+ rPar.RegisterFmt( *pFmt );
+ SwFmtFooter aAttr( pFmt );
+ aAttr.SetActive( BOOL( bActive != 0 ) );
+ pSet->Put( aAttr );
+ rPar.eStartNodeType = eSave_StartNodeType;
+
+ return aAttr.Which();
+ }
+ else
+ {
+ SwFmtFooter aAttr( BOOL( bActive != 0 ) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+ }
+}
+
+static USHORT InSWG_SwFmtCntnt
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ SwFmtCntnt aAttr( rPar.InSection() );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtPrint
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bActive;
+ rPar.r >> bActive;
+ SvxPrintItem aAttr( RES_PRINT, BOOL (bActive != 0 ) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtOpaque
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bActive;
+ rPar.r >> bActive;
+ SvxOpaqueItem aAttr( RES_OPAQUE, BOOL( bActive != 0 ) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtProtect
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bProtFrame, bProtCntnt;
+ rPar.r >> bProtFrame >> bProtCntnt;
+ SvxProtectItem aAttr;
+ aAttr.SetPosProtect( BOOL( bProtFrame != 0 ) );
+ aAttr.SetSizeProtect( BOOL( bProtFrame != 0 ) );
+ aAttr.SetCntntProtect( BOOL( bProtCntnt != 0 ) );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtSurround
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nType, bGold;
+ rPar.r >> nType >> bGold;
+ SwFmtSurround aAttr( (SwSurround) nType );
+ if( bGold )
+ aAttr.SetSurround( SURROUND_IDEAL );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtVertOrient
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long nPos;
+ BYTE nOrient, nRelation;
+ rPar.r >> nPos >> nOrient >> nRelation;
+ if( VERT_NONE == (SwVertOrient)nOrient )
+ nRelation = FRAME;
+ SwFmtVertOrient aAttr( (SwTwips) nPos, (SwVertOrient) nOrient,
+ (SwRelationOrient) nRelation );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtHoriOrient
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long nPos;
+ BYTE nOrient, nRelation;
+ BYTE nAnchor;
+ short nColumn;
+ rPar.r >> nPos >> nOrient >> nRelation;
+ rPar.r >> nAnchor >> nColumn;
+ if( HORI_NONE == (SwHoriOrient)nOrient )
+ nRelation = FRAME;
+ SwFmtHoriOrient aAttr
+ ( (SwTwips) nPos, (SwHoriOrient) nOrient, (SwRelationOrient) nRelation );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtAnchor
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE cType;
+ USHORT nPage, nCol, nCntnt;
+ rPar.r >> cType >> nPage >> nCol >> nCntnt;
+ // auf globale Variable zuweisen:
+ rPar.nCntntCol = (xub_StrLen)nCntnt;
+
+ //RndId -> AnchorId mappen weil derzeit noch altes Attributformat
+ //gelesen und geschrieben wird.
+ switch ( cType )
+ {
+ case 1: cType = FLY_PAGE; break;
+ case 14: cType = FLY_AT_CNTNT; break;
+ case 15: cType = FLY_IN_CNTNT; break;
+ default: ASSERT( FALSE, "ungueltige AnchorId." );
+ }
+
+ SwFmtAnchor aAttr( (RndStdIds) cType, nPage + rPar.nPage1 );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwFmtBackground
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE bActive;
+ rPar.r >> bActive;
+ Color aCol = rPar.InBrush();
+ SvxBrushItem aAttr( aCol, RES_BACKGROUND );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+/////////////////////////////// GRFATR.HXX /////////////////////////////////
+
+static USHORT InSWG_SwMirrorGrf
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ BYTE nState;
+ rPar.r >> nState;
+ SwMirrorGrf aAttr( nState );
+ pSet->Put( aAttr );
+ return aAttr.Which();
+}
+
+static USHORT InSWG_SwCropGrf
+( SwSwgReader& rPar, SfxItemSet* pSet, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ long top, left, right, bottom;
+ rPar.r >> top >> left >> right >> bottom;
+ SwCropGrf aCrop( -left, -right, -top, -bottom );
+ pSet->Put( aCrop );
+ return aCrop.Which();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+xub_StrLen InSWG_Nothing( SwSwgReader&, SfxItemSet*, SwTxtNode*, xub_StrLen, xub_StrLen )
+{
+ return 0;
+}
+
+typedef USHORT ( *SwHintFn )( SwSwgReader&, SfxItemSet*, SwTxtNode*, xub_StrLen, xub_StrLen );
+
+SwHintFn __READONLY_DATA aChrInAttrs[] =
+{
+/* OLDRES_CHRATR_CASEMAP */ InSWG_SvxCaseMapItem,
+/* OLDRES_CHRATR_CHARWIDTH */ InSWG_Nothing,
+/* OLDRES_CHRATR_COLOR */ InSWG_SwColor,
+/* OLDRES_CHRATR_CONTOUR */ InSWG_SwContour,
+/* OLDRES_CHRATR_CROSSEDOUT */ InSWG_SwCrossedOut,
+/* OLDRES_CHRATR_ESCAPEMENT */ InSWG_SwEscapement,
+/* OLDRES_CHRATR_FONT */ InSWG_SwFont,
+/* OLDRES_CHRATR_FONTSIZE */ InSWG_SwSize,
+/* OLDRES_CHRATR_INVERTED */ InSWG_Nothing,
+/* OLDRES_CHRATR_KERNING */ InSWG_SwKerning,
+/* OLDRES_CHRATR_LANGUAGE */ InSWG_SwLanguage,
+/* OLDRES_CHRATR_MIRRORED */ InSWG_Nothing,
+/* OLDRES_CHRATR_POSTURE */ InSWG_SvxPostureItem,
+/* OLDRES_CHRATR_PROPORTIONALFONTSIZE*/ InSWG_SwPropSize,
+/* OLDRES_CHRATR_SHADOWED */ InSWG_SwShadowed,
+/* OLDRES_CHRATR_UNDERLINE */ InSWG_SwUnderline,
+/* OLDRES_CHRATR_WEIGHT */ InSWG_SvxWeightItem,
+/* OLDRES_CHRATR_WRITINGDIRECTION */ InSWG_Nothing,
+/* OLDRES_CHRATR_FIELD */ InSWG_SwField,
+/* OLDRES_CHRATR_NOLINEBREAK */ InSWG_Nothing,
+/* OLDRES_CHRATR_NOHYPHEN */ InSWG_SwNoHyphenHere,
+/* OLDRES_CHRATR_SOFTHYPH */ InSWG_SwSoftHyphen,
+/* OLDRES_CHRATR_FTN */ InSWG_SwFtn,
+/* OLDRES_CHRATR_HARDBLANK */ InSWG_SwHardBlank,
+};
+
+SwHintFn __READONLY_DATA aFontInAttrs[] =
+{
+/* OLDRES_TXTATR_CHARWIDTH */ InSWG_Nothing,
+/* OLDRES_TXTATR_COLOR */ InSWG_SwColor,
+/* OLDRES_TXTATR_CONTOUR */ InSWG_SwContour,
+/* OLDRES_TXTATR_CROSSEDOUT */ InSWG_SwCrossedOut,
+/* OLDRES_TXTATR_FONT */ InSWG_SwFont,
+/* OLDRES_TXTATR_FONTSIZE */ InSWG_SwSize,
+/* OLDRES_TXTATR_INVERTED */ InSWG_Nothing,
+/* OLDRES_TXTATR_LANGUAGE */ InSWG_SwLanguage,
+/* OLDRES_TXTATR_MIRRORED */ InSWG_Nothing,
+/* OLDRES_TXTATR_POSTURE */ InSWG_SvxPostureItem,
+/* OLDRES_TXTATR_PROPORTIONALFONTSIZE*/ InSWG_SwPropSize,
+/* OLDRES_TXTATR_SHADOWED */ InSWG_SwShadowed,
+/* OLDRES_TXTATR_UNDERLINE */ InSWG_SwUnderline,
+/* OLDRES_TXTATR_WEIGHT */ InSWG_SvxWeightItem,
+/* OLDRES_TXTATR_CHARFMT */ InSWG_SwCharFmt,
+};
+
+SwHintFn __READONLY_DATA aEtcInAttrs[] =
+{
+/* OLDRES_TXTATR_WRITINGDIRECTION */ InSWG_Nothing,
+/* OLDRES_TXTATR_KERNING */ InSWG_SwKerning,
+/* OLDRES_TXTATR_NOLINEBREAK */ InSWG_Nothing,
+/* OLDRES_TXTATR_NOHYPHEN */ InSWG_SwNoHyphenHere,
+/* OLDRES_TXTATR_INSERTED */ InSWG_Nothing,
+/* OLDRES_TXTATR_DELETED */ InSWG_Nothing,
+/* OLDRES_TXTATR_ESCAPEMENT */ InSWG_SwEscapement,
+/* OLDRES_TXTATR_CASEMAP */ InSWG_SvxCaseMapItem,
+/* OLDRES_TXTATR_FIELD */ InSWG_SwField,
+/* OLDRES_TXTATR_FLYCNT */ InSWG_SwFlyCnt,
+/* OLDRES_TXTATR_TOXMARK */ InSWG_SwTOXMark,
+/* OLDRES_TXTATR_SOFTHYPH */ InSWG_SwSoftHyphen,
+/* OLDRES_TXTATR_FTN */ InSWG_SwFtn,
+/* OLDRES_TXTATR_HARDBLANK */ InSWG_SwHardBlank,
+/* OLDRES_TXTATR_REFMARK */ InSWG_SwRefMark,
+};
+
+
+static SwHintFn __READONLY_DATA aParInAttrs[] =
+{
+/* OLDRES_PARATR_LINESPACING */ InSWG_SwLineSpacing,
+/* OLDRES_PARATR_FIRSTLINEOFFSET */ InSWG_Nothing, // nicht mehr da
+/* OLDRES_PARATR_ADJUST */ InSWG_SwAdjust,
+/* OLDRES_PARATR_SPLIT */ InSWG_SwSplit,
+/* OLDRES_PARATR_WIDOWS */ InSWG_SwWidows,
+/* OLDRES_PARATR_ORPHANS */ InSWG_SwOrphans,
+/* OLDRES_PARATR_TABSTOP */ InSWG_SwTabStop,
+/* OLDRES_PARATR_HYPHENZONE */ InSWG_SwHyphenZone,
+/* OLDRES_PARATR_DROP */ InSWG_SwDropCaps,
+};
+
+static SwHintFn __READONLY_DATA aAddInAttrs[] =
+{
+/* OLDRES_ADD_POSTIT */ InSWG_Nothing,
+/* OLDRES_ADD_INSERTS */ InSWG_Nothing,
+/* OLDRES_ADD_AUTOTEXT */ InSWG_Nothing,
+/* OLDRES_ADD_OTHERCONTENT */ InSWG_Nothing,
+};
+
+static SwHintFn __READONLY_DATA aFrmInAttrs[] =
+{
+/* OLDRES_FILL_ORDER */ InSWG_SwFmtFillOrder,
+/* OLDRES_FRM_SIZE */ InSWG_SwFmtFrmSize,
+/* OLDRES_PAGE_BREAK */ InSWG_SwPageBreak,
+/* OLDRES_SEL_PAGE */ InSWG_Nothing,
+/* OLDRES_PAPER_TRAY */ InSWG_SwFmtPaperBin,
+/* OLDRES_FRM_RNDREQUEST */ InSWG_Nothing,
+/* OLDRES_FRM_RNDSUPPLY */ InSWG_Nothing,
+/* OLDRES_LR_SPACE */ InSWG_SwLRSpace,
+/* OLDRES_UL_SPACE */ InSWG_SwULSpace,
+/* OLDRES_CNTNT */ InSWG_SwFmtCntnt,
+/* OLDRES_HEADER */ InSWG_SwFmtHeader,
+/* OLDRES_FOOTER */ InSWG_SwFmtFooter,
+/* OLDRES_FLY_PRINT */ InSWG_SwFmtPrint,
+/* OLDRES_FLY_OPAQUE */ InSWG_SwFmtOpaque,
+/* OLDRES_FLY_PROTECT */ InSWG_SwFmtProtect,
+/* OLDRES_FLY_MAINCNTNT */ InSWG_SwFmtSurround,
+/* OLDRES_FLY_VERT_ORIENT */ InSWG_SwFmtVertOrient,
+/* OLDRES_FLY_HORI_ORIENT */ InSWG_SwFmtHoriOrient,
+/* OLDRES_FLY_GENERIC */ InSWG_Nothing,
+/* OLDRES_FLY_ANCHOR */ InSWG_SwFmtAnchor,
+/* OLDRES_BACKGROUND */ InSWG_SwFmtBackground,
+/* OLDRES_BOX */ InSWG_SwBox,
+/* OLDRES_SHADOW */ InSWG_SwFmtShadow,
+/* OLDRES_PAGEDESC */ InSWG_SwFmtPageDesc,
+/* OLDRES_FRMMACRO */ InSWG_SwFmtMacro,
+/* OLDRES_COL_BREAK */ InSWG_SwColBreak,
+/* OLDRES_COL */ InSWG_SwFmtCol
+};
+
+static SwHintFn __READONLY_DATA aGrfInAttrs[] =
+{
+/* OLDRES_GRFATR_GRFSIZE */ InSWG_Nothing,
+/* OLDRES_GRFATR_MIRRORGRF */ InSWG_SwMirrorGrf,
+/* OLDRES_GRFATR_GRFOFFSET */ InSWG_Nothing,
+/* OLDRES_GRFATR_ALIGNGRF */ InSWG_Nothing,
+/* OLDRES_GRFATR_CROPGRF */ InSWG_SwCropGrf
+};
+
+#if defined GCC || defined HPUX
+struct HintFns
+#else
+static struct HintFns
+#endif
+{
+ const SwHintFn* pHintTab;
+ short nHintId1;
+}
+#if defined GCC || defined HPUX
+;
+static __READONLY_DATA HintFns aHintFns[] =
+#else
+__READONLY_DATA aHintFns[] =
+#endif
+{
+ { aChrInAttrs, OLDRES_CHRATR_BEGIN },
+ { aFontInAttrs, OLDFONT_TXTATR_BEGIN},
+ { aEtcInAttrs, OLDETC_TXTATR_BEGIN },
+ { aParInAttrs, OLDRES_PARATR_BEGIN },
+ { aAddInAttrs, OLDRES_ADD_BEGIN },
+ { aFrmInAttrs, OLDRES_FRMATR_BEGIN },
+ { aGrfInAttrs, OLDRES_GRFATR_BEGIN }
+
+};
+
+static USHORT __READONLY_DATA nAttrSizes[] =
+{
+ OLDRES_CHRATR_END + 1 - OLDRES_CHRATR_BEGIN,
+ OLDFONT_TXTATR_END - OLDFONT_TXTATR_BEGIN,
+ OLDETC_TXTATR_END - OLDETC_TXTATR_BEGIN,
+ OLDRES_PARATR_END - OLDRES_PARATR_BEGIN,
+ OLDRES_ADD_END - OLDRES_ADD_BEGIN,
+ OLDRES_FRMATR_END - OLDRES_FRMATR_BEGIN,
+ OLDRES_GRFATR_END - OLDRES_GRFATR_BEGIN
+};
+
+// Einlesen eines Format-Hints in ein Format
+// Der Returnwert ist das Which-ID des eingelesenen Hints oder 0
+
+USHORT SwSwgReader::InHint( SfxItemSet& rSet )
+{
+ USHORT nId = r.cur();
+ long nextrec = r.getskip();
+ SwHintFn pFn = NULL;
+
+ for( short i = 6; i >= 0; i-- )
+ {
+ USHORT id1 = aHdr.cAttrTab[ i ];
+ if( nId >= id1 )
+ {
+ nId -= id1;
+ // Ausserhalb des Bereiches?
+ if( nId >= aHdr.cAttrSiz[ i ] ) {
+ Error(); return 0;
+ }
+ // Interpretierbar?
+ if( nId < nAttrSizes[ i ] )
+ pFn = aHintFns[ i ].pHintTab[ nId ];
+ break;
+ }
+ }
+ USHORT nWhich = 0;
+ if( pFn )
+ nWhich = (*pFn) ( *this, &rSet, NULL, 0, 0 );
+ // Vorsicht! Der Fussnoten-Hint ist erst zum Teil geparst!!
+ if( nWhich != RES_TXTATR_FTN )
+ r.skip( nextrec );
+ return nWhich;
+}
+
+// Einen Text-Hint einlesen und anfuegen. Der Which-ID oder
+// 0 wird returned.
+
+USHORT SwSwgReader::InHint( SwTxtNode& rNd, xub_StrLen nBeg, xub_StrLen nEnd )
+{
+ USHORT nId = r.cur();
+ long nextrec = r.getskip();
+ SwHintFn pFn = NULL;
+
+ for( short i = 6; i >= 0; i-- )
+ {
+ USHORT id1 = aHdr.cAttrTab[ i ];
+ if( nId >= id1 )
+ {
+ nId -= id1;
+ // Ausserhalb des Bereiches?
+ if( nId >= aHdr.cAttrSiz[ i ] ) {
+ Error(); return 0;
+ }
+ // Interpretierbar?
+ if( nId < nAttrSizes[ i ] )
+ pFn = aHintFns[ i ].pHintTab[ nId ];
+ break;
+ }
+ }
+ USHORT nWhich = 0;
+ if( pFn )
+ nWhich = (*pFn) ( *this, NULL, &rNd, nBeg, nEnd );
+ // Vorsicht! Der Fussnoten-Hint ist erst zum Teil geparst!!
+ if( nWhich != RES_TXTATR_FTN )
+ r.skip( nextrec );
+ return nWhich;
+}
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */