diff options
Diffstat (limited to 'sw/source/filter/ww8/ww8atr.cxx')
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 3375 |
1 files changed, 1707 insertions, 1668 deletions
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index b3e13520a14d..2b8c24555989 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -33,23 +33,19 @@ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ /* - * Dieses File enthaelt alle Ausgabe-Funktionen des WW8-Writers; - * fuer alle Nodes, Attribute, Formate und Chars. + * This file contains methods for the WW8 output + * (nodes, attributes, formats und chars). */ - #include <hintids.hxx> -#ifndef _APP_HXX //autogen #include <vcl/svapp.hxx> -#endif #include <vcl/salbtype.hxx> #include <svtools/zformat.hxx> #include <svtools/itemiter.hxx> +#include <svtools/whiter.hxx> #include <svx/fontitem.hxx> -#ifndef _SVX_TSTPITEM_HXX //autogen #include <svx/tstpitem.hxx> -#endif #include <svx/adjitem.hxx> #include <svx/spltitem.hxx> #include <svx/widwitem.hxx> @@ -104,15 +100,15 @@ #include <txtfld.hxx> #include <txtftn.hxx> #include <poolfmt.hxx> -#include <doc.hxx> // Doc fuer Fussnoten +#include <doc.hxx> // Doc for footnotes #include <pam.hxx> #include <paratr.hxx> -#include <fldbas.hxx> // fuer SwField ... -#include <docufld.hxx> // fuer SwField ... +#include <fldbas.hxx> // for SwField +#include <docufld.hxx> // for SwField #include <expfld.hxx> -#include <pagedesc.hxx> // fuer SwPageDesc... -#include <flddat.hxx> // fuer Datum-Felder -#include <ndtxt.hxx> // fuer Numrules +#include <pagedesc.hxx> // for SwPageDesc +#include <flddat.hxx> // for Date fields +#include <ndtxt.hxx> // for Numrules #include <fmthbsh.hxx> #include <swrect.hxx> #include <reffld.hxx> @@ -124,15 +120,15 @@ #include <tox.hxx> #include <fmtftntx.hxx> #include <breakit.hxx> -#ifndef _COM_SUN_STAR_I18N_SCRIPTTYPE_HDL_ #include <com/sun/star/i18n/ScriptType.hdl> -#endif #include <unotools/localedatawrapper.hxx> #include <tgrditem.hxx> #include <flddropdown.hxx> #include <chpfld.hxx> #include <fmthdft.hxx> +#include <writerfilter/doctok/sprmids.hxx> + #if OSL_DEBUG_LEVEL > 1 # include <fmtcntnt.hxx> #endif @@ -140,6 +136,7 @@ #include "writerwordglue.hxx" #include "wrtww8.hxx" #include "ww8par.hxx" +#include "ww8attributeoutput.hxx" #include "fields.hxx" #include <vcl/outdev.hxx> #include <i18npool/mslangid.hxx> @@ -148,7 +145,6 @@ using namespace ::com::sun::star; using namespace nsFieldFlags; using namespace nsSwDocInfoSubType; - /* * um nicht immer wieder nach einem Update festzustellen, das irgendwelche * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle @@ -175,30 +171,17 @@ using namespace nsSwDocInfoSubType; using namespace sw::util; using namespace sw::types; -//------------------------------------------------------------ -// Forward-Declarationen -//------------------------------------------------------------ -static Writer& OutWW8_SwFmtBreak( Writer& rWrt, const SfxPoolItem& rHt ); -static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt ); -/* -Sadly word does not have two different sizes for asian font size and western -font size, it has two different fonts, but not sizes, so we have to use our -guess as to the script used and disable the export of one type. The same -occurs for font weight and posture (bold and italic) - -In addition WW7- has only one character language identifier while WW8+ has two -*/ -bool SwWW8Writer::CollapseScriptsforWordOk(USHORT nScript, USHORT nWhich) +bool WW8Export::CollapseScriptsforWordOk( USHORT nScript, USHORT nWhich ) { bool bRet = true; - if (nScript == i18n::ScriptType::ASIAN) + if ( nScript == i18n::ScriptType::ASIAN ) { //for asian in ww8, there is only one fontsize //and one fontstyle (posture/weight) for ww6 //there is the additional problem that there //is only one font setting for all three scripts - switch (nWhich) + switch ( nWhich ) { case RES_CHRATR_FONTSIZE: case RES_CHRATR_POSTURE: @@ -217,14 +200,14 @@ bool SwWW8Writer::CollapseScriptsforWordOk(USHORT nScript, USHORT nWhich) break; } } - else if (nScript == i18n::ScriptType::COMPLEX) + else if ( nScript == i18n::ScriptType::COMPLEX ) { //Complex is ok in ww8, but for ww6 there is only //one font, one fontsize, one fontsize (weight/posture) //and only one language - if (bWrtWW8 == 0) + if ( bWrtWW8 == 0 ) { - switch (nWhich) + switch ( nWhich ) { case RES_CHRATR_CJK_FONT: case RES_CHRATR_CJK_FONTSIZE: @@ -249,7 +232,7 @@ bool SwWW8Writer::CollapseScriptsforWordOk(USHORT nScript, USHORT nWhich) //and one fontstyle (posture/weight) for ww6 //there is the additional problem that there //is only one font setting for all three scripts - switch (nWhich) + switch ( nWhich ) { case RES_CHRATR_CJK_FONTSIZE: case RES_CHRATR_CJK_POSTURE: @@ -262,7 +245,7 @@ bool SwWW8Writer::CollapseScriptsforWordOk(USHORT nScript, USHORT nWhich) case RES_CHRATR_CTL_LANGUAGE: case RES_CHRATR_CTL_POSTURE: case RES_CHRATR_CTL_WEIGHT: - if (bWrtWW8 == 0) + if ( bWrtWW8 == 0 ) bRet = false; default: break; @@ -275,19 +258,16 @@ bool SwWW8Writer::CollapseScriptsforWordOk(USHORT nScript, USHORT nWhich) // Hilfsroutinen fuer Styles //------------------------------------------------------------ -void SwWW8Writer::ExportPoolItemsToCHP(sw::PoolItems &rItems, USHORT nScript) +void MSWordExportBase::ExportPoolItemsToCHP( sw::PoolItems &rItems, USHORT nScript ) { sw::cPoolItemIter aEnd = rItems.end(); - for (sw::cPoolItemIter aI = rItems.begin(); aI != aEnd; ++aI) + for ( sw::cPoolItemIter aI = rItems.begin(); aI != aEnd; ++aI ) { const SfxPoolItem *pItem = aI->second; USHORT nWhich = pItem->Which(); - if (!isCHRATR(nWhich) && !isTXTATR(nWhich)) - continue; - if (FnAttrOut pOut = aWW8AttrFnTab[nWhich - RES_CHRATR_BEGIN]) + if ( ( isCHRATR( nWhich ) || isTXTATR( nWhich ) ) && CollapseScriptsforWordOk( nScript, nWhich ) ) { - if (SwWW8Writer::CollapseScriptsforWordOk(nScript, nWhich)) - (*pOut)(*this, *pItem); + AttrOutput().OutputItem( *pItem ); } } } @@ -297,71 +277,62 @@ void SwWW8Writer::ExportPoolItemsToCHP(sw::PoolItems &rItems, USHORT nScript) * - gebe die Attribute aus; ohne Parents! */ -void SwWW8Writer::Out_SfxItemSet(const SfxItemSet& rSet, bool bPapFmt, - bool bChpFmt, USHORT nScript) +void MSWordExportBase::OutputItemSet( const SfxItemSet& rSet, bool bPapFmt, bool bChpFmt, USHORT nScript ) { - if (rSet.Count()) + if ( rSet.Count() ) { const SfxPoolItem* pItem; - FnAttrOut pOut; - pISet = &rSet; // fuer Doppel-Attribute - //If frame dir is set, but not adjust, then force adjust as well - if (bPapFmt && SFX_ITEM_SET == rSet.GetItemState(RES_FRAMEDIR, false)) + // If frame dir is set, but not adjust, then force adjust as well + if ( bPapFmt && SFX_ITEM_SET == rSet.GetItemState( RES_FRAMEDIR, false ) ) { - //No explicit adjust set ? - if (SFX_ITEM_SET != rSet.GetItemState(RES_PARATR_ADJUST, false)) + // No explicit adjust set ? + if ( SFX_ITEM_SET != rSet.GetItemState( RES_PARATR_ADJUST, false ) ) { - if (0 != (pItem = rSet.GetItem(RES_PARATR_ADJUST))) + if ( 0 != ( pItem = rSet.GetItem( RES_PARATR_ADJUST ) ) ) { // then set the adjust used by the parent format - pOut = aWW8AttrFnTab[ static_cast< USHORT >(RES_PARATR_ADJUST) - RES_CHRATR_BEGIN]; - (*pOut)( *this, *pItem ); + AttrOutput().OutputItem( *pItem ); } } } - if (bPapFmt && SFX_ITEM_SET == rSet.GetItemState(RES_PARATR_NUMRULE, - false, &pItem)) + if ( bPapFmt && SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE, false, &pItem ) ) { - pOut = aWW8AttrFnTab[ static_cast< USHORT >(RES_PARATR_NUMRULE) - RES_CHRATR_BEGIN ]; - (*pOut)( *this, *pItem ); + AttrOutput().OutputItem( *pItem ); + // switch off the numerbering? - if( !((SwNumRuleItem*)pItem)->GetValue().Len() && SFX_ITEM_SET - != rSet.GetItemState( RES_LR_SPACE, false) && SFX_ITEM_SET - == rSet.GetItemState( RES_LR_SPACE, true, &pItem ) ) + if ( !( (SwNumRuleItem*)pItem )->GetValue().Len() && + SFX_ITEM_SET != rSet.GetItemState( RES_LR_SPACE, false) && + SFX_ITEM_SET == rSet.GetItemState( RES_LR_SPACE, true, &pItem ) ) { // the set the LR-Space of the parentformat! - pOut = aWW8AttrFnTab[ static_cast< USHORT >(RES_LR_SPACE) - RES_CHRATR_BEGIN ]; - (*pOut)( *this, *pItem ); + AttrOutput().OutputItem( *pItem ); } } sw::PoolItems aItems; - GetPoolItems(rSet, aItems); - if (bChpFmt) + GetPoolItems( rSet, aItems ); + if ( bChpFmt ) ExportPoolItemsToCHP(aItems, nScript); - if (bPapFmt) + if ( bPapFmt ) { sw::cPoolItemIter aEnd = aItems.end(); - for (sw::cPoolItemIter aI = aItems.begin(); aI != aEnd; ++aI) + for ( sw::cPoolItemIter aI = aItems.begin(); aI != aEnd; ++aI ) { pItem = aI->second; USHORT nWhich = pItem->Which(); - if (nWhich < RES_PARATR_BEGIN || nWhich >= RES_FRMATR_END || nWhich == RES_PARATR_NUMRULE) - continue; - pOut = aWW8AttrFnTab[nWhich - RES_CHRATR_BEGIN]; - if( 0 != pOut ) - (*pOut)(*this, *pItem); + if ( nWhich >= RES_PARATR_BEGIN && nWhich < RES_FRMATR_END && nWhich != RES_PARATR_NUMRULE) + AttrOutput().OutputItem( *pItem ); } } pISet = 0; // fuer Doppel-Attribute } } -void SwWW8Writer::GatherChapterFields() +void MSWordExportBase::GatherChapterFields() { //If the header/footer contains a chapter field SwClientIter aIter(*pDoc->GetSysFldType(RES_CHAPTERFLD)); @@ -378,20 +349,20 @@ void SwWW8Writer::GatherChapterFields() } } -bool SwWW8Writer::CntntContainsChapterField(const SwFmtCntnt &rCntnt) const +bool MSWordExportBase::CntntContainsChapterField(const SwFmtCntnt &rCntnt) const { bool bRet = false; - if (const SwNodeIndex* pSttIdx = rCntnt.GetCntntIdx()) + if ( const SwNodeIndex* pSttIdx = rCntnt.GetCntntIdx() ) { - SwNodeIndex aIdx(*pSttIdx, 1); - SwNodeIndex aEnd(*pSttIdx->GetNode().EndOfSectionNode()); + SwNodeIndex aIdx( *pSttIdx, 1 ); + SwNodeIndex aEnd( *pSttIdx->GetNode().EndOfSectionNode() ); ULONG nStart = aIdx.GetIndex(); ULONG nEnd = aEnd.GetIndex(); //If the header/footer contains a chapter field mycCFIter aIEnd = maChapterFieldLocs.end(); - for (mycCFIter aI = maChapterFieldLocs.begin(); aI != aIEnd; ++aI) + for ( mycCFIter aI = maChapterFieldLocs.begin(); aI != aIEnd; ++aI ) { - if ((nStart <= *aI) && (*aI <= nEnd)) + if ( ( nStart <= *aI ) && ( *aI <= nEnd ) ) { bRet = true; break; @@ -401,22 +372,25 @@ bool SwWW8Writer::CntntContainsChapterField(const SwFmtCntnt &rCntnt) const return bRet; } -bool SwWW8Writer::FmtHdFtContainsChapterField(const SwFrmFmt &rFmt) const +bool MSWordExportBase::FmtHdFtContainsChapterField(const SwFrmFmt &rFmt) const { - if (maChapterFieldLocs.empty()) + if ( maChapterFieldLocs.empty() ) return false; - bool bRet = false; const SwFrmFmt *pFmt = 0; - if (0 != (pFmt = rFmt.GetHeader().GetHeaderFmt())) - bRet = CntntContainsChapterField(pFmt->GetCntnt()); - if (!bRet && 0 != (pFmt = rFmt.GetFooter().GetFooterFmt())) - bRet = CntntContainsChapterField(pFmt->GetCntnt()); - return bRet; + pFmt = rFmt.GetHeader().GetHeaderFmt(); + if ( pFmt && CntntContainsChapterField( pFmt->GetCntnt() ) ) + return true; + + pFmt = rFmt.GetFooter().GetFooterFmt(); + if ( pFmt && CntntContainsChapterField( pFmt->GetCntnt() ) ) + return true; + + return false; } -bool SwWW8Writer::SetAktPageDescFromNode(const SwNode &rNd) +bool MSWordExportBase::SetAktPageDescFromNode(const SwNode &rNd) { bool bNewPageDesc = false; const SwPageDesc* pCurrent = SwPageDesc::GetPageDescOfNode(rNd); @@ -453,13 +427,9 @@ bool SwWW8Writer::SetAktPageDescFromNode(const SwNode &rNd) // Es duerfen nur Funktionen gerufen werden, die nicht in den // Ausgabebereich pO schreiben, da dieser nur einmal fuer CHP und PAP existiert // und damit im falschen landen wuerden. -void SwWW8Writer::Out_SfxBreakItems(const SfxItemSet *pSet, const SwNode& rNd) +void MSWordExportBase::OutputSectionBreaks( const SfxItemSet *pSet, const SwNode& rNd ) { - bool bAllowOutputPageDesc = false; - if (!bStyDef && !bOutKF && !bInWriteEscher && !bOutPageDescs) - bAllowOutputPageDesc = true; - - if (!bAllowOutputPageDesc) + if ( bStyDef || bOutKF || bInWriteEscher || bOutPageDescs ) return; bBreakBefore = true; @@ -474,17 +444,17 @@ void SwWW8Writer::Out_SfxBreakItems(const SfxItemSet *pSet, const SwNode& rNd) //section. bool bBreakSet = false; - if (pSet && pSet->Count()) + if ( pSet && pSet->Count() ) { - if (SFX_ITEM_SET == pSet->GetItemState(RES_PAGEDESC, false, &pItem) - && ((SwFmtPageDesc*)pItem)->GetRegisteredIn()) + if ( SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, false, &pItem ) + && ( (SwFmtPageDesc*)pItem )->GetRegisteredIn() ) { bBreakSet = true; bNewPageDesc = true; pPgDesc = (const SwFmtPageDesc*)pItem; pAktPageDesc = pPgDesc->GetPageDesc(); } - else if (SFX_ITEM_SET == pSet->GetItemState(RES_BREAK, false, &pItem)) + else if ( SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, false, &pItem ) ) { // --> FME 2007-05-30 #146867# Word does not like hard break attributes in some table cells bool bRemoveHardBreakInsideTable = false; @@ -521,7 +491,7 @@ void SwWW8Writer::Out_SfxBreakItems(const SfxItemSet *pSet, const SwNode& rNd) done when it happens when we get a new pagedesc because we overflow from the first page style. */ - if (pAktPageDesc) + if ( pAktPageDesc ) { // --> OD 2007-05-30 #i76301# // assure that there is a page break before set at the node. @@ -529,12 +499,12 @@ void SwWW8Writer::Out_SfxBreakItems(const SfxItemSet *pSet, const SwNode& rNd) if ( pBreak && pBreak->GetBreak() == SVX_BREAK_PAGE_BEFORE ) { - bNewPageDesc = SetAktPageDescFromNode(rNd); + bNewPageDesc = SetAktPageDescFromNode( rNd ); } // <-- } - if (!bNewPageDesc) - OutWW8_SwFmtBreak( *this, *pItem ); + if ( !bNewPageDesc ) + AttrOutput().OutputItem( *pItem ); } } } @@ -547,72 +517,41 @@ void SwWW8Writer::Out_SfxBreakItems(const SfxItemSet *pSet, const SwNode& rNd) that moves onto a new page because of layout, but that would be insane. */ bool bHackInBreak = false; - if (!bBreakSet) + if ( !bBreakSet ) { - if (const SwCntntNode *pNd = rNd.GetCntntNode()) + if ( const SwCntntNode *pNd = rNd.GetCntntNode() ) { const SvxFmtBreakItem &rBreak = - ItemGet<SvxFmtBreakItem>(*pNd, RES_BREAK); - if (rBreak.GetBreak() == SVX_BREAK_PAGE_BEFORE) + ItemGet<SvxFmtBreakItem>( *pNd, RES_BREAK ); + if ( rBreak.GetBreak() == SVX_BREAK_PAGE_BEFORE ) bHackInBreak = true; else { // Even a pagedesc item is set, the break item can be set 'NONE', // but a pagedesc item is an implicit page break before... const SwFmtPageDesc &rPageDesc = ItemGet<SwFmtPageDesc>( *pNd, RES_PAGEDESC ); - if( rPageDesc.GetRegisteredIn() ) + if ( rPageDesc.GetRegisteredIn() ) bHackInBreak = true; } } } - if (bHackInBreak) + if ( bHackInBreak ) { - ASSERT(pAktPageDesc, "should not be possible"); - if (pAktPageDesc) - bNewPageDesc = SetAktPageDescFromNode(rNd); + ASSERT( pAktPageDesc, "should not be possible" ); + if ( pAktPageDesc ) + bNewPageDesc = SetAktPageDescFromNode( rNd ); } - if (bNewPageDesc && pAktPageDesc) + if ( bNewPageDesc && pAktPageDesc ) { - // --> OD 2007-05-29 #i76300# - // code moved code to method <SwWW8Writer::PrepareNewPageDesc(..)> -// // Die PageDescs werden beim Auftreten von PageDesc-Attributen nur in -// // WW8Writer::pSepx mit der entsprechenden Position eingetragen. Das -// // Aufbauen und die Ausgabe der am PageDesc haengenden Attribute und -// // Kopf/Fusszeilen passiert nach dem Haupttext und seinen Attributen. - -// ULONG nFcPos = ReplaceCr(0x0c); // Page/Section-Break - -// const SwSectionFmt *pFmt = 0; -// const SwSectionNode* pSect = rNd.FindSectionNode(); -// if (pSect && CONTENT_SECTION == pSect->GetSection().GetType()) -// pFmt = pSect->GetSection().GetFmt(); - -// // tatsaechlich wird hier NOCH NICHTS ausgegeben, sondern -// // nur die Merk-Arrays aCps, aSects entsprechend ergaenzt -// if (nFcPos) -// { -// const SwFmtLineNumber *pNItem = 0; -// if (pSet) -// pNItem = &(ItemGet<SwFmtLineNumber>(*pSet,RES_LINENUMBER)); -// else if (const SwCntntNode *pNd = rNd.GetCntntNode()) -// pNItem = &(ItemGet<SwFmtLineNumber>(*pNd,RES_LINENUMBER)); -// ULONG nLnNm = pNItem ? pNItem->GetStartValue() : 0; - -// if (pPgDesc) -// pSepx->AppendSep(Fc2Cp(nFcPos), *pPgDesc, rNd, pFmt, nLnNm); -// else -// pSepx->AppendSep(Fc2Cp(nFcPos), pAktPageDesc, rNd, pFmt, nLnNm); -// } PrepareNewPageDesc( pSet, rNd, pPgDesc, pAktPageDesc ); } bBreakBefore = false; } // --> OD 2007-05-29 #i76300# -bool SwWW8Writer::Out_FollowPageDesc( const SfxItemSet* pSet, - const SwTxtNode* pNd ) +bool MSWordExportBase::OutputFollowPageDesc( const SfxItemSet* pSet, const SwTxtNode* pNd ) { bool bRet = false; @@ -627,8 +566,35 @@ bool SwWW8Writer::Out_FollowPageDesc( const SfxItemSet* pSet, return bRet; } -// initial version by extracting corresponding code from method <SwWW8Writer::Out_SfxBreakItems(..)> -void SwWW8Writer::PrepareNewPageDesc( const SfxItemSet*pSet, +const SwSectionFmt* MSWordExportBase::GetSectionFormat( const SwNode& rNd ) const +{ + const SwSectionFmt* pFmt = NULL; + const SwSectionNode* pSect = rNd.FindSectionNode(); + if ( pSect && + CONTENT_SECTION == pSect->GetSection().GetType() ) + { + pFmt = pSect->GetSection().GetFmt(); + } + + return pFmt; +} + +ULONG MSWordExportBase::GetSectionLineNo( const SfxItemSet* pSet, const SwNode& rNd ) const +{ + const SwFmtLineNumber* pNItem = 0; + if ( pSet ) + { + pNItem = &( ItemGet<SwFmtLineNumber>( *pSet, RES_LINENUMBER ) ); + } + else if ( const SwCntntNode *pNd = rNd.GetCntntNode() ) + { + pNItem = &( ItemGet<SwFmtLineNumber>( *pNd, RES_LINENUMBER ) ); + } + + return pNItem? pNItem->GetStartValue() : 0; +} + +void WW8Export::PrepareNewPageDesc( const SfxItemSet*pSet, const SwNode& rNd, const SwFmtPageDesc* pNewPgDescFmt, const SwPageDesc* pNewPgDesc ) @@ -638,63 +604,45 @@ void SwWW8Writer::PrepareNewPageDesc( const SfxItemSet*pSet, // Aufbauen und die Ausgabe der am PageDesc haengenden Attribute und // Kopf/Fusszeilen passiert nach dem Haupttext und seinen Attributen. - ULONG nFcPos = ReplaceCr(0x0c); // Page/Section-Break - - const SwSectionFmt* pFmt = 0; - const SwSectionNode* pSect = rNd.FindSectionNode(); - if ( pSect && - CONTENT_SECTION == pSect->GetSection().GetType() ) - { - pFmt = pSect->GetSection().GetFmt(); - } + ULONG nFcPos = ReplaceCr( msword::PageBreak ); // Page/Section-Break // tatsaechlich wird hier NOCH NICHTS ausgegeben, sondern // nur die Merk-Arrays aCps, aSects entsprechend ergaenzt - if ( nFcPos ) - { - const SwFmtLineNumber* pNItem = 0; - if ( pSet ) - { - pNItem = &(ItemGet<SwFmtLineNumber>(*pSet,RES_LINENUMBER)); - } - else if (const SwCntntNode *pNd = rNd.GetCntntNode()) - { - pNItem = &(ItemGet<SwFmtLineNumber>(*pNd,RES_LINENUMBER)); - } - const ULONG nLnNm = pNItem ? pNItem->GetStartValue() : 0; + if ( !nFcPos ) + return; - if ( pNewPgDescFmt ) - { - pSepx->AppendSep(Fc2Cp(nFcPos), *pNewPgDescFmt, rNd, pFmt, nLnNm); - } - else if ( pNewPgDesc ) - { - pSepx->AppendSep(Fc2Cp(nFcPos), pNewPgDesc, rNd, pFmt, nLnNm); - } - else - { - ASSERT( false, "<SwWW8Writer::PrepareNewPageDesc(..)> - misusage: neither page desc format nor page desc provided." ); - } + const SwSectionFmt* pFmt = GetSectionFormat( rNd ); + const ULONG nLnNm = GetSectionLineNo( pSet, rNd ); + + ASSERT( pNewPgDescFmt || pNewPgDesc, "Neither page desc format nor page desc provided." ); + + if ( pNewPgDescFmt ) + { + pSepx->AppendSep( Fc2Cp( nFcPos ), *pNewPgDescFmt, rNd, pFmt, nLnNm ); + } + else if ( pNewPgDesc ) + { + pSepx->AppendSep( Fc2Cp( nFcPos ), pNewPgDesc, rNd, pFmt, nLnNm ); } } -// <-- - -void SwWW8Writer::CorrTabStopInSet(SfxItemSet& rSet, USHORT nAbsLeft) +void MSWordExportBase::CorrectTabStopInSet( SfxItemSet& rSet, USHORT nAbsLeft ) { const SvxTabStopItem *pItem = - sw::util::HasItem<SvxTabStopItem>(rSet, RES_PARATR_TABSTOP); + sw::util::HasItem<SvxTabStopItem>( rSet, RES_PARATR_TABSTOP ); - if (pItem) + if ( pItem ) { // dann muss das fuer die Ausgabe korrigiert werden SvxTabStopItem aTStop(*pItem); - for(USHORT nCnt = 0; nCnt < aTStop.Count(); ++nCnt) + for ( USHORT nCnt = 0; nCnt < aTStop.Count(); ++nCnt ) { SvxTabStop& rTab = (SvxTabStop&)aTStop[ nCnt ]; - if( SVX_TAB_ADJUST_DEFAULT != rTab.GetAdjustment() && + if ( SVX_TAB_ADJUST_DEFAULT != rTab.GetAdjustment() && rTab.GetTabPos() >= nAbsLeft ) + { rTab.GetTabPos() -= nAbsLeft; + } else { aTStop.Remove( nCnt ); @@ -705,7 +653,7 @@ void SwWW8Writer::CorrTabStopInSet(SfxItemSet& rSet, USHORT nAbsLeft) } } -BYTE SwWW8Writer::GetNumId( USHORT eNumType ) +BYTE WW8Export::GetNumId( USHORT eNumType ) { BYTE nRet = 0; switch( eNumType ) @@ -726,26 +674,25 @@ BYTE SwWW8Writer::GetNumId( USHORT eNumType ) return nRet; } -void SwWW8Writer::ExportOutlineNumbering(BYTE nLvl, const SwNumFmt &rNFmt, - const SwFmt &rFmt) +void WW8AttributeOutput::OutlineNumbering( BYTE nLvl, const SwNumFmt &rNFmt, const SwFmt &rFmt ) { - if (nLvl >= WW8ListManager::nMaxLevel) + if ( nLvl >= WW8ListManager::nMaxLevel ) nLvl = WW8ListManager::nMaxLevel-1; - if( bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { // write sprmPOutLvl sprmPIlvl and sprmPIlfo - SwWW8Writer::InsUInt16( *pO, 0x2640 ); - pO->Insert( nLvl, pO->Count() ); - SwWW8Writer::InsUInt16( *pO, 0x260a ); - pO->Insert( nLvl, pO->Count() ); - SwWW8Writer::InsUInt16( *pO, 0x460b ); - SwWW8Writer::InsUInt16( *pO, 1 + GetId( - *pDoc->GetOutlineNumRule() ) ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_POutLvl ); + m_rWW8Export.pO->Insert( nLvl, m_rWW8Export.pO->Count() ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_PIlvl ); + m_rWW8Export.pO->Insert( nLvl, m_rWW8Export.pO->Count() ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_PIlfo ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, + 1 + m_rWW8Export.GetId( *m_rWW8Export.pDoc->GetOutlineNumRule() ) ); } else { - Out_SwNumLvl( nLvl ); + m_rWW8Export.Out_SwNumLvl( nLvl ); // --> OD 2008-06-03 #i86652# // if (rNFmt.GetAbsLSpace()) if ( rNFmt.GetPositionAndSpaceMode() == @@ -753,22 +700,25 @@ void SwWW8Writer::ExportOutlineNumbering(BYTE nLvl, const SwNumFmt &rNFmt, rNFmt.GetAbsLSpace() ) // <-- { - SwNumFmt aNumFmt(rNFmt); + SwNumFmt aNumFmt( rNFmt ); const SvxLRSpaceItem& rLR = - ItemGet<SvxLRSpaceItem>(rFmt, RES_LR_SPACE); - aNumFmt.SetAbsLSpace(writer_cast<short>( - aNumFmt.GetAbsLSpace() + rLR.GetLeft())); - Out_NumRuleAnld( *pDoc->GetOutlineNumRule(), - aNumFmt, nLvl ); + ItemGet<SvxLRSpaceItem>( rFmt, RES_LR_SPACE ); + + aNumFmt.SetAbsLSpace( writer_cast<short>( + aNumFmt.GetAbsLSpace() + rLR.GetLeft() ) ); + m_rWW8Export.Out_NumRuleAnld( + *m_rWW8Export.pDoc->GetOutlineNumRule(), + aNumFmt, nLvl ); } else - Out_NumRuleAnld( *pDoc->GetOutlineNumRule(), - rNFmt, nLvl ); + m_rWW8Export.Out_NumRuleAnld( + *m_rWW8Export.pDoc->GetOutlineNumRule(), + rNFmt, nLvl ); } } // --> OD 2007-06-04 #i77805# -bool SwWW8Writer::DisallowInheritingOutlineNumbering(const SwFmt &rFmt) +bool WW8Export::DisallowInheritingOutlineNumbering(const SwFmt &rFmt) { bool bRet( false ); @@ -787,9 +737,9 @@ bool SwWW8Writer::DisallowInheritingOutlineNumbering(const SwFmt &rFmt) { //<-end,zhaojianwei if (bWrtWW8) { - SwWW8Writer::InsUInt16(*pO, 0x2640); + SwWW8Writer::InsUInt16(*pO, NS_sprm::LN_POutLvl); pO->Insert(BYTE(9), pO->Count()); - SwWW8Writer::InsUInt16(*pO, 0x460b); + SwWW8Writer::InsUInt16(*pO, NS_sprm::LN_PIlfo); SwWW8Writer::InsUInt16(*pO, 0); bRet = true; @@ -803,8 +753,7 @@ bool SwWW8Writer::DisallowInheritingOutlineNumbering(const SwFmt &rFmt) } // <-- -void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, - bool bFlyFmt) +void MSWordExportBase::OutputFormat( const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, bool bFlyFmt ) { bool bCallOutSet = true; const SwModify* pOldMod = pOutFmtNode; @@ -825,9 +774,9 @@ void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, //if outline numbered // if Write StyleDefinition then write the OutlineRule - const SwNumFmt& rNFmt = pDoc->GetOutlineNumRule()->Get(static_cast<USHORT>(nLvl)); - if (bStyDef) - ExportOutlineNumbering(static_cast<BYTE>(nLvl), rNFmt, rFmt); + const SwNumFmt& rNFmt = pDoc->GetOutlineNumRule()->Get( static_cast<USHORT>( nLvl ) ); + if ( bStyDef ) + AttrOutput().OutlineNumbering( static_cast< BYTE >( nLvl ), rNFmt, rFmt ); // --> OD 2008-06-03 #i86652# // if (rNFmt.GetAbsLSpace()) @@ -844,8 +793,8 @@ void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, aLR.SetTxtFirstLineOfst( GetWordFirstLineOffset(rNFmt)); aSet.Put( aLR ); - SwWW8Writer::CorrTabStopInSet( aSet, rNFmt.GetAbsLSpace() ); - Out_SfxItemSet( aSet, bPapFmt, bChpFmt, + CorrectTabStopInSet( aSet, rNFmt.GetAbsLSpace() ); + OutputItemSet( aSet, bPapFmt, bChpFmt, i18n::ScriptType::LATIN); bCallOutSet = false; } @@ -863,7 +812,7 @@ void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, SvxLRSpaceItem aLR( ItemGet<SvxLRSpaceItem>(aSet, RES_LR_SPACE)); aSet.Put( aLR ); - Out_SfxItemSet( aSet, bPapFmt, bChpFmt, + OutputItemSet( aSet, bPapFmt, bChpFmt, com::sun::star::i18n::ScriptType::LATIN); bCallOutSet = false; } @@ -903,7 +852,7 @@ void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, bOutFlyFrmAttrs = true; //script doesn't matter if not exporting chp - Out_SfxItemSet(aSet, true, false, + OutputItemSet(aSet, true, false, i18n::ScriptType::LATIN); bOutFlyFrmAttrs = false; @@ -917,55 +866,64 @@ void SwWW8Writer::Out_SwFmt(const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, } if( bCallOutSet ) - Out_SfxItemSet( rFmt.GetAttrSet(), bPapFmt, bChpFmt, + OutputItemSet( rFmt.GetAttrSet(), bPapFmt, bChpFmt, i18n::ScriptType::LATIN); pOutFmtNode = pOldMod; } -bool SwWW8Writer::HasRefToObject(USHORT nTyp, const String* pNm, USHORT nSeqNo) +bool MSWordExportBase::HasRefToObject( USHORT nTyp, const String* pName, USHORT nSeqNo ) { - bool bFnd = false; const SwTxtNode* pNd; - SwClientIter aIter( *pDoc->GetSysFldType( RES_GETREFFLD )); - for( SwFmtFld* pFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld )); - pFld && !bFnd; pFld = (SwFmtFld*)aIter.Next() ) - if( pFld->GetTxtFld() && nTyp == pFld->GetFld()->GetSubType() && - 0 != ( pNd = pFld->GetTxtFld()->GetpTxtNode() ) && - pNd->GetNodes().IsDocNodes() ) + SwClientIter aIter( *pDoc->GetSysFldType( RES_GETREFFLD ) ); + for ( SwFmtFld* pFld = static_cast< SwFmtFld* >( aIter.First( TYPE( SwFmtFld ) ) ); + pFld; + pFld = static_cast< SwFmtFld* >( aIter.Next() ) ) + { + if ( pFld->GetTxtFld() && nTyp == pFld->GetFld()->GetSubType() && + 0 != ( pNd = pFld->GetTxtFld()->GetpTxtNode() ) && + pNd->GetNodes().IsDocNodes() ) { - const SwGetRefField& rRFld = *(SwGetRefField*)pFld->GetFld(); - switch( nTyp ) + const SwGetRefField& rRFld = *static_cast< SwGetRefField* >( pFld->GetFld() ); + switch ( nTyp ) { - case REF_BOOKMARK: - case REF_SETREFATTR: - bFnd = (*pNm == rRFld.GetSetRefName()) ? true : false; - break; - case REF_FOOTNOTE: - case REF_ENDNOTE: - bFnd = (nSeqNo == rRFld.GetSeqNo()) ? true : false; - break; - case REF_SEQUENCEFLD: break; // ??? - case REF_OUTLINE: break; // ??? + case REF_BOOKMARK: + case REF_SETREFATTR: + if ( pName && *pName == rRFld.GetSetRefName() ) + return true; + break; + case REF_FOOTNOTE: + case REF_ENDNOTE: + if ( nSeqNo == rRFld.GetSeqNo() ) + return true; + break; + case REF_SEQUENCEFLD: + break; // ??? + case REF_OUTLINE: + break; // ??? } } + } - return bFnd; + return false; } -String SwWW8Writer::GetBookmarkName( USHORT nTyp, const String* pNm, - USHORT nSeqNo ) +String MSWordExportBase::GetBookmarkName( USHORT nTyp, const String* pName, USHORT nSeqNo ) { String sRet; - switch( nTyp ) + switch ( nTyp ) { case REF_SETREFATTR: - sRet.APPEND_CONST_ASC( "Ref_" ); - sRet += *pNm; + if ( pName ) + { + sRet.APPEND_CONST_ASC( "Ref_" ); + sRet += *pName; + } break; case REF_SEQUENCEFLD: break; // ??? case REF_BOOKMARK: - sRet = *pNm; + if ( pName ) + sRet = *pName; break; case REF_OUTLINE: break; // ??? @@ -986,238 +944,307 @@ String SwWW8Writer::GetBookmarkName( USHORT nTyp, const String* pNm, //----------------------------------------------------------------------- /* */ /* File CHRATR.HXX: */ +void WW8AttributeOutput::RTLAndCJKState( bool bIsRTL, sal_uInt16 nScript ) +{ + if ( m_rWW8Export.bWrtWW8 && bIsRTL ) + { + m_rWW8Export.InsUInt16( NS_sprm::LN_CFBiDi ); + m_rWW8Export.pO->Insert( (BYTE)1, m_rWW8Export.pO->Count() ); + } + + // #i46087# patch from james_clark; complex texts needs the undocumented SPRM CComplexScript with param 0x81. + if ( m_rWW8Export.bWrtWW8 && nScript == i18n::ScriptType::COMPLEX && !bIsRTL ) + { + m_rWW8Export.InsUInt16( NS_sprm::LN_CComplexScript ); + m_rWW8Export.pO->Insert( (BYTE)0x81, m_rWW8Export.pO->Count() ); + m_rWW8Export.pDop->bUseThaiLineBreakingRules = true; + } +} + +void WW8AttributeOutput::EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner ) +{ + m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() ); + m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // delete + + if ( pTextNodeInfoInner.get() != NULL ) + { + if ( pTextNodeInfoInner->isEndOfLine() ) + { + TableRowEnd( pTextNodeInfoInner->getDepth() ); + + SVBT16 nSty; + ShortToSVBT16( m_rWW8Export.nStyleBeforeFly, nSty ); + m_rWW8Export.pO->Insert( (BYTE*)&nSty, 2, m_rWW8Export.pO->Count() ); // Style # + TableInfoRow( pTextNodeInfoInner ); + m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(), + m_rWW8Export.pO->GetData() ); + m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // delete + } + } +} -static Writer& OutWW8_SwBoldUSW(Writer& rWrt, BYTE nId, bool bVal) +void WW8AttributeOutput::StartRunProperties() { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16(8 == nId ? 0x2a53 : 0x0835 + nId); + WW8_WrPlcFld* pCurrentFields = m_rWW8Export.CurrentFieldPlc(); + m_nFieldResults = pCurrentFields ? pCurrentFields->ResultCount() : 0; +} + +void WW8AttributeOutput::EndRunProperties( const SwRedlineData* pRedlineData ) +{ + Redline( pRedlineData ); + + WW8_WrPlcFld* pCurrentFields = m_rWW8Export.CurrentFieldPlc(); + USHORT nNewFieldResults = pCurrentFields ? pCurrentFields->ResultCount() : 0; + + bool bExportedFieldResult = ( m_nFieldResults != nNewFieldResults ); + + // If we have exported a field result, then we will have been forced to + // split up the text into a 0x13, 0x14, <result> 0x15 sequence with the + // properties forced out at the end of the result, so the 0x15 itself + // should remain clean of all other attributes to avoid #iXXXXX# + if ( !bExportedFieldResult ) + { + m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), + m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() ); + } + m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // delete +} + +void WW8AttributeOutput::RunText( const String& rText, rtl_TextEncoding eCharSet ) +{ + RawText( rText, m_rWW8Export.bWrtWW8, eCharSet ); +} + +void WW8AttributeOutput::RawText( const String& rText, bool bForceUnicode, rtl_TextEncoding eCharSet ) +{ + m_rWW8Export.OutSwString( rText, 0, rText.Len(), bForceUnicode, eCharSet ); +} + +void WW8AttributeOutput::OutputFKP() +{ + if ( m_rWW8Export.pO->Count() ) + { + m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), + m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() ); + m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // delete + } +} + +void WW8AttributeOutput::ParagraphStyle( USHORT nStyle ) +{ + ASSERT( !m_rWW8Export.pO->Count(), " pO ist am ZeilenEnde nicht leer" ); + + SVBT16 nSty; + ShortToSVBT16( nStyle, nSty ); + m_rWW8Export.pO->Insert( (BYTE*)&nSty, 2, m_rWW8Export.pO->Count() ); // Style # +} + +void WW8AttributeOutput::OutputWW8Attribute( BYTE nId, bool bVal ) +{ + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( 8 == nId ? NS_sprm::LN_CFDStrike : NS_sprm::LN_CFBold + nId ); else if (8 == nId ) - return rWrt; // das Attribut gibt es im WW6 nicht + return; // no such attribute in WW6 else - rWrtWW8.pO->Insert( 85 + nId, rWrtWW8.pO->Count() ); - rWrtWW8.pO->Insert( bVal ? 1 : 0, rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.pO->Insert( 85 + nId, m_rWW8Export.pO->Count() ); + + m_rWW8Export.pO->Insert( bVal ? 1 : 0, m_rWW8Export.pO->Count() ); } -static Writer& OutWW8_SwBoldBiDiUSW(Writer& rWrt, BYTE nId, bool bVal) +void WW8AttributeOutput::OutputWW8AttributeCTL( BYTE nId, bool bVal ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - ASSERT(nId <= 1, "out of range"); - if (!rWrtWW8.bWrtWW8 || nId > 1) - return rWrt; + ASSERT( nId <= 1, "out of range" ); + if ( !m_rWW8Export.bWrtWW8 || nId > 1 ) + return; - rWrtWW8.InsUInt16(0x085C + nId); - rWrtWW8.pO->Insert(bVal ? 1 : 0, rWrtWW8.pO->Count()); - return rWrt; + m_rWW8Export.InsUInt16( NS_sprm::LN_CFBoldBi + nId ); + m_rWW8Export.pO->Insert( bVal ? 1 : 0, m_rWW8Export.pO->Count() ); } -static Writer& OutWW8_SwFont( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharFont( const SvxFontItem& rFont ) { - const SvxFontItem& rAttr = (const SvxFontItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - USHORT nFontID= rWrtWW8.GetId(rAttr); + USHORT nFontID = m_rWW8Export.GetId( rFont ); - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16( 0x4a4f ); - rWrtWW8.InsUInt16( nFontID ); - rWrtWW8.InsUInt16( 0x4a51 ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CRgFtc0 ); + m_rWW8Export.InsUInt16( nFontID ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CRgFtc2 ); } else - rWrtWW8.pO->Insert( 93, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( nFontID ); - return rWrt; + m_rWW8Export.pO->Insert( 93, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( nFontID ); } -static Writer& OutWW8_SwCTLFont(Writer& rWrt, const SfxPoolItem& rHt) +void WW8AttributeOutput::CharFontCTL( const SvxFontItem& rFont ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16(0x4A5E); - rWrtWW8.InsUInt16(rWrtWW8.GetId((const SvxFontItem&)rHt)); + m_rWW8Export.InsUInt16( NS_sprm::LN_CFtcBi ); + m_rWW8Export.InsUInt16( m_rWW8Export.GetId( rFont ) ); } - return rWrt; } -static Writer& OutWW8_SwCJKFont( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharFontCJK( const SvxFontItem& rFont ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16( 0x4a50 ); - rWrtWW8.InsUInt16(rWrtWW8.GetId((const SvxFontItem&)rHt)); + m_rWW8Export.InsUInt16( NS_sprm::LN_CRgFtc1 ); + m_rWW8Export.InsUInt16( m_rWW8Export.GetId( rFont ) ); } - return rWrt; } -static Writer& OutWW8_SwBiDiWeight( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharWeightCTL( const SvxWeightItem& rWeight ) { //Can only export in 8+, in 7- export as normal varient and expect that //upperlevel code has blocked exporting clobbering attributes - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) + if (m_rWW8Export.bWrtWW8) { - OutWW8_SwBoldBiDiUSW(rWrt, 0, - WEIGHT_BOLD == ((const SvxWeightItem&)rHt).GetWeight()); + OutputWW8AttributeCTL( 0, WEIGHT_BOLD == rWeight.GetWeight()); } else { - OutWW8_SwBoldUSW(rWrt, 0, - WEIGHT_BOLD == ((const SvxWeightItem&)rHt).GetWeight()); + OutputWW8Attribute( 0, WEIGHT_BOLD == rWeight.GetWeight()); } - return rWrt; } -static Writer& OutWW8_SwBiDiPosture( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharPostureCTL( const SvxPostureItem& rPosture ) { - //Can only export in 8+, in 7- export as normal varient and expect that - //upperlevel code has blocked exporting clobbering attributes - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) + // Can only export in 8+, in 7- export as normal varient and expect that + // upperlevel code has blocked exporting clobbering attributes + if (m_rWW8Export.bWrtWW8) { - OutWW8_SwBoldBiDiUSW( rWrt, 1, - ITALIC_NONE != ((const SvxPostureItem&)rHt).GetPosture() ); + OutputWW8AttributeCTL( 1, ITALIC_NONE != rPosture.GetPosture() ); } else { - OutWW8_SwBoldUSW( rWrt, 1, - ITALIC_NONE != ((const SvxPostureItem&)rHt).GetPosture() ); + OutputWW8Attribute( 1, ITALIC_NONE != rPosture.GetPosture() ); } - return rWrt; } -static Writer& OutWW8_SwPosture( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharPosture( const SvxPostureItem& rPosture ) { - return OutWW8_SwBoldUSW( rWrt, 1, - ITALIC_NONE != ((const SvxPostureItem&)rHt).GetPosture() ); + OutputWW8Attribute( 1, ITALIC_NONE != rPosture.GetPosture() ); } -static Writer& OutWW8_SwWeight( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharWeight( const SvxWeightItem& rWeight ) { - return OutWW8_SwBoldUSW( rWrt, 0, - WEIGHT_BOLD == ((const SvxWeightItem&)rHt).GetWeight() ); + OutputWW8Attribute( 0, WEIGHT_BOLD == rWeight.GetWeight() ); } -// Shadowed und Contour gibts in WW-UI nicht. JP: ?? -static Writer& OutWW8_SwContour( Writer& rWrt, const SfxPoolItem& rHt ) +// Shadowed und Contour are not in WW-UI. JP: ?? +void WW8AttributeOutput::CharContour( const SvxContourItem& rContour ) { - return OutWW8_SwBoldUSW(rWrt, 3, - ((const SvxContourItem&)rHt).GetValue() ? true : false); + OutputWW8Attribute( 3, rContour.GetValue() ? true : false); } -static Writer& OutWW8_SwShadow( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharShadow( const SvxShadowedItem& rShadow ) { - return OutWW8_SwBoldUSW(rWrt, 4, - ((const SvxShadowedItem&)rHt).GetValue() ? true : false); + OutputWW8Attribute( 4, rShadow.GetValue() ? true : false); } -static Writer& OutWW8_SwKerning( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharKerning( const SvxKerningItem& rKerning ) { - const SvxKerningItem& rAttr = (const SvxKerningItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x8840 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CDxaSpace ); else - rWrtWW8.pO->Insert( 96, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( rAttr.GetValue() ); - return rWrt; + m_rWW8Export.pO->Insert( 96, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( rKerning.GetValue() ); } -static Writer& OutWW8_SvxAutoKern( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharAutoKern( const SvxAutoKernItem& rAutoKern ) { - const SvxAutoKernItem& rAttr = (const SvxAutoKernItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x484B ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CHpsKern ); else - rWrtWW8.pO->Insert( 107, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( rAttr.GetValue() ? 1 : 0 ); - return rWrt; + m_rWW8Export.pO->Insert( 107, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( rAutoKern.GetValue() ? 1 : 0 ); } -static Writer& OutWW8_SwAnimatedText( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharAnimatedText( const SvxBlinkItem& rBlink ) { - const SvxBlinkItem& rAttr = (const SvxBlinkItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16( 0x2859 ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CSfxText ); // At the moment the only animated text effect we support is blinking - rWrtWW8.InsUInt16( rAttr.GetValue() ? 2 : 0 ); + m_rWW8Export.InsUInt16( rBlink.GetValue() ? 2 : 0 ); } - return rWrt; } - -static Writer& OutWW8_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharCrossedOut( const SvxCrossedOutItem& rCrossed ) { - FontStrikeout eSt = ((const SvxCrossedOutItem&)rHt).GetStrikeout(); - if( STRIKEOUT_DOUBLE == eSt ) - return OutWW8_SwBoldUSW(rWrt, 8, true); - if( STRIKEOUT_NONE != eSt ) - return OutWW8_SwBoldUSW(rWrt, 2, true); + FontStrikeout eSt = rCrossed.GetStrikeout(); + if ( STRIKEOUT_DOUBLE == eSt ) + { + OutputWW8Attribute( 8, true ); + return; + } + if ( STRIKEOUT_NONE != eSt ) + { + OutputWW8Attribute( 2, true ); + return; + } - // dann auch beide ausschalten! - OutWW8_SwBoldUSW(rWrt, 8, false); - return OutWW8_SwBoldUSW(rWrt, 2, false); + // otherwise both off + OutputWW8Attribute( 8, false ); + OutputWW8Attribute( 2, false ); } -static Writer& OutWW8_SwCaseMap( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharCaseMap( const SvxCaseMapItem& rCaseMap ) { - USHORT eSt = ((const SvxCaseMapItem&)rHt).GetValue(); - switch (eSt) + USHORT eSt = rCaseMap.GetValue(); + switch ( eSt ) { case SVX_CASEMAP_KAPITAELCHEN: - return OutWW8_SwBoldUSW(rWrt, 5, true); + OutputWW8Attribute( 5, true ); + return; case SVX_CASEMAP_VERSALIEN: - return OutWW8_SwBoldUSW(rWrt, 6, true); + OutputWW8Attribute( 6, true ); + return; case SVX_CASEMAP_TITEL: - //NO such feature in word + // no such feature in word break; default: - // dann auch beide ausschalten! - OutWW8_SwBoldUSW(rWrt, 5, false); - return OutWW8_SwBoldUSW(rWrt, 6, false); + // otherwise both off + OutputWW8Attribute( 5, false ); + OutputWW8Attribute( 6, false ); + return; } - return rWrt; } -static Writer& OutWW8_SvxCharHidden(Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharHidden( const SvxCharHiddenItem& rHidden ) { - OutWW8_SwBoldUSW(rWrt, 7, (item_cast<SvxCharHiddenItem>(rHt)).GetValue()); - return rWrt; + OutputWW8Attribute( 7, rHidden.GetValue() ); } -static Writer& OutWW8_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharUnderline( const SvxUnderlineItem& rUnderline ) { - const SvxUnderlineItem& rAttr = (const SvxUnderlineItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x2A3E ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CKul ); else - rWrtWW8.pO->Insert( 94, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 94, m_rWW8Export.pO->Count() ); - const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem( - RES_CHRATR_WORDLINEMODE ); + const SfxPoolItem* pItem = m_rWW8Export.HasItem( RES_CHRATR_WORDLINEMODE ); bool bWord = false; if (pItem) bWord = ((const SvxWordLineModeItem*)pItem)->GetValue() ? true : false; - // WW95 - parameters: 0 = none, 1 = single, 2 = by Word, - // 3 = double, 4 = dotted, 5 = hidden - // WW97 - additional parameters: - // 6 = thick, 7 = dash, 8 = dot(not used) - // 9 = dotdash 10 = dotdotdash, 11 = wave + // WW95 - parameters: 0 = none, 1 = single, 2 = by Word, + // 3 = double, 4 = dotted, 5 = hidden + // WW97 - additional parameters: + // 6 = thick, 7 = dash, 8 = dot(not used) + // 9 = dotdash 10 = dotdotdash, 11 = wave BYTE b = 0; - switch (rAttr.GetLineStyle()) + switch ( rUnderline.GetLineStyle() ) { case UNDERLINE_SINGLE: b = ( bWord ) ? 2 : 1; break; case UNDERLINE_BOLD: - b = rWrtWW8.bWrtWW8 ? 6 : 1; + b = m_rWW8Export.bWrtWW8 ? 6 : 1; break; case UNDERLINE_DOUBLE: b = 3; @@ -1226,286 +1253,265 @@ static Writer& OutWW8_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt ) b = 4; break; case UNDERLINE_DASH: - b = rWrtWW8.bWrtWW8 ? 7 : 4; + b = m_rWW8Export.bWrtWW8 ? 7 : 4; break; case UNDERLINE_DASHDOT: - b = rWrtWW8.bWrtWW8 ? 9 : 4; + b = m_rWW8Export.bWrtWW8 ? 9 : 4; break; case UNDERLINE_DASHDOTDOT: - b = rWrtWW8.bWrtWW8 ? 10 : 4; + b = m_rWW8Export.bWrtWW8 ? 10 : 4; break; case UNDERLINE_WAVE: - b = rWrtWW8.bWrtWW8 ? 11 : 3; + b = m_rWW8Export.bWrtWW8 ? 11 : 3; break; // ------------ new in WW2000 ------------------------------------- case UNDERLINE_BOLDDOTTED: - b = rWrtWW8.bWrtWW8 ? 20 : 4; + b = m_rWW8Export.bWrtWW8 ? 20 : 4; break; case UNDERLINE_BOLDDASH: - b = rWrtWW8.bWrtWW8 ? 23 : 4; + b = m_rWW8Export.bWrtWW8 ? 23 : 4; break; case UNDERLINE_LONGDASH: - b = rWrtWW8.bWrtWW8 ? 39 : 4; + b = m_rWW8Export.bWrtWW8 ? 39 : 4; break; case UNDERLINE_BOLDLONGDASH: - b = rWrtWW8.bWrtWW8 ? 55 : 4; + b = m_rWW8Export.bWrtWW8 ? 55 : 4; break; case UNDERLINE_BOLDDASHDOT: - b = rWrtWW8.bWrtWW8 ? 25 : 4; + b = m_rWW8Export.bWrtWW8 ? 25 : 4; break; case UNDERLINE_BOLDDASHDOTDOT: - b = rWrtWW8.bWrtWW8 ? 26 : 4; + b = m_rWW8Export.bWrtWW8 ? 26 : 4; break; case UNDERLINE_BOLDWAVE: - b = rWrtWW8.bWrtWW8 ? 27 : 3; + b = m_rWW8Export.bWrtWW8 ? 27 : 3; break; case UNDERLINE_DOUBLEWAVE: - b = rWrtWW8.bWrtWW8 ? 43 : 3; + b = m_rWW8Export.bWrtWW8 ? 43 : 3; break; case UNDERLINE_NONE: b = 0; break; default: - ASSERT(rAttr.GetLineStyle() == UNDERLINE_NONE, "Unhandled underline type"); + ASSERT( rUnderline.GetLineStyle() == UNDERLINE_NONE, "Unhandled underline type" ); break; } - rWrtWW8.pO->Insert(b, rWrtWW8.pO->Count()); - return rWrt; + m_rWW8Export.pO->Insert( b, m_rWW8Export.pO->Count() ); } -static Writer& OutWW8_SwLanguage( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharLanguage( const SvxLanguageItem& rLanguage ) { USHORT nId = 0; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) + if ( m_rWW8Export.bWrtWW8 ) { - switch (rHt.Which()) + switch ( rLanguage.Which() ) { case RES_CHRATR_LANGUAGE: - nId = 0x486D; + nId = NS_sprm::LN_CRgLid0; break; case RES_CHRATR_CJK_LANGUAGE: - nId = 0x486E; + nId = NS_sprm::LN_CRgLid1; break; case RES_CHRATR_CTL_LANGUAGE: - nId = 0x485F; + nId = NS_sprm::LN_CLidBi; break; } } else nId = 97; - if (nId) + if ( nId ) { - if (rWrtWW8.bWrtWW8) // use sprmCRgLid0 rather than sprmCLid - rWrtWW8.InsUInt16(nId); + if ( m_rWW8Export.bWrtWW8 ) // use sprmCRgLid0 rather than sprmCLid + m_rWW8Export.InsUInt16( nId ); else - rWrtWW8.pO->Insert((BYTE)nId, rWrtWW8.pO->Count()); - rWrtWW8.InsUInt16(((const SvxLanguageItem&)rHt).GetLanguage()); + m_rWW8Export.pO->Insert( (BYTE)nId, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( rLanguage.GetLanguage() ); - //unknown as to exactly why, but this seems to shadow the other - //paramater in word 2000 and without it spellchecking doesn't work - if (nId == 0x486D) + // unknown as to exactly why, but this seems to shadow the other + // paramater in word 2000 and without it spellchecking doesn't work + if ( nId == NS_sprm::LN_CRgLid0 ) { - rWrtWW8.InsUInt16(0x4873); - rWrtWW8.InsUInt16(((const SvxLanguageItem&)rHt).GetLanguage()); + m_rWW8Export.InsUInt16( 0x4873 ); + m_rWW8Export.InsUInt16( rLanguage.GetLanguage() ); } - else if (nId == 0x485F) + else if ( nId == NS_sprm::LN_CLidBi ) { - rWrtWW8.InsUInt16(0x4874); - rWrtWW8.InsUInt16(((const SvxLanguageItem&)rHt).GetLanguage()); + m_rWW8Export.InsUInt16( 0x4874 ); + m_rWW8Export.InsUInt16( rLanguage.GetLanguage() ); } } - return rWrt; } -static Writer& OutWW8_SwEscapement( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharEscapement( const SvxEscapementItem& rEscapement ) { - const SvxEscapementItem& rAttr = (const SvxEscapementItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - BYTE b = 0xFF; - short nEsc = rAttr.GetEsc(), nProp = rAttr.GetProp(); - if( !nEsc ) + short nEsc = rEscapement.GetEsc(), nProp = rEscapement.GetProp(); + if ( !nEsc ) { b = 0; nEsc = 0; nProp = 100; } - else if( DFLT_ESC_PROP == nProp ) + else if ( DFLT_ESC_PROP == nProp ) { - if( DFLT_ESC_SUB == nEsc || DFLT_ESC_AUTO_SUB == nEsc ) + if ( DFLT_ESC_SUB == nEsc || DFLT_ESC_AUTO_SUB == nEsc ) b = 2; - else if( DFLT_ESC_SUPER == nEsc || DFLT_ESC_AUTO_SUPER == nEsc ) + else if ( DFLT_ESC_SUPER == nEsc || DFLT_ESC_AUTO_SUPER == nEsc ) b = 1; } - if( 0xFF != b ) + if ( 0xFF != b ) { - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x2A48 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CIss ); else - rWrtWW8.pO->Insert( 104, rWrtWW8.pO->Count() ); - rWrtWW8.pO->Insert( b, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 104, m_rWW8Export.pO->Count() ); + + m_rWW8Export.pO->Insert( b, m_rWW8Export.pO->Count() ); } - if( 0 == b || 0xFF == b ) + if ( 0 == b || 0xFF == b ) { - long nHeight = ((SvxFontHeightItem&)rWrtWW8.GetItem( + long nHeight = ((SvxFontHeightItem&)m_rWW8Export.GetItem( RES_CHRATR_FONTSIZE )).GetHeight(); - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x4845 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CHpsPos ); else - rWrtWW8.pO->Insert( 101, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( (short)(( nHeight * nEsc + 500 ) / 1000 )); + m_rWW8Export.pO->Insert( 101, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( (short)(( nHeight * nEsc + 500 ) / 1000 )); if( 100 != nProp || !b ) { - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x4A43 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CHps ); else - rWrtWW8.pO->Insert( 99, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( - msword_cast<sal_uInt16>((nHeight * nProp + 500 ) / 1000)); + m_rWW8Export.pO->Insert( 99, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( + msword_cast<sal_uInt16>((nHeight * nProp + 500 ) / 1000)); } } - return rWrt; } -static Writer& OutWW8_SwSize( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharFontSize( const SvxFontHeightItem& rHeight ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; USHORT nId = 0; - if (rWrtWW8.bWrtWW8) + if ( m_rWW8Export.bWrtWW8 ) { - switch (rHt.Which()) + switch ( rHeight.Which() ) { case RES_CHRATR_FONTSIZE: case RES_CHRATR_CJK_FONTSIZE: - nId = 0x4A43; + nId = NS_sprm::LN_CHps; break; case RES_CHRATR_CTL_FONTSIZE: - nId = 0x4A61; + nId = NS_sprm::LN_CHpsBi; break; } } else nId = 99; - if( nId ) + if ( nId ) { - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( nId ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( nId ); else - rWrtWW8.pO->Insert( (BYTE)nId, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( (BYTE)nId, m_rWW8Export.pO->Count() ); - const SvxFontHeightItem& rAttr = (const SvxFontHeightItem&)rHt; - rWrtWW8.InsUInt16( (UINT16)(( rAttr.GetHeight() + 5 ) / 10 ) ); + m_rWW8Export.InsUInt16( (UINT16)(( rHeight.GetHeight() + 5 ) / 10 ) ); } - return rWrt; } -static Writer& OutWW8_ScaleWidth( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharScaleWidth( const SvxCharScaleWidthItem& rScaleWidth ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16( 0x4852 ); - rWrtWW8.InsUInt16( ((SvxCharScaleWidthItem&)rHt).GetValue() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CCharScale ); + m_rWW8Export.InsUInt16( rScaleWidth.GetValue() ); } - return rWrt; } -static Writer& OutWW8_Relief( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharRelief( const SvxCharReliefItem& rRelief ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { - const SvxCharReliefItem& rAttr = (const SvxCharReliefItem&)rHt; USHORT nId; - switch ( rAttr.GetValue() ) + switch ( rRelief.GetValue() ) { - case RELIEF_EMBOSSED: nId = 0x858; break; - case RELIEF_ENGRAVED: nId = 0x854; break; - default: nId = 0; break; + case RELIEF_EMBOSSED: nId = NS_sprm::LN_CFEmboss; break; + case RELIEF_ENGRAVED: nId = NS_sprm::LN_CFImprint; break; + default: nId = 0; break; } if( nId ) { - rWrtWW8.InsUInt16( nId ); - rWrtWW8.pO->Insert( (BYTE)0x81, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( nId ); + m_rWW8Export.pO->Insert( (BYTE)0x81, m_rWW8Export.pO->Count() ); } else { // switch both flags off - rWrtWW8.InsUInt16( 0x858 ); - rWrtWW8.pO->Insert( (BYTE)0x0, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( 0x854 ); - rWrtWW8.pO->Insert( (BYTE)0x0, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CFEmboss ); + m_rWW8Export.pO->Insert( (BYTE)0x0, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CFImprint ); + m_rWW8Export.pO->Insert( (BYTE)0x0, m_rWW8Export.pO->Count() ); } } - return rWrt; } - -static Writer& OutWW8_CharRotate( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharRotate( const SvxCharRotateItem& rRotate ) { // #i28331# - check that a Value is set - if((static_cast<const SvxCharRotateItem&>(rHt)).GetValue()) + if ( !rRotate.GetValue() ) + return; + + if ( m_rWW8Export.bWrtWW8 && !m_rWW8Export.bIsInTable ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 && !rWrtWW8.bIsInTable ) - { - // #i36867 In word the text in a table is rotated via the TC or 0x7629 - // This means you can only rotate all or none of the text adding 0xCA78 - // here corrupts the table, hence !rWrtWW8.bIsInTable - const SvxCharRotateItem& rAttr = (const SvxCharRotateItem&)rHt; - - rWrtWW8.InsUInt16( 0xCA78 ); - rWrtWW8.pO->Insert( (BYTE)0x06, rWrtWW8.pO->Count() ); //len 6 - rWrtWW8.pO->Insert( (BYTE)0x01, rWrtWW8.pO->Count() ); - - rWrtWW8.InsUInt16( rAttr.IsFitToLine() ? 1 : 0 ); - static const BYTE aZeroArr[ 3 ] = { 0, 0, 0 }; - rWrtWW8.pO->Insert( aZeroArr, 3, rWrtWW8.pO->Count() ); - } + // #i36867 In word the text in a table is rotated via the TC or NS_sprm::LN_TTextFlow + // This means you can only rotate all or none of the text adding NS_sprm::LN_CEastAsianLayout + // here corrupts the table, hence !m_rWW8Export.bIsInTable + + m_rWW8Export.InsUInt16( NS_sprm::LN_CEastAsianLayout ); + m_rWW8Export.pO->Insert( (BYTE)0x06, m_rWW8Export.pO->Count() ); //len 6 + m_rWW8Export.pO->Insert( (BYTE)0x01, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( rRotate.IsFitToLine() ? 1 : 0 ); + static const BYTE aZeroArr[ 3 ] = { 0, 0, 0 }; + m_rWW8Export.pO->Insert( aZeroArr, 3, m_rWW8Export.pO->Count() ); } - return rWrt; } - -static Writer& OutWW8_EmphasisMark( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharEmphasisMark( const SvxEmphasisMarkItem& rEmphasisMark ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) + if ( m_rWW8Export.bWrtWW8 ) { BYTE nVal; - switch ( ((const SvxEmphasisMarkItem&)rHt).GetValue() ) + switch ( rEmphasisMark.GetValue() ) { - case EMPHASISMARK_NONE: nVal = 0; break; - case EMPHASISMARK_SIDE_DOTS: nVal = 2; break; - case EMPHASISMARK_CIRCLE_ABOVE: nVal = 3; break; - case EMPHASISMARK_DOTS_BELOW: nVal = 4; break; -// case 1: - default: nVal = 1; break; + case EMPHASISMARK_NONE: nVal = 0; break; + case EMPHASISMARK_SIDE_DOTS: nVal = 2; break; + case EMPHASISMARK_CIRCLE_ABOVE: nVal = 3; break; + case EMPHASISMARK_DOTS_BELOW: nVal = 4; break; + // case 1: + default: nVal = 1; break; } - rWrtWW8.InsUInt16( 0x2A34 ); - rWrtWW8.pO->Insert( nVal, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CKcd ); + m_rWW8Export.pO->Insert( nVal, m_rWW8Export.pO->Count() ); } - return rWrt; } - // TransCol uebersetzt SW-Farben in WW. Heraus kommt die bei WW fuer // Text- und Hintergrundfarbe benutzte Codierung. // Gibt es keine direkte Entsprechung, dann wird versucht, eine moeglichst // aehnliche WW-Farbe zu finden. // return: 5-Bit-Wert ( 0..16 ) -BYTE SwWW8Writer::TransCol( const Color& rCol ) +BYTE WW8Export::TransCol( const Color& rCol ) { BYTE nCol = 0; // ->Auto switch( rCol.GetColor() ) @@ -1554,7 +1560,7 @@ BYTE SwWW8Writer::TransCol( const Color& rCol ) // Return: Echte Brush ( nicht transparent ) // auch bei Transparent wird z.B. fuer Tabellen eine transparente Brush // geliefert -bool SwWW8Writer::TransBrush(const Color& rCol, WW8_SHD& rShd) +bool WW8Export::TransBrush(const Color& rCol, WW8_SHD& rShd) { if( rCol.GetTransparency() ) rShd = WW8_SHD(); // alles Nullen : transparent @@ -1574,77 +1580,66 @@ sal_uInt32 SuitableBGColor(sal_uInt32 nIn) return wwUtility::RGBToBGR(nIn); } -static Writer& OutWW8_SwColor( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharColor( const SvxColorItem& rColor ) { - const SvxColorItem& rAttr = (const SvxColorItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) - rWrtWW8.InsUInt16(0x2A42); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CIco ); else - rWrtWW8.pO->Insert(98, rWrtWW8.pO->Count()); + m_rWW8Export.pO->Insert( 98, m_rWW8Export.pO->Count() ); - BYTE nColour = rWrtWW8.TransCol(rAttr.GetValue()); - rWrtWW8.pO->Insert(nColour, rWrtWW8.pO->Count()); + BYTE nColor = m_rWW8Export.TransCol( rColor.GetValue() ); + m_rWW8Export.pO->Insert( nColor, m_rWW8Export.pO->Count() ); - if (rWrtWW8.bWrtWW8 && nColour) + if ( m_rWW8Export.bWrtWW8 && nColor ) { - rWrtWW8.InsUInt16(0x6870); - rWrtWW8.InsUInt32(wwUtility::RGBToBGR(rAttr.GetValue().GetColor())); + m_rWW8Export.InsUInt16( 0x6870 ); + m_rWW8Export.InsUInt32( wwUtility::RGBToBGR( rColor.GetValue().GetColor() ) ); } - return rWrt; } -static Writer& OutWW8_SwFmtCharBackground( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharBackground( const SvxBrushItem& rBrush ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - - if( rWW8Wrt.bWrtWW8 ) // nur WW8 kann ZeichenHintergrund + if( m_rWW8Export.bWrtWW8 ) // nur WW8 kann ZeichenHintergrund { - const SvxBrushItem& rBack = (const SvxBrushItem&)rHt; WW8_SHD aSHD; - rWW8Wrt.TransBrush(rBack.GetColor(), aSHD); + m_rWW8Export.TransBrush( rBrush.GetColor(), aSHD ); // sprmCShd - rWW8Wrt.InsUInt16( 0x4866 ); - rWW8Wrt.InsUInt16( aSHD.GetValue() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CShd ); + m_rWW8Export.InsUInt16( aSHD.GetValue() ); //Quite a few unknowns, some might be transparency or something //of that nature... - rWW8Wrt.InsUInt16(0xCA71); - rWW8Wrt.pO->Insert(10, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt32(0xFF000000); - rWW8Wrt.InsUInt32(SuitableBGColor(rBack.GetColor().GetColor())); - rWW8Wrt.InsUInt16(0x0000); + m_rWW8Export.InsUInt16( 0xCA71 ); + m_rWW8Export.pO->Insert( 10, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt32( 0xFF000000 ); + m_rWW8Export.InsUInt32( SuitableBGColor( rBrush.GetColor().GetColor() ) ); + m_rWW8Export.InsUInt16( 0x0000); } - return rWrt; } -static Writer& OutSwFmtINetFmt( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::TextINetFormat( const SwFmtINetFmt& rINet ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - const SwFmtINetFmt& rINet = (SwFmtINetFmt&)rHt; - - if( rINet.GetValue().Len() ) + if ( rINet.GetValue().Len() ) { USHORT nId; const String& rStr = rINet.GetINetFmt(); - if( rStr.Len() ) + if ( rStr.Len() ) nId = rINet.GetINetFmtId(); else nId = RES_POOLCHR_INET_NORMAL; const SwCharFmt* pFmt = IsPoolUserFmt( nId ) - ? rWrt.pDoc->FindCharFmtByName( rStr ) - : rWrt.pDoc->GetCharFmtFromPool( nId ); + ? m_rWW8Export.pDoc->FindCharFmtByName( rStr ) + : m_rWW8Export.pDoc->GetCharFmtFromPool( nId ); - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x4A30 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CIstd ); else - rWrtWW8.pO->Insert( 80, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 80, m_rWW8Export.pO->Count() ); - rWrtWW8.InsUInt16( rWrtWW8.GetId( *pFmt ) ); + m_rWW8Export.InsUInt16( m_rWW8Export.GetId( *pFmt ) ); } - return rWrt; } // --> OD 2005-06-08 #i43956# - add optional parameter <pLinkStr> @@ -1652,7 +1647,7 @@ static Writer& OutSwFmtINetFmt( Writer& rWrt, const SfxPoolItem& rHt ) // - it contains the name of the link target, which is a bookmark. // --> OD 2008-08-14 #158418# - add optional parameter <bIncludeEmptyPicLocation> // It is needed to write an empty picture location for page number field separators -static void InsertSpecialChar( SwWW8Writer& rWrt, BYTE c, +static void InsertSpecialChar( WW8Export& rWrt, BYTE c, String* pLinkStr = 0L, bool bIncludeEmptyPicLocation = false ) { @@ -1672,7 +1667,7 @@ static void InsertSpecialChar( SwWW8Writer& rWrt, BYTE c, if ( bIncludeEmptyPicLocation && ( c == 0x13 || c == 0x14 || c == 0x15 ) ) { - SwWW8Writer::InsUInt16( aItems, 0x6a03 ); + SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CPicLocation ); SwWW8Writer::InsUInt32( aItems, 0x00000000 ); } // <-- @@ -1714,11 +1709,11 @@ static void InsertSpecialChar( SwWW8Writer& rWrt, BYTE c, rStrm.Seek( nCurrPos ); // write attributes of hyperlink character 0x01 - SwWW8Writer::InsUInt16( aItems, 0x0802 ); //sprmCFFldVanish + SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CFFldVanish ); aItems.Insert( (BYTE)0x81, aItems.Count() ); - SwWW8Writer::InsUInt16( aItems, 0x6a03 ); + SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CPicLocation ); SwWW8Writer::InsUInt32( aItems, nLinkPosInDataStrm ); - SwWW8Writer::InsUInt16( aItems, 0x0806 ); + SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CFData ); aItems.Insert( (BYTE)0x01, aItems.Count() ); } @@ -1729,7 +1724,7 @@ static void InsertSpecialChar( SwWW8Writer& rWrt, BYTE c, // fSpec-Attribute true if( rWrt.bWrtWW8 ) { - SwWW8Writer::InsUInt16( aItems, 0x855 ); //sprmCFSpec + SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CFSpec ); aItems.Insert( 1, aItems.Count() ); } else @@ -1752,7 +1747,7 @@ String lcl_GetExpandedField(const SwField &rFld) return sRet; } -WW8_WrPlcFld* SwWW8Writer::CurrentFieldPlc() const +WW8_WrPlcFld* WW8Export::CurrentFieldPlc() const { WW8_WrPlcFld* pFldP = NULL; switch (nTxtTyp) @@ -1784,8 +1779,8 @@ WW8_WrPlcFld* SwWW8Writer::CurrentFieldPlc() const return pFldP; } -void SwWW8Writer::OutField(const SwField* pFld, ww::eField eFldType, - const String& rFldCmd, BYTE nMode) +void WW8Export::OutputField( const SwField* pFld, ww::eField eFldType, + const String& rFldCmd, BYTE nMode ) { bool bUnicode = IsUnicode(); WW8_WrPlcFld* pFldP = CurrentFieldPlc(); @@ -1891,16 +1886,16 @@ void SwWW8Writer::OutField(const SwField* pFld, ww::eField eFldType, BYTE aArr[12]; BYTE *pArr = aArr; - if( bWrtWW8 ) + if ( bWrtWW8 ) { - Set_UInt16(pArr, 0x6a03); //sprmCPicLocation - Set_UInt32(pArr, 0x0); + Set_UInt16( pArr, NS_sprm::LN_CPicLocation ); + Set_UInt32( pArr, 0x0 ); - Set_UInt16( pArr, 0x855 );//sprmCFSpec + Set_UInt16( pArr, NS_sprm::LN_CFSpec ); Set_UInt8( pArr, 1 ); - Set_UInt16( pArr, 0x875 );//sprmCFNoProof - Set_UInt8(pArr, 1); + Set_UInt16( pArr, NS_sprm::LN_CFNoProof ); + Set_UInt8( pArr, 1 ); } else { @@ -1910,7 +1905,7 @@ void SwWW8Writer::OutField(const SwField* pFld, ww::eField eFldType, Set_UInt8( pArr, 117 ); //sprmCFSpec Set_UInt8( pArr, 1 ); } - pChpPlc->AppendFkpEntry( pStrm->Tell(), static_cast< short >(pArr - aArr), aArr ); + pChpPlc->AppendFkpEntry( Strm().Tell(), static_cast< short >(pArr - aArr), aArr ); } } } @@ -1938,25 +1933,25 @@ void SwWW8Writer::OutField(const SwField* pFld, ww::eField eFldType, } } -void SwWW8Writer::StartCommentOutput(const String& rName) +void WW8Export::StartCommentOutput(const String& rName) { String sStr(FieldString(ww::eQUOTE)); sStr.APPEND_CONST_ASC("["); sStr += rName; sStr.APPEND_CONST_ASC("] "); - OutField(0, ww::eQUOTE, sStr, WRITEFIELD_START | WRITEFIELD_CMD_START); + OutputField(0, ww::eQUOTE, sStr, WRITEFIELD_START | WRITEFIELD_CMD_START); } -void SwWW8Writer::EndCommentOutput(const String& rName) +void WW8Export::EndCommentOutput(const String& rName) { String sStr(CREATE_CONST_ASC(" [")); sStr += rName; sStr.APPEND_CONST_ASC("] "); - OutField(0, ww::eQUOTE, sStr, WRITEFIELD_CMD_END | WRITEFIELD_END | + OutputField(0, ww::eQUOTE, sStr, WRITEFIELD_CMD_END | WRITEFIELD_END | WRITEFIELD_CLOSE); } -USHORT SwWW8Writer::GetId( const SwTOXType& rTOXType ) +USHORT MSWordExportBase::GetId( const SwTOXType& rTOXType ) { void* p = (void*)&rTOXType; USHORT nRet = aTOXArr.GetPos( p ); @@ -2052,9 +2047,9 @@ bool lcl_IsHyperlinked(const SwForm& rForm, USHORT nTOXLvl) return bRes; } -void SwWW8Writer::StartTOX( const SwSection& rSect ) +void AttributeOutputBase::StartTOX( const SwSection& rSect ) { - if (const SwTOXBase* pTOX = rSect.GetTOXBase()) + if ( const SwTOXBase* pTOX = rSect.GetTOXBase() ) { static const sal_Char sEntryEnd[] = "\" "; @@ -2136,7 +2131,7 @@ void SwWW8Writer::StartTOX( const SwSection& rSect ) if( TOX_USER == pTOX->GetType() ) { sStr += '\"'; - sStr += (sal_Char)('A' + GetId( *pTOX->GetTOXType())); + sStr += (sal_Char)( 'A' + GetExport( ).GetId( *pTOX->GetTOXType() ) ); sStr.AppendAscii( sEntryEnd ); } } @@ -2151,7 +2146,7 @@ void SwWW8Writer::StartTOX( const SwSection& rSect ) // // (ignoring headline styles 1-9) // //BYTE nLvl = 0, nMinLvl = 0; //#outline level, removed by zhaojianwei // int nLvl = 0, nMinLvl = 0; //<-end,add by zhaojianwei -// const SwTxtFmtColls& rColls = *pDoc->GetTxtFmtColls(); +// const SwTxtFmtColls& rColls = *GetExport().pDoc->GetTxtFmtColls(); // const SwTxtFmtColl* pColl; // for( n = rColls.Count(); n; ) // { @@ -2307,26 +2302,26 @@ void SwWW8Writer::StartTOX( const SwSection& rSect ) if( sStr.Len() ) { - bInWriteTOX = true; - OutField(0, eCode, sStr, WRITEFIELD_START | WRITEFIELD_CMD_START | - WRITEFIELD_CMD_END); + GetExport( ).bInWriteTOX = true; + GetExport( ).OutputField( 0, eCode, sStr, WRITEFIELD_START | WRITEFIELD_CMD_START | + WRITEFIELD_CMD_END ); } } - bStartTOX = false; + GetExport( ).bStartTOX = false; } -void SwWW8Writer::EndTOX( const SwSection& rSect ) +void AttributeOutputBase::EndTOX( const SwSection& rSect ) { const SwTOXBase* pTOX = rSect.GetTOXBase(); - if( pTOX ) + if ( pTOX ) { ww::eField eCode = TOX_INDEX == pTOX->GetType() ? ww::eINDEX : ww::eTOC; - OutField(0, eCode, aEmptyStr, WRITEFIELD_CLOSE); + GetExport( ).OutputField( 0, eCode, aEmptyStr, WRITEFIELD_CLOSE ); } - bInWriteTOX = false; + GetExport( ).bInWriteTOX = false; } -bool SwWW8Writer::GetNumberFmt(const SwField& rFld, String& rStr) +bool MSWordExportBase::GetNumberFmt(const SwField& rFld, String& rStr) { // Returns a date or time format string by using the US NfKeywordTable bool bHasFmt = false; @@ -2361,7 +2356,7 @@ bool SwWW8Writer::GetNumberFmt(const SwField& rFld, String& rStr) return bHasFmt; } -void WW8_GetNumberPara( String& rStr, const SwField& rFld ) +void AttributeOutputBase::GetNumberPara( String& rStr, const SwField& rFld ) { switch(rFld.GetFormat()) { @@ -2391,14 +2386,14 @@ void WW8_GetNumberPara( String& rStr, const SwField& rFld ) } } -void SwWW8Writer::WritePostItBegin( WW8Bytes* pOut ) +void WW8Export::WritePostItBegin( WW8Bytes* pOut ) { BYTE aArr[ 3 ]; BYTE* pArr = aArr; // sprmCFSpec true if( bWrtWW8 ) - Set_UInt16( pArr, 0x855 ); //sprmCFSpec + Set_UInt16( pArr, NS_sprm::LN_CFSpec ); else Set_UInt8( pArr, 117 ); //sprmCFSpec Set_UInt8( pArr, 1 ); @@ -2420,46 +2415,128 @@ String FieldString(ww::eField eIndex) return sRet; } -void OutWW8_RefField(SwWW8Writer& rWW8Wrt, const SwField &rFld, - const String &rRef) +void WW8AttributeOutput::HiddenField( const SwField& rFld ) { - String sStr(FieldString(ww::eREF)); - sStr.APPEND_CONST_ASC("\""); - sStr += rRef; - sStr.APPEND_CONST_ASC( "\" " ); - rWW8Wrt.OutField(&rFld, ww::eREF, sStr, WRITEFIELD_START | + String sExpand(rFld.GetPar2()); + + //replace LF 0x0A with VT 0x0B + sExpand.SearchAndReplaceAll(0x0A, 0x0B); + m_rWW8Export.pChpPlc->AppendFkpEntry(m_rWW8Export.Strm().Tell()); + if (m_rWW8Export.IsUnicode()) + { + SwWW8Writer::WriteString16(m_rWW8Export.Strm(), sExpand, false); + static BYTE aArr[] = + { + 0x3C, 0x08, 0x1 + }; + m_rWW8Export.pChpPlc->AppendFkpEntry(m_rWW8Export.Strm().Tell(), sizeof(aArr), aArr); + } + else + { + SwWW8Writer::WriteString8(m_rWW8Export.Strm(), sExpand, false, + RTL_TEXTENCODING_MS_1252); + static BYTE aArr[] = + { + 92, 0x1 + }; + m_rWW8Export.pChpPlc->AppendFkpEntry(m_rWW8Export.Strm().Tell(), sizeof(aArr), aArr); + } +} + +void WW8AttributeOutput::SetField( const SwField& rFld, ww::eField eType, const String& rCmd ) +{ + const SwSetExpField* pSet=(const SwSetExpField*)(&rFld); + const String &rVar = pSet->GetPar2(); + + ULONG nFrom = m_rWW8Export.Fc2Cp(m_rWW8Export.Strm().Tell()); + + GetExport().OutputField(&rFld, eType, rCmd, WRITEFIELD_START | WRITEFIELD_CMD_START | WRITEFIELD_CMD_END); - String sVar = lcl_GetExpandedField(rFld); - if (sVar.Len()) + + /* + Is there a bookmark at the start position of this field, if so + move it to the 0x14 of the result of the field. This is what word + does. MoveFieldMarks moves any bookmarks at this position to + the beginning of the field result, and marks the bookmark as a + fieldbookmark which is to be ended before the field end mark + instead of after it like a normal bookmark. + */ + m_rWW8Export.MoveFieldMarks(nFrom,m_rWW8Export.Fc2Cp(m_rWW8Export.Strm().Tell())); + + if (rVar.Len()) { - if (rWW8Wrt.IsUnicode()) - SwWW8Writer::WriteString16(rWW8Wrt.Strm(), sVar, false); + if (m_rWW8Export.IsUnicode()) + SwWW8Writer::WriteString16(m_rWW8Export.Strm(), rVar, false); else { - SwWW8Writer::WriteString8(rWW8Wrt.Strm(), sVar, false, + SwWW8Writer::WriteString8(m_rWW8Export.Strm(), rVar, false, RTL_TEXTENCODING_MS_1252); } } - rWW8Wrt.OutField(&rFld, ww::eREF, sStr, WRITEFIELD_CLOSE); + GetExport().OutputField(&rFld, eType, rCmd, WRITEFIELD_CLOSE); +} + +void WW8AttributeOutput::PostitField( const SwField* pFld ) +{ + const SwPostItField& rPFld = *(SwPostItField*)pFld; + m_rWW8Export.pAtn->Append( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ), rPFld ); + m_rWW8Export.WritePostItBegin( m_rWW8Export.pO ); +} + +bool WW8AttributeOutput::DropdownField( const SwField* pFld ) +{ + bool bExpand = true; + if ( m_rWW8Export.bWrtWW8 ) + { + const SwDropDownField& rFld2 = *(SwDropDownField*)pFld; + uno::Sequence<rtl::OUString> aItems = + rFld2.GetItemSequence(); + GetExport().DoComboBox(rFld2.GetName(), + rFld2.GetHelp(), + rFld2.GetToolTip(), + rFld2.GetSelectedItem(), aItems); + bExpand = false; + } + return bExpand; } -void WriteExpand(SwWW8Writer& rWW8Wrt, const SwField &rFld) +void WW8AttributeOutput::RefField( const SwField &rFld, const String &rRef) { - String sExpand(lcl_GetExpandedField(rFld)); - if (rWW8Wrt.IsUnicode()) - SwWW8Writer::WriteString16(rWW8Wrt.Strm(), sExpand, false); + String sStr( FieldString( ww::eREF ) ); + sStr.APPEND_CONST_ASC( "\"" ); + sStr += rRef; + sStr.APPEND_CONST_ASC( "\" " ); + m_rWW8Export.OutputField( &rFld, ww::eREF, sStr, WRITEFIELD_START | + WRITEFIELD_CMD_START | WRITEFIELD_CMD_END ); + String sVar = lcl_GetExpandedField( rFld ); + if ( sVar.Len() ) + { + if ( m_rWW8Export.IsUnicode() ) + SwWW8Writer::WriteString16( m_rWW8Export.Strm(), sVar, false ); + else + { + SwWW8Writer::WriteString8( m_rWW8Export.Strm(), sVar, false, + RTL_TEXTENCODING_MS_1252 ); + } + } + m_rWW8Export.OutputField( &rFld, ww::eREF, sStr, WRITEFIELD_CLOSE ); +} + +void WW8AttributeOutput::WriteExpand( const SwField* pFld ) +{ + String sExpand( lcl_GetExpandedField( *pFld ) ); + if ( m_rWW8Export.IsUnicode() ) + SwWW8Writer::WriteString16( m_rWW8Export.Strm(), sExpand, false ); else { - SwWW8Writer::WriteString8(rWW8Wrt.Strm(), sExpand, false, - RTL_TEXTENCODING_MS_1252); + SwWW8Writer::WriteString8( m_rWW8Export.Strm(), sExpand, false, + RTL_TEXTENCODING_MS_1252 ); } } -static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) +void AttributeOutputBase::TextField( const SwFmtFld& rField ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SwFmtFld& rFld = (SwFmtFld&)rHt; - const SwField* pFld = rFld.GetFld(); + const SwField* pFld = rField.GetFld(); String sStr; // fuer optionale Parameter bool bWriteExpand = false; USHORT nSubType = pFld->GetSubType(); @@ -2470,7 +2547,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) if (nSubType == nsSwGetSetExpType::GSE_STRING) { const SwGetExpField *pGet=(const SwGetExpField*)(pFld); - OutWW8_RefField(rWW8Wrt, *pGet, pGet->GetFormula()); + RefField( *pGet, pGet->GetFormula() ); } else bWriteExpand = true; @@ -2483,8 +2560,8 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) sStr += pFld->GetTyp()->GetName(); sStr.APPEND_CONST_ASC( "\" " ); - ::WW8_GetNumberPara( sStr, *pFld ); - rWW8Wrt.OutField(pFld, ww::eSEQ, sStr); + GetNumberPara( sStr, *pFld ); + GetExport().OutputField(pFld, ww::eSEQ, sStr); } else if (nSubType & nsSwGetSetExpType::GSE_STRING) { @@ -2514,69 +2591,44 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) bShowAsWell = (nSubType & nsSwExtendedSubType::SUB_INVISIBLE) ? false : true; } - ULONG nFrom = rWW8Wrt.Fc2Cp(rWrt.Strm().Tell()); - - rWW8Wrt.OutField(pFld, eFieldNo, sStr, WRITEFIELD_START | - WRITEFIELD_CMD_START | WRITEFIELD_CMD_END); - - /* - Is there a bookmark at the start position of this field, if so - move it to the 0x14 of the result of the field. This is what word - does. MoveFieldMarks moves any bookmarks at this position to - the beginning of the field result, and marks the bookmark as a - fieldbookmark which is to be ended before the field end mark - instead of after it like a normal bookmark. - */ - rWW8Wrt.MoveFieldMarks(nFrom,rWW8Wrt.Fc2Cp(rWrt.Strm().Tell())); - - if (rVar.Len()) - { - if (rWW8Wrt.IsUnicode()) - SwWW8Writer::WriteString16(rWrt.Strm(), rVar, false); - else - { - SwWW8Writer::WriteString8(rWrt.Strm(), rVar, false, - RTL_TEXTENCODING_MS_1252); - } - } - rWW8Wrt.OutField(pFld, eFieldNo, sStr, WRITEFIELD_CLOSE); + SetField( *pFld, eFieldNo, sStr ); if (bShowAsWell) - OutWW8_RefField(rWW8Wrt, *pSet, pSet->GetPar1()); + RefField( *pSet, pSet->GetPar1() ); } else bWriteExpand = true; break; case RES_PAGENUMBERFLD: sStr = FieldString(ww::ePAGE); - ::WW8_GetNumberPara(sStr, *pFld); - rWW8Wrt.OutField(pFld, ww::ePAGE, sStr); + GetNumberPara(sStr, *pFld); + GetExport().OutputField(pFld, ww::ePAGE, sStr); break; case RES_FILENAMEFLD: sStr = FieldString(ww::eFILENAME); if (pFld->GetFormat() == FF_PATHNAME) sStr.APPEND_CONST_ASC("\\p "); - rWW8Wrt.OutField(pFld, ww::eFILENAME, sStr); + GetExport().OutputField(pFld, ww::eFILENAME, sStr); break; case RES_DBNAMEFLD: { sStr = FieldString(ww::eDATABASE); - SwDBData aData = rWrt.pDoc->GetDBData(); + SwDBData aData = GetExport().pDoc->GetDBData(); sStr += String(aData.sDataSource); sStr += DB_DELIM; sStr += String(aData.sCommand); - rWW8Wrt.OutField(pFld, ww::eDATABASE, sStr); + GetExport().OutputField(pFld, ww::eDATABASE, sStr); } break; case RES_AUTHORFLD: { ww::eField eFld = (AF_SHORTCUT & nSubType ? ww::eUSERINITIALS : ww::eUSERNAME); - rWW8Wrt.OutField(pFld, eFld, FieldString(eFld)); + GetExport().OutputField(pFld, eFld, FieldString(eFld)); } break; case RES_TEMPLNAMEFLD: - rWW8Wrt.OutField(pFld, ww::eTEMPLATE, FieldString(ww::eTEMPLATE)); + GetExport().OutputField(pFld, ww::eTEMPLATE, FieldString(ww::eTEMPLATE)); break; case RES_DOCINFOFLD: // Last printed, last edited,... if( DI_SUB_FIXED & nSubType ) @@ -2604,25 +2656,25 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) case DI_CREATE: if (DI_SUB_AUTHOR == (nSubType & DI_SUB_MASK)) eFld = ww::eAUTHOR; - else if (rWW8Wrt.GetNumberFmt(*pFld, sStr)) + else if (GetExport().GetNumberFmt(*pFld, sStr)) eFld = ww::eCREATEDATE; break; case DI_CHANGE: if (DI_SUB_AUTHOR == (nSubType & DI_SUB_MASK)) eFld = ww::eLASTSAVEDBY; - else if (rWW8Wrt.GetNumberFmt(*pFld, sStr)) + else if (GetExport().GetNumberFmt(*pFld, sStr)) eFld = ww::eSAVEDATE; break; case DI_PRINT: if (DI_SUB_AUTHOR != (nSubType & DI_SUB_MASK) && - rWW8Wrt.GetNumberFmt(*pFld, sStr)) + GetExport().GetNumberFmt(*pFld, sStr)) eFld = ww::ePRINTDATE; break; case DI_EDIT: if( DI_SUB_AUTHOR != (nSubType & DI_SUB_MASK ) && - rWW8Wrt.GetNumberFmt( *pFld, sStr )) + GetExport().GetNumberFmt( *pFld, sStr )) eFld = ww::eSAVEDATE; break; case DI_CUSTOM: @@ -2653,20 +2705,20 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) if (eFld != ww::eNONE) { sStr.Insert(FieldString(eFld), 0); - rWW8Wrt.OutField(pFld, eFld, sStr); + GetExport().OutputField(pFld, eFld, sStr); } else bWriteExpand = true; } break; case RES_DATETIMEFLD: - if (FIXEDFLD & nSubType || !rWW8Wrt.GetNumberFmt(*pFld, sStr)) + if (FIXEDFLD & nSubType || !GetExport().GetNumberFmt(*pFld, sStr)) bWriteExpand = true; else { ww::eField eFld = (DATEFLD & nSubType) ? ww::eDATE : ww::eTIME; sStr.Insert(FieldString(eFld), 0); - rWW8Wrt.OutField(pFld, eFld, sStr); + GetExport().OutputField(pFld, eFld, sStr); } break; case RES_DOCSTATFLD: @@ -2689,8 +2741,8 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) if (eFld != ww::eNONE) { sStr = FieldString(eFld); - ::WW8_GetNumberPara(sStr, *pFld); - rWW8Wrt.OutField(pFld, eFld, sStr); + GetNumberPara(sStr, *pFld); + GetExport().OutputField(pFld, eFld, sStr); } else bWriteExpand = true; @@ -2719,7 +2771,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) if (eFld != ww::eNONE) { sStr = FieldString(eFld); - rWW8Wrt.OutField(pFld, eFld, sStr); + GetExport().OutputField(pFld, eFld, sStr); } else bWriteExpand = true; @@ -2727,11 +2779,9 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) break; case RES_POSTITFLD: //Sadly only possible for word in main document text - if (rWW8Wrt.nTxtTyp == TXT_MAINTEXT) + if (GetExport().nTxtTyp == TXT_MAINTEXT) { - const SwPostItField& rPFld = *(SwPostItField*)pFld; - rWW8Wrt.pAtn->Append( rWW8Wrt.Fc2Cp( rWrt.Strm().Tell() ), rPFld ); - rWW8Wrt.WritePostItBegin( rWW8Wrt.pO ); + PostitField( pFld ); } break; case RES_INPUTFLD: @@ -2740,7 +2790,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) dynamic_cast<const SwInputField *>(pFld); if (pInputField->isFormField()) - rWW8Wrt.DoFormText(pInputField); + GetExport().DoFormText(pInputField); else { sStr = FieldString(ww::eFILLIN); @@ -2749,7 +2799,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) sStr += pFld->GetPar2(); sStr += '\"'; - rWW8Wrt.OutField(pFld, ww::eFILLIN, sStr); + GetExport().OutputField(pFld, ww::eFILLIN, sStr); } } break; @@ -2772,7 +2822,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) break; } sStr = FieldString(eFld); - sStr += rWW8Wrt.GetBookmarkName(nSubType, + sStr += GetExport().GetBookmarkName(nSubType, &rRFld.GetSetRefName(), 0); break; case REF_FOOTNOTE: @@ -2792,7 +2842,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) break; } sStr = FieldString(eFld); - sStr += rWW8Wrt.GetBookmarkName(nSubType, 0, + sStr += GetExport().GetBookmarkName(nSubType, 0, rRFld.GetSeqNo()); break; } @@ -2811,7 +2861,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) break; } sStr.APPEND_CONST_ASC(" \\h "); // insert hyperlink - rWW8Wrt.OutField(pFld, eFld, sStr); + GetExport().OutputField(pFld, eFld, sStr); } else bWriteExpand = true; @@ -2838,7 +2888,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) else nScript = i18n::ScriptType::ASIAN; - long nHeight = ((SvxFontHeightItem&)(((SwWW8Writer&)rWrt).GetItem( + long nHeight = ((SvxFontHeightItem&)(GetExport().GetItem( GetWhichOfScript(RES_CHRATR_FONTSIZE,nScript)))).GetHeight();; nHeight = (nHeight + 10) / 20; //Font Size in points; @@ -2861,31 +2911,20 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) sStr.Append('('); sStr += String(pFld->GetPar1(),nAbove,pFld->GetPar1().Len()-nAbove); sStr.APPEND_CONST_ASC("))"); - rWW8Wrt.OutField(pFld, ww::eEQ, sStr); + GetExport().OutputField(pFld, ww::eEQ, sStr); } break; case RES_DROPDOWN: - if (rWW8Wrt.bWrtWW8) - { - const SwDropDownField& rFld2 = *(SwDropDownField*)pFld; - uno::Sequence<rtl::OUString> aItems = - rFld2.GetItemSequence(); - rWW8Wrt.DoComboBox(rFld2.GetName(), - rFld2.GetHelp(), - rFld2.GetToolTip(), - rFld2.GetSelectedItem(), aItems); - } - else - bWriteExpand = true; + bWriteExpand = DropdownField( pFld ); break; case RES_CHAPTERFLD: bWriteExpand = true; - if (rWW8Wrt.bOutKF && rFld.GetTxtFld()) + if (GetExport().bOutKF && rField.GetTxtFld()) { - const SwTxtNode *pTxtNd = rWW8Wrt.GetHdFtPageRoot(); + const SwTxtNode *pTxtNd = GetExport().GetHdFtPageRoot(); if (!pTxtNd) { - if (const SwNode *pNd = rWW8Wrt.pCurPam->GetNode()) + if (const SwNode *pNd = GetExport().pCurPam->GetNode()) pTxtNd = pNd->GetTxtNode(); } @@ -2893,7 +2932,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) { SwChapterField aCopy(*(const SwChapterField*)pFld); aCopy.ChangeExpansion(*pTxtNd, false); - WriteExpand(rWW8Wrt, aCopy); + WriteExpand( &aCopy ); bWriteExpand = false; } } @@ -2903,28 +2942,7 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) String sExpand(pFld->GetPar2()); if (sExpand.Len()) { - //replace LF 0x0A with VT 0x0B - sExpand.SearchAndReplaceAll(0x0A, 0x0B); - rWW8Wrt.pChpPlc->AppendFkpEntry(rWW8Wrt.Strm().Tell()); - if (rWW8Wrt.IsUnicode()) - { - SwWW8Writer::WriteString16(rWW8Wrt.Strm(), sExpand, false); - static BYTE aArr[] = - { - 0x3C, 0x08, 0x1 - }; - rWW8Wrt.pChpPlc->AppendFkpEntry(rWW8Wrt.Strm().Tell(), sizeof(aArr), aArr); - } - else - { - SwWW8Writer::WriteString8(rWW8Wrt.Strm(), sExpand, false, - RTL_TEXTENCODING_MS_1252); - static BYTE aArr[] = - { - 92, 0x1 - }; - rWW8Wrt.pChpPlc->AppendFkpEntry(rWW8Wrt.Strm().Tell(), sizeof(aArr), aArr); - } + HiddenField( *pFld ); } } break; @@ -2934,27 +2952,23 @@ static Writer& OutWW8_SwField( Writer& rWrt, const SfxPoolItem& rHt ) } if (bWriteExpand) - WriteExpand(rWW8Wrt, *pFld); - - return rWrt; + WriteExpand( pFld ); } -static Writer& OutWW8_SwFlyCntnt( Writer& rWrt, const SfxPoolItem& rHt ) +void AttributeOutputBase::TextFlyContent( const SwFmtFlyCnt& rFlyContent ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.pOutFmtNode && rWrtWW8.pOutFmtNode->ISA(SwCntntNode)) + if ( GetExport().pOutFmtNode && GetExport().pOutFmtNode->ISA( SwCntntNode ) ) { - SwTxtNode* pTxtNd = (SwTxtNode*)rWrtWW8.pOutFmtNode; + SwTxtNode* pTxtNd = (SwTxtNode*)GetExport().pOutFmtNode; Point aLayPos; - aLayPos = pTxtNd->FindLayoutRect(false, &aLayPos).Pos(); + aLayPos = pTxtNd->FindLayoutRect( false, &aLayPos ).Pos(); - SwPosition aPos(*pTxtNd); - sw::Frame aFrm(*((const SwFmtFlyCnt&)rHt).GetFrmFmt(), aPos); + SwPosition aPos( *pTxtNd ); + sw::Frame aFrm( *rFlyContent.GetFrmFmt(), aPos ); - rWrtWW8.OutWW8FlyFrm(aFrm, aLayPos); + OutputFlyFrame_Impl( aFrm, aLayPos ); } - return rWrt; } // TOXMarks fehlen noch @@ -2965,74 +2979,62 @@ static Writer& OutWW8_SwFlyCntnt( Writer& rWrt, const SfxPoolItem& rHt ) // --- // ACK. Dieser Vorschlag passt exakt zu unserer Implementierung des Import, // daher setze ich das gleich mal um. (KHZ, 07/15/2000) -static Writer& OutWW8_SvxHyphenZone( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::ParaHyphenZone( const SvxHyphenZoneItem& rHyphenZone ) { -// sprmPFNoAutoHyph - const SvxHyphenZoneItem& rAttr = (const SvxHyphenZoneItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x242A ); + // sprmPFNoAutoHyph + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFNoAutoHyph ); else - rWrtWW8.pO->Insert( 44, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 44, m_rWW8Export.pO->Count() ); - rWrtWW8.pO->Insert( rAttr.IsHyphen() ? 0 : 1, rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.pO->Insert( rHyphenZone.IsHyphen() ? 0 : 1, m_rWW8Export.pO->Count() ); } -static Writer& OutWW8_SfxBoolItem( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::ParaScriptSpace( const SfxBoolItem& rScriptSpace ) { USHORT nId = 0; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - switch ( rHt.Which() ) + if ( m_rWW8Export.bWrtWW8 ) + switch ( rScriptSpace.Which() ) { - case RES_PARATR_SCRIPTSPACE: nId = 0x2437; break; - case RES_PARATR_HANGINGPUNCTUATION: nId = 0x2435; break; - case RES_PARATR_FORBIDDEN_RULES: nId = 0x2433; break; + case RES_PARATR_SCRIPTSPACE: nId = NS_sprm::LN_PFAutoSpaceDE; break; + case RES_PARATR_HANGINGPUNCTUATION: nId = NS_sprm::LN_PFOverflowPunct; break; + case RES_PARATR_FORBIDDEN_RULES: nId = NS_sprm::LN_PFKinsoku; break; } - if( nId ) + if ( nId ) { - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( nId ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( nId ); else - rWrtWW8.pO->Insert( (BYTE)nId, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( (BYTE)nId, m_rWW8Export.pO->Count() ); - rWrtWW8.pO->Insert( ((SfxBoolItem&)rHt).GetValue() ? 1 : 0, - rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( rScriptSpace.GetValue() ? 1 : 0, + m_rWW8Export.pO->Count() ); } - return rWrt; } -static Writer& OutWW8_SvxParaGridItem(Writer& rWrt, const SfxPoolItem& rHt) +void WW8AttributeOutput::ParaSnapToGrid( const SvxParaGridItem& rGrid ) { -// sprmPFUsePgsuSettings - - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - //97+ only - if (!rWrtWW8.bWrtWW8) - return rWrt; + // sprmPFUsePgsuSettings + // 97+ only + if ( !m_rWW8Export.bWrtWW8 ) + return; - rWrtWW8.InsUInt16(0x2447); - const SvxParaGridItem& rAttr = (const SvxParaGridItem&)rHt; - rWrtWW8.pO->Insert( rAttr.GetValue(), rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.InsUInt16( NS_sprm::LN_PFUsePgsuSettings ); + m_rWW8Export.pO->Insert( rGrid.GetValue(), m_rWW8Export.pO->Count() ); } -static Writer& OutWW8_SvxParaVertAlignItem(Writer& rWrt, const SfxPoolItem& rHt) +void WW8AttributeOutput::ParaVerticalAlign( const SvxParaVertAlignItem& rAlign ) { -// sprmPWAlignFont - - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - //97+ only - if( !rWrtWW8.bWrtWW8 ) - return rWrt; + // sprmPWAlignFont + // 97+ only + if( !m_rWW8Export.bWrtWW8 ) + return; - rWrtWW8.InsUInt16( 0x4439 ); - const SvxParaVertAlignItem & rAttr = (const SvxParaVertAlignItem&)rHt; + m_rWW8Export.InsUInt16( NS_sprm::LN_PWAlignFont ); - INT16 nVal = rAttr.GetValue(); - switch (nVal) + INT16 nVal = rAlign.GetValue(); + switch ( nVal ) { case SvxParaVertAlignItem::BASELINE: nVal = 2; @@ -3051,25 +3053,23 @@ static Writer& OutWW8_SvxParaVertAlignItem(Writer& rWrt, const SfxPoolItem& rHt) break; default: nVal = 4; - ASSERT(!(&rWrt), "Unknown vert alignment"); + ASSERT( false, "Unknown vert alignment" ); break; } - rWrtWW8.InsUInt16( nVal ); - return rWrt; + m_rWW8Export.InsUInt16( nVal ); } // NoHyphen: ich habe keine Entsprechung in der SW-UI und WW-UI gefunden -static Writer& OutWW8_SwHardBlank( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::TextHardBlank( const SwFmtHardBlank& rHardBlank ) { - ((SwWW8Writer&)rWrt).WriteChar( ((SwFmtHardBlank&)rHt).GetChar() ); - return rWrt; + m_rWW8Export.WriteChar( rHardBlank.GetChar() ); } // RefMark, NoLineBreakHere fehlen noch -void SwWW8Writer::WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pOutArr ) +void WW8Export::WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pOutArr ) { WW8Bytes aAttrArr; bool bAutoNum = !rFtn.GetNumStr().Len(); // Auto-Nummer @@ -3107,7 +3107,7 @@ void SwWW8Writer::WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pOutArr ) ? pInfo->GetAnchorCharFmt( *pDoc ) : pInfo->GetCharFmt( *pDoc ); if( bWrtWW8 ) - SwWW8Writer::InsUInt16( aAttrArr, 0x4a30 ); + SwWW8Writer::InsUInt16( aAttrArr, NS_sprm::LN_CIstd ); else aAttrArr.Insert( 80, aAttrArr.Count() ); SwWW8Writer::InsUInt16( aAttrArr, GetId( *pCFmt ) ); @@ -3151,7 +3151,7 @@ void SwWW8Writer::WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pOutArr ) pTxtFtn->GetTxtNode().GetAttr( aSet, *pTxtFtn->GetStart(), (*pTxtFtn->GetStart()) + 1 ); - ::OutWW8_SwFont( *this, aSet.Get( RES_CHRATR_FONT )); + m_pAttrOutput->OutputItem( aSet.Get( RES_CHRATR_FONT ) ); pO = pOld; } pChpPlc->AppendFkpEntry( Strm().Tell(), aOutArr.Count(), @@ -3180,84 +3180,81 @@ static bool lcl_IsAtTxtEnd(const SwFmtFtn& rFtn) } -static Writer& OutWW8_SwFtn( Writer& rWrt, const SfxPoolItem& rHt ) +void AttributeOutputBase::TextFootnote( const SwFmtFtn& rFtn ) { - const SwFmtFtn& rFtn = (const SwFmtFtn&)rHt; - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - USHORT nTyp; - WW8_WrPlcFtnEdn* pFtnEnd; - if( rFtn.IsEndNote() ) + if ( rFtn.IsEndNote() ) { - pFtnEnd = rWW8Wrt.pEdn; nTyp = REF_ENDNOTE; - if( rWW8Wrt.bEndAtTxtEnd ) - rWW8Wrt.bEndAtTxtEnd = lcl_IsAtTxtEnd( rFtn ); + if ( GetExport().bEndAtTxtEnd ) + GetExport().bEndAtTxtEnd = lcl_IsAtTxtEnd( rFtn ); } else { - pFtnEnd = rWW8Wrt.pFtn; nTyp = REF_FOOTNOTE; - if( rWW8Wrt.bFtnAtTxtEnd ) - rWW8Wrt.bFtnAtTxtEnd = lcl_IsAtTxtEnd( rFtn ); + if ( GetExport().bFtnAtTxtEnd ) + GetExport().bFtnAtTxtEnd = lcl_IsAtTxtEnd( rFtn ); } // if any reference to this footnote/endnote then insert an internal // Bookmark. String sBkmkNm; - if( rWW8Wrt.HasRefToObject( nTyp, 0, rFtn.GetTxtFtn()->GetSeqRefNo() )) + if ( GetExport().HasRefToObject( nTyp, 0, rFtn.GetTxtFtn()->GetSeqRefNo() )) { - sBkmkNm = rWW8Wrt.GetBookmarkName( nTyp, 0, + sBkmkNm = GetExport().GetBookmarkName( nTyp, 0, rFtn.GetTxtFtn()->GetSeqRefNo() ); - rWW8Wrt.AppendBookmark( sBkmkNm ); + GetExport().AppendBookmark( sBkmkNm ); } + TextFootnote_Impl( rFtn ); - pFtnEnd->Append( rWW8Wrt.Fc2Cp( rWrt.Strm().Tell() ), rFtn ); - rWW8Wrt.WriteFtnBegin( rFtn, rWW8Wrt.pO ); + if ( sBkmkNm.Len() ) + GetExport().AppendBookmark( sBkmkNm ); // FIXME: Why is it added twice? Shouldn't this one go to WW8AttributeOuput::TextFootnote_Impl()? +} - if( sBkmkNm.Len() ) - rWW8Wrt.AppendBookmark( sBkmkNm ); +void WW8AttributeOutput::TextFootnote_Impl( const SwFmtFtn& rFtn ) +{ + WW8_WrPlcFtnEdn* pFtnEnd; + if ( rFtn.IsEndNote() ) + pFtnEnd = m_rWW8Export.pEdn; + else + pFtnEnd = m_rWW8Export.pFtn; - return rWrt; + pFtnEnd->Append( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ), rFtn ); + m_rWW8Export.WriteFtnBegin( rFtn, m_rWW8Export.pO ); } -static Writer& OutWW8_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::TextCharFormat( const SwFmtCharFmt& rCharFmt ) { - const SwFmtCharFmt& rAttr = (const SwFmtCharFmt&)rHt; - if( rAttr.GetCharFmt() ) + if( rCharFmt.GetCharFmt() ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x4A30 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_CIstd ); else - rWrtWW8.pO->Insert( 80, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 80, m_rWW8Export.pO->Count() ); - rWrtWW8.InsUInt16( rWrtWW8.GetId( *rAttr.GetCharFmt() ) ); + m_rWW8Export.InsUInt16( m_rWW8Export.GetId( *rCharFmt.GetCharFmt() ) ); } - return rWrt; } /* See ww8par6.cxx Read_DoubleLine for some more info */ -static Writer& OutWW8_SvxTwoLinesItem( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::CharTwoLines( const SvxTwoLinesItem& rTwoLines ) { // #i28331# - check that bOn is set - if((static_cast<const SvxTwoLinesItem&>(rHt)).GetValue()) + if ( rTwoLines.GetValue() ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; //97+ only - if( !rWrtWW8.bWrtWW8 ) - return rWrt; + if( !m_rWW8Export.bWrtWW8 ) + return; - const SvxTwoLinesItem& rAttr = (const SvxTwoLinesItem&)rHt; - rWrtWW8.InsUInt16( 0xCA78 ); - rWrtWW8.pO->Insert( (BYTE)0x06, rWrtWW8.pO->Count() ); //len 6 - rWrtWW8.pO->Insert( (BYTE)0x02, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_CEastAsianLayout ); + m_rWW8Export.pO->Insert( (BYTE)0x06, m_rWW8Export.pO->Count() ); //len 6 + m_rWW8Export.pO->Insert( (BYTE)0x02, m_rWW8Export.pO->Count() ); - sal_Unicode cStart = rAttr.GetStartBracket(); - sal_Unicode cEnd = rAttr.GetStartBracket(); + sal_Unicode cStart = rTwoLines.GetStartBracket(); + sal_Unicode cEnd = rTwoLines.GetStartBracket(); /* As per usual we have problems. We can have seperate left and right brackets @@ -3284,43 +3281,39 @@ static Writer& OutWW8_SvxTwoLinesItem( Writer& rWrt, const SfxPoolItem& rHt ) nType = 2; else nType = 1; - rWrtWW8.InsUInt16( nType ); + m_rWW8Export.InsUInt16( nType ); static const BYTE aZeroArr[ 3 ] = { 0, 0, 0 }; - rWrtWW8.pO->Insert( aZeroArr, 3, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( aZeroArr, 3, m_rWW8Export.pO->Count() ); } - return rWrt; } -static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt ) +void AttributeOutputBase::ParaNumRule( const SwNumRuleItem& rNumRule ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SwNumRuleItem& rNumRule = (const SwNumRuleItem&)rHt; - const SwTxtNode* pTxtNd = 0; USHORT nNumId; BYTE nLvl = 0; - if( rNumRule.GetValue().Len() ) + if ( rNumRule.GetValue().Len() ) { - const SwNumRule* pRule = rWrt.pDoc->FindNumRulePtr( + const SwNumRule* pRule = GetExport().pDoc->FindNumRulePtr( rNumRule.GetValue() ); - if( pRule && USHRT_MAX != ( nNumId = rWW8Wrt.GetId( *pRule )) ) + if ( pRule && USHRT_MAX != ( nNumId = GetExport().GetId( *pRule ) ) ) { ++nNumId; - if( rWW8Wrt.pOutFmtNode ) + if ( GetExport().pOutFmtNode ) { - if( rWW8Wrt.pOutFmtNode->ISA( SwCntntNode )) + if ( GetExport().pOutFmtNode->ISA( SwCntntNode ) ) { - pTxtNd = (SwTxtNode*)rWW8Wrt.pOutFmtNode; + pTxtNd = (SwTxtNode*)GetExport().pOutFmtNode; if( pTxtNd->IsCountedInList()) { nLvl = static_cast< BYTE >(pTxtNd->GetActualListLevel()); - if (pTxtNd->IsListRestart()) + if ( pTxtNd->IsListRestart() ) { - USHORT nStartWith = static_cast< USHORT >(pTxtNd->GetActualListStartValue()); - nNumId = rWW8Wrt.DupNumRuleWithLvlStart(pRule,nLvl,nStartWith); - if (USHRT_MAX != nNumId) + USHORT nStartWith = static_cast< USHORT >( pTxtNd->GetActualListStartValue() ); + nNumId = GetExport().DuplicateNumRule( pRule, nLvl, nStartWith ); + if ( USHRT_MAX != nNumId ) ++nNumId; } } @@ -3333,13 +3326,13 @@ static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt ) nNumId = 0; } } - else if( rWW8Wrt.pOutFmtNode->ISA( SwTxtFmtColl )) + else if ( GetExport().pOutFmtNode->ISA( SwTxtFmtColl ) ) { - const SwTxtFmtColl* pC = (SwTxtFmtColl*)rWW8Wrt.pOutFmtNode; + const SwTxtFmtColl* pC = (SwTxtFmtColl*)GetExport().pOutFmtNode; //if( pC && MAXLEVEL > pC->GetOutlineLevel() ) //#outline level,removed by zhaojianwei // nLvl = pC->GetOutlineLevel(); //<-end, ->add by zhaojianwei - if( pC && pC->IsAssignedToListLevelOfOutlineStyle() ) - nLvl = static_cast<BYTE>(pC->GetAssignedOutlineStyleLevel()); //<-end,zhaojianwei + if ( pC && pC->IsAssignedToListLevelOfOutlineStyle() ) + nLvl = static_cast< BYTE >( pC->GetAssignedOutlineStyleLevel() ); //<-end,zhaojianwei } } } @@ -3349,94 +3342,95 @@ static Writer& OutWW8_SwNumRuleItem( Writer& rWrt, const SfxPoolItem& rHt ) else nNumId = 0; - if (USHRT_MAX != nNumId) + if ( USHRT_MAX != nNumId ) { - if (nLvl >= WW8ListManager::nMaxLevel) - nLvl = WW8ListManager::nMaxLevel-1; - if( rWW8Wrt.bWrtWW8 ) - { - // write sprmPIlvl and sprmPIlfo - SwWW8Writer::InsUInt16( *rWW8Wrt.pO, 0x260a ); - rWW8Wrt.pO->Insert( nLvl, rWW8Wrt.pO->Count() ); - SwWW8Writer::InsUInt16( *rWW8Wrt.pO, 0x460b ); - SwWW8Writer::InsUInt16( *rWW8Wrt.pO, nNumId ); - } - else if( pTxtNd && rWW8Wrt.Out_SwNum( pTxtNd ) ) // NumRules - rWW8Wrt.pSepx->SetNum( pTxtNd ); + if ( nLvl >= WW8ListManager::nMaxLevel ) + nLvl = WW8ListManager::nMaxLevel - 1; + + ParaNumRule_Impl( pTxtNd, nLvl, nNumId ); + } +} + +void WW8AttributeOutput::ParaNumRule_Impl( const SwTxtNode* pTxtNd, sal_Int32 nLvl, sal_Int32 nNumId ) +{ + if ( m_rWW8Export.bWrtWW8 ) + { + // write sprmPIlvl and sprmPIlfo + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_PIlvl ); + m_rWW8Export.pO->Insert( ::sal::static_int_cast<BYTE>(nLvl), m_rWW8Export.pO->Count() ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_PIlfo ); + SwWW8Writer::InsUInt16( *m_rWW8Export.pO, ::sal::static_int_cast<UINT16>(nNumId) ); } - return rWrt; + else if ( pTxtNd && m_rWW8Export.Out_SwNum( pTxtNd ) ) // NumRules + m_rWW8Export.pSepx->SetNum( pTxtNd ); } /* File FRMATR.HXX */ -static Writer& OutWW8_SwFrmSize( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatFrameSize( const SwFmtFrmSize& rSize ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SwFmtFrmSize& rSz = (const SwFmtFrmSize&)rHt; - - if( rWW8Wrt.bOutFlyFrmAttrs ) // Flys + if( m_rWW8Export.bOutFlyFrmAttrs ) // Flys { - if( rWW8Wrt.bOutGrf ) - return rWrt; // Fly um Grafik -> Auto-Groesse + if( m_rWW8Export.bOutGrf ) + return; // Fly um Grafik -> Auto-Groesse //???? was ist bei Prozentangaben ??? - if( rSz.GetWidth() && rSz.GetWidthSizeType() == ATT_FIX_SIZE) + if ( rSize.GetWidth() && rSize.GetWidthSizeType() == ATT_FIX_SIZE) { //"sprmPDxaWidth" - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x841A ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDxaWidth ); else - rWW8Wrt.pO->Insert( 28, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( (USHORT)rSz.GetWidth() ); + m_rWW8Export.pO->Insert( 28, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( (USHORT)rSize.GetWidth() ); } - if( rSz.GetHeight() ) + if ( rSize.GetHeight() ) { // sprmPWHeightAbs - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x442B ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PWHeightAbs ); else - rWW8Wrt.pO->Insert( 45, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 45, m_rWW8Export.pO->Count() ); USHORT nH = 0; - switch( rSz.GetHeightSizeType() ) + switch ( rSize.GetHeightSizeType() ) { - case ATT_VAR_SIZE: break; - case ATT_FIX_SIZE: nH = (USHORT)rSz.GetHeight() & 0x7fff; break; - default: nH = (USHORT)rSz.GetHeight() | 0x8000; break; + case ATT_VAR_SIZE: break; + case ATT_FIX_SIZE: nH = (USHORT)rSize.GetHeight() & 0x7fff; break; + default: nH = (USHORT)rSize.GetHeight() | 0x8000; break; } - rWW8Wrt.InsUInt16( nH ); + m_rWW8Export.InsUInt16( nH ); } } - else if( rWW8Wrt.bOutPageDescs ) // PageDesc : Breite + Hoehe + else if( m_rWW8Export.bOutPageDescs ) // PageDesc : Breite + Hoehe { - if( rWW8Wrt.pAktPageDesc->GetLandscape() ) + if( m_rWW8Export.pAktPageDesc->GetLandscape() ) { /*sprmSBOrientation*/ - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x301d ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SBOrientation ); else - rWW8Wrt.pO->Insert( 162, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( 2, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 162, m_rWW8Export.pO->Count() ); + m_rWW8Export.pO->Insert( 2, m_rWW8Export.pO->Count() ); } /*sprmSXaPage*/ - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xB01F ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SXaPage ); else - rWW8Wrt.pO->Insert( 164, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( - msword_cast<sal_uInt16>(SvxPaperInfo::GetSloppyPaperDimension(rSz.GetWidth()))); + m_rWW8Export.pO->Insert( 164, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( + msword_cast<sal_uInt16>(SvxPaperInfo::GetSloppyPaperDimension(rSize.GetWidth()))); /*sprmSYaPage*/ - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xB020 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SYaPage ); else - rWW8Wrt.pO->Insert( 165, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( - msword_cast<sal_uInt16>(SvxPaperInfo::GetSloppyPaperDimension(rSz.GetHeight()))); + m_rWW8Export.pO->Insert( 165, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( + msword_cast<sal_uInt16>(SvxPaperInfo::GetSloppyPaperDimension(rSize.GetHeight()))); } - return rWrt; } // FillOrder fehlt noch @@ -3446,7 +3440,7 @@ static Writer& OutWW8_SwFrmSize( Writer& rWrt, const SfxPoolItem& rHt ) // direkt nach Schreiben des CR gerufen werden. // Rueckgabe: FilePos des ersetzten CRs + 1 oder 0 fuer nicht ersetzt -ULONG SwWW8Writer::ReplaceCr( BYTE nChar ) +ULONG WW8Export::ReplaceCr( BYTE nChar ) { // Bug #49917# ASSERT( nChar, "gegen 0 ersetzt bringt WW97/95 zum Absturz" ); @@ -3527,12 +3521,12 @@ ULONG SwWW8Writer::ReplaceCr( BYTE nChar ) return nRetPos; } -void SwWW8Writer::WriteRowEnd(sal_uInt32 nDepth) +void WW8AttributeOutput::TableRowEnd(sal_uInt32 nDepth) { - if (nDepth == 1) - WriteChar( (BYTE)0x07 ); - else if (nDepth > 1) - WriteChar( (BYTE)0x0d ); + if ( nDepth == 1 ) + m_rWW8Export.WriteChar( (BYTE)0x07 ); + else if ( nDepth > 1 ) + m_rWW8Export.WriteChar( (BYTE)0x0d ); //Technically in a word document this is a different value for a row ends //that are not row ends directly after a cell with a graphic. But it @@ -3540,55 +3534,50 @@ void SwWW8Writer::WriteRowEnd(sal_uInt32 nDepth) //pMagicTable->Append(Fc2Cp(Strm().Tell()),0x1B6); } -static Writer& OutWW8_SwFmtPageDesc(Writer& rWrt, const SfxPoolItem& rHt) +void AttributeOutputBase::FormatPageDescription( const SwFmtPageDesc& rPageDesc ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - if (rWW8Wrt.bStyDef && rWW8Wrt.pOutFmtNode && rWW8Wrt.pOutFmtNode->ISA(SwTxtFmtColl)) + if ( GetExport().bStyDef && GetExport().pOutFmtNode && GetExport().pOutFmtNode->ISA( SwTxtFmtColl ) ) { - const SwFmtPageDesc &rPgDesc = (const SwFmtPageDesc&)rHt; - const SwTxtFmtColl* pC = (SwTxtFmtColl*)rWW8Wrt.pOutFmtNode; - if ((SFX_ITEM_SET != pC->GetItemState(RES_BREAK, false)) && rPgDesc.GetRegisteredIn()) - OutWW8_SwFmtBreak(rWrt, SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE, RES_BREAK)); + const SwTxtFmtColl* pC = (SwTxtFmtColl*)GetExport().pOutFmtNode; + if ( (SFX_ITEM_SET != pC->GetItemState( RES_BREAK, false ) ) && rPageDesc.GetRegisteredIn() ) + FormatBreak( SvxFmtBreakItem( SVX_BREAK_PAGE_BEFORE, RES_BREAK ) ); } - return rWrt; +} + +void WW8AttributeOutput::PageBreakBefore( bool bBreak ) +{ + // sprmPPageBreakBefore/sprmPFPageBreakBefore + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFPageBreakBefore ); + else + m_rWW8Export.pO->Insert( 9, m_rWW8Export.pO->Count() ); + + m_rWW8Export.pO->Insert( bBreak ? 1 : 0, m_rWW8Export.pO->Count() ); } // Breaks schreiben nichts in das Ausgabe-Feld rWrt.pO, // sondern nur in den Text-Stream ( Bedingung dafuer, dass sie von Out_Break... // gerufen werden duerfen ) -static Writer& OutWW8_SwFmtBreak( Writer& rWrt, const SfxPoolItem& rHt ) +void AttributeOutputBase::FormatBreak( const SvxFmtBreakItem& rBreak ) { -/*UMSTELLEN*/ - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SvxFmtBreakItem &rBreak = (const SvxFmtBreakItem&)rHt; - - if( rWW8Wrt.bStyDef ) + if ( GetExport().bStyDef ) { - switch( rBreak.GetBreak() ) + switch ( rBreak.GetBreak() ) { -//JP 21.06.99: column breaks does never change to pagebreaks -// case SVX_BREAK_COLUMN_BEFORE: -// case SVX_BREAK_COLUMN_BOTH: - case SVX_BREAK_NONE: - case SVX_BREAK_PAGE_BEFORE: - case SVX_BREAK_PAGE_BOTH: - // sprmPPageBreakBefore/sprmPFPageBreakBefore - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0x2407); - else - rWW8Wrt.pO->Insert(9, rWW8Wrt.pO->Count()); - rWW8Wrt.pO->Insert(rBreak.GetValue() ? 1 : 0, - rWW8Wrt.pO->Count()); - break; - default: - break; + // JP 21.06.99: column breaks never change to pagebreaks + // case SVX_BREAK_COLUMN_BEFORE: + // case SVX_BREAK_COLUMN_BOTH: + case SVX_BREAK_NONE: + case SVX_BREAK_PAGE_BEFORE: + case SVX_BREAK_PAGE_BOTH: + PageBreakBefore( rBreak.GetValue() ); + break; + default: + break; } } - else if (!rWW8Wrt.mpParentFrame) + else if ( !GetExport().mpParentFrame ) { - static const BYTE cColBreak = 0xe; - static const BYTE cPageBreak = 0xc; - BYTE nC = 0; bool bBefore = false; // --> OD 2007-05-29 #i76300# @@ -3596,95 +3585,83 @@ static Writer& OutWW8_SwFmtBreak( Writer& rWrt, const SfxPoolItem& rHt ) bool bCheckForFollowPageDesc = false; // <-- - switch( rBreak.GetBreak() ) + switch ( rBreak.GetBreak() ) { - case SVX_BREAK_NONE: // Ausgeschaltet - if( !rWW8Wrt.bBreakBefore ) - { - // sprmPPageBreakBefore/sprmPFPageBreakBefore - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x2407 ); - else - rWW8Wrt.pO->Insert( 9, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( (BYTE)0, rWW8Wrt.pO->Count() ); - } - return rWrt; + case SVX_BREAK_NONE: // Ausgeschaltet + if ( !GetExport().bBreakBefore ) + PageBreakBefore( false ); + return; - case SVX_BREAK_COLUMN_BEFORE: // ColumnBreak - bBefore = true; + case SVX_BREAK_COLUMN_BEFORE: // ColumnBreak + bBefore = true; // no break; - case SVX_BREAK_COLUMN_AFTER: - case SVX_BREAK_COLUMN_BOTH: - ASSERT (rWW8Wrt.pSepx, "how come this is 0"); - if (rWW8Wrt.pSepx && - rWW8Wrt.pSepx->CurrentNoColumns(*rWW8Wrt.pDoc) > 1) - { - nC = cColBreak; - } - break; + case SVX_BREAK_COLUMN_AFTER: + case SVX_BREAK_COLUMN_BOTH: + if ( GetExport().Sections().CurrentNumberOfColumns( *GetExport().pDoc ) > 1 ) + { + nC = msword::ColumnBreak; + } + break; - case SVX_BREAK_PAGE_BEFORE: // PageBreak - // From now on(fix for #i77900#) we prefer to save a page break as - // paragraph attribute, this has to be done after the export of the - // paragraph ( => !rWW8Wrt.bBreakBefore ) - if( !rWW8Wrt.bBreakBefore ) - { - // sprmPPageBreakBefore/sprmPFPageBreakBefore - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x2407 ); - else - rWW8Wrt.pO->Insert( 9, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( (BYTE)1, rWW8Wrt.pO->Count() ); - } - break; - case SVX_BREAK_PAGE_AFTER: - case SVX_BREAK_PAGE_BOTH: - nC = cPageBreak; - // --> OD 2007-05-29 #i76300# - // check for follow page description, if current writing attributes - // of a paragraph. - if ( dynamic_cast<const SwTxtNode*>(rWW8Wrt.pOutFmtNode) && - rWW8Wrt.GetCurItemSet() ) - { - bCheckForFollowPageDesc = true; - } - // <-- - break; - default: - break; + case SVX_BREAK_PAGE_BEFORE: // PageBreak + // From now on(fix for #i77900#) we prefer to save a page break as + // paragraph attribute, this has to be done after the export of the + // paragraph ( => !GetExport().bBreakBefore ) + if ( !GetExport().bBreakBefore ) + PageBreakBefore( true ); + break; + + case SVX_BREAK_PAGE_AFTER: + case SVX_BREAK_PAGE_BOTH: + nC = msword::PageBreak; + // --> OD 2007-05-29 #i76300# + // check for follow page description, if current writing attributes + // of a paragraph. + if ( dynamic_cast< const SwTxtNode* >( GetExport().pOutFmtNode ) && + GetExport().GetCurItemSet() ) + { + bCheckForFollowPageDesc = true; + } + // <-- + break; + + default: + break; } - if ( (bBefore == rWW8Wrt.bBreakBefore ) && nC ) // #49917# + if ( ( bBefore == GetExport().bBreakBefore ) && nC ) // #49917# { // --> OD 2007-05-29 #i76300# - bool bFollowPageDescWritten( false ); + bool bFollowPageDescWritten = false; if ( bCheckForFollowPageDesc && !bBefore ) { bFollowPageDescWritten = - rWW8Wrt.Out_FollowPageDesc( rWW8Wrt.GetCurItemSet(), - dynamic_cast<const SwTxtNode*>(rWW8Wrt.pOutFmtNode) ); + GetExport().OutputFollowPageDesc( GetExport().GetCurItemSet(), + dynamic_cast<const SwTxtNode*>( GetExport().pOutFmtNode ) ); } if ( !bFollowPageDescWritten ) { - rWW8Wrt.ReplaceCr( nC ); + SectionBreak( nC ); } // <-- } } - return rWrt; } -static Writer& OutWW8_SwTextGrid( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::SectionBreak( BYTE nC, const WW8_SepInfo* /*pSectionInfo*/ ) +{ + m_rWW8Export.ReplaceCr( nC ); +} + +void WW8AttributeOutput::FormatTextGrid( const SwTextGridItem& rGrid ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bOutPageDescs && rWrtWW8.bWrtWW8) + if ( m_rWW8Export.bOutPageDescs && m_rWW8Export.bWrtWW8 ) { - const SwTextGridItem& rItem = (const SwTextGridItem&)rHt; - UINT16 nGridType=0; - switch (rItem.GetGridType()) + UINT16 nGridType = 0; + switch ( rGrid.GetGridType() ) { default: - ASSERT(!(&rWrt), "Unknown grid type"); + ASSERT(false, "Unknown grid type"); case GRID_NONE: nGridType = 0; break; @@ -3692,103 +3669,86 @@ static Writer& OutWW8_SwTextGrid( Writer& rWrt, const SfxPoolItem& rHt ) nGridType = 2; break; case GRID_LINES_CHARS: - { - if(rItem.IsSnapToChars()) - { - nGridType = 3; - } - else - { - nGridType = 1; - } - } + if ( rGrid.IsSnapToChars() ) + nGridType = 3; + else + nGridType = 1; break; } - rWrtWW8.InsUInt16(0x5032); - rWrtWW8.InsUInt16(nGridType); + m_rWW8Export.InsUInt16( NS_sprm::LN_SClm ); + m_rWW8Export.InsUInt16( nGridType ); - UINT16 nHeight = rItem.GetBaseHeight() + rItem.GetRubyHeight(); - rWrtWW8.InsUInt16(0x9031); - rWrtWW8.InsUInt16(nHeight); - sal_uInt32 nPageCharSize = ItemGet<SvxFontHeightItem>(*(rWrtWW8.pStyles->GetSwFmt()), + UINT16 nHeight = rGrid.GetBaseHeight() + rGrid.GetRubyHeight(); + m_rWW8Export.InsUInt16( NS_sprm::LN_SDyaLinePitch ); + m_rWW8Export.InsUInt16( nHeight ); + sal_uInt32 nPageCharSize = ItemGet<SvxFontHeightItem>(*(m_rWW8Export.pStyles->GetSwFmt()), RES_CHRATR_CJK_FONTSIZE).GetHeight(); - INT32 nCharWidth = rItem.GetBaseWidth() - nPageCharSize; - INT32 nFraction = 0; - nFraction = nCharWidth%20; - if( nCharWidth < 0 ) + INT32 nCharWidth = rGrid.GetBaseWidth() - nPageCharSize; + INT32 nFraction = 0; + nFraction = nCharWidth % 20; + if ( nCharWidth < 0 ) nFraction = 20 + nFraction; - nFraction = ((nFraction)*0xFFF)/20; - nFraction = (nFraction & 0x00000FFF); + nFraction = ( nFraction * 0xFFF ) / 20; + nFraction = ( nFraction & 0x00000FFF ); - INT32 nMain = 0; - nMain = nCharWidth/20; - if( nCharWidth < 0 ) + INT32 nMain = 0; + nMain = nCharWidth / 20; + if ( nCharWidth < 0 ) nMain -= 1; - nMain = nMain * 0x1000; - nMain = (nMain & 0xFFFFF000); + nMain = nMain * 0x1000; + nMain = ( nMain & 0xFFFFF000 ); - UINT32 nCharSpace = nFraction + nMain; - rWrtWW8.InsUInt16(0x7030); - rWrtWW8.InsUInt32(nCharSpace); + UINT32 nCharSpace = nFraction + nMain; + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxtCharSpace ); + m_rWW8Export.InsUInt32( nCharSpace ); } - return rWrt; } -static Writer& OutWW8_SvxPaperBin( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatPaperBin( const SvxPaperBinItem& rPaperBin ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - const SvxPaperBinItem& rItem = (const SvxPaperBinItem&)rHt; - - if( rWrtWW8.bOutPageDescs ) + if ( m_rWW8Export.bOutPageDescs ) { USHORT nVal; - switch( rItem.GetValue() ) + switch ( rPaperBin.GetValue() ) { - case 0: nVal = 15; break; // Automatically select - case 1: nVal = 1; break; // Upper paper tray - case 2: nVal = 4; break; // Manual paper feed - default: nVal = 0; break; + case 0: nVal = 15; break; // Automatically select + case 1: nVal = 1; break; // Upper paper tray + case 2: nVal = 4; break; // Manual paper feed + default: nVal = 0; break; } - if( nVal ) + if ( nVal ) { - // sprmSDmBinFirst 0x5007 word - // sprmSDmBinOther 0x5008 word - BYTE nOff = rWrtWW8.bOutFirstPage ? 0 : 1; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x5007 + nOff ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( m_rWW8Export.bOutFirstPage? NS_sprm::LN_SDmBinFirst: NS_sprm::LN_SDmBinOther ); else - rWrtWW8.pO->Insert( 140 + nOff, rWrtWW8.pO->Count() ); - rWrtWW8.InsUInt16( nVal ); + m_rWW8Export.pO->Insert( m_rWW8Export.bOutFirstPage? 140: 141, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( nVal ); } } - return rWrt; } -static Writer& OutWW8_SwFmtLRSpace( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatLRSpace( const SvxLRSpaceItem& rLR ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SvxLRSpaceItem & rLR = (const SvxLRSpaceItem&) rHt; - - // Flys fehlen noch ( siehe RTF ) - if( rWW8Wrt.bOutFlyFrmAttrs ) // Flys + if ( m_rWW8Export.bOutFlyFrmAttrs ) // Flys { // sprmPDxaFromText10 - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x4622 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDxaFromText10 ); else - rWW8Wrt.pO->Insert( 49, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 49, m_rWW8Export.pO->Count() ); // Mittelwert nehmen, da WW nur 1 Wert kennt - rWW8Wrt.InsUInt16( (USHORT) ( ( rLR.GetLeft() + rLR.GetRight() ) / 2 ) ); + m_rWW8Export.InsUInt16( (USHORT) ( ( rLR.GetLeft() + rLR.GetRight() ) / 2 ) ); } - else if( rWW8Wrt.bOutPageDescs ) // PageDescs + else if ( m_rWW8Export.bOutPageDescs ) // PageDescs { USHORT nLDist, nRDist; - const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem( RES_BOX ); - if( pItem ) + const SfxPoolItem* pItem = m_rWW8Export.HasItem( RES_BOX ); + if ( pItem ) { nRDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_LEFT ); nLDist = ((SvxBoxItem*)pItem)->CalcLineSpace( BOX_LINE_RIGHT ); @@ -3799,249 +3759,235 @@ static Writer& OutWW8_SwFmtLRSpace( Writer& rWrt, const SfxPoolItem& rHt ) nRDist = nRDist + (USHORT)rLR.GetRight(); // sprmSDxaLeft - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xB021 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxaLeft ); else - rWW8Wrt.pO->Insert( 166, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( nLDist ); + m_rWW8Export.pO->Insert( 166, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( nLDist ); + // sprmSDxaRight - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xB022 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxaRight ); else - rWW8Wrt.pO->Insert( 167, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( nRDist ); + m_rWW8Export.pO->Insert( 167, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( nRDist ); } else { // normale Absaetze // sprmPDxaLeft - if( rWW8Wrt.bWrtWW8 ) + if( m_rWW8Export.bWrtWW8 ) { - rWW8Wrt.InsUInt16( 0x845E ); //asian version ? - rWW8Wrt.InsUInt16( (USHORT)rLR.GetTxtLeft() ); - + m_rWW8Export.InsUInt16( 0x845E ); //asian version ? + m_rWW8Export.InsUInt16( (USHORT)rLR.GetTxtLeft() ); } else { - rWW8Wrt.pO->Insert( 17, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( (USHORT)rLR.GetTxtLeft() ); + m_rWW8Export.pO->Insert( 17, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( (USHORT)rLR.GetTxtLeft() ); } + // sprmPDxaRight - if( rWW8Wrt.bWrtWW8 ) + if( m_rWW8Export.bWrtWW8 ) { - rWW8Wrt.InsUInt16( 0x845D ); //asian version ? - rWW8Wrt.InsUInt16( (USHORT)rLR.GetRight() ); + m_rWW8Export.InsUInt16( 0x845D ); //asian version ? + m_rWW8Export.InsUInt16( (USHORT)rLR.GetRight() ); } else { - rWW8Wrt.pO->Insert( 16, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( (USHORT)rLR.GetRight() ); + m_rWW8Export.pO->Insert( 16, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( (USHORT)rLR.GetRight() ); } + // sprmPDxaLeft1 - if( rWW8Wrt.bWrtWW8 ) + if( m_rWW8Export.bWrtWW8 ) { - rWW8Wrt.InsUInt16( 0x8460 ); //asian version ? - rWW8Wrt.InsUInt16( rLR.GetTxtFirstLineOfst() ); + m_rWW8Export.InsUInt16( 0x8460 ); //asian version ? + m_rWW8Export.InsUInt16( rLR.GetTxtFirstLineOfst() ); } else { - rWW8Wrt.pO->Insert( 19, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( rLR.GetTxtFirstLineOfst() ); + m_rWW8Export.pO->Insert( 19, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( rLR.GetTxtFirstLineOfst() ); } } - return rWrt; } -static Writer& OutWW8_SwFmtULSpace( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatULSpace( const SvxULSpaceItem& rUL ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SvxULSpaceItem & rUL = (const SvxULSpaceItem&) rHt; - // Flys fehlen noch ( siehe RTF ) - if( rWW8Wrt.bOutFlyFrmAttrs ) // Flys + if ( m_rWW8Export.bOutFlyFrmAttrs ) // Flys { // sprmPDyaFromText - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x842E ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaFromText ); else - rWW8Wrt.pO->Insert( 48, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 48, m_rWW8Export.pO->Count() ); // Mittelwert nehmen, da WW nur 1 Wert kennt - rWW8Wrt.InsUInt16( (USHORT) ( ( rUL.GetUpper() + rUL.GetLower() ) / 2 ) ); + m_rWW8Export.InsUInt16( (USHORT) ( ( rUL.GetUpper() + rUL.GetLower() ) / 2 ) ); } - else if( rWW8Wrt.bOutPageDescs ) // Page-UL + else if ( m_rWW8Export.bOutPageDescs ) // Page-UL { - ASSERT(rWW8Wrt.GetCurItemSet(), "Impossible"); - if (!rWW8Wrt.GetCurItemSet()) - return rWrt; + ASSERT( m_rWW8Export.GetCurItemSet(), "Impossible" ); + if ( !m_rWW8Export.GetCurItemSet() ) + return; - HdFtDistanceGlue aDistances(*rWW8Wrt.GetCurItemSet()); + HdFtDistanceGlue aDistances( *m_rWW8Export.GetCurItemSet() ); - if (aDistances.HasHeader()) + if ( aDistances.HasHeader() ) { //sprmSDyaHdrTop - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0xB017); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDyaHdrTop ); else - rWW8Wrt.pO->Insert(156, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt16(aDistances.dyaHdrTop); + m_rWW8Export.pO->Insert( 156, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( aDistances.dyaHdrTop ); } // sprmSDyaTop - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0x9023); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDyaTop ); else - rWW8Wrt.pO->Insert(168, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt16(aDistances.dyaTop); + m_rWW8Export.pO->Insert( 168, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( aDistances.dyaTop ); - if (aDistances.HasFooter()) + if ( aDistances.HasFooter() ) { //sprmSDyaHdrBottom - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0xB018); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDyaHdrBottom ); else - rWW8Wrt.pO->Insert(157, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt16(aDistances.dyaHdrBottom); + m_rWW8Export.pO->Insert( 157, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( aDistances.dyaHdrBottom ); } //sprmSDyaBottom - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0x9024); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDyaBottom ); else - rWW8Wrt.pO->Insert(169, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt16(aDistances.dyaBottom); + m_rWW8Export.pO->Insert( 169, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( aDistances.dyaBottom ); } else { // sprmPDyaBefore - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xA413 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaBefore ); else - rWW8Wrt.pO->Insert( 21, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( rUL.GetUpper() ); + m_rWW8Export.pO->Insert( 21, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( rUL.GetUpper() ); // sprmPDyaAfter - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xA414 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaAfter ); else - rWW8Wrt.pO->Insert( 22, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( rUL.GetLower() ); + m_rWW8Export.pO->Insert( 22, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( rUL.GetLower() ); } - return rWrt; } // Print, Opaque, Protect fehlen noch -static Writer& OutWW8_SwFmtSurround( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatSurround( const SwFmtSurround& rSurround ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - if( rWW8Wrt.bOutFlyFrmAttrs ) + if ( m_rWW8Export.bOutFlyFrmAttrs ) { - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x2423 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PWr ); else - rWW8Wrt.pO->Insert( 37, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 37, m_rWW8Export.pO->Count() ); - rWW8Wrt.pO->Insert( (SURROUND_NONE != - ((const SwFmtSurround&) rHt).GetSurround() ) - ? 2 : 1, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( + ( SURROUND_NONE != rSurround.GetSurround() ) ? 2 : 1, + m_rWW8Export.pO->Count() ); } - return rWrt; } -Writer& OutWW8_SwFmtVertOrient( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatVertOrientation( const SwFmtVertOrient& rFlyVert ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - //!!!! Ankertyp und entsprechende Umrechnung fehlt noch - if( rWW8Wrt.bOutFlyFrmAttrs ) + if ( m_rWW8Export.bOutFlyFrmAttrs ) { - const SwFmtVertOrient& rFlyVert = (const SwFmtVertOrient&) rHt; - short nPos; switch( rFlyVert.GetVertOrient() ) { - case text::VertOrientation::NONE: - nPos = (short)rFlyVert.GetPos(); - break; - case text::VertOrientation::CENTER: - case text::VertOrientation::LINE_CENTER: - nPos = -8; - break; - case text::VertOrientation::BOTTOM: - case text::VertOrientation::LINE_BOTTOM: - nPos = -12; - break; - case text::VertOrientation::TOP: - case text::VertOrientation::LINE_TOP: - default: - nPos = -4; - break; + case text::VertOrientation::NONE: + nPos = (short)rFlyVert.GetPos(); + break; + case text::VertOrientation::CENTER: + case text::VertOrientation::LINE_CENTER: + nPos = -8; + break; + case text::VertOrientation::BOTTOM: + case text::VertOrientation::LINE_BOTTOM: + nPos = -12; + break; + case text::VertOrientation::TOP: + case text::VertOrientation::LINE_TOP: + default: + nPos = -4; + break; } // sprmPDyaAbs - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x8419 ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaAbs ); else - rWW8Wrt.pO->Insert( 27, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( nPos ); + m_rWW8Export.pO->Insert( 27, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( nPos ); } - return rWrt; } -Writer& OutWW8_SwFmtHoriOrient( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatHorizOrientation( const SwFmtHoriOrient& rFlyHori ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - if (!rWW8Wrt.mpParentFrame) + if ( !m_rWW8Export.mpParentFrame ) { - ASSERT(rWW8Wrt.mpParentFrame, "HoriOrient without mpParentFrame !!"); - return rWrt; + ASSERT( m_rWW8Export.mpParentFrame, "HoriOrient without mpParentFrame !!" ); + return; } //!!!! Ankertyp und entsprechende Umrechnung fehlt noch - if( rWW8Wrt.bOutFlyFrmAttrs ) + if ( m_rWW8Export.bOutFlyFrmAttrs ) { - const SwFmtHoriOrient& rFlyHori = (const SwFmtHoriOrient&) rHt; - short nPos; switch( rFlyHori.GetHoriOrient() ) { - case text::HoriOrientation::NONE: { - nPos = (short)rFlyHori.GetPos(); - if( !nPos ) - nPos = 1; // WW: 0 ist reserviert - } - break; - - case text::HoriOrientation::LEFT: nPos = rFlyHori.IsPosToggle() ? -12 : 0; - break; - case text::HoriOrientation::RIGHT: nPos = rFlyHori.IsPosToggle() ? -16 : -8; - break; - case text::HoriOrientation::CENTER: - case text::HoriOrientation::FULL: // FULL nur fuer Tabellen - default: nPos = -4; break; + case text::HoriOrientation::NONE: + nPos = (short)rFlyHori.GetPos(); + if( !nPos ) + nPos = 1; // WW: 0 ist reserviert + break; + case text::HoriOrientation::LEFT: + nPos = rFlyHori.IsPosToggle() ? -12 : 0; + break; + case text::HoriOrientation::RIGHT: + nPos = rFlyHori.IsPosToggle() ? -16 : -8; + break; + case text::HoriOrientation::CENTER: + case text::HoriOrientation::FULL: // FULL nur fuer Tabellen + default: + nPos = -4; + break; } // sprmPDxaAbs - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x8418 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDxaAbs ); else - rWW8Wrt.pO->Insert( 26, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( nPos ); + m_rWW8Export.pO->Insert( 26, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt16( nPos ); } - return rWrt; } -static Writer& OutWW8_SwFmtAnchor( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatAnchor( const SwFmtAnchor& rAnchor ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - ASSERT(rWW8Wrt.mpParentFrame, "Anchor without mpParentFrame !!"); + ASSERT( m_rWW8Export.mpParentFrame, "Anchor without mpParentFrame !!" ); - if( rWW8Wrt.bOutFlyFrmAttrs ) + if ( m_rWW8Export.bOutFlyFrmAttrs ) { - const SwFmtAnchor& rAnchor = (const SwFmtAnchor&) rHt; BYTE nP = 0; - switch( rAnchor.GetAnchorId() ) + switch ( rAnchor.GetAnchorId() ) { case FLY_PAGE: // Vert: Page | Horz: Page @@ -4060,48 +4006,43 @@ static Writer& OutWW8_SwFmtAnchor( Writer& rWrt, const SfxPoolItem& rHt ) } // sprmPPc - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x261B ); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PPc ); else - rWW8Wrt.pO->Insert( 29, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( nP, rWW8Wrt.pO->Count() ); + m_rWW8Export.pO->Insert( 29, m_rWW8Export.pO->Count() ); + m_rWW8Export.pO->Insert( nP, m_rWW8Export.pO->Count() ); } - return rWrt; } -static Writer& OutWW8_SwFmtBackground( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - - if( !rWW8Wrt.bOutPageDescs ) // WW kann keinen Hintergrund - { // in Section - const SvxBrushItem& rBack = (const SvxBrushItem&)rHt; + // WW cannot have background in a section + if ( !m_rWW8Export.bOutPageDescs ) + { WW8_SHD aSHD; - rWW8Wrt.TransBrush(rBack.GetColor(), aSHD); + m_rWW8Export.TransBrush( rBrush.GetColor(), aSHD ); // sprmPShd - if (rWW8Wrt.bWrtWW8) - rWW8Wrt.InsUInt16(0x442D); + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PShd ); else - rWW8Wrt.pO->Insert(47, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt16( aSHD.GetValue() ); + m_rWW8Export.pO->Insert(47, m_rWW8Export.pO->Count()); + m_rWW8Export.InsUInt16( aSHD.GetValue() ); - //Quite a few unknowns, some might be transparency or something - //of that nature... - if (rWW8Wrt.bWrtWW8) + // Quite a few unknowns, some might be transparency or something + // of that nature... + if ( m_rWW8Export.bWrtWW8 ) { - rWW8Wrt.InsUInt16(0xC64D); - rWW8Wrt.pO->Insert(10, rWW8Wrt.pO->Count()); - rWW8Wrt.InsUInt32(0xFF000000); - rWW8Wrt.InsUInt32(SuitableBGColor( - rBack.GetColor().GetColor())); - rWW8Wrt.InsUInt16(0x0000); + m_rWW8Export.InsUInt16( 0xC64D ); + m_rWW8Export.pO->Insert( 10, m_rWW8Export.pO->Count() ); + m_rWW8Export.InsUInt32( 0xFF000000 ); + m_rWW8Export.InsUInt32( SuitableBGColor( rBrush.GetColor().GetColor() ) ); + m_rWW8Export.InsUInt16( 0x0000 ); } } - return rWrt; } -WW8_BRC SwWW8Writer::TranslateBorderLine(const SvxBorderLine& rLine, +WW8_BRC WW8Export::TranslateBorderLine(const SvxBorderLine& rLine, USHORT nDist, bool bShadow) { // M.M. This function writes out border lines to the word format similar to @@ -4184,12 +4125,14 @@ WW8_BRC SwWW8Writer::TranslateBorderLine(const SvxBorderLine& rLine, // auch fuer die Tabellen-Umrandungen zu benutzen. // Wenn nSprmNo == 0, dann wird der Opcode nicht ausgegeben. // bShadow darf bei Tabellenzellen *nicht* gesetzt sein ! -void SwWW8Writer::Out_BorderLine(WW8Bytes& rO, const SvxBorderLine* pLine, - USHORT nDist, USHORT nOffset, bool bShadow) +void WW8Export::Out_BorderLine(WW8Bytes& rO, const SvxBorderLine* pLine, + USHORT nDist, sal_uInt16 nSprmNo, bool bShadow) { - ASSERT( (nOffset <= 3) || USHRT_MAX == nOffset || - ((0x702b - 0x6424) <= nOffset && nOffset <= (0x702e - 0x6424)), - "SprmOffset ausserhalb des Bereichs" ); + ASSERT( ( nSprmNo == 0 ) || + ( nSprmNo >= 38 && nSprmNo <= 41 ) || + ( nSprmNo >= NS_sprm::LN_PBrcTop && nSprmNo <= NS_sprm::LN_PBrcRight ) || + ( nSprmNo >= NS_sprm::LN_SBrcTop && nSprmNo <= NS_sprm::LN_SBrcRight ), + "Sprm for border out is of range" ); WW8_BRC aBrc; @@ -4198,68 +4141,70 @@ void SwWW8Writer::Out_BorderLine(WW8Bytes& rO, const SvxBorderLine* pLine, if( bWrtWW8 ) { -// WW97-SprmIds -// 0x6424, sprmPBrcTop pap.brcTop;BRC;long; !!!! -// 0x6425, sprmPBrcLeft -// 0x6426, sprmPBrcBottom -// 0x6427, sprmPBrcRight - if( USHRT_MAX != nOffset ) // mit OpCode-Ausgabe ? - SwWW8Writer::InsUInt16( rO, 0x6424 + nOffset ); + // WW97-SprmIds + if ( nSprmNo != 0 ) + SwWW8Writer::InsUInt16( rO, nSprmNo ); rO.Insert( aBrc.aBits1, 2, rO.Count() ); rO.Insert( aBrc.aBits2, 2, rO.Count() ); } else { -// WW95-SprmIds -// 38, sprmPBrcTop - pap.brcTop BRC short !!! -// 39, sprmPBrcLeft -// 40, sprmPBrcBottom -// 41, sprmPBrcRight - if( USHRT_MAX != nOffset ) // mit OpCode-Ausgabe ? - rO.Insert( (BYTE)( 38 + nOffset ), rO.Count() ); + // WW95-SprmIds + if ( nSprmNo != 0 ) + rO.Insert( (BYTE)( nSprmNo ), rO.Count() ); rO.Insert( aBrc.aBits1, 2, rO.Count() ); } } -// OutWW8_SwFmtBox1() ist fuer alle Boxen ausser in Tabellen. +// FormatBox1() ist fuer alle Boxen ausser in Tabellen. // es wird pO des WW8Writers genommen -void SwWW8Writer::Out_SwFmtBox(const SvxBoxItem& rBox, bool bShadow) +void WW8Export::Out_SwFmtBox(const SvxBoxItem& rBox, bool bShadow) { - USHORT nOffset = 0; - if( bOutPageDescs ) - { - if( !bWrtWW8 ) - return ; // WW95 kennt keine Seitenumrandung - -// WW97-SprmIds -// 0x702b, sprmSBrcTop pap.brcTop;BRC;long; !!!! -// 0x702c, sprmSBrcLeft -// 0x702d, sprmSBrcBottom -// 0x702e, sprmSBrcRight - nOffset = (0x702b - 0x6424); - } + if ( bOutPageDescs && !bWrtWW8 ) + return; // no page ouline in WW6 static const USHORT aBorders[] = { BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT }; + static const sal_uInt16 aPBrc[] = + { + NS_sprm::LN_PBrcTop, NS_sprm::LN_PBrcLeft, NS_sprm::LN_PBrcBottom, NS_sprm::LN_PBrcRight + }; + static const sal_uInt16 aSBrc[] = + { + NS_sprm::LN_SBrcTop, NS_sprm::LN_SBrcLeft, NS_sprm::LN_SBrcBottom, NS_sprm::LN_SBrcRight + }; + static const sal_uInt16 aWW6PBrc[] = + { + 38, 39, 40, 41 + }; + const USHORT* pBrd = aBorders; for( USHORT i = 0; i < 4; ++i, ++pBrd ) { const SvxBorderLine* pLn = rBox.GetLine( *pBrd ); - Out_BorderLine( *pO, pLn, rBox.GetDistance( *pBrd ), nOffset+i, - bShadow ); + + sal_uInt16 nSprmNo = 0; + if ( !bWrtWW8 ) + nSprmNo = aWW6PBrc[i]; + else if ( bOutPageDescs ) + nSprmNo = aSBrc[i]; + else + nSprmNo = aPBrc[i]; + + Out_BorderLine( *pO, pLn, rBox.GetDistance( *pBrd ), nSprmNo, bShadow ); } } -// OutWW8_SwFmtBox2() ist fuer TC-Strukturen in Tabellen. Der Sprm-Opcode +// FormatBox2() ist fuer TC-Strukturen in Tabellen. Der Sprm-Opcode // wird nicht geschrieben, da es in der TC-Structur ohne Opcode gepackt ist. // dxpSpace wird immer 0, da WW das in Tabellen so verlangt // ( Tabellenumrandungen fransen sonst aus ) // Ein WW8Bytes-Ptr wird als Ausgabe-Parameter uebergeben -void SwWW8Writer::Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem& rBox ) +void WW8Export::Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem& rBox ) { // moeglich und vielleicht besser waere 0xffff static const USHORT aBorders[] = @@ -4270,32 +4215,30 @@ void SwWW8Writer::Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem& rBox ) for( int i = 0; i < 4; ++i, ++pBrd ) { const SvxBorderLine* pLn = rBox.GetLine( *pBrd ); - Out_BorderLine(rO, pLn, 0, USHRT_MAX, false); + Out_BorderLine(rO, pLn, 0, 0, false); } } -static Writer& OutWW8_SwFmtBox( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatBox( const SvxBoxItem& rBox ) { - // Fly um Grafik-> keine Umrandung hier, da - // der GrafikHeader bereits die Umrandung hat - SwWW8Writer& rWW8Wrt = ((SwWW8Writer&)rWrt); - if( !rWW8Wrt.bOutGrf ) + // Fly um Grafik-> keine Umrandung hier, da + // der GrafikHeader bereits die Umrandung hat + if ( !m_rWW8Export.bOutGrf ) { bool bShadow = false; - const SfxPoolItem* pItem = ((SwWW8Writer&)rWrt).HasItem( RES_SHADOW ); - if( pItem ) + const SfxPoolItem* pItem = m_rWW8Export.HasItem( RES_SHADOW ); + if ( pItem ) { const SvxShadowItem* p = (const SvxShadowItem*)pItem; bShadow = ( p->GetLocation() != SVX_SHADOW_NONE ) && ( p->GetWidth() != 0 ); } - rWW8Wrt.Out_SwFmtBox( (SvxBoxItem&)rHt, bShadow ); + m_rWW8Export.Out_SwFmtBox( rBox, bShadow ); } - return rWrt; } -SwTwips SwWW8Writer::CurrentPageWidth(SwTwips &rLeft, SwTwips &rRight) const +SwTwips WW8Export::CurrentPageWidth(SwTwips &rLeft, SwTwips &rRight) const { const SwFrmFmt* pFmt = pAktPageDesc ? &pAktPageDesc->GetMaster() : &const_cast<const SwDoc *>(pDoc)->GetPageDesc(0).GetMaster(); @@ -4307,28 +4250,109 @@ SwTwips SwWW8Writer::CurrentPageWidth(SwTwips &rLeft, SwTwips &rRight) const return nPageSize; } -static Writer& OutWW8_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatColumns_Impl( USHORT nCols, const SwFmtCol & rCol, bool bEven, SwTwips nPageSize ) +{ + // CColumns + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SCcolumns ); + else + m_rWW8Export.pO->Insert( 144, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.InsUInt16( nCols - 1 ); + + // DxaColumns + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxaColumns ); + else + m_rWW8Export.pO->Insert( 145, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.InsUInt16( rCol.GetGutterWidth( true ) ); + + // LBetween + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SLBetween ); + else + m_rWW8Export.pO->Insert( 158, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.pO->Insert( COLADJ_NONE == rCol.GetLineAdj( )? 0 : 1, + m_rWW8Export.pO->Count( ) ); + + const SwColumns & rColumns = rCol.GetColumns( ); + + // FEvenlySpaced + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SFEvenlySpaced ); + else + m_rWW8Export.pO->Insert( 138, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.pO->Insert( bEven ? 1 : 0, m_rWW8Export.pO->Count( ) ); + +#if 0 + // FIXME what's the use of this code + if ( bEven ) + { + USHORT nSpace = rColumns[0]->GetRight() + rColumns[1]->GetLeft(); + for ( n = 2; n < nCols; n++ ) + { + short nDiff = nSpace - ( rColumns[n - 1]->GetRight() + + rColumns[n]->GetLeft() ); + if (nDiff > 10 || nDiff < -10) + { + // Toleranz: 10 tw + bEven = false; + break; + } + } + } +#endif + + if ( !bEven ) + { + for ( USHORT n = 0; n < nCols; ++n ) + { + //sprmSDxaColWidth + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxaColWidth ); + else + m_rWW8Export.pO->Insert( 136, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.pO->Insert( ( BYTE ) n, m_rWW8Export.pO->Count( ) ); + m_rWW8Export.InsUInt16( rCol. + CalcPrtColWidth( n, + ( USHORT ) nPageSize ) ); + + if ( n + 1 != nCols ) + { + //sprmSDxaColSpacing + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_SDxaColSpacing ); + else + m_rWW8Export.pO->Insert( 137, + m_rWW8Export.pO->Count( ) ); + m_rWW8Export.pO->Insert( ( BYTE ) n, + m_rWW8Export.pO->Count( ) ); + m_rWW8Export.InsUInt16( rColumns[n]->GetRight( ) + + rColumns[n + 1]->GetLeft( ) ); + } + } + } +} + +void AttributeOutputBase::FormatColumns( const SwFmtCol& rCol ) { - const SwFmtCol& rCol = (const SwFmtCol&)rHt; const SwColumns& rColumns = rCol.GetColumns(); - SwWW8Writer& rWW8Wrt = ((SwWW8Writer&)rWrt); USHORT nCols = rColumns.Count(); - if (1 < nCols && !rWW8Wrt.bOutFlyFrmAttrs) + if ( 1 < nCols && !GetExport( ).bOutFlyFrmAttrs ) { // dann besorge mal die Seitenbreite ohne Raender !! - const SwFrmFmt* pFmt = rWW8Wrt.pAktPageDesc ? &rWW8Wrt.pAktPageDesc->GetMaster() : &const_cast<const SwDoc *>(rWW8Wrt.pDoc)->GetPageDesc(0).GetMaster(); + const SwFrmFmt* pFmt = GetExport( ).pAktPageDesc ? &GetExport( ).pAktPageDesc->GetMaster() : &const_cast<const SwDoc *>(GetExport( ).pDoc)->GetPageDesc(0).GetMaster(); const SvxFrameDirectionItem &frameDirection = pFmt->GetFrmDir(); SwTwips nPageSize; - if (frameDirection.GetValue() == FRMDIR_VERT_TOP_RIGHT || frameDirection.GetValue() == FRMDIR_VERT_TOP_LEFT) + if ( frameDirection.GetValue() == FRMDIR_VERT_TOP_RIGHT || frameDirection.GetValue() == FRMDIR_VERT_TOP_LEFT ) { const SvxULSpaceItem &rUL = pFmt->GetULSpace(); nPageSize = pFmt->GetFrmSize().GetHeight(); nPageSize -= rUL.GetUpper() + rUL.GetLower(); const SwFmtHeader *header = dynamic_cast<const SwFmtHeader *>(pFmt->GetAttrSet().GetItem(RES_HEADER)); - if (header) + if ( header ) { const SwFrmFmt *headerFmt = header->GetHeaderFmt(); if (headerFmt) @@ -4337,10 +4361,10 @@ static Writer& OutWW8_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt ) } } const SwFmtFooter *footer = dynamic_cast<const SwFmtFooter *>(pFmt->GetAttrSet().GetItem(RES_FOOTER)); - if (footer) + if ( footer ) { const SwFrmFmt *footerFmt = footer->GetFooterFmt(); - if (footerFmt) + if ( footerFmt ) { nPageSize -= footerFmt->GetFrmSize().GetHeight(); } @@ -4353,144 +4377,70 @@ static Writer& OutWW8_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt ) nPageSize -= rLR.GetLeft() + rLR.GetRight(); } - // CColumns - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x500b ); - else - rWW8Wrt.pO->Insert( 144, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( nCols - 1 ); - - // DxaColumns - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x900c ); - else - rWW8Wrt.pO->Insert( 145, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16(rCol.GetGutterWidth(true)); - - // LBetween - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x3019 ); - else - rWW8Wrt.pO->Insert( 158, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( COLADJ_NONE == rCol.GetLineAdj() ? 0 : 1, - rWW8Wrt.pO->Count() ); - // Nachsehen, ob alle Spalten gleich sind bool bEven = true; USHORT n; USHORT nColWidth = rCol.CalcPrtColWidth( 0, (USHORT)nPageSize ); - for (n = 1; n < nCols; n++) + for ( n = 1; n < nCols; n++ ) { short nDiff = nColWidth - rCol.CalcPrtColWidth( n, (USHORT)nPageSize ); - if( nDiff > 10 || nDiff < -10 ) // Toleranz: 10 tw + if ( nDiff > 10 || nDiff < -10 ) // Toleranz: 10 tw { bEven = false; break; } } - if (bEven) - { - USHORT nSpace = rColumns[0]->GetRight() + rColumns[1]->GetLeft(); - for( n = 2; n < nCols; n++ ) - { - short nDiff = nSpace - ( rColumns[n - 1]->GetRight() - + rColumns[n]->GetLeft() ); - if (nDiff > 10 || nDiff < -10) - { - // Toleranz: 10 tw - bEven = false; - break; - } - } - } - - // FEvenlySpaced - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0x3005 ); - else - rWW8Wrt.pO->Insert( 138, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( bEven ? 1 : 0, rWW8Wrt.pO->Count() ); - - if( !bEven ) - { - for (n = 0; n < nCols; ++n) - { - //sprmSDxaColWidth - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xF203 ); - else - rWW8Wrt.pO->Insert( 136, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( (BYTE)n, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16(rCol.CalcPrtColWidth(n, (USHORT)nPageSize)); - if( n+1 != nCols ) - { - //sprmSDxaColSpacing - if( rWW8Wrt.bWrtWW8 ) - rWW8Wrt.InsUInt16( 0xF204 ); - else - rWW8Wrt.pO->Insert( 137, rWW8Wrt.pO->Count() ); - rWW8Wrt.pO->Insert( (BYTE)n, rWW8Wrt.pO->Count() ); - rWW8Wrt.InsUInt16( rColumns[ n ]->GetRight() + - rColumns[ n + 1 ]->GetLeft() ); - } - } - } + FormatColumns_Impl( nCols, rCol, bEven, nPageSize ); } - return rWrt; } -// "Absaetze zusammenhalten" -static Writer& OutWW8_SvxFmtKeep( Writer& rWrt, const SfxPoolItem& rHt ) +// "Paragraphs together" +void WW8AttributeOutput::FormatKeep( const SvxFmtKeepItem& rKeep ) { -// sprmFKeepFollow - const SvxFmtKeepItem& rAttr = (const SvxFmtKeepItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x2406 ); + // sprmFKeepFollow + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFKeepFollow ); else - rWrtWW8.pO->Insert( 8, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 8, m_rWW8Export.pO->Count() ); - rWrtWW8.pO->Insert( rAttr.GetValue() ? 1 : 0, rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.pO->Insert( rKeep.GetValue() ? 1 : 0, m_rWW8Export.pO->Count() ); } - // exclude a paragraph from Line Numbering -static Writer& OutWW8_SwFmtLineNumber( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatLineNumbering( const SwFmtLineNumber& rNumbering ) { -// sprmPFNoLineNumb - const SwFmtLineNumber& rAttr = (const SwFmtLineNumber&)rHt; - - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x240C ); + // sprmPFNoLineNumb + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFNoLineNumb ); else - rWrtWW8.pO->Insert( 14, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 14, m_rWW8Export.pO->Count() ); - rWrtWW8.pO->Insert( rAttr.IsCount() ? 0 : 1, rWrtWW8.pO->Count() ); - - return rWrt; + m_rWW8Export.pO->Insert( rNumbering.IsCount() ? 0 : 1, m_rWW8Export.pO->Count() ); } /* File PARATR.HXX */ -static Writer& OutWW8_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::ParaLineSpacing_Impl( short nSpace, short nMulti ) { -// sprmPDyaLine - const SvxLineSpacingItem& rAttr = (const SvxLineSpacingItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x6412 ); + // sprmPDyaLine + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaLine ); else - rWrtWW8.pO->Insert( 20, rWrtWW8.pO->Count() ); + m_rWW8Export.pO->Insert( 20, m_rWW8Export.pO->Count() ); + + m_rWW8Export.InsUInt16( nSpace ); + m_rWW8Export.InsUInt16( nMulti ); +} +void AttributeOutputBase::ParaLineSpacing( const SvxLineSpacingItem& rSpacing ) +{ short nSpace = 240, nMulti = 0; - switch (rAttr.GetLineSpaceRule()) + switch ( rSpacing.GetLineSpaceRule() ) { default: break; @@ -4498,68 +4448,63 @@ static Writer& OutWW8_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt ) case SVX_LINE_SPACE_FIX: case SVX_LINE_SPACE_MIN: { - switch (rAttr.GetInterLineSpaceRule()) + switch ( rSpacing.GetInterLineSpaceRule() ) { case SVX_INTER_LINE_SPACE_FIX: // unser Durchschuss { // gibt es aber nicht in WW - also wie kommt man an // die MaxLineHeight heran? - nSpace = (short)rAttr.GetInterLineSpace(); + nSpace = (short)rSpacing.GetInterLineSpace(); sal_uInt16 nScript = i18n::ScriptType::LATIN; const SwAttrSet *pSet = 0; - if (rWrtWW8.pOutFmtNode && rWrtWW8.pOutFmtNode->ISA(SwFmt)) + if ( GetExport().pOutFmtNode && GetExport().pOutFmtNode->ISA( SwFmt ) ) { - const SwFmt *pFmt = (const SwFmt*)(rWrtWW8.pOutFmtNode); + const SwFmt *pFmt = (const SwFmt*)( GetExport().pOutFmtNode ); pSet = &pFmt->GetAttrSet(); } - else if (rWrtWW8.pOutFmtNode && - rWrtWW8.pOutFmtNode->ISA(SwTxtNode)) + else if ( GetExport().pOutFmtNode && GetExport().pOutFmtNode->ISA( SwTxtNode ) ) { - const SwTxtNode* pNd = - (const SwTxtNode*)rWrtWW8.pOutFmtNode; + const SwTxtNode* pNd = (const SwTxtNode*)GetExport().pOutFmtNode; pSet = &pNd->GetSwAttrSet(); - if (pBreakIt->xBreak.is()) + if ( pBreakIt->xBreak.is() ) { nScript = pBreakIt->xBreak-> getScriptType(pNd->GetTxt(), 0); } } - ASSERT(pSet, "No attrset for lineheight :-("); - if (pSet) + ASSERT( pSet, "No attrset for lineheight :-(" ); + if ( pSet ) { - nSpace = nSpace + (short)(AttrSetToLineHeight(*rWrtWW8.pDoc, - *pSet, *Application::GetDefaultDevice(), nScript)); + nSpace = nSpace + (short)( AttrSetToLineHeight( *GetExport().pDoc, + *pSet, *Application::GetDefaultDevice(), nScript ) ); } } break; case SVX_INTER_LINE_SPACE_PROP: - nSpace = (short)(( 240L * rAttr.GetPropLineSpace() ) / 100L ); + nSpace = (short)( ( 240L * rSpacing.GetPropLineSpace() ) / 100L ); nMulti = 1; break; default: // z.B. Minimum oder FIX? - if( SVX_LINE_SPACE_FIX == rAttr.GetLineSpaceRule() ) - nSpace = -(short)rAttr.GetLineHeight(); + if ( SVX_LINE_SPACE_FIX == rSpacing.GetLineSpaceRule() ) + nSpace = -(short)rSpacing.GetLineHeight(); else - nSpace = (short)rAttr.GetLineHeight(); + nSpace = (short)rSpacing.GetLineHeight(); break; } } break; } - rWrtWW8.InsUInt16(nSpace); - rWrtWW8.InsUInt16(nMulti); - return rWrt; + ParaLineSpacing_Impl( nSpace, nMulti ); } -static Writer& OutWW8_SvxAdjust(Writer& rWrt, const SfxPoolItem& rHt) +void WW8AttributeOutput::ParaAdjust( const SvxAdjustItem& rAdjust ) { -// sprmPJc - const SvxAdjustItem& rAttr = (const SvxAdjustItem&)rHt; + // sprmPJc BYTE nAdj = 255; BYTE nAdjBiDi = 255; - switch(rAttr.GetAdjust()) + switch ( rAdjust.GetAdjust() ) { case SVX_ADJUST_LEFT: nAdj = 0; @@ -4577,101 +4522,99 @@ static Writer& OutWW8_SvxAdjust(Writer& rWrt, const SfxPoolItem& rHt) nAdj = nAdjBiDi = 1; break; default: - return rWrt; // not a supported Attribut + return; // not a supported Attribut } - if (255 != nAdj) // supported Attribut? + if ( 255 != nAdj ) // supported Attribut? { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (rWrtWW8.bWrtWW8) + if ( m_rWW8Export.bWrtWW8 ) { - rWrtWW8.InsUInt16(0x2403); - rWrtWW8.pO->Insert(nAdj, rWrtWW8.pO->Count()); + m_rWW8Export.InsUInt16( NS_sprm::LN_PJc ); + m_rWW8Export.pO->Insert( nAdj, m_rWW8Export.pO->Count() ); /* Sadly for left to right paragraphs both these values are the same, for right to left paragraphs the bidi one is the reverse of the normal one. */ - rWrtWW8.InsUInt16(0x2461); //bidi version ? - bool bBiDiSwap=false; - if (rWrtWW8.pOutFmtNode) + m_rWW8Export.InsUInt16( NS_sprm::LN_PJcExtra ); //bidi version ? + bool bBiDiSwap = false; + if ( m_rWW8Export.pOutFmtNode ) { short nDirection = FRMDIR_HORI_LEFT_TOP; - if (rWrtWW8.pOutFmtNode->ISA(SwTxtNode)) + if ( m_rWW8Export.pOutFmtNode->ISA( SwTxtNode ) ) { - SwPosition aPos(*(const SwCntntNode*)rWrtWW8.pOutFmtNode); - nDirection = rWrtWW8.pDoc->GetTextDirection(aPos); + SwPosition aPos(*(const SwCntntNode*)m_rWW8Export.pOutFmtNode); + nDirection = m_rWW8Export.pDoc->GetTextDirection(aPos); } - else if (rWrtWW8.pOutFmtNode->ISA(SwTxtFmtColl)) + else if ( m_rWW8Export.pOutFmtNode->ISA( SwTxtFmtColl ) ) { const SwTxtFmtColl* pC = - (const SwTxtFmtColl*)rWrtWW8.pOutFmtNode; + (const SwTxtFmtColl*)m_rWW8Export.pOutFmtNode; const SvxFrameDirectionItem &rItem = ItemGet<SvxFrameDirectionItem>(*pC, RES_FRAMEDIR); nDirection = rItem.GetValue(); } - if ((nDirection == FRMDIR_HORI_RIGHT_TOP) - || (nDirection == FRMDIR_ENVIRONMENT && Application::GetSettings().GetLayoutRTL())) - bBiDiSwap=true; + if ( ( nDirection == FRMDIR_HORI_RIGHT_TOP ) || + ( nDirection == FRMDIR_ENVIRONMENT && Application::GetSettings().GetLayoutRTL() ) ) + { + bBiDiSwap = true; + } } - if (bBiDiSwap) - rWrtWW8.pO->Insert(nAdjBiDi, rWrtWW8.pO->Count()); + if ( bBiDiSwap ) + m_rWW8Export.pO->Insert( nAdjBiDi, m_rWW8Export.pO->Count() ); else - rWrtWW8.pO->Insert(nAdj, rWrtWW8.pO->Count()); + m_rWW8Export.pO->Insert( nAdj, m_rWW8Export.pO->Count() ); } else { - rWrtWW8.pO->Insert(5, rWrtWW8.pO->Count()); - rWrtWW8.pO->Insert(nAdj, rWrtWW8.pO->Count()); + m_rWW8Export.pO->Insert( 5, m_rWW8Export.pO->Count() ); + m_rWW8Export.pO->Insert( nAdj, m_rWW8Export.pO->Count() ); } } - return rWrt; } -static Writer& OutWW8_SvxFrameDirection( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::FormatFrameDirection( const SvxFrameDirectionItem& rDirection ) { - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if (!rWrtWW8.bWrtWW8) //8+ only - return rWrt; + if ( !m_rWW8Export.bWrtWW8 ) //8+ only + return; - const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&)rHt; UINT16 nTextFlow=0; bool bBiDi = false; - short nDir = rItem.GetValue(); + short nDir = rDirection.GetValue(); - if (nDir == FRMDIR_ENVIRONMENT) + if ( nDir == FRMDIR_ENVIRONMENT ) { - if (rWrtWW8.bOutPageDescs) - nDir = rWrtWW8.GetCurrentPageDirection(); - else if (rWrtWW8.pOutFmtNode) + if ( m_rWW8Export.bOutPageDescs ) + nDir = m_rWW8Export.GetCurrentPageDirection(); + else if ( m_rWW8Export.pOutFmtNode ) { - if (rWrtWW8.bOutFlyFrmAttrs) //frame + if ( m_rWW8Export.bOutFlyFrmAttrs ) //frame { - nDir = rWrtWW8.TrueFrameDirection( - *(const SwFrmFmt*)rWrtWW8.pOutFmtNode); + nDir = m_rWW8Export.TrueFrameDirection( + *(const SwFrmFmt*)m_rWW8Export.pOutFmtNode ); } - else if (rWrtWW8.pOutFmtNode->ISA(SwCntntNode)) //pagagraph + else if ( m_rWW8Export.pOutFmtNode->ISA( SwCntntNode ) ) //pagagraph { const SwCntntNode* pNd = - (const SwCntntNode*)rWrtWW8.pOutFmtNode; - SwPosition aPos(*pNd); - nDir = rWrt.pDoc->GetTextDirection(aPos); + (const SwCntntNode*)m_rWW8Export.pOutFmtNode; + SwPosition aPos( *pNd ); + nDir = m_rWW8Export.pDoc->GetTextDirection( aPos ); } - else if (rWrtWW8.pOutFmtNode->ISA(SwTxtFmtColl)) + else if ( m_rWW8Export.pOutFmtNode->ISA( SwTxtFmtColl ) ) nDir = FRMDIR_HORI_LEFT_TOP; //what else can we do :-( } - if (nDir == FRMDIR_ENVIRONMENT) + if ( nDir == FRMDIR_ENVIRONMENT ) nDir = FRMDIR_HORI_LEFT_TOP; //Set something } - switch (nDir) + switch ( nDir ) { default: //Can't get an unknown type here - ASSERT(!(&rWrt), "Unknown frame direction"); + ASSERT(false, "Unknown frame direction"); case FRMDIR_HORI_LEFT_TOP: nTextFlow = 0; break; @@ -4685,49 +4628,42 @@ static Writer& OutWW8_SvxFrameDirection( Writer& rWrt, const SfxPoolItem& rHt ) break; } - if (rWrtWW8.bOutPageDescs) + if ( m_rWW8Export.bOutPageDescs ) { - rWrtWW8.InsUInt16(0x5033); - rWrtWW8.InsUInt16(nTextFlow); - rWrtWW8.InsUInt16(0x3228); - rWrtWW8.pO->Insert(bBiDi, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_STextFlow ); + m_rWW8Export.InsUInt16( nTextFlow ); + m_rWW8Export.InsUInt16( NS_sprm::LN_SFBiDi ); + m_rWW8Export.pO->Insert( bBiDi, m_rWW8Export.pO->Count() ); } - else if (!rWrtWW8.bOutFlyFrmAttrs) //paragraph/style + else if ( !m_rWW8Export.bOutFlyFrmAttrs ) //paragraph/style { - rWrtWW8.InsUInt16(0x2441); - rWrtWW8.pO->Insert(bBiDi, rWrtWW8.pO->Count() ); + m_rWW8Export.InsUInt16( NS_sprm::LN_PFBiDi ); + m_rWW8Export.pO->Insert( bBiDi, m_rWW8Export.pO->Count() ); } - return rWrt; } -// "Absaetze trennen" -static Writer& OutWW8_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt ) +// "Separate paragraphs" +void WW8AttributeOutput::ParaSplit( const SvxFmtSplitItem& rSplit ) { -// sprmPFKeep - const SvxFmtSplitItem& rAttr = (const SvxFmtSplitItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x2405 ); + // sprmPFKeep + if ( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFKeep ); else - rWrtWW8.pO->Insert( 7, rWrtWW8.pO->Count() ); - rWrtWW8.pO->Insert( rAttr.GetValue() ? 0 : 1, rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.pO->Insert( 7, m_rWW8Export.pO->Count() ); + m_rWW8Export.pO->Insert( rSplit.GetValue() ? 0 : 1, m_rWW8Export.pO->Count() ); } // Es wird nur das Item "SvxWidowItem" und nicht die Orphans uebersetzt, // da es fuer beides im WW nur ein Attribut "Absatzkontrolle" gibt und // im SW wahrscheinlich vom Anwender immer Beide oder keiner gesetzt werden. -static Writer& OutWW8_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt ) +void WW8AttributeOutput::ParaWidows( const SvxWidowsItem& rWidows ) { // sprmPFWidowControl - const SvxWidowsItem& rAttr = (const SvxWidowsItem&)rHt; - SwWW8Writer& rWrtWW8 = (SwWW8Writer&)rWrt; - if( rWrtWW8.bWrtWW8 ) - rWrtWW8.InsUInt16( 0x2431 ); + if( m_rWW8Export.bWrtWW8 ) + m_rWW8Export.InsUInt16( NS_sprm::LN_PFWidowControl ); else - rWrtWW8.pO->Insert( 51, rWrtWW8.pO->Count() ); - rWrtWW8.pO->Insert( rAttr.GetValue() ? 1 : 0, rWrtWW8.pO->Count() ); - return rWrt; + m_rWW8Export.pO->Insert( 51, m_rWW8Export.pO->Count() ); + m_rWW8Export.pO->Insert( rWidows.GetValue() ? 1 : 0, m_rWW8Export.pO->Count() ); } @@ -4744,7 +4680,7 @@ public: void Add(const SvxTabStop &rTS, long nAdjustment); void Del(const SvxTabStop &rTS, long nAdjustment); - void PutAll(SwWW8Writer& rWW8Wrt); + void PutAll(WW8Export& rWW8Wrt); }; SwWW8WrTabu::SwWW8WrTabu(sal_uInt16 nDelMax, sal_uInt16 nAddMax) @@ -4822,8 +4758,8 @@ void SwWW8WrTabu::Del(const SvxTabStop &rTS, long nAdjustment) ++nDel; } -// PutAll( SwWW8Writer& rWW8Wrt ) schreibt das Attribut nach rWrt.pO -void SwWW8WrTabu::PutAll(SwWW8Writer& rWrt) +// PutAll( WW8Export& rWW8Wrt ) schreibt das Attribut nach rWrt.pO +void SwWW8WrTabu::PutAll(WW8Export& rWrt) { if (!nAdd && !nDel) //It its a no-op return; @@ -4839,7 +4775,7 @@ void SwWW8WrTabu::PutAll(SwWW8Writer& rWrt) nSiz = 255; if (rWrt.bWrtWW8) - rWrt.InsUInt16(0xC60D); + rWrt.InsUInt16(NS_sprm::LN_PChgTabsPapx); else rWrt.pO->Insert(15, rWrt.pO->Count()); // cch eintragen @@ -4854,8 +4790,8 @@ void SwWW8WrTabu::PutAll(SwWW8Writer& rWrt) } -static void OutWW8_SwTabStopAdd(Writer& rWrt, const SvxTabStopItem& rTStops, - long nLParaMgn) +static void ParaTabStopAdd( WW8Export& rWrt, const SvxTabStopItem& rTStops, + long nLParaMgn ) { SwWW8WrTabu aTab( 0, rTStops.Count()); @@ -4866,7 +4802,7 @@ static void OutWW8_SwTabStopAdd(Writer& rWrt, const SvxTabStopItem& rTStops, if (SVX_TAB_ADJUST_DEFAULT != rTS.GetAdjustment()) aTab.Add(rTS, nLParaMgn); } - aTab.PutAll( (SwWW8Writer&)rWrt ); + aTab.PutAll( rWrt ); } bool lcl_IsEqual(long nOneLeft, const SvxTabStop &rOne, @@ -4880,8 +4816,8 @@ bool lcl_IsEqual(long nOneLeft, const SvxTabStop &rOne, ); } -static void OutWW8_SwTabStopDelAdd(Writer& rWrt, const SvxTabStopItem& rTStyle, - long nLStypeMgn, const SvxTabStopItem& rTNew, long nLParaMgn) +static void ParaTabStopDelAdd( WW8Export& rWrt, const SvxTabStopItem& rTStyle, + long nLStypeMgn, const SvxTabStopItem& rTNew, long nLParaMgn ) { SwWW8WrTabu aTab(rTStyle.Count(), rTNew.Count()); @@ -4952,54 +4888,50 @@ static void OutWW8_SwTabStopDelAdd(Writer& rWrt, const SvxTabStopItem& rTStyle, } } while( 1 ); - aTab.PutAll( (SwWW8Writer&)rWrt ); + aTab.PutAll( rWrt ); } -static Writer& OutWW8_SwTabStop(Writer& rWrt, const SfxPoolItem& rHt) +void WW8AttributeOutput::ParaTabStop( const SvxTabStopItem& rTabStops ) { - SwWW8Writer& rWW8Wrt = (SwWW8Writer&)rWrt; - const SvxTabStopItem & rTStops = (const SvxTabStopItem&)rHt; - bool bTabsRelativeToIndex = rWW8Wrt.pCurPam->GetDoc()->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT); + bool bTabsRelativeToIndex = m_rWW8Export.pCurPam->GetDoc()->get( IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT ); long nCurrentLeft = 0; - if (bTabsRelativeToIndex) + if ( bTabsRelativeToIndex ) { - const SfxPoolItem* pLR = rWW8Wrt.HasItem( RES_LR_SPACE ); + const SfxPoolItem* pLR = m_rWW8Export.HasItem( RES_LR_SPACE ); - if (pLR != NULL) + if ( pLR != NULL ) nCurrentLeft = ((const SvxLRSpaceItem*)pLR)->GetTxtLeft(); } - // --> FLR 2009-03-17 #i100264# - if (rWW8Wrt.bStyDef - && rWW8Wrt.pCurrentStyle!=NULL - && rWW8Wrt.pCurrentStyle->DerivedFrom()!=NULL) - { - SvxTabStopItem aTabs(0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP); - const SwFmt *pParentStyle=rWW8Wrt.pCurrentStyle->DerivedFrom(); - const SvxTabStopItem* pParentTabs=HasItem<SvxTabStopItem>(pParentStyle->GetAttrSet(), RES_PARATR_TABSTOP); - if (pParentTabs) + if ( m_rWW8Export.bStyDef && + m_rWW8Export.pCurrentStyle != NULL && + m_rWW8Export.pCurrentStyle->DerivedFrom() != NULL ) + { + SvxTabStopItem aTabs( 0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP ); + const SwFmt *pParentStyle = m_rWW8Export.pCurrentStyle->DerivedFrom(); + const SvxTabStopItem* pParentTabs = HasItem<SvxTabStopItem>( pParentStyle->GetAttrSet(), RES_PARATR_TABSTOP ); + if ( pParentTabs ) { - aTabs.Insert(pParentTabs); + aTabs.Insert( pParentTabs ); } - OutWW8_SwTabStopDelAdd(rWW8Wrt, aTabs, 0, rTStops, 0); - return rWrt; + ParaTabStopDelAdd( m_rWW8Export, aTabs, 0, rTabStops, 0 ); + return; } // <-- - // StyleDef -> "einfach" eintragen || keine Style-Attrs -> dito const SvxTabStopItem* pStyleTabs = 0; - if (!rWW8Wrt.bStyDef && rWW8Wrt.pStyAttr) + if ( !m_rWW8Export.bStyDef && m_rWW8Export.pStyAttr ) { pStyleTabs = - HasItem<SvxTabStopItem>(*rWW8Wrt.pStyAttr, RES_PARATR_TABSTOP); + HasItem<SvxTabStopItem>( *m_rWW8Export.pStyAttr, RES_PARATR_TABSTOP ); } - if (!pStyleTabs) - OutWW8_SwTabStopAdd(rWW8Wrt, rTStops, nCurrentLeft); + if ( !pStyleTabs ) + ParaTabStopAdd(m_rWW8Export, rTabStops, nCurrentLeft); else { long nStyleLeft = 0; @@ -5007,175 +4939,282 @@ static Writer& OutWW8_SwTabStop(Writer& rWrt, const SfxPoolItem& rHt) if (bTabsRelativeToIndex) { const SvxLRSpaceItem &rStyleLR = - ItemGet<SvxLRSpaceItem>(*rWW8Wrt.pStyAttr, RES_LR_SPACE); + ItemGet<SvxLRSpaceItem>(*m_rWW8Export.pStyAttr, RES_LR_SPACE); nStyleLeft = rStyleLR.GetTxtLeft(); } - OutWW8_SwTabStopDelAdd(rWW8Wrt, *pStyleTabs, nStyleLeft, rTStops, + ParaTabStopDelAdd(m_rWW8Export, *pStyleTabs, nStyleLeft, rTabStops, nCurrentLeft); } - return rWrt; } //----------------------------------------------------------------------- -/* - * lege hier die Tabellen fuer die WW-Funktions-Pointer auf - * die Ausgabe-Funktionen an. - * Es sind lokale Strukturen, die nur innerhalb - * bekannt sein muessen. - */ +void AttributeOutputBase::OutputItem( const SfxPoolItem& rHt ) +{ + // FIXME maybe use 'item_cast', like 'item_cast<SvxCharHiddenItem>( rHt )'? + switch ( rHt.Which() ) + { + case RES_CHRATR_CASEMAP: + CharCaseMap( static_cast< const SvxCaseMapItem& >( rHt ) ); + break; + case RES_CHRATR_COLOR: + CharColor( static_cast< const SvxColorItem& >( rHt ) ); + break; + case RES_CHRATR_CONTOUR: + CharContour( static_cast< const SvxContourItem& >( rHt ) ); + break; + case RES_CHRATR_CROSSEDOUT: + CharCrossedOut( static_cast< const SvxCrossedOutItem& >( rHt ) ); + break; + case RES_CHRATR_ESCAPEMENT: + CharEscapement( static_cast< const SvxEscapementItem& >( rHt ) ); + break; + case RES_CHRATR_FONT: + CharFont( static_cast< const SvxFontItem& >( rHt ) ); + break; + case RES_CHRATR_FONTSIZE: + CharFontSize( static_cast< const SvxFontHeightItem& >( rHt ) ); + break; + case RES_CHRATR_KERNING: + CharKerning( static_cast< const SvxKerningItem& >( rHt ) ); + break; + case RES_CHRATR_LANGUAGE: + CharLanguage( static_cast< const SvxLanguageItem& >( rHt ) ); + break; + case RES_CHRATR_POSTURE: + CharPosture( static_cast< const SvxPostureItem& >( rHt ) ); + break; + case RES_CHRATR_SHADOWED: + CharShadow( static_cast< const SvxShadowedItem& >( rHt ) ); + break; + case RES_CHRATR_UNDERLINE: + CharUnderline( static_cast< const SvxUnderlineItem& >( rHt ) ); + break; + case RES_CHRATR_WEIGHT: + CharWeight( static_cast< const SvxWeightItem& >( rHt ) ); + break; + case RES_CHRATR_AUTOKERN: + CharAutoKern( static_cast< const SvxAutoKernItem& >( rHt ) ); + break; + case RES_CHRATR_BLINK: + CharAnimatedText( static_cast< const SvxBlinkItem& >( rHt ) ); + break; + case RES_CHRATR_BACKGROUND: + CharBackground( static_cast< const SvxBrushItem& >( rHt ) ); + break; -SwAttrFnTab aWW8AttrFnTab = { -/* RES_CHRATR_CASEMAP */ OutWW8_SwCaseMap, -/* RES_CHRATR_CHARSETCOLOR */ 0, -/* RES_CHRATR_COLOR */ OutWW8_SwColor, -/* RES_CHRATR_CONTOUR */ OutWW8_SwContour, -/* RES_CHRATR_CROSSEDOUT */ OutWW8_SwCrossedOut, -/* RES_CHRATR_ESCAPEMENT */ OutWW8_SwEscapement, -/* RES_CHRATR_FONT */ OutWW8_SwFont, -/* RES_CHRATR_FONTSIZE */ OutWW8_SwSize, -/* RES_CHRATR_KERNING */ OutWW8_SwKerning, -/* RES_CHRATR_LANGUAGE */ OutWW8_SwLanguage, -/* RES_CHRATR_POSTURE */ OutWW8_SwPosture, -/* RES_CHRATR_PROPORTIONALFONTSIZE*/0, -/* RES_CHRATR_SHADOWED */ OutWW8_SwShadow, -/* RES_CHRATR_UNDERLINE */ OutWW8_SwUnderline, -/* RES_CHRATR_WEIGHT */ OutWW8_SwWeight, -/* RES_CHRATR_WORDLINEMODE */ 0, // Wird bei Underline mitbehandelt -/* RES_CHRATR_AUTOKERN */ OutWW8_SvxAutoKern, -/* RES_CHRATR_BLINK */ OutWW8_SwAnimatedText, // neu: blinkender Text -/* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen -/* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen -/* RES_CHRATR_BACKGROUND */ OutWW8_SwFmtCharBackground, -/* RES_CHRATR_CJK_FONT */ OutWW8_SwCJKFont, -/* RES_CHRATR_CJK_FONTSIZE */ OutWW8_SwSize, -/* RES_CHRATR_CJK_LANGUAGE */ OutWW8_SwLanguage, -/* RES_CHRATR_CJK_POSTURE */ OutWW8_SwPosture, -/* RES_CHRATR_CJK_WEIGHT */ OutWW8_SwWeight, -/* RES_CHRATR_CTL_FONT */ OutWW8_SwCTLFont, -/* RES_CHRATR_CTL_FONTSIZE */ OutWW8_SwSize, -/* RES_CHRATR_CTL_LANGUAGE */ OutWW8_SwLanguage, -/* RES_CHRATR_CTL_POSTURE */ OutWW8_SwBiDiPosture, -/* RES_CHRATR_CTL_WEIGHT */ OutWW8_SwBiDiWeight, -/* RES_CHRATR_WRITING_DIRECTION */ OutWW8_CharRotate, -/* RES_CHRATR_EMPHASIS_MARK*/ OutWW8_EmphasisMark, -/* RES_TXTATR_TWO_LINES */ OutWW8_SvxTwoLinesItem, -/* RES_CHRATR_DUMMY4 */ OutWW8_ScaleWidth, -/* RES_CHRATR_RELIEF*/ OutWW8_Relief, -/* RES_CHRATR_HIDDEN */ OutWW8_SvxCharHidden, -/* RES_CHRATR_OVERLINE */ 0, -/* RES_CHRATR_DUMMY1 */ 0, -/* RES_CHRATR_DUMMY2 */ 0, - -/* RES_TXTATR_DUMMY4 */ 0, -/* RES_TXTATR_INETFMT */ OutSwFmtINetFmt, -/* RES_TXTATR_REFMARK */ 0, // handled by SwAttrIter -/* RES_TXTATR_TOXMARK */ 0, // handled by SwAttrIter -/* RES_TXTATR_CHARFMT */ OutWW8_SwTxtCharFmt, -/* RES_TXTATR_DUMMY5*/ 0, -/* RES_TXTATR_CJK_RUBY */ 0, // handled by SwAttrIter -/* RES_TXTATR_UNKNOWN_CONTAINER */ 0, -/* RES_TXTATR_DUMMY6 */ 0, -/* RES_TXTATR_DUMMY7 */ 0, - -/* RES_TXTATR_FIELD */ OutWW8_SwField, -/* RES_TXTATR_FLYCNT */ OutWW8_SwFlyCntnt, -/* RES_TXTATR_FTN */ OutWW8_SwFtn, -/* RES_TXTATR_SOFTHYPH */ 0, // old attr. - coded now by character -/* RES_TXTATR_HARDBLANK */ OutWW8_SwHardBlank, -/* RES_TXTATR_DUMMY1 */ 0, // Dummy: -/* RES_TXTATR_DUMMY2 */ 0, // Dummy: - -/* RES_PARATR_LINESPACING */ OutWW8_SvxLineSpacing, -/* RES_PARATR_ADJUST */ OutWW8_SvxAdjust, -/* RES_PARATR_SPLIT */ OutWW8_SvxFmtSplit, -/* RES_PARATR_ORPHANS */ 0, // OutW4W_SwOrphans, // kann WW nicht unabhaengig von Widows -/* RES_PARATR_WIDOWS */ OutWW8_SvxWidows, -/* RES_PARATR_TABSTOP */ OutWW8_SwTabStop, -/* RES_PARATR_HYPHENZONE*/ OutWW8_SvxHyphenZone, -/* RES_PARATR_DROP */ 0, -/* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit -/* RES_PARATR_NUMRULE */ OutWW8_SwNumRuleItem, -/* RES_PARATR_SCRIPTSPACE */ OutWW8_SfxBoolItem, -/* RES_PARATR_HANGINGPUNCTUATION */ OutWW8_SfxBoolItem, -/* RES_PARATR_FORBIDDEN_RULES */ OutWW8_SfxBoolItem, -/* RES_PARATR_VERTALIGN */ OutWW8_SvxParaVertAlignItem, -/* RES_PARATR_SNAPTOGRID*/ OutWW8_SvxParaGridItem, -/* RES_PARATR_CONNECT_TO_BORDER */ 0, // new -/* RES_PARATR_OUTLINELEVEL */ 0, // new - outlinelevel - -/* RES_PARATR_LIST_ID */ 0, // new -/* RES_PARATR_LIST_LEVEL */ 0, // new -/* RES_PARATR_LIST_ISRESTART */ 0, // new -/* RES_PARATR_LIST_RESTARTVALUE */ 0, // new -/* RES_PARATR_LIST_ISCOUNTED */ 0, // new - -/* RES_FILL_ORDER */ 0, // OutW4W_SwFillOrder, -/* RES_FRM_SIZE */ OutWW8_SwFrmSize, -/* RES_PAPER_BIN */ OutWW8_SvxPaperBin, -/* RES_LR_SPACE */ OutWW8_SwFmtLRSpace, -/* RES_UL_SPACE */ OutWW8_SwFmtULSpace, -/* RES_PAGEDESC */ OutWW8_SwFmtPageDesc, -/* RES_BREAK */ OutWW8_SwFmtBreak, -/* RES_CNTNT */ 0, /* 0, // OutW4W_??? */ -/* RES_HEADER */ 0, // wird bei der PageDesc ausgabe beachtet -/* RES_FOOTER */ 0, // wird bei der PageDesc ausgabe beachtet -/* RES_PRINT */ 0, // OutW4W_SwFmtPrint, -/* RES_OPAQUE */ 0, // OutW4W_SwFmtOpaque, // kann WW nicht -/* RES_PROTECT */ 0, // OutW4W_SwFmtProtect, -/* RES_SURROUND */ OutWW8_SwFmtSurround, -/* RES_VERT_ORIENT */ OutWW8_SwFmtVertOrient, -/* RES_HORI_ORIENT */ OutWW8_SwFmtHoriOrient, -/* RES_ANCHOR */ OutWW8_SwFmtAnchor, -/* RES_BACKGROUND */ OutWW8_SwFmtBackground, -/* RES_BOX */ OutWW8_SwFmtBox, -/* RES_SHADOW */ 0, // Wird bei SwFmtBox mitbehandelt -/* RES_FRMMACRO */ 0, /* 0, // OutW4W_??? */ -/* RES_COL */ OutWW8_SwFmtCol, -/* RES_KEEP */ OutWW8_SvxFmtKeep, -/* RES_URL */ 0, // URL -/* RES_EDIT_IN_READONLY */ 0, -/* RES_LAYOUT_SPLIT */ 0, -/* RES_CHAIN */ 0, -/* RES_TEXTGRID*/ OutWW8_SwTextGrid, -/* RES_LINENUMBER */ OutWW8_SwFmtLineNumber, // Line Numbering -/* RES_FTN_AT_TXTEND*/ 0, // Dummy: -/* RES_END_AT_TXTEND*/ 0, // Dummy: -/* RES_COLUMNBALANCE*/ 0, // Dummy: -/* RES_FRAMEDIR*/ OutWW8_SvxFrameDirection, -/* RES_FRMATR_DUMMY8 */ 0, // Dummy: -/* RES_FRMATR_DUMMY9 */ 0, // Dummy: -/* RES_FOLLOW_TEXT_FLOW */ 0, -/* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0, -/* RES_FRMATR_DUMMY2 */ 0, // Dummy: -/* RES_AUTO_STYLE */ 0, // Dummy: -/* RES_FRMATR_DUMMY4 */ 0, // Dummy: -/* RES_FRMATR_DUMMY5 */ 0, // Dummy: - -/* RES_GRFATR_MIRRORGRF */ 0, // OutW4W_SwMirrorGrf, -/* RES_GRFATR_CROPGRF */ 0, // OutW4W_SwCropGrf -/* RES_GRFATR_ROTATION */ 0, -/* RES_GRFATR_LUMINANCE */ 0, -/* RES_GRFATR_CONTRAST */ 0, -/* RES_GRFATR_CHANNELR */ 0, -/* RES_GRFATR_CHANNELG */ 0, -/* RES_GRFATR_CHANNELB */ 0, -/* RES_GRFATR_GAMMA */ 0, -/* RES_GRFATR_INVERT */ 0, -/* RES_GRFATR_TRANSPARENCY */ 0, -/* RES_GRFATR_DRWAMODE */ 0, -/* RES_GRFATR_DUMMY1 */ 0, -/* RES_GRFATR_DUMMY2 */ 0, -/* RES_GRFATR_DUMMY3 */ 0, -/* RES_GRFATR_DUMMY4 */ 0, -/* RES_GRFATR_DUMMY5 */ 0, - -/* RES_BOXATR_FORMAT */ 0, -/* RES_BOXATR_FORMULA */ 0, -/* RES_BOXATR_VALUE */ 0, - -/* RES_UNKNOWNATR_CONTAINER */ 0 -}; + case RES_CHRATR_CJK_FONT: + CharFontCJK( static_cast< const SvxFontItem& >( rHt ) ); + break; + case RES_CHRATR_CJK_FONTSIZE: + CharFontSizeCJK( static_cast< const SvxFontHeightItem& >( rHt ) ); + break; + case RES_CHRATR_CJK_LANGUAGE: + CharLanguageCJK( static_cast< const SvxLanguageItem& >( rHt ) ); + break; + case RES_CHRATR_CJK_POSTURE: + CharPostureCJK( static_cast< const SvxPostureItem& >( rHt ) ); + break; + case RES_CHRATR_CJK_WEIGHT: + CharWeightCJK( static_cast< const SvxWeightItem& >( rHt ) ); + break; + + case RES_CHRATR_CTL_FONT: + CharFontCTL( static_cast< const SvxFontItem& >( rHt ) ); + break; + case RES_CHRATR_CTL_FONTSIZE: + CharFontSizeCTL( static_cast< const SvxFontHeightItem& >( rHt ) ); + break; + case RES_CHRATR_CTL_LANGUAGE: + CharLanguageCTL( static_cast< const SvxLanguageItem& >( rHt ) ); + break; + case RES_CHRATR_CTL_POSTURE: + CharPostureCTL( static_cast< const SvxPostureItem& >( rHt ) ); + break; + case RES_CHRATR_CTL_WEIGHT: + CharWeightCTL( static_cast< const SvxWeightItem& >( rHt ) ); + break; + + case RES_CHRATR_ROTATE: + CharRotate( static_cast< const SvxCharRotateItem& >( rHt ) ); + break; + case RES_CHRATR_EMPHASIS_MARK: + CharEmphasisMark( static_cast< const SvxEmphasisMarkItem& >( rHt ) ); + break; + case RES_CHRATR_TWO_LINES: + CharTwoLines( static_cast< const SvxTwoLinesItem& >( rHt ) ); + break; + case RES_CHRATR_SCALEW: + CharScaleWidth( static_cast< const SvxCharScaleWidthItem& >( rHt ) ); + break; + case RES_CHRATR_RELIEF: + CharRelief( static_cast< const SvxCharReliefItem& >( rHt ) ); + break; + case RES_CHRATR_HIDDEN: + CharHidden( static_cast< const SvxCharHiddenItem& >( rHt ) ); + break; + + case RES_TXTATR_INETFMT: + TextINetFormat( static_cast< const SwFmtINetFmt& >( rHt ) ); + break; + case RES_TXTATR_CHARFMT: + TextCharFormat( static_cast< const SwFmtCharFmt& >( rHt ) ); + break; + case RES_TXTATR_FIELD: + TextField( static_cast< const SwFmtFld& >( rHt ) ); + break; + case RES_TXTATR_FLYCNT: + TextFlyContent( static_cast< const SwFmtFlyCnt& >( rHt ) ); + break; + case RES_TXTATR_FTN: + TextFootnote( static_cast< const SwFmtFtn& >( rHt ) ); + break; + case RES_TXTATR_HARDBLANK: + TextHardBlank( static_cast< const SwFmtHardBlank& >( rHt ) ); + break; + + case RES_PARATR_LINESPACING: + ParaLineSpacing( static_cast< const SvxLineSpacingItem& >( rHt ) ); + break; + case RES_PARATR_ADJUST: + ParaAdjust( static_cast< const SvxAdjustItem& >( rHt ) ); + break; + case RES_PARATR_SPLIT: + ParaSplit( static_cast< const SvxFmtSplitItem& >( rHt ) ); + break; + case RES_PARATR_WIDOWS: + ParaWidows( static_cast< const SvxWidowsItem& >( rHt ) ); + break; + case RES_PARATR_TABSTOP: + ParaTabStop( static_cast< const SvxTabStopItem& >( rHt ) ); + break; + case RES_PARATR_HYPHENZONE: + ParaHyphenZone( static_cast< const SvxHyphenZoneItem& >( rHt ) ); + break; + case RES_PARATR_NUMRULE: + ParaNumRule( static_cast< const SwNumRuleItem& >( rHt ) ); + break; + case RES_PARATR_SCRIPTSPACE: + ParaScriptSpace( static_cast< const SfxBoolItem& >( rHt ) ); + break; + case RES_PARATR_HANGINGPUNCTUATION: + ParaHangingPunctuation( static_cast< const SfxBoolItem& >( rHt ) ); + break; + case RES_PARATR_FORBIDDEN_RULES: + ParaForbiddenRules( static_cast< const SfxBoolItem& >( rHt ) ); + break; + case RES_PARATR_VERTALIGN: + ParaVerticalAlign( static_cast< const SvxParaVertAlignItem& >( rHt ) ); + break; + case RES_PARATR_SNAPTOGRID: + ParaSnapToGrid( static_cast< const SvxParaGridItem& >( rHt ) ); + break; + + case RES_FRM_SIZE: + FormatFrameSize( static_cast< const SwFmtFrmSize& >( rHt ) ); + break; + case RES_PAPER_BIN: + FormatPaperBin( static_cast< const SvxPaperBinItem& >( rHt ) ); + break; + case RES_LR_SPACE: + FormatLRSpace( static_cast< const SvxLRSpaceItem& >( rHt ) ); + break; + case RES_UL_SPACE: + FormatULSpace( static_cast< const SvxULSpaceItem& >( rHt ) ); + break; + case RES_PAGEDESC: + FormatPageDescription( static_cast< const SwFmtPageDesc& >( rHt ) ); + break; + case RES_BREAK: + FormatBreak( static_cast< const SvxFmtBreakItem& >( rHt ) ); + break; + case RES_SURROUND: + FormatSurround( static_cast< const SwFmtSurround& >( rHt ) ); + break; + case RES_VERT_ORIENT: + FormatVertOrientation( static_cast< const SwFmtVertOrient& >( rHt ) ); + break; + case RES_HORI_ORIENT: + FormatHorizOrientation( static_cast< const SwFmtHoriOrient& >( rHt ) ); + break; + case RES_ANCHOR: + FormatAnchor( static_cast< const SwFmtAnchor& >( rHt ) ); + break; + case RES_BACKGROUND: + FormatBackground( static_cast< const SvxBrushItem& >( rHt ) ); + break; + case RES_BOX: + FormatBox( static_cast< const SvxBoxItem& >( rHt ) ); + break; + case RES_COL: + FormatColumns( static_cast< const SwFmtCol& >( rHt ) ); + break; + case RES_KEEP: + FormatKeep( static_cast< const SvxFmtKeepItem& >( rHt ) ); + break; + case RES_TEXTGRID: + FormatTextGrid( static_cast< const SwTextGridItem& >( rHt ) ); + break; + case RES_LINENUMBER: + FormatLineNumbering( static_cast< const SwFmtLineNumber& >( rHt ) ); + break; + case RES_FRAMEDIR: + FormatFrameDirection( static_cast< const SvxFrameDirectionItem& >( rHt ) ); + break; + + default: +#if OSL_DEBUG_LEVEL > 0 + fprintf( stderr, "Unhandled SfxPoolItem with id %d.\n", rHt.Which() ); +#endif + break; + } +} + +void AttributeOutputBase::OutputStyleItemSet( const SfxItemSet& rSet, BOOL bDeep, BOOL bTestForDefault ) +{ + // based on OutputItemSet() from wrt_fn.cxx + + const SfxItemPool& rPool = *rSet.GetPool(); + const SfxItemSet* pSet = &rSet; + if ( !pSet->Count() ) + { + if ( !bDeep ) + return; + + while ( 0 != ( pSet = pSet->GetParent() ) && !pSet->Count() ) + ; + + if ( !pSet ) + return; + } + + const SfxPoolItem* pItem; + if ( !bDeep || !pSet->GetParent() ) + { + ASSERT( rSet.Count(), "Wurde doch schon behandelt oder?" ); + SfxItemIter aIter( *pSet ); + pItem = aIter.GetCurItem(); + do { + OutputItem( *pItem ); + } while ( !aIter.IsAtEnd() && 0 != ( pItem = aIter.NextItem() ) ); + } + else + { + SfxWhichIter aIter( *pSet ); + USHORT nWhich = aIter.FirstWhich(); + while ( nWhich ) + { + if ( SFX_ITEM_SET == pSet->GetItemState( nWhich, bDeep, &pItem ) && + ( !bTestForDefault || + *pItem != rPool.GetDefaultItem( nWhich ) || + ( pSet->GetParent() && *pItem != pSet->GetParent()->Get( nWhich ) ) ) ) + { + OutputItem( *pItem ); + } + nWhich = aIter.NextWhich(); + } + } +} /* vi:set tabstop=4 shiftwidth=4 expandtab: */ |