diff options
author | Miklos Vajna <vmiklos@frugalware.org> | 2010-10-07 16:20:33 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@frugalware.org> | 2010-10-07 16:20:33 +0200 |
commit | e97514b695d875e83c9bde9a6261c772435b4f17 (patch) | |
tree | 6e520bcb1f09b893a96fcafe4c6e96bd28b50ad8 /sw | |
parent | 4412f714269737cbcad4f0733c45dcb07d6d51c0 (diff) |
Remove one more file from the old RTF export code which was still there
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/rtf/rtfatr.cxx | 4375 |
1 files changed, 0 insertions, 4375 deletions
diff --git a/sw/source/filter/rtf/rtfatr.cxx b/sw/source/filter/rtf/rtfatr.cxx deleted file mode 100644 index 9a1b09734568..000000000000 --- a/sw/source/filter/rtf/rtfatr.cxx +++ /dev/null @@ -1,4375 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sw.hxx" -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ - -/* - * Dieses File enthaelt alle Ausgabe-Funktionen des RTF-Writers; - * fuer alle Nodes, Attribute, Formate und Chars. - */ -#include <hintids.hxx> - -#include <com/sun/star/i18n/ScriptType.hdl> -#include <vcl/cvtgrf.hxx> -#include <svl/urihelper.hxx> -#include <svl/stritem.hxx> -#include <svtools/rtfkeywd.hxx> -#include <svl/whiter.hxx> -#include <svtools/rtfout.hxx> -#include <svl/itemiter.hxx> -#include <editeng/fontitem.hxx> -#include <editeng/hyznitem.hxx> -#include <editeng/tstpitem.hxx> -#include <editeng/lspcitem.hxx> -#include <editeng/langitem.hxx> -#include <editeng/keepitem.hxx> -#include <editeng/udlnitem.hxx> -#include <editeng/shaditem.hxx> -#include <editeng/cmapitem.hxx> -#include <editeng/brshitem.hxx> -#include <editeng/protitem.hxx> -#include <editeng/opaqitem.hxx> -#include <editeng/ulspitem.hxx> -#include <editeng/prntitem.hxx> -#include <editeng/colritem.hxx> -#include <editeng/escpitem.hxx> -#include <editeng/fhgtitem.hxx> -#include <editeng/spltitem.hxx> -#include <editeng/adjitem.hxx> -#include <editeng/lrspitem.hxx> -#include <editeng/boxitem.hxx> -#include <editeng/crsditem.hxx> -#include <editeng/cntritem.hxx> -#include <editeng/postitem.hxx> -#include <editeng/shdditem.hxx> -#include <editeng/wghtitem.hxx> -#include <editeng/wrlmitem.hxx> -#include <editeng/emphitem.hxx> -#include <editeng/twolinesitem.hxx> -#include <editeng/charscaleitem.hxx> -#include <editeng/charrotateitem.hxx> -#include <editeng/charreliefitem.hxx> -#include <svx/xoutbmp.hxx> -#include <editeng/paravertalignitem.hxx> -#include <editeng/hngpnctitem.hxx> -#include <editeng/scriptspaceitem.hxx> -#include <editeng/forbiddenruleitem.hxx> -#include <editeng/frmdiritem.hxx> -#include <editeng/charhiddenitem.hxx> -#include <unotools/charclass.hxx> -#include <reffld.hxx> -#include <frmatr.hxx> -#include <charatr.hxx> -#include <fmtfsize.hxx> -#include <fmtpdsc.hxx> -#include <fmtfld.hxx> -#include <fmtflcnt.hxx> -#include <fmtftn.hxx> -#include <fchrfmt.hxx> -#include <fmtautofmt.hxx> -#include <fmtcntnt.hxx> -#include <fmthdft.hxx> -#include <fmtclds.hxx> -#include <txtftn.hxx> -#include <fmtsrnd.hxx> -#include <fmtanchr.hxx> -#include <charfmt.hxx> -#include <fmtinfmt.hxx> -#include <txtinet.hxx> -#include <doc.hxx> -#include <docary.hxx> -#include <ndtxt.hxx> -#include <pam.hxx> -#include <paratr.hxx> -#include <fldbas.hxx> // fuer SwField ... -#include <wrtrtf.hxx> -#include <rtf.hxx> // fuer SwPictureType -#include <ndgrf.hxx> -#include <grfatr.hxx> -#include <docufld.hxx> -#include <flddat.hxx> -#include <pagedesc.hxx> // fuer SwPageDesc ... -#include <swtable.hxx> // fuer SwPageDesc ... -#include <docsh.hxx> -#include <swrect.hxx> -#include <section.hxx> -#include <wrtswtbl.hxx> -#include <htmltbl.hxx> -#include <fmtclbl.hxx> -#include <breakit.hxx> -#include <fmtruby.hxx> -#include <txtatr.hxx> -#include <fltini.hxx> -#include <fmtrowsplt.hxx> - -/* - * um nicht immer wieder nach einem Update festzustellen, das irgendwelche - * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle - * definiert und mit der akt. verglichen. Bei unterschieden wird der - * Compiler schon meckern. - * - * diese Section und die dazugeherigen Tabellen muessen in folgenden Files - * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx - */ -#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC) && !defined(__MINGW32__) && !defined(OS2) - -#define ATTRFNTAB_SIZE 130 -#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN -#error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ?? -#endif - -#ifdef FORMAT_TABELLE -// da sie nicht benutzt wird! -#define FORMATTAB_SIZE 7 -#if FORMATTAB_SIZE != RES_FMT_END - RES_FMT_BEGIN -#error Format-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ?? -#endif -#endif - -#define NODETAB_SIZE 3 -#if NODETAB_SIZE != RES_NODE_END - RES_NODE_BEGIN -#error Node-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ?? -#endif - -#endif - -#ifdef WNT -// ueber xoutbmp.hxx wird das winuser.h angezogen. Dort gibt es ein -// define GetProp das mit unserem SvxEscapement kollidiert! -#undef GetProp -#endif - - -using namespace com::sun::star; - -//----------------------------------------------------------------------- - -static Writer& OutRTF_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt ); - -//----------------------------------------------------------------------- - -SvStream& OutComment( Writer& rWrt, const sal_Char* pStr ) -{ - return (rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE << pStr); -} - -SvStream& OutComment( Writer& rWrt, const char* pStr, BOOL bSetFlag ) -{ - // setze Flag, damit bei der Ausgabe von Attributen zu erkennen, - // ob ueberhaupt etwas ausgegeben wurde. - ((SwRTFWriter&)rWrt).bOutFmtAttr = bSetFlag; - return (rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE << pStr); -} - -Writer& OutRTF_AsByteString( Writer& rWrt, const String& rStr, rtl_TextEncoding eEncoding) -{ - ByteString sOutStr( rStr, eEncoding ); - rWrt.Strm() << sOutStr.GetBuffer(); - return rWrt; -} - -void OutRTF_SfxItemSet( SwRTFWriter& rWrt, const SfxItemSet& rSet, - BOOL bDeep ) -{ - bool bFrameDirOut=false; - bool bAdjustOut=false; - // erst die eigenen Attribute ausgeben - SvPtrarr aAsian( 0, 5 ), aCmplx( 0, 5 ), aLatin( 0, 5 ); - - const SfxItemPool& rPool = *rSet.GetPool(); - SfxWhichIter aIter( rSet ); - const SfxPoolItem* pItem; - FnAttrOut pOut; - USHORT nWhich = aIter.FirstWhich(); - while( nWhich ) - { - if( SFX_ITEM_SET == rSet.GetItemState( nWhich, bDeep, &pItem )) - { - pOut = aRTFAttrFnTab[ nWhich - RES_CHRATR_BEGIN]; - if( pOut && - ( *pItem != rPool.GetDefaultItem( nWhich ) - || ( rSet.GetParent() && - *pItem != rSet.GetParent()->Get( nWhich ) ) - || ( rWrt.GetAttrSet() && - *pItem != rWrt.GetAttrSet()->Get( nWhich ) ) - ) ) - ; - else - pOut = 0; - } - else if( !bDeep ) - pOut = 0; - else if( 0 != ( pItem = rPool.GetPoolDefaultItem( nWhich )) ) - pOut = aRTFAttrFnTab[ nWhich - RES_CHRATR_BEGIN]; - else - pOut = 0; - - if (!pOut && bDeep) - { - switch( nWhich ) - { - case RES_CHRATR_FONTSIZE: - case RES_CHRATR_CJK_FONTSIZE: - case RES_CHRATR_CTL_FONTSIZE: - case RES_CHRATR_LANGUAGE: - case RES_CHRATR_CJK_LANGUAGE: - case RES_CHRATR_CTL_LANGUAGE: - pItem = &rPool.GetDefaultItem( nWhich ); - pOut = aRTFAttrFnTab[ nWhich - RES_CHRATR_BEGIN]; - break; - default: - break; - } - } - - if( pOut ) - { - void* pVoidItem = (void*)pItem; - switch( nWhich ) - { - case RES_CHRATR_FONT: - case RES_CHRATR_FONTSIZE: - case RES_CHRATR_LANGUAGE: - case RES_CHRATR_POSTURE: - case RES_CHRATR_WEIGHT: - aLatin.Insert( pVoidItem, aLatin.Count() ); - pOut = 0; - break; - - case RES_CHRATR_CJK_FONT: - case RES_CHRATR_CJK_FONTSIZE: - case RES_CHRATR_CJK_LANGUAGE: - case RES_CHRATR_CJK_POSTURE: - case RES_CHRATR_CJK_WEIGHT: - aAsian.Insert( pVoidItem, aAsian.Count() ); - pOut = 0; - break; - - case RES_CHRATR_CTL_FONT: - case RES_CHRATR_CTL_FONTSIZE: - case RES_CHRATR_CTL_LANGUAGE: - case RES_CHRATR_CTL_POSTURE: - case RES_CHRATR_CTL_WEIGHT: - aCmplx.Insert( pVoidItem, aCmplx.Count() ); - pOut = 0; - break; - - case RES_FRAMEDIR: - bFrameDirOut=true; - break; - case RES_PARATR_ADJUST: - bAdjustOut=true; - break; - } - } - - if (pOut) - (*pOut)( rWrt, *pItem ); - nWhich = aIter.NextWhich(); - } - - //If rtlpar set and no following alignment. And alignment is not rtl then - //output alignment - if (bFrameDirOut && !bAdjustOut && !rWrt.pFlyFmt && !rWrt.bOutPageDesc) - { - pOut = aRTFAttrFnTab[ static_cast< USHORT >(RES_PARATR_ADJUST) - RES_CHRATR_BEGIN]; - if (pOut) - (*pOut)(rWrt, rSet.Get(RES_PARATR_ADJUST)); - } - if (rWrt.pFlyFmt && !rWrt.bOutPageDesc && !bFrameDirOut) - { - pOut = aRTFAttrFnTab[ static_cast< USHORT >(RES_FRAMEDIR) - RES_CHRATR_BEGIN]; - if (pOut) - (*pOut)(rWrt, rSet.Get(RES_FRAMEDIR)); - } - - if (aAsian.Count() || aCmplx.Count() || aLatin.Count()) - { - SvPtrarr* aArr[4]; - switch (rWrt.GetCurrScriptType()) - { - case i18n::ScriptType::LATIN: - aArr[ 0 ] = &aCmplx; - aArr[ 1 ] = &aAsian; - aArr[ 2 ] = &aLatin; - aArr[ 3 ] = &aLatin; - break; - - case i18n::ScriptType::ASIAN: - aArr[ 0 ] = &aCmplx; - aArr[ 1 ] = &aLatin; - aArr[ 2 ] = &aLatin; - aArr[ 3 ] = &aAsian; - break; - - case i18n::ScriptType::COMPLEX: - aArr[ 0 ] = &aLatin; - aArr[ 1 ] = &aLatin; - aArr[ 2 ] = &aAsian; - aArr[ 3 ] = &aCmplx; - break; - - default: - return ; - } - - //The final entry is the one that is actually in use - //so it uses e.g. \b \i \fs, the others are not in - //use and so are "associated". Both asian and western - //are ltr runs, with asian being the dbch varient - //and western being the loch/hich varient - bool bOutLTOR = true; - bool bLowLTOR = false; - for( int nArrCnt = 0; nArrCnt < 4; ++nArrCnt ) - { - SvPtrarr* pCurArr = aArr[ nArrCnt ]; - if (pCurArr->Count()) - { - bool bInUse = (aArr[nArrCnt] == aArr[3]); - rWrt.SetAssociatedFlag(!bInUse); - if (pCurArr == &aLatin) - { - if (bOutLTOR) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LTRCH; - bOutLTOR = false; - } - - if (bLowLTOR) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LOCH; - else - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_HICH; - bLowLTOR = true; - } - } - else if( pCurArr == &aAsian ) - { - if( bOutLTOR ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LTRCH; - bOutLTOR = false; - } - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_DBCH; - } - else - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_RTLCH; - - for (USHORT n = 0; n < pCurArr->Count(); ++n) - { - pItem = (const SfxPoolItem*)(*pCurArr)[ n ]; - pOut = aRTFAttrFnTab[ pItem->Which() - RES_CHRATR_BEGIN]; - (*pOut)( rWrt, *pItem ); - } - } - } - } -} - -// fuer die Formate muesste eine einzige Ausgabe-Funktion genuegen ! -/* - * Formate wie folgt ausgeben: - * - gebe alle Attribute vom Format aus - */ - -bool SwFmtToSet(SwRTFWriter& rWrt, const SwFmt& rFmt, SfxItemSet &rSet) -{ - bool bOutItemSet = true; - rSet.SetParent(rFmt.GetAttrSet().GetParent()); - - switch( rFmt.Which() ) - { - case RES_CONDTXTFMTCOLL: - case RES_TXTFMTCOLL: - { - USHORT nId = rWrt.GetId( (const SwTxtFmtColl&)rFmt ); - if (0 == nId ) - return false; // Default-TextStyle nicht ausgeben !! - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_S; - rWrt.OutULong( nId ); - rWrt.bOutFmtAttr = TRUE; -// BYTE nLvl = ((const SwTxtFmtColl&)rFmt).GetOutlineLevel(); //#outline level,zhaojianwei -// if( MAXLEVEL > nLvl ) -// { - if(((const SwTxtFmtColl&)rFmt).IsAssignedToListLevelOfOutlineStyle()) - { - int nLvl = ((const SwTxtFmtColl&)rFmt).GetAssignedOutlineStyleLevel(); //<-end,zhaojianwei - USHORT nNumId = rWrt.GetNumRuleId( - *rWrt.pDoc->GetOutlineNumRule() ); - if( USHRT_MAX != nNumId ) - { - BYTE nWWLvl = 8 >= nLvl ? static_cast<BYTE>(nLvl) : 8; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LS; - rWrt.OutULong( nNumId ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ILVL; rWrt.OutULong( nWWLvl ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_OUTLINELEVEL; rWrt.OutULong( nWWLvl ); - if( nWWLvl != nLvl ) // RTF-kennt nur 9 Ebenen - { - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_SOUTLVL ); - rWrt.OutULong( nLvl ) << '}'; - } - } - - const SwNumFmt* pNFmt = &rWrt.pDoc->GetOutlineNumRule()->Get( static_cast<USHORT>(nLvl) ); - if( pNFmt->GetIndentAt() ) - { - SfxItemSet aSet( *rFmt.GetAttrSet().GetPool(), - rFmt.GetAttrSet().GetRanges() ); - aSet.SetParent( &rFmt.GetAttrSet() ); - SvxLRSpaceItem aLR( (SvxLRSpaceItem&)aSet.Get( RES_LR_SPACE ) ); - - aLR.SetTxtLeft( aLR.GetTxtLeft() + pNFmt->GetIndentAt() ); - aLR.SetTxtFirstLineOfst( pNFmt->GetFirstLineIndent() ); - - aSet.Put(aLR); - rSet.Put(aSet); - bOutItemSet = false; - } - } - } - break; - case RES_CHRFMT: - { - USHORT nId = rWrt.GetId( (const SwCharFmt&)rFmt ); - if (0 == nId) - return false; // Default-CharStyle nicht ausgeben !! - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_IGNORE << OOO_STRING_SVTOOLS_RTF_CS; - rWrt.OutULong( nId ); - rWrt.bOutFmtAttr = TRUE; - } - break; - -// case RES_GRFFMTCOLL: -// ????? - } - - if (bOutItemSet) - rSet.Put(rFmt.GetAttrSet()); - - return true; -} - -Writer& OutRTF_SwFmt(Writer& rWrt, const SwFmt& rFmt) -{ - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - - SfxItemSet aSet(*rFmt.GetAttrSet().GetPool(), - rFmt.GetAttrSet().GetRanges() ); - if (SwFmtToSet(rRTFWrt, rFmt, aSet)) - OutRTF_SfxItemSet(rRTFWrt, aSet, TRUE); - - return rWrt; -} - -void OutRTF_SwFlyFrmFmt( SwRTFWriter& rRTFWrt ) -{ - // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann - // muessen noch die Attribute dafuer ausgegeben werden. - ASSERT( rRTFWrt.pFlyFmt, "wo ist das Fly-Format?" ); - - if( rRTFWrt.bOutFmtAttr ) - { - rRTFWrt.Strm() << ' '; - rRTFWrt.bOutFmtAttr = false; - } - // gebe erstmal alle RTF-Spezifischen Attribute aus - rRTFWrt.bRTFFlySyntax = TRUE; - OutRTF_SwFmt( rRTFWrt, *rRTFWrt.pFlyFmt ); - - // dann gebe alle eigenen Attribute aus - { - // dazu erzeuge einen temp strstream, um festzustellen ob es - // ueberhaupt eigene Attribute gibt ! - SvMemoryStream aTmpStrm; - SvStream* pSaveStrm = &rRTFWrt.Strm(); - rRTFWrt.SetStream( &aTmpStrm ); - - rRTFWrt.bRTFFlySyntax = false; - OutRTF_SwFmt( rRTFWrt, *rRTFWrt.pFlyFmt ); - - rRTFWrt.SetStream( pSaveStrm ); // Stream-Pointer wieder zurueck - - if ( aTmpStrm.GetEndOfData() ) // gibt es SWG spezifische Attribute? - { - aTmpStrm.Seek( 0L ); - rRTFWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE << aTmpStrm << '}'; - } - } -// rRTFWrt.pFlyFmt = 0; // wieder zuruecksetzen !! -} - -/* Ausgabe der Nodes */ - -/* - * Ausgabe der Texte-Attribute: - * Die Text-Attribute sind in einem VarArray nach ihren Start-Positionen - * sortiert. Fuer den RTF-Writer ist aber auch das Ende von Bedeutung. - * Darum die Idee, sobald im SwpHints-Array ein Attribut mit der Start- - * Position gefunden wurde, in einem Sortierten-Array die Endposition - * zu speichern. Sobald der Writer die Position erreicht hat, wird die - * schliessende Klammer ausgegeben und die Position aus dem Sort.Array - * geloescht. - * 15.3.93: Es reicht leider nicht aus nur Start und End zuspeichern, denn - * im SwpHints Array stehen sie nicht nach Ende sortiert, so dass - * Attribute die falsche schliessende Klammer bekommen. (z.B - * Bold von 0..3, dann folgt Underline von 0..4. Dann bekommt Underline - * die schliessende Klammer von Bold !!) - * Also muessen erst alle Attribute einer Position gesammelt, nach - * Ende sortiert und dann erst ausgegeben werden. - */ - -SV_DECL_PTRARR( SfxPoolItems, SfxPoolItem*, 4, 4 ) -class RTFEndPosLst; - -class SttEndPos -{ - // falls mehrere Attribute den gleichen Bereich umspannen, sammeln - SfxPoolItems aArr; - xub_StrLen nStart, nEnd; - - SttEndPos( const SttEndPos & rSEPos ); - -public: - SttEndPos( const SfxPoolItem& rAttr, xub_StrLen nStt, xub_StrLen nEnd ); - ~SttEndPos(); - - xub_StrLen GetStart() const { return nStart; } - xub_StrLen GetEnd() const { return nEnd; } - - const SfxPoolItems& GetAttrs() const { return aArr; } - void AddAttr( const SfxPoolItem& rAttr ); - BOOL HasScriptChange() const; -}; - - -SV_DECL_PTRARR_DEL( _EndPosLst, SttEndPos*, 5, 5 ) -SV_IMPL_PTRARR( _EndPosLst, SttEndPos* ) - -class RTFEndPosLst : private _EndPosLst -{ - const SwTxtNode& rNode; - SwRTFWriter& rWrt; - RTFEndPosLst* pOldPosLst; - xub_StrLen nCurPos; - USHORT nCurScript; - -public: - using _EndPosLst::Count; - using _EndPosLst::operator[]; - using _EndPosLst::DeleteAndDestroy; - - RTFEndPosLst( SwRTFWriter& rWrt, const SwTxtNode& rNd, xub_StrLen nStart ); - ~RTFEndPosLst(); - - USHORT GetCurScript() const { return nCurScript; } - BOOL MatchScriptToId( USHORT nId ) const; - int Insert( const SfxPoolItem& rAttr, xub_StrLen nStt, xub_StrLen nEnd ); - - void OutAttrs( xub_StrLen nStrPos ); - void EndAttrs( xub_StrLen nStrPos ); - void OutScriptChange( xub_StrLen nStrPos ); - - const SfxPoolItem* HasItem( USHORT nWhich ) const; - const SfxPoolItem& GetItem( USHORT nWhich ) const; - void OutFontAttrs(const SfxPoolItem &rItem); - void OutFontAttrs(USHORT nScript, bool bRTL); - - SfxItemPool& GetPool() {return *rNode.GetSwAttrSet().GetPool(); } -}; - - -SttEndPos::SttEndPos( const SfxPoolItem& rAttr, - xub_StrLen nStt, xub_StrLen nEd ) - : nStart( nStt ), nEnd( nEd ) -{ - AddAttr( rAttr ); -} - -SttEndPos::~SttEndPos() -{ - for( USHORT n = 0, nCount = aArr.Count(); n < nCount; ++n ) - if( RES_FLTRATTR_BEGIN <= aArr[ n ]->Which() ) - delete aArr[ n ]; -} - -BOOL SttEndPos::HasScriptChange() const -{ - for( USHORT n = 0, nCount = aArr.Count(); n < nCount; ++n ) - if( RES_FLTR_SCRIPTTYPE == aArr[ n ]->Which() ) - return TRUE; - return FALSE; -} - -void SttEndPos::AddAttr( const SfxPoolItem& rAttr ) -{ - const SfxPoolItem* pI = &rAttr; - aArr.Insert(pI, aArr.Count()); -} - -RTFEndPosLst::RTFEndPosLst(SwRTFWriter& rWriter, const SwTxtNode& rNd, - xub_StrLen nStart) - : rNode(rNd), rWrt(rWriter), nCurPos(STRING_NOTFOUND) -{ - pOldPosLst = rWrt.pCurEndPosLst; - rWrt.pCurEndPosLst = this; - - using namespace sw::util; - CharRuns aCharRuns(GetPseudoCharRuns(rNd, nStart)); - cCharRunIter aEnd = aCharRuns.end(); - xub_StrLen nSttPos = nStart; - for (cCharRunIter aI = aCharRuns.begin(); aI != aEnd; ++aI) - { - if (nSttPos != aI->mnEndPos) - { - SfxPoolItem* pChg = new SfxUInt32Item(RES_FLTR_SCRIPTTYPE, - (sal_uInt32(aI->mnScript) << 16) | static_cast<sal_uInt32>(aI->mbRTL)); - Insert(*pChg, nSttPos, aI->mnEndPos); - nSttPos = aI->mnEndPos; - } - } -} - -RTFEndPosLst::~RTFEndPosLst() -{ - rWrt.pCurEndPosLst = pOldPosLst; -} - -int RTFEndPosLst::Insert( const SfxPoolItem& rAttr, xub_StrLen nStt, - xub_StrLen nEnd ) -{ - if (rAttr.Which() == RES_TXTATR_INETFMT) - return false; - - if( nStt == nEnd ) - return false; - - USHORT nPos; - for( nPos = 0; nPos < Count(); ++nPos ) - { - SttEndPos* pTmp = GetObject( nPos ); - if( pTmp->GetStart() == nStt && pTmp->GetEnd() == nEnd ) - { - pTmp->AddAttr( rAttr ); - return false; // schon vorhanden - } - if( nEnd < pTmp->GetEnd() ) - { - SttEndPos* pNew = new SttEndPos( rAttr, nStt, nEnd ); - _EndPosLst::C40_INSERT( SttEndPos, pNew, nPos ); - return TRUE; - } - } - - SttEndPos* pNew = new SttEndPos( rAttr, nStt, nEnd ); - _EndPosLst::C40_INSERT( SttEndPos, pNew, nPos ); - return TRUE; -} - -void RTFEndPosLst::OutScriptChange( xub_StrLen nStrPos ) -{ - SttEndPos* pStt; - for( USHORT n = 0, nEnd = Count(); n < nEnd; ++n ) - if( nStrPos == (pStt = GetObject( n ))->GetStart()) - { - if( pStt->HasScriptChange() ) - OutAttrs( nStrPos ); - break; - } -} - -void RTFEndPosLst::OutAttrs( xub_StrLen nStrPos ) -{ - SttEndPos* pStt; - nCurPos = nStrPos; - for( USHORT n = Count(); n ; ) - if( nStrPos == (pStt = (*this)[ --n ])->GetStart() ) - { - rWrt.Strm() << '{'; - for( USHORT i = 0; i < pStt->GetAttrs().Count(); ++i ) - { - const SfxPoolItem* pItem = pStt->GetAttrs()[i]; - if( RES_FLTR_SCRIPTTYPE == pItem->Which() ) - OutFontAttrs(*pItem); - else - Out( aRTFAttrFnTab, *pItem, rWrt ); - } - } - - nCurPos = STRING_NOTFOUND; -} - -//Just a little decoding hack for the RES_FLTR_SCRIPTTYPE thing -void RTFEndPosLst::OutFontAttrs(const SfxPoolItem &rItem) -{ - sal_uInt32 nValue = ((const SfxUInt32Item&)rItem).GetValue(); - sal_uInt16 nScript = static_cast<sal_uInt16>(nValue >> 16); - bool bBiDi = nValue & 0x1; - OutFontAttrs(nScript, bBiDi); -} - -void RTFEndPosLst::OutFontAttrs(USHORT nScript, bool bRTL) -{ - // script change, write the correct attributes: - // start first with the Fontname - - rWrt.bOutFmtAttr = TRUE; - nCurScript = nScript; - rWrt.SetCurrScriptType( nScript ); - rWrt.SetAssociatedFlag(false); - - // the font MUST be at the first position !!! - static const USHORT aLatinIds[] = - { - RES_CHRATR_FONT, - RES_CHRATR_FONTSIZE, RES_CHRATR_LANGUAGE, - RES_CHRATR_POSTURE, RES_CHRATR_WEIGHT, - 0 - }; - static const USHORT aAsianIds[] = - { - RES_CHRATR_CJK_FONT, - RES_CHRATR_CJK_FONTSIZE, RES_CHRATR_CJK_LANGUAGE, - RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT, - 0 - }; - static const USHORT aCmplxIds[] = - { - RES_CHRATR_CTL_FONT, - RES_CHRATR_CTL_FONTSIZE, RES_CHRATR_CTL_LANGUAGE, - RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT, - 0 - }; - - /* - You would have thought that - rWrt.Strm() << (bRTL ? OOO_STRING_SVTOOLS_RTF_RTLCH : OOO_STRING_SVTOOLS_RTF_LTRCH); would be sufficent here , - but looks like word needs to see the other directional token to be - satisified that all is kosher, otherwise it seems in ver 2003 to go and - semi-randomlyly stick strike through about the place. Perhaps - strikethrough is some ms developers "something is wrong signal" debugging - code that we're triggering ? - */ - if (bRTL) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LTRCH; - rWrt.Strm() << ' '; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_RTLCH; - } - else - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_RTLCH; - rWrt.Strm() << ' '; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LTRCH; - } - - // size/weight/posture optional - const USHORT* pIdArr = 0; - ByteString sOut; - switch (nScript) - { - default: //fall through - ASSERT(pIdArr, "unknown script, strange"); - case i18n::ScriptType::LATIN: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LOCH; - pIdArr = aLatinIds; - break; - case i18n::ScriptType::ASIAN: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_DBCH; - pIdArr = aAsianIds; - break; - case i18n::ScriptType::COMPLEX: - pIdArr = aCmplxIds; - break; - } - - for (const USHORT* pId = pIdArr; *pId; ++pId) - { - if (FnAttrOut pOut = aRTFAttrFnTab[ *pId - RES_CHRATR_BEGIN]) - { - const SfxPoolItem* pItem = HasItem(*pId); - if (!pItem) - pItem = &GetPool().GetDefaultItem(*pId); - (*pOut)(rWrt, *pItem); - } - } -} - -void RTFEndPosLst::EndAttrs( xub_StrLen nStrPos ) -{ - xub_StrLen nClipStart=STRING_MAXLEN; - bool bClosed=false; - SttEndPos* pSEPos; - while( 0 != Count() && 0 != (pSEPos = GetObject( 0 )) && - ( STRING_MAXLEN == nStrPos || nStrPos == pSEPos->GetEnd() )) - { - const SfxPoolItems& rAttrs = pSEPos->GetAttrs(); - for( USHORT nAttr = rAttrs.Count(); nAttr; ) - { - switch( rAttrs[ --nAttr ]->Which() ) - { - case RES_TXTATR_CJK_RUBY: - rWrt.Strm() << ")}{" << OOO_STRING_SVTOOLS_RTF_FLDRSLT << " }}"; - break; - } - } - - rWrt.Strm() << '}'; // end of all attributes from this position - if (pSEPos->GetStart() < nClipStart) - nClipStart = pSEPos->GetStart(); - bClosed=true; - DeleteAndDestroy( 0, 1 ); - } - - if (bClosed) - { - //If there are open ranges whose start is before this point, and whose - //start is after the cliping start then they have been closed whether - //we wanted this or not. So accept that fact and then restart then - //again - USHORT nSize = Count(); - while (nSize > 0) - { - pSEPos = GetObject(--nSize); - if ( pSEPos->GetStart() < nStrPos && - pSEPos->GetStart() >= nClipStart) - { - rWrt.Strm() << '}'; - } - } - - nSize = Count(); - USHORT n = 0; - while (n < nSize) - { - SttEndPos* pStt = (*this)[n++]; - if (pStt->GetStart() < nStrPos && pStt->GetStart() >= nClipStart) - { - rWrt.Strm() << '{'; - for( USHORT i = 0; i < pStt->GetAttrs().Count(); ++i ) - { - const SfxPoolItem* pItem = pStt->GetAttrs()[i]; - if( RES_FLTR_SCRIPTTYPE == pItem->Which() ) - OutFontAttrs(*pItem); - else - Out( aRTFAttrFnTab, *pItem, rWrt ); - } - } - } - } -} - -BOOL RTFEndPosLst::MatchScriptToId( USHORT nWhich ) const -{ - BOOL bRet = false; - switch( nWhich ) - { - case RES_CHRATR_FONT: - case RES_CHRATR_FONTSIZE: - case RES_CHRATR_LANGUAGE: - case RES_CHRATR_POSTURE: - case RES_CHRATR_WEIGHT: - bRet = nCurScript == i18n::ScriptType::LATIN; - break; - case RES_CHRATR_CJK_FONT: - case RES_CHRATR_CJK_FONTSIZE: - case RES_CHRATR_CJK_LANGUAGE: - case RES_CHRATR_CJK_POSTURE: - case RES_CHRATR_CJK_WEIGHT: - bRet = nCurScript == i18n::ScriptType::ASIAN; - break; - case RES_CHRATR_CTL_FONT: - case RES_CHRATR_CTL_FONTSIZE: - case RES_CHRATR_CTL_LANGUAGE: - case RES_CHRATR_CTL_POSTURE: - case RES_CHRATR_CTL_WEIGHT: - bRet = nCurScript == i18n::ScriptType::COMPLEX; - break; - } - return bRet; -} - -const SfxPoolItem& RTFEndPosLst::GetItem( USHORT nWhich ) const -{ - const SfxPoolItem* pItem = HasItem( nWhich ); - if( !pItem ) - pItem = &rNode.GetSwAttrSet().GetPool()->GetDefaultItem( nWhich ); - return *pItem; -} - -const SfxPoolItem* RTFEndPosLst::HasItem( USHORT nWhich ) const -{ - const SfxPoolItem* pItem; - if( RES_TXTATR_END > nWhich ) - { - // it's a character/text attribute so look into the item array - for( USHORT n = Count(); n; ) - { - SttEndPos* pTmp = GetObject( --n ); - for( USHORT i = pTmp->GetAttrs().Count(); i; ) - { - pItem = pTmp->GetAttrs()[ --i ]; - if( pItem->Which() == nWhich ) - return pItem; - - // look into the charfmt? - if( RES_TXTATR_CHARFMT == pItem->Which() && - ((SwFmtCharFmt*) pItem)->GetCharFmt() && - SFX_ITEM_SET == ((SwFmtCharFmt*) pItem)->GetCharFmt()-> - GetItemState( nWhich, TRUE, &pItem )) - return pItem; - } - } - } - - if( SFX_ITEM_SET != rNode.GetSwAttrSet().GetItemState( - nWhich, TRUE, &pItem )) - pItem = 0; - return pItem; -} - -const SfxPoolItem& SwRTFWriter::GetItem( USHORT nWhich ) const -{ - if( pCurEndPosLst ) - return pCurEndPosLst->GetItem( nWhich ); - if( pAttrSet ) - return pAttrSet->Get( nWhich ); - - return pDoc->GetAttrPool().GetDefaultItem( nWhich ); -} - -static void OutSvxFrmDir(SwRTFWriter& rRTFWrt, const SfxPoolItem& rHt ) -{ - // write it only for pasgedesc's - not for frames - SvxFrameDirectionItem aItem((const SvxFrameDirectionItem&)rHt); - USHORT nVal = 0; - const sal_Char* pStr = 0; - bool bRTL = false; - - if (rRTFWrt.pFlyFmt) - aItem.SetValue(rRTFWrt.TrueFrameDirection(*rRTFWrt.pFlyFmt)); - - switch (aItem.GetValue()) - { - case FRMDIR_ENVIRONMENT: - ASSERT(0, "Not expected to see FRMDIR_ENVIRONMENT here"); - break; - case FRMDIR_VERT_TOP_RIGHT: - nVal = 1; - pStr = OOO_STRING_SVTOOLS_RTF_FRMTXTBRLV; - break; - case FRMDIR_HORI_RIGHT_TOP: - bRTL = true; -// nVal = 3; -// A val of three isn't working as expected in word :-( so leave it -// as normal ltr 0 textflow with rtl sect property, neither does -// the frame textflow -// pStr = OOO_STRING_SVTOOLS_RTF_FRMTXTBRL; - break; - case FRMDIR_VERT_TOP_LEFT: - nVal = 4; - pStr = OOO_STRING_SVTOOLS_RTF_FRMTXLRTBV; - break; - } - - if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax && pStr ) - { - rRTFWrt.Strm() << pStr; - rRTFWrt.bOutFmtAttr = TRUE; - } - else if( rRTFWrt.bOutPageDesc) - { - if (nVal) - { - rRTFWrt.Strm() << OOO_STRING_SVTOOLS_RTF_STEXTFLOW; - rRTFWrt.OutULong( nVal ); - } - if (bRTL) - rRTFWrt.Strm() << OOO_STRING_SVTOOLS_RTF_RTLSECT; - rRTFWrt.bOutFmtAttr = TRUE; - } - else if (!rRTFWrt.pFlyFmt && !rRTFWrt.bOutPageDesc) - { - rRTFWrt.Strm() << (bRTL ? OOO_STRING_SVTOOLS_RTF_RTLPAR : OOO_STRING_SVTOOLS_RTF_LTRPAR); - rRTFWrt.bOutFmtAttr = TRUE; - } -} - -void OutRTF_SwRTL(SwRTFWriter& rWrt, const SwTxtNode *pNd) -{ - if (!pNd) - return; - SvxFrameDirection eDir = FRMDIR_ENVIRONMENT; - if (const SvxFrameDirectionItem* pItem = (const SvxFrameDirectionItem*) - pNd->GetSwAttrSet().GetItem(RES_FRAMEDIR)) - { - eDir = static_cast<SvxFrameDirection>(pItem->GetValue()); - } - if (eDir == FRMDIR_ENVIRONMENT) - { - SwPosition aPos(*pNd); - eDir = - static_cast<SvxFrameDirection>(rWrt.pDoc->GetTextDirection(aPos)); - } - OutSvxFrmDir(rWrt, SvxFrameDirectionItem(eDir, RES_FRAMEDIR)); -} - -static Writer& OutRTF_SwTxtINetFmt( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtINetFmt& rURL = (const SwFmtINetFmt&)rHt; - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( rURL.GetValue().Len() ) - { - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_FIELD << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE - << OOO_STRING_SVTOOLS_RTF_FLDINST << " HYPERLINK "; - - String sURL( rURL.GetValue() ); - if( INET_MARK_TOKEN != sURL.GetChar(0) ) - { - INetURLObject aTmp( URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(), - sURL)); - - - sURL = aTmp.GetURLNoMark( INetURLObject::DECODE_UNAMBIGUOUS); -/* if( INET_PROT_FILE == aTmp.GetProtocol() ) - { - // WW97 wollen keine FILE-URL haben, sondern einen normalen - // Dateinamen. Aber ab WW2000 kennen sie FileURLs. - sURL = aTmp.GetFull(); - } -*/ rWrt.Strm() << '\"'; - RTFOutFuncs::Out_String( rWrt.Strm(), sURL, rRTFWrt.eCurrentEncoding, - rRTFWrt.bWriteHelpFmt ) << "\" "; - sURL = aTmp.GetMark(); - } - - if( sURL.Len() ) - { - rWrt.Strm() << "\\\\l \""; - sURL.Erase( 0, 1 ); - RTFOutFuncs::Out_String( rWrt.Strm(), sURL, rRTFWrt.eCurrentEncoding, - rRTFWrt.bWriteHelpFmt ) << "\" "; - } - - if( rURL.GetTargetFrame().Len() ) - { - rWrt.Strm() << "\\\\t \""; - RTFOutFuncs::Out_String( rWrt.Strm(), rURL.GetTargetFrame(), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ) << "\" "; - } - - rWrt.Strm() << "}{" << OOO_STRING_SVTOOLS_RTF_FLDRSLT << ' '; - rRTFWrt.bOutFmtAttr = false; - - // und dann noch die Attributierung ausgeben - const SwCharFmt* pFmt; - const SwTxtINetFmt* pTxtAtr = rURL.GetTxtINetFmt(); - if( pTxtAtr && 0 != ( pFmt = pTxtAtr->GetCharFmt() )) - OutRTF_SwFmt( rWrt, *pFmt ); - } - return rWrt; -} - -void HandleHyperlinks(Writer& rWrt, const SwpHints* pTxtAttrs, xub_StrLen nPos ) -{ - USHORT nCount = pTxtAttrs ? pTxtAttrs->Count() : 0; - for(USHORT i = 0; i < nCount; ++i ) - { - const SwTxtAttr* pHt = (*pTxtAttrs)[i]; - const SfxPoolItem &rItem = pHt->GetAttr(); - if (rItem.Which() == RES_TXTATR_INETFMT) - { - const xub_StrLen* pEnd; - if (nPos == *pHt->GetStart()) - OutRTF_SwTxtINetFmt(rWrt, rItem); - if (0 != ( pEnd = pHt->GetEnd() ) && nPos == *pEnd) - { - // Hyperlinks werden als Felder geschrieben, aber der - // "FieldResult" // steht als Text im TextNode. Also muss bei - // diesen Attributen am // Ende 2 Klammern stehen! - rWrt.Strm() << "}}"; - } - } - } -} - -static Writer& OutRTF_SwTxtNode( Writer& rWrt, SwCntntNode& rNode ) -{ - SwTxtNode * pNd = &((SwTxtNode&)rNode); - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - xub_StrLen nStrPos = rRTFWrt.pCurPam->GetPoint()->nContent.GetIndex(); - RTFEndPosLst aEndPosLst( rRTFWrt, *pNd, nStrPos ); - USHORT nAttrPos = 0; - - const String& rStr = pNd->GetTxt(); - xub_StrLen nEnde = rStr.Len(); - if( rRTFWrt.pCurPam->GetPoint()->nNode == rRTFWrt.pCurPam->GetMark()->nNode ) - nEnde = Min( nEnde, rRTFWrt.pCurPam->GetMark()->nContent.GetIndex() ); - - int bNewFmts = rRTFWrt.GetAttrSet() != &pNd->GetSwAttrSet(); - if( bNewFmts ) - { - // harte Attributierung am Node und am Vorgaenger ? - const SfxItemSet* pNdSet = pNd->GetpSwAttrSet(); - if( pNdSet && rRTFWrt.GetAttrSet() && rRTFWrt.bAutoAttrSet && - pNdSet->GetParent() == rRTFWrt.GetAttrSet()->GetParent() && - pNdSet->Count() == rRTFWrt.GetAttrSet()->Count() ) - { - // die beiden Parents sind gleich, dann teste doch mal die - // Attribute im Set - - int bEqual = TRUE; - if( pNdSet->Count() ) - { - SfxItemIter aIter( *rRTFWrt.GetAttrSet() ); - const SfxPoolItem *pItem, *pCurr = aIter.GetCurItem(); - while( TRUE ) - { - if( SFX_ITEM_SET != pNdSet->GetItemState( pCurr->Which(), - false, &pItem ) || *pItem != *pCurr ) - { - bEqual = false; - break; - } - - if( aIter.IsAtEnd() ) - break; - pCurr = aIter.NextItem(); - } - } - if (bEqual) - bNewFmts = false; - } - rRTFWrt.SetAttrSet( &pNd->GetSwAttrSet() ); - rRTFWrt.bAutoAttrSet = 0 != pNdSet; - } - - // Flag zuruecksetzen, damit nach der Ausgabe der Collection - // getestet werden kann, ob noch ein Blank auszugeben ist - rRTFWrt.bOutFmtAttr = false; - - // in der Ausgabe eines Flys? Dann vorm ausgeben der AbsatzAttribute - // den Format-Pointer auf 0 setzen! - const SwFlyFrmFmt* pSaveFmt = rRTFWrt.pFlyFmt; - - SfxItemSet aMergedSet(rRTFWrt.pDoc->GetAttrPool(), POOLATTR_BEGIN, - POOLATTR_END-1); - bool bDeep = false; - - if( rRTFWrt.bWriteAll ) - { - rRTFWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_PLAIN << ' '; // alle Attribute zuruecksetzen - if( rRTFWrt.bOutTable ) - rRTFWrt.Strm() << OOO_STRING_SVTOOLS_RTF_INTBL; - - // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann - // muessen noch die Attribute dafuer ausgegeben werden. - if( pSaveFmt ) - { - OutRTF_SwFlyFrmFmt( rRTFWrt ); - rRTFWrt.pFlyFmt = 0; - } - - rRTFWrt.OutListNum( *pNd ); - OutRTF_SwRTL(rRTFWrt, pNd); - SwFmtToSet(rRTFWrt, pNd->GetAnyFmtColl(), aMergedSet); - bDeep = true; - } - else if( !rRTFWrt.bWriteAll && rRTFWrt.bFirstLine ) - { - OutRTF_SwRTL(rRTFWrt, pNd); - SwFmtToSet(rRTFWrt, pNd->GetAnyFmtColl(), aMergedSet); - bDeep = true; - } - - // gibt es harte Attributierung ? - if( pNd->HasSwAttrSet() ) - { - rRTFWrt.pFlyFmt = 0; - - const SfxItemSet& rNdSet = pNd->GetSwAttrSet(); - - const SwNumRule* pRule = pNd->GetNumRule(); - // --> OD 2008-03-19 #refactorlists# - if ( pRule && pNd->IsInList() ) - // <-- - { - // --> OD 2008-03-18 #refactorlists# - ASSERT( pNd->GetActualListLevel() >= 0 && pNd->GetActualListLevel() < MAXLEVEL, - "<OutRTF_SwTxtNode(..)> - text node does not have valid list level. Serious defect -> please inform OD" ); - // <-- - BYTE nLvl = static_cast< BYTE >(pNd->GetActualListLevel()); - const SwNumFmt* pFmt = pRule->GetNumFmt( nLvl ); - if( !pFmt ) - pFmt = &pRule->Get( nLvl ); - - SfxItemSet aSet( rNdSet ); - SvxLRSpaceItem aLR( (SvxLRSpaceItem&)rNdSet.Get( RES_LR_SPACE ) ); - - aLR.SetTxtLeft( aLR.GetTxtLeft() + pFmt->GetIndentAt() ); - if( MAXLEVEL > pNd->GetActualListLevel() ) - aLR.SetTxtFirstLineOfst( pFmt->GetFirstLineIndent() ); - else - aSet.ClearItem( RES_PARATR_NUMRULE ); - aSet.Put( aLR ); - aMergedSet.Put(aSet); - } - else - aMergedSet.Put(rNdSet); - } - - SwTxtNode *txtNode=rNode.GetTxtNode(); - if (txtNode!=NULL && !txtNode->IsNumbered()) - { - aMergedSet.ClearItem(RES_PARATR_NUMRULE); - } - OutRTF_SfxItemSet(rRTFWrt, aMergedSet, bDeep); - - rRTFWrt.pFlyFmt = pSaveFmt; - - rRTFWrt.bTxtAttr = true; - // erstmal den Start berichtigen. D.h. wird nur ein Teil vom Satz - // ausgegeben, so muessen auch da die Attribute stimmen!! - const SwTxtAttr * pHt = 0; - USHORT nCntAttr = pNd->HasHints() ? pNd->GetSwpHints().Count() : 0; - if( nCntAttr && nStrPos > *( pHt = pNd->GetSwpHints()[ 0 ] )->GetStart() ) - { - // Ok, es gibt vorher Attribute, die ausgegeben werden muessen - do { - nAttrPos++; - if( RES_TXTATR_FIELD == pHt->Which() ) // Felder nicht - continue; // ausgeben - - if( pHt->GetEnd() ) - { - xub_StrLen nHtEnd = *pHt->GetEnd(), nHtStt = *pHt->GetStart(); - if( !rRTFWrt.bWriteAll && nHtEnd <= nStrPos ) - continue; - - // leere Hints am Anfang nicht beachten, oder ?? - if( nHtEnd == nHtStt ) - continue; - - // Attribut in die Liste aufnehemen - if( !rRTFWrt.bWriteAll ) - { - if( nHtStt < nStrPos ) nHtStt = nStrPos; - if( nHtEnd >= nEnde ) nHtEnd = nEnde; - } - aEndPosLst.Insert( pHt->GetAttr(), nHtStt, nHtEnd ); - continue; - // aber nicht ausgeben, das erfolgt spaeter !! - } - Out( aRTFAttrFnTab, pHt->GetAttr(), rRTFWrt ); - - } while( nAttrPos < nCntAttr && nStrPos > - *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() ); - - // dann gebe mal alle gesammelten Attribute von der String-Pos aus - aEndPosLst.OutAttrs( nStrPos ); - } - - if( rRTFWrt.bOutFmtAttr && - ( nAttrPos < nCntAttr ? *pHt->GetStart() != nStrPos : TRUE )) - rRTFWrt.Strm() << ' '; - - // das Flag gibt an, ob das SwTxtFld am Ende vom Absatz steht. Denn - // dann ist vor dem Absatzumbruch die schliessende Klammer auszugeben - xub_StrLen nChrCnt = 0; - for( ; nStrPos <= nEnde; nStrPos++ ) - { - rRTFWrt.bOutFmtAttr = false; - if( nStrPos != nEnde && aEndPosLst.Count() ) - aEndPosLst.EndAttrs( nStrPos ); - - // versuche nach ungefaehr 255 Zeichen eine neue Zeile zu beginnen - if( nChrCnt != ( nStrPos & 0xff00 )) - { - rWrt.Strm() << SwRTFWriter::sNewLine; - nChrCnt = nStrPos & 0xff00; - } - - if( nAttrPos < nCntAttr && *pHt->GetStart() == nStrPos - && nStrPos != nEnde ) - { - do { - BOOL bEmpty = false; - if( pHt->GetEnd() ) - { - if (false == (bEmpty = *pHt->GetEnd() == nStrPos)) - { - aEndPosLst.Insert( pHt->GetAttr(), nStrPos, - *pHt->GetEnd() ); - continue; - } - rRTFWrt.Strm() << '{'; - } - Out( aRTFAttrFnTab, pHt->GetAttr(), rRTFWrt ); - if( bEmpty ) - { - rRTFWrt.Strm() << '}'; - rRTFWrt.bOutFmtAttr = false; - } - } while( ++nAttrPos < nCntAttr && nStrPos == - *( pHt = pNd->GetSwpHints()[ nAttrPos ] )->GetStart() ); - - // dann gebe mal alle gesammelten Attribute von der String-Pos aus - aEndPosLst.OutAttrs( nStrPos ); - - } - else - aEndPosLst.OutScriptChange( nStrPos ); - - HandleHyperlinks(rWrt, pNd->GetpSwpHints(), nStrPos); - - if( rRTFWrt.bOutFmtAttr ) - rRTFWrt.Strm() << ' '; - - rRTFWrt.OutBookmarks( nStrPos ); - - rRTFWrt.OutRedline( nStrPos); - - if (nStrPos != nEnde) - { - RTFOutFuncs::Out_String(rWrt.Strm(), String(rStr.GetChar(nStrPos)), - rRTFWrt.eCurrentEncoding, rRTFWrt.bWriteHelpFmt); - } - } - - rRTFWrt.bTxtAttr = false; - - // noch eine schliesende Klammer da ?? - if( aEndPosLst.Count() ) - aEndPosLst.EndAttrs( USHRT_MAX ); - - // wenn bis zum Ende vom Node, dann auch das AbsatzEnde ausgeben - if( rRTFWrt.pCurPam->GetMark()->nNode.GetIndex() == - rRTFWrt.pCurPam->GetPoint()->nNode.GetIndex() ) - { - if( pNd->Len() != rRTFWrt.pCurPam->GetMark()->nContent.GetIndex() ) - return rWrt; - - if( rRTFWrt.bOutTable ) - { - rRTFWrt.Strm() << SwRTFWriter::sNewLine; - return rWrt; - } - } - - rRTFWrt.Strm() << SwRTFWriter::sNewLine << OOO_STRING_SVTOOLS_RTF_PAR << ' '; - return rRTFWrt; -} - -bool IsEMF(const sal_uInt8 *pGraphicAry, unsigned long nSize) -{ - if (pGraphicAry && (nSize > 0x2c )) - { - // check the magic number - if ( - (pGraphicAry[0x28] == 0x20 ) && (pGraphicAry[0x29] == 0x45) && - (pGraphicAry[0x2a] == 0x4d ) && (pGraphicAry[0x2b] == 0x46) - ) - { - //emf detected - return true; - } - } - return false; -} - -bool StripMetafileHeader(const sal_uInt8 *&rpGraphicAry, unsigned long &rSize) -{ - if (rpGraphicAry && (rSize > 0x22)) - { - if ( - (rpGraphicAry[0] == 0xd7) && (rpGraphicAry[1] == 0xcd) && - (rpGraphicAry[2] == 0xc6) && (rpGraphicAry[3] == 0x9a) - ) - { // we have to get rid of the metafileheader - rpGraphicAry += 22; - rSize -= 22; - return true; - } - } - return false; -} - -void ExportPICT(const Size &rOrig, const Size &rRendered, const Size &rMapped, - const SwCropGrf &rCr, const char *pBLIPType, const sal_uInt8 *pGraphicAry, - unsigned long nSize, SwRTFWriter &rWrt) -{ - bool bIsWMF = (const char *)pBLIPType == (const char *)OOO_STRING_SVTOOLS_RTF_WMETAFILE ? true : false; - if (pBLIPType && nSize && pGraphicAry) - { - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_PICT; - - long nXCroppedSize = rOrig.Width()-(rCr.GetLeft() + rCr.GetRight()); - long nYCroppedSize = rOrig.Height()-(rCr.GetTop() + rCr.GetBottom()); - /* #127543#: Graphic with a zero height or width, typically copied from webpages, caused - crashes. */ - if( !nXCroppedSize ) - nXCroppedSize = 100; - if( !nYCroppedSize ) - nYCroppedSize = 100; - - //Given the original size and taking cropping into account - //first, how much has the original been scaled to get the - //final rendered size - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICSCALEX; - rWrt.OutLong((100 * rRendered.Width()) / nXCroppedSize); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICSCALEY; - rWrt.OutLong((100 * rRendered.Height()) / nYCroppedSize); - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICCROPL; - rWrt.OutLong(rCr.GetLeft()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICCROPR; - rWrt.OutLong(rCr.GetRight()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICCROPT; - rWrt.OutLong(rCr.GetTop()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICCROPB; - rWrt.OutLong(rCr.GetBottom()); - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICW; - rWrt.OutLong(rMapped.Width()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICH; - rWrt.OutLong(rMapped.Height()); - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICWGOAL; - rWrt.OutLong(rOrig.Width()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PICHGOAL; - rWrt.OutLong(rOrig.Height()); - - rWrt.Strm() << pBLIPType; - if (bIsWMF) - { - rWrt.OutLong(8); - StripMetafileHeader(pGraphicAry, nSize); - } - rWrt.Strm() << SwRTFWriter::sNewLine; - - sal_uInt32 nBreak = 0; - for (sal_uInt32 nI = 0; nI < nSize; ++nI) - { - ByteString sNo = ByteString::CreateFromInt32(pGraphicAry[nI], 16); - if (sNo.Len() < 2) - rWrt.Strm() << '0'; - rWrt.Strm() << sNo.GetBuffer(); - if (++nBreak == 64) - { - rWrt.Strm() << SwRTFWriter::sNewLine; - nBreak = 0; - } - } - - rWrt.Strm() << '}'; - } -} - -static Writer& OutRTF_SwGrfNode(Writer& rWrt, SwCntntNode & rNode) -{ - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - SwGrfNode &rNd = (SwGrfNode&)rNode; - - // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann - // muessen noch die Attribute dafuer ausgegeben werden. - if (rRTFWrt.pFlyFmt && !ExportAsInline(*rRTFWrt.pFlyFmt)) - OutRTF_SwFlyFrmFmt(rRTFWrt); //"classic" positioning and size export - -#if 1 - SvMemoryStream aStream; - const sal_uInt8* pGraphicAry = 0; - sal_uInt32 nSize = 0; - - Graphic aGraphic(rNd.GetGrf()); - - // If there is no graphic there is not much point in parsing it - if(aGraphic.GetType()==GRAPHIC_NONE) - return rRTFWrt; - - GfxLink aGraphicLink; - const sal_Char* pBLIPType = 0; - if (aGraphic.IsLink()) - { - aGraphicLink = aGraphic.GetLink(); - nSize = aGraphicLink.GetDataSize(); - pGraphicAry = aGraphicLink.GetData(); - switch (aGraphicLink.GetType()) - { - case GFX_LINK_TYPE_NATIVE_JPG: - pBLIPType = OOO_STRING_SVTOOLS_RTF_JPEGBLIP; - break; - case GFX_LINK_TYPE_NATIVE_PNG: - pBLIPType = OOO_STRING_SVTOOLS_RTF_PNGBLIP; - case GFX_LINK_TYPE_NATIVE_WMF: - pBLIPType = - IsEMF(pGraphicAry, nSize) ? OOO_STRING_SVTOOLS_RTF_EMFBLIP : OOO_STRING_SVTOOLS_RTF_WMETAFILE; - break; - default: - break; - } - } - - GraphicType eGraphicType = aGraphic.GetType(); - if (!pGraphicAry) - { - if (ERRCODE_NONE == GraphicConverter::Export(aStream, aGraphic, - (eGraphicType == GRAPHIC_BITMAP) ? CVT_PNG : CVT_WMF)) - { - pBLIPType = (eGraphicType == GRAPHIC_BITMAP) ? - OOO_STRING_SVTOOLS_RTF_PNGBLIP : OOO_STRING_SVTOOLS_RTF_WMETAFILE; - aStream.Seek(STREAM_SEEK_TO_END); - nSize = aStream.Tell(); - pGraphicAry = (sal_uInt8*)aStream.GetData(); - } - } - - Size aMapped(eGraphicType == GRAPHIC_BITMAP ? aGraphic.GetSizePixel() : aGraphic.GetPrefSize()); - - const SwCropGrf &rCr = (const SwCropGrf &)rNd.GetAttr(RES_GRFATR_CROPGRF); - - //Get original size in twips - Size aSize(sw::util::GetSwappedInSize(rNd)); - Size aRendered(aSize); - if (rRTFWrt.pFlyFmt) - { - const SwFmtFrmSize& rS = rRTFWrt.pFlyFmt->GetFrmSize(); - aRendered.Width() = rS.GetWidth(); - aRendered.Height() = rS.GetHeight(); - } - - /* - If the graphic is not of type WMF then we will have to store two - graphics, one in the native format wrapped in shppict, and the other in - the wmf format wrapped in nonshppict, so as to keep wordpad happy. If its - a wmf already then we don't need any such wrapping - */ - bool bIsWMF = (const sal_Char*)pBLIPType == (const sal_Char*)OOO_STRING_SVTOOLS_RTF_WMETAFILE ? true : false; - if (!bIsWMF) - OutComment(rRTFWrt, OOO_STRING_SVTOOLS_RTF_SHPPICT); - - if (pBLIPType) - ExportPICT(aSize, aRendered, aMapped, rCr, pBLIPType, pGraphicAry, nSize, rRTFWrt); - else - { - aStream.Seek(0); - GraphicConverter::Export(aStream, aGraphic, CVT_WMF); - pBLIPType = OOO_STRING_SVTOOLS_RTF_WMETAFILE; - aStream.Seek(STREAM_SEEK_TO_END); - nSize = aStream.Tell(); - pGraphicAry = (sal_uInt8*)aStream.GetData(); - - ExportPICT(aSize, aRendered, aMapped, rCr, pBLIPType, pGraphicAry, nSize, - rRTFWrt); - } - - if (!bIsWMF) - { - rRTFWrt.Strm() << '}' << '{' << OOO_STRING_SVTOOLS_RTF_NONSHPPICT; - - aStream.Seek(0); - GraphicConverter::Export(aStream, aGraphic, CVT_WMF); - pBLIPType = OOO_STRING_SVTOOLS_RTF_WMETAFILE; - aStream.Seek(STREAM_SEEK_TO_END); - nSize = aStream.Tell(); - pGraphicAry = (sal_uInt8*)aStream.GetData(); - - ExportPICT(aSize, aRendered, aMapped, rCr, pBLIPType, pGraphicAry, nSize, - rRTFWrt); - - rRTFWrt.Strm() << '}'; - } - - - rRTFWrt.Strm() << SwRTFWriter::sNewLine; -#else - rRTFWrt.Strm() << "{{"; - - // damit die eigenen Grafik-Attribute nach der PICT / import Anweisung - // stehen, muessen die am Anfang ausgegeben werden. - rRTFWrt.bOutFmtAttr = false; - OutRTF_SwFmt( rRTFWrt, *pNd->GetFmtColl() ); - - if( rRTFWrt.bOutFmtAttr ) // wurde ueberhaupt ein Attrribut - rRTFWrt.Strm() << "}{"; // ausgegeben ?? - - String aGrfNm; - const SwMirrorGrf& rMirror = pNd->GetSwAttrSet().GetMirrorGrf(); - if( !pNd->IsLinkedFile() || RES_MIRROR_GRAPH_DONT != rMirror.GetValue() ) - { - USHORT nErr = 1; - // Grafik als File-Referenz speichern (als JPEG-Grafik speichern) - // but only if we save into a file and have a URL - if( rWrt.GetOrigFileName() ) - { - aGrfNm = *rWrt.GetOrigFileName(); - pNd->SwapIn( TRUE ); - ULONG nFlags = XOUTBMP_USE_NATIVE_IF_POSSIBLE; - switch( rMirror.GetValue() ) - { - case RES_MIRROR_GRAPH_VERT: nFlags = XOUTBMP_MIRROR_HORZ; break; - case RES_MIRROR_GRAPH_HOR: nFlags = XOUTBMP_MIRROR_VERT; break; - case RES_MIRROR_GRAPH_BOTH: - nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ; - break; - } - - Size aMM100Size; - Size* pMM100Size = 0; - if( rRTFWrt.pFlyFmt ) - { - const SwFmtFrmSize& rSize = rRTFWrt.pFlyFmt->GetFrmSize(); - aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(), - MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM )); - pMM100Size = &aMM100Size; - } - - nErr = XOutBitmap::WriteGraphic( pNd->GetGrf(), aGrfNm, - String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "JPG" )), - nFlags, pMM100Size ); - } - if( nErr ) // fehlerhaft, da ist nichts auszugeben - { - rRTFWrt.Strm() << "}}"; - return rWrt; - } - } - else - pNd->GetFileFilterNms( &aGrfNm, 0 ); - - // MIB->JP: Warum erst AbsToRel und dann das URL-Objekt? So - // kommt bei relativierbaren URLs als Protokoll "unknown" raus. - // Ist das Absicht? - aGrfNm = INetURLObject::AbsToRel( aGrfNm, INetURLObject::WAS_ENCODED, - INetURLObject::DECODE_UNAMBIGUOUS); - INetURLObject aUrl( aGrfNm ); - if( aUrl.GetProtocol() == INET_PROT_FILE ) - aGrfNm = aUrl.PathToFileName(); - - // Bitmap als File-Referenz speichern - rRTFWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FIELD << OOO_STRING_SVTOOLS_RTF_FLDPRIV; - OutComment( rRTFWrt, OOO_STRING_SVTOOLS_RTF_FLDINST ) << "{\\\\import "; - RTFOutFuncs::Out_String( rWrt.Strm(), aGrfNm, rRTFWrt.eDefaultEncoding, - rRTFWrt.bWriteHelpFmt ); - rRTFWrt.Strm() << "}}{" << OOO_STRING_SVTOOLS_RTF_FLDRSLT << " }}"; - rRTFWrt.Strm() << '}' << SwRTFWriter::sNewLine; -#endif - return rRTFWrt; -} - -static Writer& OutRTF_SwOLENode( Writer& rWrt, SwCntntNode & /*rNode*/ ) -{ - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - - // ist der aktuelle Absatz in einem freifliegenden Rahmen ? Dann - // muessen noch die Attribute dafuer ausgegeben werden. - if( rRTFWrt.pFlyFmt ) - OutRTF_SwFlyFrmFmt( rRTFWrt ); - - rWrt.Strm() << SwRTFWriter::sNewLine << OOO_STRING_SVTOOLS_RTF_PAR; - return rWrt; -} - -static void OutTBLBorderLine(SwRTFWriter& rWrt, const SvxBorderLine* pLine, - const sal_Char* pStr) -{ - ByteString sLineStr; - if( pLine->GetInWidth() ) - { - // doppelte Linie - sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRDB; - switch( pLine->GetInWidth() ) - { - case DEF_LINE_WIDTH_0: - ( sLineStr += OOO_STRING_SVTOOLS_RTF_BRDRW ) += "15"; - break; - case DEF_LINE_WIDTH_1: - ( sLineStr += OOO_STRING_SVTOOLS_RTF_BRDRW ) += "30"; - break; - case DEF_LINE_WIDTH_2: - case DEF_LINE_WIDTH_3: - ( sLineStr += OOO_STRING_SVTOOLS_RTF_BRDRW ) += "45"; - break; - } - } - else - { - if ( DEF_LINE_WIDTH_0 == pLine->GetOutWidth( ) ) - // Hairline - sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRHAIR; - else if( 255 >= pLine->GetOutWidth() ) - { - // Simple width simple - sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRS; - switch ( pLine->GetStyle( ) ) - { - case DOTTED: - sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRDOT; - break; - case DASHED: - sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRDASH; - break; - case SOLID: - default: - break; - } - ( sLineStr += OOO_STRING_SVTOOLS_RTF_BRDRW ) += - ByteString::CreateFromInt32( pLine->GetOutWidth() ); - } - else - // Shouldn't happen with the OOo default width values - (( sLineStr = OOO_STRING_SVTOOLS_RTF_BRDRTH ) += sLineStr += OOO_STRING_SVTOOLS_RTF_BRDRW ) += - ByteString::CreateFromInt32( pLine->GetOutWidth() / 2 ); - } - - rWrt.Strm() << pStr << sLineStr.GetBuffer() << OOO_STRING_SVTOOLS_RTF_BRDRCF; - rWrt.OutULong( rWrt.GetId( pLine->GetColor() ) ); -} - -static void OutBorderLine(SwRTFWriter& rWrt, const SvxBorderLine* pLine, - const sal_Char* pStr, USHORT nDist) -{ - OutTBLBorderLine(rWrt, pLine, pStr); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_BRSP; - rWrt.OutULong( nDist ); -} - -static void OutSwTblBorder(SwRTFWriter& rWrt, const SvxBoxItem& rBox, - const SvxBoxItem *pDefault) -{ - static const USHORT aBorders[] = - { - BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT - }; -#ifdef __MINGW32__ - static const char* aBorderNames[] __attribute__((section(".data"))) = -#else - static const char* aBorderNames[] = -#endif - { - OOO_STRING_SVTOOLS_RTF_CLBRDRT, OOO_STRING_SVTOOLS_RTF_CLBRDRL, OOO_STRING_SVTOOLS_RTF_CLBRDRB, OOO_STRING_SVTOOLS_RTF_CLBRDRR - }; - //Yes left and top are swapped with eachother for cell padding! Because - //that's what the thunderingly annoying rtf export/import word xp does. -#ifdef __MINGW32__ - static const char* aCellPadNames[] __attribute__((section(".data"))) = -#else - static const char* aCellPadNames[] = -#endif - { - OOO_STRING_SVTOOLS_RTF_CLPADL, OOO_STRING_SVTOOLS_RTF_CLPADT, OOO_STRING_SVTOOLS_RTF_CLPADB, OOO_STRING_SVTOOLS_RTF_CLPADR - }; -#ifdef __MINGW32__ - static const char* aCellPadUnits[] __attribute__((section(".data"))) = -#else - static const char* aCellPadUnits[] = -#endif - { - OOO_STRING_SVTOOLS_RTF_CLPADFL, OOO_STRING_SVTOOLS_RTF_CLPADFT, OOO_STRING_SVTOOLS_RTF_CLPADFB, OOO_STRING_SVTOOLS_RTF_CLPADFR - }; - for (int i = 0; i < 4; ++i) - { - if (const SvxBorderLine* pLn = rBox.GetLine(aBorders[i])) - OutTBLBorderLine(rWrt, pLn, aBorderNames[i]); - if (!pDefault || pDefault->GetDistance(aBorders[i]) != - rBox.GetDistance(aBorders[i])) - { - rWrt.Strm() << aCellPadUnits[i]; - rWrt.OutULong(3); - rWrt.Strm() << aCellPadNames[i]; - rWrt.OutULong(rBox.GetDistance(aBorders[i])); - } - } -} - -static void OutSwTblBackground( SwRTFWriter& rWrt, const SvxBrushItem& rBack ) -{ - if( !rBack.GetColor().GetTransparency() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CLCBPAT; - rWrt.OutULong( rWrt.GetId( rBack.GetColor() ) ); - } -} - - -Writer& OutRTF_SwTblNode(Writer& rWrt, const SwTableNode & rNode) -{ - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - const SwTable& rTbl = rNode.GetTable(); - SwTwips nPageSize = 0, nTblOffset = 0; - const bool bNewTableModel = rTbl.IsNewModel(); - -/* -//!!!!!!!!!!!!! for clipboard create any view if the table is complex !!! - if( rTbl.IsTblComplex() ) - { - // then we have to create any layout - SFX_APP()->CreateViewFrame( *xDocSh, 0, TRUE ); - } -*/ - - const SwFrmFmt *pFmt = rTbl.GetFrmFmt(); - ASSERT(pFmt, "Impossible"); - { - Point aPt; - SwRect aRect( pFmt->FindLayoutRect( false, &aPt )); - if( aRect.IsEmpty() ) - { - // dann besorge mal die Seitenbreite ohne Raender !! - const SwFrmFmt* pFrmFmt = rRTFWrt.pFlyFmt ? rRTFWrt.pFlyFmt : - const_cast<const SwDoc *>(rWrt.pDoc) - ->GetPageDesc(0).GetPageFmtOfNode(rNode, false); - - aRect = pFrmFmt->FindLayoutRect( TRUE ); - if( 0 == ( nPageSize = aRect.Width() )) - { - const SvxLRSpaceItem& rLR = pFrmFmt->GetLRSpace(); - nPageSize = pFrmFmt->GetFrmSize().GetWidth() - - rLR.GetLeft() - rLR.GetRight(); - } - } - else - nPageSize = aRect.Width(); - } - - SwTwips nTblSz = pFmt->GetFrmSize().GetWidth(); - - ByteString aTblAdjust( OOO_STRING_SVTOOLS_RTF_TRQL ); - switch (pFmt->GetHoriOrient().GetHoriOrient()) - { - case text::HoriOrientation::CENTER: - aTblAdjust = OOO_STRING_SVTOOLS_RTF_TRQC; - break; - case text::HoriOrientation::RIGHT: - aTblAdjust = OOO_STRING_SVTOOLS_RTF_TRQR; - break; - case text::HoriOrientation::NONE: - case text::HoriOrientation::LEFT_AND_WIDTH: - { - const SvxLRSpaceItem& rLRSp = pFmt->GetLRSpace(); - nTblOffset = rLRSp.GetLeft(); - nPageSize -= (nTblOffset + rLRSp.GetRight()); - aTblAdjust += OOO_STRING_SVTOOLS_RTF_TRLEFT; - aTblAdjust += ByteString::CreateFromInt32( nTblOffset ); - } - break; - default: - break; - } - - if (rRTFWrt.TrueFrameDirection(*pFmt) == FRMDIR_HORI_RIGHT_TOP) - aTblAdjust += OOO_STRING_SVTOOLS_RTF_RTLROW; - - // ist die Tabelle wesentlich (PageSize + 10%) groesser als die Seite, - // dann sind die Box-Breiten relative Angaben. - BOOL bRelBoxSize = TRUE /*ALWAYS relativ (nPageSize + ( nPageSize / 10 )) < nTblSz*/; - - SwWriteTable* pTableWrt; - const SwHTMLTableLayout *pLayout = rTbl.GetHTMLTableLayout(); - if( pLayout && pLayout->IsExportable() ) - pTableWrt = new SwWriteTable( pLayout ); - else - pTableWrt = new SwWriteTable(rTbl.GetTabLines(), (USHORT)nPageSize, - (USHORT)nTblSz, false); - - // rCols are the array of all cols of the table - const SwWriteTableCols& rCols = pTableWrt->GetCols(); - USHORT nColCnt = rCols.Count(); - SwWriteTableCellPtr* pBoxArr = new SwWriteTableCellPtr[ nColCnt ]; - USHORT* pRowSpans = new USHORT[ nColCnt ]; - memset( pBoxArr, 0, sizeof( pBoxArr[0] ) * nColCnt ); - memset( pRowSpans, 0, sizeof( pRowSpans[0] ) * nColCnt ); - const SwWriteTableRows& rRows = pTableWrt->GetRows(); - for( USHORT nLine = 0; nLine < rRows.Count(); ++nLine ) - { - USHORT nBox; - - const SwWriteTableRow *pRow = rRows[ nLine ]; - const SwWriteTableCells& rCells = pRow->GetCells(); - - BOOL bFixRowHeight = false; - - USHORT nBoxes = rCells.Count(); - if (nColCnt < nBoxes) - nBoxes = nColCnt; - - for( nColCnt = 0, nBox = 0; nBox < rCells.Count() && nColCnt < nBoxes; ++nColCnt ) - { - SwWriteTableCell* pCell = rCells[ nBox ]; - const bool bProcessCoveredCell = bNewTableModel && 0 == pCell->GetRowSpan(); - - if( !pRowSpans[ nColCnt ] || bProcessCoveredCell ) - { - // set new BoxPtr - nBox++; - pBoxArr[ nColCnt ] = pCell; - if ( !bProcessCoveredCell ) - pRowSpans[ nColCnt ] = pCell->GetRowSpan(); - for( USHORT nCellSpan = pCell->GetColSpan(), nCS = 1; - nCS < nCellSpan; ++nCS, ++nColCnt ) - { - ASSERT( nColCnt+1 < rCols.Count(), "More colspan than columns" ); - if( nColCnt+1 < rCols.Count() ) // robust against wrong colspans - { - pBoxArr[ nColCnt+1 ] = pBoxArr[ nColCnt ]; - pRowSpans[ nColCnt+1 ] = pRowSpans[ nColCnt ]; - } - } - } - if( 1 != pRowSpans[ nColCnt ] && !bNewTableModel ) - bFixRowHeight = TRUE; - } - - for( ; nColCnt < rCols.Count() && pRowSpans[ nColCnt ]; ++nColCnt ) - bFixRowHeight = TRUE; - - nColCnt = rCols.Count(); // A wrong cellspan-value could cause a nColCnt > rCols.Count() - - // Start Tabellendefinition - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TROWD << aTblAdjust.GetBuffer(); - - if( rTbl.GetRowsToRepeat() > nLine ) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TRHDR; - - const SwTableLine* pLine = pBoxArr[ 0 ]->GetBox()->GetUpper(); - // Zeilenhoehe ausgeben - long nHeight = 0; - if( bFixRowHeight && rWrt.pDoc->GetRootFrm() ) - { - nHeight = -pRow->GetPos(); //neg. => abs. height! - if( nLine ) - nHeight += rRows[ nLine - 1 ]->GetPos(); - } - else - { - const SwFmtFrmSize& rLSz = pLine->GetFrmFmt()->GetFrmSize(); - if( ATT_VAR_SIZE != rLSz.GetHeightSizeType() && rLSz.GetHeight() ) - nHeight = ATT_MIN_SIZE == rLSz.GetHeightSizeType() - ? rLSz.GetHeight() - : -rLSz.GetHeight(); - } - - //The rtf default is to allow a row to break, so if we are not - //splittable export TRKEEP - const SwFrmFmt *pLineFmt = pLine ? pLine->GetFrmFmt() : 0; - if (!pLineFmt || pLineFmt->GetRowSplit().GetValue() == 0) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TRKEEP; - - if( nHeight ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TRRH; - rWrt.OutLong( nHeight ); - } - - const SvxBoxItem *pDefaultBox = 0; - if (nColCnt) - { - pDefaultBox = &(pBoxArr[0]->GetBox()->GetFrmFmt()->GetBox()); - - static const USHORT aBorders[] = - { - BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT - }; -#ifdef __MINGW32__ - static const char* aRowPadNames[] __attribute__((section(".data"))) = -#else - static const char* aRowPadNames[] = -#endif - { - OOO_STRING_SVTOOLS_RTF_TRPADDT, OOO_STRING_SVTOOLS_RTF_TRPADDL, OOO_STRING_SVTOOLS_RTF_TRPADDB, OOO_STRING_SVTOOLS_RTF_TRPADDR - }; - static const char* aRowPadUnits[] = - { - OOO_STRING_SVTOOLS_RTF_TRPADDFT, OOO_STRING_SVTOOLS_RTF_TRPADDFL, OOO_STRING_SVTOOLS_RTF_TRPADDFB, OOO_STRING_SVTOOLS_RTF_TRPADDFR - }; - for (int i = 0; i < 4; ++i) - { - rWrt.Strm() << aRowPadUnits[i]; - rWrt.OutULong(3); - rWrt.Strm() << aRowPadNames[i]; - rWrt.OutULong(pDefaultBox->GetDistance(aBorders[i])); - } - } - - // Breite der Boxen ausgeben - SwTwips nSz = 0, nCalc; - for( nBox = 0; nBox < nColCnt; ++nBox ) - { - SwWriteTableCell* pCell = pBoxArr[ nBox ]; - if( (nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ]) || (pCell == NULL) ) - continue; - - const SwFrmFmt& rFmt = *pCell->GetBox()->GetFrmFmt(); - if( 1 < pCell->GetRowSpan() || 0 == pCell->GetRowSpan() ) - rWrt.Strm() << ( pCell->GetRowSpan() == pRowSpans[ nBox ] - ? OOO_STRING_SVTOOLS_RTF_CLVMGF - : OOO_STRING_SVTOOLS_RTF_CLVMRG ); - - const SfxPoolItem* pItem; - if (SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState(RES_BOX, TRUE, - &pItem)) - { - OutSwTblBorder(rRTFWrt, (SvxBoxItem&)*pItem, pDefaultBox); - } - -// RTF kennt Schattierung in unserem Sinne nicht! -// if( SFX_ITEM_SET == pBoxFmt->GetAttrSet().GetItemState( -// RES_SHADOW, TRUE, &pItem ) ) -// OutSwTblShadow( rRTFWrt, *pItem ); - - if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState( - RES_BACKGROUND, TRUE, &pItem ) - || 0 != ( pItem = pCell->GetBackground() ) - || 0 != ( pItem = pRow->GetBackground() ) ) - OutSwTblBackground( rRTFWrt, (SvxBrushItem&)*pItem ); - - if( SFX_ITEM_SET == rFmt.GetAttrSet().GetItemState( - RES_VERT_ORIENT, TRUE, &pItem ) ) - switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() ) - { - case text::VertOrientation::CENTER: rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CLVERTALC; break; - case text::VertOrientation::BOTTOM: rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CLVERTALB; break; - default: rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CLVERTALT; break; - } - - const SwFmtFrmSize& rLSz = rFmt.GetFrmSize(); - nSz += rLSz.GetWidth(); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CELLX; - - nCalc = nSz; - if( bRelBoxSize ) - { - nCalc *= nPageSize; - nCalc /= nTblSz; - } - rWrt.OutLong( nTblOffset + nCalc ); - } - - // Inhalt der Boxen ausgeben - rWrt.Strm() << SwRTFWriter::sNewLine << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL; - for( nBox = 0; nBox < nBoxes; ++nBox ) - { - SwWriteTableCell * pCell = pBoxArr[nBox]; - - if( (nBox && pBoxArr[ nBox-1 ] == pBoxArr[ nBox ]) || pCell == NULL) - continue; - - if( pCell->GetRowSpan() == pRowSpans[ nBox ] ) - { - // new Box - const SwStartNode* pSttNd = pCell->GetBox()->GetSttNd(); - RTFSaveData aSaveData( rRTFWrt, - pSttNd->GetIndex()+1, pSttNd->EndOfSectionIndex() ); - rRTFWrt.bOutTable = TRUE; - rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam ); - } - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CELL; - } - - // das wars mit der Line - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ROW << OOO_STRING_SVTOOLS_RTF_PARD << ' '; - - for( nBox = 0; nBox < nColCnt; ++nBox ) - --pRowSpans[ nBox ]; - } - - delete pTableWrt; - delete[] pBoxArr; - delete[] pRowSpans; - - // Pam hinter die Tabelle verschieben - rRTFWrt.pCurPam->GetPoint()->nNode = *rNode.EndOfSectionNode(); - rRTFWrt.SetAttrSet( 0 ); - - return rWrt; -} - -Writer& OutRTF_SwSectionNode( Writer& rWrt, SwSectionNode& rNode ) -{ - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - const SwSection& rSect = rNode.GetSection(); - - // folgt dahinter noch ein SectionNode? Dann wird erst die innere - // Section aktiv. Hier wird die Verschachtelung aufgebrochen, weil - // RTF das nicht kennt - BOOL bPgDscWrite = false; - { - SwNodeIndex aIdx( rNode, 1 ); - const SwNode& rNd = aIdx.GetNode(); - if( rNd.IsSectionNode() /*&& CONTENT_SECTION == - aIdx.GetNode().GetSectionNode()->GetSection().GetType()*/ ) - return rWrt; - - // falls als erstes Position ein Content- oder Tabellen-Node steht, - // dann kann dieser einen PageDesc gesetzt haben und der muss vor - // der Bereichsbeschreibung geschrieben werden! - // Umgekehrt muss im OutBreaks dann - if( rNd.IsCntntNode() ) - { - bPgDscWrite = rRTFWrt.OutBreaks( ((SwCntntNode&)rNd).GetSwAttrSet() ); - rRTFWrt.bIgnoreNextPgBreak = TRUE; - } - else if( rNd.IsTableNode() ) - { - bPgDscWrite = rRTFWrt.OutBreaks( ((SwTableNode&)rNd).GetTable(). - GetFrmFmt()->GetAttrSet() ); - rRTFWrt.bIgnoreNextPgBreak = TRUE; - } - } - - -// if( CONTENT_SECTION == rSect.GetType() ) - { - // als fortlaufenden Abschnittwechsel heraus schreiben - if( !bPgDscWrite ) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_SECT << OOO_STRING_SVTOOLS_RTF_SBKNONE; - //JP 19.03.99 - es muss fuer den Import auf jedenfall das Cols - // Token geschrieben werden. Sonst kann nicht erkannt - // werden, wann ein PageDesc & eine Section gueltig ist - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLS << '1'; - rRTFWrt.bOutFmtAttr = TRUE; - const SfxPoolItem* pItem; - const SwFrmFmt *pFmt = rSect.GetFmt(); - ASSERT(pFmt, "Impossible"); - const SfxItemSet& rSet = pFmt->GetAttrSet(); - if( SFX_ITEM_SET == rSet.GetItemState( RES_COL, false, &pItem )) - OutRTF_SwFmtCol( rWrt, *pItem ); - else - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLS << '1' << OOO_STRING_SVTOOLS_RTF_COLSX; - rWrt.OutULong(709); - } - - if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE, - false, &pItem ) && ((SwFmtNoBalancedColumns*)pItem)->GetValue() ) - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_BALANCEDCOLUMN ) << '}'; - - if (FRMDIR_HORI_RIGHT_TOP == rRTFWrt.TrueFrameDirection(*pFmt)) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_RTLSECT; - else - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LTRSECT; - - rWrt.Strm() << SwRTFWriter::sNewLine; - } - - return rWrt; -} - - -/* File CHRATR.HXX: */ - -static Writer& OutRTF_SwFont( Writer& rWrt, const SfxPoolItem& rHt ) -{ - /* trage den Font in die Font-Liste vom Writer ein und gebe hier nur - * die entsprechende Nummer aus. Der Font wird spaeter ueber diese - * Tabelle im RTF-Dokument referenziert. - */ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - if( !rRTFWrt.bTxtAttr || - ( rRTFWrt.GetEndPosLst() && - rRTFWrt.GetEndPosLst()->MatchScriptToId( rHt.Which() ) )) - { - rRTFWrt.bOutFmtAttr = true; - const SvxFontItem&rFont = (const SvxFontItem&)rHt; - bool bAssoc = rRTFWrt.IsAssociatedFlag(); - /* - #109522# - Word is a bit of a silly bugger of a program when its comes to symbol - font useage. If a symbol font is actually being used, i.e. exported - here with bTxtAttr true then both AF and F must be set to the same - value - */ - if (rRTFWrt.bTxtAttr && (rFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL)) - { - const sal_Char* pCmd = !bAssoc ? OOO_STRING_SVTOOLS_RTF_AF : OOO_STRING_SVTOOLS_RTF_F; - rWrt.Strm() << pCmd; - } - const sal_Char* pCmd = bAssoc ? OOO_STRING_SVTOOLS_RTF_AF : OOO_STRING_SVTOOLS_RTF_F; - rWrt.Strm() << pCmd; - rWrt.OutULong(rRTFWrt.GetId(rFont)); - rRTFWrt.eCurrentEncoding = rtl_getTextEncodingFromWindowsCharset(sw::ms::rtl_TextEncodingToWinCharset(rFont.GetCharSet())); - } - return rWrt; -} - -static Writer& OutRTF_SwPosture( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - if( !rRTFWrt.bTxtAttr || - ( rRTFWrt.GetEndPosLst() && - rRTFWrt.GetEndPosLst()->MatchScriptToId( rHt.Which() ) )) - { - if (rRTFWrt.IsAssociatedFlag() && rHt.Which() == RES_CHRATR_CJK_POSTURE) - { - /* - #i21422# - Sadly in word rtf we can't retain CJK italic when we are not - exporting asian text as it doesn't have a seperate italic for - western and asian. - */ - return rWrt; - } - - const FontItalic nPosture = ((const SvxPostureItem&)rHt).GetPosture(); - int bTxtOut = rRTFWrt.bTxtAttr && ITALIC_NONE == nPosture; - if( ITALIC_NORMAL == nPosture || bTxtOut ) - { - rRTFWrt.bOutFmtAttr = TRUE; - const sal_Char* pCmd = rRTFWrt.IsAssociatedFlag() ? OOO_STRING_SVTOOLS_RTF_AI : OOO_STRING_SVTOOLS_RTF_I; - rWrt.Strm() << pCmd; - } - if( bTxtOut ) - rWrt.Strm() << '0'; // wieder abschalten - } - return rWrt; -} - - -static Writer& OutRTF_SwWeight( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bTxtAttr || - ( rRTFWrt.GetEndPosLst() && - rRTFWrt.GetEndPosLst()->MatchScriptToId( rHt.Which() ) )) - { - if (rRTFWrt.IsAssociatedFlag() && rHt.Which() == RES_CHRATR_CJK_WEIGHT) - { - /* - #i21422# - Sadly in word rtf we can't retain CJK bold when we are not - exporting asian text as it doesn't have a seperate bold for western - and asian. - */ - return rWrt; - } - - const FontWeight nBold = ((const SvxWeightItem&)rHt).GetWeight(); - int bTxtOut = rRTFWrt.bTxtAttr && WEIGHT_NORMAL == nBold; - if( WEIGHT_BOLD == nBold || bTxtOut ) - { - rRTFWrt.bOutFmtAttr = TRUE; - const sal_Char* pCmd = rRTFWrt.IsAssociatedFlag() ? OOO_STRING_SVTOOLS_RTF_AB : OOO_STRING_SVTOOLS_RTF_B; - rWrt.Strm() << pCmd; - } - if( bTxtOut ) - rWrt.Strm() << '0'; - } - return rWrt; -} - -static Writer& OutRTF_SwEmphasisMark( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const sal_Char* pStr; - switch( ((const SvxEmphasisMarkItem&)rHt).GetEmphasisMark()) - { - case EMPHASISMARK_NONE: pStr = OOO_STRING_SVTOOLS_RTF_ACCNONE; break; - case EMPHASISMARK_SIDE_DOTS: pStr = OOO_STRING_SVTOOLS_RTF_ACCCOMMA; break; - default: pStr = OOO_STRING_SVTOOLS_RTF_ACCDOT; break; - } - - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << pStr; - return rWrt; -} - -static Writer& OutRTF_SwTwoInOne( Writer& rWrt, const SfxPoolItem& rHt ) -{ - if( ((SvxTwoLinesItem&)rHt).GetValue() ) - { - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - sal_Unicode cStart = ((SvxTwoLinesItem&)rHt).GetStartBracket(); - sal_Unicode cEnd = ((SvxTwoLinesItem&)rHt).GetStartBracket(); - - USHORT nType; - if( !cStart && !cEnd ) - nType = 0; - else if( '{' == cStart || '}' == cEnd ) - nType = 4; - else if( '<' == cStart || '>' == cEnd ) - nType = 3; - else if( '[' == cStart || ']' == cEnd ) - nType = 2; - else // all other kind of brackets - nType = 1; - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TWOINONE; - rWrt.OutULong( nType ); - rRTFWrt.bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SwCharRotate( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_HORZVERT; - rWrt.OutLong( ((SvxCharRotateItem&)rHt).IsFitToLine() ? 1 : 0 ); - return rWrt; -} -static Writer& OutRTF_SwCharScaleW( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CHARSCALEX; - rWrt.OutLong( ((SvxCharScaleWidthItem&)rHt).GetValue() ); - return rWrt; -} - -static Writer& OutRTF_SwCharRelief(Writer& rWrt, const SfxPoolItem& rHt) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxCharReliefItem& rAttr = (const SvxCharReliefItem&)rHt; - const sal_Char* pStr; - switch (rAttr.GetValue()) - { - case RELIEF_EMBOSSED: - pStr = OOO_STRING_SVTOOLS_RTF_EMBO; - break; - case RELIEF_ENGRAVED: - pStr = OOO_STRING_SVTOOLS_RTF_IMPR; - break; - default: - pStr = 0; - break; - } - - if (pStr) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << pStr; - } - return rWrt; -} - - -static Writer& OutRTF_SwChrBckgrnd( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxBrushItem& rBack = (const SvxBrushItem&)rHt; - if( !rBack.GetColor().GetTransparency() ) - { - ByteString sOut( OOO_STRING_SVTOOLS_RTF_CHCBPAT ); - sOut += ByteString::CreateFromInt32( - rRTFWrt.GetId( rBack.GetColor() )); - - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << sOut.GetBuffer(); - } - return rWrt; -} - -static Writer& OutRTF_SwShadowed( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const BOOL bShadow = ((const SvxShadowedItem&)rHt).GetValue(); - int bTxtOut = rRTFWrt.bTxtAttr && !bShadow; - if( bShadow || bTxtOut ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_SHAD; - } - if( bTxtOut ) - rWrt.Strm() << '0'; - return rWrt; -} - - - -static Writer& OutRTF_SwContour( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const BOOL bContour = ((const SvxContourItem&)rHt).GetValue(); - int bTxtOut = rRTFWrt.bTxtAttr && !bContour; - if( bContour || bTxtOut ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_OUTL; - } - if( bTxtOut ) - rWrt.Strm() << '0'; - return rWrt; -} - -static Writer& OutRTF_SwCrossedOut( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const FontStrikeout nStrike = ((const SvxCrossedOutItem&)rHt).GetStrikeout(); - int bTxtOut = rRTFWrt.bTxtAttr && STRIKEOUT_NONE == nStrike; - - if( (STRIKEOUT_NONE != nStrike && STRIKEOUT_DONTKNOW != nStrike) || bTxtOut ) - { - rRTFWrt.bOutFmtAttr = TRUE; - if( STRIKEOUT_DOUBLE == nStrike ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_STRIKED; - if( !bTxtOut ) - rWrt.Strm() << '1'; - } - else - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_STRIKE; - } - if( bTxtOut ) - rWrt.Strm() << '0'; - return rWrt; -} - - - -static Writer& OutRTF_SwCaseMap( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - switch( ((const SvxCaseMapItem&)rHt).GetValue() ) - { - case SVX_CASEMAP_KAPITAELCHEN: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_SCAPS; - break; - - case SVX_CASEMAP_VERSALIEN: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CAPS; - break; - - case SVX_CASEMAP_NOT_MAPPED: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CAPS << '0' << OOO_STRING_SVTOOLS_RTF_SCAPS << '0'; // beide aus !! - break; - - default: - return rWrt; - } - - rRTFWrt.bOutFmtAttr = TRUE; - return rWrt; -} - - -static Writer& OutRTF_SwUnderline( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const char* pStr = 0; - switch( ((const SvxUnderlineItem&)rHt).GetLineStyle() ) - { - case UNDERLINE_SINGLE: - pStr = OOO_STRING_SVTOOLS_RTF_UL; - break; - case UNDERLINE_DOUBLE: - pStr = OOO_STRING_SVTOOLS_RTF_ULDB; - break; - case UNDERLINE_NONE: - pStr = OOO_STRING_SVTOOLS_RTF_ULNONE; - break; - case UNDERLINE_DOTTED: - pStr = OOO_STRING_SVTOOLS_RTF_ULD; - break; - case UNDERLINE_DASH: - pStr = OOO_STRING_SVTOOLS_RTF_ULDASH; - break; - case UNDERLINE_DASHDOT: - pStr = OOO_STRING_SVTOOLS_RTF_ULDASHD; - break; - case UNDERLINE_DASHDOTDOT: - pStr = OOO_STRING_SVTOOLS_RTF_ULDASHDD; - break; - case UNDERLINE_BOLD: - pStr = OOO_STRING_SVTOOLS_RTF_ULTH; - break; - case UNDERLINE_WAVE: - pStr = OOO_STRING_SVTOOLS_RTF_ULWAVE; - break; - case UNDERLINE_BOLDDOTTED: - pStr = OOO_STRING_SVTOOLS_RTF_ULTHD; - break; - case UNDERLINE_BOLDDASH: - pStr = OOO_STRING_SVTOOLS_RTF_ULTHDASH; - break; - case UNDERLINE_LONGDASH: - pStr = OOO_STRING_SVTOOLS_RTF_ULLDASH; - break; - case UNDERLINE_BOLDLONGDASH: - pStr = OOO_STRING_SVTOOLS_RTF_ULTHLDASH; - break; - case UNDERLINE_BOLDDASHDOT: - pStr = OOO_STRING_SVTOOLS_RTF_ULTHDASHD; - break; - case UNDERLINE_BOLDDASHDOTDOT: - pStr = OOO_STRING_SVTOOLS_RTF_ULTHDASHDD; - break; - case UNDERLINE_BOLDWAVE: - pStr = OOO_STRING_SVTOOLS_RTF_ULHWAVE; - break; - case UNDERLINE_DOUBLEWAVE: - pStr = OOO_STRING_SVTOOLS_RTF_ULULDBWAVE; - break; - default: - break; - } - - if( pStr ) - { - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - if( UNDERLINE_SINGLE == ((const SvxUnderlineItem&)rHt).GetLineStyle() - && ((SvxWordLineModeItem&)rRTFWrt.GetItem( - RES_CHRATR_WORDLINEMODE )).GetValue() ) - pStr = OOO_STRING_SVTOOLS_RTF_ULW; - - rRTFWrt.Strm() << pStr; - rRTFWrt.bOutFmtAttr = TRUE; - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ULC; - rWrt.OutULong( rRTFWrt.GetId(((const SvxUnderlineItem&)rHt).GetColor()) ); - - } - - return rWrt; -} - - - -static Writer& OutRTF_SwOverline( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const char* pStr = 0; - switch( ((const SvxOverlineItem&)rHt).GetLineStyle() ) - { - case UNDERLINE_SINGLE: - pStr = OOO_STRING_SVTOOLS_RTF_OL; - break; - case UNDERLINE_DOUBLE: - pStr = OOO_STRING_SVTOOLS_RTF_OLDB; - break; - case UNDERLINE_NONE: - pStr = OOO_STRING_SVTOOLS_RTF_OLNONE; - break; - case UNDERLINE_DOTTED: - pStr = OOO_STRING_SVTOOLS_RTF_OLD; - break; - case UNDERLINE_DASH: - pStr = OOO_STRING_SVTOOLS_RTF_OLDASH; - break; - case UNDERLINE_DASHDOT: - pStr = OOO_STRING_SVTOOLS_RTF_OLDASHD; - break; - case UNDERLINE_DASHDOTDOT: - pStr = OOO_STRING_SVTOOLS_RTF_OLDASHDD; - break; - case UNDERLINE_BOLD: - pStr = OOO_STRING_SVTOOLS_RTF_OLTH; - break; - case UNDERLINE_WAVE: - pStr = OOO_STRING_SVTOOLS_RTF_OLWAVE; - break; - case UNDERLINE_BOLDDOTTED: - pStr = OOO_STRING_SVTOOLS_RTF_OLTHD; - break; - case UNDERLINE_BOLDDASH: - pStr = OOO_STRING_SVTOOLS_RTF_OLTHDASH; - break; - case UNDERLINE_LONGDASH: - pStr = OOO_STRING_SVTOOLS_RTF_OLLDASH; - break; - case UNDERLINE_BOLDLONGDASH: - pStr = OOO_STRING_SVTOOLS_RTF_OLTHLDASH; - break; - case UNDERLINE_BOLDDASHDOT: - pStr = OOO_STRING_SVTOOLS_RTF_OLTHDASHD; - break; - case UNDERLINE_BOLDDASHDOTDOT: - pStr = OOO_STRING_SVTOOLS_RTF_OLTHDASHDD; - break; - case UNDERLINE_BOLDWAVE: - pStr = OOO_STRING_SVTOOLS_RTF_OLHWAVE; - break; - case UNDERLINE_DOUBLEWAVE: - pStr = OOO_STRING_SVTOOLS_RTF_OLOLDBWAVE; - break; - default: - break; - } - - if( pStr ) - { - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if ( rRTFWrt.bNonStandard ) - { - if( UNDERLINE_SINGLE == ((const SvxOverlineItem&)rHt).GetLineStyle() - && ((SvxWordLineModeItem&)rRTFWrt.GetItem( - RES_CHRATR_WORDLINEMODE )).GetValue() ) - pStr = OOO_STRING_SVTOOLS_RTF_OLW; - - rRTFWrt.Strm() << pStr; - rRTFWrt.bOutFmtAttr = TRUE; - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_OLC; - rWrt.OutULong( rRTFWrt.GetId(((const SvxOverlineItem&)rHt).GetColor()) ); - } - - } - - return rWrt; -} - - - -static Writer& OutRTF_SwLanguage( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bTxtAttr || - ( rRTFWrt.GetEndPosLst() && - rRTFWrt.GetEndPosLst()->MatchScriptToId( rHt.Which() ) )) - { - - rRTFWrt.bOutFmtAttr = TRUE; - const sal_Char* p = RES_CHRATR_CJK_LANGUAGE == rHt.Which() - ? OOO_STRING_SVTOOLS_RTF_LANGFE : OOO_STRING_SVTOOLS_RTF_LANG; - rWrt.Strm() << p; - rWrt.OutULong( ((const SvxLanguageItem&)rHt).GetLanguage() ); - } - return rWrt; -} - - - -static Writer& OutRTF_SwEscapement( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxEscapementItem& rEsc = (const SvxEscapementItem&)rHt; - const char * pUpDn; - - SwTwips nH = ((SvxFontHeightItem&)rRTFWrt.GetItem( - RES_CHRATR_FONTSIZE )).GetHeight(); - - if( 0 < rEsc.GetEsc() ) - pUpDn = OOO_STRING_SVTOOLS_RTF_UP; - else if( 0 > rEsc.GetEsc() ) - { - pUpDn = OOO_STRING_SVTOOLS_RTF_DN; - nH = -nH; // den negativen Wert herrausrechnen - } - else - return rWrt; - - // prozentuale Veraenderung speichern ! - short nEsc = rEsc.GetEsc(); - short nProp = rEsc.GetProp() * 100; - if( DFLT_ESC_AUTO_SUPER == nEsc ) - { - nEsc = 100 - rEsc.GetProp(); - ++nProp; - } - else if( DFLT_ESC_AUTO_SUB == nEsc ) - { - nEsc = - 100 + rEsc.GetProp(); - ++nProp; - } - - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_UPDNPROP, TRUE ); - rWrt.OutULong( nProp ) << '}' << pUpDn; - - /* - * berechne aus der akt. FontSize und dem ProzentWert die Verschiebung, - * wobei im RTF File 1/2 Points stehen muessen, waehrend intern - * mit Twips gerechnet wird. - * Formel : (FontSize * 1/20 ) pts x * 2 - * ----------------------- = ------------ - * 100% Escapement - */ - - rWrt.OutULong( ( (long( nEsc ) * nH) + 500L ) / 1000L ); - // 500L zum Aufrunden !! - return rWrt; -} - - - -static Writer& OutRTF_SwSize( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bTxtAttr || - ( rRTFWrt.GetEndPosLst() && - rRTFWrt.GetEndPosLst()->MatchScriptToId( rHt.Which() ) )) - { - if ( - rRTFWrt.IsAssociatedFlag() && - rHt.Which() == RES_CHRATR_CJK_FONTSIZE - ) - { - /* - #i21422# - Sadly in word rtf we can't retain CJK fontsize when we are not - exporting asian text as it doesn't have a seperate fontsize for - western and asian. - */ - return rWrt; - } - - rRTFWrt.bOutFmtAttr = TRUE; - - const sal_Char* pCmd = rRTFWrt.IsAssociatedFlag() ? OOO_STRING_SVTOOLS_RTF_AFS : OOO_STRING_SVTOOLS_RTF_FS; - rWrt.Strm() << pCmd; - rWrt.OutULong( ((const SvxFontHeightItem&)rHt).GetHeight() / 10 ); - } - return rWrt; -} - - - -static Writer& OutRTF_SwColor( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - /* trage die Color in die Color-Liste vom Writer ein und gebe hier nur - * die entsprechende Nummer aus. Die Color wird spaeter ueber diese - * Tabelle im RTF-Dokument referenziert. - */ - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CF; - rWrt.OutULong( rRTFWrt.GetId( ((const SvxColorItem&)rHt).GetValue() )); - return rWrt; -} - -static Writer& OutRTF_SvxCharHiddenItem(Writer& rWrt, const SfxPoolItem& rHt) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - rRTFWrt.bOutFmtAttr = true; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_V; - if (!((const SvxCharHiddenItem&)rHt).GetValue()) - rWrt.OutULong(0); - return rWrt; -} - -extern void sw3io_ConvertToOldField( const SwField* pFld, USHORT& rWhich, - ULONG& rFmt, ULONG nFFVersion ); - -static Writer& OutRTF_SwField( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwFmtFld & rFld = (SwFmtFld&)rHt; - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - const SwField* pFld = rFld.GetFld(); - - ByteString aFldStt( '{' ); - ((((aFldStt += OOO_STRING_SVTOOLS_RTF_FIELD) += '{' ) += OOO_STRING_SVTOOLS_RTF_IGNORE) += OOO_STRING_SVTOOLS_RTF_FLDINST) += ' '; - switch( pFld->GetTyp()->Which() ) - { - case RES_COMBINED_CHARS: - { - /* - We need a font size to fill in the defaults, if these are overridden - (as they generally are) by character properties then those properties - win. - - The fontsize that is used in MS for determing the defaults is always - the CJK fontsize even if the text is not in that language, in OOo the - largest fontsize used in the field is the one we should take, but - whatever we do, word will actually render using the fontsize set for - CJK text. Nevertheless we attempt to guess whether the script is in - asian or western text based up on the first character and use the - font size of that script as our default. - */ - const String& rFldPar1 = pFld->GetPar1(); - USHORT nScript; - if( pBreakIt->GetBreakIter().is() ) - nScript = pBreakIt->GetBreakIter()->getScriptType( rFldPar1, 0); - else - nScript = i18n::ScriptType::ASIAN; - - long nHeight = ((SvxFontHeightItem&)rRTFWrt.GetItem( - GetWhichOfScript(RES_CHRATR_FONTSIZE, nScript ))).GetHeight(); - nHeight = (nHeight + 10) / 20; //Font Size in points; - - /* - Divide the combined char string into its up and down part. Get the - font size and fill in the defaults as up == half the font size and - down == a fifth the font size - */ - xub_StrLen nAbove = (rFldPar1.Len()+1)/2; - rWrt.Strm() << aFldStt.GetBuffer() << "EQ \\\\o (\\\\s\\\\up "; - rWrt.OutLong( nHeight/2 ) << '('; - RTFOutFuncs::Out_String( rWrt.Strm(), rFldPar1.Copy(0,nAbove), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - rWrt.Strm() << "), \\\\s\\\\do "; - rWrt.OutLong( nHeight/5 ) << '('; - RTFOutFuncs::Out_String( rWrt.Strm(), rFldPar1.Copy( nAbove ), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ) - << "))"; - } - break; - - case RES_DBFLD: - aFldStt += "MERGEFIELD "; - // kein break !! - case RES_USERFLD: - rWrt.Strm() << aFldStt.GetBuffer(); - RTFOutFuncs::Out_String( rWrt.Strm(), pFld->GetTyp()->GetName(), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - break; - case RES_GETREFFLD: - { - BYTE nFldTyp = 0; - rWrt.Strm() << aFldStt.GetBuffer() << " REF "; - const SwGetRefField& rRFld = *(SwGetRefField*)pFld; - switch( pFld->GetSubType() ) - { - case REF_SETREFATTR: - case REF_BOOKMARK: - RTFOutFuncs::Out_String( rWrt.Strm(), rRFld.GetSetRefName(), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - nFldTyp = 3; - break; - } - - if( nFldTyp ) - { - switch( pFld->GetFormat() ) - { - case REF_PAGE_PGDESC: - case REF_PAGE: - rWrt.Strm() << "SEITEN"; - nFldTyp = 37; - break; - case REF_UPDOWN: - rWrt.Strm() << " \\p"; - nFldTyp = 3; - break; - case REF_CHAPTER: - rWrt.Strm() << " \\n"; - break; - case REF_ONLYNUMBER: - case REF_ONLYCAPTION: - case REF_ONLYSEQNO: - break; - // default: - // case REF_CONTENT: - } - rWrt.Strm() << " \\\\h "; // insert hyperlink - } - } - break; -// case RES_CHAPTERFLD: -// rWrt.Strm() << ' '; -// break; - case RES_PAGENUMBERFLD: - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\page"; - { - char __READONLY_DATA - sNType0[] = "ALPHABETIC", /* CHARS_UPPER_LETTER*/ - sNType1[] = "alphabetic", /* CHARS_LOWER_LETTER*/ - sNType2[] = "ROMAN", /* ROMAN_UPPER */ - sNType3[] = "roman", /* ROMAN_LOWER */ - sNType4[] = "ARABIC"; /* ARABIC */ - - const char* pFmtStr = 0; - switch( pFld->GetFormat() ) - { - case SVX_NUM_CHARS_UPPER_LETTER: - case SVX_NUM_CHARS_UPPER_LETTER_N: pFmtStr = sNType0; break; - case SVX_NUM_CHARS_LOWER_LETTER: - case SVX_NUM_CHARS_LOWER_LETTER_N: pFmtStr = sNType1; break; - case SVX_NUM_ROMAN_UPPER: pFmtStr = sNType2; break; - case SVX_NUM_ROMAN_LOWER: pFmtStr = sNType3; break; - case SVX_NUM_ARABIC: pFmtStr = sNType4; break; - } - - if( pFmtStr ) - rWrt.Strm() << "\\\\* " << pFmtStr; - } - break; - case RES_FILENAMEFLD: - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\filename "; - break; - case RES_DBNAMEFLD: - { - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\data "; - SwDBData aData = rWrt.pDoc->GetDBData(); - String sOut(aData.sDataSource); - sOut += DB_DELIM; - sOut += (String)aData.sCommand; - RTFOutFuncs::Out_String( rWrt.Strm(), sOut, - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - } - break; - case RES_AUTHORFLD: - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\author "; - break; - - case RES_HIDDENTXTFLD: - if( TYP_CONDTXTFLD == ((SwHiddenTxtField*)pFld)->GetSubType() ) - RTFOutFuncs::Out_String( rWrt.Strm(), - pFld->ExpandField(rWrt.pDoc->IsClipBoard()), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - else - { - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_V << ' '; - OutRTF_AsByteString( rWrt, pFld->GetPar2(), rRTFWrt.eDefaultEncoding ).Strm() - << '}' << SwRTFWriter::sNewLine; - } - return rWrt; // nicht bis zum Ende, kein RTF-Feld !! - - case RES_DATETIMEFLD: - if (!(pFld->GetSubType() & FIXEDFLD)) - { - USHORT nWhich = RES_DATETIMEFLD; - ULONG nFmt = pFld->GetFormat(); - sw3io_ConvertToOldField(pFld, nWhich, nFmt, SOFFICE_FILEFORMAT_40 ); - if (pFld->GetSubType() & DATEFLD) - { - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\date \\\\@\""; - switch( nFmt ) - { - case DF_SSYS: rWrt.Strm() << "tt.MM.yy"; break; - case DF_LSYS: rWrt.Strm() << "tttt, t. MMMM yyyy"; break; - case DF_SHORT: rWrt.Strm() << "tt.MM.yy"; break; - case DF_SCENT: rWrt.Strm() << "tt.MM.yyyy"; break; - case DF_LMON: rWrt.Strm() << "t. MMM yyyy"; break; - case DF_LMONTH: rWrt.Strm() << "t. MMMM yyyy"; break; - case DF_LDAYMON: rWrt.Strm() << "ttt, t. MMMM yyyy"; break; - case DF_LDAYMONTH: rWrt.Strm() << "tttt, t. MMMM yyyy"; break; - } - } - else - { - rWrt.Strm() << aFldStt.GetBuffer() << "\\\\date \\\\@\""; - switch( nFmt ) - { - case TF_SSMM_24: rWrt.Strm() << "HH:mm"; break; - case TF_SSMM_12: rWrt.Strm() << "hh:mm"; break; // ??? - case TF_SYSTEM: rWrt.Strm() << "HH:mm"; break; - } - } - rWrt.Strm() << '\"'; - break; - } - // Kein break: in default-Zweig laufen! - - default: - { - aFldStt.Erase(); - - // JP 20.07.95: warum nicht das Expandierte rausschreiben ? - sal_Char cCh; - rWrt.Strm().SeekRel(-1); - rWrt.Strm() >> cCh; - if( ' ' != cCh ) // vorweg immer einen Trenner - rWrt.Strm() << ' '; - RTFOutFuncs::Out_String( rWrt.Strm(), - pFld->ExpandField(rWrt.pDoc->IsClipBoard()), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - } - break; - } - - if( aFldStt.Len() ) - { - rWrt.Strm() << "}{" << OOO_STRING_SVTOOLS_RTF_FLDRSLT << ' '; - RTFOutFuncs::Out_String( rWrt.Strm(), - pFld->ExpandField(rWrt.pDoc->IsClipBoard()), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - rWrt.Strm() << "}}"; - rRTFWrt.bOutFmtAttr = FALSE; - } - - return rWrt; -} - -static Writer& OutRTF_SwFlyCntnt( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwFrmFmt* pFmt = ((SwFmtFlyCnt&)rHt).GetFrmFmt(); - if (RES_DRAWFRMFMT != pFmt->Which()) - { - ((SwRTFWriter&)rWrt).OutRTFFlyFrms( *((SwFlyFrmFmt*)pFmt) ); - ((SwRTFWriter&)rWrt).bOutFmtAttr = false; - } - return rWrt; -} - -static Writer& OutRTF_SwFtn( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtFtn& rFtn = (const SwFmtFtn&)rHt; - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - do { // middle-check-loop - if( !rFtn.GetTxtFtn() || !rFtn.GetTxtFtn()->GetStartNode() ) - break; // es gibt keine Kopf-/Fusszeile/Fussnote - - // Hole vom Node und vom letzten Node die Position in der Section - ULONG nStart = rFtn.GetTxtFtn()->GetStartNode()->GetIndex()+1, - nEnd = rWrt.pDoc->GetNodes()[ nStart-1 ]->EndOfSectionIndex(); - - // kein Bereich also kein gueltiger Node - if( nStart >= nEnd ) - break; - - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_SUPER << ' '; - if( !rFtn.GetNumStr().Len() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_CHFTN; - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_FOOTNOTE ); - if( rFtn.IsEndNote() ) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FTNALT; - rWrt.Strm() << ' ' << OOO_STRING_SVTOOLS_RTF_CHFTN; - } - else - { - OutRTF_AsByteString( rWrt, rFtn.GetNumStr(), rRTFWrt.eDefaultEncoding ); - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_FOOTNOTE ); - if( rFtn.IsEndNote() ) - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FTNALT; - rWrt.Strm() << ' '; - OutRTF_AsByteString( rWrt, rFtn.GetNumStr(), rRTFWrt.eDefaultEncoding ); - } - RTFSaveData aSaveData( rRTFWrt, nStart, nEnd ); - // damit kein \par ausgegeben wird !! - rRTFWrt.pCurPam->GetMark()->nContent++; - rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam ); - - rWrt.Strm() << "}}" << SwRTFWriter::sNewLine; - rRTFWrt.bOutFmtAttr = FALSE; - - } while( FALSE ); - return rWrt; -} - -static Writer& OutRTF_SwTxtCharFmt( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtCharFmt& rChrFmt = (const SwFmtCharFmt&)rHt; - const SwCharFmt* pFmt = rChrFmt.GetCharFmt(); - - if( pFmt ) - OutRTF_SwFmt( rWrt, *pFmt ); - return rWrt; -} - -static Writer& OutRTF_SwTxtAutoFmt( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtAutoFmt& rAutoFmt = (const SwFmtAutoFmt&)rHt; - const boost::shared_ptr<SfxItemSet> pSet = rAutoFmt.GetStyleHandle(); - - if( pSet.get() ) - { - SwRTFWriter & rRTFWrt = (SwRTFWriter&)rWrt; - OutRTF_SfxItemSet( rRTFWrt, *pSet.get(), FALSE ); - } - return rWrt; -} - -static Writer& OutRTF_SwTxtRuby( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SwFmtRuby& rRuby = (const SwFmtRuby&)rHt; - const SwTxtRuby* pRubyTxt = rRuby.GetTxtRuby(); - const SwTxtNode* pNd; - - if( !pRubyTxt || 0 == (pNd = pRubyTxt->GetpTxtNode() )) - return rWrt; - - sal_Char cDirective = 0, cJC = '0'; - switch( rRuby.GetAdjustment() ) - { - case 0: cJC = '3'; cDirective = 'l'; break; - case 2: cJC = '4'; cDirective = 'r'; break; - case 3: cJC = '1'; cDirective = 'd'; break; - case 4: cJC = '2'; cDirective = 'd'; break; - case 1: break; //defaults to 0 - default: - ASSERT( FALSE, "Unhandled Ruby justication code" ); - break; - } - - /* - MS needs to know the name and size of the font used in the ruby item, - but we coud have written it in a mixture of asian and western - scripts, and each of these can be a different font and size than the - other, so we make a guess based upon the first character of the text, - defaulting to asian. - */ - USHORT nScript; - if( pBreakIt->GetBreakIter().is() ) - nScript = pBreakIt->GetBreakIter()->getScriptType( rRuby.GetText(), 0); - else - nScript = i18n::ScriptType::ASIAN; - - const SwCharFmt* pFmt = pRubyTxt->GetCharFmt(); - const SvxFontItem *pFont; - long nHeight; - - if( pFmt ) - { - const SwAttrSet& rSet = pFmt->GetAttrSet(); - pFont = &(const SvxFontItem&)rSet.Get( GetWhichOfScript( - RES_CHRATR_FONT, nScript )); - - nHeight = ((SvxFontHeightItem&)rSet.Get( - GetWhichOfScript( RES_CHRATR_FONTSIZE, nScript ))).GetHeight(); - } - else - { - /*Get document defaults if no formatting on ruby text*/ - const SfxItemPool *pPool = pNd->GetSwAttrSet().GetPool(); - pFont = &(const SvxFontItem&)pPool->GetDefaultItem( - GetWhichOfScript( RES_CHRATR_FONT, nScript )); - - nHeight = ((SvxFontHeightItem&)pPool->GetDefaultItem( - GetWhichOfScript( RES_CHRATR_FONTSIZE, nScript ))).GetHeight(); - } - ( nHeight += 5 ) /= 10; - - // don't change " EQ " to any other without changing the code in RTFFLD.CXX - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_FIELD << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE << OOO_STRING_SVTOOLS_RTF_FLDINST - << " EQ \\\\* jc" << cJC - << " \\\\* \"Font:"; - RTFOutFuncs::Out_String( rWrt.Strm(), pFont->GetFamilyName(), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - rWrt.Strm() << "\" \\\\* hps"; - rWrt.OutLong( nHeight ); - rWrt.Strm() << " \\\\o"; - if( cDirective ) - rWrt.Strm() << "\\\\a" << cDirective; - rWrt.Strm() << "(\\\\s\\\\up "; - - if( pBreakIt->GetBreakIter().is() ) - nScript = pBreakIt->GetBreakIter()->getScriptType( pNd->GetTxt(), - *pRubyTxt->GetStart() ); - else - nScript = i18n::ScriptType::ASIAN; - - const SwAttrSet& rSet = pNd->GetSwAttrSet(); - nHeight = ((SvxFontHeightItem&)rSet.Get( - GetWhichOfScript( RES_CHRATR_FONTSIZE, nScript ))).GetHeight(); - (nHeight += 10) /= 20-1; - rWrt.OutLong( nHeight ) << '('; - - if( pFmt ) - { - rWrt.Strm() << '{'; - OutRTF_SwFmt( rWrt, *pFmt ); - if( rRTFWrt.bOutFmtAttr ) - rWrt.Strm() << ' '; - } - RTFOutFuncs::Out_String( rWrt.Strm(), rRuby.GetText(), - rRTFWrt.eDefaultEncoding, rRTFWrt.bWriteHelpFmt ); - if( pFmt ) - rWrt.Strm() << '}'; - - rWrt.Strm() << "),"; - rRTFWrt.bOutFmtAttr = FALSE; - - return rWrt; -} - - -/* File FRMATR.HXX */ - -static Writer& OutRTF_SwFrmSize( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SwFmtFrmSize& rSz = (const SwFmtFrmSize&)rHt; - if( rRTFWrt.pFlyFmt ) // wird das FlyFrmFmt ausgegeben ? - { - if( !rRTFWrt.bRTFFlySyntax ) - return rWrt; - - if( rSz.GetWidth() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ABSW; - rWrt.OutLong( rSz.GetWidth() ); - rRTFWrt.bOutFmtAttr = TRUE; - } - - if( rSz.GetHeight() ) - { - long nH = rSz.GetHeight(); - if( ATT_FIX_SIZE == rSz.GetHeightSizeType() ) - nH = -nH; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ABSH; - rWrt.OutLong( nH ); - rRTFWrt.bOutFmtAttr = TRUE; - } - } - else if( rRTFWrt.bOutPageDesc ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PGWSXN; - rWrt.OutLong( rSz.GetWidth() ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_PGHSXN; - rWrt.OutLong( rSz.GetHeight() ); - rRTFWrt.bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SwFmtLRSpace( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxLRSpaceItem & rLR = (const SvxLRSpaceItem&) rHt; - if( !rRTFWrt.pFlyFmt ) - { - if( rRTFWrt.bOutPageDesc ) - { - if( rLR.GetLeft() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_MARGLSXN; - rWrt.OutLong( rLR.GetLeft() ); - rRTFWrt.bOutFmtAttr = TRUE; - } - if( rLR.GetRight() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_MARGRSXN; - rWrt.OutLong( rLR.GetRight() ); - rRTFWrt.bOutFmtAttr = TRUE; - } - } - else - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LI; - rWrt.OutLong( rLR.GetTxtLeft() ) << OOO_STRING_SVTOOLS_RTF_RI; - rWrt.OutLong( rLR.GetRight() ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LIN; - rWrt.OutLong( rLR.GetTxtLeft() ) << OOO_STRING_SVTOOLS_RTF_RIN; - rWrt.OutLong( rLR.GetRight() ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FI; - rWrt.OutLong( rLR.GetTxtFirstLineOfst() ); - } - } - else if( rLR.GetLeft() == rLR.GetRight() && rRTFWrt.bRTFFlySyntax ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_DFRMTXTX; - rWrt.OutLong( rLR.GetLeft() ); - } - return rWrt; -} - -static Writer& OutRTF_SwFmtULSpace( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxULSpaceItem & rUL = (const SvxULSpaceItem&) rHt; - if( rRTFWrt.pFlyFmt ) - { - if( rUL.GetUpper() == rUL.GetLower() && rRTFWrt.bRTFFlySyntax ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_DFRMTXTY; - rWrt.OutLong( rUL.GetLower() ); - } - } - else - { - const char* p; - USHORT nValue = rUL.GetUpper(); - if( rRTFWrt.bOutPageDesc ) - { - p = OOO_STRING_SVTOOLS_RTF_MARGTSXN; - if( !rRTFWrt.bOutPageDescTbl ) - { - SwRect aRect; - const SwFmtHeader* pHdr; - if( SFX_ITEM_SET == rRTFWrt.pAktPageDesc->GetMaster(). - GetItemState( RES_HEADER, FALSE, - (const SfxPoolItem**)&pHdr ) && pHdr->IsActive() ) - { - aRect = pHdr->GetHeaderFmt()->FindLayoutRect( FALSE ); - if( aRect.Height() ) - nValue = nValue + static_cast< USHORT >(aRect.Height()); - else - { - const SwFmtFrmSize& rSz = pHdr->GetHeaderFmt()->GetFrmSize(); - if( ATT_VAR_SIZE != rSz.GetHeightSizeType() ) - nValue = nValue + static_cast< USHORT >(rSz.GetHeight()); - else - nValue = nValue + 274; // defaulten fuer 12pt Schrift - nValue = nValue + pHdr->GetHeaderFmt()->GetULSpace().GetLower(); - } - } - } - } - else - p = OOO_STRING_SVTOOLS_RTF_SB; - - if( rRTFWrt.bOutPageDesc || nValue ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << p; - rWrt.OutLong( nValue ); - } - - - nValue = rUL.GetLower(); - if( rRTFWrt.bOutPageDesc ) - { - p = OOO_STRING_SVTOOLS_RTF_MARGBSXN; - if( !rRTFWrt.bOutPageDescTbl ) - { - SwRect aRect; - const SwFmtFooter* pFtr; - if( SFX_ITEM_SET == rRTFWrt.pAktPageDesc->GetMaster(). - GetItemState( RES_FOOTER, FALSE, - (const SfxPoolItem**)&pFtr ) && pFtr->IsActive() ) - { - aRect = pFtr->GetFooterFmt()->FindLayoutRect( FALSE ); - if( aRect.Height() ) - nValue = nValue + static_cast< USHORT >(aRect.Height()); - else - { - const SwFmtFrmSize& rSz = pFtr->GetFooterFmt()->GetFrmSize(); - if( ATT_VAR_SIZE != rSz.GetHeightSizeType() ) - nValue = nValue + static_cast< USHORT >(rSz.GetHeight()); - else - nValue += 274; // defaulten fuer 12pt Schrift - nValue = nValue + pFtr->GetFooterFmt()->GetULSpace().GetUpper(); - } - } - } - } - else - p = OOO_STRING_SVTOOLS_RTF_SA; - - if( rRTFWrt.bOutPageDesc || nValue ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << p; - rWrt.OutLong( nValue ); - } - } - return rWrt; -} - -// Header-Footer werden auch vom RTF-Writer direkt gerufen, also kein static! - - -Writer& OutRTF_SwFmtHeader( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtHeader& rHd = (const SwFmtHeader&)rHt; - if( !rHd.IsActive() ) // nicht aktiv, dann nichts weiter ausgeben - return rWrt; - - // hole einen Node zu dem Request - SwStartNode *pSttNode = 0; - const SwFmtCntnt& rCntnt = rHd.GetHeaderFmt()->GetCntnt(); - if( rCntnt.GetCntntIdx() ) - pSttNode = rCntnt.GetCntntIdx()->GetNode().GetStartNode(); - - do { // middle-check-loop - if( !pSttNode ) - break; // es gibt keine Kopf-/Fusszeile/Fussnote - - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - // Hole vom Node und vom letzten Node die Position in der Section - ULONG nStart = pSttNode->GetIndex() + 1, - nEnd = pSttNode->EndOfSectionIndex(); - - // kein Bereich also kein gueltiger Node - if( nStart >= nEnd ) - break; - ASSERT( rRTFWrt.pAktPageDesc, "Header-Attribut ohne PageDesc" ); - - const sal_Char * pHdNm = OOO_STRING_SVTOOLS_RTF_HEADER; - rWrt.Strm() << pHdNm << 'y'; - if( rRTFWrt.bOutPageDescTbl ) - { - // hole die Ober-/Unterkanten vom Header - const SvxULSpaceItem& rUL = rHd.GetHeaderFmt()->GetULSpace(); - const SvxLRSpaceItem& rLR = rHd.GetHeaderFmt()->GetLRSpace(); - const SwFmtFrmSize& rSz = rHd.GetHeaderFmt()->GetFrmSize(); - - rWrt.OutLong( rUL.GetUpper() ); - OutComment( rWrt, pHdNm ) << "yb"; - rWrt.OutLong( rUL.GetLower() ) << pHdNm << "xl"; - rWrt.OutLong( rLR.GetLeft() ) << pHdNm << "xr"; - rWrt.OutLong( rLR.GetRight() ) << pHdNm << "yh"; - rWrt.OutLong( ATT_FIX_SIZE == rSz.GetHeightSizeType() - ? -rSz.GetHeight() - : rSz.GetHeight() ) << '}'; - } - else - rWrt.OutLong( rRTFWrt.pAktPageDesc->GetMaster(). - GetULSpace().GetUpper() ); - - // wird nicht die PageDesc-Tabelle ausgegeben und gibt es einen - // Nachfolger, dann handelt es sich um die "1.Seite" nach RTF. - sal_Char cTyp = 0; - if( rRTFWrt.pAktPageDesc->GetFollow() && - rRTFWrt.pAktPageDesc->GetFollow() != rRTFWrt.pAktPageDesc ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TITLEPG; //i13107 - cTyp = 'f'; // dann FirstPage-Header - } - else if( !rRTFWrt.pAktPageDesc->IsHeaderShared() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FACINGP; //i13107 - cTyp = rRTFWrt.bOutLeftHeadFoot ? 'l' : 'r'; - } - - rWrt.Strm() << '{'<< pHdNm; - if( cTyp ) rWrt.Strm() << cTyp; - rWrt.Strm() << ' '; - - { - RTFSaveData aSaveData( rRTFWrt, nStart, nEnd ); - rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam ); - } - - rWrt.Strm() << '}' << SwRTFWriter::sNewLine; - - } while( FALSE ); - return rWrt; -} -// Header-Footer werden auch vom RTF-Writer direkt gerufen, also kein static! - - -Writer& OutRTF_SwFmtFooter( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtFooter& rFt = (const SwFmtFooter&)rHt; - if( !rFt.IsActive() ) // nicht aktiv, dann nichts weiter ausgeben - return rWrt; - - SwStartNode *pSttNode = 0; - const SwFmtCntnt& rCntnt = rFt.GetFooterFmt()->GetCntnt(); - if( rCntnt.GetCntntIdx() ) - pSttNode = rCntnt.GetCntntIdx()->GetNode().GetStartNode(); - - do { // middle-check-loop - if( !pSttNode ) - break; // es gibt keine Kopf-/Fusszeile/Fussnote - - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - // Hole vom Node und vom letzten Node die Position in der Section - ULONG nStart = pSttNode->GetIndex()+1, - nEnd = pSttNode->EndOfSectionIndex(); - - // kein Bereich also kein gueltiger Node - if( nStart >= nEnd ) - break; - ASSERT( rRTFWrt.pAktPageDesc, "Footer-Attribut ohne PageDesc" ); - - const sal_Char * pFtNm = OOO_STRING_SVTOOLS_RTF_FOOTER; - rWrt.Strm() << pFtNm << 'y'; - if( rRTFWrt.bOutPageDescTbl ) - { - // hole die Ober-/Unterkanten vom Footer - const SvxULSpaceItem& rUL = rFt.GetFooterFmt()->GetULSpace(); - const SvxLRSpaceItem& rLR = rFt.GetFooterFmt()->GetLRSpace(); - const SwFmtFrmSize& rSz = rFt.GetFooterFmt()->GetFrmSize(); - - rWrt.OutLong( rUL.GetLower() ); - OutComment( rWrt, pFtNm ) << "yt"; - rWrt.OutLong( rUL.GetUpper() ) << pFtNm << "xl"; - rWrt.OutLong( rLR.GetLeft() ) << pFtNm << "xr"; - rWrt.OutLong( rLR.GetRight() ) << pFtNm << "yh"; - rWrt.OutLong( ATT_FIX_SIZE == rSz.GetHeightSizeType() - ? -rSz.GetHeight() - : rSz.GetHeight() ) << '}'; - } - else - rWrt.OutLong( rRTFWrt.pAktPageDesc->GetMaster(). - GetULSpace().GetLower() ); - - // wird nicht die PageDesc-Tabelle ausgegeben und gibt es einen - // Nachfolger, dann handelt es sich um die "1.Seite" nach RTF. - sal_Char cTyp = 0; - if( !rRTFWrt.bOutPageDesc && rRTFWrt.pAktPageDesc->GetFollow() && - rRTFWrt.pAktPageDesc->GetFollow() != rRTFWrt.pAktPageDesc ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TITLEPG; //i13107 - cTyp = 'f'; // dann FirstPage-Header - } - else if( !rRTFWrt.pAktPageDesc->IsFooterShared() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FACINGP; //i13107 - cTyp = rRTFWrt.bOutLeftHeadFoot ? 'l' : 'r'; - } - - rWrt.Strm() << '{'<< pFtNm; - if( cTyp ) rWrt.Strm() << cTyp; - rWrt.Strm() << ' '; - - { - RTFSaveData aSaveData( rRTFWrt, nStart, nEnd ); - rRTFWrt.Out_SwDoc( rRTFWrt.pCurPam ); - } - - rWrt.Strm() << '}' << SwRTFWriter::sNewLine; - - } while( FALSE ); - return rWrt; -} - -static Writer& OutRTF_SwFmtPrint( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bRTFFlySyntax && !((const SvxPrintItem&)rHt).GetValue() ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYPRINT; - } - return rWrt; -} - - -static Writer& OutRTF_SwFmtOpaque( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bRTFFlySyntax && !((const SvxOpaqueItem&)rHt).GetValue() ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYOPAQUE; - } - return rWrt; -} - - -static Writer& OutRTF_SwFmtProtect( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bRTFFlySyntax ) - { - const SvxProtectItem & rFlyProtect = (const SvxProtectItem&) rHt; - RTFProtect aP( rFlyProtect.IsCntntProtected(), - rFlyProtect.IsSizeProtected(), - rFlyProtect.IsPosProtected() ); - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYPRTCTD; - rWrt.OutULong( aP.GetValue() ); - } - return rWrt; -} - - -static Writer& OutRTF_SwFmtSurround( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtSurround& rFlySurround = (const SwFmtSurround&) rHt; - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( rRTFWrt.bRTFFlySyntax ) - { - if( SURROUND_NONE == rFlySurround.GetSurround() ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_NOWRAP; - } - } - else - { - SwSurround eSurround = rFlySurround.GetSurround(); - BOOL bGold = SURROUND_IDEAL == eSurround; - if( bGold ) - eSurround = SURROUND_PARALLEL; - RTFSurround aMC( bGold, static_cast< BYTE >(eSurround) ); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYMAINCNT; - rWrt.OutULong( aMC.GetValue() ); - rRTFWrt.bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SwFmtVertOrient ( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtVertOrient& rFlyVert = (const SwFmtVertOrient&) rHt; - RTFVertOrient aVO( static_cast< USHORT >(rFlyVert.GetVertOrient()), static_cast< USHORT >(rFlyVert.GetRelationOrient()) ); - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - if( rRTFWrt.bRTFFlySyntax && rRTFWrt.pFlyFmt ) - { - rRTFWrt.bOutFmtAttr = TRUE; - const char* pOrient; - RndStdIds eAnchor = rRTFWrt.pFlyFmt->GetAnchor().GetAnchorId(); - sal_Int16 eOrient = rFlyVert.GetRelationOrient(); - if (FLY_AT_PAGE == eAnchor) - { - if( text::RelOrientation::PAGE_FRAME == eOrient || text::RelOrientation::FRAME == eOrient ) - pOrient = OOO_STRING_SVTOOLS_RTF_PVPG; - else - pOrient = OOO_STRING_SVTOOLS_RTF_PVMRG; - } - else - pOrient = OOO_STRING_SVTOOLS_RTF_PVPARA; - rWrt.Strm() << pOrient; - - switch (rFlyVert.GetVertOrient()) - { - case text::VertOrientation::TOP: - case text::VertOrientation::LINE_TOP: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_POSYT; - break; - case text::VertOrientation::BOTTOM: - case text::VertOrientation::LINE_BOTTOM: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_POSYB; - break; - case text::VertOrientation::CENTER: - case text::VertOrientation::LINE_CENTER: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_POSYC; - break; - case text::VertOrientation::NONE: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_POSY; - rWrt.OutULong(rFlyVert.GetPos()); - break; - default: - break; - } - } - else if( !rRTFWrt.bRTFFlySyntax ) - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYVERT; - rWrt.OutULong( aVO.GetValue() ); - } - - return rWrt; -} - -static Writer& OutRTF_SwFmtHoriOrient( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwFmtHoriOrient& rFlyHori = (const SwFmtHoriOrient&) rHt; - RTFHoriOrient aHO( static_cast< USHORT >(rFlyHori.GetHoriOrient()), - static_cast< USHORT >(rFlyHori.GetRelationOrient()) ); - - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( rRTFWrt.bRTFFlySyntax && rRTFWrt.pFlyFmt ) - { - rRTFWrt.bOutFmtAttr = TRUE; - const char* pS; - RndStdIds eAnchor = rRTFWrt.pFlyFmt->GetAnchor().GetAnchorId(); - sal_Int16 eOrient = rFlyHori.GetRelationOrient(); - if (FLY_AT_PAGE == eAnchor) - { - if( text::RelOrientation::PAGE_FRAME == eOrient || text::RelOrientation::FRAME == eOrient ) - pS = OOO_STRING_SVTOOLS_RTF_PHPG; - else - pS = OOO_STRING_SVTOOLS_RTF_PHMRG; - } - else - pS = OOO_STRING_SVTOOLS_RTF_PHCOL; - rWrt.Strm() << pS; - - pS = 0; - switch(rFlyHori.GetHoriOrient()) - { - case text::HoriOrientation::RIGHT: - pS = rFlyHori.IsPosToggle() ? OOO_STRING_SVTOOLS_RTF_POSXO : OOO_STRING_SVTOOLS_RTF_POSXR; - break; - case text::HoriOrientation::LEFT: - pS = rFlyHori.IsPosToggle() ? OOO_STRING_SVTOOLS_RTF_POSXI : OOO_STRING_SVTOOLS_RTF_POSXL; - break; - case text::HoriOrientation::CENTER: - pS = OOO_STRING_SVTOOLS_RTF_POSXC; - break; - case text::HoriOrientation::NONE: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_POSX; - rWrt.OutULong( rFlyHori.GetPos() ); - break; - default: - break; - } - if (pS) - rWrt.Strm() << pS; - } - else - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYHORZ; - rWrt.OutULong( aHO.GetValue() ); - } - return rWrt; -} - -static Writer& OutRTF_SwFmtAnchor( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bRTFFlySyntax ) - { - const SwFmtAnchor& rAnchor = (const SwFmtAnchor&) rHt; - USHORT nId = static_cast< USHORT >(rAnchor.GetAnchorId()); - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYANCHOR; - rWrt.OutULong( nId ); - rRTFWrt.bOutFmtAttr = TRUE; - switch( nId ) - { - case FLY_AT_PAGE: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYPAGE; - rWrt.OutULong( rAnchor.GetPageNum() ); - break; - case FLY_AT_PARA: - case FLY_AS_CHAR: - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_FLYCNTNT; - break; - } - } - return rWrt; -} - - - -static Writer& OutRTF_SwFmtBackground( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - // wird das FlyFrmFmt ausgegeben, dann Background nur ausgeben, wenn - // RTF-Syntax gesetzt ist ! - if( !rRTFWrt.pFlyFmt || !rRTFWrt.bRTFFlySyntax ) - { - const SvxBrushItem& rBack = (const SvxBrushItem&)rHt; - if( !rBack.GetColor().GetTransparency() ) - { - ByteString sOut( OOO_STRING_SVTOOLS_RTF_CBPAT ); - sOut += ByteString::CreateFromInt32( - rRTFWrt.GetId( rBack.GetColor() )); - - if( rRTFWrt.pFlyFmt || rRTFWrt.bOutPageDesc ) - { - rWrt.Strm() << '{' << sOut.GetBuffer() << '}'; - } - else - { - rRTFWrt.bOutFmtAttr = TRUE; - rWrt.Strm() << sOut.GetBuffer(); - } - } - } - return rWrt; -} - - -static Writer& OutRTF_SwFmtShadow( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - // wird das FlyFrmFmt ausgegeben, dann Schatten nur ausgeben, wenn - // nicht RTF-Syntax gesetzt ist ! - if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax ) - return rWrt; - - const SvxShadowItem& rShadow = (const SvxShadowItem&)rHt; - // FALSE wegen schliessender Klammer !! - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_SHADOW, FALSE ); - rWrt.OutULong( rShadow.GetLocation() ) << OOO_STRING_SVTOOLS_RTF_SHDWDIST; - rWrt.OutULong( rShadow.GetWidth() ) << OOO_STRING_SVTOOLS_RTF_SHDWSTYLE; - const Color& rColor = rShadow.GetColor(); - rWrt.OutULong( rColor.GetTransparency() ? SW_SV_BRUSH_NULL : SW_SV_BRUSH_SOLID ); - rWrt.OutULong( rRTFWrt.GetId( rColor ) ) << OOO_STRING_SVTOOLS_RTF_SHDWFCOL; - rWrt.OutULong( 0 ) << '}'; - return rWrt; -} - - -static void OutBorderLine( SwRTFWriter& rWrt, const SvxBorderLine* pLine, - const char* pStr ) -{ - rWrt.Strm() << pStr << OOO_STRING_SVTOOLS_RTF_BRDLNCOL; - rWrt.OutULong( rWrt.GetId( pLine->GetColor() ) ) << OOO_STRING_SVTOOLS_RTF_BRDLNIN; - rWrt.OutULong( pLine->GetInWidth() ) << OOO_STRING_SVTOOLS_RTF_BRDLNOUT; - rWrt.OutULong( pLine->GetOutWidth() ) << OOO_STRING_SVTOOLS_RTF_BRDLNDIST; - rWrt.OutULong( pLine->GetDistance() ); -} - - -static Writer& OutRTF_SwFmtBox( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - - const SvxBoxItem& rBox = (const SvxBoxItem&)rHt; - - static USHORT __READONLY_DATA aBorders[] = { - BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT }; - static const sal_Char* __READONLY_DATA aBorderNames[] = { - OOO_STRING_SVTOOLS_RTF_BRDRT, OOO_STRING_SVTOOLS_RTF_BRDRL, OOO_STRING_SVTOOLS_RTF_BRDRB, OOO_STRING_SVTOOLS_RTF_BRDRR }; - - USHORT nDist = rBox.GetDistance(); - - // wird das FlyFrmFmt ausgegeben, dann Border nur ausgeben, wenn - // nicht RTF-Syntax gesetzt ist! - if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax ) - { -/* -RTF kennt keine Rahmen Umrandung! - // die normale RTF-Definition - if( rBox.GetTop() && rBox.GetBottom() && - rBox.GetLeft() && rBox.GetRight() && - *rBox.GetTop() == *rBox.GetBottom() && - *rBox.GetTop() == *rBox.GetLeft() && - *rBox.GetTop() == *rBox.GetRight() ) - OutBorderLine( rRTFWrt, rBox.GetTop(), OOO_STRING_SVTOOLS_RTF_BOX, nDist ); - else - { - OUT_BRDLINE( rBox.GetTop(), OOO_STRING_SVTOOLS_RTF_BRDRT, nDist ); - OUT_BRDLINE( rBox.GetBottom(), OOO_STRING_SVTOOLS_RTF_BRDRB, nDist ); - OUT_BRDLINE( rBox.GetLeft(), OOO_STRING_SVTOOLS_RTF_BRDRL, nDist ); - OUT_BRDLINE( rBox.GetRight(), OOO_STRING_SVTOOLS_RTF_BRDRR, nDist ); - } -*/ - return rWrt; - } - else if( !rRTFWrt.pFlyFmt ) - { - // erst die normale RTF-Definition, dann unsere eigene - if( rBox.GetTop() && rBox.GetBottom() && - rBox.GetLeft() && rBox.GetRight() && - *rBox.GetTop() == *rBox.GetBottom() && - *rBox.GetTop() == *rBox.GetLeft() && - *rBox.GetTop() == *rBox.GetRight() && - nDist == rBox.GetDistance( BOX_LINE_TOP ) && - nDist == rBox.GetDistance( BOX_LINE_LEFT ) && - nDist == rBox.GetDistance( BOX_LINE_BOTTOM ) && - nDist == rBox.GetDistance( BOX_LINE_RIGHT )) - OutBorderLine( rRTFWrt, rBox.GetTop(), OOO_STRING_SVTOOLS_RTF_BOX, nDist ); - else - { - const USHORT* pBrd = aBorders; - const sal_Char** pBrdNms = (const sal_Char**)aBorderNames; - for(int i = 0; i < 4; ++i, ++pBrd, ++pBrdNms) - { - if (const SvxBorderLine* pLn = rBox.GetLine(*pBrd)) - { - OutBorderLine(rRTFWrt, pLn, *pBrdNms, - rBox.GetDistance(*pBrd)); - } - } - } - } - - const USHORT* pBrd = aBorders; - const sal_Char** pBrdNms = (const sal_Char**)aBorderNames; - for( int i = 0; i < 4; ++i, ++pBrd, ++pBrdNms ) - { - const SvxBorderLine* pLn = rBox.GetLine( *pBrd ); - if( pLn ) - { - rWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE; - OutBorderLine( rRTFWrt, pLn, *pBrdNms ); - rWrt.Strm() << '}' << OOO_STRING_SVTOOLS_RTF_BRSP; - rWrt.OutULong( rBox.GetDistance( *pBrd )); - } - } - - rRTFWrt.bOutFmtAttr = FALSE; - return rWrt; -} - -static Writer& OutRTF_SwFmtCol( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = ((SwRTFWriter&)rWrt); - if( rRTFWrt.pFlyFmt && rRTFWrt.bRTFFlySyntax ) - return rWrt; - - const SwFmtCol& rCol = (const SwFmtCol&)rHt; - const SwColumns& rColumns = rCol.GetColumns(); - - USHORT nCols = rColumns.Count(); - if( 1 < nCols ) - { - // dann besorge mal die Seitenbreite ohne Raender !! - const SwFrmFmt* pFmt; - - if( rRTFWrt.pFlyFmt ) - pFmt = rRTFWrt.pFlyFmt; - else if( rRTFWrt.pAktPageDesc ) - pFmt = &rRTFWrt.pAktPageDesc->GetMaster(); - else - pFmt = &const_cast<const SwDoc *>(rWrt.pDoc) - ->GetPageDesc(0).GetMaster(); - - const SvxLRSpaceItem& rLR = pFmt->GetLRSpace(); - - USHORT nPageSize = static_cast< USHORT >( pFmt->GetFrmSize().GetWidth() - - rLR.GetLeft() - rLR.GetRight() ); - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLS; - rWrt.OutLong( nCols ); - - if( rCol.IsOrtho() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLSX; - rWrt.OutLong( rCol.GetGutterWidth( TRUE ) ); - } - else - for( USHORT n = 0; n < nCols; ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLNO; - rWrt.OutLong( n+1 ); - - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLW; - rWrt.OutLong( rCol.CalcPrtColWidth( n, nPageSize ) ); - if( ++n != nCols ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_COLSR; - rWrt.OutLong( rColumns[ n-1 ]->GetRight() + - rColumns[ n ]->GetLeft() ); - } - } - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SvxFmtKeep( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SvxFmtKeepItem& rItem = (const SvxFmtKeepItem&)rHt; - if( rItem.GetValue() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_KEEPN; - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SvxFrmDir( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = ((SwRTFWriter&)rWrt); - if (rRTFWrt.pFlyFmt || rRTFWrt.bOutPageDesc) - OutSvxFrmDir(rRTFWrt, rHt); - return rWrt; -} - -/* File GRFATR.HXX */ - -static Writer& OutRTF_SwMirrorGrf( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwMirrorGrf & rMirror = (const SwMirrorGrf&)rHt; - if( RES_MIRROR_GRAPH_DONT == rMirror.GetValue() ) - return rWrt; - - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_IGNORE << OOO_STRING_SVTOOLS_RTF_GRFMIRROR; - rWrt.OutULong( rMirror.GetValue() ); - return rWrt; -} - -static Writer& OutRTF_SwCropGrf( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SwCropGrf & rCrop = (const SwCropGrf&)rHt; - ByteString aStr; - if( rCrop.GetLeft() ) - ( aStr += OOO_STRING_SVTOOLS_RTF_PICCROPL ) += - ByteString::CreateFromInt32( (short)rCrop.GetLeft() ); - if( rCrop.GetRight() ) - ( aStr += OOO_STRING_SVTOOLS_RTF_PICCROPR ) += - ByteString::CreateFromInt32( (short)rCrop.GetRight() ); - if( rCrop.GetTop() ) - ( aStr += OOO_STRING_SVTOOLS_RTF_PICCROPT ) += - ByteString::CreateFromInt32( (short)rCrop.GetTop() ); - if( rCrop.GetBottom() ) - ( aStr += OOO_STRING_SVTOOLS_RTF_PICCROPB ) += - ByteString::CreateFromInt32( (short)rCrop.GetBottom() ); - if( aStr.Len() ) - { - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - rWrt.Strm() << aStr.GetBuffer(); - } - return rWrt; -} - - - -/* File PARATR.HXX */ - -static Writer& OutRTF_SwLineSpacing( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SvxLineSpacingItem &rLs = (const SvxLineSpacingItem&)rHt; - - switch (rLs.GetLineSpaceRule()) - { - default: - break; - case SVX_LINE_SPACE_AUTO: - case SVX_LINE_SPACE_FIX: - case SVX_LINE_SPACE_MIN: - { - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_SL; - sal_Char cMult = '0'; - switch (rLs.GetInterLineSpaceRule()) - { - case SVX_INTER_LINE_SPACE_FIX: - // unser Durchschuss gibt es aber nicht in WW - also wie - // kommt man an die MaxLineHeight heran? - rWrt.OutLong((short)rLs.GetInterLineSpace()); - break; - case SVX_INTER_LINE_SPACE_PROP: - rWrt.OutLong((240L * rLs.GetPropLineSpace()) / 100L); - cMult = '1'; - break; - default: - if (SVX_LINE_SPACE_FIX == rLs.GetLineSpaceRule()) - rWrt.Strm() << '-'; - rWrt.OutLong( rLs.GetLineHeight() ); - break; - } - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_SLMULT << cMult; - } - break; - } - return rWrt; -} - -static Writer& OutRTF_SwAdjust( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SvxAdjustItem & rAdjust = ((const SvxAdjustItem&)rHt); - ByteString aAttr( "\\q" ); - switch( rAdjust.GetAdjust() ) - { - case SVX_ADJUST_LEFT: aAttr += 'l'; break; - case SVX_ADJUST_RIGHT: aAttr += 'r'; break; - case SVX_ADJUST_BLOCKLINE: - case SVX_ADJUST_BLOCK: aAttr += 'j'; break; - case SVX_ADJUST_CENTER: aAttr += 'c'; break; - - default: - return rWrt; // kein gueltiges Attriut, also returnen - } - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - rWrt.Strm() << aAttr.GetBuffer(); - return rWrt; -} - -static Writer& OutRTF_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt ) -{ - const SvxFmtSplitItem& rItem = (const SvxFmtSplitItem&)rHt; - if( !rItem.GetValue() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_KEEP; - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SwTabStop( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxTabStopItem & rTStops = (const SvxTabStopItem&)rHt; - long nOffset = ((SvxLRSpaceItem&)rRTFWrt.GetItem( RES_LR_SPACE )).GetTxtLeft(); - for( USHORT n = 0; n < rTStops.Count(); n++ ) - { - const SvxTabStop & rTS = rTStops[ n ]; - if( SVX_TAB_ADJUST_DEFAULT != rTS.GetAdjustment() ) - { - BOOL bOutDecimal = TRUE; - const char* pFill = 0; - switch( rTS.GetFill() ) - { - case cDfltFillChar: - break; - - case '.': pFill = OOO_STRING_SVTOOLS_RTF_TLDOT; break; - case '_': pFill = OOO_STRING_SVTOOLS_RTF_TLUL; break; - case '-': pFill = OOO_STRING_SVTOOLS_RTF_TLTH; break; - case '=': pFill = OOO_STRING_SVTOOLS_RTF_TLEQ; break; - default: - if( !rRTFWrt.bWriteHelpFmt ) - { - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_TLSWG, FALSE ); - rWrt.OutULong( (((USHORT)rTS.GetFill()) << 8 ) + - rTS.GetDecimal() ) - << '}'; - bOutDecimal = FALSE; - } - } - if( pFill ) - rWrt.Strm() << pFill; - - if( !rRTFWrt.bWriteHelpFmt && bOutDecimal && - rTS.GetDecimal() != ((SvxTabStopItem&)*GetDfltAttr( - RES_PARATR_TABSTOP ))[ 0 ].GetDecimal() ) - { - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_TLSWG, FALSE ); - rWrt.OutULong( (((USHORT)rTS.GetFill()) << 8 ) + - rTS.GetDecimal() ) << '}'; - } - - const sal_Char* pAdjStr = 0; - switch (rTS.GetAdjustment()) - { - case SVX_TAB_ADJUST_RIGHT: - pAdjStr = OOO_STRING_SVTOOLS_RTF_TQR; - break; - case SVX_TAB_ADJUST_DECIMAL: - pAdjStr = OOO_STRING_SVTOOLS_RTF_TQDEC; - break; - case SVX_TAB_ADJUST_CENTER: - pAdjStr = OOO_STRING_SVTOOLS_RTF_TQC; - break; - default: - break; - } - if (pAdjStr) - rWrt.Strm() << pAdjStr; - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_TX; - rWrt.OutLong(rTS.GetTabPos() + nOffset); - } - } - rRTFWrt.bOutFmtAttr = TRUE; - return rWrt; -} - -static Writer& OutRTF_SwHypenZone( Writer& rWrt, const SfxPoolItem& rHt ) -{ - if( !((SwRTFWriter&)rWrt).bWriteHelpFmt ) - { - const SvxHyphenZoneItem& rAttr = (const SvxHyphenZoneItem&)rHt; - USHORT nFlags = rAttr.IsHyphen() ? 1 : 0; - if( rAttr.IsPageEnd() ) nFlags += 2; - - OutComment( rWrt, OOO_STRING_SVTOOLS_RTF_HYPHEN, FALSE ); - rWrt.OutULong( nFlags ) << OOO_STRING_SVTOOLS_RTF_HYPHLEAD; - rWrt.OutULong( rAttr.GetMinLead() ) << OOO_STRING_SVTOOLS_RTF_HYPHTRAIL; - rWrt.OutULong( rAttr.GetMinTrail() ) << OOO_STRING_SVTOOLS_RTF_HYPHMAX; - rWrt.OutULong( rAttr.GetMaxHyphens() ) << '}'; - } - return rWrt; -} - -static Writer& OutRTF_SwNumRule( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - if( !rRTFWrt.bOutListNumTxt ) - { - const SwNumRuleItem& rAttr = (const SwNumRuleItem&)rHt; - USHORT nId; - if( rAttr.GetValue().Len() && - USHRT_MAX != (nId = rRTFWrt.GetId( rAttr ) )) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_LS; - rWrt.OutULong( nId ); - rRTFWrt.bOutFmtAttr = TRUE; - } - } - return rWrt; -} - -static Writer& OutRTF_SwScriptSpace( Writer& rWrt, const SfxPoolItem& rHt ) -{ - if( ((const SvxScriptSpaceItem&)rHt).GetValue() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_ASPALPHA; - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} -static Writer& OutRTF_SwHangPunctuation( Writer& rWrt, const SfxPoolItem& rHt ) -{ - if( !((const SvxHangingPunctuationItem&)rHt).GetValue() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_NOOVERFLOW; - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} -static Writer& OutRTF_SwForbiddenRule( Writer& rWrt, const SfxPoolItem& rHt ) -{ - if( !((const SvxForbiddenRuleItem&)rHt).GetValue() ) - { - rWrt.Strm() << OOO_STRING_SVTOOLS_RTF_NOCWRAP; - ((SwRTFWriter&)rWrt).bOutFmtAttr = TRUE; - } - return rWrt; -} - -static Writer& OutRTF_SwFontAlign( Writer& rWrt, const SfxPoolItem& rHt ) -{ - SwRTFWriter& rRTFWrt = (SwRTFWriter&)rWrt; - const SvxParaVertAlignItem & rAttr = (const SvxParaVertAlignItem &)rHt; - const char* pStr; - switch ( rAttr.GetValue() ) - { - case SvxParaVertAlignItem::TOP: pStr = OOO_STRING_SVTOOLS_RTF_FAHANG; break; - case SvxParaVertAlignItem::BOTTOM: pStr = OOO_STRING_SVTOOLS_RTF_FAVAR; break; - case SvxParaVertAlignItem::CENTER: pStr = OOO_STRING_SVTOOLS_RTF_FACENTER; break; - case SvxParaVertAlignItem::BASELINE: pStr = OOO_STRING_SVTOOLS_RTF_FAROMAN; break; - -// case SvxParaVertAlignItem::AUTOMATIC: - default: pStr = OOO_STRING_SVTOOLS_RTF_FAAUTO; break; - } - rWrt.Strm() << pStr; - rRTFWrt.bOutFmtAttr = TRUE; - return rWrt; -} - -/* - * lege hier die Tabellen fuer die RTF-Funktions-Pointer auf - * die Ausgabe-Funktionen an. - * Es sind lokale Strukturen, die nur innerhalb der RTF-DLL - * bekannt sein muessen. - */ - -SwAttrFnTab aRTFAttrFnTab = { -/* RES_CHRATR_CASEMAP */ OutRTF_SwCaseMap, -/* RES_CHRATR_CHARSETCOLOR */ 0, -/* RES_CHRATR_COLOR */ OutRTF_SwColor, -/* RES_CHRATR_CONTOUR */ OutRTF_SwContour, -/* RES_CHRATR_CROSSEDOUT */ OutRTF_SwCrossedOut, -/* RES_CHRATR_ESCAPEMENT */ OutRTF_SwEscapement, -/* RES_CHRATR_FONT */ OutRTF_SwFont, -/* RES_CHRATR_FONTSIZE */ OutRTF_SwSize, -/* RES_CHRATR_KERNING */ 0, // NOT USED!! OutRTF_SwKerning, -/* RES_CHRATR_LANGUAGE */ OutRTF_SwLanguage, -/* RES_CHRATR_POSTURE */ OutRTF_SwPosture, -/* RES_CHRATR_PROPORTIONALFONTSIZE*/0, -/* RES_CHRATR_SHADOWED */ OutRTF_SwShadowed, -/* RES_CHRATR_UNDERLINE */ OutRTF_SwUnderline, -/* RES_CHRATR_WEIGHT */ OutRTF_SwWeight, -/* RES_CHRATR_WORDLINEMODE */ 0, // Neu: Wortweises Unter-/Durchstreichen -/* RES_CHRATR_AUTOKERN */ 0, // Neu: Automatisches Pairkerning -/* RES_CHRATR_BLINK */ 0, // Neu: Blinkender Text -/* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen -/* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen -/* RES_CHRATR_BACKGROUND */ OutRTF_SwChrBckgrnd, // Neu: Zeichenhintergrund -/* RES_CHRATR_CJK_FONT */ OutRTF_SwFont, -/* RES_CHRATR_CJK_FONTSIZE */ OutRTF_SwSize, -/* RES_CHRATR_CJK_LANGUAGE */ OutRTF_SwLanguage, -/* RES_CHRATR_CJK_POSTURE */ OutRTF_SwPosture, -/* RES_CHRATR_CJK_WEIGHT */ OutRTF_SwWeight, -/* RES_CHRATR_CTL_FONT */ OutRTF_SwFont, -/* RES_CHRATR_CTL_FONTSIZE */ OutRTF_SwSize, -/* RES_CHRATR_CTL_LANGUAGE */ OutRTF_SwLanguage, -/* RES_CHRATR_CTL_POSTURE */ OutRTF_SwPosture, -/* RES_CHRATR_CTL_WEIGHT */ OutRTF_SwWeight, -/* RES_CHRATR_ROTATE */ OutRTF_SwCharRotate, -/* RES_CHRATR_EMPHASIS_MARK */ OutRTF_SwEmphasisMark, -/* RES_CHRATR_TWO_LINES */ OutRTF_SwTwoInOne, -/* RES_CHRATR_SCALEW */ OutRTF_SwCharScaleW, -/* RES_CHRATR_RELIEF */ OutRTF_SwCharRelief, -/* RES_CHRATR_HIDDEN */ OutRTF_SvxCharHiddenItem, -/* RES_CHRATR_OVERLINE */ OutRTF_SwOverline, -/* RES_CHRATR_DUMMY1 */ 0, -/* RES_CHRATR_DUMMY2 */ 0, - -/* RES_TXTATR_REFMARK */ 0, // NOT USED!! OutRTF_SwRefMark, -/* RES_TXTATR_TOXMARK */ 0, // NOT USED!! OutRTF_SwTOXMark, -/* RES_TXTATR_META */ 0, -/* RES_TXTATR_METAFIELD */ 0, -/* RES_TXTATR_AUTOFMT */ OutRTF_SwTxtAutoFmt, -/* RES_TXTATR_INETFMT */ OutRTF_SwTxtINetFmt, -/* RES_TXTATR_CHARFMT */ OutRTF_SwTxtCharFmt, -/* RES_TXTATR_CJK_RUBY */ OutRTF_SwTxtRuby, -/* RES_TXTATR_UNKNOWN_CONTAINER */ 0, -/* RES_TXTATR_DUMMY5 */ 0, - -/* RES_TXTATR_FIELD */ OutRTF_SwField, -/* RES_TXTATR_FLYCNT */ OutRTF_SwFlyCntnt, -/* RES_TXTATR_FTN */ OutRTF_SwFtn, -/* RES_TXTATR_DUMMY4 */ 0, -/* RES_TXTATR_DUMMY3 */ 0, -/* RES_TXTATR_DUMMY1 */ 0, // Dummy: -/* RES_TXTATR_DUMMY2 */ 0, // Dummy: - -/* RES_PARATR_LINESPACING */ OutRTF_SwLineSpacing, -/* RES_PARATR_ADJUST */ OutRTF_SwAdjust, -/* RES_PARATR_SPLIT */ OutRTF_SvxFmtSplit, -/* RES_PARATR_WIDOWS */ 0, // NOT USED!! OutRTF_SwWidows, -/* RES_PARATR_ORPHANS */ 0, // NOT USED!! OutRTF_SwOrphans, -/* RES_PARATR_TABSTOP */ OutRTF_SwTabStop, -/* RES_PARATR_HYPHENZONE*/ OutRTF_SwHypenZone, -/* RES_PARATR_DROP */ 0, -/* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit -/* RES_PARATR_NUMRULE */ OutRTF_SwNumRule, -/* RES_PARATR_SCRIPTSPACE */ OutRTF_SwScriptSpace, -/* RES_PARATR_HANGINGPUNCTUATION */ OutRTF_SwHangPunctuation, -/* RES_PARATR_FORBIDDEN_RULE*/ OutRTF_SwForbiddenRule, -/* RES_PARATR_VERTALIGN */ OutRTF_SwFontAlign, -/* RES_PARATR_SNAPTOGRID*/ 0, // new -/* 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, // NOT USED!! OutRTF_SwFillOrder, -/* RES_FRM_SIZE */ OutRTF_SwFrmSize, -/* RES_PAPER_BIN */ 0, // NOT USED!! OutRTF_SwFmtPaperBin, -/* RES_LR_SPACE */ OutRTF_SwFmtLRSpace, -/* RES_UL_SPACE */ OutRTF_SwFmtULSpace, -/* RES_PAGEDESC */ 0, -/* RES_BREAK */ 0, -/* RES_CNTNT */ 0, -/* RES_HEADER */ OutRTF_SwFmtHeader, -/* RES_FOOTER */ OutRTF_SwFmtFooter, -/* RES_PRINT */ OutRTF_SwFmtPrint, -/* RES_OPAQUE */ OutRTF_SwFmtOpaque, -/* RES_PROTECT */ OutRTF_SwFmtProtect, -/* RES_SURROUND */ OutRTF_SwFmtSurround, -/* RES_VERT_ORIENT */ OutRTF_SwFmtVertOrient, -/* RES_HORI_ORIENT */ OutRTF_SwFmtHoriOrient, -/* RES_ANCHOR */ OutRTF_SwFmtAnchor, -/* RES_BACKGROUND */ OutRTF_SwFmtBackground, -/* RES_BOX */ OutRTF_SwFmtBox, -/* RES_SHADOW */ OutRTF_SwFmtShadow, -/* RES_FRMMACRO */ 0, // NOT USED!! OutRTF_SwFmtFrmMacro, -/* RES_COL */ OutRTF_SwFmtCol, -/* RES_KEEP */ OutRTF_SvxFmtKeep, -/* RES_URL */ 0, // URL -/* RES_EDIT_IN_READONLY */ 0, -/* RES_LAYOUT_SPLIT */ 0, -/* RES_FRMATR_DUMMY1 */ 0, // Dummy: -/* RES_FRMATR_DUMMY2 */ 0, // Dummy: -/* RES_AUTO_STYLE */ 0, // Dummy: -/* RES_FRMATR_DUMMY4 */ 0, // Dummy: -/* RES_FRMATR_DUMMY5 */ 0, // Dummy: -/* RES_FRMATR_DUMMY6 */ 0, // Dummy: -/* RES_FRAMEDIR*/ OutRTF_SvxFrmDir, -/* 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 */ OutRTF_SwMirrorGrf, -/* RES_GRFATR_CROPGRF */ OutRTF_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 -}; - -SwNodeFnTab aRTFNodeFnTab = { -/* RES_TXTNODE */ OutRTF_SwTxtNode, -/* RES_GRFNODE */ OutRTF_SwGrfNode, -/* RES_OLENODE */ OutRTF_SwOLENode -}; - -/* vi:set tabstop=4 shiftwidth=4 expandtab: */ |