1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ 24 25 #ifndef _WRTWW8_HXX 26 #define _WRTWW8_HXX 27 28 #include <tools/solar.h> // UINTXX 29 #include <tools/gen.hxx> 30 #ifndef _SVSTDARR_HXX 31 #define _SVSTDARR_ULONGS 32 #include <svl/svstdarr.hxx> 33 #endif 34 #include <editeng/editdata.hxx> 35 36 #include <map> 37 #include <vector> 38 39 #include <shellio.hxx> 40 #include <wrt_fn.hxx> 41 #include <filter/msfilter/msocximex.hxx> 42 43 #include "ww8struc.hxx" 44 #include "ww8scan.hxx" 45 #include "fields.hxx" 46 #include "types.hxx" 47 #include "writerhelper.hxx" 48 #include "../inc/msfilter.hxx" 49 #include <expfld.hxx> 50 51 #include <vcl/graph.hxx> 52 class SvxBrushItem; 53 54 // einige Forward Deklarationen 55 namespace msfilter 56 { 57 class MSCodec_Std97; 58 } 59 60 class WW8SwAttrIter; 61 class AttributeOutputBase; 62 class DocxAttributeOutput; 63 class RtfAttributeOutput; 64 class BitmapPalette; 65 class SwEscherEx; 66 class DateTime; 67 class Font; 68 class MSWordExportBase; 69 class SdrObject; 70 class SfxItemSet; 71 class SvStream; 72 class SvxBorderLine; 73 class SvxFontItem; 74 class SvxBoxItem; 75 class SwAttrSet; 76 class SwCharFmt; 77 class SwCntntNode; 78 class SwField; 79 class SwFmt; 80 class SwFmtCntnt; 81 class SwFmtFtn; 82 class SwFrmFmt; 83 class SwGrfNode; 84 class SwModify; 85 class SwNumFmt; 86 class SwNumRule; 87 class SwNumRuleTbl; 88 class SwPageDesc; 89 class SwFmtPageDesc; 90 class SwOLENode; 91 class SwPostItField; 92 class SwRedlineData; 93 class SwSection; 94 class SwSectionFmt; 95 class SwSectionNode; 96 class SwTableNode; 97 class SwTOXType; 98 class SwTxtAttr; 99 class SwTxtFmtColl; 100 class SwTxtNode; 101 class SwWW8WrGrf; 102 class SwWW8Writer; 103 class MSWordStyles; 104 class WW8AttributeOutput; 105 class WW8Bytes; 106 class WW8Export; 107 class MSWordAttrIter; 108 class WW8_WrFkp; 109 class WW8_WrPlc0; 110 class WW8_WrPlc1; 111 class WW8_WrPlcFld; 112 class WW8_WrMagicTable; 113 class WW8_WrPlcFtnEdn; 114 class WW8_WrPlcPn; 115 class WW8_WrPlcAnnotations; 116 class MSWordSections; 117 class WW8_WrPlcTxtBoxes; 118 class WW8_WrPct; // Verwaltung 119 class WW8_WrPcPtrs; 120 class WW8_WrtBookmarks; 121 class WW8_WrtRedlineAuthor; 122 class SvxMSExportOLEObjects; 123 class SwMSConvertControls; 124 class WW8OleMaps; 125 class SvStorageRef; 126 struct WW8_PdAttrDesc; 127 class SvxBrushItem; 128 129 #include "WW8TableInfo.hxx" 130 131 #define GRF_MAGIC_1 0x12 // 3 magic Bytes fuer PicLocFc-Attribute 132 #define GRF_MAGIC_2 0x34 133 #define GRF_MAGIC_3 0x56 134 #define GRF_MAGIC_321 0x563412L 135 136 #define OLE_PREVIEW_AS_EMF //If we want to export ole2 previews as emf in ww8+ 137 138 typedef sal_uInt8 FieldFlags; 139 namespace nsFieldFlags // for InsertField- Method 140 { 141 const FieldFlags WRITEFIELD_START = 0x01; 142 const FieldFlags WRITEFIELD_CMD_START = 0x02; 143 const FieldFlags WRITEFIELD_CMD_END = 0x04; 144 const FieldFlags WRITEFIELD_END = 0x10; 145 const FieldFlags WRITEFIELD_CLOSE = 0x20; 146 const FieldFlags WRITEFIELD_ALL = 0xFF; 147 } 148 149 enum TxtTypes //enums for TextTypes 150 { 151 TXT_MAINTEXT = 0, /*TXT_FTNEDN = 1,*/ TXT_HDFT = 2, TXT_FTN = 3, 152 TXT_EDN = 4, TXT_ATN = 5, TXT_TXTBOX = 6, TXT_HFTXTBOX= 7 153 }; 154 155 SV_DECL_VARARR( WW8Bytes, sal_uInt8, 128, 128 ) 156 157 struct WW8_SepInfo 158 { 159 const SwPageDesc* pPageDesc; 160 const SwSectionFmt* pSectionFmt; 161 const SwNode* pPDNd; 162 const SwTxtNode* pNumNd; 163 sal_uLong nLnNumRestartNo; 164 sal_uInt16 nPgRestartNo; 165 WW8_SepInfoWW8_SepInfo166 WW8_SepInfo() 167 : pPageDesc(0), pSectionFmt(0), pPDNd(0), pNumNd(0), nLnNumRestartNo(0), nPgRestartNo(0) 168 169 {} 170 WW8_SepInfoWW8_SepInfo171 WW8_SepInfo( const SwPageDesc* pPD, const SwSectionFmt* pFmt, 172 sal_uLong nLnRestart, sal_uInt16 nPgRestart = 0, const SwNode* pNd = NULL ) 173 : pPageDesc( pPD ), pSectionFmt( pFmt ), pPDNd( pNd ), pNumNd( 0 ), 174 nLnNumRestartNo( nLnRestart ), nPgRestartNo( nPgRestart ) 175 {} 176 177 bool IsProtected() const; 178 }; 179 180 SV_DECL_VARARR( WW8_WrSepInfoPtrs, WW8_SepInfo, 4, 4 ) 181 182 /// Class to collect and output the sections/headers/footers. 183 // Plc fuer PageDescs -> Sepx ( Section Extensions ) 184 class MSWordSections 185 { 186 protected: 187 bool mbDocumentIsProtected; 188 WW8_WrSepInfoPtrs aSects; // PTRARR von SwPageDesc und SwSectionFmt 189 190 void CheckForFacinPg( WW8Export& rWrt ) const; 191 void WriteOlst( WW8Export& rWrt, const WW8_SepInfo& rSectionInfo ); 192 void NeedsDocumentProtected(const WW8_SepInfo &rInfo); 193 194 //No copy, no assign 195 MSWordSections( const MSWordSections& ); 196 MSWordSections& operator=( const MSWordSections& ); 197 public: 198 MSWordSections( MSWordExportBase& rExport ); 199 virtual ~MSWordSections(); 200 201 virtual bool HeaderFooterWritten(); 202 203 void AppendSection( const SwPageDesc* pPd, 204 const SwSectionFmt* pSectionFmt = 0, 205 sal_uLong nLnNumRestartNo = 0 ); 206 void AppendSection( const SwFmtPageDesc& rPd, 207 const SwNode& rNd, 208 const SwSectionFmt* pSectionFmt, 209 sal_uLong nLnNumRestartNo ); 210 void SetNum( const SwTxtNode* pNumNd ); 211 212 /// Number of columns based on the most recent WW8_SepInfo. 213 sal_uInt16 CurrentNumberOfColumns( const SwDoc &rDoc ) const; 214 215 /// Number of columns of the provided WW8_SepInfo. 216 sal_uInt16 NumberOfColumns( const SwDoc &rDoc, const WW8_SepInfo& rInfo ) const; 217 DocumentIsProtected() const218 bool DocumentIsProtected() const { return mbDocumentIsProtected; } 219 220 /// The most recent WW8_SepInfo. 221 const WW8_SepInfo* CurrentSectionInfo(); 222 223 static void SetHeaderFlag( sal_uInt8& rHeadFootFlags, const SwFmt& rFmt, 224 sal_uInt8 nFlag ); 225 static void SetFooterFlag( sal_uInt8& rHeadFootFlags, const SwFmt& rFmt, 226 sal_uInt8 nFlag ); 227 228 /// Should we output borders? 229 static int HasBorderItem( const SwFmt& rFmt ); 230 }; 231 232 class WW8_WrPlcSepx : public MSWordSections 233 { 234 SvULongs aCps; // PTRARR von CPs 235 ::std::vector< ::boost::shared_ptr<WW8_PdAttrDesc> > m_SectionAttributes; 236 // HACK to prevent adding sections in endnotes 237 bool m_bHeaderFooterWritten; 238 WW8_WrPlc0* pTxtPos; // Pos der einzelnen Header / Footer 239 240 // No copy, no assign 241 WW8_WrPlcSepx( const WW8_WrPlcSepx& ); 242 WW8_WrPlcSepx& operator=( const WW8_WrPlcSepx& ); 243 244 public: 245 WW8_WrPlcSepx( MSWordExportBase& rExport ); 246 ~WW8_WrPlcSepx(); 247 248 virtual bool HeaderFooterWritten(); // override 249 250 void AppendSep( WW8_CP nStartCp, 251 const SwPageDesc* pPd, 252 const SwSectionFmt* pSectionFmt = 0, 253 sal_uLong nLnNumRestartNo = 0 ); 254 void AppendSep( WW8_CP nStartCp, const SwFmtPageDesc& rPd, 255 const SwNode& rNd, 256 const SwSectionFmt* pSectionFmt, 257 sal_uLong nLnNumRestartNo ); Finish(WW8_CP nEndCp)258 void Finish( WW8_CP nEndCp ) { aCps.Insert( nEndCp, aCps.Count() ); } 259 260 bool WriteKFTxt( WW8Export& rWrt ); 261 void WriteSepx( SvStream& rStrm ) const; 262 void WritePlcSed( WW8Export& rWrt ) const; 263 void WritePlcHdd( WW8Export& rWrt ) const; 264 265 private: 266 void WriteFtnEndTxt( WW8Export& rWrt, sal_uLong nCpStt ); 267 public: 268 void OutHeaderFooter(WW8Export& rWrt, bool bHeader, 269 const SwFmt& rFmt, sal_uLong& rCpPos, sal_uInt8 nHFFlags, sal_uInt8 nFlag, sal_uInt8 nBreakCode); 270 }; 271 272 //-------------------------------------------------------------------------- 273 // class WW8_WrPct zum Aufbau der Piece-Table 274 //-------------------------------------------------------------------------- 275 class WW8_WrPct 276 { 277 WW8_WrPcPtrs* pPcts; 278 WW8_FC nOldFc; 279 bool bIsUni; 280 public: 281 WW8_WrPct(WW8_FC nStartFc, bool bSaveUniCode); 282 ~WW8_WrPct(); 283 void AppendPc(WW8_FC nStartFc, bool bIsUnicode); 284 void WritePc( WW8Export& rWrt ); 285 void SetParaBreak(); IsUnicode() const286 bool IsUnicode() const { return bIsUni; } 287 WW8_CP Fc2Cp( sal_uLong nFc ) const; 288 }; 289 290 /// Collects and outputs fonts. 291 class wwFont 292 { 293 //In some future land the stream could be converted to a nice stream interface 294 //and we could have harmony 295 private: 296 sal_uInt8 maWW8_FFN[6]; 297 String msFamilyNm; 298 String msAltNm; 299 bool mbAlt; 300 bool mbWrtWW8; 301 FontPitch mePitch; 302 FontFamily meFamily; 303 rtl_TextEncoding meChrSet; 304 public: 305 wwFont( const String &rFamilyName, FontPitch ePitch, FontFamily eFamily, 306 rtl_TextEncoding eChrSet, bool bWrtWW8 ); 307 bool Write( SvStream *pTableStram ) const; 308 #ifdef DOCX 309 void WriteDocx( const DocxAttributeOutput* rAttrOutput ) const; 310 #endif 311 void WriteRtf( const RtfAttributeOutput* rAttrOutput ) const; GetFamilyName() const312 rtl::OUString GetFamilyName() const { return rtl::OUString( msFamilyNm ); } 313 friend bool operator < (const wwFont &r1, const wwFont &r2); 314 }; 315 316 class wwFontHelper 317 { 318 private: 319 /// Keep track of fonts that need to be exported. 320 ::std::map<wwFont, sal_uInt16> maFonts; 321 bool mbWrtWW8; 322 323 /// Convert from fast insertion map to linear vector in the order that we want to write. 324 ::std::vector< const wwFont* > AsVector() const; 325 326 public: wwFontHelper()327 wwFontHelper() : mbWrtWW8(false), bLoadAllFonts(false) {} 328 /// rDoc used only to get the initial standard font(s) in use. 329 void InitFontTable(bool bWrtWW8, const SwDoc& rDoc); 330 sal_uInt16 GetId(const Font& rFont); 331 sal_uInt16 GetId(const SvxFontItem& rFont); 332 sal_uInt16 GetId(const wwFont& rFont); 333 void WriteFontTable( SvStream *pTableStream, WW8Fib& pFib ); 334 #ifdef DOCX 335 void WriteFontTable( const DocxAttributeOutput& rAttrOutput ); 336 #endif 337 void WriteFontTable( const RtfAttributeOutput& rAttrOutput ); 338 339 /// If true, all fonts are loaded before processing the document. 340 sal_uInt8 bLoadAllFonts: 1; 341 }; 342 343 class DrawObj 344 { 345 public: 346 WW8_CP mnCp; // CP-Pos der Verweise 347 sal_uInt32 mnShapeId; // ShapeId for the SwFrmFmts 348 sw::Frame maCntnt; // the frame itself 349 Point maParentPos; // Points 350 sal_Int32 mnThick; // Border Thicknesses 351 short mnDirection; // If BiDi or not 352 unsigned int mnHdFtIndex; // 0 for main text, +1 for each subsequent 353 // msword hd/ft 354 DrawObj(const sw::Frame & rCntnt,WW8_CP nCp,Point aParentPos,short nDir,unsigned int nHdFtIndex)355 DrawObj(const sw::Frame &rCntnt, WW8_CP nCp, Point aParentPos, short nDir, 356 unsigned int nHdFtIndex) 357 : mnCp(nCp), mnShapeId(0), maCntnt(rCntnt), maParentPos(aParentPos), 358 mnThick(0), mnDirection(nDir), mnHdFtIndex(nHdFtIndex) {} 359 void SetShapeDetails(sal_uInt32 nId, sal_Int32 nThick); 360 DrawObj& operator=(const DrawObj &rOther); 361 }; 362 363 typedef std::vector<DrawObj> DrawObjVector; 364 typedef DrawObjVector::iterator DrawObjIter; 365 typedef DrawObjVector::const_iterator cDrawObjIter; 366 367 typedef std::vector<DrawObj *> DrawObjPointerVector; 368 typedef DrawObjPointerVector::iterator DrawObjPointerIter; 369 370 class PlcDrawObj // PC for DrawObjects and Text-/OLE-/GRF-Boxes 371 { 372 private: 373 DrawObjVector maDrawObjs; // vector of drawobjs 374 protected: 375 virtual void RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart, 376 sal_uInt32 nLen) const = 0; 377 virtual WW8_CP GetCpOffset(const WW8Fib &rFib) const = 0; 378 public: PlcDrawObj()379 PlcDrawObj() {} 380 void WritePlc( WW8Export& rWrt ) const; 381 bool Append( WW8Export&, WW8_CP nCp, const sw::Frame& rFmt, 382 const Point& rNdTopLeft ); size()383 int size() { return maDrawObjs.size(); }; GetObjArr()384 DrawObjVector &GetObjArr() { return maDrawObjs; } 385 virtual ~PlcDrawObj(); 386 private: 387 //No copying 388 PlcDrawObj(const PlcDrawObj&); 389 PlcDrawObj& operator=(const PlcDrawObj&); 390 }; 391 392 class MainTxtPlcDrawObj : public PlcDrawObj 393 { 394 public: MainTxtPlcDrawObj()395 MainTxtPlcDrawObj() {} 396 private: 397 virtual void RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart, 398 sal_uInt32 nLen) const; 399 virtual WW8_CP GetCpOffset(const WW8Fib &) const; 400 private: 401 //No copying 402 MainTxtPlcDrawObj(const MainTxtPlcDrawObj&); 403 MainTxtPlcDrawObj& operator=(const MainTxtPlcDrawObj&); 404 }; 405 406 class HdFtPlcDrawObj : public PlcDrawObj 407 { 408 public: HdFtPlcDrawObj()409 HdFtPlcDrawObj() {} 410 private: 411 virtual void RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart, 412 sal_uInt32 nLen) const; 413 virtual WW8_CP GetCpOffset(const WW8Fib &rFib) const; 414 private: 415 //No copying 416 HdFtPlcDrawObj(const HdFtPlcDrawObj&); 417 HdFtPlcDrawObj& operator=(const HdFtPlcDrawObj&); 418 }; 419 420 typedef ::std::pair<String, sal_uLong> aPair; 421 typedef std::vector<aPair> SwImplBookmarks; 422 typedef std::vector<aPair>::iterator SwImplBookmarksIter; 423 424 class WW8_WrtRedlineAuthor : public sw::util::WrtRedlineAuthor 425 { 426 public: 427 virtual void Write(Writer &rWrt); 428 }; 429 430 /** Structure that is used to save some of the WW8Export/DocxExport data. 431 432 It is used to be able to recurse inside of the WW8Export/DocxExport (eg. 433 for the needs of the tables) - you need to tall WriteText() from there with 434 new values of PaM etc. 435 436 It must contain all the stuff that might be saved either in WW8Export or in 437 DocxExport, because it makes no sense to do it abstract, and specialize it 438 for each of the cases. If you implement other *Export, just add the needed 439 members here, and store them in the appropriate SaveData() method. 440 */ 441 struct MSWordSaveData 442 { 443 Point* pOldFlyOffset; 444 RndStdIds eOldAnchorType; 445 WW8Bytes* pOOld; ///< WW8Export only 446 WW8Bytes* mpTableAtOld; ///< WW8Export only: Additional buffer for the output of the tables 447 sal_uInt16 mnTableStdAtLenOld; ///< WW8Export only: Standard length of mpTableAt 448 SwPaM* pOldPam, *pOldEnd; 449 const sw::Frame* pOldFlyFmt; 450 const SwPageDesc* pOldPageDesc; 451 452 sal_uInt8 bOldWriteAll : 1; ///< WW8Export only 453 sal_uInt8 bOldOutTable : 1; 454 sal_uInt8 bOldIsInTable: 1; 455 sal_uInt8 bOldFlyFrmAttrs : 1; 456 sal_uInt8 bOldStartTOX : 1; 457 sal_uInt8 bOldInWriteTOX : 1; 458 // bOutPageDesc muss nicht gesichert werden, da es nur nicht waehrend der 459 // Ausgabe von Spezial-Texten veraendert wird. 460 }; 461 462 /// Base class for WW8Export and DocxExport 463 class MSWordExportBase 464 { 465 public: 466 wwFontHelper maFontHelper; 467 std::vector<sal_uLong> maChapterFieldLocs; 468 typedef std::vector<sal_uLong>::const_iterator mycCFIter; 469 String aMainStg; 470 SvPtrarr aTOXArr; 471 const SfxItemSet* pISet; // fuer Doppel-Attribute 472 WW8_WrPct* pPiece; // Pointer auf Piece-Table 473 SwNumRuleTbl* pUsedNumTbl; // alle used NumRules 474 const SwTxtNode *mpTopNodeOfHdFtPage; ///< Top node of host page when in hd/ft 475 std::map< sal_uInt16, sal_uInt16 > aRuleDuplicates; //map to Duplicated numrules 476 std::stack< xub_StrLen > m_aCurrentCharPropStarts; ///< To remember the position in a run. 477 WW8_WrtBookmarks* pBkmks; 478 WW8_WrtRedlineAuthor* pRedlAuthors; 479 BitmapPalette* pBmpPal; 480 boost::shared_ptr<NfKeywordTable> pKeyMap; 481 SvxMSExportOLEObjects* pOLEExp; 482 SwMSConvertControls* pOCXExp; 483 WW8OleMaps* pOleMap; 484 ww8::WW8TableInfo::Pointer_t mpTableInfo; 485 486 sal_uInt16 nCharFmtStart; 487 sal_uInt16 nFmtCollStart; 488 sal_uInt16 nStyleBeforeFly; ///< Style-Nummer des Nodes, 489 ///< in/an dem ein Fly verankert ist 490 sal_uInt16 nLastFmtId; ///< Style of last TxtNode in normal range 491 sal_uInt16 nUniqueList; ///< current number for creating unique list names 492 unsigned int mnHdFtIndex; 493 494 sal_uInt16 mnRedlineMode; ///< Remember the original redline mode 495 496 public: 497 /* implicit bookmark vector containing pairs of node indexes and bookmark names */ 498 SwImplBookmarks maImplicitBookmarks; 499 sw::Frames maFrames; // The floating frames in this document 500 const SwPageDesc *pAktPageDesc; 501 WW8_WrPlcPn* pPapPlc; 502 WW8_WrPlcPn* pChpPlc; 503 MSWordAttrIter* pChpIter; 504 MSWordStyles* pStyles; 505 WW8_WrPlcAnnotations* pAtn; 506 WW8_WrPlcTxtBoxes *pTxtBxs, *pHFTxtBxs; 507 508 const sw::Frame *mpParentFrame; //If set we are exporting content inside 509 //a frame, e.g. a graphic node 510 511 Point* pFlyOffset; // zur Justierung eines im Writer als 512 RndStdIds eNewAnchorType; // Zeichen gebundenen Flys, der im WW 513 // Absatzgebunden wird. 514 515 WW8_WrPlcFld* pFldMain; // Felder im Haupttext 516 WW8_WrPlcFld* pFldHdFt; // Felder in Header/Footer 517 WW8_WrPlcFld* pFldFtn; // Felder in FootNotes 518 WW8_WrPlcFld* pFldEdn; // Felder in EndNotes 519 WW8_WrPlcFld* pFldAtn; // Felder in Annotations 520 WW8_WrPlcFld* pFldTxtBxs; // fields in textboxes 521 WW8_WrPlcFld* pFldHFTxtBxs; // fields in header/footer textboxes 522 WW8_WrMagicTable *pMagicTable; // keeps track of table cell positions, and 523 // marks those that contain graphics, 524 // which is required to make word display 525 // graphics inside tables 526 SwWW8WrGrf* pGrf; 527 const SwAttrSet* pStyAttr; // StyleAttr fuer Tabulatoren 528 const SwModify* pOutFmtNode; // write Format or Node 529 const SwFmt *pCurrentStyle; // iff bStyDef=true, then this store the current style 530 531 MainTxtPlcDrawObj *pSdrObjs; // Draw-/Fly-Objects 532 HdFtPlcDrawObj *pHFSdrObjs; // Draw-/Fly-Objects in header or footer 533 534 SwEscherEx* pEscher; // escher export class 535 // --> OD 2007-04-19 #i43447# - removed 536 // SwTwips nFlyWidth, nFlyHeight; // Fuer Anpassung Graphic 537 // <-- 538 539 sal_uInt8 nTxtTyp; 540 541 sal_uInt8 bStyDef : 1; // wird Style geschrieben ? 542 sal_uInt8 bBreakBefore : 1; // Breaks werden 2mal ausgegeben 543 sal_uInt8 bOutKF : 1; // Kopf/Fusstexte werden ausgegeben 544 sal_uInt8 bOutFlyFrmAttrs : 1; // Rahmen-Attr von Flys werden ausgegeben 545 sal_uInt8 bOutPageDescs : 1; ///< PageDescs (section properties) are being written 546 sal_uInt8 bOutFirstPage : 1; // write Attrset of FirstPageDesc 547 sal_uInt8 bOutTable : 1; // Tabelle wird ausgegeben 548 // ( wird zB bei Flys in Tabelle zurueckgesetzt ) 549 sal_uInt8 bOutGrf : 1; // Grafik wird ausgegeben 550 sal_uInt8 bInWriteEscher : 1; // in write textboxes 551 sal_uInt8 bStartTOX : 1; // true: a TOX is startet 552 sal_uInt8 bInWriteTOX : 1; // true: all content are in a TOX 553 sal_uInt8 bFtnAtTxtEnd : 1; // true: all FTN at Textend 554 sal_uInt8 bEndAtTxtEnd : 1; // true: all END at Textend 555 sal_uInt8 bHasHdr : 1; 556 sal_uInt8 bHasFtr : 1; 557 sal_uInt8 bSubstituteBullets : 1; // true: SubstituteBullet() gets called 558 559 bool mbExportModeRTF; 560 bool mbOutOutlineOnly; // export outline nodes, only (send outline to clipboard/presentation) 561 562 SwDoc *pDoc; 563 SwPaM *pCurPam, *pOrigPam; 564 565 /// Stack to remember the nesting (see MSWordSaveData for more) 566 ::std::stack< MSWordSaveData > maSaveData; 567 568 /// Used to split the runs according to the bookmarks start and ends 569 typedef std::vector< ::sw::mark::IMark* > IMarkVector; 570 IMarkVector m_rSortedMarksStart; 571 IMarkVector m_rSortedMarksEnd; 572 573 public: 574 /// The main function to export the document. 575 void ExportDocument( bool bWriteAll ); 576 577 /// Iterate through the nodes and call the appropriate OutputNode() on them. 578 void WriteText(); 579 580 /// Return whether cuurently exported node is in table. 581 bool IsInTable() const; 582 583 /// Set the pCurPam appropriately and call WriteText(). 584 /// 585 /// Used to export paragraphs in footnotes/endnotes/etc. 586 void WriteSpecialText( sal_uLong nStart, sal_uLong nEnd, sal_uInt8 nTTyp ); 587 588 /// Export the pool items to attributes (through an attribute output class). 589 void ExportPoolItemsToCHP( sw::PoolItems &rItems, sal_uInt16 nScript ); 590 591 /// Return the numeric id of the numbering rule 592 sal_uInt16 GetId( const SwNumRule& rNumRule ); 593 594 /// Return the numeric id of the style. 595 sal_uInt16 GetId( const SwTxtFmtColl& rColl ) const; 596 597 /// Return the numeric id of the style. 598 sal_uInt16 GetId( const SwCharFmt& rFmt ) const; 599 600 sal_uInt16 GetId( const SwTOXType& rTOXType ); 601 602 const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const; 603 604 /// Find the reference. 605 bool HasRefToObject( sal_uInt16 nTyp, const String* pName, sal_uInt16 nSeqNo ); 606 607 /// Find the bookmark name. 608 String GetBookmarkName( sal_uInt16 nTyp, const String* pName, sal_uInt16 nSeqNo ); 609 610 /// Add a bookmark converted to a Word name. 611 void AppendWordBookmark( const String& rName ); 612 613 /// Use OutputItem() on an item set according to the parameters. 614 void OutputItemSet( const SfxItemSet& rSet, bool bPapFmt, bool bChpFmt, sal_uInt16 nScript, bool bExportParentItemSet ); 615 616 short GetDefaultFrameDirection( ) const; 617 618 /// Right to left? 619 short TrueFrameDirection( const SwFrmFmt& rFlyFmt ) const; 620 621 /// Right to left? 622 short GetCurrentPageDirection() const; 623 624 /// In case of numbering restart. 625 626 /// List is set to restart at a particular value so for export make a 627 /// completely new list based on this one and export that instead, 628 /// which duplicates words behaviour in this respect. 629 sal_uInt16 DuplicateNumRule( const SwNumRule *pRule, sal_uInt8 nLevel, sal_uInt16 nVal ); 630 631 /// Access to the attribute output class. 632 virtual AttributeOutputBase& AttrOutput() const = 0; 633 634 /// Access to the sections/headers/footres. 635 virtual MSWordSections& Sections() const = 0; 636 637 /// Hack, unfortunately necessary at some places for now. 638 /// FIXME remove it when possible. 639 virtual bool HackIsWW8OrHigher() const = 0; 640 641 /// Guess the script (asian/western). 642 /// 643 /// Sadly word does not have two different sizes for asian font size and 644 /// western font size, it has two different fonts, but not sizes, so we 645 /// have to use our guess as to the script used and disable the export of 646 /// one type. The same occurs for font weight and posture (bold and 647 /// italic). 648 /// 649 /// In addition WW7- has only one character language identifier while WW8+ 650 /// has two 651 virtual bool CollapseScriptsforWordOk( sal_uInt16 nScript, sal_uInt16 nWhich ) = 0; 652 653 virtual void AppendBookmarks( const SwTxtNode& rNd, xub_StrLen nAktPos, xub_StrLen nLen ) = 0; 654 655 virtual void AppendBookmark( const rtl::OUString& rName, bool bSkip = false ) = 0; 656 //For i120928,add this interface to export graphic of bullet 657 virtual void ExportGrfBullet(const SwTxtNode& rNd) = 0; 658 659 // FIXME probably a hack... 660 virtual void WriteCR( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner = ww8::WW8TableNodeInfoInner::Pointer_t() ) = 0; 661 662 // FIXME definitely a hack, must not be here - it can't do anything 663 // sensible for docx 664 virtual void WriteChar( sal_Unicode c ) = 0; 665 666 /// Output attributes. 667 void OutputFormat( const SwFmt& rFmt, bool bPapFmt, bool bChpFmt, bool bFlyFmt = false ); 668 669 /// Getter for pISet. GetCurItemSet() const670 const SfxItemSet* GetCurItemSet() const { return pISet; } 671 672 /// Setter for pISet. SetCurItemSet(const SfxItemSet * pS)673 void SetCurItemSet( const SfxItemSet* pS ) { pISet = pS; } 674 675 /// Remember some of the memebers so that we can recurse in WriteText(). 676 virtual void SaveData( sal_uLong nStt, sal_uLong nEnd ); 677 678 /// Restore what was saved in SaveData(). 679 virtual void RestoreData(); 680 681 /// The return value indicates, if a follow page desc is written. 682 bool OutputFollowPageDesc( const SfxItemSet* pSet, 683 const SwTxtNode* pNd ); 684 685 /// Write header/footer text. 686 void WriteHeaderFooterText( const SwFmt& rFmt, bool bHeader); 687 688 /// Format of the section. 689 const SwSectionFmt* GetSectionFormat( const SwNode& rNd ) const; 690 691 /// Line number of the section start. 692 sal_uLong GetSectionLineNo( const SfxItemSet* pSet, const SwNode& rNd ) const; 693 694 /// Start new section. 695 void OutputSectionBreaks( const SfxItemSet *pSet, const SwNode& rNd ); 696 697 /// Write section properties. 698 /// 699 /// pA is ignored for docx. 700 void SectionProperties( const WW8_SepInfo& rSectionInfo, WW8_PdAttrDesc* pA = NULL ); 701 702 /// Output the numbering table. 703 virtual void WriteNumbering() = 0; 704 705 /// Write static data of SwNumRule - LSTF 706 void NumberingDefinitions(); 707 708 /// Write all Levels for all SwNumRules - LVLF 709 void AbstractNumberingDefinitions(); 710 711 // Convert the bullet according to the font. 712 void SubstituteBullet( String& rNumStr, rtl_TextEncoding& rChrSet, 713 String& rFontName ) const; 714 715 /// No-op for the newer WW versions. OutputOlst(const SwNumRule &)716 virtual void OutputOlst( const SwNumRule& /*rRule*/ ) {} 717 718 /// Setup the pA's info. SetupSectionPositions(WW8_PdAttrDesc *)719 virtual void SetupSectionPositions( WW8_PdAttrDesc* /*pA*/ ) {} 720 721 /// Top node of host page when in header/footer. SetHdFtPageRoot(const SwTxtNode * pNd)722 void SetHdFtPageRoot( const SwTxtNode *pNd ) { mpTopNodeOfHdFtPage = pNd; } 723 724 /// Top node of host page when in header/footer. GetHdFtPageRoot() const725 const SwTxtNode *GetHdFtPageRoot() const { return mpTopNodeOfHdFtPage; } 726 727 /// Output the actual headers and footers. 728 virtual void WriteHeadersFooters( sal_uInt8 nHeadFootFlags, 729 const SwFrmFmt& rFmt, const SwFrmFmt& rLeftFmt, const SwFrmFmt& rFirstPageFmt, 730 sal_uInt8 nBreakCode) = 0; 731 732 /// Write the field 733 virtual void OutputField( const SwField* pFld, ww::eField eFldType, 734 const String& rFldCmd, sal_uInt8 nMode = nsFieldFlags::WRITEFIELD_ALL ) = 0; 735 736 /// Write the data of the form field 737 virtual void WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) = 0; 738 virtual void WriteHyperlinkData( const ::sw::mark::IFieldmark& rFieldmark ) = 0; 739 740 virtual void DoComboBox(const rtl::OUString &rName, 741 const rtl::OUString &rHelp, 742 const rtl::OUString &ToolTip, 743 const rtl::OUString &rSelected, 744 com::sun::star::uno::Sequence<rtl::OUString> &rListItems) = 0; 745 746 virtual void DoFormText(const SwInputField * pFld) = 0; 747 748 static bool NoPageBreakSection( const SfxItemSet *pSet ); 749 750 // Compute the number format for WW dates 751 bool GetNumberFmt(const SwField& rFld, String& rStr); 752 753 virtual sal_uLong ReplaceCr( sal_uInt8 nChar ) = 0; 754 755 const SfxPoolItem* HasItem( sal_uInt16 nWhich ) const; 756 757 758 protected: 759 /// Format-dependant part of the actual export. 760 virtual void ExportDocument_Impl() = 0; 761 762 /// Get the next position in the text node to output 763 virtual xub_StrLen GetNextPos( WW8SwAttrIter* pAttrIter, const SwTxtNode& rNode, xub_StrLen nAktPos ); 764 765 /// Update the information for GetNextPos(). 766 virtual void UpdatePosition( WW8SwAttrIter* pAttrIter, xub_StrLen nAktPos, xub_StrLen nEnd ); 767 768 /// Output SwTxtNode 769 void OutputTextNode( const SwTxtNode& ); 770 771 /// Output SwTableNode 772 void OutputTableNode( const SwTableNode& ); 773 774 /// Setup the chapter fields (maChapterFieldLocs). 775 void GatherChapterFields(); 776 777 void AddLinkTarget( const String& rURL ); 778 void CollectOutlineBookmarks( const SwDoc &rDoc ); 779 780 bool SetAktPageDescFromNode(const SwNode &rNd); 781 bool CntntContainsChapterField(const SwFmtCntnt &rCntnt) const; 782 bool FmtHdFtContainsChapterField(const SwFrmFmt &rFmt) const; 783 784 virtual void SectionBreaksAndFrames( const SwTxtNode& rNode ) = 0; 785 786 virtual void PrepareNewPageDesc( const SfxItemSet* pSet, 787 const SwNode& rNd, 788 const SwFmtPageDesc* pNewPgDescFmt = 0, 789 const SwPageDesc* pNewPgDesc = 0 ) = 0; 790 791 /// Return value indicates if an inherited outline numbering is suppressed. 792 virtual bool DisallowInheritingOutlineNumbering(const SwFmt &rFmt) = 0; 793 794 protected: 795 /// Output SwStartNode 796 virtual void OutputStartNode( const SwStartNode& ); 797 798 /// Output SwEndNode 799 virtual void OutputEndNode( const SwEndNode& ); 800 801 /// Output SwGrfNode 802 virtual void OutputGrfNode( const SwGrfNode& ) = 0; 803 804 /// Output SwOLENode 805 virtual void OutputOLENode( const SwOLENode& ) = 0; 806 807 /// Output SwSectionNode 808 virtual void OutputSectionNode( const SwSectionNode& ); 809 810 virtual void AppendSection( const SwPageDesc *pPageDesc, const SwSectionFmt* pFmt, sal_uLong nLnNum ) = 0; 811 812 /// Call the right (virtual) function according to the type of the item. 813 /// 814 /// One of OutputTextNode(), OutputGrfNode(), or OutputOLENode() 815 void OutputContentNode( const SwCntntNode& ); 816 817 /// Find the nearest bookmark from the current position. 818 /// 819 /// Returns false when there is no bookmark. 820 bool NearestBookmark( xub_StrLen& rNearest, const xub_StrLen nAktPos, bool bNextPositionOnly ); 821 822 void GetSortedBookmarks( const SwTxtNode& rNd, xub_StrLen nAktPos, 823 xub_StrLen nLen ); 824 825 bool GetBookmarks( 826 const SwTxtNode& rNd, 827 const xub_StrLen nStt, 828 const xub_StrLen nEnd, 829 IMarkVector& rArr ); 830 831 const NfKeywordTable & GetNfKeywordTable(); 832 833 public: 834 MSWordExportBase( SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam ); 835 virtual ~MSWordExportBase(); 836 837 // TODO move as much as possible here from WW8Export! ;-) 838 839 static void CorrectTabStopInSet( SfxItemSet& rSet, sal_uInt16 nAbsLeft ); 840 841 private: 842 /// No copying. 843 MSWordExportBase( const MSWordExportBase& ); 844 /// No copying. 845 MSWordExportBase& operator=( const MSWordExportBase& ); 846 }; 847 848 /// The writer class that gets called for the WW8 filter. 849 class SwWW8Writer: public StgWriter 850 { 851 // friends to get access to m_pExport 852 // FIXME avoid that, this is probably not what we want 853 // (if yes, remove the friends, and provide here a GetExport() method) 854 friend void WW8_WrtRedlineAuthor::Write(Writer &rWrt); 855 856 bool m_bWrtWW8; 857 WW8Export *m_pExport; 858 SfxMedium *mpMedium; 859 860 public: 861 SwWW8Writer( const String& rFltName, const String& rBaseURL ); 862 virtual ~SwWW8Writer(); 863 864 virtual sal_uLong WriteStorage(); 865 virtual sal_uLong WriteMedium( SfxMedium& ); 866 867 // TODO most probably we want to be able to get these in 868 // MSExportFilterBase 869 using Writer::getIDocumentSettingAccess; 870 871 public: 872 #if 1 873 /// Prefer ww::bytes to WW8Bytes, migrate away from the other ones. 874 static void InsUInt16(ww::bytes &rO, sal_uInt16 n); 875 static void InsUInt32(ww::bytes &rO, sal_uInt32 n); 876 static void InsAsString16(ww::bytes &rO, const String& rStr); 877 static void InsAsString8(ww::bytes & O, const String& rStr, 878 rtl_TextEncoding eCodeSet); 879 #endif 880 881 static void InsUInt16( WW8Bytes& rO, sal_uInt16 ); 882 static void InsUInt32( WW8Bytes& rO, sal_uInt32 ); 883 static void InsAsString16( WW8Bytes& rO, const String& ); 884 static void InsAsString8( WW8Bytes& rO, const String& rStr, 885 rtl_TextEncoding eCodeSet ); 886 887 static sal_uLong FillUntil( SvStream& rStrm, sal_uLong nEndPos = 0 ); 888 static void FillCount( SvStream& rStrm, sal_uLong nCount ); 889 WriteShort(SvStream & rStrm,sal_Int16 nVal)890 static void WriteShort( SvStream& rStrm, sal_Int16 nVal ) { rStrm << nVal; } 891 static void WriteShort( SvStream& rStrm, sal_uLong nPos, sal_Int16 nVal ); 892 WriteLong(SvStream & rStrm,sal_Int32 nVal)893 static void WriteLong( SvStream& rStrm, sal_Int32 nVal ) { rStrm << nVal; } 894 static void WriteLong( SvStream& rStrm, sal_uLong nPos, sal_Int32 nVal ); 895 896 static void WriteString16(SvStream& rStrm, const String& rStr, 897 bool bAddZero); 898 static void WriteString8(SvStream& rStrm, const String& rStr, 899 bool bAddZero, rtl_TextEncoding eCodeSet); 900 901 static void WriteString_xstz(SvStream& rStrm, const String& rStr, bool bAddZero); 902 903 bool InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec ); 904 905 using StgWriter::Write; 906 virtual sal_uLong Write( SwPaM&, SfxMedium&, const String* = 0 ); 907 //Seems not an expected to provide method to access the private member GetMedia()908 SfxMedium* GetMedia(){ return mpMedium;}; 909 910 private: 911 /// No copying. 912 SwWW8Writer(const SwWW8Writer&); 913 /// No copying. 914 SwWW8Writer& operator=(const SwWW8Writer&); 915 }; 916 917 /// Exporter of the binary Word file formats. 918 class WW8Export : public MSWordExportBase 919 { 920 public: 921 WW8Bytes* pO; ///< Buffer 922 WW8Bytes* mpTableAt; ///< Additional buffer for the output of the tables 923 sal_uInt16 mnTableStdAtLen; ///< Standard length of mpTableAt 924 925 SvStream *pTableStrm, *pDataStrm; ///< Streams for WW97 Export 926 927 WW8Fib* pFib; ///< File Information Block 928 WW8Dop* pDop; ///< DOcument Properties 929 WW8_WrPlcFtnEdn *pFtn; ///< Footnotes - structure to remember them, and output 930 WW8_WrPlcFtnEdn *pEdn; ///< Endnotes - structure to remember them, and output 931 WW8_WrPlcSepx* pSepx; ///< Sections/headers/footers 932 933 sal_uInt8 bWrtWW8 : 1; ///< Write WW95 (false) or WW97 (true) file format 934 935 //For i120928,this vector is to record all the graphics of bullets 936 mutable std::vector<const Graphic*> m_vecBulletPic; 937 938 protected: 939 SwWW8Writer *m_pWriter; ///< Pointer to the writer 940 WW8AttributeOutput *m_pAttrOutput; ///< Converting attributes to stream data 941 942 private: 943 SvStorageRef xEscherStg; /// memory leak #i120098#, to hold the reference to unnamed SotStorage obj 944 945 public: 946 /// Access to the attribute output class. 947 virtual AttributeOutputBase& AttrOutput() const; 948 949 /// Access to the sections/headers/footres. 950 virtual MSWordSections& Sections() const; 951 952 /// False for WW6, true for WW8. HackIsWW8OrHigher() const953 virtual bool HackIsWW8OrHigher() const { return bWrtWW8; } 954 955 private: 956 /// Format-dependant part of the actual export. 957 virtual void ExportDocument_Impl(); 958 959 void PrepareStorage(); 960 void WriteFkpPlcUsw(); 961 void WriteMainText(); 962 void StoreDoc1(); 963 void Out_WwNumLvl( sal_uInt8 nWwLevel ); 964 void BuildAnlvBulletBase( WW8_ANLV& rAnlv, sal_uInt8*& rpCh, sal_uInt16& rCharLen, 965 const SwNumFmt& rFmt ); 966 static void BuildAnlvBase( WW8_ANLV& rAnlv, sal_uInt8*& rpCh, sal_uInt16& rCharLen, 967 const SwNumRule& rRul, const SwNumFmt& rFmt, sal_uInt8 nSwLevel ); 968 969 void Out_BorderLine(WW8Bytes& rO, const SvxBorderLine* pLine, 970 sal_uInt16 nDist, sal_uInt16 nSprmNo, bool bShadow); 971 972 /// Output the numbering table. 973 virtual void WriteNumbering(); 974 975 void OutOverrideListTab(); 976 void OutListNamesTab(); 977 978 void RestoreMacroCmds(); 979 980 void InitFontTable(); 981 982 void DoComboBox(com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> xPropSet); 983 void DoCheckBox(com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> xPropSet); 984 985 public: 986 virtual void OutputOlst( const SwNumRule& rRule ); 987 988 /// Setup the pA's info. 989 virtual void SetupSectionPositions( WW8_PdAttrDesc* pA ); 990 991 void Out_SwNumLvl( sal_uInt8 nSwLevel ); 992 void Out_NumRuleAnld( const SwNumRule& rRul, const SwNumFmt& rFmt, 993 sal_uInt8 nSwLevel ); 994 995 bool MiserableFormFieldExportHack(const SwFrmFmt& rFrmFmt); 996 GetOLEExp()997 SvxMSExportOLEObjects& GetOLEExp() { return *pOLEExp; } GetOCXExp()998 SwMSConvertControls& GetOCXExp() { return *pOCXExp; } GetOLEMap()999 WW8OleMaps& GetOLEMap() { return *pOleMap; } 1000 void ExportDopTypography(WW8DopTypography &rTypo); 1001 1002 using MSWordExportBase::GetId; GetId(const SvxFontItem & rFont)1003 sal_uInt16 GetId( const SvxFontItem& rFont) 1004 { 1005 return maFontHelper.GetId(rFont); 1006 } 1007 1008 sal_uInt16 AddRedlineAuthor( sal_uInt16 nId ); 1009 1010 void WriteFtnBegin( const SwFmtFtn& rFtn, WW8Bytes* pO = 0 ); 1011 void WritePostItBegin( WW8Bytes* pO = 0 ); 1012 const SvxBrushItem* GetCurrentPageBgBrush() const; 1013 SvxBrushItem TrueFrameBgBrush(const SwFrmFmt &rFlyFmt) const; 1014 1015 /// Output all textframes anchored as character for the winword 7- format. 1016 void OutWW6FlyFrmsInCntnt( const SwTxtNode& rNd ); 1017 1018 void AppendFlyInFlys(const sw::Frame& rFrmFmt, const Point& rNdTopLeft); 1019 void WriteOutliner(const OutlinerParaObject& rOutliner, sal_uInt8 nTyp); 1020 void WriteSdrTextObj(const SdrObject& rObj, sal_uInt8 nTyp); 1021 1022 sal_uInt32 GetSdrOrdNum( const SwFrmFmt& rFmt ) const; 1023 void CreateEscher(); 1024 void WriteEscher(); 1025 1026 bool Out_SwNum(const SwTxtNode* pNd); 1027 1028 /// Write the field 1029 virtual void OutputField( const SwField* pFld, ww::eField eFldType, 1030 const String& rFldCmd, sal_uInt8 nMode = nsFieldFlags::WRITEFIELD_ALL ); 1031 1032 void StartCommentOutput( const String& rName ); 1033 void EndCommentOutput( const String& rName ); 1034 void OutGrf(const sw::Frame &rFrame); 1035 bool TestOleNeedsGraphic(const SwAttrSet& rSet, SvStorageRef xOleStg, 1036 SvStorageRef xObjStg, String &rStorageName, SwOLENode *pOLENd); 1037 1038 virtual void AppendBookmarks( const SwTxtNode& rNd, xub_StrLen nAktPos, xub_StrLen nLen ); 1039 virtual void AppendBookmark( const rtl::OUString& rName, bool bSkip = false ); 1040 1041 virtual void ExportGrfBullet(const SwTxtNode& rNd); 1042 int CollectGrfsOfBullets() const; 1043 void OutGrfBullets(const sw::Frame &rFrame); 1044 int GetGrfIndex(const SvxBrushItem& rBrush); 1045 1046 void MoveFieldMarks(sal_uLong nFrom, sal_uLong nTo); 1047 1048 void WriteAsStringTable(const ::std::vector<String>&, sal_Int32& rfcSttbf, 1049 sal_Int32& rlcbSttbf, sal_uInt16 nExtraLen = 0); 1050 1051 virtual sal_uLong ReplaceCr( sal_uInt8 nChar ); 1052 1053 virtual void WriteCR( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner = ww8::WW8TableNodeInfoInner::Pointer_t() ); 1054 void WriteChar( sal_Unicode c ); 1055 #if 0 1056 sal_uInt16 StartTableFromFrmFmt(WW8Bytes &rAt, const SwFrmFmt *pFmt, 1057 SwTwips &rPageSize); 1058 #endif 1059 1060 void OutSwString(const String&, xub_StrLen nStt, xub_StrLen nLen, 1061 bool bUnicode, rtl_TextEncoding eChrSet); 1062 Fc2Cp(sal_uLong nFc) const1063 WW8_CP Fc2Cp( sal_uLong nFc ) const { return pPiece->Fc2Cp( nFc ); } 1064 1065 // einige z.T. static halb-interne Funktions-Deklarationen 1066 OutSprmBytes(sal_uInt8 * pBytes,sal_uInt16 nSiz)1067 void OutSprmBytes( sal_uInt8* pBytes, sal_uInt16 nSiz ) 1068 { pO->Insert( pBytes, nSiz, pO->Count() ); } 1069 IsUnicode() const1070 inline bool IsUnicode() const { return pPiece->IsUnicode(); } 1071 1072 virtual void SectionBreaksAndFrames( const SwTxtNode& rNode ); 1073 1074 /// Helper method for OutputSectionBreaks() and OutputFollowPageDesc(). 1075 // OD 2007-05-29 #i76300# 1076 virtual void PrepareNewPageDesc( const SfxItemSet* pSet, 1077 const SwNode& rNd, 1078 const SwFmtPageDesc* pNewPgDescFmt = 0, 1079 const SwPageDesc* pNewPgDesc = 0 ); 1080 1081 void Out_SwFmtBox(const SvxBoxItem& rBox, bool bShadow); 1082 void Out_SwFmtTableBox( WW8Bytes& rO, const SvxBoxItem * rBox ); 1083 sal_uInt8 TransCol( const Color& rCol ); 1084 bool TransBrush(const Color& rCol, WW8_SHD& rShd); 1085 WW8_BRC TranslateBorderLine(const SvxBorderLine& pLine, 1086 sal_uInt16 nDist, bool bShadow); 1087 1088 // --> OD 2007-06-04 #i77805# 1089 // new return value indicates, if an inherited outline numbering is suppressed 1090 virtual bool DisallowInheritingOutlineNumbering(const SwFmt &rFmt); 1091 // <-- 1092 GetHdFtIndex() const1093 unsigned int GetHdFtIndex() const { return mnHdFtIndex; } SetHdFtIndex(unsigned int nHdFtIndex)1094 void SetHdFtIndex(unsigned int nHdFtIndex) { mnHdFtIndex = nHdFtIndex; } IncrementHdFtIndex()1095 void IncrementHdFtIndex() { ++mnHdFtIndex; } 1096 1097 static long GetDTTM( const DateTime& rDT ); 1098 1099 /// Convert the SVX numbering type to id 1100 static sal_uInt8 GetNumId( sal_uInt16 eNumType ); 1101 1102 /// Guess the script (asian/western). 1103 virtual bool CollapseScriptsforWordOk( sal_uInt16 nScript, sal_uInt16 nWhich ); 1104 1105 sal_uInt16 DupNumRuleWithLvlStart(const SwNumRule *pRule,sal_uInt8 nLvl,sal_uInt16 nVal); 1106 1107 SwTwips CurrentPageWidth(SwTwips &rLeft, SwTwips &rRight) const; 1108 1109 /// Nasty swap for bidi if necessary 1110 bool MiserableRTLFrmFmtHack(SwTwips &rLeft, SwTwips &rRight, 1111 const sw::Frame &rFrmFmt); 1112 InsUInt16(sal_uInt16 n)1113 void InsUInt16( sal_uInt16 n ) { SwWW8Writer::InsUInt16( *pO, n ); } InsUInt32(sal_uInt32 n)1114 void InsUInt32( sal_uInt32 n ) { SwWW8Writer::InsUInt32( *pO, n ); } InsAsString16(const String & rStr)1115 void InsAsString16( const String& rStr ) 1116 { SwWW8Writer::InsAsString16( *pO, rStr ); } InsAsString8(const String & rStr,rtl_TextEncoding eCodeSet)1117 void InsAsString8( const String& rStr, rtl_TextEncoding eCodeSet ) 1118 { SwWW8Writer::InsAsString8( *pO, rStr, eCodeSet ); } 1119 void WriteStringAsPara( const String& rTxt, sal_uInt16 nStyleId = 0 ); 1120 1121 /// Setup the exporter. 1122 WW8Export( SwWW8Writer *pWriter, 1123 SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam, 1124 bool bIsWW8 ); 1125 virtual ~WW8Export(); 1126 1127 virtual void DoComboBox(const rtl::OUString &rName, 1128 const rtl::OUString &rHelp, 1129 const rtl::OUString &ToolTip, 1130 const rtl::OUString &rSelected, 1131 com::sun::star::uno::Sequence<rtl::OUString> &rListItems); 1132 1133 virtual void DoFormText(const SwInputField * pFld); 1134 1135 void GetCurrentItems(WW8Bytes &rItems) const; 1136 1137 /// Write the data of the form field 1138 virtual void WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ); 1139 virtual void WriteHyperlinkData( const ::sw::mark::IFieldmark& rFieldmark ); 1140 1141 /// Fields. 1142 WW8_WrPlcFld* CurrentFieldPlc() const; 1143 GetWriter() const1144 SwWW8Writer& GetWriter() const { return *m_pWriter; } Strm() const1145 SvStream& Strm() const { return m_pWriter->Strm(); } 1146 1147 /// Remember some of the memebers so that we can recurse in WriteText(). 1148 virtual void SaveData( sal_uLong nStt, sal_uLong nEnd ); 1149 1150 /// Restore what was saved in SaveData(). 1151 virtual void RestoreData(); 1152 1153 /// Output the actual headers and footers. 1154 virtual void WriteHeadersFooters( sal_uInt8 nHeadFootFlags, 1155 const SwFrmFmt& rFmt, const SwFrmFmt& rLeftFmt, const SwFrmFmt& rFirstPageFmt, 1156 sal_uInt8 nBreakCode); 1157 1158 protected: 1159 /// Output SwGrfNode 1160 virtual void OutputGrfNode( const SwGrfNode& ); 1161 1162 /// Output SwOLENode 1163 virtual void OutputOLENode( const SwOLENode& ); 1164 1165 virtual void AppendSection( const SwPageDesc *pPageDesc, const SwSectionFmt* pFmt, sal_uLong nLnNum ); 1166 1167 private: 1168 /// No copying. 1169 WW8Export(const WW8Export&); 1170 /// No copying. 1171 WW8Export& operator=(const WW8Export&); 1172 }; 1173 1174 class WW8_WrPlcSubDoc // Doppel-Plc fuer Foot-/Endnotes und Postits 1175 { 1176 private: 1177 //No copying 1178 WW8_WrPlcSubDoc(const WW8_WrPlcSubDoc&); 1179 WW8_WrPlcSubDoc& operator=(const WW8_WrPlcSubDoc&); 1180 protected: 1181 SvULongs aCps; // PTRARR CP-Pos der Verweise 1182 SvPtrarr aCntnt; // PTRARR von SwFmtFtn/PostIts/.. 1183 WW8_WrPlc0* pTxtPos; // Pos der einzelnen Texte 1184 SvPtrarr aSpareFmts; //a backup for aCntnt: if there's no SdrObject, stores the fmt directly here 1185 1186 WW8_WrPlcSubDoc(); 1187 virtual ~WW8_WrPlcSubDoc(); 1188 1189 bool WriteGenericTxt( WW8Export& rWrt, sal_uInt8 nTTyp, WW8_CP& rCount ); 1190 void WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, WW8_FC& rTxtStt, 1191 sal_Int32& rTxtCnt, WW8_FC& rRefStt, sal_Int32& rRefCnt ) const; 1192 1193 virtual const SvULongs* GetShapeIdArr() const; 1194 }; 1195 1196 // Doppel-Plc fuer Footnotes/Endnotes 1197 class WW8_WrPlcFtnEdn : public WW8_WrPlcSubDoc 1198 { 1199 private: 1200 sal_uInt8 nTyp; 1201 1202 //No copying 1203 WW8_WrPlcFtnEdn(const WW8_WrPlcFtnEdn&); 1204 WW8_WrPlcFtnEdn& operator=(WW8_WrPlcFtnEdn &); 1205 public: WW8_WrPlcFtnEdn(sal_uInt8 nTTyp)1206 WW8_WrPlcFtnEdn( sal_uInt8 nTTyp ) : nTyp( nTTyp ) {} 1207 1208 bool WriteTxt( WW8Export& rWrt ); 1209 void WritePlc( WW8Export& rWrt ) const; 1210 1211 void Append( WW8_CP nCp, const SwFmtFtn& rFtn ); 1212 }; 1213 1214 struct WW8_Annotation 1215 { 1216 const OutlinerParaObject* mpRichText; 1217 String msSimpleText; 1218 String msOwner; 1219 DateTime maDateTime; 1220 WW8_Annotation(const SwPostItField* pPostIt); 1221 WW8_Annotation(const SwRedlineData* pRedline); 1222 }; 1223 1224 class WW8_WrPlcAnnotations : public WW8_WrPlcSubDoc // Doppel-Plc fuer PostIts 1225 { 1226 private: 1227 //No copying 1228 WW8_WrPlcAnnotations(const WW8_WrPlcAnnotations&); 1229 WW8_WrPlcAnnotations& operator=(WW8_WrPlcAnnotations&); 1230 std::set<const SwRedlineData*> maProcessedRedlines; 1231 public: WW8_WrPlcAnnotations()1232 WW8_WrPlcAnnotations() {} 1233 ~WW8_WrPlcAnnotations(); 1234 1235 void Append( WW8_CP nCp, const SwPostItField* pPostIt ); 1236 void Append( WW8_CP nCp, const SwRedlineData* pRedLine ); 1237 bool IsNewRedlineComment( const SwRedlineData* pRedLine ); 1238 bool WriteTxt( WW8Export& rWrt ); 1239 void WritePlc( WW8Export& rWrt ) const; 1240 }; 1241 1242 class WW8_WrPlcTxtBoxes : public WW8_WrPlcSubDoc // Doppel-Plc fuer Textboxen 1243 { // Rahmen/DrawTextboxes! 1244 private: 1245 sal_uInt8 nTyp; 1246 SvULongs aShapeIds; // VARARR of ShapeIds for the SwFrmFmts 1247 virtual const SvULongs* GetShapeIdArr() const; 1248 1249 //No copying 1250 WW8_WrPlcTxtBoxes(const WW8_WrPlcTxtBoxes&); 1251 WW8_WrPlcTxtBoxes& operator=(WW8_WrPlcTxtBoxes&); 1252 public: WW8_WrPlcTxtBoxes(sal_uInt8 nTTyp)1253 WW8_WrPlcTxtBoxes( sal_uInt8 nTTyp ) : nTyp( nTTyp ) {} 1254 1255 bool WriteTxt( WW8Export& rWrt ); 1256 void WritePlc( WW8Export& rWrt ) const; 1257 void Append( const SdrObject& rObj, sal_uInt32 nShapeId ); 1258 void Append( const SwFrmFmt* pFmt, sal_uInt32 nShapeId ); Count() const1259 sal_uInt16 Count() const { return aCntnt.Count(); } GetPos(const VoidPtr & p) const1260 sal_uInt16 GetPos( const VoidPtr& p ) const { return aCntnt.GetPos( p ); } 1261 }; 1262 1263 typedef WW8_WrFkp* WW8_FkpPtr; // Plc fuer Chpx und Papx ( incl PN-Plc ) 1264 SV_DECL_PTRARR( WW8_WrFkpPtrs, WW8_FkpPtr, 4, 4 ) 1265 1266 class WW8_WrPlcPn // Plc fuer Page Numbers 1267 { 1268 private: 1269 WW8Export& rWrt; 1270 WW8_WrFkpPtrs aFkps; // PTRARR 1271 sal_uInt16 nFkpStartPage; 1272 ePLCFT ePlc; 1273 bool bWrtWW8; // Fuer Writererkennung 1274 sal_uInt16 nMark; 1275 1276 //No copying 1277 WW8_WrPlcPn(const WW8_WrPlcPn&); 1278 WW8_WrPlcPn& operator=(const WW8_WrPlcPn&); 1279 public: 1280 WW8_WrPlcPn( WW8Export& rWrt, ePLCFT ePl, WW8_FC nStartFc ); 1281 ~WW8_WrPlcPn(); 1282 void AppendFkpEntry(WW8_FC nEndFc,short nVarLen = 0,const sal_uInt8* pSprms = 0); 1283 void WriteFkps(); 1284 void WritePlc(); 1285 sal_uInt8 *CopyLastSprms(sal_uInt8 &rLen); 1286 }; 1287 1288 // class WW8_WrPlc1 ist erstmal nur fuer Felder 1289 class WW8_WrPlc1 1290 { 1291 private: 1292 SvULongs aPos; // PTRARR von CPs 1293 sal_uInt8* pData; // Inhalte ( Strukturen ) 1294 sal_uLong nDataLen; 1295 sal_uInt16 nStructSiz; 1296 1297 //No copying 1298 WW8_WrPlc1(const WW8_WrPlc1&); 1299 WW8_WrPlc1& operator=(const WW8_WrPlc1&); 1300 protected: Count() const1301 sal_uInt16 Count() const { return aPos.Count(); } 1302 void Write( SvStream& rStrm ); 1303 WW8_CP Prev() const; 1304 public: 1305 WW8_WrPlc1( sal_uInt16 nStructSz ); 1306 ~WW8_WrPlc1(); 1307 void Append( WW8_CP nCp, const void* pData ); 1308 void Finish( sal_uLong nLastCp, sal_uLong nStartCp ); 1309 }; 1310 1311 // class WW8_WrPlcFld ist fuer Felder 1312 class WW8_WrPlcFld : public WW8_WrPlc1 1313 { 1314 private: 1315 sal_uInt8 nTxtTyp; 1316 sal_uInt16 nResults; 1317 1318 //No copying 1319 WW8_WrPlcFld(const WW8_WrPlcFld&); 1320 WW8_WrPlcFld& operator=(const WW8_WrPlcFld&); 1321 public: WW8_WrPlcFld(sal_uInt16 nStructSz,sal_uInt8 nTTyp)1322 WW8_WrPlcFld( sal_uInt16 nStructSz, sal_uInt8 nTTyp ) 1323 : WW8_WrPlc1( nStructSz ), nTxtTyp( nTTyp ), nResults(0) 1324 {} 1325 bool Write( WW8Export& rWrt ); ResultAdded()1326 void ResultAdded() { ++nResults; } ResultCount() const1327 sal_uInt16 ResultCount() const { return nResults; } 1328 }; 1329 1330 class WW8_WrMagicTable : public WW8_WrPlc1 1331 { 1332 private: 1333 //No copying 1334 WW8_WrMagicTable(const WW8_WrMagicTable&); 1335 WW8_WrMagicTable& operator=(const WW8_WrMagicTable&); 1336 public: WW8_WrMagicTable()1337 WW8_WrMagicTable() : WW8_WrPlc1( 4 ) {Append(0,0);} 1338 void Append( WW8_CP nCp, sal_uLong nData ); 1339 bool Write( WW8Export& rWrt ); 1340 }; 1341 1342 class GraphicDetails 1343 { 1344 public: 1345 sw::Frame maFly; // Umgebende FlyFrms dazu 1346 sal_uLong mnPos; // FilePos der Grafiken 1347 sal_uInt16 mnWid; // Breite der Grafiken 1348 sal_uInt16 mnHei; // Hoehe der Grafiken 1349 GraphicDetails(const sw::Frame & rFly,sal_uInt16 nWid,sal_uInt16 nHei)1350 GraphicDetails(const sw::Frame &rFly, sal_uInt16 nWid, sal_uInt16 nHei) 1351 : maFly(rFly), mnPos(0), mnWid(nWid), mnHei(nHei) 1352 {} 1353 GraphicDetails& operator=(const GraphicDetails& rOther); 1354 operator ==(const GraphicDetails & rIn) const1355 bool operator==(const GraphicDetails& rIn) const 1356 { 1357 return ( 1358 (mnWid == rIn.mnWid) && (mnHei == rIn.mnHei) && 1359 (maFly.RefersToSameFrameAs(rIn.maFly)) 1360 ); 1361 } 1362 }; 1363 1364 // class SwWW8WrGrf sammelt Grafiken und gibt sie aus 1365 class SwWW8WrGrf 1366 { 1367 private: 1368 /// for access to the variables 1369 WW8Export& rWrt; 1370 1371 std::vector<GraphicDetails> maDetails; 1372 typedef std::vector<GraphicDetails>::iterator myiter; 1373 sal_uInt16 mnIdx; // Index in File-Positionen 1374 1375 void WritePICFHeader(SvStream& rStrm, const sw::Frame &rFly, 1376 sal_uInt16 mm, sal_uInt16 nWidth, sal_uInt16 nHeight, 1377 const SwAttrSet* pAttrSet = 0); 1378 void WriteGraphicNode(SvStream& rStrm, const GraphicDetails &rItem); 1379 void WriteGrfFromGrfNode(SvStream& rStrm, const SwGrfNode &rNd, 1380 const sw::Frame &rFly, sal_uInt16 nWidth, sal_uInt16 nHeight); 1381 1382 void WritePICBulletFHeader(SvStream& rStrm, const Graphic &rGrf, sal_uInt16 mm, sal_uInt16 nWidth, sal_uInt16 nHeight); 1383 void WriteGrfForBullet(SvStream& rStrm, const Graphic &rGrf, sal_uInt16 nWidth, sal_uInt16 nHeight); 1384 1385 //No copying 1386 SwWW8WrGrf(const SwWW8WrGrf&); 1387 SwWW8WrGrf& operator=(const SwWW8WrGrf&); 1388 public: SwWW8WrGrf(WW8Export & rW)1389 SwWW8WrGrf( WW8Export& rW ) : rWrt( rW ), mnIdx( 0 ) {} 1390 void Insert(const sw::Frame &rFly); 1391 void Write(); GetFPos()1392 sal_uLong GetFPos() 1393 { return (mnIdx < maDetails.size()) ? maDetails[mnIdx++].mnPos : 0; } 1394 }; 1395 1396 /** The class MSWordAttrIter is a helper class to build the Fkp.chpx. 1397 This class may be overloaded for output the SwTxtAttrs and the 1398 EditEngineTxtAttrs. 1399 */ 1400 class MSWordAttrIter 1401 { 1402 private: 1403 MSWordAttrIter* pOld; 1404 //No copying 1405 MSWordAttrIter(const MSWordAttrIter&); 1406 MSWordAttrIter& operator=(const MSWordAttrIter&); 1407 protected: 1408 MSWordExportBase& m_rExport; 1409 public: 1410 MSWordAttrIter( MSWordExportBase& rExport ); 1411 virtual ~MSWordAttrIter(); 1412 1413 virtual const SfxPoolItem* HasTextItem( sal_uInt16 nWhich ) const = 0; 1414 virtual const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const = 0; 1415 }; 1416 1417 class MSWord_SdrAttrIter : public MSWordAttrIter 1418 { 1419 private: 1420 const EditTextObject* pEditObj; 1421 const SfxItemPool* pEditPool; 1422 EECharAttribArray aTxtAtrArr; 1423 SvPtrarr aChrTxtAtrArr; 1424 SvUShorts aChrSetArr; 1425 sal_uInt16 nPara; 1426 xub_StrLen nAktSwPos; 1427 xub_StrLen nTmpSwPos; // for HasItem() 1428 rtl_TextEncoding eNdChrSet; 1429 sal_uInt16 nScript; 1430 sal_uInt8 mnTyp; 1431 1432 xub_StrLen SearchNext( xub_StrLen nStartPos ); 1433 void SetCharSet(const EECharAttrib& rTxtAttr, bool bStart); 1434 1435 //No copying 1436 MSWord_SdrAttrIter(const MSWord_SdrAttrIter&); 1437 MSWord_SdrAttrIter& operator=(const MSWord_SdrAttrIter&); 1438 public: 1439 MSWord_SdrAttrIter( MSWordExportBase& rWr, const EditTextObject& rEditObj, 1440 sal_uInt8 nType ); 1441 void NextPara( sal_uInt16 nPar ); 1442 void OutParaAttr(bool bCharAttr); 1443 void OutEEField(const SfxPoolItem& rHt); 1444 1445 bool IsTxtAttr(xub_StrLen nSwPos); 1446 NextPos()1447 void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); } 1448 1449 void OutAttr( xub_StrLen nSwPos ); 1450 virtual const SfxPoolItem* HasTextItem( sal_uInt16 nWhich ) const; 1451 virtual const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const; 1452 bool OutAttrWithRange(xub_StrLen nPos); WhereNext() const1453 xub_StrLen WhereNext() const { return nAktSwPos; } 1454 rtl_TextEncoding GetNextCharSet() const; GetNodeCharSet() const1455 rtl_TextEncoding GetNodeCharSet() const { return eNdChrSet; } 1456 }; 1457 1458 /// Class to collect and output the styles table. 1459 class MSWordStyles 1460 { 1461 MSWordExportBase& m_rExport; 1462 SwFmt** pFmtA; 1463 sal_uInt16 nUsedSlots; 1464 1465 /// Create the style table, called from the constructor. 1466 void BuildStylesTable(); 1467 1468 /// Get slot number during building the style table. 1469 sal_uInt16 BuildGetSlot( const SwFmt& rFmt ); 1470 1471 /// Return information about one style. 1472 void GetStyleData( SwFmt* pFmt, bool& bFmtColl, sal_uInt16& nBase, sal_uInt16& nNext ); 1473 1474 /// Outputs attributes of one style. 1475 void WriteProperties( const SwFmt* pFmt, bool bPap, sal_uInt16 nPos, bool bInsDefCharSiz ); 1476 1477 sal_uInt16 GetWWId( const SwFmt& rFmt ) const; 1478 1479 void SetStyleDefaults( const SwFmt& rFmt, bool bPap ); 1480 1481 /// Outputs one style - called (in a loop) from OutputStylesTable(). 1482 void OutputStyle( SwFmt* pFmt, sal_uInt16 nPos ); 1483 1484 // No copying 1485 MSWordStyles( const MSWordStyles& ); 1486 MSWordStyles& operator=( const MSWordStyles& ); 1487 1488 public: 1489 MSWordStyles( MSWordExportBase& rExport ); 1490 ~MSWordStyles(); 1491 1492 /// Output the styles table. 1493 void OutputStylesTable(); 1494 1495 /// Get id of the style (rFmt). 1496 sal_uInt16 GetSlot( const SwFmt& rFmt ) const; 1497 GetSwFmt()1498 SwFmt* GetSwFmt() { return (*pFmtA); } 1499 }; 1500 1501 sal_Int16 GetWordFirstLineOffset(const SwNumFmt &rFmt); 1502 //A bit of a bag on the side for now 1503 String FieldString(ww::eField eIndex); 1504 String BookmarkToWord(const String &rBookmark); 1505 1506 class WW8SHDLong 1507 { 1508 sal_uInt32 m_cvFore; 1509 sal_uInt32 m_cvBack; 1510 sal_uInt16 m_ipat; 1511 1512 public: WW8SHDLong()1513 WW8SHDLong() : m_cvFore(0), m_cvBack(0), m_ipat(0) {} ~WW8SHDLong()1514 virtual ~WW8SHDLong() {} 1515 1516 void Write(WW8Export & rExport); setCvFore(sal_uInt32 cvFore)1517 void setCvFore(sal_uInt32 cvFore) { m_cvFore = cvFore; } setCvBack(sal_uInt32 cvBack)1518 void setCvBack(sal_uInt32 cvBack) { m_cvBack = cvBack; } setIPat(sal_uInt16 ipat)1519 void setIPat(sal_uInt16 ipat) { m_ipat = ipat; } 1520 }; 1521 1522 #endif // _WRTWW8_HXX 1523 1524 /* vi:set tabstop=4 shiftwidth=4 expandtab: */ 1525