summaryrefslogtreecommitdiff
path: root/sw/source/filter/ww8/wrtww8.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/ww8/wrtww8.cxx')
-rw-r--r--sw/source/filter/ww8/wrtww8.cxx1119
1 files changed, 597 insertions, 522 deletions
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index 99df3307254c..032c1fda8171 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -97,8 +97,12 @@
#include <fmtline.hxx>
#include <fmtfsize.hxx>
#include <comphelper/extract.hxx>
+
+#include <writerfilter/doctok/sprmids.hxx>
+
#include "writerhelper.hxx"
#include "writerwordglue.hxx"
+#include "ww8attributeoutput.hxx"
#include <IDocumentMarkAccess.hxx>
@@ -117,6 +121,8 @@
using namespace sw::util;
using namespace sw::types;
+/** FKP - Formatted disK Page
+*/
class WW8_WrFkp
{
BYTE* pFkp; // gesamter Fkp ( zuerst nur FCs und Sprms )
@@ -197,7 +203,7 @@ public:
~WW8_WrtBookmarks();
void Append( WW8_CP nStartCp, const String& rNm, const ::sw::mark::IMark* pBkmk=NULL );
- void Write( SwWW8Writer& rWrt );
+ void Write( WW8Export& rWrt );
void MoveFieldMarks(ULONG nFrom,ULONG nTo);
// String GetWWBkmkName( const String& rName ) const;
@@ -217,7 +223,7 @@ typedef WW8_WrPc* WW8_WrPcPtr;
SV_DECL_PTRARR_DEL( WW8_WrPcPtrs, WW8_WrPcPtr, 4, 4 )
SV_IMPL_PTRARR( WW8_WrPcPtrs, WW8_WrPcPtr )
-static void WriteDop( SwWW8Writer& rWrt )
+static void WriteDop( WW8Export& rWrt )
{
WW8Dop& rDop = *rWrt.pDop;
@@ -336,7 +342,7 @@ Converts the OOo Asian Typography into a best fit match for Microsoft
Asian typography. This structure is actually dumped to disk within the
Dop Writer. Assumption is that rTypo is cleared to 0 on entry
*/
-void SwWW8Writer::ExportDopTypography(WW8DopTypography &rTypo)
+void WW8Export::ExportDopTypography(WW8DopTypography &rTypo)
{
static const sal_Unicode aLangNotBegin[4][WW8DopTypography::nMaxFollowing]=
{
@@ -507,7 +513,7 @@ void SwWW8Writer::ExportDopTypography(WW8DopTypography &rTypo)
(rTypo.cchLeadingPunct+1)*2);
}
- const IDocumentSettingAccess* pIDocumentSettingAccess = getIDocumentSettingAccess();
+ const IDocumentSettingAccess* pIDocumentSettingAccess = GetWriter().getIDocumentSettingAccess();
rTypo.fKerningPunct = pIDocumentSettingAccess->get(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION);
rTypo.iJustification = pDoc->getCharacterCompressionType();
@@ -517,8 +523,8 @@ void SwWW8Writer::ExportDopTypography(WW8DopTypography &rTypo)
// Underline / WordLineMode und Box / Shadow.
// Es kann nur etwas gefunden werden, wenn diese Methode innerhalb
// der aufgerufenen Methoden WW8_SwAttrIter::OutAttr() und
-// SwWW8Writer::Out_SfxItemSet() benutzt wird.
-const SfxPoolItem* SwWW8Writer::HasItem( USHORT nWhich ) const
+// WW8Export::OutputItemSet() benutzt wird.
+const SfxPoolItem* MSWordExportBase::HasItem( USHORT nWhich ) const
{
const SfxPoolItem* pItem=0;
if (pISet)
@@ -540,7 +546,7 @@ const SfxPoolItem* SwWW8Writer::HasItem( USHORT nWhich ) const
return pItem;
}
-const SfxPoolItem& SwWW8Writer::GetItem(USHORT nWhich) const
+const SfxPoolItem& MSWordExportBase::GetItem(USHORT nWhich) const
{
const SfxPoolItem* pItem;
if (pISet)
@@ -624,7 +630,7 @@ void WW8_WrPlc1::Write( SvStream& rStrm )
//------------------------------------------------------------------------------
-bool WW8_WrPlcFld::Write(SwWW8Writer& rWrt)
+bool WW8_WrPlcFld::Write( WW8Export& rWrt )
{
if( WW8_WrPlc1::Count() <= 1 )
return false;
@@ -682,7 +688,7 @@ bool WW8_WrPlcFld::Write(SwWW8Writer& rWrt)
return true;
}
-bool WW8_WrMagicTable::Write(SwWW8Writer& rWrt)
+bool WW8_WrMagicTable::Write( WW8Export& rWrt )
{
if( WW8_WrPlc1::Count() <= 1 )
return false;
@@ -744,7 +750,7 @@ ULONG SwWW8Writer::FillUntil( SvStream& rStrm, ULONG nEndPos )
//--------------------------------------------------------------------------
/* */
-WW8_WrPlcPn::WW8_WrPlcPn( SwWW8Writer& rWr, ePLCFT ePl, WW8_FC nStartFc )
+WW8_WrPlcPn::WW8_WrPlcPn( WW8Export& rWr, ePLCFT ePl, WW8_FC nStartFc )
: rWrt(rWr), nFkpStartPage(0), ePlc(ePl), nMark(0)
{
WW8_FkpPtr pF = new WW8_WrFkp( ePlc, nStartFc, rWrt.bWrtWW8 );
@@ -1168,7 +1174,7 @@ void WW8_WrPct::AppendPc(WW8_FC nStartFc, bool bIsUnicode)
}
-void WW8_WrPct::WritePc( SwWW8Writer& rWrt )
+void WW8_WrPct::WritePc( WW8Export& rWrt )
{
ULONG nPctStart;
ULONG nOldPos, nEndPos;
@@ -1277,7 +1283,7 @@ void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm, const ::sw::
}
-void WW8_WrtBookmarks::Write( SwWW8Writer& rWrt )
+void WW8_WrtBookmarks::Write( WW8Export& rWrt )
{
USHORT nCount = aSttCps.Count(), i;
if( nCount )
@@ -1358,13 +1364,13 @@ void WW8_WrtBookmarks::MoveFieldMarks(ULONG nFrom, ULONG nTo)
}
}
-void SwWW8Writer::AppendBookmarks( const SwTxtNode& rNd,
+void WW8Export::AppendBookmarks( const SwTxtNode& rNd,
xub_StrLen nAktPos, xub_StrLen nLen )
{
SvPtrarr aArr( 8, 8 );
USHORT nCntnt;
xub_StrLen nAktEnd = nAktPos + nLen;
- if( GetBookmarks( rNd, nAktPos, nAktEnd, aArr ))
+ if( GetWriter().GetBookmarks( rNd, nAktPos, nAktEnd, aArr ))
{
ULONG nNd = rNd.GetIndex(), nSttCP = Fc2Cp( Strm().Tell() );
for( USHORT n = 0; n < aArr.Count(); ++n )
@@ -1402,15 +1408,20 @@ void SwWW8Writer::AppendBookmarks( const SwTxtNode& rNd,
}
}
-void SwWW8Writer::MoveFieldMarks(ULONG nFrom, ULONG nTo)
+void WW8Export::MoveFieldMarks(ULONG nFrom, ULONG nTo)
{
pBkmks->MoveFieldMarks(nFrom, nTo);
}
-void SwWW8Writer::AppendBookmark(const String& rName, USHORT nOffset)
+void WW8Export::AppendBookmark( const rtl::OUString& rName, bool bSkip )
+{
+ ULONG nSttCP = Fc2Cp( Strm().Tell() ) + ( bSkip? 1: 0 );
+ pBkmks->Append( nSttCP, rName );
+}
+
+void MSWordExportBase::AppendWordBookmark( const String& rName )
{
- ULONG nSttCP = Fc2Cp(Strm().Tell()) + nOffset;
- pBkmks->Append(nSttCP, rName);
+ AppendBookmark( BookmarkToWord( rName ) );
}
@@ -1419,12 +1430,12 @@ void SwWW8Writer::AppendBookmark(const String& rName, USHORT nOffset)
void WW8_WrtRedlineAuthor::Write( Writer& rWrt )
{
- SwWW8Writer & rWW8Wrt = (SwWW8Writer&)rWrt;
+ WW8Export & rWW8Wrt = *(((SwWW8Writer&)rWrt).m_pExport);
rWW8Wrt.WriteAsStringTable(maAuthors, rWW8Wrt.pFib->fcSttbfRMark,
rWW8Wrt.pFib->lcbSttbfRMark, rWW8Wrt.bWrtWW8 ? 0 : 2);
}
-USHORT SwWW8Writer::AddRedlineAuthor( USHORT nId )
+USHORT WW8Export::AddRedlineAuthor( USHORT nId )
{
if( !pRedlAuthors )
{
@@ -1437,7 +1448,7 @@ USHORT SwWW8Writer::AddRedlineAuthor( USHORT nId )
//--------------------------------------------------------------------------
/* */
-void SwWW8Writer::WriteAsStringTable(const std::vector<String>& rStrings,
+void WW8Export::WriteAsStringTable(const std::vector<String>& rStrings,
INT32& rfcSttbf, INT32& rlcbSttbf, USHORT nExtraLen)
{
USHORT n, nCount = static_cast< USHORT >(rStrings.size());
@@ -1612,7 +1623,7 @@ void SwWW8Writer::WriteString8(SvStream& rStrm, const String& rStr,
rStrm.Write(&aBytes[0], aBytes.size());
}
-void SwWW8Writer::WriteStringAsPara( const String& rTxt, USHORT nStyleId )
+void WW8Export::WriteStringAsPara( const String& rTxt, USHORT nStyleId )
{
if( rTxt.Len() )
OutSwString( rTxt, 0, rTxt.Len(), IsUnicode(), RTL_TEXTENCODING_MS_1252 );
@@ -1624,7 +1635,7 @@ void SwWW8Writer::WriteStringAsPara( const String& rTxt, USHORT nStyleId )
{ // Tab-Attr
// sprmPFInTable
if( bWrtWW8 )
- SwWW8Writer::InsUInt16( aArr, 0x2416 );
+ SwWW8Writer::InsUInt16( aArr, NS_sprm::LN_PFInTable );
else
aArr.Insert( 24, aArr.Count() );
aArr.Insert( 1, aArr.Count() );
@@ -1635,7 +1646,7 @@ void SwWW8Writer::WriteStringAsPara( const String& rTxt, USHORT nStyleId )
pChpPlc->AppendFkpEntry( nPos );
}
-void SwWW8Writer::WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp )
+void MSWordExportBase::WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp )
{
BYTE nOldTyp = nTxtTyp;
nTxtTyp = nTTyp;
@@ -1644,12 +1655,14 @@ void SwWW8Writer::WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp )
bool bOldPageDescs = bOutPageDescs;
bOutPageDescs = false;
// bOutKF wird in WriteKF1 gemerkt / gesetzt
- pCurPam = NewSwPaM( *pDoc, nStart, nEnd );
+ pCurPam = Writer::NewSwPaM( *pDoc, nStart, nEnd );
// Tabelle in Sonderbereichen erkennen
- if( (nStart != pCurPam->GetMark()->nNode.GetIndex())
- && pDoc->GetNodes()[ nStart ]->IsTableNode() )
+ if ( ( nStart != pCurPam->GetMark()->nNode.GetIndex() ) &&
+ pDoc->GetNodes()[ nStart ]->IsTableNode() )
+ {
pCurPam->GetMark()->nNode = nStart;
+ }
pOrigPam = pCurPam;
pCurPam->Exchange();
@@ -1663,7 +1676,7 @@ void SwWW8Writer::WriteSpecialText( ULONG nStart, ULONG nEnd, BYTE nTTyp )
nTxtTyp = nOldTyp;
}
-void SwWW8Writer::OutSwString(const String& rStr, xub_StrLen nStt,
+void WW8Export::OutSwString(const String& rStr, xub_StrLen nStt,
xub_StrLen nLen, bool bUnicode, rtl_TextEncoding eChrSet)
{
@@ -1707,7 +1720,7 @@ void SwWW8Writer::OutSwString(const String& rStr, xub_StrLen nStt,
#endif
}
-void SwWW8Writer::WriteCR(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8Export::WriteCR(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
{
if (pTableTextNodeInfoInner.get() != NULL && pTableTextNodeInfoInner->getDepth() == 1 && pTableTextNodeInfoInner->isEndOfCell())
WriteChar('\007');
@@ -1717,7 +1730,7 @@ void SwWW8Writer::WriteCR(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeIn
pPiece->SetParaBreak();
}
-void SwWW8Writer::WriteChar( sal_Unicode c )
+void WW8Export::WriteChar( sal_Unicode c )
{
if( pPiece->IsUnicode() )
Strm() << c;
@@ -1725,136 +1738,177 @@ void SwWW8Writer::WriteChar( sal_Unicode c )
Strm() << (BYTE)c;
}
-/* */
-//---------------------------------------------------------------------------
-// Hilfsroutinen fuer Flys
-//---------------------------------------------------------------------------
-// Struktur speichert die aktuellen Daten des Writers zwischen, um
-// einen anderen Dokument-Teil auszugeben, wie z.B. Header/Footer
-WW8SaveData::WW8SaveData( SwWW8Writer& rWriter, ULONG nStt, ULONG nEnd )
- : rWrt( rWriter ),
- pOldPam( rWrt.pCurPam ), pOldEnd( rWrt.GetEndPaM() ),
- pOldFlyFmt(rWrt.mpParentFrame), pOldPageDesc( rWrt.pAktPageDesc )
-
+void MSWordExportBase::SaveData( ULONG nStt, ULONG nEnd )
{
- pOldFlyOffset = rWrt.pFlyOffset;
- eOldAnchorType = rWrt.eNewAnchorType;
- if( rWrt.pO->Count() )
+ MSWordSaveData aData;
+
+ // WW8Export only stuff - zeroed here not to issue warnings
+ aData.pOOld = NULL;
+ aData.mpTableAtOld = NULL;
+ aData.mnTableStdAtLenOld = 0;
+
+ // Common stuff
+ aData.pOldPam = pCurPam;
+ aData.pOldEnd = pOrigPam;
+ aData.pOldFlyFmt = mpParentFrame;
+ aData.pOldPageDesc = pAktPageDesc;
+
+ aData.pOldFlyOffset = pFlyOffset;
+ aData.eOldAnchorType = eNewAnchorType;
+
+ aData.bOldOutTable = bOutTable;
+ aData.bOldIsInTable = bIsInTable;
+ aData.bOldFlyFrmAttrs = bOutFlyFrmAttrs;
+ aData.bOldStartTOX = bStartTOX;
+ aData.bOldInWriteTOX = bInWriteTOX;
+
+ pCurPam = Writer::NewSwPaM( *pDoc, nStt, nEnd );
+
+ // Recognize tables in special cases
+ if ( nStt != pCurPam->GetMark()->nNode.GetIndex() &&
+ pDoc->GetNodes()[ nStt ]->IsTableNode() )
{
- pOOld = rWrt.pO;
- rWrt.pO = new WW8Bytes( 128, 128 );
+ pCurPam->GetMark()->nNode = nStt;
}
- else
- pOOld = 0;
- bOldWriteAll = rWrt.bWriteAll;
- bOldOutTable = rWrt.bOutTable;
- bOldIsInTable= rWrt.bIsInTable;
- bOldFlyFrmAttrs = rWrt.bOutFlyFrmAttrs;
- bOldStartTOX = rWrt.bStartTOX;
- bOldInWriteTOX = rWrt.bInWriteTOX;
- rWrt.pCurPam = rWrt.NewSwPaM( *rWrt.pDoc, nStt, nEnd );
+ pOrigPam = pCurPam;
+ pCurPam->Exchange();
- // Tabelle in Sonderbereichen erkennen
- if( nStt != rWrt.pCurPam->GetMark()->nNode.GetIndex() &&
- rWrt.pDoc->GetNodes()[ nStt ]->IsTableNode() )
- rWrt.pCurPam->GetMark()->nNode = nStt;
+ bOutTable = false;
+ // Caution: bIsInTable should not be set here
+ bOutFlyFrmAttrs = false;
+// pAttrSet = 0;
+ bStartTOX = false;
+ bInWriteTOX = false;
+
+ maSaveData.push( aData );
+}
+
+void MSWordExportBase::RestoreData()
+{
+ MSWordSaveData &rData = maSaveData.top();
- rWrt.SetEndPaM( rWrt.pCurPam );
- rWrt.pCurPam->Exchange( );
- rWrt.bWriteAll = true;
- rWrt.bOutTable = false;
- // Vorsicht: rWrt.bIsInTable darf hier NICHT veraendert werden!
- rWrt.bOutFlyFrmAttrs = false;
-// rWrt.pAttrSet = 0;
- rWrt.bStartTOX = false;
- rWrt.bInWriteTOX = false;
+ delete pCurPam;
+ pCurPam = rData.pOldPam;
+ pOrigPam = rData.pOldEnd;
+
+ bOutTable = rData.bOldOutTable;
+ bIsInTable = rData.bOldIsInTable;
+ bOutFlyFrmAttrs = rData.bOldFlyFrmAttrs;
+ bStartTOX = rData.bOldStartTOX;
+ bInWriteTOX = rData.bOldInWriteTOX;
+
+ mpParentFrame = rData.pOldFlyFmt;
+ pAktPageDesc = rData.pOldPageDesc;
+
+ eNewAnchorType = rData.eOldAnchorType;
+ pFlyOffset = rData.pOldFlyOffset;
+
+ maSaveData.pop();
}
+void WW8Export::SaveData( ULONG nStt, ULONG nEnd )
+{
+ MSWordExportBase::SaveData( nStt, nEnd );
+
+ MSWordSaveData &rData = maSaveData.top();
+
+ if ( pO->Count() )
+ {
+ rData.pOOld = pO;
+ pO = new WW8Bytes( 128, 128 );
+ }
+ else
+ rData.pOOld = 0; // reuse pO
+
+ rData.mpTableAtOld = mpTableAt;
+ mpTableAt = NULL;
+ rData.mnTableStdAtLenOld = mnTableStdAtLen;
+ mnTableStdAtLen = 0;
+
+ rData.bOldWriteAll = GetWriter().bWriteAll;
+ GetWriter().bWriteAll = true;
+}
-WW8SaveData::~WW8SaveData()
+void WW8Export::RestoreData()
{
- delete rWrt.pCurPam; // Pam wieder loeschen
- rWrt.pCurPam = pOldPam;
- rWrt.SetEndPaM( pOldEnd );
- rWrt.bWriteAll = bOldWriteAll;
- rWrt.bOutTable = bOldOutTable;
- rWrt.bIsInTable= bOldIsInTable;
- rWrt.bOutFlyFrmAttrs = bOldFlyFrmAttrs;
- rWrt.bStartTOX = bOldStartTOX;
- rWrt.bInWriteTOX = bOldInWriteTOX;
- rWrt.mpParentFrame = pOldFlyFmt;
- rWrt.pAktPageDesc = pOldPageDesc;
- ASSERT( !rWrt.pO->Count(), " pO ist am Ende von WW8SaveData nicht leer" );
- if( pOOld )
+ MSWordSaveData &rData = maSaveData.top();
+
+ GetWriter().bWriteAll = rData.bOldWriteAll;
+
+ ASSERT( !pO->Count(), "pO is not empty in WW8Export::RestoreData()" );
+ if ( rData.pOOld )
{
- delete rWrt.pO;
- rWrt.pO = pOOld;
+ delete pO;
+ pO = rData.pOOld;
}
- rWrt.eNewAnchorType = eOldAnchorType;
- rWrt.pFlyOffset = pOldFlyOffset;
+
+ ASSERT( !mpTableAt || !mpTableAt->Count(), "mpTableAt is not empty in WW8Export::RestoreData()" );
+ if ( mpTableAt )
+ delete mpTableAt;
+ mpTableAt = rData.mpTableAtOld;
+ mnTableStdAtLen = rData.mnTableStdAtLenOld;
+
+ MSWordExportBase::RestoreData();
}
-void SwWW8Writer::OutWW8TableInfoCell
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableInfoCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
sal_uInt32 nDepth = pTableTextNodeInfoInner->getDepth();
- if (nDepth > 0)
+ if ( nDepth > 0 )
{
/* Cell */
- InsUInt16(0x2416);
- pO->Insert((BYTE)0x1, pO->Count());
- InsUInt16(0x6649);
- InsUInt32(nDepth);
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PFInTable );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PTableDepth );
+ m_rWW8Export.InsUInt32( nDepth );
- if (nDepth > 1 && pTableTextNodeInfoInner->isEndOfCell())
+ if ( nDepth > 1 && pTableTextNodeInfoInner->isEndOfCell() )
{
- InsUInt16(0x244b);
- pO->Insert((BYTE)0x1, pO->Count());
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PCell );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
}
}
}
-void SwWW8Writer::OutWW8TableInfoRow
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
sal_uInt32 nDepth = pTableTextNodeInfoInner->getDepth();
- if (nDepth > 0)
+ if ( nDepth > 0 )
{
-
/* Row */
- if (pTableTextNodeInfoInner->isEndOfLine())
+ if ( pTableTextNodeInfoInner->isEndOfLine() )
{
- InsUInt16(0x2416);
- pO->Insert((BYTE)0x1, pO->Count());
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PFInTable );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
- if (nDepth == 1)
+ if ( nDepth == 1 )
{
- InsUInt16(0x2417);
- pO->Insert((BYTE)0x1, pO->Count());
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PFTtp );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
}
- InsUInt16(0x6649);
- InsUInt32(nDepth);
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PTableDepth );
+ m_rWW8Export.InsUInt32( nDepth );
- if (nDepth > 1)
+ if ( nDepth > 1 )
{
- InsUInt16(0x244b);
- pO->Insert((BYTE)0x1, pO->Count());
- InsUInt16(0x244c);
- pO->Insert((BYTE)0x1, pO->Count());
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PCell );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
+ m_rWW8Export.InsUInt16( NS_sprm::LN_PRow );
+ m_rWW8Export.pO->Insert( (BYTE)0x1, m_rWW8Export.pO->Count() );
}
- OutWW8TableDefinition(pTableTextNodeInfoInner);
- OutWW8TableHeight(pTableTextNodeInfoInner);
- OutWW8TableBackgrounds(pTableTextNodeInfoInner);
- OutWW8TableDefaultBorders(pTableTextNodeInfoInner);
- OutWW8TableCanSplit(pTableTextNodeInfoInner);
- OutWW8TableBidi(pTableTextNodeInfoInner);
- OutWW8TableVerticalCell(pTableTextNodeInfoInner);
- OutWW8TableOrientation(pTableTextNodeInfoInner);
+ TableDefinition( pTableTextNodeInfoInner );
+ TableHeight( pTableTextNodeInfoInner );
+ TableBackgrounds( pTableTextNodeInfoInner );
+ TableDefaultBorders( pTableTextNodeInfoInner );
+ TableCanSplit( pTableTextNodeInfoInner );
+ TableBidi( pTableTextNodeInfoInner );
+ TableVerticalCell( pTableTextNodeInfoInner );
+ TableOrientation( pTableTextNodeInfoInner );
}
}
}
@@ -1886,31 +1940,29 @@ static sal_uInt16 lcl_TCFlags(const SwTableBox * pBox)
return nFlags;
}
-void SwWW8Writer::OutWW8TableVerticalCell
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableVerticalCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwTableLine * pTabLine = pTabBox->GetUpper();
const SwTableBoxes & rTblBoxes = pTabLine->GetTabBoxes();
sal_uInt8 nBoxes = rTblBoxes.Count();
- for (sal_uInt8 n = 0; n < nBoxes; n++)
+ for ( sal_uInt8 n = 0; n < nBoxes; n++ )
{
const SwTableBox * pTabBox1 = rTblBoxes[n];
const SwFrmFmt * pFrmFmt = pTabBox1->GetFrmFmt();
- if (FRMDIR_VERT_TOP_RIGHT == TrueFrameDirection(*pFrmFmt))
+ if ( FRMDIR_VERT_TOP_RIGHT == m_rWW8Export.TrueFrameDirection( *pFrmFmt ) )
{
- InsUInt16(0x7629);
- pO->Insert(BYTE(n), pO->Count()); //start range
- pO->Insert(BYTE(n + 1), pO->Count()); //end range
- InsUInt16(5); //Equals vertical writing
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TTextFlow );
+ m_rWW8Export.pO->Insert( BYTE(n), m_rWW8Export.pO->Count() ); //start range
+ m_rWW8Export.pO->Insert( BYTE(n + 1), m_rWW8Export.pO->Count() ); //end range
+ m_rWW8Export.InsUInt16( 5 ); //Equals vertical writing
}
}
}
-void SwWW8Writer::OutWW8TableCanSplit
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwTableLine * pTabLine = pTabBox->GetUpper();
@@ -1924,37 +1976,35 @@ void SwWW8Writer::OutWW8TableCanSplit
const SwFmtRowSplit& rSplittable = pLineFmt->GetRowSplit();
BYTE nCantSplit = (!rSplittable.GetValue()) ? 1 : 0;
- if (bWrtWW8)
+ if ( m_rWW8Export.bWrtWW8 )
{
- InsUInt16(0x3403);
- pO->Insert(nCantSplit, pO->Count());
- InsUInt16(0x3466); // also write fCantSplit90
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TFCantSplit );
+ m_rWW8Export.pO->Insert( nCantSplit, m_rWW8Export.pO->Count() );
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TFCantSplit90 ); // also write fCantSplit90
}
else
{
- pO->Insert(185, pO->Count());
+ m_rWW8Export.pO->Insert( 185, m_rWW8Export.pO->Count() );
}
- pO->Insert(nCantSplit, pO->Count());
+ m_rWW8Export.pO->Insert( nCantSplit, m_rWW8Export.pO->Count() );
}
-void SwWW8Writer::OutWW8TableBidi
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableBidi( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTable * pTable = pTableTextNodeInfoInner->getTable();
const SwFrmFmt * pFrmFmt = pTable->GetFrmFmt();
- if (bWrtWW8)
+ if ( m_rWW8Export.bWrtWW8 )
{
- if (TrueFrameDirection(*pFrmFmt) == FRMDIR_HORI_RIGHT_TOP)
+ if ( m_rWW8Export.TrueFrameDirection(*pFrmFmt) == FRMDIR_HORI_RIGHT_TOP )
{
- InsUInt16(0x560B);
- InsUInt16(1);
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TFBiDi );
+ m_rWW8Export.InsUInt16( 1 );
}
}
}
-void SwWW8Writer::OutWW8TableHeight
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwTableLine * pTabLine = pTabBox->GetUpper();
@@ -1984,27 +2034,26 @@ void SwWW8Writer::OutWW8TableHeight
// Zeilenhoehe ausgeben sprmTDyaRowHeight
long nHeight = 0;
const SwFmtFrmSize& rLSz = pLineFmt->GetFrmSize();
- if( ATT_VAR_SIZE != rLSz.GetHeightSizeType() && rLSz.GetHeight() )
+ if ( ATT_VAR_SIZE != rLSz.GetHeightSizeType() && rLSz.GetHeight() )
{
- if (ATT_MIN_SIZE == rLSz.GetHeightSizeType())
+ if ( ATT_MIN_SIZE == rLSz.GetHeightSizeType() )
nHeight = rLSz.GetHeight();
else
nHeight = -rLSz.GetHeight();
}
- if (nHeight)
+ if ( nHeight )
{
- if( bWrtWW8 )
- InsUInt16( 0x9407 );
+ if ( m_rWW8Export.bWrtWW8 )
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TDyaRowHeight );
else
- pO->Insert( 189, pO->Count() );
- InsUInt16( (USHORT)nHeight );
+ m_rWW8Export.pO->Insert( 189, m_rWW8Export.pO->Count() );
+ m_rWW8Export.InsUInt16( (USHORT)nHeight );
}
}
-void SwWW8Writer::OutWW8TableOrientation
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableOrientation( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTable * pTable = pTableTextNodeInfoInner->getTable();
@@ -2029,11 +2078,11 @@ void SwWW8Writer::OutWW8TableOrientation
{
case text::HoriOrientation::CENTER:
case text::HoriOrientation::RIGHT:
- if( bWrtWW8 )
- InsUInt16(0x5400 );
+ if ( m_rWW8Export.bWrtWW8 )
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TJc );
else
- pO->Insert(182, pO->Count());
- InsUInt16(text::HoriOrientation::RIGHT == eHOri ? 2 : 1);
+ m_rWW8Export.pO->Insert( 182, m_rWW8Export.pO->Count() );
+ m_rWW8Export.InsUInt16( text::HoriOrientation::RIGHT == eHOri ? 2 : 1 );
break;
default:
break;
@@ -2041,37 +2090,34 @@ void SwWW8Writer::OutWW8TableOrientation
}
}
-void SwWW8Writer::OutWW8TableDefinition
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwTableLine * pTabLine = pTabBox->GetUpper();
const SwTableBoxes & rTabBoxes = pTabLine->GetTabBoxes();
- const SwNode * pTxtNd = pTableTextNodeInfoInner->getNode();
const SwTable * pTable = pTableTextNodeInfoInner->getTable();
- if( pTable->GetRowsToRepeat() > pTableTextNodeInfoInner->getRow())
+ if ( pTable->GetRowsToRepeat() > pTableTextNodeInfoInner->getRow() )
{
- if( bWrtWW8 )
- InsUInt16( 0x3404 );
+ if( m_rWW8Export.bWrtWW8 )
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TTableHeader );
else
- pO->Insert(186, pO->Count());
- pO->Insert( 1, pO->Count() );
+ m_rWW8Export.pO->Insert( 186, m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( 1, m_rWW8Export.pO->Count() );
}
// number of cell written
sal_uInt32 nBoxes = rTabBoxes.Count();
- if (nBoxes > 32)
+ if ( nBoxes > 32 )
nBoxes = 32;
// sprm header
- InsUInt16(0xd608);
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TDefTable );
sal_uInt16 nSprmSize = 2 + (nBoxes + 1) * 2 + nBoxes * 20;
- InsUInt16(nSprmSize); // length
+ m_rWW8Export.InsUInt16( nSprmSize ); // length
// number of boxes
- pO->Insert(static_cast<BYTE>(nBoxes), pO->Count());
-
+ m_rWW8Export.pO->Insert( static_cast<BYTE>(nBoxes), m_rWW8Export.pO->Count() );
/* cellxs */
/*
@@ -2100,13 +2146,13 @@ void SwWW8Writer::OutWW8TableDefinition
)
{
sal_Int16 eHOri = rHori.GetHoriOrient();
- switch (eHOri)
+ switch ( eHOri )
{
case text::HoriOrientation::CENTER:
case text::HoriOrientation::RIGHT:
break;
- default:
+ default:
nTblOffset = rHori.GetPos();
const SvxLRSpaceItem& rLRSp = pFmt->GetLRSpace();
nTblOffset += rLRSp.GetLeft();
@@ -2114,6 +2160,97 @@ void SwWW8Writer::OutWW8TableDefinition
}
}
+ sal_uInt32 n = 0;
+ m_rWW8Export.InsUInt16( nTblOffset );
+
+ std::vector<SwTwips> gridCols = GetGridCols( pTableTextNodeInfoInner );
+ for ( std::vector<SwTwips>::const_iterator it = gridCols.begin(), end = gridCols.end(); it != end; ++it )
+ {
+ m_rWW8Export.InsUInt16( static_cast<USHORT>( *it ) + nTblOffset );
+ }
+
+ /* TCs */
+ for ( n = 0; n < nBoxes; n++ )
+ {
+#ifdef DEBUG
+ sal_uInt16 npOCount = m_rWW8Export.pO->Count();
+#endif
+
+ SwTableBox * pTabBox1 = rTabBoxes[n];
+ const SwFrmFmt & rBoxFmt = *(pTabBox1->GetFrmFmt());
+ if ( m_rWW8Export.bWrtWW8 )
+ {
+ sal_uInt16 nFlags = lcl_TCFlags(pTabBox1);
+ m_rWW8Export.InsUInt16( nFlags );
+ }
+
+ static BYTE aNullBytes[] = { 0x0, 0x0 };
+
+ m_rWW8Export.pO->Insert( aNullBytes, 2, m_rWW8Export.pO->Count() ); // dummy
+ m_rWW8Export.Out_SwFmtTableBox( *m_rWW8Export.pO, rBoxFmt.GetBox() ); // 8/16 Byte
+
+#ifdef DEBUG
+ ::std::clog << "<tclength>" << m_rWW8Export.pO->Count() - npOCount << "</tclength>"
+ << ::std::endl;
+#endif
+ }
+}
+
+std::vector<SwTwips> AttributeOutputBase::GetGridCols( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
+{
+ std::vector<SwTwips> gridCols;
+
+ const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
+ const SwTableLine * pTabLine = pTabBox->GetUpper();
+ const SwTableBoxes & rTabBoxes = pTabLine->GetTabBoxes();
+ const SwTable *pTable = pTableTextNodeInfoInner->getTable( );
+
+ // number of cell written
+ sal_uInt32 nBoxes = rTabBoxes.Count();
+ if ( nBoxes > 32 )
+ nBoxes = 32;
+
+ const SwFrmFmt *pFmt = pTable->GetFrmFmt();
+ ASSERT(pFmt,"Impossible");
+ if (!pFmt)
+ return gridCols;
+
+ const SwFmtFrmSize &rSize = pFmt->GetFrmSize();
+ unsigned long nTblSz = static_cast<unsigned long>(rSize.GetWidth());
+
+ sal_uInt32 nPageSize = 0;
+ bool bRelBoxSize = false;
+
+ GetTablePageSize( pTableTextNodeInfoInner, nPageSize, bRelBoxSize );
+
+ SwTwips nSz = 0;
+ for ( sal_uInt32 n = 0; n < nBoxes; n++ )
+ {
+ const SwFrmFmt* pBoxFmt = rTabBoxes[ n ]->GetFrmFmt();
+ const SwFmtFrmSize& rLSz = pBoxFmt->GetFrmSize();
+ nSz += rLSz.GetWidth();
+ SwTwips nCalc = nSz;
+ if ( bRelBoxSize )
+ nCalc = ( nCalc * nPageSize ) / nTblSz;
+
+ gridCols.push_back( nCalc );
+ }
+
+ return gridCols;
+}
+
+void AttributeOutputBase::GetTablePageSize( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner, sal_uInt32& rPageSize, bool& rRelBoxSize )
+{
+ sal_uInt32 nPageSize = 0;
+
+ const SwNode *pTxtNd = pTableTextNodeInfoInner->getNode( );
+ const SwTable *pTable = pTableTextNodeInfoInner->getTable( );
+
+ const SwFrmFmt *pFmt = pTable->GetFrmFmt();
+ ASSERT(pFmt,"Impossible");
+ if (!pFmt)
+ return;
+
const SwFmtFrmSize &rSize = pFmt->GetFrmSize();
int nWidthPercent = rSize.GetWidthPercent();
bool bManualAligned = pFmt->GetHoriOrient().GetHoriOrient() == text::HoriOrientation::NONE;
@@ -2127,20 +2264,19 @@ void SwWW8Writer::OutWW8TableDefinition
bRelBoxSize = true;
}
- unsigned long nPageSize = nTblSz;
- if (bRelBoxSize)
+ if ( bRelBoxSize )
{
Point aPt;
- SwRect aRect(pFmt->FindLayoutRect(false, &aPt));
- if (aRect.IsEmpty())
+ SwRect aRect( pFmt->FindLayoutRect( false, &aPt ) );
+ if ( aRect.IsEmpty() )
{
// dann besorge mal die Seitenbreite ohne Raender !!
const SwFrmFmt* pParentFmt =
- mpParentFrame ?
- &(mpParentFrame->GetFrmFmt()) :
- const_cast<const SwDoc *>(pDoc)->GetPageDesc(0).GetPageFmtOfNode(*pTxtNd, false);
+ GetExport().mpParentFrame ?
+ &(GetExport().mpParentFrame->GetFrmFmt()) :
+ const_cast<const SwDoc *>(GetExport().pDoc)->GetPageDesc(0).GetPageFmtOfNode(*pTxtNd, false);
aRect = pParentFmt->FindLayoutRect(true);
- if (0 == (nPageSize = aRect.Width()))
+ if ( 0 == ( nPageSize = aRect.Width() ) )
{
const SvxLRSpaceItem& rLR = pParentFmt->GetLRSpace();
nPageSize = pParentFmt->GetFrmSize().GetWidth() - rLR.GetLeft()
@@ -2150,7 +2286,7 @@ void SwWW8Writer::OutWW8TableDefinition
else
{
nPageSize = aRect.Width();
- if(bManualAligned)
+ if ( bManualAligned )
{
// #i37571# For manually aligned tables
const SvxLRSpaceItem &rLR = pFmt->GetLRSpace();
@@ -2167,53 +2303,11 @@ void SwWW8Writer::OutWW8TableDefinition
}
}
- SwTwips nSz = 0;
- sal_uInt32 n = 0;
- InsUInt16(nTblOffset);
-
- for (n = 0; n < nBoxes; n++)
- {
- const SwFrmFmt* pBoxFmt = rTabBoxes[ n ]->GetFrmFmt();
- const SwFmtFrmSize& rLSz = pBoxFmt->GetFrmSize();
- nSz += rLSz.GetWidth();
- SwTwips nCalc = nSz;
- if (bRelBoxSize)
- nCalc = (nCalc * nPageSize) / nTblSz;
-
- nCalc += nTblOffset;
-
- InsUInt16(static_cast<USHORT>(nCalc));
- }
-
- /* TCs */
- for (n = 0; n < nBoxes; n++)
- {
-#ifdef DEBUG
- sal_uInt16 npOCount = pO->Count();
-#endif
-
- SwTableBox * pTabBox1 = rTabBoxes[n];
- const SwFrmFmt & rBoxFmt = *(pTabBox1->GetFrmFmt());
- if( bWrtWW8 )
- {
- sal_uInt16 nFlags = lcl_TCFlags(pTabBox1);
- InsUInt16( nFlags );
- }
-
- static BYTE aNullBytes[] = { 0x0, 0x0 };
-
- pO->Insert( aNullBytes, 2, pO->Count() ); // dummy
- Out_SwFmtTableBox( *pO, rBoxFmt.GetBox() ); // 8/16 Byte
-
-#ifdef DEBUG
- ::std::clog << "<tclength>" << pO->Count() - npOCount << "</tclength>"
- << ::std::endl;
-#endif
- }
+ rPageSize = nPageSize;
+ rRelBoxSize = bRelBoxSize;
}
-void SwWW8Writer::OutWW8TableDefaultBorders
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwFrmFmt * pFrmFmt = pTabBox->GetFrmFmt();
@@ -2226,44 +2320,41 @@ void SwWW8Writer::OutWW8TableDefaultBorders
BOX_LINE_BOTTOM, BOX_LINE_RIGHT
};
- for( int i = 0; i < 4; ++i)
+ for ( int i = 0; i < 4; ++i )
{
- SwWW8Writer::InsUInt16(*pO, 0xD634);
- pO->Insert( BYTE(6), pO->Count() );
- pO->Insert( BYTE(0), pO->Count() );
- pO->Insert( BYTE(1), pO->Count() );
- pO->Insert( BYTE(1 << i), pO->Count() );
- pO->Insert( BYTE(3), pO->Count() );
+ SwWW8Writer::InsUInt16( *m_rWW8Export.pO, 0xD634 );
+ m_rWW8Export.pO->Insert( BYTE(6), m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( BYTE(0), m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( BYTE(1), m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( BYTE(1 << i), m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( BYTE(3), m_rWW8Export.pO->Count() );
- SwWW8Writer::InsUInt16(*pO,
- pFrmFmt->GetBox().GetDistance(aBorders[i]));
+ SwWW8Writer::InsUInt16( *m_rWW8Export.pO,
+ pFrmFmt->GetBox().GetDistance( aBorders[i] ) );
}
-
}
-void SwWW8Writer::OutWW8TableBackgrounds
-(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner)
+void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwTableLine * pTabLine = pTabBox->GetUpper();
const SwTableBoxes & rTabBoxes = pTabLine->GetTabBoxes();
sal_uInt8 nBoxes = rTabBoxes.Count();
- if( bWrtWW8 )
- InsUInt16( 0xD609 );
+ if ( m_rWW8Export.bWrtWW8 )
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TDefTableShd );
else
- pO->Insert( (BYTE)191, pO->Count() );
- pO->Insert( (BYTE)(nBoxes * 2), pO->Count() ); // Len
+ m_rWW8Export.pO->Insert( (BYTE)191, m_rWW8Export.pO->Count() );
+ m_rWW8Export.pO->Insert( (BYTE)(nBoxes * 2), m_rWW8Export.pO->Count() ); // Len
- for (sal_uInt8 n = 0; n < nBoxes; n++)
+ for ( sal_uInt8 n = 0; n < nBoxes; n++ )
{
const SwTableBox * pBox1 = rTabBoxes[n];
const SwFrmFmt * pFrmFmt = pBox1->GetFrmFmt();
const SfxPoolItem * pI = NULL;
Color aColor;
- if (SFX_ITEM_ON == pFrmFmt->GetAttrSet().GetItemState(RES_BACKGROUND,
- false, &pI))
+ if ( SFX_ITEM_ON == pFrmFmt->GetAttrSet().GetItemState( RES_BACKGROUND, false, &pI ) )
{
aColor = dynamic_cast<const SvxBrushItem *>(pI)->GetColor();
}
@@ -2271,28 +2362,27 @@ void SwWW8Writer::OutWW8TableBackgrounds
aColor = COL_AUTO;
WW8_SHD aShd;
- TransBrush(aColor, aShd);
- InsUInt16(aShd.GetValue());
+ m_rWW8Export.TransBrush( aColor, aShd );
+ m_rWW8Export.InsUInt16( aShd.GetValue() );
}
- if (bWrtWW8)
+ if ( m_rWW8Export.bWrtWW8 )
{
sal_uInt8 nBoxes0 = rTabBoxes.Count();
if (nBoxes0 > 21)
nBoxes0 = 21;
- InsUInt16(0xd612);
- pO->Insert(static_cast<BYTE>(nBoxes0 * 10), pO->Count());
+ m_rWW8Export.InsUInt16( NS_sprm::LN_TCellShd );
+ m_rWW8Export.pO->Insert( static_cast<BYTE>(nBoxes0 * 10), m_rWW8Export.pO->Count() );
- for (sal_uInt8 n = 0; n < nBoxes0; n++)
+ for ( sal_uInt8 n = 0; n < nBoxes0; n++ )
{
const SwTableBox * pBox1 = rTabBoxes[n];
const SwFrmFmt * pFrmFmt = pBox1->GetFrmFmt();
const SfxPoolItem * pI = NULL;
Color aColor;
- if (SFX_ITEM_ON == pFrmFmt->GetAttrSet().GetItemState(RES_BACKGROUND,
- false, &pI))
+ if ( SFX_ITEM_ON == pFrmFmt->GetAttrSet().GetItemState( RES_BACKGROUND, false, &pI ) )
{
aColor = dynamic_cast<const SvxBrushItem *>(pI)->GetColor();
}
@@ -2300,20 +2390,30 @@ void SwWW8Writer::OutWW8TableBackgrounds
aColor = COL_AUTO;
WW8SHDLong aSHD;
- aSHD.setCvFore(0xFF000000);
+ aSHD.setCvFore( 0xFF000000 );
sal_uInt32 nBgColor = aColor.GetColor();
- if (nBgColor == COL_AUTO)
- aSHD.setCvBack(0xFF000000);
+ if ( nBgColor == COL_AUTO )
+ aSHD.setCvBack( 0xFF000000 );
else
- aSHD.setCvBack(wwUtility::RGBToBGR(nBgColor));
+ aSHD.setCvBack( wwUtility::RGBToBGR( nBgColor ) );
- aSHD.Write(*this);
+ aSHD.Write( m_rWW8Export );
}
}
}
-void SwWW8Writer::WriteText()
+void WW8Export::SectionBreaksAndFrames( const SwTxtNode& rNode )
+{
+ // output page/section breaks
+ OutputSectionBreaks( rNode.GetpSwAttrSet(), rNode );
+
+ // all textframes anchored as character for the winword 7- format
+ if ( !bWrtWW8 && !bIsInTable )
+ OutWW6FlyFrmsInCntnt( rNode );
+}
+
+void MSWordExportBase::WriteText()
{
#ifdef DEBUG
::std::clog << "<WriteText>" << ::std::endl;
@@ -2321,78 +2421,69 @@ void SwWW8Writer::WriteText()
#endif
while( pCurPam->GetPoint()->nNode < pCurPam->GetMark()->nNode ||
- (pCurPam->GetPoint()->nNode == pCurPam->GetMark()->nNode &&
- pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex()) )
+ ( pCurPam->GetPoint()->nNode == pCurPam->GetMark()->nNode &&
+ pCurPam->GetPoint()->nContent.GetIndex() <= pCurPam->GetMark()->nContent.GetIndex() ) )
{
SwNode * pNd = pCurPam->GetNode();
- if (pNd->IsTxtNode()) // blitzschnelle Methode
- {
- const SwTxtNode* pTxtNode = pNd->GetTxtNode();
- Out_SfxBreakItems(pTxtNode->GetpSwAttrSet(), *pTxtNode);
- // all textframes anchored as character for the winword 7- format
- if (!bWrtWW8 && !bIsInTable)
- OutWW8FlyFrmsInCntnt(*pTxtNode);
- }
+ if ( pNd->IsTxtNode() )
+ SectionBreaksAndFrames( *pNd->GetTxtNode() );
- if( pNd->IsCntntNode() )
+ // output the various types of nodes
+ if ( pNd->IsCntntNode() )
{
SwCntntNode* pCNd = (SwCntntNode*)pNd;
- const SwPageDesc* pTemp =
- pCNd->GetSwAttrSet().GetPageDesc().GetPageDesc();
- if (pTemp)
+ const SwPageDesc* pTemp = pCNd->GetSwAttrSet().GetPageDesc().GetPageDesc();
+ if ( pTemp )
pAktPageDesc = pTemp;
pCurPam->GetPoint()->nContent.Assign( pCNd, 0 );
- Out( aWW8NodeFnTab, *pCNd, *this );
+ OutputContentNode( *pCNd );
}
- else if( pNd->IsTableNode() )
+ else if ( pNd->IsTableNode() )
{
- mpTableInfo->processSwTable(&(dynamic_cast<SwTableNode *>(pNd)->GetTable()));
+ mpTableInfo->processSwTable( &pNd->GetTableNode()->GetTable() );
}
- else if( pNd->IsSectionNode() && TXT_MAINTEXT == nTxtTyp )
- OutWW8_SwSectionNode( *this, *pNd->GetSectionNode() );
- else if( TXT_MAINTEXT == nTxtTyp && pNd->IsEndNode() &&
- pNd->StartOfSectionNode()->IsSectionNode() )
+ else if ( pNd->IsSectionNode() && TXT_MAINTEXT == nTxtTyp )
+ OutputSectionNode( *pNd->GetSectionNode() );
+ else if ( TXT_MAINTEXT == nTxtTyp && pNd->IsEndNode() &&
+ pNd->StartOfSectionNode()->IsSectionNode() )
{
const SwSection& rSect = pNd->StartOfSectionNode()->GetSectionNode()
->GetSection();
- if( bStartTOX && TOX_CONTENT_SECTION == rSect.GetType() )
+ if ( bStartTOX && TOX_CONTENT_SECTION == rSect.GetType() )
bStartTOX = false;
SwNodeIndex aIdx( *pNd, 1 );
- if( aIdx.GetNode().IsEndNode()
- && aIdx.GetNode().StartOfSectionNode()->IsSectionNode() )
+ if ( aIdx.GetNode().IsEndNode() && aIdx.GetNode().StartOfSectionNode()->IsSectionNode() )
;
- else
- if( aIdx.GetNode().IsSectionNode() )
+ else if ( aIdx.GetNode().IsSectionNode() )
;
- else if (!bIsInTable) //No sections in table
+ else if ( !bIsInTable ) //No sections in table
{
ReplaceCr( (char)0xc ); // Indikator fuer Page/Section-Break
const SwSectionFmt* pParentFmt = rSect.GetFmt()->GetParent();
- if( !pParentFmt )
+ if ( !pParentFmt )
pParentFmt = (SwSectionFmt*)0xFFFFFFFF;
ULONG nRstLnNum;
- if( aIdx.GetNode().IsCntntNode() )
+ if ( aIdx.GetNode().IsCntntNode() )
nRstLnNum = ((SwCntntNode&)aIdx.GetNode()).GetSwAttrSet().
GetLineNumber().GetStartValue();
else
nRstLnNum = 0;
- pSepx->AppendSep( Fc2Cp( Strm().Tell() ),
- pAktPageDesc, pParentFmt, nRstLnNum );
+ AppendSection( pAktPageDesc, pParentFmt, nRstLnNum );
}
}
- else if (pNd->IsEndNode())
+ else if ( pNd->IsEndNode() )
{
- OutWW8_SwEndNode(pNd);
+ OutputEndNode( *pNd->GetEndNode() );
}
- if( pNd == &pNd->GetNodes().GetEndOfContent() )
+ if ( pNd == &pNd->GetNodes().GetEndOfContent() )
break;
SwNode * pCurrentNode = &pCurPam->GetPoint()->nNode.GetNode();
@@ -2404,7 +2495,7 @@ void SwWW8Writer::WriteText()
pCurPam->GetPoint()->nNode++;
ULONG nPos = pCurPam->GetPoint()->nNode.GetIndex();
- ::SetProgressState( nPos, pCurPam->GetDoc()->GetDocShell() ); // Wie weit ?
+ ::SetProgressState( nPos, pCurPam->GetDoc()->GetDocShell() );
}
#ifdef DEBUG
@@ -2412,7 +2503,7 @@ void SwWW8Writer::WriteText()
#endif
}
-void SwWW8Writer::WriteMainText()
+void WW8Export::WriteMainText()
{
#ifdef DEBUG
::std::clog << "<WriteMainText>" << ::std::endl;
@@ -2444,7 +2535,7 @@ void SwWW8Writer::WriteMainText()
#endif
}
-void SwWW8Writer::WriteFkpPlcUsw()
+void WW8Export::WriteFkpPlcUsw()
{
if( !bWrtWW8 )
{
@@ -2460,7 +2551,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pChpPlc->WriteFkps(); // Fkp.Chpx
pPapPlc->WriteFkps(); // Fkp.Papx
- pStyles->OutStyleTab(); // Styles
+ pStyles->OutputStylesTable(); // Styles
pFtn->WritePlc( *this ); // Footnote-Ref & Text Plc
pEdn->WritePlc( *this ); // Endnote-Ref & Text Plc
pAtn->WritePlc( *this ); // Annotation-Ref & Text Plc
@@ -2470,7 +2561,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pPapPlc->WritePlc(); // Plcx.Papx
maFontHelper.WriteFontTable(pTableStrm, *pFib); // FFNs
if( pRedlAuthors )
- pRedlAuthors->Write( *this ); // sttbfRMark (RedlineAuthors)
+ pRedlAuthors->Write( GetWriter() ); // sttbfRMark (RedlineAuthors)
pFldMain->Write( *this ); // Fields ( Main Text )
pFldHdFt->Write( *this ); // Fields ( Header/Footer )
pFldFtn->Write( *this ); // Fields ( FootNotes )
@@ -2492,7 +2583,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pSepx->WriteSepx( Strm() ); // Sepx
// Ausagbe in Table-Stream
- pStyles->OutStyleTab(); // fuer WW8 StyleTab
+ pStyles->OutputStylesTable(); // fuer WW8 StyleTab
pFtn->WritePlc( *this ); // Footnote-Ref & Text Plc
pEdn->WritePlc( *this ); // Endnote-Ref & Text Plc
pTxtBxs->WritePlc( *this ); // Textbox Text Plc
@@ -2506,7 +2597,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pPapPlc->WritePlc(); // Plcx.Papx
if( pRedlAuthors )
- pRedlAuthors->Write( *this ); // sttbfRMark (RedlineAuthors)
+ pRedlAuthors->Write( GetWriter() ); // sttbfRMark (RedlineAuthors)
pFldMain->Write( *this ); // Fields ( Main Text )
pFldHdFt->Write( *this ); // Fields ( Header/Footer )
pFldFtn->Write( *this ); // Fields ( FootNotes )
@@ -2537,7 +2628,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
#10570# Similiarly having msvbasic storage seems to also trigger
creating this stream
*/
- GetStorage().OpenSotStorage(CREATE_CONST_ASC(SL::aObjectPool),
+ GetWriter().GetStorage().OpenSotStorage(CREATE_CONST_ASC(SL::aObjectPool),
STREAM_READWRITE | STREAM_SHARE_DENYALL);
}
@@ -2552,9 +2643,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pBkmks->Write( *this ); // Bookmarks - sttbfBkmk/
// plcfBkmkf/plcfBkmkl
- OutListTab(); // listformats - LSTF
- OutOverrideListTab(); // - "" - - LFO
- OutListNamesTab(); // - "" - - ListNames
+ WriteNumbering();
RestoreMacroCmds();
@@ -2573,7 +2662,7 @@ void SwWW8Writer::WriteFkpPlcUsw()
pFib->Write( Strm() ); // FIB
}
-void SwWW8Writer::StoreDoc1()
+void WW8Export::StoreDoc1()
{
bool bNeedsFinalPara = false;
// Start of Text ( Mangel ueber )
@@ -2610,7 +2699,7 @@ void SwWW8Writer::StoreDoc1()
WriteFkpPlcUsw(); // FKP, PLC, .....
}
-void SwWW8Writer::AddLinkTarget(const String& rURL)
+void MSWordExportBase::AddLinkTarget(const String& rURL)
{
if( !rURL.Len() || rURL.GetChar(0) != INET_MARK_TOKEN )
return;
@@ -2646,12 +2735,7 @@ void SwWW8Writer::AddLinkTarget(const String& rURL)
}
}
-void SwWW8Writer::AddBookmark(String sBkmkName)
-{
- pBkmks->Append(Fc2Cp(Strm().Tell()), BookmarkToWord(sBkmkName));
-}
-
-void SwWW8Writer::CollectOutlineBookmarks(const SwDoc &rDoc)
+void MSWordExportBase::CollectOutlineBookmarks(const SwDoc &rDoc)
{
const SwFmtINetFmt* pINetFmt;
const SwTxtINetFmt* pTxtAttr;
@@ -2696,7 +2780,7 @@ void SwWW8Writer::CollectOutlineBookmarks(const SwDoc &rDoc)
namespace
{
-#define WW_BLOCKSIZE 0x200
+ const ULONG WW_BLOCKSIZE = 0x200;
void EncryptRC4(svx::MSCodec_Std97& rCtx, SvStream &rIn, SvStream &rOut)
{
@@ -2716,7 +2800,7 @@ namespace
}
}
-ULONG SwWW8Writer::StoreDoc()
+void MSWordExportBase::ExportDocument( bool bWriteAll )
{
nCharFmtStart = ANZ_DEFAULT_STYLES;
nFmtCollStart = nCharFmtStart + pDoc->GetCharFmts()->Count() - 1;
@@ -2741,64 +2825,91 @@ ULONG SwWW8Writer::StoreDoc()
pOutFmtNode = 0;
pEscher = 0;
pRedlAuthors = 0;
- if( aTOXArr.Count() )
+ if ( aTOXArr.Count() )
aTOXArr.Remove( 0, aTOXArr.Count() );
- if( !pOLEExp )
+ if ( !pOLEExp )
{
UINT32 nSvxMSDffOLEConvFlags = 0;
const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
- if( pOpt->IsMath2MathType() )
+ if ( pOpt->IsMath2MathType() )
nSvxMSDffOLEConvFlags |= OLE_STARMATH_2_MATHTYPE;
- if( pOpt->IsWriter2WinWord() )
+ if ( pOpt->IsWriter2WinWord() )
nSvxMSDffOLEConvFlags |= OLE_STARWRITER_2_WINWORD;
- if( pOpt->IsCalc2Excel() )
+ if ( pOpt->IsCalc2Excel() )
nSvxMSDffOLEConvFlags |= OLE_STARCALC_2_EXCEL;
- if( pOpt->IsImpress2PowerPoint() )
+ if ( pOpt->IsImpress2PowerPoint() )
nSvxMSDffOLEConvFlags |= OLE_STARIMPRESS_2_POWERPOINT;
pOLEExp = new SvxMSExportOLEObjects( nSvxMSDffOLEConvFlags );
}
- if( !pOleMap)
+ if ( !pOleMap)
pOleMap = new WW8OleMaps;
- if( !pOCXExp )
- pOCXExp = new SwMSConvertControls(pDoc->GetDocShell(),pCurPam);
-
- PrepareStorage();
+ if ( !pOCXExp )
+ pOCXExp = new SwMSConvertControls( pDoc->GetDocShell(), pCurPam );
// --> OD 2007-10-08 #i81405#
// Collect anchored objects before changing the redline mode.
- if (bWrtWW8)
- maFrames = GetAllFrames(*pDoc, bWriteAll ? 0 : pOrigPam);
- else
- maFrames = GetNonDrawingFrames(*pDoc, bWriteAll ? 0 : pOrigPam);
+ maFrames = GetFrames( *pDoc, bWriteAll? NULL : pOrigPam );
// <--
- USHORT nRedlineMode = pDoc->GetRedlineMode();
- if (pDoc->GetRedlineTbl().Count())
+ mnRedlineMode = pDoc->GetRedlineMode();
+ if ( pDoc->GetRedlineTbl().Count() )
{
- pDoc->SetRedlineMode((RedlineMode_t)(nRedlineMode | nsRedlineMode_t::REDLINE_SHOW_DELETE |
- nsRedlineMode_t::REDLINE_SHOW_INSERT));
+ pDoc->SetRedlineMode( (RedlineMode_t)(mnRedlineMode | nsRedlineMode_t::REDLINE_SHOW_DELETE |
+ nsRedlineMode_t::REDLINE_SHOW_INSERT) );
}
- maFontHelper.InitFontTable(bWrtWW8, *pDoc);
+ maFontHelper.InitFontTable( HackIsWW8OrHigher(), *pDoc );
GatherChapterFields();
+ CollectOutlineBookmarks(*pDoc);
+
+ // make unique OrdNums (Z-Order) for all drawing-/fly Objects
+ if ( pDoc->GetDrawModel() )
+ pDoc->GetDrawModel()->GetPage( 0 )->RecalcObjOrdNums();
+
+ ExportDocument_Impl();
+
+ if ( mnRedlineMode != pDoc->GetRedlineMode() )
+ pDoc->SetRedlineMode( (RedlineMode_t)(mnRedlineMode) );
+}
+
+String SwWW8Writer::GetPassword()
+{
+ String sUniPassword;
+ if ( mpMedium )
+ {
+ SfxItemSet* pSet = mpMedium->GetItemSet();
+
+ const SfxPoolItem* pPasswordItem = NULL;
+ if ( pSet && SFX_ITEM_SET == pSet->GetItemState( SID_PASSWORD, sal_True, &pPasswordItem ) )
+ if( pPasswordItem != NULL )
+ sUniPassword = ( (const SfxStringItem*)pPasswordItem )->GetValue();
+ }
+
+ return sUniPassword;
+}
+
+void WW8Export::ExportDocument_Impl()
+{
+ PrepareStorage();
+
pFib = new WW8Fib( bWrtWW8 ? 8 : 6 );
- SvStream* pOldStrm = pStrm; // JP 19.05.99: wozu das ???
- SvStorageStreamRef xWwStrm( pStg->OpenSotStream( aMainStg ) );
+ SvStream* pOldStrm = &(Strm()); // JP 19.05.99: wozu das ???
+ SvStorageStreamRef xWwStrm( GetWriter().GetStorage().OpenSotStream( aMainStg ) );
SvStorageStreamRef xTableStrm( xWwStrm ), xDataStrm( xWwStrm );
xWwStrm->SetBufferSize( 32768 );
if( bWrtWW8 )
{
pFib->fWhichTblStm = 1;
- xTableStrm = pStg->OpenSotStream(CREATE_CONST_ASC(SL::a1Table),
+ xTableStrm = GetWriter().GetStorage().OpenSotStream(CREATE_CONST_ASC(SL::a1Table),
STREAM_STD_WRITE );
- xDataStrm = pStg->OpenSotStream(CREATE_CONST_ASC(SL::aData),
+ xDataStrm = GetWriter().GetStorage().OpenSotStream(CREATE_CONST_ASC(SL::aData),
STREAM_STD_WRITE );
xDataStrm->SetBufferSize( 32768 ); // fuer Grafiken
@@ -2808,22 +2919,13 @@ ULONG SwWW8Writer::StoreDoc()
xDataStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
}
- pStrm = &xWwStrm;
+ GetWriter().SetStrm( *xWwStrm );
pTableStrm = &xTableStrm;
pDataStrm = &xDataStrm;
- pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
-
- String sUniPassword;
- if ( mpMedium )
- {
- SfxItemSet* pSet = mpMedium->GetItemSet();
+ Strm().SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
- const SfxPoolItem* pPasswordItem = NULL;
- if ( pSet && SFX_ITEM_SET == pSet->GetItemState( SID_PASSWORD, sal_True, &pPasswordItem ) )
- if( pPasswordItem != NULL )
- sUniPassword = ( (const SfxStringItem*)pPasswordItem )->GetValue();
- }
+ String sUniPassword( GetWriter().GetPassword() );
utl::TempFile aTempMain;
aTempMain.EnableKillingFile();
@@ -2839,7 +2941,7 @@ ULONG SwWW8Writer::StoreDoc()
{
bEncrypt =true;
- pStrm = aTempMain.GetStream( STREAM_READWRITE | STREAM_SHARE_DENYWRITE );
+ GetWriter().SetStrm( *aTempMain.GetStream( STREAM_READWRITE | STREAM_SHARE_DENYWRITE ) );
pTableStrm = aTempTable.GetStream( STREAM_READWRITE | STREAM_SHARE_DENYWRITE );
@@ -2849,53 +2951,11 @@ ULONG SwWW8Writer::StoreDoc()
pTableStrm->Write( aRC4EncryptionHeader, 52 );
}
- const SwSectionFmt *pFmt=0;
// Default: "Standard"
- pAktPageDesc = &const_cast<const SwDoc *>(pDoc)->GetPageDesc( 0 );
- pSepx = new WW8_WrPlcSepx; // Sepx
- {
- const SfxPoolItem* pI;
- const SwNode* pNd = pCurPam->GetCntntNode();
- const SfxItemSet* pSet = pNd ? &((SwCntntNode*)pNd)->GetSwAttrSet()
- : 0;
-
- ULONG nRstLnNum = pSet ? ((SwFmtLineNumber&)pSet->Get(
- RES_LINENUMBER )).GetStartValue()
- : 0;
-
- const SwTableNode* pTblNd = pCurPam->GetNode()->FindTableNode();
- const SwSectionNode* pSectNd;
- if( pTblNd )
- {
- pSet = &pTblNd->GetTable().GetFrmFmt()->GetAttrSet();
- pNd = pTblNd;
- }
- else if( 0 != ( pSectNd = pNd->FindSectionNode() ) )
- {
- if( TOX_HEADER_SECTION == pSectNd->GetSection().GetType() &&
- pSectNd->StartOfSectionNode()->IsSectionNode() )
- pSectNd = pSectNd->StartOfSectionNode()->GetSectionNode();
-
- if( TOX_CONTENT_SECTION == pSectNd->GetSection().GetType() )
- {
- pNd = pSectNd;
- pCurPam->GetPoint()->nNode = *pNd;
- }
-
- if (CONTENT_SECTION == pSectNd->GetSection().GetType())
- pFmt = pSectNd->GetSection().GetFmt();
- }
-
- // Hole evtl. Pagedesc des 1. Nodes
- if( pSet && SFX_ITEM_ON == pSet->GetItemState(RES_PAGEDESC, true, &pI)
- && ((SwFmtPageDesc*)pI)->GetPageDesc() )
- pSepx->AppendSep( 0, *(SwFmtPageDesc*)pI, *pNd, pFmt, nRstLnNum );
- else
- pSepx->AppendSep( 0, pAktPageDesc, pFmt, nRstLnNum );
- }
+ pSepx = new WW8_WrPlcSepx( *this ); // Sections/headers/footers
- pFtn = new WW8_WrPlcFtnEdn( TXT_FTN ); // Ftn
- pEdn = new WW8_WrPlcFtnEdn( TXT_EDN ); // Edn
+ pFtn = new WW8_WrPlcFtnEdn( TXT_FTN ); // Footnotes
+ pEdn = new WW8_WrPlcFtnEdn( TXT_EDN ); // Endnotes
pAtn = new WW8_WrPlcPostIt; // PostIts
pTxtBxs = new WW8_WrPlcTxtBoxes( TXT_TXTBOX );
pHFTxtBxs = new WW8_WrPlcTxtBoxes( TXT_HFTXTBOX );
@@ -2904,12 +2964,12 @@ ULONG SwWW8Writer::StoreDoc()
pHFSdrObjs = new HdFtPlcDrawObj; // Draw-/Fly-Objects for header/footer
pBkmks = new WW8_WrtBookmarks; // Bookmarks
- CreateBookmarkTbl();
+ GetWriter().CreateBookmarkTbl();
pPapPlc = new WW8_WrPlcPn( *this, PAP, pFib->fcMin );
pChpPlc = new WW8_WrPlcPn( *this, CHP, pFib->fcMin );
pO = new WW8Bytes( 128, 128 );
- pStyles = new WW8WrtStyle( *this );
+ pStyles = new MSWordStyles( *this );
pFldMain = new WW8_WrPlcFld( 2, TXT_MAINTEXT );
pFldHdFt = new WW8_WrPlcFld( 2, TXT_HDFT );
pFldFtn = new WW8_WrPlcFld( 2, TXT_FTN );
@@ -2925,12 +2985,10 @@ ULONG SwWW8Writer::StoreDoc()
pDop = new WW8Dop;
- pDop->fRevMarking = 0 != (nsRedlineMode_t::REDLINE_ON & nRedlineMode);
- pDop->fRMView = 0 != ( nsRedlineMode_t::REDLINE_SHOW_DELETE & nRedlineMode );
+ pDop->fRevMarking = 0 != ( nsRedlineMode_t::REDLINE_ON & mnRedlineMode );
+ pDop->fRMView = 0 != ( nsRedlineMode_t::REDLINE_SHOW_DELETE & mnRedlineMode );
pDop->fRMPrint = pDop->fRMView;
- CollectOutlineBookmarks(*pDoc);
-
// set AutoHyphenation flag if found in default para style
const SfxPoolItem* pItem;
SwTxtFmtColl* pStdTxtFmtColl =
@@ -2941,10 +2999,6 @@ ULONG SwWW8Writer::StoreDoc()
pDop->fAutoHyphen = ((const SvxHyphenZoneItem*)pItem)->IsHyphen();
}
- // make unique OrdNums (Z-Order) for all drawing-/fly Objects
- if (pDoc->GetDrawModel())
- pDoc->GetDrawModel()->GetPage( 0 )->RecalcObjOrdNums();
-
StoreDoc1();
if ( bEncrypt )
@@ -2991,7 +3045,7 @@ ULONG SwWW8Writer::StoreDoc()
pTableStrmTemp->Write( pSaltData, 16 );
pTableStrmTemp->Write( pSaltDigest, 16 );
- EncryptRC4(aCtx, *pStrm, *pStrmTemp);
+ EncryptRC4(aCtx, GetWriter().Strm(), *pStrmTemp);
// Write Unencrypted Fib 68 bytes to the start of the workdocument stream
pFib->fEncrypted = 1; // fEncrypted indicates the document is encrypted.
@@ -3003,9 +3057,6 @@ ULONG SwWW8Writer::StoreDoc()
pFib->WriteHeader( *pStrmTemp );
}
- if (nRedlineMode != pDoc->GetRedlineMode())
- pDoc->SetRedlineMode((RedlineMode_t)(nRedlineMode));
-
if (pUsedNumTbl) // all used NumRules
{
// clear the part of the list array that was copied from the document
@@ -3042,7 +3093,7 @@ ULONG SwWW8Writer::StoreDoc()
delete pPiece;
delete pDop;
delete pFib;
- pStrm = pOldStrm;
+ GetWriter().SetStrm( *pOldStrm );
xWwStrm->SetBufferSize( 0 );
@@ -3054,15 +3105,13 @@ ULONG SwWW8Writer::StoreDoc()
{
xDataStrm.Clear();
pDataStrm = 0;
- pStg->Remove(CREATE_CONST_ASC(SL::aData));
+ GetWriter().GetStorage().Remove(CREATE_CONST_ASC(SL::aData));
}
}
-
- return 0;
}
-void SwWW8Writer::PrepareStorage()
+void WW8Export::PrepareStorage()
{
ULONG nLen;
const BYTE* pData;
@@ -3123,8 +3172,8 @@ void SwWW8Writer::PrepareStorage()
SvGlobalName aGName( nId1, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x46 );
- pStg->SetClass( aGName, 0, String::CreateFromAscii( pName ));
- SvStorageStreamRef xStor( pStg->OpenSotStream(sCompObj) );
+ GetWriter().GetStorage().SetClass( aGName, 0, String::CreateFromAscii( pName ));
+ SvStorageStreamRef xStor( GetWriter().GetStorage().OpenSotStream(sCompObj) );
xStor->Write( pData, nLen );
SwDocShell* pDocShell = pDoc->GetDocShell ();
@@ -3145,10 +3194,10 @@ void SwWW8Writer::PrepareStorage()
pDocShell->GetPreviewMetaFile (sal_False);
uno::Sequence<sal_uInt8> metaFile(
sfx2::convertMetaFile(pMetaFile.get()));
- sfx2::SaveOlePropertySet(xDocProps, pStg, &metaFile);
+ sfx2::SaveOlePropertySet(xDocProps, &GetWriter().GetStorage(), &metaFile);
}
else
- sfx2::SaveOlePropertySet( xDocProps, pStg );
+ sfx2::SaveOlePropertySet( xDocProps, &GetWriter().GetStorage() );
}
}
}
@@ -3172,11 +3221,16 @@ ULONG SwWW8Writer::WriteStorage()
pCurPam->GetPoint()->nNode = *pTNd;
}
- ULONG nRet = StoreDoc();
+ // Do the actual export
+ {
+ WW8Export aExport( this, pDoc, pCurPam, pOrigPam, m_bWrtWW8 );
+ m_pExport = &aExport;
+ aExport.ExportDocument( bWriteAll );
+ m_pExport = NULL;
+ }
::EndProgress( pDoc->GetDocShell() );
- bWrtWW8 = false; // sicherheitshalber: Default fuer's naechste Mal
- return nRet;
+ return 0;
}
ULONG SwWW8Writer::WriteMedium( SfxMedium& )
@@ -3185,7 +3239,7 @@ ULONG SwWW8Writer::WriteMedium( SfxMedium& )
}
ULONG SwWW8Writer::Write( SwPaM& rPaM, SfxMedium& rMed,
- const String* pFileName )
+ const String* pFileName )
{
mpMedium = &rMed;
ULONG nRet = StgWriter::Write( rPaM, rMed, pFileName );
@@ -3193,43 +3247,69 @@ ULONG SwWW8Writer::Write( SwPaM& rPaM, SfxMedium& rMed,
return nRet;
}
-ULONG SwWW8Writer::Write( SwPaM& rPaM, const uno::Reference < embed::XStorage >& xStorage, const String* pFileName, SfxMedium* pMedium )
+MSWordExportBase::MSWordExportBase( SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam )
+ : aMainStg(sMainStream), pISet(0), pUsedNumTbl(0), mpTopNodeOfHdFtPage(0),
+ pBmpPal(0), pKeyMap(0), pOLEExp(0), pOCXExp(0), pOleMap(0),
+ mpTableInfo(new ww8::WW8TableInfo()), nUniqueList(0),
+ mnHdFtIndex(0), pAktPageDesc(0), pPapPlc(0), pChpPlc(0), pChpIter(0),
+ pStyles( NULL ),
+ bHasHdr(false), bHasFtr(false),
+ pDoc( pDocument ),
+ pCurPam( pCurrentPam ),
+ pOrigPam( pOriginalPam )
+{
+}
+
+MSWordExportBase::~MSWordExportBase()
+{
+ delete pBmpPal;
+ if (pKeyMap)
+ delete[] (NfKeywordTable*)pKeyMap;
+ delete pOLEExp;
+ delete pOCXExp;
+ delete pOleMap;
+}
+
+WW8Export::WW8Export( SwWW8Writer *pWriter,
+ SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam,
+ bool bIsWW8 )
+ : MSWordExportBase( pDocument, pCurrentPam, pOriginalPam ),
+ pO( NULL ),
+ mpTableAt( NULL ),
+ mnTableStdAtLen( 0 ),
+ pSepx( NULL ),
+ bWrtWW8( bIsWW8 ),
+ m_pWriter( pWriter ),
+ m_pAttrOutput( new WW8AttributeOutput( *this ) )
{
- // this method was added to let the windows compiler be happy, otherwise it shows warning
- return StgWriter::Write( rPaM, xStorage, pFileName, pMedium );
}
-ULONG SwWW8Writer::Write( SwPaM& rPaM, SotStorage& rStorage, const String* pFileName )
+WW8Export::~WW8Export()
{
- // this method was added to let the windows compiler be happy, otherwise it shows warning
- return StgWriter::Write( rPaM, rStorage, pFileName );
+ delete m_pAttrOutput, m_pAttrOutput = NULL;
}
-ULONG SwWW8Writer::Write( SwPaM& rPaM, SvStream& rStream, const String* pFileName )
+AttributeOutputBase& WW8Export::AttrOutput() const
{
- // this method was added to let the solaris compiler be happy, otherwise it shows warning
- return StgWriter::Write( rPaM, rStream, pFileName );
+ return *m_pAttrOutput;
+}
+
+MSWordSections& WW8Export::Sections() const
+{
+ return *pSepx;
}
SwWW8Writer::SwWW8Writer(const String& rFltName, const String& rBaseURL)
- : aMainStg(sMainStream), pISet(0), pUsedNumTbl(0), mpTopNodeOfHdFtPage(0),
- pBmpPal(0), pKeyMap(0), pOLEExp(0), pOCXExp(0), pOleMap(0),
- mpTableInfo(new ww8::WW8TableInfo()), nUniqueList(0),
- mnHdFtIndex(0), mpMedium(0), pAktPageDesc(0), pPapPlc(0), pChpPlc(0), pChpIter(0), pO(0),
- bHasHdr(false), bHasFtr(false)
+ : StgWriter(),
+ m_bWrtWW8( rFltName.EqualsAscii( FILTER_WW8 ) ),
+ m_pExport( NULL ),
+ mpMedium( 0 )
{
SetBaseURL( rBaseURL );
- bWrtWW8 = rFltName.EqualsAscii(FILTER_WW8);
}
SwWW8Writer::~SwWW8Writer()
{
- delete pBmpPal;
- if (pKeyMap)
- delete[] (NfKeywordTable*)pKeyMap;
- delete pOLEExp;
- delete pOCXExp;
- delete pOleMap;
}
extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL ExportDOC( const String& rFltName, const String& rBaseURL, WriterRef& xRet )
@@ -3237,7 +3317,7 @@ extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL ExportDOC( const String& rFltName,
xRet = new SwWW8Writer( rFltName, rBaseURL );
}
-bool WW8_WrPlcFtnEdn::WriteTxt( SwWW8Writer& rWrt )
+bool WW8_WrPlcFtnEdn::WriteTxt( WW8Export& rWrt )
{
bool bRet = false;
if (TXT_FTN == nTyp)
@@ -3256,7 +3336,7 @@ bool WW8_WrPlcFtnEdn::WriteTxt( SwWW8Writer& rWrt )
return bRet;
}
-void WW8_WrPlcFtnEdn::WritePlc( SwWW8Writer& rWrt ) const
+void WW8_WrPlcFtnEdn::WritePlc( WW8Export& rWrt ) const
{
if( TXT_FTN == nTyp )
{
@@ -3273,7 +3353,7 @@ void WW8_WrPlcFtnEdn::WritePlc( SwWW8Writer& rWrt ) const
}
-bool WW8_WrPlcPostIt::WriteTxt(SwWW8Writer& rWrt)
+bool WW8_WrPlcPostIt::WriteTxt( WW8Export& rWrt )
{
bool bRet = WriteGenericTxt( rWrt, TXT_ATN, rWrt.pFib->ccpAtn );
rWrt.pFldAtn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ),
@@ -3282,14 +3362,14 @@ bool WW8_WrPlcPostIt::WriteTxt(SwWW8Writer& rWrt)
return bRet;
}
-void WW8_WrPlcPostIt::WritePlc( SwWW8Writer& rWrt ) const
+void WW8_WrPlcPostIt::WritePlc( WW8Export& rWrt ) const
{
WriteGenericPlc( rWrt, TXT_ATN, rWrt.pFib->fcPlcfandTxt,
rWrt.pFib->lcbPlcfandTxt, rWrt.pFib->fcPlcfandRef,
rWrt.pFib->lcbPlcfandRef );
}
-void WW8_WrPlcTxtBoxes::WritePlc( SwWW8Writer& rWrt ) const
+void WW8_WrPlcTxtBoxes::WritePlc( WW8Export& rWrt ) const
{
if( TXT_TXTBOX == nTyp )
{
@@ -3305,7 +3385,7 @@ void WW8_WrPlcTxtBoxes::WritePlc( SwWW8Writer& rWrt ) const
}
}
-void SwWW8Writer::RestoreMacroCmds()
+void WW8Export::RestoreMacroCmds()
{
pFib->fcCmds = pTableStrm->Tell();
@@ -3339,23 +3419,25 @@ void SwWW8Writer::RestoreMacroCmds()
pFib->lcbCmds = pTableStrm->Tell() - pFib->fcCmds;
}
-void WW8SHDLong::Write(SwWW8Writer & rWriter)
+void WW8SHDLong::Write( WW8Export& rExport )
{
- rWriter.InsUInt32(m_cvFore);
- rWriter.InsUInt32(m_cvBack);
- rWriter.InsUInt16(m_ipat);
+ rExport.InsUInt32( m_cvFore );
+ rExport.InsUInt32( m_cvBack );
+ rExport.InsUInt16( m_ipat );
}
-void SwWW8Writer::WriteFormData(const ::sw::mark::IFieldmark& rFieldmark)
+void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
{
- ASSERT(bWrtWW8, "No 95 export yet");
- if (!bWrtWW8) return;
+ ASSERT( bWrtWW8, "No 95 export yet" );
+ if ( !bWrtWW8 )
+ return;
const ::sw::mark::IFieldmark* pFieldmark = &rFieldmark;
- const ::sw::mark::ICheckboxFieldmark* pAsCheckbox = dynamic_cast< const ::sw::mark::ICheckboxFieldmark* >(pFieldmark);
+ const ::sw::mark::ICheckboxFieldmark* pAsCheckbox = dynamic_cast< const ::sw::mark::ICheckboxFieldmark* >( pFieldmark );
- int type=0; // TextFieldmark
- if(pAsCheckbox) type=1;
+ int type = 0; // TextFieldmark
+ if ( pAsCheckbox )
+ type = 1;
const ::rtl::OUString ffname = rFieldmark.GetFieldname();
@@ -3374,7 +3456,7 @@ void SwWW8Writer::WriteFormData(const ::sw::mark::IFieldmark& rFieldmark)
BYTE* pDataAdr = aArr1 + 2;
Set_UInt32(pDataAdr, nDataStt);
- pChpPlc->AppendFkpEntry(Strm().Tell(), sizeof(aArr1), aArr1);
+ pChpPlc->AppendFkpEntry( Strm().Tell(), sizeof( aArr1 ), aArr1 );
sal_uInt8 aFldHeader[] =
{
@@ -3383,10 +3465,10 @@ void SwWW8Writer::WriteFormData(const ::sw::mark::IFieldmark& rFieldmark)
};
aFldHeader[4] |= (type & 0x03);
- int ffres=0; // rFieldmark.GetFFRes();
- if(pAsCheckbox && pAsCheckbox->IsChecked())
- ffres=1;
- aFldHeader[4] |= ((ffres<<2) & 0x7C);
+ int ffres = 0; // rFieldmark.GetFFRes();
+ if ( pAsCheckbox && pAsCheckbox->IsChecked() )
+ ffres = 1;
+ aFldHeader[4] |= ( (ffres<<2) & 0x7C );
const ::rtl::OUString ffdeftext;
const ::rtl::OUString ffformat;
@@ -3405,42 +3487,39 @@ void SwWW8Writer::WriteFormData(const ::sw::mark::IFieldmark& rFieldmark)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // | /16
0,0,0,0, // / /4
};
- int slen=sizeof(aFldData)
- +sizeof(aFldHeader)
- +2*ffname.getLength()+4
- +2*ffdeftext.getLength()+4
- +2*ffformat.getLength()+4
- +2*ffhelptext.getLength()+4
- +2*ffstattext.getLength()+4
- +2*ffentrymcr.getLength()+4
- +2*ffexitmcr.getLength()+4;
+ int slen = sizeof( aFldData )
+ + sizeof( aFldHeader )
+ + 2*ffname.getLength() + 4
+ + 2*ffdeftext.getLength() + 4
+ + 2*ffformat.getLength() + 4
+ + 2*ffhelptext.getLength() + 4
+ + 2*ffstattext.getLength() + 4
+ + 2*ffentrymcr.getLength() + 4
+ + 2*ffexitmcr.getLength() + 4;
#ifdef OSL_BIGENDIAN
- slen=SWAPLONG(slen);
+ slen = SWAPLONG( slen );
#endif // OSL_BIGENDIAN
- *((sal_uInt32 *)aFldData)=slen;
- int len=sizeof(aFldData);
- OSL_ENSURE(len==0x44,
- "SwWW8Writer::WriteFormData(..)"
- " - wrong aFldData length");
- pDataStrm->Write(aFldData, len);
-
- len=sizeof(aFldHeader);
- OSL_ENSURE(len==8,
- "SwWW8Writer::WriteFormData(..)"
- " - wrong aFldHeader length");
- pDataStrm->Write(aFldHeader, len);
-
- WriteString_xstz(*pDataStrm, ffname, true); // Form field name
-
- if (type==0)
- WriteString_xstz(*pDataStrm, ffdeftext, true);
+ *( (sal_uInt32 *)aFldData ) = slen;
+ int len = sizeof( aFldData );
+ OSL_ENSURE( len == 0x44, "SwWW8Writer::WriteFormData(..) - wrong aFldData length" );
+ pDataStrm->Write( aFldData, len );
+
+ len = sizeof( aFldHeader );
+ OSL_ENSURE( len == 8, "SwWW8Writer::WriteFormData(..) - wrong aFldHeader length" );
+ pDataStrm->Write( aFldHeader, len );
+
+ SwWW8Writer::WriteString_xstz( *pDataStrm, ffname, true ); // Form field name
+
+ if ( type == 0 )
+ SwWW8Writer::WriteString_xstz( *pDataStrm, ffdeftext, true );
else
- pDataStrm->WriteNumber((sal_uInt16)0);
- WriteString_xstz(*pDataStrm, String(ffformat), true);
- WriteString_xstz(*pDataStrm, String(ffhelptext), true);
- WriteString_xstz(*pDataStrm, String(ffstattext), true);
- WriteString_xstz(*pDataStrm, String(ffentrymcr), true);
- WriteString_xstz(*pDataStrm, String(ffexitmcr), true);
+ pDataStrm->WriteNumber( (sal_uInt16)0 );
+
+ SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffformat ), true );
+ SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffhelptext ), true );
+ SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffstattext ), true );
+ SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffentrymcr ), true );
+ SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffexitmcr ), true );
// if (type==2) {
// // 0xFF, 0xFF
// // sal_uInt32 number of strings
@@ -3448,30 +3527,30 @@ void SwWW8Writer::WriteFormData(const ::sw::mark::IFieldmark& rFieldmark)
// }
}
-void SwWW8Writer::OutWW8_TableNodeInfoInner(ww8::WW8TableNodeInfoInner::Pointer_t pNodeInfoInner)
+void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer_t pNodeInfoInner )
{
SVBT16 nStyle;
- ShortToSVBT16(nStyleBeforeFly, nStyle);
+ ShortToSVBT16( m_rWW8Export.nStyleBeforeFly, nStyle );
#ifdef DEBUG
::std::clog << "<OutWW8_TableNodeInfoInner>" << pNodeInfoInner->toString();
#endif
- pO->Remove( 0, pO->Count() ); // leeren
+ m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // leeren
if (pNodeInfoInner->isEndOfCell())
{
#ifdef DEBUG
::std::clog << "<endOfCell/>" << ::std::endl;
#endif
- WriteCR(pNodeInfoInner);
+ m_rWW8Export.WriteCR(pNodeInfoInner);
- pO->Insert( (BYTE*)&nStyle, 2, pO->Count() ); // Style #
- OutWW8TableInfoCell(pNodeInfoInner);
- pPapPlc->AppendFkpEntry( Strm().Tell(), pO->Count(),
- pO->GetData() );
+ m_rWW8Export.pO->Insert( (BYTE*)&nStyle, 2, m_rWW8Export.pO->Count() ); // Style #
+ TableInfoCell(pNodeInfoInner);
+ m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(),
+ m_rWW8Export.pO->GetData() );
- pO->Remove( 0, pO->Count() ); // leeren
+ m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // leeren
}
if (pNodeInfoInner->isEndOfLine())
@@ -3479,28 +3558,27 @@ void SwWW8Writer::OutWW8_TableNodeInfoInner(ww8::WW8TableNodeInfoInner::Pointer_
#ifdef DEBUG
::std::clog << "<endOfLine/>" << ::std::endl;
#endif
- WriteRowEnd(pNodeInfoInner->getDepth());
+ TableRowEnd(pNodeInfoInner->getDepth());
- pO->Insert( (BYTE*)&nStyle, 2, pO->Count() ); // Style #
- OutWW8TableInfoRow(pNodeInfoInner);
- pPapPlc->AppendFkpEntry( Strm().Tell(), pO->Count(),
- pO->GetData() );
+ m_rWW8Export.pO->Insert( (BYTE*)&nStyle, 2, m_rWW8Export.pO->Count() ); // Style #
+ TableInfoRow(pNodeInfoInner);
+ m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(),
+ m_rWW8Export.pO->GetData() );
- pO->Remove( 0, pO->Count() ); // leeren
+ m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() ); // leeren
}
#ifdef DEBUG
::std::clog << "</OutWW8_TableNodeInfoInner>" << ::std::endl;
#endif
}
-void SwWW8Writer::OutWW8_SwEndNode(SwNode * pNode)
+void MSWordExportBase::OutputEndNode( const SwEndNode &rNode )
{
#ifdef DEBUG
- ::std::clog << "<OutWW8_SwEndNode>" << dbg_out(pNode) << ::std::endl;
+ ::std::clog << "<OutWW8_SwEndNode>" << dbg_out(&rNode) << ::std::endl;
#endif
- ww8::WW8TableNodeInfo::Pointer_t pNodeInfo =
- mpTableInfo->getTableNodeInfo(pNode);
+ ww8::WW8TableNodeInfo::Pointer_t pNodeInfo = mpTableInfo->getTableNodeInfo( &rNode );
if (pNodeInfo)
{
@@ -3516,7 +3594,7 @@ void SwWW8Writer::OutWW8_SwEndNode(SwNode * pNode)
while (aIt != aEnd)
{
ww8::WW8TableNodeInfoInner::Pointer_t pInner = aIt->second;
- OutWW8_TableNodeInfoInner(pInner);
+ AttrOutput().TableNodeInfoInner(pInner);
aIt++;
}
}
@@ -3524,9 +3602,6 @@ void SwWW8Writer::OutWW8_SwEndNode(SwNode * pNode)
#ifdef DEBUG
::std::clog << "</OutWW8_SwEndNode>" << ::std::endl;
#endif
-
}
-
-
/* vi:set tabstop=4 shiftwidth=4 expandtab: */