1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20 #ifndef INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
21 #define INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
22
23 #include <rtl/ustring.hxx>
24 #include <filter/msfilter/msdffimp.hxx>
25 #include <filter/msfilter/util.hxx>
26 #include <editeng/frmdir.hxx>
27 #include <fltshell.hxx>
28
29 #include <svx/svdobj.hxx>
30
31 #include <vector>
32 #include <stack>
33 #include <deque>
34 #include <map>
35 #include <utility>
36 #include <memory>
37
38 #include "ww8struc.hxx"
39 #include "ww8scan.hxx"
40 #include "ww8glsy.hxx"
41 #include "ww8graf.hxx"
42 #include "wrtww8.hxx"
43 #include <msfilter.hxx>
44 #include <xmloff/odffields.hxx>
45 #include <IMark.hxx>
46
47 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
48 #include <swtypes.hxx>
49 #include <fmtfsize.hxx>
50 #include <fmtornt.hxx>
51 #include <fmtsrnd.hxx>
52 #include <ndtxt.hxx>
53 #include <editeng/lrspitem.hxx>
54 #include <o3tl/deleter.hxx>
55 #include <oox/ole/olehelper.hxx>
56
57 #define SW_UD_IMAPDATA 2
58
59 class SwDoc;
60 class SwPaM;
61 class SfxPoolItem;
62 class SwTextFormatColl;
63 class SwPageDesc;
64 class SvxBoxItem;
65 class SwFormat;
66 class SwNodeIndex;
67 class SwFlyFrameFormat;
68 class SwAttrSet;
69 class SwNumRule;
70 class SwFrameFormat;
71 class Writer;
72 class SwFormatField;
73 class WW8Fib;
74 class WW8PLCFMan;
75 struct WW8PLCFManResult;
76 class WW8RStyle;
77 class WW8PLCF_HdFt;
78 class WW8ScannerBase;
79 struct WW8FlyPara;
80 struct WW8SwFlyPara;
81 struct WW8_PIC;
82 class WW8TabDesc;
83 struct WW8_SHD;
84 struct WW8_OLST;
85 class SwNumFormat;
86 struct WW8_ANLD;
87 struct WW8_ANLV;
88 struct WW8_DO;
89 struct WW8_DPHEAD;
90 struct WW8_FSPA;
91 class SdrModel;
92 class SdrPage;
93 class SdrObject;
94 class SdrTextObj;
95 class SdrUnoObj;
96 class Size;
97 class EditEngine;
98 struct SwPosition;
99 class WW8ReaderSave;
100 struct WW8PicDesc;
101 class Graphic;
102 class SwFieldType;
103 class SotStorage;
104 class SwAttrSet;
105 class GDIMetaFile;
106 struct ESelection;
107 class SfxItemSet;
108 class OutlinerParaObject;
109
110 namespace com{namespace sun {namespace star{
111 namespace beans{ class XPropertySet;}
112 namespace form { class XFormComponent;}
113 namespace drawing{class XShape;}
114 namespace lang{class XMultiServiceFactory;}
115 }}}
116
117 // defines only for the WW8-variable of the INI file
118 #define WW8FL_NO_STYLES 2
119 #define WW8FL_NO_GRAF 0x80
120
121 #define WW8FL_NO_OUTLINE 0x1000
122 #define WW8FL_NO_IMPLPASP 0x4000 // no implicit para space
123 #define WW8FL_NO_GRAFLAYER 0x8000
124
125 // Add-on-filter-flags, valid from Winword 8 on
126 #define WW8FL_NO_FLY_FOR_TXBX 1
127
128 // List-Manager (from Ver8 on)
129
130 struct WW8LFOInfo;
131
132 class WW8Reader : public StgReader
133 {
134 virtual ErrCode Read(SwDoc &, const OUString& rBaseURL, SwPaM &, const OUString &) override;
135 ErrCode OpenMainStream( tools::SvRef<SotStorageStream>& rRef, sal_uInt16& rBuffSize );
136 public:
137 virtual SwReaderType GetReaderType() override;
138
139 virtual bool HasGlossaries() const override;
140 virtual bool ReadGlossaries( SwTextBlocks&, bool bSaveRelFiles ) const override;
141 };
142
143 class SwWW8ImplReader;
144 struct WW8LSTInfo;
145 class WW8ListManager
146 {
147 public:
148 WW8ListManager(SvStream& rSt_, SwWW8ImplReader& rReader_);
149 //Min and Max possible List Levels in Word
150 enum ListLevel {nMinLevel=1, nMaxLevel=9};
151 //the rParaSprms returns back the original word paragraph indent
152 //sprms which were attached to the original numbering format
153 SwNumRule* GetNumRuleForActivation(sal_uInt16 nLFOPosition, const sal_uInt8 nLevel,
154 std::vector<sal_uInt8> &rParaSprms, SwTextNode *pNode=nullptr);
155 SwNumRule* CreateNextRule(bool bSimple);
156 ~WW8ListManager() COVERITY_NOEXCEPT_FALSE;
157 SwNumRule* GetNumRule(size_t i);
GetWW8LSTInfoNum() const158 size_t GetWW8LSTInfoNum() const{return maLSTInfos.size();}
159 private:
160 wwSprmParser const maSprmParser;
161 SwWW8ImplReader& rReader;
162 SwDoc& rDoc;
163 const WW8Fib& rFib;
164 SvStream& rSt;
165 std::vector<std::unique_ptr<WW8LSTInfo>> maLSTInfos;
166 std::vector<std::unique_ptr<WW8LFOInfo>> m_LFOInfos;// D. from PLF LFO, sorted exactly like in the WW8 Stream
167 sal_uInt16 nUniqueList; // current number for creating unique list names
168 SprmResult GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen);
169 WW8LSTInfo* GetLSTByListId( sal_uInt32 nIdLst ) const;
170 //the rParaSprms returns back the original word paragraph indent
171 //sprms which are attached to this numbering level
172 bool ReadLVL(SwNumFormat& rNumFormat, std::unique_ptr<SfxItemSet>& rpItemSet, sal_uInt16 nLevelStyle,
173 bool bSetStartNo, std::deque<bool> &rNotReallyThere, sal_uInt16 nLevel,
174 ww::bytes &rParaSprms);
175
176 // character attributes from GrpprlChpx
177 typedef std::unique_ptr<SfxItemSet> WW8aISet[nMaxLevel];
178 // character style pointer
179 typedef SwCharFormat* WW8aCFormat[nMaxLevel];
180
181 void AdjustLVL(sal_uInt8 nLevel, SwNumRule& rNumRule, WW8aISet const & rListItemSet,
182 WW8aCFormat& aCharFormat, bool& bNewCharFormatCreated,
183 const OUString& aPrefix = OUString());
184
185 WW8ListManager(const WW8ListManager&) = delete;
186 WW8ListManager& operator=(const WW8ListManager&) = delete;
187 sal_uInt16 nLastLFOPosition;
188 };
189
190 struct WW8FlyPara
191 { // WinWord-attributes
192 // Attention: *DO NOT* reorder, since parts will be
193 // compared using memcmp
194 bool bVer67;
195 sal_Int16 nSp26, nSp27; // raw position
196 sal_Int16 nSp45, nSp28; // width / height
197 sal_Int16 nLeMgn, nRiMgn, nUpMgn, nLoMgn; // borders
198 sal_uInt8 nSp29; // raw binding + alignment
199 sal_uInt8 nSp37; // Wrap-Mode ( 1 / 2; 0 = no Apo ? )
200 WW8_BRCVer9_5 brc; // borders Top, Left, Bottom, Right, Between
201 bool bBorderLines; // border lines
202 bool bGrafApo; // true: this frame is only used to position
203 // the contained graphics *not* as a character
204 bool mbVertSet; // true if vertical positioning has been set
205
206 WW8FlyPara(bool bIsVer67, const WW8FlyPara* pSrc = nullptr);
207 bool operator==(const WW8FlyPara& rSrc) const;
208 void Read(sal_uInt8 nSprm29, WW8PLCFx_Cp_FKP* pPap);
209 void ReadFull(sal_uInt8 nSprm29, SwWW8ImplReader* pIo);
210 void Read(sal_uInt8 nSprm29, WW8RStyle const * pStyle);
211 void ApplyTabPos(const WW8_TablePos *pTabPos);
212 bool IsEmpty() const;
213 };
214
215 class SwWW8StyInf
216 {
217 OUString m_sWWStyleName;
218 sal_uInt16 m_nWWStyleId;
219 public:
220 rtl_TextEncoding m_eLTRFontSrcCharSet; // rtl_TextEncoding for the font
221 rtl_TextEncoding m_eRTLFontSrcCharSet; // rtl_TextEncoding for the font
222 rtl_TextEncoding m_eCJKFontSrcCharSet; // rtl_TextEncoding for the font
223 SwFormat* m_pFormat;
224 std::shared_ptr<WW8FlyPara> m_xWWFly;
225 SwNumRule* m_pOutlineNumrule;
226 long m_nFilePos;
227 sal_uInt16 m_nBase;
228 sal_uInt16 m_nFollow;
229 sal_uInt16 m_nLFOIndex;
230 sal_uInt8 m_nListLevel;
231
232 // WW8 outline level is zero-based:
233 // 0: outline level 1
234 // 1: outline level 2
235 // ...
236 // 8: outline level 9
237 // 9: body text
238 sal_uInt8 mnWW8OutlineLevel;
239
240 sal_uInt16 m_n81Flags; // for bold, italic, ...
241 sal_uInt16 m_n81BiDiFlags; // for bold, italic, ...
242 std::shared_ptr<SvxLRSpaceItem> maWordLR;
243 bool m_bValid; // empty of valid
244 bool m_bImported; // for recursive imports
245 bool m_bColl; // true-> pFormat is SwTextFormatColl
246 bool m_bImportSkipped; // only true if !bNewDoc && existing style
247 bool m_bHasStyNumRule; // true-> named NumRule in style
248 bool m_bHasBrokenWW6List; // true-> WW8+ style has a WW7- list
249 bool m_bListReleventIndentSet; //true if this style's indent has
250 //been explicitly set, it's set to the value
251 //of pFormat->GetItemState(RES_LR_SPACE, false)
252 //if it was possible to get the ItemState
253 //for L of the LR space independently
254 bool m_bParaAutoBefore; // For Auto spacing before a paragraph
255 bool m_bParaAutoAfter; // For Auto Spacing after a paragraph
256 sal_Int16 m_nRelativeJustify;
257
SwWW8StyInf()258 SwWW8StyInf() :
259 m_sWWStyleName( OUString() ),
260 m_nWWStyleId( 0 ),
261 m_eLTRFontSrcCharSet(0),
262 m_eRTLFontSrcCharSet(0),
263 m_eCJKFontSrcCharSet(0),
264 m_pFormat( nullptr ),
265 m_pOutlineNumrule( nullptr ),
266 m_nFilePos( 0 ),
267 m_nBase( 0 ),
268 m_nFollow( 0 ),
269 m_nLFOIndex( USHRT_MAX ),
270 m_nListLevel(WW8ListManager::nMaxLevel),
271 mnWW8OutlineLevel( MAXLEVEL ),
272 m_n81Flags( 0 ),
273 m_n81BiDiFlags(0),
274 maWordLR(std::make_shared<SvxLRSpaceItem>(RES_LR_SPACE)),
275 m_bValid(false),
276 m_bImported(false),
277 m_bColl(false),
278 m_bImportSkipped(false),
279 m_bHasStyNumRule(false),
280 m_bHasBrokenWW6List(false),
281 m_bListReleventIndentSet(false),
282 m_bParaAutoBefore(false),
283 m_bParaAutoAfter(false),
284 m_nRelativeJustify(-1)
285
286 {}
287
SetOrgWWIdent(const OUString & rName,const sal_uInt16 nId)288 void SetOrgWWIdent( const OUString& rName, const sal_uInt16 nId )
289 {
290 m_sWWStyleName = rName;
291 m_nWWStyleId = nId;
292
293 // apply default WW8 outline level to WW8 Built-in Heading styles
294 if (IsWW8BuiltInHeadingStyle())
295 {
296 mnWW8OutlineLevel = m_nWWStyleId - 1;
297 }
298 }
299
GetOrgWWName() const300 const OUString& GetOrgWWName() const
301 {
302 return m_sWWStyleName;
303 }
304
HasWW8OutlineLevel() const305 bool HasWW8OutlineLevel() const
306 {
307 return (m_pFormat != nullptr && (MAXLEVEL > mnWW8OutlineLevel));
308 }
309
IsOutlineNumbered() const310 bool IsOutlineNumbered() const
311 {
312 return m_pOutlineNumrule && HasWW8OutlineLevel();
313 }
314
GetOutlineNumrule() const315 const SwNumRule* GetOutlineNumrule() const
316 {
317 return m_pOutlineNumrule;
318 }
319 rtl_TextEncoding GetCharSet() const;
320 rtl_TextEncoding GetCJKCharSet() const;
321
GetWWStyleId() const322 sal_uInt16 GetWWStyleId() const
323 {
324 return m_nWWStyleId;
325 }
326
IsWW8BuiltInHeadingStyle() const327 bool IsWW8BuiltInHeadingStyle() const
328 {
329 return GetWWStyleId() >= 1 && GetWWStyleId() <= 9;
330 }
331
IsWW8BuiltInDefaultStyle() const332 bool IsWW8BuiltInDefaultStyle() const
333 {
334 return GetWWStyleId() == 0;
335 }
336
337 static sal_uInt8
WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel)338 WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel)
339 {
340 if (nWW8OutlineLevel < MAXLEVEL)
341 {
342 if (nWW8OutlineLevel == 9)
343 {
344 return 0; // no outline level --> body text
345 }
346 else
347 {
348 return nWW8OutlineLevel + 1; // outline level 1..9
349 }
350 }
351
352 return 0;
353 }
354 };
355
356 // Stack
357
358 class SwWW8FltControlStack : public SwFltControlStack
359 {
360 private:
361 SwWW8ImplReader& rReader;
362 std::unique_ptr<SfxItemSet> m_xScratchSet;
363 sal_uInt16 nToggleAttrFlags;
364 sal_uInt16 nToggleBiDiAttrFlags;
365 SwWW8FltControlStack(const SwWW8FltControlStack&) = delete;
366 SwWW8FltControlStack& operator=(const SwWW8FltControlStack&) = delete;
367 const SwNumFormat* GetNumFormatFromStack(const SwPosition &rPos,
368 const SwTextNode &rTextNode);
369 protected:
370 virtual void SetAttrInDoc(const SwPosition& rTmpPos,
371 SwFltStackEntry& rEntry) override;
372
373 virtual sal_Int32 GetCurrAttrCP() const override;
374 virtual bool IsParaEndInCPs(sal_Int32 nStart, sal_Int32 nEnd, bool bSdOD) const override;
375 //Clear the para end position recorded in reader intermittently for the least impact on loading performance
376 virtual void ClearParaEndPosition() override;
377 virtual bool CheckSdOD(sal_Int32 nStart,sal_Int32 nEnd) override;
378
379 public:
SwWW8FltControlStack(SwDoc * pDo,sal_uLong nFieldFl,SwWW8ImplReader & rReader_)380 SwWW8FltControlStack(SwDoc* pDo, sal_uLong nFieldFl, SwWW8ImplReader& rReader_ )
381 : SwFltControlStack( pDo, nFieldFl ), rReader( rReader_ ),
382 nToggleAttrFlags(0), nToggleBiDiAttrFlags(0)
383 {}
384
385 void NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr);
386
387 virtual SwFltStackEntry* SetAttr(const SwPosition& rPos, sal_uInt16 nAttrId, bool bTstEnde=true, long nHand=LONG_MAX, bool consumedByField=false) override;
388
SetToggleAttr(sal_uInt8 nId,bool bOn)389 void SetToggleAttr(sal_uInt8 nId, bool bOn)
390 {
391 if( bOn )
392 nToggleAttrFlags |= (1 << nId);
393 else
394 nToggleAttrFlags &= ~(1 << nId);
395 }
396
GetToggleAttrFlags() const397 sal_uInt16 GetToggleAttrFlags() const { return nToggleAttrFlags; }
398
SetToggleBiDiAttr(sal_uInt8 nId,bool bOn)399 void SetToggleBiDiAttr(sal_uInt8 nId, bool bOn)
400 {
401 if( bOn )
402 nToggleBiDiAttrFlags |= (1 << nId);
403 else
404 nToggleBiDiAttrFlags &= ~(1 << nId);
405 }
406
GetToggleBiDiAttrFlags() const407 sal_uInt16 GetToggleBiDiAttrFlags() const { return nToggleBiDiAttrFlags; }
SetToggleAttrFlags(sal_uInt16 nFlags)408 void SetToggleAttrFlags(sal_uInt16 nFlags) { nToggleAttrFlags = nFlags; }
SetToggleBiDiAttrFlags(sal_uInt16 nFlags)409 void SetToggleBiDiAttrFlags(sal_uInt16 nFlags) {nToggleBiDiAttrFlags = nFlags;}
410
411 const SfxPoolItem* GetFormatAttr(const SwPosition& rPos, sal_uInt16 nWhich);
GetFormatAttr(const SwPosition & rPos,TypedWhichId<T> nWhich)412 template<class T> const T* GetFormatAttr( const SwPosition& rPos, TypedWhichId<T> nWhich )
413 {
414 return static_cast<const T*>(GetFormatAttr(rPos, sal_uInt16(nWhich)));
415 }
416 const SfxPoolItem* GetStackAttr(const SwPosition& rPos, sal_uInt16 nWhich);
417 };
418
419 //The only thing this is for is RES_FLTR_ANCHOR, anything else is an error.
420 //For graphics whose anchoring position would otherwise be automatically moved
421 //along by the insertion of text.
422 class SwWW8FltAnchorStack : public SwFltControlStack
423 {
424 public:
SwWW8FltAnchorStack(SwDoc * pDo,sal_uLong nFieldFl)425 SwWW8FltAnchorStack(SwDoc* pDo, sal_uLong nFieldFl)
426 : SwFltControlStack( pDo, nFieldFl ) {}
427 void AddAnchor(const SwPosition& rPos,SwFrameFormat *pFormat);
428 void Flush();
429 private:
430 SwWW8FltAnchorStack(const SwWW8FltAnchorStack&) = delete;
431 SwWW8FltAnchorStack& operator=(const SwWW8FltAnchorStack&) = delete;
432 };
433
434
435 namespace SwWW8
436 {
437 struct ltstr
438 {
operator ()SwWW8::ltstr439 bool operator()(const OUString &r1, const OUString &r2) const
440 {
441 return r1.compareToIgnoreAsciiCase(r2)<0;
442 }
443 };
444
445 struct ltnode
446 {
operator ()SwWW8::ltnode447 bool operator()(const SwTextNode *r1, const SwTextNode *r2) const
448 {
449 return r1->GetIndex() < r2->GetIndex();
450 }
451 };
452 };
453
454 class SwWW8ReferencedFltEndStack : public SwFltEndStack
455 {
456 public:
SwWW8ReferencedFltEndStack(SwDoc * pDo,sal_uLong nFieldFl)457 SwWW8ReferencedFltEndStack( SwDoc* pDo, sal_uLong nFieldFl )
458 : SwFltEndStack( pDo, nFieldFl )
459 , aReferencedTOCBookmarks()
460 {}
461
462 // Keep track of referenced TOC bookmarks in order to suppress the import
463 // of unreferenced ones.
464 std::set<OUString, SwWW8::ltstr> aReferencedTOCBookmarks;
465 protected:
466 virtual void SetAttrInDoc( const SwPosition& rTmpPos,
467 SwFltStackEntry& rEntry ) override;
468 };
469
470 class SwWW8FltRefStack final : public SwFltEndStack
471 {
472 public:
SwWW8FltRefStack(SwDoc * pDo,sal_uLong nFieldFl)473 SwWW8FltRefStack(SwDoc* pDo, sal_uLong nFieldFl)
474 : SwFltEndStack( pDo, nFieldFl )
475 , aFieldVarNames()
476 {}
477 bool IsFootnoteEdnBkmField(const SwFormatField& rFormatField, sal_uInt16& rBkmNo);
478
479 //Keep track of variable names created with fields, and the bookmark
480 //mapped to their position, hopefully the same, but very possibly
481 //an additional pseudo bookmark
482 std::map<OUString, OUString, SwWW8::ltstr> aFieldVarNames;
483 private:
484 SwFltStackEntry *RefToVar(const SwField* pField,SwFltStackEntry& rEntry);
485 virtual void SetAttrInDoc(const SwPosition& rTmpPos,
486 SwFltStackEntry& rEntry) override;
487 SwWW8FltRefStack(const SwWW8FltRefStack&) = delete;
488 SwWW8FltRefStack& operator=(const SwWW8FltRefStack&) = delete;
489 };
490
491 template< typename Type >
get_flag(Type nBitField,Type nMask)492 inline bool get_flag( Type nBitField, Type nMask )
493 { return (nBitField & nMask) != 0; }
494
495 template< typename ReturnType, typename Type >
ulimit_cast(Type nValue,ReturnType nMax)496 inline ReturnType ulimit_cast( Type nValue, ReturnType nMax )
497 { return static_cast< ReturnType >( std::min< Type >( nValue, nMax ) ); }
498
499 template< typename ReturnType, typename Type >
ulimit_cast(Type nValue)500 inline ReturnType ulimit_cast( Type nValue )
501 { return ulimit_cast( nValue, std::numeric_limits< ReturnType >::max() ); }
502
503 class SwMacroInfo : public SdrObjUserData
504 {
505 public:
506 SwMacroInfo();
507 virtual ~SwMacroInfo() override;
508
509 SwMacroInfo(SwMacroInfo const &) = default;
510 SwMacroInfo(SwMacroInfo &&) = default;
511 SwMacroInfo & operator =(SwMacroInfo const &) = delete; // due to SdrObjUserData
512 SwMacroInfo & operator =(SwMacroInfo &&) = delete; // due to SdrObjUserData
513
514 virtual std::unique_ptr<SdrObjUserData> Clone( SdrObject* pObj ) const override;
515
SetHlink(const OUString & rHlink)516 void SetHlink( const OUString& rHlink ) { maHlink = rHlink; }
GetHlink() const517 const OUString& GetHlink() const { return maHlink; }
SetTarFrame(const OUString & rTarFrame)518 void SetTarFrame( const OUString& rTarFrame ) { maTarFrame = rTarFrame; }
GetTarFrame() const519 const OUString& GetTarFrame() const { return maTarFrame; }
SetShapeId(sal_Int32 rShapeId)520 void SetShapeId( sal_Int32 rShapeId ) { mnShapeId = rShapeId; }
GetShapeId() const521 const sal_Int32& GetShapeId() const { return mnShapeId; }
SetName(const OUString & rName)522 void SetName( const OUString& rName ) { maNameStr = rName; }
GetName() const523 const OUString& GetName() const { return maNameStr; }
524
525 private:
526 sal_Int32 mnShapeId;
527 OUString maHlink;
528 OUString maNameStr;
529 OUString maTarFrame;
530 };
531
532 struct HyperLinksTable
533 {
534 OUString hLinkAddr;
535 OUString tarFrame;
536 };
537
538 namespace sw
539 {
540 namespace hack
541 {
542 class Position
543 {
544 private:
545 SwNodeIndex maPtNode;
546 sal_Int32 mnPtContent;
547 public:
548 explicit Position(const SwPosition &rPos);
549 operator SwPosition() const;
GetPtNode() const550 const SwNodeIndex& GetPtNode() const { return maPtNode; };
GetPtContent() const551 sal_Int32 GetPtContent() const { return mnPtContent; };
552 };
553 }
554
555 auto FilterControlChars(OUString const& rString) -> OUString;
556 }
557
558 class WW8FieldEntry
559 {
560 private:
561 OUString msBookmarkName;
562 OUString msMarkType;
563 OUString msMarkCode;
564 ::sw::mark::IFieldmark::parameter_map_t maParams;
565
566 public:
567 sw::hack::Position maStartPos;
568 sal_uInt16 mnFieldId;
569 sal_uLong mnObjLocFc;
570 WW8FieldEntry(SwPosition const &rPos, sal_uInt16 nFieldId) throw();
571 WW8FieldEntry(const WW8FieldEntry &rOther) throw();
572 WW8FieldEntry &operator=(const WW8FieldEntry &rOther) throw();
573 void Swap(WW8FieldEntry &rOther) throw();
574
GetPtNode() const575 SwNodeIndex GetPtNode() const { return maStartPos.GetPtNode(); };
GetPtContent() const576 sal_Int32 GetPtContent() const { return maStartPos.GetPtContent(); };
577
GetBookmarkName() const578 const OUString& GetBookmarkName() const { return msBookmarkName;}
GetBookmarkCode() const579 const OUString& GetBookmarkCode() const { return msMarkCode;}
580 void SetBookmarkName(const OUString& bookmarkName);
581 void SetBookmarkType(const OUString& bookmarkType);
582 void SetBookmarkCode(const OUString& bookmarkCode);
getParameters()583 ::sw::mark::IFieldmark::parameter_map_t& getParameters() { return maParams;}
584 };
585
586 // mini marker for some flags
587
588 class WW8ReaderSave
589 {
590 private:
591 WW8PLCFxSaveAll maPLCFxSave;
592 SwPosition const maTmpPos;
593 std::deque<bool> maOldApos;
594 std::deque<WW8FieldEntry> maOldFieldStack;
595 std::unique_ptr<SwWW8FltControlStack> mxOldStck;
596 std::unique_ptr<SwWW8FltAnchorStack> mxOldAnchorStck;
597 std::unique_ptr<sw::util::RedlineStack> mxOldRedlines;
598 std::shared_ptr<WW8PLCFMan> mxOldPlcxMan;
599 std::unique_ptr<WW8FlyPara> mpWFlyPara;
600 std::unique_ptr<WW8SwFlyPara> mpSFlyPara;
601 SwPaM* const mpPreviousNumPaM;
602 const SwNumRule* mpPrevNumRule;
603 std::unique_ptr<WW8TabDesc> mxTableDesc;
604 int const mnInTable;
605 sal_uInt16 const mnCurrentColl;
606 sal_Unicode const mcSymbol;
607 bool const mbIgnoreText;
608 bool const mbSymbol;
609 bool const mbHdFtFootnoteEdn;
610 bool const mbTxbxFlySection;
611 bool const mbAnl;
612 bool const mbInHyperlink;
613 bool const mbPgSecBreak;
614 bool const mbWasParaEnd;
615 bool const mbHasBorder;
616 bool const mbFirstPara;
617 public:
618 WW8ReaderSave(SwWW8ImplReader* pRdr, WW8_CP nStart=-1);
619 void Restore(SwWW8ImplReader* pRdr);
GetStartPos() const620 const SwPosition &GetStartPos() const { return maTmpPos; }
621 };
622
623 enum class eF_ResT { OK, TEXT, TAGIGN, READ_FSPA };
624
625 class SwWW8Shade
626 {
627 public:
628 Color aColor;
629 SwWW8Shade(bool bVer67, const WW8_SHD& rSHD);
SwWW8Shade(Color nFore,Color nBack,sal_uInt16 nIndex)630 SwWW8Shade(Color nFore, Color nBack, sal_uInt16 nIndex)
631 {
632 SetShade(nFore, nBack, nIndex);
633 }
634 private:
635 void SetShade(Color nFore, Color nBack, sal_uInt16 nIndex);
636 };
637
638 // Formulas
639
640 enum SwWw8ControlType
641 {
642 WW8_CT_EDIT,
643 WW8_CT_CHECKBOX,
644 WW8_CT_DROPDOWN
645 };
646
647 class WW8FormulaControl
648 {
649 protected:
650 SwWW8ImplReader &mrRdr;
651
652 WW8FormulaControl(WW8FormulaControl const&) = delete;
653 WW8FormulaControl& operator=(WW8FormulaControl const&) = delete;
654
655 public:
WW8FormulaControl(const OUString & rN,SwWW8ImplReader & rRdr)656 WW8FormulaControl(const OUString& rN, SwWW8ImplReader &rRdr)
657 : mrRdr(rRdr), mfUnknown(0), mfDropdownIndex(0),
658 mfToolTip(0), mfNoMark(0), mfType(0),
659 mfUnused(0), mhpsCheckBox(20), mnChecked(0), mnMaxLen(0),
660 mbHelp(false), msName( rN )
661 {
662 }
663 sal_uInt8 mfUnknown:2;
664 sal_uInt8 mfDropdownIndex:6;
665 sal_uInt8 mfToolTip:1;
666 sal_uInt8 mfNoMark:1;
667 sal_uInt8 mfType:3;
668 sal_uInt8 mfUnused:3;
669
670 sal_uInt16 mhpsCheckBox;
671 sal_uInt16 mnChecked;
672
673 /// FFData.cch in the spec: maximum length, in characters, of the value of the textbox.
674 sal_uInt16 mnMaxLen;
675 OUString msTitle;
676 OUString msDefault;
677 OUString msFormatting;
678 bool mbHelp;
679 OUString msHelp;
680 OUString msToolTip;
681 OUString msEntryMcr;
682 OUString msExitMcr;
683 std::vector<OUString> maListEntries;
~WW8FormulaControl()684 virtual ~WW8FormulaControl() {}
685 void FormulaRead(SwWw8ControlType nWhich,SvStream *pD);
686 virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
687 css::uno::Reference< css::form::XFormComponent> &rFComp,
688 css::awt::Size &rSz) = 0;
689 OUString const msName;
690 };
691
692 class WW8FormulaCheckBox : public WW8FormulaControl
693 {
694 private:
695 WW8FormulaCheckBox(const WW8FormulaCheckBox&) = delete;
696 WW8FormulaCheckBox& operator=(const WW8FormulaCheckBox&) = delete;
697
698 public:
699 explicit WW8FormulaCheckBox(SwWW8ImplReader &rR);
700
701 virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
702 css::uno::Reference< css::form::XFormComponent> &rFComp,
703 css::awt::Size &rSz) override;
704 };
705
706 class WW8FormulaListBox : public WW8FormulaControl
707 {
708 private:
709 WW8FormulaListBox(const WW8FormulaListBox&) = delete;
710 WW8FormulaListBox& operator=(const WW8FormulaListBox&) = delete;
711
712 public:
713 explicit WW8FormulaListBox(SwWW8ImplReader &rR);
714
715 virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
716 css::uno::Reference< css::form::XFormComponent> &rFComp,
717 css::awt::Size &rSz) override;
718 };
719
720 class WW8FormulaEditBox : public WW8FormulaControl
721 {
722 private:
723 WW8FormulaEditBox(const WW8FormulaEditBox&) = delete;
724 WW8FormulaEditBox& operator=(const WW8FormulaEditBox&) = delete;
725 public:
726 explicit WW8FormulaEditBox(SwWW8ImplReader &rR);
727 //no real implementation, return false
Import(const css::uno::Reference<css::lang::XMultiServiceFactory> &,css::uno::Reference<css::form::XFormComponent> &,css::awt::Size &)728 virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> & /* rServiceFactory */,
729 css::uno::Reference< css::form::XFormComponent> & /* rFComp */,
730 css::awt::Size & /* rSz */) override { return false; }
731 };
732
733 class SwMSConvertControls: public oox::ole::MSConvertOCXControls
734 {
735 public:
736 SwMSConvertControls( SfxObjectShell const *pDSh, SwPaM *pP );
737 void InsertFormula( WW8FormulaControl &rFormula);
738 virtual bool InsertControl(const css::uno::Reference< css::form::XFormComponent >& rFComp,
739 const css::awt::Size& rSize,
740 css::uno::Reference< css::drawing::XShape > *pShape, bool bFloatingCtrl) override;
741 void ExportControl(WW8Export &rWrt, const SdrUnoObj& rFormObj);
742 bool ReadOCXStream( tools::SvRef<SotStorage> const & rSrc1,
743 css::uno::Reference< css::drawing::XShape > *pShapeRef,
744 bool bFloatingCtrl=false );
745 private:
746 SwPaM * const pPaM;
747 sal_uInt32 mnObjectId;
748 };
749
750 class SwMSDffManager : public SvxMSDffManager
751 {
752 private:
753 SwWW8ImplReader& rReader;
754 SvStream *pFallbackStream;
755 std::unordered_map<sal_uInt32, Graphic> aOldEscherBlipCache;
756
757 virtual bool GetOLEStorageName( sal_uInt32 nOLEId, OUString& rStorageName,
758 tools::SvRef<SotStorage>& rSrcStorage, css::uno::Reference < css::embed::XStorage >& rDestStorage ) const override;
759 virtual bool ShapeHasText( sal_uLong nShapeId, sal_uLong nFilePos ) const override;
760 // #i32596# - new parameter <_nCalledByGroup>, which
761 // indicates, if the OLE object is imported inside a group object
762 virtual SdrObject* ImportOLE( sal_uInt32 nOLEId,
763 const Graphic& rGrf,
764 const tools::Rectangle& rBoundRect,
765 const tools::Rectangle& rVisArea,
766 const int _nCalledByGroup ) const override;
767
768 SwMSDffManager(const SwMSDffManager&) = delete;
769 SwMSDffManager& operator=(const SwMSDffManager&) = delete;
770 public:
771 static sal_uInt32 GetFilterFlags();
772 static sal_Int32 GetEscherLineMatch(MSO_LineStyle eStyle, MSO_SPT eShapeType,
773 sal_Int32 &rThick);
774 SwMSDffManager( SwWW8ImplReader& rRdr, bool bSkipImages );
775 void DisableFallbackStream();
776 void EnableFallbackStream();
777 protected:
778 virtual SdrObject* ProcessObj( SvStream& rSt, DffObjData& rObjData, SvxMSDffClientData& rData, tools::Rectangle& rTextRect, SdrObject* pObj ) override;
779 };
780
781 class wwSection
782 {
783 public:
784 explicit wwSection(const SwPosition &rPos);
785 SEPr maSep;
786 WW8_BRCVer9 brc[4];
787 SwNodeIndex maStart;
788 SwSection *mpSection;
789 SwPageDesc *mpPage;
790 SvxFrameDirection meDir;
791
792 sal_uInt32 nPgWidth;
793 sal_uInt32 nPgLeft;
794 sal_uInt32 nPgRight;
795
796 css::drawing::TextVerticalAdjust mnVerticalAdjustment;
797 sal_uInt8 mnBorders;
798 bool mbHasFootnote;
799 void SetDirection();
IsContinuous() const800 bool IsContinuous() const { return maSep.bkc == 0; }
IsNotProtected() const801 bool IsNotProtected() const { return maSep.fUnlocked != 0; }
802 bool IsVertical() const;
NoCols() const803 sal_Int16 NoCols() const { return maSep.ccolM1 + 1; }
StandardColSeparation() const804 sal_Int32 StandardColSeparation() const { return maSep.dxaColumns; }
HasTitlePage() const805 bool HasTitlePage() const { return maSep.fTitlePage != 0; }
PageStartAt() const806 sal_uInt16 PageStartAt() const { return maSep.pgnStart; }
PageRestartNo() const807 bool PageRestartNo() const { return maSep.fPgnRestart != 0; }
IsBiDi() const808 bool IsBiDi() const { return maSep.fBiDi != 0; }
GetPageWidth() const809 sal_uInt32 GetPageWidth() const { return nPgWidth; }
GetTextAreaWidth() const810 sal_uInt32 GetTextAreaWidth() const
811 { return GetPageWidth() - GetPageLeft() - GetPageRight(); }
GetPageHeight() const812 sal_uInt32 GetPageHeight() const { return maSep.yaPage; }
GetPageLeft() const813 sal_uInt32 GetPageLeft() const { return nPgLeft; }
GetPageRight() const814 sal_uInt32 GetPageRight() const { return nPgRight; }
IsLandScape() const815 bool IsLandScape() const { return maSep.dmOrientPage != 0; }
IsFixedHeightHeader() const816 bool IsFixedHeightHeader() const { return maSep.dyaTop < 0; }
IsFixedHeightFooter() const817 bool IsFixedHeightFooter() const { return maSep.dyaBottom < 0; }
818 };
819
820 class wwSectionManager
821 {
822 private:
823 /*
824 A queue of the ms sections in the document
825 */
826 SwWW8ImplReader& mrReader;
827 std::deque<wwSection> maSegments;
828 typedef std::deque<wwSection>::iterator mySegIter;
829
830 //Num of page desc's entered into the document
831 sal_uInt16 mnDesc;
832
833 struct wwULSpaceData
834 {
835 bool bHasHeader, bHasFooter;
836 sal_uInt32 nSwHLo, nSwFUp, nSwUp, nSwLo;
wwULSpaceDatawwSectionManager::wwULSpaceData837 wwULSpaceData()
838 : bHasHeader(false)
839 , bHasFooter(false)
840 , nSwHLo(0)
841 , nSwFUp(0)
842 , nSwUp(0)
843 , nSwLo(0)
844 {}
845 };
846
847 void SetSegmentToPageDesc(const wwSection &rSection, bool bIgnoreCols);
848
849 void GetPageULData(const wwSection &rNewSection,
850 wwULSpaceData& rData) const;
851 static void SetPageULSpaceItems(SwFrameFormat &rFormat, wwULSpaceData const & rData,
852 const wwSection &rSection);
853
854 static void SetPage(SwPageDesc &rPageDesc, SwFrameFormat &rFormat,
855 const wwSection &rSection, bool bIgnoreCols);
856
857 static void SetNumberingType(const wwSection &rNewSection, SwPageDesc &rPageDesc);
858
859 void SetUseOn(wwSection &rSection);
860 void SetHdFt(wwSection const &rSection, int nSect, const wwSection *pPrevious);
861
862 SwSectionFormat *InsertSection(SwPaM const & rMyPaM, wwSection &rSection);
863 static bool SetCols(SwFrameFormat &rFormat, const wwSection &rSection,
864 sal_uInt32 nNetWidth);
865 bool SectionIsProtected(const wwSection &rSection) const;
866 void SetLeftRight(wwSection &rSection);
867 /*
868 The segment we're inserting, the start of the segments container, and the
869 nodeindex of where we want the page break to (normally the segments start
870 position
871 */
872 SwFormatPageDesc SetSwFormatPageDesc(mySegIter const &rIter, mySegIter const &rStart,
873 bool bIgnoreCols);
874
875 wwSectionManager(const wwSectionManager&) = delete;
876 wwSectionManager& operator=(const wwSectionManager&) = delete;
877 public:
wwSectionManager(SwWW8ImplReader & rReader)878 explicit wwSectionManager(SwWW8ImplReader &rReader) : mrReader(rReader), mnDesc(0)
879 {}
880 void SetCurrentSectionHasFootnote();
881 void SetCurrentSectionVerticalAdjustment(const css::drawing::TextVerticalAdjust nVA);
882 bool CurrentSectionIsVertical() const;
883 bool CurrentSectionIsProtected() const;
884 void PrependedInlineNode(const SwPosition &rPos, const SwNode &rNode);
885 sal_uInt16 CurrentSectionColCount() const;
886 bool WillHavePageDescHere(const SwNodeIndex& rIdx) const;
887 void CreateSep(const long nTextPos);
888 void InsertSegments();
889 void JoinNode(const SwPosition &rPos, const SwNode &rNode);
890 sal_uInt32 GetPageLeft() const;
891 sal_uInt32 GetPageRight() const;
892 sal_uInt32 GetPageWidth() const;
893 sal_uInt32 GetWWPageTopMargin() const;
894 sal_uInt32 GetTextAreaWidth() const;
895 };
896
897 //Various writer elements like frames start off containing a blank paragraph,
898 //sometimes this paragraph turns out to be extraneous, e.g. the frame should
899 //only contain a table with no trailing paragraph.
900
901 //We want to remove these extra paragraphs, but removing them during the parse
902 //is problematic, because we don't want to remove any paragraphs that are still
903 //addressed by property entries in a SwFltControlStack which have not yet been
904 //committed to the document.
905
906 //Safest thing is to not delete SwTextNodes from a document during import, and
907 //remove these extraneous paragraphs at the end after all SwFltControlStack are
908 //destroyed.
909 class wwExtraneousParas
910 {
911 private:
912 /*
913 A vector of SwTextNodes to erase from a document after import is complete
914 */
915 std::set<SwTextNode*, SwWW8::ltnode> m_aTextNodes;
916 SwDoc& m_rDoc;
917
918 wwExtraneousParas(wwExtraneousParas const&) = delete;
919 wwExtraneousParas& operator=(wwExtraneousParas const&) = delete;
920
921 public:
wwExtraneousParas(SwDoc & rDoc)922 explicit wwExtraneousParas(SwDoc &rDoc) : m_rDoc(rDoc) {}
~wwExtraneousParas()923 ~wwExtraneousParas() { delete_all_from_doc(); }
insert(SwTextNode * pTextNode)924 void insert(SwTextNode *pTextNode) { m_aTextNodes.insert(pTextNode); }
925 void delete_all_from_doc();
926 };
927
928 class wwFrameNamer
929 {
930 private:
931 OUString const msSeed;
932 sal_Int32 mnImportedGraphicsCount;
933 bool const mbIsDisabled;
934
935 wwFrameNamer(wwFrameNamer const&) = delete;
936 wwFrameNamer& operator=(wwFrameNamer const&) = delete;
937
938 public:
939 void SetUniqueGraphName(SwFrameFormat *pFrameFormat, const OUString &rFixedPart);
wwFrameNamer(bool bIsDisabled,const OUString & rSeed)940 wwFrameNamer(bool bIsDisabled, const OUString &rSeed)
941 : msSeed(rSeed), mnImportedGraphicsCount(0), mbIsDisabled(bIsDisabled)
942 {
943 }
944 };
945
946 class wwSectionNamer
947 {
948 private:
949 const SwDoc &mrDoc;
950 OUString const msFileLinkSeed;
951 int mnFileSectionNo;
952 wwSectionNamer(const wwSectionNamer&) = delete;
953 wwSectionNamer& operator=(const wwSectionNamer&) = delete;
954 public:
955 OUString UniqueName();
wwSectionNamer(const SwDoc & rDoc,const OUString & rSeed)956 wwSectionNamer(const SwDoc &rDoc, const OUString &rSeed)
957 : mrDoc(rDoc), msFileLinkSeed(rSeed), mnFileSectionNo(0)
958 { }
959 };
960
961 class FootnoteDescriptor
962 {
963 public:
964 ManTypes meType;
965 bool mbAutoNum;
966 WW8_CP mnStartCp;
967 WW8_CP mnLen;
968 };
969
970 struct ApoTestResults
971 {
972 bool mbStartApo;
973 bool mbStopApo;
974 bool m_bHasSprm37;
975 bool m_bHasSprm29;
976 sal_uInt8 m_nSprm29;
977 WW8FlyPara* mpStyleApo;
ApoTestResultsApoTestResults978 ApoTestResults()
979 : mbStartApo(false), mbStopApo(false), m_bHasSprm37(false)
980 , m_bHasSprm29(false), m_nSprm29(0), mpStyleApo(nullptr) {}
HasStartStopApoTestResults981 bool HasStartStop() const { return (mbStartApo || mbStopApo); }
HasFrameApoTestResults982 bool HasFrame() const { return (m_bHasSprm29 || m_bHasSprm37 || mpStyleApo); }
983 };
984
985 struct ANLDRuleMap
986 {
987 OUString msOutlineNumRule; // WinWord 6 numbering, variant 1
988 OUString msNumberingNumRule; // WinWord 6 numbering, variant 2
989 SwNumRule* GetNumRule(const SwDoc& rDoc, sal_uInt8 nNumType);
990 void SetNumRule(const OUString& rNumRule, sal_uInt8 nNumType);
991 };
992
993 struct SprmReadInfo;
994 class SwDocShell;
995 struct WW8PostProcessAttrsInfo
996 {
997 bool mbCopy;
998 WW8_CP const mnCpStart;
999 WW8_CP const mnCpEnd;
1000 SwPaM mPaM;
1001 SfxItemSet mItemSet;
1002
1003 WW8PostProcessAttrsInfo(WW8_CP nCpStart, WW8_CP nCpEnd, SwPaM & rPaM);
1004 };
1005
1006 #define MAX_COL 64 // WW6-description: 32, WW6-UI: 31 & WW8-UI: 63!
1007
1008 struct WW8TabBandDesc
1009 {
1010 WW8TabBandDesc* pNextBand;
1011 short nGapHalf;
1012 short mnDefaultLeft;
1013 short mnDefaultTop;
1014 short mnDefaultRight;
1015 short mnDefaultBottom;
1016 bool mbHasSpacing;
1017 short nLineHeight;
1018 short nRows;
1019 sal_uInt16 maDirections[MAX_COL + 1];
1020 short nCenter[MAX_COL + 1]; // X-edge of all cells of this band
1021 short nWidth[MAX_COL + 1]; // length of all cells of this band
1022 short nWwCols; // sal_uInt8 would be sufficient, alignment -> short
1023 short nSwCols; // SW: number of columns for the writer
1024 bool bLEmptyCol; // SW: an additional empty column at the left
1025 bool bREmptyCol; // SW: same at the right
1026 bool bCantSplit;
1027 bool bCantSplit90;
1028 WW8_TCell* pTCs;
1029 sal_uInt8 nOverrideSpacing[MAX_COL + 1];
1030 short nOverrideValues[MAX_COL + 1][4];
1031 WW8_SHD* pSHDs;
1032 Color* pNewSHDs;
1033 WW8_BRCVer9 aDefBrcs[6];
1034
1035 bool bExist[MAX_COL]; // does this cell exist ?
1036 sal_uInt8 nTransCell[MAX_COL + 2]; // translation WW-Index -> SW-Index
1037
transCellWW8TabBandDesc1038 sal_uInt8 transCell(sal_uInt8 nWwCol) const
1039 {
1040 return nWwCol < SAL_N_ELEMENTS(nTransCell) ? nTransCell[nWwCol] : 0xFF;
1041 }
1042
1043 WW8TabBandDesc();
1044 WW8TabBandDesc(WW8TabBandDesc const & rBand); // deep copy
1045 ~WW8TabBandDesc();
1046 void ReadDef(bool bVer67, const sal_uInt8* pS, short nLen);
1047 void ProcessDirection(const sal_uInt8* pParams);
1048 void ProcessSprmTSetBRC(int nBrcVer, const sal_uInt8* pParamsTSetBRC, sal_uInt16 nParamsLen);
1049 void ProcessSprmTTableBorders(int nBrcVer, const sal_uInt8* pParams, sal_uInt16 nParamsLen);
1050 void ProcessSprmTDxaCol(const sal_uInt8* pParamsTDxaCol);
1051 void ProcessSprmTDelete(const sal_uInt8* pParamsTDelete);
1052 void ProcessSprmTInsert(const sal_uInt8* pParamsTInsert);
1053 void ProcessSpacing(const sal_uInt8* pParamsTInsert);
1054 void ProcessSpecificSpacing(const sal_uInt8* pParamsTInsert);
1055 void ReadShd(const sal_uInt8* pS );
1056 void ReadNewShd(const sal_uInt8* pS, bool bVer67);
1057
1058 enum wwDIR {wwTOP = 0, wwLEFT = 1, wwBOTTOM = 2, wwRIGHT = 3};
1059
1060 private:
1061 WW8TabBandDesc & operator =(WW8TabBandDesc const &) = default; // only for use in copy ctor
1062 };
1063
1064 // Storage-Reader
1065
1066 typedef std::set<WW8_CP> cp_set;
1067 typedef std::vector<WW8_CP> cp_vector;
1068
1069 class SwWW8ImplReader
1070 {
1071 private:
1072 SwDocShell *m_pDocShell; // The Real DocShell
1073
1074 friend class WW8RStyle;
1075 friend class WW8TabDesc;
1076 friend class WW8ReaderSave;
1077 friend struct WW8FlyPara;
1078 friend struct WW8SwFlyPara;
1079 friend class WW8FlySet;
1080 friend class SwMSDffManager;
1081 friend class SwWW8FltControlStack;
1082 friend class WW8FormulaControl;
1083 friend class wwSectionManager;
1084
1085 private:
1086
1087 SotStorage* m_pStg; // Input-Storage
1088 SvStream* m_pStrm; // Input-(Storage)Stream
1089 SvStream* m_pTableStream; // Input-(Storage)Stream
1090 SvStream* m_pDataStream; // Input-(Storage)Stream
1091
1092 // general stuff
1093 SwDoc& m_rDoc;
1094 std::shared_ptr<SwUnoCursor> mpCursor;
1095 SwPaM* m_pPaM;
1096
1097 std::unique_ptr<SwWW8FltControlStack> m_xCtrlStck; // stack for the attributes
1098
1099 /*
1100 This stack is for redlines, because their sequence of discovery can
1101 be out of order of their order of insertion into the document.
1102 */
1103 std::stack<std::unique_ptr<sw::util::RedlineStack>> m_aFrameRedlines; //inside frames, tables, etc
1104 std::unique_ptr<sw::util::RedlineStack> m_xRedlineStack; //main document
1105
1106 /*
1107 This stack is for fields that get referenced later, e.g. BookMarks and TOX.
1108 They get inserted at the end of the document, it is the same stack for
1109 headers/footers/main text/textboxes/tables etc...
1110 */
1111 std::unique_ptr<SwWW8ReferencedFltEndStack> m_xReffedStck;
1112
1113 /*
1114 This stack is for fields whose true conversion cannot be determined until
1115 the end of the document, it is the same stack for headers/footers/main
1116 text/textboxes/tables etc... They are things that reference other things
1117 e.g. NoteRef and Ref, they are processed after pReffedStck
1118 */
1119 std::unique_ptr<SwWW8FltRefStack> m_xReffingStck;
1120
1121 /*
1122 For graphics anchors. Determines the graphics whose anchors are in the
1123 current paragraph, and works around the difficulty in inserting a graphic
1124 anchored to character before a character to be anchored to has been
1125 inserted. Is emptied at the end of each paragraph.
1126 */
1127 std::unique_ptr<SwWW8FltAnchorStack> m_xAnchorStck;
1128
1129 /*
1130 A stack of fields identifiers to keep track of any open fields that need
1131 to be closed. Generally word fields are inserted as writer fields as soon
1132 as they are encountered, and so their end point is normally unimportant.
1133 But hyperlink fields need to be applied as attributes to text and it is
1134 far easier and safer to set the end point of an attribute when we
1135 encounter the end marker of the field instead of calculating in advance
1136 where the end point will fall, to do so fully correctly duplicates the
1137 main logic of the filter itself.
1138 */
1139 std::deque<WW8FieldEntry> m_aFieldStack;
1140
1141 /*
1142 A stack of open footnotes. Should only be one in it at any time.
1143 */
1144 std::deque<FootnoteDescriptor> m_aFootnoteStack;
1145
1146 /*
1147 A queue of the ms sections in the document
1148 */
1149 wwSectionManager m_aSectionManager;
1150
1151 /*
1152 A vector of surplus-to-requirements paragraph in the final document,
1153 that exist because of quirks of the SwDoc document model and/or API,
1154 which need to be removed.
1155 */
1156 wwExtraneousParas m_aExtraneousParas;
1157
1158 /*
1159 A map of tables to their follow nodes for use in inserting tables into
1160 already existing document, i.e. insert file
1161 */
1162 sw::util::InsertedTablesManager m_aInsertedTables;
1163
1164 /*
1165 Creates unique names to give to (file link) sections (WW1/WW2/...)
1166 */
1167 wwSectionNamer m_aSectionNameGenerator;
1168
1169 /*
1170 Knows how to split a series of bytes into sprms and their arguments
1171 */
1172 std::unique_ptr<wwSprmParser> m_xSprmParser;
1173
1174 /*
1175 Creates unique names to give to graphics
1176 */
1177 wwFrameNamer m_aGrfNameGenerator;
1178
1179 /*
1180 Knows which writer style a given word style should be imported as.
1181 */
1182 sw::util::ParaStyleMapper m_aParaStyleMapper;
1183 sw::util::CharStyleMapper m_aCharStyleMapper;
1184
1185 /*
1186 Stack of textencoding being used as we progress through the document text
1187 */
1188 std::stack<rtl_TextEncoding> m_aFontSrcCharSets;
1189 std::stack<rtl_TextEncoding> m_aFontSrcCJKCharSets;
1190
1191 /*
1192 Progress bar
1193 */
1194 std::unique_ptr<ImportProgress> m_xProgress;
1195
1196 std::unique_ptr<SwMSConvertControls> m_xFormImpl; // implementation of control
1197
1198 SwFlyFrameFormat* m_pFlyFormatOfJustInsertedGraphic;
1199 SwFrameFormat* m_pFormatOfJustInsertedApo;
1200 SwPaM* m_pPreviousNumPaM;
1201 const SwNumRule* m_pPrevNumRule;
1202
1203 //Keep track of APO environments
1204 std::deque<bool> m_aApos;
1205 /*
1206 Keep track of generated Ruby character formats we can minimize the
1207 number of character formats created
1208 */
1209 std::vector<const SwCharFormat*> m_aRubyCharFormats;
1210
1211 /*
1212 For fuzzing keep track of source offset of inserted graphics
1213 */
1214 std::set<sal_uLong> m_aGrafPosSet;
1215
1216 std::unique_ptr<WW8PostProcessAttrsInfo> m_pPostProcessAttrsInfo;
1217
1218 std::shared_ptr<WW8Fib> m_xWwFib;
1219 std::unique_ptr<WW8Fonts> m_xFonts;
1220 std::unique_ptr<WW8Dop> m_xWDop;
1221 std::unique_ptr<WW8ListManager, o3tl::default_delete<WW8ListManager>> m_xLstManager;
1222 std::unique_ptr<WW8ScannerBase> m_xSBase;
1223 std::shared_ptr<WW8PLCFMan> m_xPlcxMan;
1224 std::map<short, OUString> m_aLinkStringMap;
1225
1226 std::set<const SwNode*> m_aTextNodesHavingFirstLineOfstSet; // #i103711#
1227 std::set<const SwNode*> m_aTextNodesHavingLeftIndentSet; // #i105414#
1228
1229 std::unique_ptr<WW8RStyle> m_xStyles; // pointer to the style reading class
1230 SwFormat* m_pCurrentColl; // collection to be created now
1231 // ( always 0 outside of a Style-Def )
1232 std::unique_ptr<SfxItemSet> m_xCurrentItemSet;// character attributes to be read in now
1233 // (always 0 outside of the WW8ListManager Ctor)
1234 std::vector<SwWW8StyInf> m_vColl;
1235 const SwTextFormatColl* m_pDfltTextFormatColl; // Default
1236 SwFormat* m_pStandardFormatColl;// "Standard"
1237
1238 std::unique_ptr<WW8PLCF_HdFt> m_xHdFt; // pointer to Header / Footer - scanner class
1239
1240 std::unique_ptr<WW8FlyPara> m_xWFlyPara; // WW-parameter
1241 std::unique_ptr<WW8SwFlyPara> m_xSFlyPara; // Sw parameters created from previous
1242
1243 std::unique_ptr<WW8TabDesc> m_xTableDesc; // description of table properties
1244 //Keep track of tables within tables
1245 std::stack<std::unique_ptr<WW8TabDesc>> m_aTableStack;
1246
1247 ANLDRuleMap m_aANLDRules;
1248 std::unique_ptr<WW8_OLST> m_xNumOlst; // position in text
1249
1250 SdrModel* m_pDrawModel;
1251 SdrPage* m_pDrawPg;
1252 std::unique_ptr<EditEngine> m_pDrawEditEngine;
1253 std::unique_ptr<wwZOrderer> m_xWWZOrder;
1254
1255 SwFieldType* m_pNumFieldType; // for number circle
1256
1257 std::unique_ptr<SwMSDffManager> m_xMSDffManager;
1258
1259 std::unique_ptr<std::vector<OUString>> m_pAtnNames;
1260
1261 std::unique_ptr<WW8SmartTagData> m_pSmartTagData;
1262
1263 sw::util::AuthorInfos m_aAuthorInfos;
1264 OUString const m_sBaseURL;
1265
1266 // Ini-Flags:
1267 sal_uInt32 m_nIniFlags; // flags from writer.ini
1268 sal_uInt32 m_nIniFlags1; // dito ( additional flags )
1269 sal_uInt32 m_nFieldFlags; // dito for fields
1270 sal_uInt32 m_nFieldTagAlways[3]; // dito for tagging of fields
1271 sal_uInt32 m_nFieldTagBad[3]; // dito for tagging of fields that can't be imported
1272 bool m_bRegardHindiDigits; // import digits in CTL scripts as Hindi numbers
1273
1274 bool m_bDrawCpOValid;
1275 WW8_CP m_nDrawCpO; // start of Txbx-SubDocs
1276
1277 sal_uLong m_nPicLocFc; // Picture Location in File (FC)
1278 sal_uLong m_nObjLocFc; // Object Location in File (FC)
1279
1280 sal_Int32 m_nIniFlyDx; // X-offset of Flys
1281 sal_Int32 m_nIniFlyDy; // Y-offset of Flys
1282
1283 rtl_TextEncoding m_eTextCharSet; // Default charset for Text
1284 rtl_TextEncoding m_eStructCharSet; // rtl_TextEncoding for structures
1285 rtl_TextEncoding m_eHardCharSet; // Hard rtl_TextEncoding-Attribute
1286 sal_uInt16 m_nProgress; // percentage for Progressbar
1287 sal_uInt16 m_nCurrentColl; // per WW-count
1288 sal_uInt16 m_nFieldNum; // serial number for that
1289 sal_uInt16 m_nLFOPosition;
1290
1291 short m_nCharFormat; // per WW-count, <0 for none
1292
1293 short m_nDrawXOfs, m_nDrawYOfs;
1294 short m_nDrawXOfs2, m_nDrawYOfs2;
1295
1296 sal_Unicode m_cSymbol; // symbol to be read now
1297
1298 sal_uInt8 const m_nWantedVersion; // originally requested WW-Doc version by Writer
1299
1300 sal_uInt8 m_nSwNumLevel; // level number for outline / enumeration
1301 sal_uInt8 m_nWwNumType; // outline / number / enumeration
1302 sal_uInt8 m_nListLevel;
1303
1304 bool const m_bNewDoc; // new document?
1305 bool const m_bSkipImages; // skip images for text extraction/indexing
1306 bool m_bReadNoTable; // no tables
1307 bool m_bPgSecBreak; // Page- or Sectionbreak is still to be added
1308 bool m_bSpec; // special char follows in text
1309 bool m_bObj; // Obj in Text
1310 bool m_bTxbxFlySection; // FlyFrame that was inserted as replacement for Winword Textbox
1311 bool m_bHasBorder; // for bundling of the borders
1312 bool m_bSymbol; // e.g. Symbol instead of Times
1313 bool m_bIgnoreText; // e.g. for FieldVanish
1314 int m_nInTable; // are we currently reading a table?
1315 bool m_bWasTabRowEnd; // table : Row End Mark
1316 bool m_bWasTabCellEnd; // table: Cell End Mark
1317
1318 bool m_bAnl; // enumeration in work
1319 // Anl stands for "Autonumber level"
1320
1321 bool m_bHdFtFootnoteEdn; // special text: header/footer/and so on
1322 bool m_bFootnoteEdn; // footnote or endnote
1323 bool m_bIsHeader; // text is read from header ( line height )
1324 bool m_bIsFooter; // text is read from footer ( line height )
1325
1326 bool m_bIsUnicode; // current piece of text is encoded as 2-byte Unicode
1327 // please do NOT handle this as bit field!
1328
1329 bool m_bCpxStyle; // style in the complex part
1330 bool m_bStyNormal; // style with Id 0 is currently read
1331 bool m_bWWBugNormal; // WW-Version with Bug Dya in Style Normal
1332 bool m_bNoAttrImport; // ignore attributes for ignoring styles
1333 bool m_bInHyperlink; // special case for reading 0x01
1334 // see also: SwWW8ImplReader::Read_F_Hyperlink()
1335 bool m_bWasParaEnd;
1336
1337 // useful helper variables
1338 bool m_bVer67; // ( (6 == nVersion) || (7 == nVersion) );
1339 bool m_bVer6; // (6 == nVersion);
1340 bool m_bVer7; // (7 == nVersion);
1341 bool m_bVer8; // (8 == nVersion);
1342
1343 bool m_bEmbeddObj; // EmbeddField is being read
1344
1345 bool m_bCurrentAND_fNumberAcross; // current active Annotated List Descriptor - ROW flag
1346
1347 bool m_bNoLnNumYet; // no Line Numbering has been activated yet (we import
1348 // the very 1st Line Numbering and ignore the rest)
1349
1350 bool m_bFirstPara; // first paragraph?
1351 bool m_bFirstParaOfPage;
1352 bool m_bParaAutoBefore;
1353 bool m_bParaAutoAfter;
1354
1355 bool m_bDropCap;
1356 sal_Int32 m_nDropCap;
1357
1358 bool m_bBidi;
1359 bool m_bReadTable;
1360 // Indicate that currently on loading a TOC, managed by Read_F_TOX() and End_Field()
1361 bool m_bLoadingTOXCache;
1362 int m_nEmbeddedTOXLevel;
1363 // Indicate that current on loading a hyperlink, which is inside a TOC; Managed by Read_F_Hyperlink() and End_Field()
1364 bool m_bLoadingTOXHyperlink;
1365 // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field()
1366 std::unique_ptr<SwPaM> m_pPosAfterTOC;
1367 // used for some dropcap tweaking
1368 SwTextNode* m_pPreviousNode;
1369
1370 std::unique_ptr< SwPosition > m_pLastAnchorPos;
1371
1372 bool m_bCareFirstParaEndInToc;
1373 bool m_bCareLastParaEndInToc;
1374 cp_set m_aTOXEndCps;
1375
1376 cp_vector m_aEndParaPos;
1377 WW8_CP m_aCurrAttrCP;
1378 bool m_bOnLoadingMain:1;
1379 bool m_bNotifyMacroEventRead:1;
1380
1381 const SprmReadInfo& GetSprmReadInfo(sal_uInt16 nId) const;
1382
StyleExists(unsigned int nColl) const1383 bool StyleExists(unsigned int nColl) const { return (nColl < m_vColl.size()); }
1384 SwWW8StyInf *GetStyle(sal_uInt16 nColl) const;
1385 void AppendTextNode(SwPosition& rPos);
1386
1387 void Read_HdFt(int nSect, const SwPageDesc *pPrev,
1388 const wwSection &rSection);
1389 void Read_HdFtText(WW8_CP nStartCp, WW8_CP nLen, SwFrameFormat const * pHdFtFormat);
1390 void Read_HdFtTextAsHackedFrame(WW8_CP nStart, WW8_CP nLen,
1391 SwFrameFormat const &rHdFtFormat, sal_uInt16 nPageWidth);
1392
1393 bool isValid_HdFt_CP(WW8_CP nHeaderCP) const;
1394
1395 bool HasOwnHeaderFooter(sal_uInt8 nWhichItems, sal_uInt8 grpfIhdt, int nSect);
1396
1397 void HandleLineNumbering(const wwSection &rSection);
1398
1399 void CopyPageDescHdFt( const SwPageDesc* pOrgPageDesc,
1400 SwPageDesc* pNewPageDesc, sal_uInt8 nCode );
1401
1402 void DeleteStack(std::unique_ptr<SwFltControlStack> prStck);
DeleteCtrlStack()1403 void DeleteCtrlStack()
1404 {
1405 DeleteStack(std::move(m_xCtrlStck));
1406 }
DeleteRefStacks()1407 void DeleteRefStacks()
1408 {
1409 DeleteStack(std::move(m_xReffedStck));
1410 DeleteStack(std::move(m_xReffingStck));
1411 }
DeleteAnchorStack()1412 void DeleteAnchorStack()
1413 {
1414 DeleteStack(std::move(m_xAnchorStck));
1415 }
1416 void emulateMSWordAddTextToParagraph(const OUString& rAddString);
1417 void simpleAddTextToParagraph(const OUString& rAddString);
1418 bool HandlePageBreakChar();
1419 bool ReadChar(long nPosCp, long nCpOfs);
1420 bool ReadPlainChars(WW8_CP& rPos, sal_Int32 nEnd, sal_Int32 nCpOfs);
1421 bool ReadChars(WW8_CP& rPos, WW8_CP nNextAttr, long nTextEnd, long nCpOfs);
1422 static bool LangUsesHindiNumbers(LanguageType nLang);
1423 static sal_Unicode TranslateToHindiNumbers(sal_Unicode);
1424
1425 void SetDocumentGrid(SwFrameFormat &rFormat, const wwSection &rSection);
1426
1427 void ProcessCurrentCollChange(WW8PLCFManResult& rRes, bool* pStartAttr,
1428 bool bCallProcessSpecial);
1429 long ReadTextAttr(WW8_CP& rTextPos, long nTextEnd, bool& rbStartLine, int nDepthGuard = 0);
1430 void ReadAttrs(WW8_CP& rTextPos, WW8_CP& rNext, long nTextEnd, bool& rbStartLine);
1431 void CloseAttrEnds();
1432 bool ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType);
1433
1434 void ReadRevMarkAuthorStrTabl( SvStream& rStrm, sal_Int32 nTablePos,
1435 sal_Int32 nTableSiz, SwDoc& rDoc );
1436
1437 void Read_HdFtFootnoteText(const SwNodeIndex* pSttIdx, WW8_CP nStartCp,
1438 WW8_CP nLen, ManTypes nType);
1439
1440 void ImportTox( int nFieldId, const OUString& aStr );
1441
1442 void EndSprm( sal_uInt16 nId );
1443 // #i103711#
1444 // #i105414#
1445 void NewAttr( const SfxPoolItem& rAttr,
1446 const bool bFirstLineOfStSet = false,
1447 const bool bLeftIndentSet = false );
1448
1449 bool GetFontParams(sal_uInt16, FontFamily&, OUString&, FontPitch&,
1450 rtl_TextEncoding&);
1451 bool SetNewFontAttr(sal_uInt16 nFCode, bool bSetEnums, sal_uInt16 nWhich);
1452 void ResetCharSetVars();
1453 void ResetCJKCharSetVars();
1454
1455 const SfxPoolItem* GetFormatAttr( sal_uInt16 nWhich );
1456 bool JoinNode(SwPaM &rPam, bool bStealAttr = false);
1457
1458 static bool IsBorder(const WW8_BRCVer9* pbrc, bool bChkBtwn = false);
1459
1460 //Set closest writer border equivalent into rBox from pbrc, optionally
1461 //recording true winword dimensions in pSizeArray. nSetBorders to mark a
1462 //border which has been previously set to a value and for which becoming
1463 //empty is valid. Set bCheBtwn to work with paragraphs that have a special
1464 //between paragraphs border
1465
1466 // Note #i20672# we can't properly support between lines so best to ignore
1467 // them for now
1468 static bool SetBorder(SvxBoxItem& rBox, const WW8_BRCVer9* pbrc,
1469 short *pSizeArray=nullptr, sal_uInt8 nSetBorders=0xFF);
1470 static void GetBorderDistance(const WW8_BRCVer9* pbrc, tools::Rectangle& rInnerDist);
1471 static sal_uInt16 GetParagraphAutoSpace(bool fDontUseHTMLAutoSpacing);
1472 static bool SetShadow(SvxShadowItem& rShadow, const short *pSizeArray,
1473 const WW8_BRCVer9& aRightBrc);
1474 //returns true is a shadow was set
1475 static bool SetFlyBordersShadow(SfxItemSet& rFlySet, const WW8_BRCVer9 *pbrc,
1476 short *SizeArray);
1477 static void SetPageBorder(SwFrameFormat &rFormat, const wwSection &rSection);
1478
1479 static sal_Int32 MatchSdrBoxIntoFlyBoxItem( const Color& rLineColor,
1480 MSO_LineStyle eLineStyle, MSO_LineDashing eDashing, MSO_SPT eShapeType, sal_Int32 &rLineWidth,
1481 SvxBoxItem& rBox );
1482 void MatchSdrItemsIntoFlySet( SdrObject const * pSdrObj, SfxItemSet &aFlySet,
1483 MSO_LineStyle eLineStyle, MSO_LineDashing eDashing, MSO_SPT eShapeType, tools::Rectangle &rInnerDist );
1484 static void AdjustLRWrapForWordMargins(const SvxMSDffImportRec &rRecord,
1485 SvxLRSpaceItem &rLR);
1486 static void AdjustULWrapForWordMargins(const SvxMSDffImportRec &rRecord,
1487 SvxULSpaceItem &rUL);
1488 static void MapWrapIntoFlyFormat(SvxMSDffImportRec const * pRecord, SwFrameFormat* pFlyFormat);
1489
1490 void SetAttributesAtGrfNode(SvxMSDffImportRec const* pRecord,
1491 SwFrameFormat const *pFlyFormat, WW8_FSPA const *pF);
1492
1493 bool IsDropCap() const;
IsListOrDropcap() const1494 bool IsListOrDropcap() const { return (!m_xCurrentItemSet || m_bDropCap); };
1495
1496 //Apo == Absolutely Positioned Object, MSWord's old-style frames
1497 std::unique_ptr<WW8FlyPara> ConstructApo(const ApoTestResults &rApo,
1498 const WW8_TablePos *pTabPos);
1499 bool StartApo(const ApoTestResults &rApo, const WW8_TablePos *pTabPos);
1500 void StopApo();
1501 bool TestSameApo(const ApoTestResults &rApo, const WW8_TablePos *pTabPos);
1502 ApoTestResults TestApo(int nCellLevel, bool bTableRowEnd,
1503 const WW8_TablePos *pTabPos);
1504 static void StripNegativeAfterIndent(SwFrameFormat const *pFlyFormat);
1505
1506 void EndSpecial();
1507 bool ProcessSpecial(bool &rbReSync, WW8_CP nStartCp);
1508 sal_uInt16 TabRowSprm(int nLevel) const;
1509
1510 bool ReadGrafFile(OUString& rFileName, std::unique_ptr<Graphic>& rpGraphic,
1511 const WW8_PIC& rPic, SvStream* pSt, sal_uLong nFilePos, bool* pDelIt);
1512
1513 static void ReplaceObj(const SdrObject &rReplaceTextObj,
1514 SdrObject &rSubObj);
1515
1516 SwFlyFrameFormat* MakeGrafNotInContent(const WW8PicDesc& rPD,
1517 const Graphic* pGraph, const OUString& rFileName,
1518 const SfxItemSet& rGrfSet);
1519
1520 SwFrameFormat* MakeGrafInContent(const WW8_PIC& rPic, const WW8PicDesc& rPD,
1521 const Graphic* pGraph, const OUString& rFileName,
1522 const SfxItemSet& rGrfSet);
1523
1524 SwFrameFormat *AddAutoAnchor(SwFrameFormat *pFormat);
1525 SwFrameFormat* ImportGraf1(WW8_PIC const & rPic, SvStream* pSt, sal_uLong nFilePos);
1526 SwFrameFormat* ImportGraf(SdrTextObj const * pTextObj = nullptr, SwFrameFormat const * pFlyFormat = nullptr);
1527
1528 SdrObject* ImportOleBase( Graphic& rGraph, const Graphic* pGrf=nullptr,
1529 const SfxItemSet* pFlySet=nullptr, const tools::Rectangle& aVisArea = tools::Rectangle() );
1530
1531 SwFrameFormat* ImportOle( const Graphic* = nullptr, const SfxItemSet* pFlySet = nullptr,
1532 const SfxItemSet* pGrfSet = nullptr, const tools::Rectangle& aVisArea = tools::Rectangle() );
1533 SwFlyFrameFormat* InsertOle(SdrOle2Obj &rObject, const SfxItemSet &rFlySet,
1534 const SfxItemSet *rGrfSet);
1535
1536 bool ImportFormulaControl(WW8FormulaControl &rBox,WW8_CP nStart,
1537 SwWw8ControlType nWhich);
1538
1539 void ImportDop();
1540
1541 //This converts MS Asian Typography information into OOo's
1542 void ImportDopTypography(const WW8DopTypography &rTypo);
1543
1544 ErrCode LoadThroughDecryption(WW8Glossary *pGloss);
1545 ErrCode SetSubStreams(tools::SvRef<SotStorageStream> &rTableStream, tools::SvRef<SotStorageStream> &rDataStream);
1546 ErrCode CoreLoad(WW8Glossary const *pGloss);
1547
1548 void ReadDocVars();
1549
1550 bool StartTable(WW8_CP nStartCp);
1551 bool InEqualApo(int nLvl) const;
InLocalApo() const1552 bool InLocalApo() const { return InEqualApo(m_nInTable); }
1553 bool InEqualOrHigherApo(int nLvl) const;
1554 void TabCellEnd();
1555 void StopTable();
1556 bool IsInvalidOrToBeMergedTabCell() const;
1557
1558 // Enumerations / lists ( Autonumbered List Data Descriptor )
1559 // list: ANLD ( Autonumbered List Data Descriptor )
1560 // one level: ANLV ( Autonumber Level Descriptor )
1561
1562 // Chg7-8:
1563 // lists are separate structures in WW8 that are handled via the following three tables:
1564 // rglst, hpllfo and hsttbListNames
1565 // the corresponding structures are: LSTF, LVLF, LFO LFOLVL
1566
1567 void SetAnlvStrings(SwNumFormat &rNum, WW8_ANLV const &rAV, const sal_uInt8* pText,
1568 size_t nStart, size_t nElements, bool bOutline);
1569 void SetAnld(SwNumRule* pNumR, WW8_ANLD const * pAD, sal_uInt8 nSwLevel, bool bOutLine);
1570 void SetNumOlst( SwNumRule* pNumR, WW8_OLST* pO, sal_uInt8 nSwLevel );
1571 SwNumRule* GetStyRule();
1572
1573 void StartAnl(const sal_uInt8* pSprm13);
1574 void NextAnlLine(const sal_uInt8* pSprm13);
1575 void StopAllAnl(bool bGoBack = true);
1576 void StopAnlToRestart(sal_uInt8 nType, bool bGoBack = true);
1577
1578 // graphics layer
1579
1580 bool ReadGrafStart(void* pData, short nDataSiz, WW8_DPHEAD const * pHd,
1581 SfxAllItemSet &rSet);
1582 SdrObject *ReadLine(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1583 SdrObject *ReadRect(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1584 SdrObject *ReadElipse(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1585 SdrObject *ReadArc(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1586 SdrObject *ReadPolyLine(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1587 void InsertTxbxStyAttrs( SfxItemSet& rS, sal_uInt16 nColl );
1588 void InsertAttrsAsDrawingAttrs(WW8_CP nStartCp, WW8_CP nEndCp, ManTypes eType, bool bONLYnPicLocFc=false);
1589
1590 bool GetTxbxTextSttEndCp(WW8_CP& rStartCp, WW8_CP& rEndCp, sal_uInt16 nTxBxS,
1591 sal_uInt16 nSequence);
1592 sal_Int32 GetRangeAsDrawingString(OUString& rString, long StartCp, long nEndCp, ManTypes eType);
1593 std::unique_ptr<OutlinerParaObject> ImportAsOutliner(OUString &rString, WW8_CP nStartCp, WW8_CP nEndCp, ManTypes eType);
1594 void InsertTxbxText(SdrTextObj* pTextObj, Size const * pObjSiz,
1595 sal_uInt16 nTxBxS, sal_uInt16 nSequence, long nPosCp, SwFrameFormat const * pFlyFormat,
1596 bool bMakeSdrGrafObj, bool& rbEraseTextObj,
1597 bool* pbTestTxbxContainsText = nullptr, long* pnStartCp = nullptr,
1598 long* pnEndCp = nullptr, bool* pbContainsGraphics = nullptr,
1599 SvxMSDffImportRec const * pRecord = nullptr);
1600 bool TxbxChainContainsRealText( sal_uInt16 nTxBxS,
1601 long& rStartCp,
1602 long& rEndCp );
1603 SdrObject *ReadTextBox(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1604 SdrObject *ReadCaptionBox(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1605 SdrObject *ReadGroup(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1606 SdrObject *ReadGrafPrimitive(short& rLeft, SfxAllItemSet &rSet);
1607 void ReadGrafLayer1( WW8PLCFspecial* pPF, long nGrafAnchorCp );
1608 SdrObject* CreateContactObject(SwFrameFormat* pFlyFormat);
1609 RndStdIds ProcessEscherAlign(SvxMSDffImportRec* pRecord, WW8_FSPA *pFSPA,
1610 SfxItemSet &rFlySet);
1611 bool MiserableRTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
1612 sal_Int16 eHoriOri, sal_Int16 eHoriRel);
1613 SwFrameFormat* Read_GrafLayer( long nGrafAnchorCp );
1614 SwFlyFrameFormat* ImportReplaceableDrawables( SdrObject* &rpObject,
1615 SdrObject* &rpOurNewObject, SvxMSDffImportRec* pRecord, WW8_FSPA *pF,
1616 SfxItemSet &rFlySet );
1617 SwFlyFrameFormat *ConvertDrawTextToFly( SdrObject* &rpObject,
1618 SdrObject* &rpOurNewObject, SvxMSDffImportRec const * pRecord,
1619 RndStdIds eAnchor, WW8_FSPA const *pF, SfxItemSet &rFlySet );
1620 SwFrameFormat* MungeTextIntoDrawBox(SvxMSDffImportRec *pRecord,
1621 long nGrafAnchorCp, SwFrameFormat *pRetFrameFormat);
1622
1623 void GrafikCtor();
1624 void GrafikDtor();
1625
1626 // other stuff
1627 OUString GetFieldResult( WW8FieldDesc const * pF );
1628 void MakeTagString( OUString& rStr, const OUString& rOrg );
1629 void UpdateFields();
1630 OUString ConvertFFileName(const OUString& rRaw);
1631 WW8_CP Read_F_Tag(WW8FieldDesc* pF);
1632 void InsertTagField( const sal_uInt16 nId, const OUString& rTagText );
1633 long ImportExtSprm(WW8PLCFManResult* pRes);
1634 void EndExtSprm(sal_uInt16 nSprmId);
1635 void ReadDocInfo();
1636
1637 // Ver8 lists
1638
1639 void RegisterNumFormatOnTextNode(sal_uInt16 nCurrentLFO, sal_uInt8 nCurrentLevel,
1640 const bool bSetAttr = true);
1641
1642 void RegisterNumFormatOnStyle(sal_uInt16 nStyle);
1643 void SetStylesList(sal_uInt16 nStyle, sal_uInt16 nCurrentLFO,
1644 sal_uInt8 nCurrentLevel);
1645 void RegisterNumFormat(sal_uInt16 nCurrentLFO, sal_uInt8 nCurrentLevel);
1646
1647 // to be replaced by calls in the appropriate extended SvxMSDffManager
1648
1649 const OUString* GetAnnotationAuthor(sal_uInt16 nIdx);
1650
1651 void GetSmartTagInfo(SwFltRDFMark& rMark);
1652
1653 // interfaces for the toggle attributes
1654 void SetToggleAttr(sal_uInt8 nAttrId, bool bOn);
1655 void SetToggleBiDiAttr(sal_uInt8 nAttrId, bool bOn);
1656 void ChkToggleAttr_( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask );
1657
ChkToggleAttr(sal_uInt16 nOldStyle81Mask,sal_uInt16 nNewStyle81Mask)1658 void ChkToggleAttr( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask )
1659 {
1660 if( nOldStyle81Mask != nNewStyle81Mask &&
1661 m_xCtrlStck->GetToggleAttrFlags() )
1662 ChkToggleAttr_( nOldStyle81Mask, nNewStyle81Mask );
1663 }
1664
1665 void ChkToggleBiDiAttr_( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask );
1666
ChkToggleBiDiAttr(sal_uInt16 nOldStyle81Mask,sal_uInt16 nNewStyle81Mask)1667 void ChkToggleBiDiAttr( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask )
1668 {
1669 if( nOldStyle81Mask != nNewStyle81Mask &&
1670 m_xCtrlStck->GetToggleBiDiAttrFlags() )
1671 ChkToggleBiDiAttr_( nOldStyle81Mask, nNewStyle81Mask );
1672 }
1673
1674 void PopTableDesc();
1675 void MoveInsideFly(const SwFrameFormat *pFlyFormat);
1676 SwTwips MoveOutsideFly(SwFrameFormat *pFlyFormat, const SwPosition &rPos,
1677 bool bTableJoin = true);
1678
1679 void SetOutlineStyles();
1680
1681 bool SetSpacing(SwPaM &rMyPam, int nSpace, bool bIsUpper);
1682 bool SetUpperSpacing(SwPaM &pMyPam, int nSpace);
1683 bool SetLowerSpacing(SwPaM &rMyPam, int nSpace);
1684
IsInlineEscherHack() const1685 bool IsInlineEscherHack() const
1686 { return !m_aFieldStack.empty() && m_aFieldStack.back().mnFieldId == 95; };
1687
1688 void StoreMacroCmds();
1689
1690 // #i84783#
1691 // determine object attribute "Layout in Table Cell"
1692 bool IsObjectLayoutInTableCell( const sal_uInt32 nLayoutInTableCell ) const;
1693 void ReadGlobalTemplateSettings( const OUString& sCreatedFrom, const css::uno::Reference< css::container::XNameContainer >& xPrjNameMap );
1694 SwWW8ImplReader(const SwWW8ImplReader &) = delete;
1695 SwWW8ImplReader& operator=(const SwWW8ImplReader&) = delete;
1696 public: // really private, but can only be done public
1697 ~SwWW8ImplReader();
1698 sal_uInt16 GetToggleAttrFlags() const;
1699 sal_uInt16 GetToggleBiDiAttrFlags() const;
1700 void SetToggleAttrFlags(sal_uInt16 nFlags);
1701 void SetToggleBiDiAttrFlags(sal_uInt16 nFlags);
GetCurrAttrCP() const1702 WW8_CP GetCurrAttrCP() const {return m_aCurrAttrCP;}
1703 bool IsParaEndInCPs(sal_Int32 , sal_Int32,bool bSdOD=true) const;
1704 //Clear the para end position recorded in reader intermittently for the least impact on loading performance
1705 void ClearParaEndPosition();
1706
1707 long Read_Footnote(WW8PLCFManResult* pRes);
1708 sal_uInt16 End_Footnote();
1709 long Read_Field(WW8PLCFManResult* pRes);
1710 sal_uInt16 End_Field();
1711 long Read_Book(WW8PLCFManResult*);
1712 long Read_And(WW8PLCFManResult* pRes);
1713 long Read_AtnBook(WW8PLCFManResult*);
1714 long Read_FactoidBook(WW8PLCFManResult*);
1715
1716 // attributes
1717
1718 void Read_Special(sal_uInt16, const sal_uInt8*, short nLen);
1719 void Read_Obj(sal_uInt16, const sal_uInt8*, short nLen);
1720 void Read_PicLoc(sal_uInt16, const sal_uInt8* pData, short nLen );
1721 void Read_BoldUsw(sal_uInt16 nId, const sal_uInt8*, short nLen);
1722 void Read_Bidi(sal_uInt16 nId, const sal_uInt8*, short nLen);
1723 void Read_BoldBiDiUsw(sal_uInt16 nId, const sal_uInt8*, short nLen);
1724 void Read_AmbiguousSPRM(sal_uInt16 nId, const sal_uInt8*, short nLen);
1725 void Read_SubSuper( sal_uInt16, const sal_uInt8*, short nLen );
1726 bool ConvertSubToGraphicPlacement();
1727 static SwFrameFormat *ContainsSingleInlineGraphic(const SwPaM &rRegion);
1728 void Read_SubSuperProp( sal_uInt16, const sal_uInt8*, short nLen );
1729 void Read_Underline( sal_uInt16, const sal_uInt8*, short nLen );
1730 void Read_TextColor( sal_uInt16, const sal_uInt8*, short nLen );
1731 void openFont(sal_uInt16 nFCode, sal_uInt16 nId);
1732 void closeFont(sal_uInt16 nId);
1733 void Read_FontCode( sal_uInt16, const sal_uInt8*, short nLen );
1734 void Read_FontSize( sal_uInt16, const sal_uInt8*, short nLen );
1735 void Read_CharSet(sal_uInt16 , const sal_uInt8* pData, short nLen);
1736 void Read_Language( sal_uInt16, const sal_uInt8*, short nLen );
1737 void Read_CColl( sal_uInt16, const sal_uInt8*, short nLen );
1738 void Read_Kern( sal_uInt16, const sal_uInt8* pData, short nLen );
1739 void Read_FontKern( sal_uInt16, const sal_uInt8* pData, short nLen );
1740 void Read_Emphasis( sal_uInt16, const sal_uInt8* pData, short nLen );
1741 void Read_ScaleWidth( sal_uInt16, const sal_uInt8* pData, short nLen );
1742 void Read_Relief( sal_uInt16, const sal_uInt8* pData, short nLen);
1743 void Read_TextAnim( sal_uInt16, const sal_uInt8* pData, short nLen);
1744
1745 void Read_NoLineNumb( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1746
1747 void Read_LR( sal_uInt16 nId, const sal_uInt8*, short nLen );
1748 void Read_UL( sal_uInt16 nId, const sal_uInt8*, short nLen );
1749 void Read_ParaAutoBefore(sal_uInt16 , const sal_uInt8 *pData, short nLen);
1750 void Read_ParaAutoAfter(sal_uInt16 , const sal_uInt8 *pData, short nLen);
1751 void Read_ParaContextualSpacing( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1752 void Read_LineSpace( sal_uInt16, const sal_uInt8*, short nLen );
1753
1754 void SetRelativeJustify( bool bRel );
1755 bool IsRelativeJustify();
1756 bool IsRelativeJustify( sal_uInt16 nColl );
1757 void Read_Justify(sal_uInt16, const sal_uInt8*, short nLen);
1758
1759 void Read_IdctHint(sal_uInt16, const sal_uInt8*, short nLen);
1760 bool IsRightToLeft();
1761 void Read_RTLJustify(sal_uInt16, const sal_uInt8*, short nLen);
1762 void Read_Hyphenation( sal_uInt16, const sal_uInt8* pData, short nLen );
1763 void Read_WidowControl( sal_uInt16, const sal_uInt8* pData, short nLen );
1764 void Read_AlignFont( sal_uInt16, const sal_uInt8* pData, short nLen );
1765 void Read_UsePgsuSettings( sal_uInt16, const sal_uInt8* pData, short nLen );
1766 void Read_KeepLines( sal_uInt16, const sal_uInt8* pData, short nLen );
1767 void Read_KeepParas( sal_uInt16, const sal_uInt8* pData, short nLen );
1768 void Read_BreakBefore( sal_uInt16, const sal_uInt8* pData, short nLen );
1769 void Read_ApoPPC(sal_uInt16, const sal_uInt8* pData, short);
1770
1771 void Read_BoolItem( sal_uInt16 nId, const sal_uInt8*, short nLen );
1772
1773 void Read_Border( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1774 void Read_CharBorder(sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1775 void Read_Tab( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1776 void Read_Symbol(sal_uInt16, const sal_uInt8* pData, short nLen);
1777 void Read_FieldVanish( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1778
1779 // Revision Marks ( == Redlining )
1780
1781 // insert or delete content (change char attributes resp.)
1782 void Read_CRevisionMark(RedlineType eType, const sal_uInt8* pData, short nLen);
1783 // insert new content
1784 void Read_CFRMark(sal_uInt16 , const sal_uInt8* pData, short nLen);
1785 // delete old content
1786 void Read_CFRMarkDel(sal_uInt16 , const sal_uInt8* pData, short nLen);
1787 // change properties of content (e.g. char formatting)
1788 void Read_CPropRMark(sal_uInt16 , const sal_uInt8* pData, short nLen); // complex!
1789
1790 void Read_TabRowEnd( sal_uInt16, const sal_uInt8* pData, short nLen );
1791 void Read_TabCellEnd( sal_uInt16, const sal_uInt8* pData, short nLen );
1792 bool ParseTabPos(WW8_TablePos *aTabPos, WW8PLCFx_Cp_FKP* pPap);
1793 void Read_Shade( sal_uInt16, const sal_uInt8* pData, short nLen );
1794 void Read_ANLevelNo( sal_uInt16, const sal_uInt8* pData, short nLen );
1795 void Read_ANLevelDesc( sal_uInt16, const sal_uInt8* pData, short nLen );
1796
1797 // outline level Ver8
1798 void Read_POutLvl(sal_uInt16, const sal_uInt8* pData, short nLen);
1799
1800 void Read_OLST( sal_uInt16, const sal_uInt8* pData, short nLen );
1801
1802 void Read_CharShadow( sal_uInt16, const sal_uInt8* pData, short nLen );
1803 void Read_CharHighlight( sal_uInt16, const sal_uInt8* pData, short nLen );
1804 // Ver8-Listen
1805
1806 void Read_ListLevel( sal_uInt16 nId, const sal_uInt8* pData, short nLen);
1807
1808 /**
1809 * read and interpret the sprmPIlfo used to determine which list
1810 * contains the paragraph.
1811 * @param nId unused (sprm value, 0x460b for sprmPIlfo).
1812 * @param[in] pData operand.
1813 * @param[in] nLen size of the operand (pData) in byte, should be 2.
1814 * -1 to indicate the actual level is finished.
1815 */
1816 void Read_LFOPosition( sal_uInt16 nId, const sal_uInt8* pData, short nLen);
1817 bool SetTextFormatCollAndListLevel(const SwPaM& rRg, SwWW8StyInf& rStyleInfo);
1818
1819 void Read_StyleCode(sal_uInt16, const sal_uInt8* pData, short nLen);
1820 void Read_Majority(sal_uInt16, const sal_uInt8* , short );
1821 void Read_DoubleLine_Rotate( sal_uInt16, const sal_uInt8* pDATA, short nLen);
1822
1823 void Read_TextForeColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1824 void Read_TextBackColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1825 void Read_ParaBackColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1826 void Read_ParaBiDi(sal_uInt16, const sal_uInt8* pData, short nLen);
1827 static Color ExtractColour(const sal_uInt8* &rpData, bool bVer67);
1828
1829 void Read_TextVerticalAdjustment(sal_uInt16, const sal_uInt8* pData, short nLen);
1830 void Read_UnderlineColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1831 long MapBookmarkVariables(const WW8FieldDesc* pF, OUString &rOrigName,
1832 const OUString &rData);
1833 OUString GetMappedBookmark(const OUString &rOrigName);
1834
1835 // fields
1836 eF_ResT Read_F_Input(WW8FieldDesc*, OUString& rStr);
1837 eF_ResT Read_F_InputVar(WW8FieldDesc*, OUString& rStr);
1838 eF_ResT Read_F_ANumber( WW8FieldDesc*, OUString& );
1839 eF_ResT Read_F_DocInfo( WW8FieldDesc* pF, OUString& rStr );
1840 eF_ResT Read_F_Author( WW8FieldDesc*, OUString& );
1841 eF_ResT Read_F_TemplName( WW8FieldDesc*, OUString& );
1842 SvNumFormatType GetTimeDatePara(OUString const & rStr, sal_uInt32& rFormat, LanguageType &rLang,
1843 int nWhichDefault, bool bHijri = false);
1844 bool ForceFieldLanguage(SwField &rField, LanguageType nLang);
1845 eF_ResT Read_F_DateTime( WW8FieldDesc*, OUString& rStr );
1846 eF_ResT Read_F_FileName( WW8FieldDesc*, OUString& rStr);
1847 eF_ResT Read_F_Num( WW8FieldDesc* pF, OUString& );
1848 eF_ResT Read_F_CurPage( WW8FieldDesc*, OUString& );
1849 eF_ResT Read_F_Ref( WW8FieldDesc* pF, OUString& );
1850
1851 eF_ResT Read_F_Set( WW8FieldDesc*, OUString& rStr );
1852 eF_ResT Read_F_PgRef( WW8FieldDesc*, OUString& rStr );
1853 eF_ResT Read_F_NoteReference( WW8FieldDesc* pF, OUString& rStr );
1854
1855 eF_ResT Read_F_Tox( WW8FieldDesc* pF, OUString& rStr );
1856 eF_ResT Read_F_Symbol( WW8FieldDesc*, OUString& rStr );
1857 eF_ResT Read_F_Embedd( WW8FieldDesc*, OUString& rStr );
1858 eF_ResT Read_F_FormTextBox( WW8FieldDesc* pF, OUString& rStr);
1859 eF_ResT Read_F_FormCheckBox( WW8FieldDesc* pF, OUString& rStr );
1860 eF_ResT Read_F_FormListBox( WW8FieldDesc* pF, OUString& rStr);
1861 css::awt::Size MiserableDropDownFormHack(const OUString &rString,
1862 css::uno::Reference<css::beans::XPropertySet> const & rPropSet);
1863
1864 eF_ResT Read_F_Macro( WW8FieldDesc*, OUString& rStr);
1865 eF_ResT Read_F_DBField( WW8FieldDesc*, OUString& rStr );
1866 eF_ResT Read_F_DBNext( WW8FieldDesc*, OUString& );
1867 eF_ResT Read_F_DBNum( WW8FieldDesc*, OUString& );
1868 eF_ResT Read_F_Equation( WW8FieldDesc*, OUString& );
1869 void Read_SubF_Ruby( msfilter::util::WW8ReadFieldParams& rReadParam);
1870 eF_ResT Read_F_IncludePicture( WW8FieldDesc*, OUString& rStr );
1871 eF_ResT Read_F_IncludeText( WW8FieldDesc*, OUString& rStr );
1872 eF_ResT Read_F_Seq( WW8FieldDesc*, OUString& rStr );
1873 /// Reads a STYLEREF field.
1874 eF_ResT Read_F_Styleref(WW8FieldDesc*, OUString& rStr);
1875
1876 eF_ResT Read_F_OCX(WW8FieldDesc*, OUString&);
1877 eF_ResT Read_F_Hyperlink(WW8FieldDesc*, OUString& rStr);
1878 eF_ResT Read_F_Shape(WW8FieldDesc* pF, OUString& rStr);
1879 eF_ResT Read_F_HTMLControl( WW8FieldDesc* pF, OUString& rStr);
1880
1881 short ImportSprm(const sal_uInt8* pPos, sal_Int32 nMemLen, sal_uInt16 nId = 0);
1882
1883 bool SearchRowEnd(WW8PLCFx_Cp_FKP* pPap,WW8_CP &rStartCp, int nLevel) const;
1884 /// Seek to the end of the table with pPap, returns true on success.
1885 bool SearchTableEnd(WW8PLCFx_Cp_FKP* pPap) const;
1886 bool FloatingTableConversion(WW8PLCFx_Cp_FKP* pPap);
1887
GetFib() const1888 const WW8Fib& GetFib() const { return *m_xWwFib; }
GetDoc() const1889 SwDoc& GetDoc() const { return m_rDoc; }
GetCurrentColl() const1890 sal_uInt16 GetCurrentColl() const { return m_nCurrentColl; }
SetNCurrentColl(sal_uInt16 nColl)1891 void SetNCurrentColl( sal_uInt16 nColl ) { m_nCurrentColl = nColl; }
1892 std::unique_ptr<SfxItemSet> SetCurrentItemSet(std::unique_ptr<SfxItemSet> pItemSet);
1893 sal_uInt16 StyleUsingLFO( sal_uInt16 nLFOIndex ) const ;
1894 const SwFormat* GetStyleWithOrgWWName( OUString const & rName ) const ;
1895
1896 static bool GetPictGrafFromStream(Graphic& rGraphic, SvStream& rSrc);
1897 static void PicRead( SvStream *pDataStream, WW8_PIC *pPic, bool bVer67);
1898 static bool ImportOleWMF(const tools::SvRef<SotStorage>& xSrc1, GDIMetaFile& rWMF, long& rX,
1899 long& rY);
1900 static Color GetCol(sal_uInt8 nIco);
1901
1902 SwWW8ImplReader( sal_uInt8 nVersionPara, SotStorage* pStorage, SvStream* pSt,
1903 SwDoc& rD, const OUString& rBaseURL, bool bNewDoc, bool bSkipImages, SwPosition const &rPos );
1904
GetBaseURL() const1905 const OUString& GetBaseURL() const { return m_sBaseURL; }
1906 // load a complete doc file
1907 ErrCode LoadDoc(WW8Glossary *pGloss=nullptr);
1908 rtl_TextEncoding GetCurrentCharSet();
1909 rtl_TextEncoding GetCurrentCJKCharSet();
1910 rtl_TextEncoding GetCharSetFromLanguage();
1911 rtl_TextEncoding GetCJKCharSetFromLanguage();
1912
1913 void PostProcessAttrs();
1914 void ReadEmbeddedData(SvStream& rStrm, SwDocShell const * pDocShell, struct HyperLinksTable& hlStr);
1915 void NotifyMacroEventRead();
1916 };
1917
1918 bool CanUseRemoteLink(const OUString &rGrfName);
1919 void UseListIndent(SwWW8StyInf &rStyle, const SwNumFormat &rFormat);
1920 void SetStyleIndent(SwWW8StyInf &rStyleInfo, const SwNumFormat &rFormat);
1921 // #i103711#
1922 // #i105414#
1923 void SyncIndentWithList( SvxLRSpaceItem &rLR,
1924 const SwNumFormat &rFormat,
1925 const bool bFirstLineOfStSet,
1926 const bool bLeftIndentSet );
1927 long GetListFirstLineIndent(const SwNumFormat &rFormat);
1928 OUString BookmarkToWriter(const OUString &rBookmark);
1929 bool RTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
1930 sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
1931 SwTwips nPageRight, SwTwips nPageSize);
1932 void MatchEscherMirrorIntoFlySet(const SvxMSDffImportRec &rRecord,
1933 SfxItemSet &rFlySet);
1934 #endif
1935
1936 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1937