1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
21 #define INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
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>
29 #include <svx/svdobj.hxx>
33 #include <string_view>
39 #include "ww8struc.hxx"
40 #include "ww8scan.hxx"
41 #include "ww8glsy.hxx"
42 #include "ww8graf.hxx"
44 #include <msfilter.hxx>
45 #include <xmloff/odffields.hxx>
48 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
49 #include <swtypes.hxx>
50 #include <fmtfsize.hxx>
51 #include <fmtornt.hxx>
52 #include <fmtsrnd.hxx>
54 #include <editeng/lrspitem.hxx>
55 #include <o3tl/deleter.hxx>
56 #include <o3tl/sorted_vector.hxx>
57 #include <oox/ole/olehelper.hxx>
59 #define SW_UD_IMAPDATA 2
64 class SwTextFormatColl
;
69 class SwFlyFrameFormat
;
77 struct WW8PLCFManResult
;
110 class OutlinerParaObject
;
112 namespace com::sun::star
{
113 namespace beans
{ class XPropertySet
;}
114 namespace form
{ class XFormComponent
;}
115 namespace drawing
{class XShape
;}
116 namespace lang
{class XMultiServiceFactory
;}
119 // defines only for the WW8-variable of the INI file
120 #define WW8FL_NO_STYLES 2
121 #define WW8FL_NO_GRAF 0x80
123 #define WW8FL_NO_OUTLINE 0x1000
124 #define WW8FL_NO_IMPLPASP 0x4000 // no implicit para space
125 #define WW8FL_NO_GRAFLAYER 0x8000
127 // Add-on-filter-flags, valid from Winword 8 on
128 #define WW8FL_NO_FLY_FOR_TXBX 1
130 // List-Manager (from Ver8 on)
134 class WW8Reader
: public StgReader
136 std::shared_ptr
<SvStream
> mDecodedStream
;
137 virtual ErrCode
Read(SwDoc
&, const OUString
& rBaseURL
, SwPaM
&, const OUString
&) override
;
138 ErrCode
OpenMainStream( tools::SvRef
<SotStorageStream
>& rRef
, sal_uInt16
& rBuffSize
);
139 ErrCode
DecryptDRMPackage();
142 virtual SwReaderType
GetReaderType() override
;
144 virtual bool HasGlossaries() const override
;
145 virtual bool ReadGlossaries( SwTextBlocks
&, bool bSaveRelFiles
) const override
;
148 class SwWW8ImplReader
;
153 WW8ListManager(SvStream
& rSt_
, SwWW8ImplReader
& rReader_
);
154 //Min and Max possible List Levels in Word
155 enum ListLevel
{nMinLevel
=1, nMaxLevel
=9};
156 //the rParaSprms returns back the original word paragraph indent
157 //sprms which were attached to the original numbering format
158 SwNumRule
* GetNumRuleForActivation(sal_uInt16 nLFOPosition
, const sal_uInt8 nLevel
,
159 std::vector
<sal_uInt8
> &rParaSprms
, SwTextNode
*pNode
=nullptr);
160 SwNumRule
* CreateNextRule(bool bSimple
);
161 ~WW8ListManager() COVERITY_NOEXCEPT_FALSE
;
162 SwNumRule
* GetNumRule(size_t i
);
163 size_t GetWW8LSTInfoNum() const{return maLSTInfos
.size();}
164 static SvxNumType
GetSvxNumTypeFromMSONFC(sal_uInt16 nMSONFC
);
167 wwSprmParser maSprmParser
;
168 SwWW8ImplReader
& rReader
;
172 std::vector
<std::unique_ptr
<WW8LSTInfo
>> maLSTInfos
;
173 std::vector
<std::unique_ptr
<WW8LFOInfo
>> m_LFOInfos
;// D. from PLF LFO, sorted exactly like in the WW8 Stream
174 sal_uInt16 nUniqueList
; // current number for creating unique list names
175 SprmResult
GrpprlHasSprm(sal_uInt16 nId
, sal_uInt8
& rSprms
, sal_uInt8 nLen
);
176 WW8LSTInfo
* GetLSTByListId( sal_uInt32 nIdLst
) const;
177 //the rParaSprms returns back the original word paragraph indent
178 //sprms which are attached to this numbering level
179 bool ReadLVL(SwNumFormat
& rNumFormat
, std::unique_ptr
<SfxItemSet
>& rpItemSet
, sal_uInt16 nLevelStyle
,
180 bool bSetStartNo
, sal_uInt16 nLevel
, ww::bytes
&rParaSprms
);
182 // character attributes from GrpprlChpx
183 typedef std::unique_ptr
<SfxItemSet
> WW8aISet
[nMaxLevel
];
184 // character style pointer
185 typedef SwCharFormat
* WW8aCFormat
[nMaxLevel
];
187 void AdjustLVL(sal_uInt8 nLevel
, SwNumRule
& rNumRule
, WW8aISet
const & rListItemSet
,
188 WW8aCFormat
& aCharFormat
, bool& bNewCharFormatCreated
,
189 const OUString
& aPrefix
= OUString());
191 WW8ListManager(const WW8ListManager
&) = delete;
192 WW8ListManager
& operator=(const WW8ListManager
&) = delete;
193 sal_uInt16 nLastLFOPosition
;
197 { // WinWord-attributes
198 // Attention: *DO NOT* reorder, since parts will be
199 // compared using memcmp
201 sal_Int16 nSp26
, nSp27
; // raw position
202 sal_Int16 nSp45
, nSp28
; // width / height
203 sal_Int16 nLeMgn
, nRiMgn
, nUpMgn
, nLoMgn
; // borders
204 sal_uInt8 nSp29
; // raw binding + alignment
205 sal_uInt8 nSp37
; // Wrap-Mode ( 1 / 2; 0 = no Apo ? )
206 WW8_BRCVer9_5 brc
; // borders Top, Left, Bottom, Right, Between
207 bool bBorderLines
; // border lines
208 bool bGrafApo
; // true: this frame is only used to position
209 // the contained graphics *not* as a character
210 bool mbVertSet
; // true if vertical positioning has been set
212 WW8FlyPara(bool bIsVer67
, const WW8FlyPara
* pSrc
= nullptr);
213 bool operator==(const WW8FlyPara
& rSrc
) const;
214 void Read(sal_uInt8 nSprm29
, WW8PLCFx_Cp_FKP
* pPap
);
215 void ReadFull(sal_uInt8 nSprm29
, SwWW8ImplReader
* pIo
);
216 void Read(sal_uInt8 nSprm29
, WW8RStyle
const * pStyle
);
217 void ApplyTabPos(const WW8_TablePos
*pTabPos
);
218 bool IsEmpty() const;
223 OUString m_sWWStyleName
;
224 sal_uInt16 m_nWWStyleId
;
226 rtl_TextEncoding m_eLTRFontSrcCharSet
; // rtl_TextEncoding for the font
227 rtl_TextEncoding m_eRTLFontSrcCharSet
; // rtl_TextEncoding for the font
228 rtl_TextEncoding m_eCJKFontSrcCharSet
; // rtl_TextEncoding for the font
230 std::shared_ptr
<WW8FlyPara
> m_xWWFly
;
231 SwNumRule
* m_pOutlineNumrule
;
232 tools::Long m_nFilePos
;
234 sal_uInt16 m_nFollow
;
235 sal_uInt16 m_nLFOIndex
;
236 sal_uInt8 m_nListLevel
;
238 // WW8 outline level is zero-based:
239 // 0: outline level 1
240 // 1: outline level 2
242 // 8: outline level 9
244 sal_uInt8 mnWW8OutlineLevel
;
246 sal_uInt16 m_n81Flags
; // for bold, italic, ...
247 sal_uInt16 m_n81BiDiFlags
; // for bold, italic, ...
248 std::shared_ptr
<SvxLRSpaceItem
> maWordLR
;
249 bool m_bValid
; // empty of valid
250 bool m_bImported
; // for recursive imports
251 bool m_bColl
; // true-> pFormat is SwTextFormatColl
252 bool m_bImportSkipped
; // only true if !bNewDoc && existing style
253 bool m_bHasStyNumRule
; // true-> named NumRule in style
254 bool m_bHasBrokenWW6List
; // true-> WW8+ style has a WW7- list
255 bool m_bListRelevantIndentSet
; //true if this style's indent has
256 //been explicitly set, it's set to the value
257 //of pFormat->GetItemState(RES_LR_SPACE, false)
258 //if it was possible to get the ItemState
259 //for L of the LR space independently
260 bool m_bParaAutoBefore
; // For Auto spacing before a paragraph
261 bool m_bParaAutoAfter
; // For Auto Spacing after a paragraph
262 sal_Int16 m_nRelativeJustify
;
265 m_sWWStyleName( OUString() ),
267 m_eLTRFontSrcCharSet(0),
268 m_eRTLFontSrcCharSet(0),
269 m_eCJKFontSrcCharSet(0),
270 m_pFormat( nullptr ),
271 m_pOutlineNumrule( nullptr ),
275 m_nLFOIndex( USHRT_MAX
),
276 m_nListLevel(MAXLEVEL
),
277 mnWW8OutlineLevel( MAXLEVEL
),
280 maWordLR(std::make_shared
<SvxLRSpaceItem
>(RES_LR_SPACE
)),
284 m_bImportSkipped(false),
285 m_bHasStyNumRule(false),
286 m_bHasBrokenWW6List(false),
287 m_bListRelevantIndentSet(false),
288 m_bParaAutoBefore(false),
289 m_bParaAutoAfter(false),
290 m_nRelativeJustify(-1)
294 void SetOrgWWIdent( const OUString
& rName
, const sal_uInt16 nId
)
296 m_sWWStyleName
= rName
;
299 // apply default WW8 outline level to WW8 Built-in Heading styles
300 if (IsWW8BuiltInHeadingStyle())
302 mnWW8OutlineLevel
= m_nWWStyleId
- 1;
306 const OUString
& GetOrgWWName() const
308 return m_sWWStyleName
;
311 bool HasWW8OutlineLevel() const
313 return (m_pFormat
!= nullptr && (MAXLEVEL
> mnWW8OutlineLevel
));
316 bool IsOutlineNumbered() const
318 return m_pOutlineNumrule
&& HasWW8OutlineLevel();
321 const SwNumRule
* GetOutlineNumrule() const
323 return m_pOutlineNumrule
;
325 rtl_TextEncoding
GetCharSet() const;
326 rtl_TextEncoding
GetCJKCharSet() const;
328 sal_uInt16
GetWWStyleId() const
333 bool IsWW8BuiltInHeadingStyle() const
335 return GetWWStyleId() >= 1 && GetWWStyleId() <= 9;
338 bool IsWW8BuiltInDefaultStyle() const
340 return GetWWStyleId() == 0;
344 WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel
)
346 if (nWW8OutlineLevel
< MAXLEVEL
)
348 if (nWW8OutlineLevel
== 9)
350 return 0; // no outline level --> body text
354 return nWW8OutlineLevel
+ 1; // outline level 1..9
364 class SwWW8FltControlStack
: public SwFltControlStack
367 SwWW8ImplReader
& rReader
;
368 std::unique_ptr
<SfxItemSet
> m_xScratchSet
;
369 sal_uInt16 nToggleAttrFlags
;
370 sal_uInt16 nToggleBiDiAttrFlags
;
371 SwWW8FltControlStack(const SwWW8FltControlStack
&) = delete;
372 SwWW8FltControlStack
& operator=(const SwWW8FltControlStack
&) = delete;
373 const SwNumFormat
* GetNumFormatFromStack(const SwPosition
&rPos
,
374 const SwTextNode
&rTextNode
);
376 virtual void SetAttrInDoc(const SwPosition
& rTmpPos
,
377 SwFltStackEntry
& rEntry
) override
;
380 SwWW8FltControlStack(SwDoc
& rDo
, sal_uLong nFieldFl
, SwWW8ImplReader
& rReader_
)
381 : SwFltControlStack( rDo
, nFieldFl
), rReader( rReader_
),
382 nToggleAttrFlags(0), nToggleBiDiAttrFlags(0)
385 void NewAttr(const SwPosition
& rPos
, const SfxPoolItem
& rAttr
);
387 virtual SwFltStackEntry
* SetAttr(const SwPosition
& rPos
, sal_uInt16 nAttrId
, bool bTstEnd
=true, tools::Long nHand
=LONG_MAX
, bool consumedByField
=false) override
;
389 void SetToggleAttr(sal_uInt8 nId
, bool bOn
)
392 nToggleAttrFlags
|= (1 << nId
);
394 nToggleAttrFlags
&= ~(1 << nId
);
397 sal_uInt16
GetToggleAttrFlags() const { return nToggleAttrFlags
; }
399 void SetToggleBiDiAttr(sal_uInt8 nId
, bool bOn
)
402 nToggleBiDiAttrFlags
|= (1 << nId
);
404 nToggleBiDiAttrFlags
&= ~(1 << nId
);
407 sal_uInt16
GetToggleBiDiAttrFlags() const { return nToggleBiDiAttrFlags
; }
408 void SetToggleAttrFlags(sal_uInt16 nFlags
) { nToggleAttrFlags
= nFlags
; }
409 void SetToggleBiDiAttrFlags(sal_uInt16 nFlags
) {nToggleBiDiAttrFlags
= nFlags
;}
411 const SfxPoolItem
* GetFormatAttr(const SwPosition
& rPos
, sal_uInt16 nWhich
);
412 template<class T
> const T
* GetFormatAttr( const SwPosition
& rPos
, TypedWhichId
<T
> nWhich
)
414 return static_cast<const T
*>(GetFormatAttr(rPos
, sal_uInt16(nWhich
)));
416 const SfxPoolItem
* GetStackAttr(const SwPosition
& rPos
, sal_uInt16 nWhich
);
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
425 SwWW8FltAnchorStack(SwDoc
& rDo
, sal_uLong nFieldFl
)
426 : SwFltControlStack( rDo
, nFieldFl
) {}
427 void AddAnchor(const SwPosition
& rPos
,SwFrameFormat
*pFormat
);
430 SwWW8FltAnchorStack(const SwWW8FltAnchorStack
&) = delete;
431 SwWW8FltAnchorStack
& operator=(const SwWW8FltAnchorStack
&) = delete;
439 bool operator()(const OUString
&r1
, std::u16string_view r2
) const
441 return r1
.compareToIgnoreAsciiCase(r2
)<0;
447 bool operator()(const SwTextNode
*r1
, const SwTextNode
*r2
) const
449 return r1
->GetIndex() < r2
->GetIndex();
454 class SwWW8ReferencedFltEndStack
: public SwFltEndStack
457 SwWW8ReferencedFltEndStack( SwDoc
& rDo
, sal_uLong nFieldFl
)
458 : SwFltEndStack( rDo
, nFieldFl
)
459 , aReferencedTOCBookmarks()
462 // Keep track of referenced TOC bookmarks in order to suppress the import
463 // of unreferenced ones.
464 std::set
<OUString
, SwWW8::ltstr
> aReferencedTOCBookmarks
;
466 virtual void SetAttrInDoc( const SwPosition
& rTmpPos
,
467 SwFltStackEntry
& rEntry
) override
;
470 class SwWW8FltRefStack final
: public SwFltEndStack
473 SwWW8FltRefStack(SwDoc
& rDo
, sal_uLong nFieldFl
)
474 : SwFltEndStack( rDo
, nFieldFl
)
477 bool IsFootnoteEdnBkmField(const SwFormatField
& rFormatField
, sal_uInt16
& rBkmNo
);
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
;
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;
491 template< typename Type
>
492 inline bool get_flag( Type nBitField
, Type nMask
)
493 { return (nBitField
& nMask
) != 0; }
495 template< typename ReturnType
, typename Type
>
496 inline ReturnType
ulimit_cast( Type nValue
, ReturnType nMax
)
497 { return static_cast< ReturnType
>( std::min
< Type
>( nValue
, nMax
) ); }
499 template< typename ReturnType
, typename Type
>
500 inline ReturnType
ulimit_cast( Type nValue
)
501 { return ulimit_cast( nValue
, std::numeric_limits
< ReturnType
>::max() ); }
503 class SwMacroInfo
: public SdrObjUserData
507 virtual ~SwMacroInfo() override
;
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
514 virtual std::unique_ptr
<SdrObjUserData
> Clone( SdrObject
* pObj
) const override
;
516 void SetHlink( const OUString
& rHlink
) { maHlink
= rHlink
; }
517 const OUString
& GetHlink() const { return maHlink
; }
518 void SetTarFrame( const OUString
& rTarFrame
) { maTarFrame
= rTarFrame
; }
519 const OUString
& GetTarFrame() const { return maTarFrame
; }
520 void SetShapeId( sal_Int32 rShapeId
) { mnShapeId
= rShapeId
; }
521 const sal_Int32
& GetShapeId() const { return mnShapeId
; }
522 void SetName( const OUString
& rName
) { maNameStr
= rName
; }
523 const OUString
& GetName() const { return maNameStr
; }
532 struct HyperLinksTable
545 SwNodeIndex maPtNode
;
546 sal_Int32 mnPtContent
;
548 explicit Position(const SwPosition
&rPos
);
549 operator SwPosition() const;
550 const SwNodeIndex
& GetPtNode() const { return maPtNode
; };
551 sal_Int32
GetPtContent() const { return mnPtContent
; };
555 auto FilterControlChars(OUString
const& rString
) -> OUString
;
561 OUString msBookmarkName
;
564 ::sw::mark::IFieldmark::parameter_map_t maParams
;
567 sw::hack::Position maStartPos
;
568 sal_uInt16 mnFieldId
;
569 sal_uLong mnObjLocFc
;
570 WW8FieldEntry(SwPosition
const &rPos
, sal_uInt16 nFieldId
) noexcept
;
571 WW8FieldEntry(const WW8FieldEntry
&rOther
) noexcept
;
572 WW8FieldEntry
&operator=(const WW8FieldEntry
&rOther
) noexcept
;
573 void Swap(WW8FieldEntry
&rOther
) noexcept
;
575 SwNodeIndex
GetPtNode() const { return maStartPos
.GetPtNode(); };
576 sal_Int32
GetPtContent() const { return maStartPos
.GetPtContent(); };
578 const OUString
& GetBookmarkName() const { return msBookmarkName
;}
579 const OUString
& GetBookmarkCode() const { return msMarkCode
;}
580 void SetBookmarkName(const OUString
& bookmarkName
);
581 void SetBookmarkType(const OUString
& bookmarkType
);
582 void SetBookmarkCode(const OUString
& bookmarkCode
);
583 ::sw::mark::IFieldmark::parameter_map_t
& getParameters() { return maParams
;}
586 // mini marker for some flags
591 WW8PLCFxSaveAll maPLCFxSave
;
592 std::shared_ptr
<SwUnoCursor
> mxTmpPos
;
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
* mpPreviousNumPaM
;
602 const SwNumRule
* mpPrevNumRule
;
603 std::unique_ptr
<WW8TabDesc
> mxTableDesc
;
605 sal_uInt16 mnCurrentColl
;
606 sal_Unicode mcSymbol
;
609 bool mbHdFtFootnoteEdn
;
610 bool mbTxbxFlySection
;
618 WW8ReaderSave(SwWW8ImplReader
* pRdr
, WW8_CP nStart
=-1);
619 void Restore(SwWW8ImplReader
* pRdr
);
620 const SwPosition
&GetStartPos() const { return *mxTmpPos
->GetPoint(); }
623 enum class eF_ResT
{ OK
, TEXT
, TAGIGN
, READ_FSPA
};
629 SwWW8Shade(bool bVer67
, const WW8_SHD
& rSHD
);
630 SwWW8Shade(Color nFore
, Color nBack
, sal_uInt16 nIndex
)
632 SetShade(nFore
, nBack
, nIndex
);
635 void SetShade(Color nFore
, Color nBack
, sal_uInt16 nIndex
);
640 enum SwWw8ControlType
647 class WW8FormulaControl
650 SwWW8ImplReader
&mrRdr
;
652 WW8FormulaControl(WW8FormulaControl
const&) = delete;
653 WW8FormulaControl
& operator=(WW8FormulaControl
const&) = delete;
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
)
663 sal_uInt8 mfUnknown
:2;
664 sal_uInt8 mfDropdownIndex
:6;
665 sal_uInt8 mfToolTip
:1;
666 sal_uInt8 mfNoMark
:1;
668 sal_uInt8 mfUnused
:3;
670 sal_uInt16 mhpsCheckBox
;
671 sal_uInt16 mnChecked
;
673 /// FFData.cch in the spec: maximum length, in characters, of the value of the textbox.
677 OUString msFormatting
;
683 std::vector
<OUString
> maListEntries
;
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;
692 class WW8FormulaCheckBox
: public WW8FormulaControl
695 WW8FormulaCheckBox(const WW8FormulaCheckBox
&) = delete;
696 WW8FormulaCheckBox
& operator=(const WW8FormulaCheckBox
&) = delete;
699 explicit WW8FormulaCheckBox(SwWW8ImplReader
&rR
);
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
;
706 class WW8FormulaListBox
: public WW8FormulaControl
709 WW8FormulaListBox(const WW8FormulaListBox
&) = delete;
710 WW8FormulaListBox
& operator=(const WW8FormulaListBox
&) = delete;
713 explicit WW8FormulaListBox(SwWW8ImplReader
&rR
);
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
;
720 class WW8FormulaEditBox
: public WW8FormulaControl
723 WW8FormulaEditBox(const WW8FormulaEditBox
&) = delete;
724 WW8FormulaEditBox
& operator=(const WW8FormulaEditBox
&) = delete;
726 explicit WW8FormulaEditBox(SwWW8ImplReader
&rR
);
727 //no real implementation, return false
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; }
733 class SwMSConvertControls
: public oox::ole::MSConvertOCXControls
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 );
747 sal_uInt32 mnObjectId
;
750 class SwMSDffManager
: public SvxMSDffManager
753 SwWW8ImplReader
& rReader
;
754 SvStream
*pFallbackStream
;
755 std::unordered_map
<sal_uInt32
, Graphic
> aOldEscherBlipCache
;
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
,
764 const tools::Rectangle
& rBoundRect
,
765 const tools::Rectangle
& rVisArea
,
766 const int _nCalledByGroup
) const override
;
768 SwMSDffManager(const SwMSDffManager
&) = delete;
769 SwMSDffManager
& operator=(const SwMSDffManager
&) = delete;
771 static sal_uInt32
GetFilterFlags();
772 static sal_Int32
GetEscherLineMatch(MSO_LineStyle eStyle
, MSO_SPT eShapeType
,
774 SwMSDffManager( SwWW8ImplReader
& rRdr
, bool bSkipImages
);
775 void DisableFallbackStream();
776 void EnableFallbackStream();
778 virtual SdrObject
* ProcessObj( SvStream
& rSt
, DffObjData
& rObjData
, SvxMSDffClientData
& rData
, tools::Rectangle
& rTextRect
, SdrObject
* pObj
) override
;
784 explicit wwSection(const SwPosition
&rPos
);
788 SwSection
*mpSection
;
790 SvxFrameDirection meDir
;
795 sal_uInt32 nPgGutter
;
796 bool m_bRtlGutter
= false;
798 css::drawing::TextVerticalAdjust mnVerticalAdjustment
;
802 bool IsContinuous() const { return maSep
.bkc
== 0; }
803 bool IsNotProtected() const { return maSep
.fUnlocked
!= 0; }
804 bool IsVertical() const;
805 sal_Int16
NoCols() const { return maSep
.ccolM1
+ 1; }
806 sal_Int32
StandardColSeparation() const { return maSep
.dxaColumns
; }
807 bool HasTitlePage() const { return maSep
.fTitlePage
!= 0; }
808 sal_uInt16
PageStartAt() const { return maSep
.pgnStart
; }
809 bool PageRestartNo() const { return maSep
.fPgnRestart
!= 0; }
810 bool IsBiDi() const { return maSep
.fBiDi
!= 0; }
811 sal_uInt32
GetPageWidth() const { return nPgWidth
; }
812 sal_uInt32
GetTextAreaWidth() const
813 { return GetPageWidth() - GetPageLeft() - nPgGutter
- GetPageRight(); }
814 sal_uInt32
GetPageHeight() const { return maSep
.yaPage
; }
815 sal_uInt32
GetPageLeft() const { return nPgLeft
; }
816 sal_uInt32
GetPageRight() const { return nPgRight
; }
817 bool IsLandScape() const { return maSep
.dmOrientPage
!= 0; }
818 bool IsFixedHeightHeader() const { return maSep
.dyaTop
< 0; }
819 bool IsFixedHeightFooter() const { return maSep
.dyaBottom
< 0; }
822 class wwSectionManager
826 A queue of the ms sections in the document
828 SwWW8ImplReader
& mrReader
;
829 std::deque
<wwSection
> maSegments
;
830 typedef std::deque
<wwSection
>::iterator mySegIter
;
832 //Num of page desc's entered into the document
837 bool bHasHeader
, bHasFooter
;
838 sal_uInt32 nSwHLo
, nSwFUp
, nSwUp
, nSwLo
;
849 void SetSegmentToPageDesc(const wwSection
&rSection
, bool bIgnoreCols
);
851 void GetPageULData(const wwSection
&rNewSection
,
852 wwULSpaceData
& rData
) const;
853 static void SetPageULSpaceItems(SwFrameFormat
&rFormat
, wwULSpaceData
const & rData
,
854 const wwSection
&rSection
);
856 static void SetPage(SwPageDesc
&rPageDesc
, SwFrameFormat
&rFormat
,
857 const wwSection
&rSection
, bool bIgnoreCols
);
859 static void SetNumberingType(const wwSection
&rNewSection
, SwPageDesc
&rPageDesc
);
861 void SetUseOn(wwSection
&rSection
);
862 void SetHdFt(wwSection
const &rSection
, int nSect
, const wwSection
*pPrevious
);
864 SwSectionFormat
*InsertSection(SwPaM
const & rMyPaM
, wwSection
&rSection
);
865 static bool SetCols(SwFrameFormat
&rFormat
, const wwSection
&rSection
,
866 sal_uInt32 nNetWidth
);
867 bool SectionIsProtected(const wwSection
&rSection
) const;
868 static void SetLeftRight(wwSection
&rSection
);
870 The segment we're inserting, the start of the segments container, and the
871 nodeindex of where we want the page break to (normally the segments start
874 SwFormatPageDesc
SetSwFormatPageDesc(mySegIter
const &rIter
, mySegIter
const &rStart
,
877 wwSectionManager(const wwSectionManager
&) = delete;
878 wwSectionManager
& operator=(const wwSectionManager
&) = delete;
880 explicit wwSectionManager(SwWW8ImplReader
&rReader
) : mrReader(rReader
), mnDesc(0)
882 void SetCurrentSectionHasFootnote();
883 void SetCurrentSectionVerticalAdjustment(const css::drawing::TextVerticalAdjust nVA
);
884 bool CurrentSectionIsVertical() const;
885 bool CurrentSectionIsProtected() const;
886 void PrependedInlineNode(const SwPosition
&rPos
, const SwNode
&rNode
);
887 sal_uInt16
CurrentSectionColCount() const;
888 bool WillHavePageDescHere(const SwNodeIndex
& rIdx
) const;
889 void CreateSep(const tools::Long nTextPos
);
890 void InsertSegments();
891 void JoinNode(const SwPosition
&rPos
, const SwNode
&rNode
);
892 sal_uInt32
GetPageLeft() const;
893 sal_uInt32
GetPageRight() const;
894 sal_uInt32
GetPageWidth() const;
895 sal_uInt32
GetWWPageTopMargin() const;
896 sal_uInt32
GetTextAreaWidth() const;
899 //Various writer elements like frames start off containing a blank paragraph,
900 //sometimes this paragraph turns out to be extraneous, e.g. the frame should
901 //only contain a table with no trailing paragraph.
903 //We want to remove these extra paragraphs, but removing them during the parse
904 //is problematic, because we don't want to remove any paragraphs that are still
905 //addressed by property entries in a SwFltControlStack which have not yet been
906 //committed to the document.
908 //Safest thing is to not delete SwTextNodes from a document during import, and
909 //remove these extraneous paragraphs at the end after all SwFltControlStack are
911 class wwExtraneousParas
915 A vector of SwTextNodes to erase from a document after import is complete
917 std::set
<SwTextNode
*, SwWW8::ltnode
> m_aTextNodes
;
920 wwExtraneousParas(wwExtraneousParas
const&) = delete;
921 wwExtraneousParas
& operator=(wwExtraneousParas
const&) = delete;
924 explicit wwExtraneousParas(SwDoc
&rDoc
) : m_rDoc(rDoc
) {}
925 ~wwExtraneousParas() { delete_all_from_doc(); }
926 void insert(SwTextNode
*pTextNode
) { m_aTextNodes
.insert(pTextNode
); }
927 void check_anchor_destination(SwTextNode
*pTextNode
)
929 auto it
= m_aTextNodes
.find(pTextNode
);
930 if (it
== m_aTextNodes
.end())
932 SAL_WARN("sw.ww8", "It is unexpected to anchor something in a para scheduled for removal");
933 m_aTextNodes
.erase(it
);
935 void delete_all_from_doc();
942 sal_Int32 mnImportedGraphicsCount
;
945 wwFrameNamer(wwFrameNamer
const&) = delete;
946 wwFrameNamer
& operator=(wwFrameNamer
const&) = delete;
949 void SetUniqueGraphName(SwFrameFormat
*pFrameFormat
, std::u16string_view rFixedPart
);
950 wwFrameNamer(bool bIsDisabled
, const OUString
&rSeed
)
951 : msSeed(rSeed
), mnImportedGraphicsCount(0), mbIsDisabled(bIsDisabled
)
960 OUString msFileLinkSeed
;
962 wwSectionNamer(const wwSectionNamer
&) = delete;
963 wwSectionNamer
& operator=(const wwSectionNamer
&) = delete;
965 OUString
UniqueName();
966 wwSectionNamer(const SwDoc
&rDoc
, const OUString
&rSeed
)
967 : mrDoc(rDoc
), msFileLinkSeed(rSeed
), mnFileSectionNo(0)
971 class FootnoteDescriptor
980 struct ApoTestResults
987 WW8FlyPara
* mpStyleApo
;
989 : mbStartApo(false), mbStopApo(false), m_bHasSprm37(false)
990 , m_bHasSprm29(false), m_nSprm29(0), mpStyleApo(nullptr) {}
991 bool HasStartStop() const { return (mbStartApo
|| mbStopApo
); }
992 bool HasFrame() const { return (m_bHasSprm29
|| m_bHasSprm37
|| mpStyleApo
); }
997 OUString msOutlineNumRule
; // WinWord 6 numbering, variant 1
998 OUString msNumberingNumRule
; // WinWord 6 numbering, variant 2
999 SwNumRule
* GetNumRule(const SwDoc
& rDoc
, sal_uInt8 nNumType
);
1000 void SetNumRule(const OUString
& rNumRule
, sal_uInt8 nNumType
);
1003 struct SprmReadInfo
;
1005 struct WW8PostProcessAttrsInfo
1011 SfxItemSet mItemSet
;
1013 WW8PostProcessAttrsInfo(WW8_CP nCpStart
, WW8_CP nCpEnd
, SwPaM
& rPaM
);
1016 #define MAX_COL 64 // WW6-description: 32, WW6-UI: 31 & WW8-UI: 63!
1018 struct WW8TabBandDesc
1020 WW8TabBandDesc
* pNextBand
;
1022 short mnDefaultLeft
;
1024 short mnDefaultRight
;
1025 short mnDefaultBottom
;
1029 sal_uInt16 maDirections
[MAX_COL
+ 1];
1030 short nCenter
[MAX_COL
+ 1]; // X-edge of all cells of this band
1031 short nWidth
[MAX_COL
+ 1]; // length of all cells of this band
1032 short nWwCols
; // sal_uInt8 would be sufficient, alignment -> short
1033 short nSwCols
; // SW: number of columns for the writer
1034 bool bLEmptyCol
; // SW: an additional empty column at the left
1035 bool bREmptyCol
; // SW: same at the right
1039 sal_uInt8 nOverrideSpacing
[MAX_COL
+ 1];
1040 short nOverrideValues
[MAX_COL
+ 1][4];
1043 WW8_BRCVer9 aDefBrcs
[6];
1045 bool bExist
[MAX_COL
]; // does this cell exist ?
1046 sal_uInt8 nTransCell
[MAX_COL
+ 2]; // translation WW-Index -> SW-Index
1048 sal_uInt8
transCell(sal_uInt8 nWwCol
) const
1050 return nWwCol
< SAL_N_ELEMENTS(nTransCell
) ? nTransCell
[nWwCol
] : 0xFF;
1054 WW8TabBandDesc(WW8TabBandDesc
const & rBand
); // deep copy
1056 void ReadDef(bool bVer67
, const sal_uInt8
* pS
, short nLen
);
1057 void ProcessDirection(const sal_uInt8
* pParams
);
1058 void ProcessSprmTSetBRC(int nBrcVer
, const sal_uInt8
* pParamsTSetBRC
, sal_uInt16 nParamsLen
);
1059 void ProcessSprmTTableBorders(int nBrcVer
, const sal_uInt8
* pParams
, sal_uInt16 nParamsLen
);
1060 void ProcessSprmTDxaCol(const sal_uInt8
* pParamsTDxaCol
);
1061 void ProcessSprmTDelete(const sal_uInt8
* pParamsTDelete
);
1062 void ProcessSprmTInsert(const sal_uInt8
* pParamsTInsert
);
1063 void ProcessSpacing(const sal_uInt8
* pParamsTInsert
);
1064 void ProcessSpecificSpacing(const sal_uInt8
* pParamsTInsert
);
1065 void ReadShd(const sal_uInt8
* pS
);
1066 void ReadNewShd(const sal_uInt8
* pS
, bool bVer67
, sal_uInt8 nStart
);
1068 enum wwDIR
{wwTOP
= 0, wwLEFT
= 1, wwBOTTOM
= 2, wwRIGHT
= 3};
1071 WW8TabBandDesc
& operator =(WW8TabBandDesc
const &) = default; // only for use in copy ctor
1076 typedef std::set
<WW8_CP
> cp_set
;
1078 class SwWW8ImplReader
1081 SwDocShell
*m_pDocShell
; // The Real DocShell
1083 friend class WW8RStyle
;
1084 friend class WW8TabDesc
;
1085 friend class WW8ReaderSave
;
1086 friend struct WW8FlyPara
;
1087 friend struct WW8SwFlyPara
;
1088 friend class WW8FlySet
;
1089 friend class SwMSDffManager
;
1090 friend class SwWW8FltControlStack
;
1091 friend class WW8FormulaControl
;
1092 friend class wwSectionManager
;
1096 SotStorage
* m_pStg
; // Input-Storage
1097 SvStream
* m_pStrm
; // Input-(Storage)Stream
1098 SvStream
* m_pTableStream
; // Input-(Storage)Stream
1099 SvStream
* m_pDataStream
; // Input-(Storage)Stream
1103 std::shared_ptr
<SwUnoCursor
> mpCursor
;
1106 std::unique_ptr
<SwWW8FltControlStack
> m_xCtrlStck
; // stack for the attributes
1109 This stack is for redlines, because their sequence of discovery can
1110 be out of order of their order of insertion into the document.
1112 std::unique_ptr
<sw::util::RedlineStack
> m_xRedlineStack
;
1115 This stack is for fields that get referenced later, e.g. BookMarks and TOX.
1116 They get inserted at the end of the document, it is the same stack for
1117 headers/footers/main text/textboxes/tables etc...
1119 std::unique_ptr
<SwWW8ReferencedFltEndStack
> m_xReffedStck
;
1122 This stack is for fields whose true conversion cannot be determined until
1123 the end of the document, it is the same stack for headers/footers/main
1124 text/textboxes/tables etc... They are things that reference other things
1125 e.g. NoteRef and Ref, they are processed after m_xReffedStck
1127 std::unique_ptr
<SwWW8FltRefStack
> m_xReffingStck
;
1130 For graphics anchors. Determines the graphics whose anchors are in the
1131 current paragraph, and works around the difficulty in inserting a graphic
1132 anchored to character before a character to be anchored to has been
1133 inserted. Is emptied at the end of each paragraph.
1135 std::unique_ptr
<SwWW8FltAnchorStack
> m_xAnchorStck
;
1138 A stack of fields identifiers to keep track of any open fields that need
1139 to be closed. Generally word fields are inserted as writer fields as soon
1140 as they are encountered, and so their end point is normally unimportant.
1141 But hyperlink fields need to be applied as attributes to text and it is
1142 far easier and safer to set the end point of an attribute when we
1143 encounter the end marker of the field instead of calculating in advance
1144 where the end point will fall, to do so fully correctly duplicates the
1145 main logic of the filter itself.
1147 std::deque
<WW8FieldEntry
> m_aFieldStack
;
1150 A stack of open footnotes. Should only be one in it at any time.
1152 std::deque
<FootnoteDescriptor
> m_aFootnoteStack
;
1155 A queue of the ms sections in the document
1157 wwSectionManager m_aSectionManager
;
1160 A vector of surplus-to-requirements paragraph in the final document,
1161 that exist because of quirks of the SwDoc document model and/or API,
1162 which need to be removed.
1164 wwExtraneousParas m_aExtraneousParas
;
1167 A map of tables to their follow nodes for use in inserting tables into
1168 already existing document, i.e. insert file
1170 sw::util::InsertedTablesManager m_aInsertedTables
;
1173 Creates unique names to give to (file link) sections (WW1/WW2/...)
1175 wwSectionNamer m_aSectionNameGenerator
;
1178 Knows how to split a series of bytes into sprms and their arguments
1180 std::unique_ptr
<wwSprmParser
> m_xSprmParser
;
1183 Creates unique names to give to graphics
1185 wwFrameNamer m_aGrfNameGenerator
;
1188 Knows which writer style a given word style should be imported as.
1190 sw::util::ParaStyleMapper m_aParaStyleMapper
;
1191 sw::util::CharStyleMapper m_aCharStyleMapper
;
1194 Stack of textencoding being used as we progress through the document text
1196 std::stack
<rtl_TextEncoding
> m_aFontSrcCharSets
;
1197 std::stack
<rtl_TextEncoding
> m_aFontSrcCJKCharSets
;
1202 std::unique_ptr
<ImportProgress
> m_xProgress
;
1204 std::unique_ptr
<SwMSConvertControls
> m_xFormImpl
; // implementation of control
1206 SwFlyFrameFormat
* m_pFlyFormatOfJustInsertedGraphic
;
1207 std::unique_ptr
<FrameDeleteWatch
> m_xFormatOfJustInsertedApo
;
1208 SwPaM
* m_pPreviousNumPaM
;
1209 const SwNumRule
* m_pPrevNumRule
;
1211 //Keep track of APO environments
1212 std::deque
<bool> m_aApos
;
1214 Keep track of generated Ruby character formats we can minimize the
1215 number of character formats created
1217 std::vector
<const SwCharFormat
*> m_aRubyCharFormats
;
1220 For fuzzing keep track of source offset of inserted graphics
1222 std::set
<sal_uLong
> m_aGrafPosSet
;
1224 std::unique_ptr
<WW8PostProcessAttrsInfo
> m_pPostProcessAttrsInfo
;
1226 std::shared_ptr
<WW8Fib
> m_xWwFib
;
1227 std::unique_ptr
<WW8Fonts
> m_xFonts
;
1228 std::unique_ptr
<WW8Dop
> m_xWDop
;
1229 std::unique_ptr
<WW8ListManager
, o3tl::default_delete
<WW8ListManager
>> m_xLstManager
;
1230 std::unique_ptr
<WW8ScannerBase
> m_xSBase
;
1231 std::shared_ptr
<WW8PLCFMan
> m_xPlcxMan
;
1232 std::map
<short, OUString
> m_aLinkStringMap
;
1234 o3tl::sorted_vector
<const SwNode
*> m_aTextNodesHavingFirstLineOfstSet
; // #i103711#
1235 o3tl::sorted_vector
<const SwNode
*> m_aTextNodesHavingLeftIndentSet
; // #i105414#
1237 std::unique_ptr
<WW8RStyle
> m_xStyles
; // pointer to the style reading class
1238 SwFormat
* m_pCurrentColl
; // collection to be created now
1239 // ( always 0 outside of a Style-Def )
1240 std::unique_ptr
<SfxItemSet
> m_xCurrentItemSet
;// character attributes to be read in now
1241 // (always 0 outside of the WW8ListManager Ctor)
1242 std::vector
<SwWW8StyInf
> m_vColl
;
1243 const SwTextFormatColl
* m_pDfltTextFormatColl
; // Default
1244 SwFormat
* m_pStandardFormatColl
;// "Standard"
1246 std::unique_ptr
<WW8PLCF_HdFt
> m_xHdFt
; // pointer to Header / Footer - scanner class
1248 std::unique_ptr
<WW8FlyPara
> m_xWFlyPara
; // WW-parameter
1249 std::unique_ptr
<WW8SwFlyPara
> m_xSFlyPara
; // Sw parameters created from previous
1251 std::unique_ptr
<WW8TabDesc
> m_xTableDesc
; // description of table properties
1252 //Keep track of tables within tables
1253 std::stack
<std::unique_ptr
<WW8TabDesc
>> m_aTableStack
;
1255 ANLDRuleMap m_aANLDRules
;
1256 std::unique_ptr
<WW8_OLST
> m_xNumOlst
; // position in text
1258 SdrModel
* m_pDrawModel
;
1260 std::unique_ptr
<EditEngine
> m_pDrawEditEngine
;
1261 std::unique_ptr
<wwZOrderer
> m_xWWZOrder
;
1263 SwFieldType
* m_pNumFieldType
; // for number circle
1265 std::unique_ptr
<SwMSDffManager
> m_xMSDffManager
;
1267 std::optional
<std::vector
<OUString
>> m_xAtnNames
;
1269 std::unique_ptr
<WW8SmartTagData
> m_pSmartTagData
;
1271 /// Redlining Authors, map word author key to writer author value
1272 std::map
<sal_uInt16
, std::size_t> m_aAuthorInfos
;
1273 OUString m_sBaseURL
;
1276 sal_uInt32 m_nIniFlags
; // flags from writer.ini
1277 sal_uInt32 m_nIniFlags1
; // ditto ( additional flags )
1278 sal_uInt32 m_nFieldFlags
; // ditto for fields
1279 sal_uInt32 m_nFieldTagAlways
[3]; // ditto for tagging of fields
1280 sal_uInt32 m_nFieldTagBad
[3]; // ditto for tagging of fields that can't be imported
1281 bool m_bRegardHindiDigits
; // import digits in CTL scripts as Hindi numbers
1283 bool m_bDrawCpOValid
;
1284 WW8_CP m_nDrawCpO
; // start of Txbx-SubDocs
1286 sal_uLong m_nPicLocFc
; // Picture Location in File (FC)
1287 sal_uLong m_nObjLocFc
; // Object Location in File (FC)
1289 sal_Int32 m_nIniFlyDx
; // X-offset of Flys
1290 sal_Int32 m_nIniFlyDy
; // Y-offset of Flys
1292 rtl_TextEncoding m_eTextCharSet
; // Default charset for Text
1293 rtl_TextEncoding m_eStructCharSet
; // rtl_TextEncoding for structures
1294 rtl_TextEncoding m_eHardCharSet
; // Hard rtl_TextEncoding-Attribute
1295 sal_uInt16 m_nProgress
; // percentage for Progressbar
1296 sal_uInt16 m_nCurrentColl
; // per WW-count
1297 sal_uInt16 m_nFieldNum
; // serial number for that
1298 sal_uInt16 m_nLFOPosition
;
1300 short m_nCharFormat
; // per WW-count, <0 for none
1302 short m_nDrawXOfs
, m_nDrawYOfs
;
1303 short m_nDrawXOfs2
, m_nDrawYOfs2
;
1305 sal_Unicode m_cSymbol
; // symbol to be read now
1307 sal_uInt8 m_nWantedVersion
; // originally requested WW-Doc version by Writer
1309 sal_uInt8 m_nSwNumLevel
; // level number for outline / enumeration
1310 sal_uInt8 m_nWwNumType
; // outline / number / enumeration
1311 const SwNumRule
* m_pChosenWW8OutlineStyle
; // copied to the "Outline" Chapter Numbering style
1312 sal_uInt8 m_nListLevel
;
1314 bool m_bNewDoc
; // new document?
1315 bool m_bSkipImages
; // skip images for text extraction/indexing
1316 bool m_bReadNoTable
; // no tables
1317 bool m_bPgSecBreak
; // Page- or Sectionbreak is still to be added
1318 bool m_bSpec
; // special char follows in text
1319 bool m_bObj
; // Obj in Text
1320 bool m_bTxbxFlySection
; // FlyFrame that was inserted as replacement for Winword Textbox
1321 bool m_bHasBorder
; // for bundling of the borders
1322 bool m_bSymbol
; // e.g. Symbol instead of Times
1323 bool m_bIgnoreText
; // e.g. for FieldVanish
1324 int m_nInTable
; // are we currently reading a table?
1325 bool m_bWasTabRowEnd
; // table : Row End Mark
1326 bool m_bWasTabCellEnd
; // table: Cell End Mark
1328 bool m_bAnl
; // enumeration in work
1329 // Anl stands for "Autonumber level"
1331 bool m_bHdFtFootnoteEdn
; // special text: header/footer/and so on
1332 bool m_bFootnoteEdn
; // footnote or endnote
1333 bool m_bIsHeader
; // text is read from header ( line height )
1334 bool m_bIsFooter
; // text is read from footer ( line height )
1336 bool m_bIsUnicode
; // current piece of text is encoded as 2-byte Unicode
1337 // please do NOT handle this as bit field!
1339 bool m_bCpxStyle
; // style in the complex part
1340 bool m_bStyNormal
; // style with Id 0 is currently read
1341 bool m_bWWBugNormal
; // WW-Version with Bug Dya in Style Normal
1342 bool m_bNoAttrImport
; // ignore attributes for ignoring styles
1343 bool m_bInHyperlink
; // special case for reading 0x01
1344 // see also: SwWW8ImplReader::Read_F_Hyperlink()
1347 // useful helper variables
1348 bool m_bVer67
; // ( (6 == nVersion) || (7 == nVersion) );
1349 bool m_bVer6
; // (6 == nVersion);
1350 bool m_bVer7
; // (7 == nVersion);
1351 bool m_bVer8
; // (8 == nVersion);
1353 bool m_bEmbeddObj
; // EmbeddField is being read
1355 bool m_bCurrentAND_fNumberAcross
; // current active Annotated List Descriptor - ROW flag
1357 bool m_bNoLnNumYet
; // no Line Numbering has been activated yet (we import
1358 // the very 1st Line Numbering and ignore the rest)
1360 bool m_bFirstPara
; // first paragraph?
1361 bool m_bFirstParaOfPage
;
1362 bool m_bParaAutoBefore
;
1363 bool m_bParaAutoAfter
;
1366 sal_Int32 m_nDropCap
;
1370 // Indicate that currently on loading a TOC, managed by Read_F_TOX() and End_Field()
1371 bool m_bLoadingTOXCache
;
1372 int m_nEmbeddedTOXLevel
;
1373 // Indicate that current on loading a hyperlink, which is inside a TOC; Managed by Read_F_Hyperlink() and End_Field()
1374 bool m_bLoadingTOXHyperlink
;
1375 // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field()
1376 std::unique_ptr
<SwPaM
> m_pPosAfterTOC
;
1377 // used for some dropcap tweaking
1378 SwTextNode
* m_pPreviousNode
;
1380 std::unique_ptr
< SwPosition
> m_pLastAnchorPos
;
1382 bool m_bCareFirstParaEndInToc
;
1383 bool m_bCareLastParaEndInToc
;
1384 cp_set m_aTOXEndCps
;
1386 bool m_bNotifyMacroEventRead
;
1389 const SprmReadInfo
& GetSprmReadInfo(sal_uInt16 nId
) const;
1391 bool StyleExists(unsigned int nColl
) const { return (nColl
< m_vColl
.size()); }
1392 SwWW8StyInf
*GetStyle(sal_uInt16 nColl
) const;
1393 void AppendTextNode(SwPosition
& rPos
);
1395 void Read_HdFt(int nSect
, const SwPageDesc
*pPrev
,
1396 const wwSection
&rSection
);
1397 void Read_HdFtText(WW8_CP nStartCp
, WW8_CP nLen
, SwFrameFormat
const * pHdFtFormat
);
1398 void Read_HdFtTextAsHackedFrame(WW8_CP nStart
, WW8_CP nLen
,
1399 SwFrameFormat
const &rHdFtFormat
, sal_uInt16 nPageWidth
);
1401 bool isValid_HdFt_CP(WW8_CP nHeaderCP
) const;
1403 bool HasOwnHeaderFooter(sal_uInt8 nWhichItems
, sal_uInt8 grpfIhdt
, int nSect
);
1405 void HandleLineNumbering(const wwSection
&rSection
);
1407 void CopyPageDescHdFt( const SwPageDesc
* pOrgPageDesc
,
1408 SwPageDesc
* pNewPageDesc
, sal_uInt8 nCode
);
1410 void DeleteStack(std::unique_ptr
<SwFltControlStack
> prStck
);
1411 void DeleteCtrlStack()
1413 DeleteStack(std::move(m_xCtrlStck
));
1415 void DeleteRefStacks()
1417 DeleteStack(std::move(m_xReffedStck
));
1418 DeleteStack(std::move(m_xReffingStck
));
1420 void DeleteAnchorStack()
1422 DeleteStack(std::move(m_xAnchorStck
));
1424 void emulateMSWordAddTextToParagraph(const OUString
& rAddString
);
1425 void simpleAddTextToParagraph(const OUString
& rAddString
);
1426 bool HandlePageBreakChar();
1427 bool ReadChar(tools::Long nPosCp
, tools::Long nCpOfs
);
1428 bool ReadPlainChars(WW8_CP
& rPos
, sal_Int32 nEnd
, sal_Int32 nCpOfs
);
1429 bool ReadChars(WW8_CP
& rPos
, WW8_CP nNextAttr
, tools::Long nTextEnd
, tools::Long nCpOfs
);
1430 static bool LangUsesHindiNumbers(LanguageType nLang
);
1431 static sal_Unicode
TranslateToHindiNumbers(sal_Unicode
);
1433 void SetDocumentGrid(SwFrameFormat
&rFormat
, const wwSection
&rSection
);
1435 void ProcessCurrentCollChange(WW8PLCFManResult
& rRes
, bool* pStartAttr
,
1436 bool bCallProcessSpecial
);
1437 tools::Long
ReadTextAttr(WW8_CP
& rTextPos
, tools::Long nTextEnd
, bool& rbStartLine
, int nDepthGuard
= 0);
1438 void ReadAttrs(WW8_CP
& rTextPos
, WW8_CP
& rNext
, tools::Long nTextEnd
, bool& rbStartLine
);
1439 void CloseAttrEnds();
1440 bool ReadText(WW8_CP nStartCp
, WW8_CP nTextLen
, ManTypes nType
);
1442 void ReadRevMarkAuthorStrTabl( SvStream
& rStrm
, sal_Int32 nTablePos
,
1443 sal_Int32 nTableSiz
, SwDoc
& rDoc
);
1445 void Read_HdFtFootnoteText(const SwNodeIndex
* pSttIdx
, WW8_CP nStartCp
,
1446 WW8_CP nLen
, ManTypes nType
);
1448 void ImportTox( int nFieldId
, const OUString
& aStr
);
1450 void EndSprm( sal_uInt16 nId
);
1453 void NewAttr( const SfxPoolItem
& rAttr
,
1454 const bool bFirstLineOfStSet
= false,
1455 const bool bLeftIndentSet
= false );
1457 bool GetFontParams(sal_uInt16
, FontFamily
&, OUString
&, FontPitch
&,
1459 bool SetNewFontAttr(sal_uInt16 nFCode
, bool bSetEnums
, sal_uInt16 nWhich
);
1460 void ResetCharSetVars();
1461 void ResetCJKCharSetVars();
1463 const SfxPoolItem
* GetFormatAttr( sal_uInt16 nWhich
);
1464 bool JoinNode(SwPaM
&rPam
, bool bStealAttr
= false);
1466 static bool IsBorder(const WW8_BRCVer9
* pbrc
, bool bChkBtwn
= false);
1468 //Set closest writer border equivalent into rBox from pbrc, optionally
1469 //recording true winword dimensions in pSizeArray. nSetBorders to mark a
1470 //border which has been previously set to a value and for which becoming
1471 //empty is valid. Set bCheBtwn to work with paragraphs that have a special
1472 //between paragraphs border
1474 // Note #i20672# we can't properly support between lines so best to ignore
1476 static bool SetBorder(SvxBoxItem
& rBox
, const WW8_BRCVer9
* pbrc
,
1477 short *pSizeArray
=nullptr, sal_uInt8 nSetBorders
=0xFF);
1478 static void GetBorderDistance(const WW8_BRCVer9
* pbrc
, tools::Rectangle
& rInnerDist
);
1479 static sal_uInt16
GetParagraphAutoSpace(bool fDontUseHTMLAutoSpacing
);
1480 static bool SetShadow(SvxShadowItem
& rShadow
, const short *pSizeArray
,
1481 const WW8_BRCVer9
& aRightBrc
);
1482 //returns true is a shadow was set
1483 static bool SetFlyBordersShadow(SfxItemSet
& rFlySet
, const WW8_BRCVer9
*pbrc
,
1485 static void SetPageBorder(SwFrameFormat
&rFormat
, const wwSection
&rSection
);
1487 static sal_Int32
MatchSdrBoxIntoFlyBoxItem( const Color
& rLineColor
,
1488 MSO_LineStyle eLineStyle
, MSO_LineDashing eDashing
, MSO_SPT eShapeType
, sal_Int32
&rLineWidth
,
1490 void MatchSdrItemsIntoFlySet( SdrObject
const * pSdrObj
, SfxItemSet
&aFlySet
,
1491 MSO_LineStyle eLineStyle
, MSO_LineDashing eDashing
, MSO_SPT eShapeType
, tools::Rectangle
&rInnerDist
);
1492 static void AdjustLRWrapForWordMargins(const SvxMSDffImportRec
&rRecord
,
1493 SvxLRSpaceItem
&rLR
);
1494 static void AdjustULWrapForWordMargins(const SvxMSDffImportRec
&rRecord
,
1495 SvxULSpaceItem
&rUL
);
1496 static void MapWrapIntoFlyFormat(const SvxMSDffImportRec
& rRecord
, SwFrameFormat
& rFlyFormat
);
1498 void SetAttributesAtGrfNode(const SvxMSDffImportRec
& rRecord
, const SwFrameFormat
& rFlyFormat
,
1499 WW8_FSPA
const* pF
);
1501 bool IsDropCap() const;
1502 bool IsListOrDropcap() const { return (!m_xCurrentItemSet
|| m_bDropCap
); };
1504 //Apo == Absolutely Positioned Object, MSWord's old-style frames
1505 std::unique_ptr
<WW8FlyPara
> ConstructApo(const ApoTestResults
&rApo
,
1506 const WW8_TablePos
*pTabPos
);
1507 bool StartApo(const ApoTestResults
&rApo
, const WW8_TablePos
*pTabPos
);
1509 bool TestSameApo(const ApoTestResults
&rApo
, const WW8_TablePos
*pTabPos
);
1510 ApoTestResults
TestApo(int nCellLevel
, bool bTableRowEnd
,
1511 const WW8_TablePos
*pTabPos
);
1512 static void StripNegativeAfterIndent(SwFrameFormat
const *pFlyFormat
);
1515 bool ProcessSpecial(bool &rbReSync
, WW8_CP nStartCp
);
1516 sal_uInt16
TabRowSprm(int nLevel
) const;
1518 bool ReadGrafFile(OUString
& rFileName
, std::unique_ptr
<Graphic
>& rpGraphic
,
1519 const WW8_PIC
& rPic
, SvStream
* pSt
, sal_uLong nFilePos
, bool* pDelIt
);
1521 static void ReplaceObj(const SdrObject
&rReplaceTextObj
,
1522 SdrObject
&rSubObj
);
1524 SwFlyFrameFormat
* MakeGrafNotInContent(const WW8PicDesc
& rPD
,
1525 const Graphic
* pGraph
, const OUString
& rFileName
,
1526 const SfxItemSet
& rGrfSet
);
1528 SwFrameFormat
* MakeGrafInContent(const WW8_PIC
& rPic
, const WW8PicDesc
& rPD
,
1529 const Graphic
* pGraph
, const OUString
& rFileName
,
1530 const SfxItemSet
& rGrfSet
);
1532 SwFrameFormat
*AddAutoAnchor(SwFrameFormat
*pFormat
);
1533 SwFrameFormat
* ImportGraf1(WW8_PIC
const & rPic
, SvStream
* pSt
, sal_uLong nFilePos
);
1534 SwFrameFormat
* ImportGraf(SdrTextObj
const * pTextObj
= nullptr, SwFrameFormat
const * pFlyFormat
= nullptr);
1536 SdrObject
* ImportOleBase( Graphic
& rGraph
, const Graphic
* pGrf
=nullptr,
1537 const SfxItemSet
* pFlySet
=nullptr, const tools::Rectangle
& aVisArea
= tools::Rectangle() );
1539 SwFrameFormat
* ImportOle( const Graphic
* = nullptr, const SfxItemSet
* pFlySet
= nullptr,
1540 const SfxItemSet
* pGrfSet
= nullptr, const tools::Rectangle
& aVisArea
= tools::Rectangle() );
1541 SwFlyFrameFormat
* InsertOle(SdrOle2Obj
&rObject
, const SfxItemSet
&rFlySet
,
1542 const SfxItemSet
*rGrfSet
);
1544 bool ImportFormulaControl(WW8FormulaControl
&rBox
,WW8_CP nStart
,
1545 SwWw8ControlType nWhich
);
1549 //This converts MS Asian Typography information into OOo's
1550 void ImportDopTypography(const WW8DopTypography
&rTypo
);
1552 ErrCode
LoadThroughDecryption(WW8Glossary
*pGloss
);
1553 ErrCode
SetSubStreams(tools::SvRef
<SotStorageStream
> &rTableStream
, tools::SvRef
<SotStorageStream
> &rDataStream
);
1554 ErrCode
CoreLoad(WW8Glossary
const *pGloss
);
1558 bool StartTable(WW8_CP nStartCp
);
1559 bool InEqualApo(int nLvl
) const;
1560 bool InLocalApo() const { return InEqualApo(m_nInTable
); }
1561 bool InEqualOrHigherApo(int nLvl
) const;
1564 bool IsInvalidOrToBeMergedTabCell() const;
1566 // Enumerations / lists ( Autonumbered List Data Descriptor )
1567 // list: ANLD ( Autonumbered List Data Descriptor )
1568 // one level: ANLV ( Autonumber Level Descriptor )
1571 // lists are separate structures in WW8 that are handled via the following three tables:
1572 // rglst, hpllfo and hsttbListNames
1573 // the corresponding structures are: LSTF, LVLF, LFO LFOLVL
1575 void SetAnlvStrings(SwNumFormat
&rNum
, int nLevel
, WW8_ANLV
const &rAV
, const sal_uInt8
* pText
,
1576 size_t nStart
, size_t nElements
, bool bOutline
);
1577 void SetAnld(SwNumRule
* pNumR
, WW8_ANLD
const * pAD
, sal_uInt8 nSwLevel
, bool bOutLine
);
1578 void SetNumOlst( SwNumRule
* pNumR
, WW8_OLST
* pO
, sal_uInt8 nSwLevel
);
1579 SwNumRule
* GetStyRule();
1581 void StartAnl(const sal_uInt8
* pSprm13
);
1582 void NextAnlLine(const sal_uInt8
* pSprm13
);
1583 void StopAllAnl(bool bGoBack
= true);
1584 void StopAnlToRestart(sal_uInt8 nType
, bool bGoBack
= true);
1588 bool ReadGrafStart(void* pData
, short nDataSiz
, WW8_DPHEAD
const * pHd
,
1589 SfxAllItemSet
&rSet
);
1590 SdrObject
*ReadLine(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1591 SdrObject
*ReadRect(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1592 SdrObject
*ReadEllipse(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1593 SdrObject
*ReadArc(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1594 SdrObject
*ReadPolyLine(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1595 void InsertTxbxStyAttrs( SfxItemSet
& rS
, sal_uInt16 nColl
);
1596 void InsertAttrsAsDrawingAttrs(WW8_CP nStartCp
, WW8_CP nEndCp
, ManTypes eType
, bool bONLYnPicLocFc
=false);
1598 bool GetTxbxTextSttEndCp(WW8_CP
& rStartCp
, WW8_CP
& rEndCp
, sal_uInt16 nTxBxS
,
1599 sal_uInt16 nSequence
);
1600 sal_Int32
GetRangeAsDrawingString(OUString
& rString
, tools::Long StartCp
, tools::Long nEndCp
, ManTypes eType
);
1601 std::optional
<OutlinerParaObject
> ImportAsOutliner(OUString
&rString
, WW8_CP nStartCp
, WW8_CP nEndCp
, ManTypes eType
);
1602 void InsertTxbxText(SdrTextObj
* pTextObj
, Size
const * pObjSiz
,
1603 sal_uInt16 nTxBxS
, sal_uInt16 nSequence
, tools::Long nPosCp
, SwFrameFormat
const * pFlyFormat
,
1604 bool bMakeSdrGrafObj
, bool& rbEraseTextObj
,
1605 bool* pbTestTxbxContainsText
= nullptr, tools::Long
* pnStartCp
= nullptr,
1606 tools::Long
* pnEndCp
= nullptr, bool* pbContainsGraphics
= nullptr,
1607 SvxMSDffImportRec
const * pRecord
= nullptr);
1608 bool TxbxChainContainsRealText( sal_uInt16 nTxBxS
,
1609 tools::Long
& rStartCp
,
1610 tools::Long
& rEndCp
);
1611 SdrObject
*ReadTextBox(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1612 SdrObject
*ReadCaptionBox(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1613 SdrObject
*ReadGroup(WW8_DPHEAD
const * pHd
, SfxAllItemSet
&rSet
);
1614 SdrObject
*ReadGrafPrimitive(short& rLeft
, SfxAllItemSet
&rSet
);
1615 void ReadGrafLayer1(WW8PLCFspecial
& rPF
, tools::Long nGrafAnchorCp
);
1616 SdrObject
* CreateContactObject(SwFrameFormat
* pFlyFormat
);
1617 RndStdIds
ProcessEscherAlign(SvxMSDffImportRec
& rRecord
, WW8_FSPA
& rFSPA
, SfxItemSet
& rFlySet
);
1618 bool MiserableRTLGraphicsHack(SwTwips
&rLeft
, SwTwips nWidth
,
1619 sal_Int16 eHoriOri
, sal_Int16 eHoriRel
);
1620 SwFrameFormat
* Read_GrafLayer( tools::Long nGrafAnchorCp
);
1621 SwFlyFrameFormat
* ImportReplaceableDrawables(SdrObject
*& rpObject
, SdrObject
*& rpOurNewObject
,
1622 SvxMSDffImportRec
& rRecord
, WW8_FSPA
& rF
,
1623 SfxItemSet
& rFlySet
);
1624 SwFlyFrameFormat
* ConvertDrawTextToFly(SdrObject
*& rpObject
, SdrObject
*& rpOurNewObject
,
1625 const SvxMSDffImportRec
& rRecord
, RndStdIds eAnchor
,
1626 const WW8_FSPA
& rF
, SfxItemSet
& rFlySet
);
1627 SwFrameFormat
* MungeTextIntoDrawBox(SvxMSDffImportRec
& rRecord
, tools::Long nGrafAnchorCp
,
1628 SwFrameFormat
* pRetFrameFormat
);
1634 OUString
GetFieldResult( WW8FieldDesc
const * pF
);
1635 void MakeTagString( OUString
& rStr
, const OUString
& rOrg
);
1636 void UpdateFields();
1637 OUString
ConvertFFileName(const OUString
& rRaw
);
1638 WW8_CP
Read_F_Tag(WW8FieldDesc
* pF
);
1639 void InsertTagField( const sal_uInt16 nId
, const OUString
& rTagText
);
1640 tools::Long
ImportExtSprm(WW8PLCFManResult
* pRes
);
1641 void EndExtSprm(sal_uInt16 nSprmId
);
1646 void RegisterNumFormatOnTextNode(sal_uInt16 nCurrentLFO
, sal_uInt8 nCurrentLevel
,
1647 const bool bSetAttr
= true);
1649 void RegisterNumFormatOnStyle(sal_uInt16 nStyle
);
1650 void SetStylesList(sal_uInt16 nStyle
, sal_uInt16 nCurrentLFO
,
1651 sal_uInt8 nCurrentLevel
);
1652 void RegisterNumFormat(sal_uInt16 nCurrentLFO
, sal_uInt8 nCurrentLevel
);
1654 // to be replaced by calls in the appropriate extended SvxMSDffManager
1656 const OUString
* GetAnnotationAuthor(sal_uInt16 nIdx
);
1658 void GetSmartTagInfo(SwFltRDFMark
& rMark
);
1660 // interfaces for the toggle attributes
1661 void SetToggleAttr(sal_uInt8 nAttrId
, bool bOn
);
1662 void SetToggleBiDiAttr(sal_uInt8 nAttrId
, bool bOn
);
1663 void ChkToggleAttr_( sal_uInt16 nOldStyle81Mask
, sal_uInt16 nNewStyle81Mask
);
1665 void ChkToggleAttr( sal_uInt16 nOldStyle81Mask
, sal_uInt16 nNewStyle81Mask
)
1667 if( nOldStyle81Mask
!= nNewStyle81Mask
&&
1668 m_xCtrlStck
->GetToggleAttrFlags() )
1669 ChkToggleAttr_( nOldStyle81Mask
, nNewStyle81Mask
);
1672 void ChkToggleBiDiAttr_( sal_uInt16 nOldStyle81Mask
, sal_uInt16 nNewStyle81Mask
);
1674 void ChkToggleBiDiAttr( sal_uInt16 nOldStyle81Mask
, sal_uInt16 nNewStyle81Mask
)
1676 if( nOldStyle81Mask
!= nNewStyle81Mask
&&
1677 m_xCtrlStck
->GetToggleBiDiAttrFlags() )
1678 ChkToggleBiDiAttr_( nOldStyle81Mask
, nNewStyle81Mask
);
1681 void PopTableDesc();
1682 void MoveInsideFly(const SwFrameFormat
*pFlyFormat
);
1683 SwTwips
MoveOutsideFly(SwFrameFormat
*pFlyFormat
, const SwPosition
&rPos
,
1684 bool bTableJoin
= true);
1686 void SetOutlineStyles();
1688 bool SetSpacing(SwPaM
&rMyPam
, int nSpace
, bool bIsUpper
);
1689 bool SetUpperSpacing(SwPaM
&pMyPam
, int nSpace
);
1690 bool SetLowerSpacing(SwPaM
&rMyPam
, int nSpace
);
1692 bool IsInlineEscherHack() const
1693 { return !m_aFieldStack
.empty() && m_aFieldStack
.back().mnFieldId
== 95; };
1695 void StoreMacroCmds();
1698 // determine object attribute "Layout in Table Cell"
1699 bool IsObjectLayoutInTableCell( const sal_uInt32 nLayoutInTableCell
) const;
1700 void ReadGlobalTemplateSettings( std::u16string_view sCreatedFrom
, const css::uno::Reference
< css::container::XNameContainer
>& xPrjNameMap
);
1701 SwWW8ImplReader(const SwWW8ImplReader
&) = delete;
1702 SwWW8ImplReader
& operator=(const SwWW8ImplReader
&) = delete;
1703 public: // really private, but can only be done public
1705 sal_uInt16
GetToggleAttrFlags() const;
1706 sal_uInt16
GetToggleBiDiAttrFlags() const;
1707 void SetToggleAttrFlags(sal_uInt16 nFlags
);
1708 void SetToggleBiDiAttrFlags(sal_uInt16 nFlags
);
1710 tools::Long
Read_Footnote(WW8PLCFManResult
* pRes
);
1711 sal_uInt16
End_Footnote();
1712 tools::Long
Read_Field(WW8PLCFManResult
* pRes
);
1713 sal_uInt16
End_Field();
1714 tools::Long
Read_Book(WW8PLCFManResult
*);
1715 tools::Long
Read_And(WW8PLCFManResult
* pRes
);
1716 tools::Long
Read_AtnBook(WW8PLCFManResult
*);
1717 tools::Long
Read_FactoidBook(WW8PLCFManResult
*);
1721 void Read_Special(sal_uInt16
, const sal_uInt8
*, short nLen
);
1722 void Read_Obj(sal_uInt16
, const sal_uInt8
*, short nLen
);
1723 void Read_PicLoc(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1724 void Read_BoldUsw(sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1725 void Read_Bidi(sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1726 void Read_BoldBiDiUsw(sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1727 void Read_AmbiguousSPRM(sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1728 void Read_SubSuper( sal_uInt16
, const sal_uInt8
*, short nLen
);
1729 bool ConvertSubToGraphicPlacement();
1730 static SwFrameFormat
*ContainsSingleInlineGraphic(const SwPaM
&rRegion
);
1731 void Read_SubSuperProp( sal_uInt16
, const sal_uInt8
*, short nLen
);
1732 void Read_Underline( sal_uInt16
, const sal_uInt8
*, short nLen
);
1733 void Read_TextColor( sal_uInt16
, const sal_uInt8
*, short nLen
);
1734 void openFont(sal_uInt16 nFCode
, sal_uInt16 nId
);
1735 void closeFont(sal_uInt16 nId
);
1736 void Read_FontCode( sal_uInt16
, const sal_uInt8
*, short nLen
);
1737 void Read_FontSize( sal_uInt16
, const sal_uInt8
*, short nLen
);
1738 void Read_CharSet(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1739 void Read_Language( sal_uInt16
, const sal_uInt8
*, short nLen
);
1740 void Read_CColl( sal_uInt16
, const sal_uInt8
*, short nLen
);
1741 void Read_Kern( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1742 void Read_FontKern( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1743 void Read_Emphasis( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1744 void Read_ScaleWidth( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1745 void Read_Relief( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1746 void Read_TextAnim( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1748 void Read_NoLineNumb( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1750 void Read_LR( sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1751 void Read_UL( sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1752 void Read_ParaAutoBefore(sal_uInt16
, const sal_uInt8
*pData
, short nLen
);
1753 void Read_ParaAutoAfter(sal_uInt16
, const sal_uInt8
*pData
, short nLen
);
1754 void Read_ParaContextualSpacing( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1755 void Read_LineSpace( sal_uInt16
, const sal_uInt8
*, short nLen
);
1757 void SetRelativeJustify( bool bRel
);
1758 bool IsRelativeJustify();
1759 bool IsRelativeJustify(sal_uInt16 nColl
, o3tl::sorted_vector
<sal_uInt16
>& rVisitedStyles
);
1760 void Read_Justify(sal_uInt16
, const sal_uInt8
*, short nLen
);
1762 void Read_IdctHint(sal_uInt16
, const sal_uInt8
*, short nLen
);
1763 bool IsRightToLeft();
1764 void Read_RTLJustify(sal_uInt16
, const sal_uInt8
*, short nLen
);
1765 void Read_Hyphenation( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1766 void Read_WidowControl( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1767 void Read_AlignFont( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1768 void Read_UsePgsuSettings( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1769 void Read_KeepLines( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1770 void Read_KeepParas( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1771 void Read_BreakBefore( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1772 void Read_ApoPPC(sal_uInt16
, const sal_uInt8
* pData
, short);
1774 void Read_BoolItem( sal_uInt16 nId
, const sal_uInt8
*, short nLen
);
1776 void Read_Border( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1777 void Read_CharBorder(sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1778 void Read_Tab( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1779 void Read_Symbol(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1780 void Read_FieldVanish( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1782 // Revision Marks ( == Redlining )
1784 // insert or delete content (change char attributes resp.)
1785 void Read_CRevisionMark(RedlineType eType
, const sal_uInt8
* pData
, short nLen
);
1786 // insert new content
1787 void Read_CFRMark(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1788 // delete old content
1789 void Read_CFRMarkDel(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1790 // change properties of content (e.g. char formatting)
1791 void Read_CPropRMark(sal_uInt16
, const sal_uInt8
* pData
, short nLen
); // complex!
1793 void Read_TabRowEnd( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1794 void Read_TabCellEnd( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1795 bool ParseTabPos(WW8_TablePos
*aTabPos
, WW8PLCFx_Cp_FKP
* pPap
);
1796 void Read_Shade( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1797 void Read_ANLevelNo( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1798 void Read_ANLevelDesc( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1800 // outline level Ver8
1801 void Read_POutLvl(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1803 void Read_OLST( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1805 void Read_CharShadow( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1806 void Read_CharHighlight( sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1809 void Read_ListLevel( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1812 * read and interpret the sprmPIlfo used to determine which list
1813 * contains the paragraph.
1814 * @param nId unused (sprm value, 0x460b for sprmPIlfo).
1815 * @param[in] pData operand.
1816 * @param[in] nLen size of the operand (pData) in byte, should be 2.
1817 * -1 to indicate the actual level is finished.
1819 void Read_LFOPosition( sal_uInt16 nId
, const sal_uInt8
* pData
, short nLen
);
1820 bool SetTextFormatCollAndListLevel(const SwPaM
& rRg
, SwWW8StyInf
& rStyleInfo
);
1822 void Read_StyleCode(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1823 void Read_Majority(sal_uInt16
, const sal_uInt8
* , short );
1824 void Read_DoubleLine_Rotate( sal_uInt16
, const sal_uInt8
* pDATA
, short nLen
);
1826 void Read_TextForeColor(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1827 void Read_TextBackColor(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1828 void Read_ParaBackColor(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1829 void Read_ParaBiDi(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1830 static Color
ExtractColour(const sal_uInt8
* &rpData
, bool bVer67
);
1832 void Read_TextVerticalAdjustment(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1833 void Read_UnderlineColor(sal_uInt16
, const sal_uInt8
* pData
, short nLen
);
1834 tools::Long
MapBookmarkVariables(const WW8FieldDesc
* pF
, OUString
&rOrigName
,
1835 const OUString
&rData
);
1836 OUString
GetMappedBookmark(std::u16string_view rOrigName
);
1839 eF_ResT
Read_F_Input(WW8FieldDesc
*, OUString
& rStr
);
1840 eF_ResT
Read_F_InputVar(WW8FieldDesc
*, OUString
& rStr
);
1841 eF_ResT
Read_F_ANumber( WW8FieldDesc
*, OUString
& );
1842 eF_ResT
Read_F_DocInfo( WW8FieldDesc
* pF
, OUString
& rStr
);
1843 eF_ResT
Read_F_Author( WW8FieldDesc
*, OUString
& );
1844 eF_ResT
Read_F_TemplName( WW8FieldDesc
*, OUString
& );
1845 SvNumFormatType
GetTimeDatePara(OUString
const & rStr
, sal_uInt32
& rFormat
, LanguageType
&rLang
,
1846 int nWhichDefault
, bool bHijri
= false);
1847 bool ForceFieldLanguage(SwField
&rField
, LanguageType nLang
);
1848 eF_ResT
Read_F_DateTime( WW8FieldDesc
*, OUString
& rStr
);
1849 eF_ResT
Read_F_FileName( WW8FieldDesc
*, OUString
& rStr
);
1850 eF_ResT
Read_F_Num( WW8FieldDesc
* pF
, OUString
& );
1851 eF_ResT
Read_F_CurPage( WW8FieldDesc
*, OUString
& );
1852 eF_ResT
Read_F_Ref( WW8FieldDesc
* pF
, OUString
& );
1854 eF_ResT
Read_F_Set( WW8FieldDesc
*, OUString
& rStr
);
1855 eF_ResT
Read_F_PgRef( WW8FieldDesc
*, OUString
& rStr
);
1856 eF_ResT
Read_F_NoteReference( WW8FieldDesc
* pF
, OUString
& rStr
);
1858 eF_ResT
Read_F_Tox( WW8FieldDesc
* pF
, OUString
& rStr
);
1859 eF_ResT
Read_F_Symbol( WW8FieldDesc
*, OUString
& rStr
);
1860 eF_ResT
Read_F_Embedd( WW8FieldDesc
*, OUString
& rStr
);
1861 eF_ResT
Read_F_FormTextBox( WW8FieldDesc
* pF
, OUString
& rStr
);
1862 eF_ResT
Read_F_FormCheckBox( WW8FieldDesc
* pF
, OUString
& rStr
);
1863 eF_ResT
Read_F_FormListBox( WW8FieldDesc
* pF
, OUString
& rStr
);
1864 css::awt::Size
MiserableDropDownFormHack(const OUString
&rString
,
1865 css::uno::Reference
<css::beans::XPropertySet
> const & rPropSet
);
1867 eF_ResT
Read_F_Macro( WW8FieldDesc
*, OUString
& rStr
);
1868 eF_ResT
Read_F_DBField( WW8FieldDesc
*, OUString
& rStr
);
1869 eF_ResT
Read_F_DBNext( WW8FieldDesc
*, OUString
& );
1870 eF_ResT
Read_F_DBNum( WW8FieldDesc
*, OUString
& );
1871 eF_ResT
Read_F_Equation( WW8FieldDesc
*, OUString
& );
1872 void Read_SubF_Ruby( msfilter::util::WW8ReadFieldParams
& rReadParam
);
1873 eF_ResT
Read_F_IncludePicture( WW8FieldDesc
*, OUString
& rStr
);
1874 eF_ResT
Read_F_IncludeText( WW8FieldDesc
*, OUString
& rStr
);
1875 eF_ResT
Read_F_Seq( WW8FieldDesc
*, OUString
& rStr
);
1876 /// Reads a STYLEREF field.
1877 eF_ResT
Read_F_Styleref(WW8FieldDesc
*, OUString
& rStr
);
1879 eF_ResT
Read_F_OCX(WW8FieldDesc
*, OUString
&);
1880 eF_ResT
Read_F_Hyperlink(WW8FieldDesc
*, OUString
& rStr
);
1881 eF_ResT
Read_F_Shape(WW8FieldDesc
* pF
, OUString
& rStr
);
1882 eF_ResT
Read_F_HTMLControl( WW8FieldDesc
* pF
, OUString
& rStr
);
1884 short ImportSprm(const sal_uInt8
* pPos
, sal_Int32 nMemLen
, sal_uInt16 nId
= 0);
1886 bool SearchRowEnd(WW8PLCFx_Cp_FKP
* pPap
,WW8_CP
&rStartCp
, int nLevel
) const;
1887 /// Seek to the end of the table with pPap, returns true on success.
1888 bool SearchTableEnd(WW8PLCFx_Cp_FKP
* pPap
) const;
1889 bool FloatingTableConversion(WW8PLCFx_Cp_FKP
* pPap
);
1891 const WW8Fib
& GetFib() const { return *m_xWwFib
; }
1892 SwDoc
& GetDoc() const { return m_rDoc
; }
1893 sal_uInt16
GetCurrentColl() const { return m_nCurrentColl
; }
1894 void SetNCurrentColl( sal_uInt16 nColl
) { m_nCurrentColl
= nColl
; }
1895 std::unique_ptr
<SfxItemSet
> SetCurrentItemSet(std::unique_ptr
<SfxItemSet
> pItemSet
);
1896 sal_uInt16
StyleUsingLFO( sal_uInt16 nLFOIndex
) const ;
1897 const SwFormat
* GetStyleWithOrgWWName( std::u16string_view rName
) const ;
1899 static bool GetPictGrafFromStream(Graphic
& rGraphic
, SvStream
& rSrc
);
1900 SAL_WARN_UNUSED_RESULT
static bool PicRead(SvStream
*pDataStream
, WW8_PIC
*pPic
, bool bVer67
);
1901 static bool ImportOleWMF(const tools::SvRef
<SotStorage
>& xSrc1
, GDIMetaFile
& rWMF
, tools::Long
& rX
,
1903 static Color
GetCol(sal_uInt8 nIco
);
1905 SwWW8ImplReader( sal_uInt8 nVersionPara
, SotStorage
* pStorage
, SvStream
* pSt
,
1906 SwDoc
& rD
, const OUString
& rBaseURL
, bool bNewDoc
, bool bSkipImages
, SwPosition
const &rPos
);
1908 const OUString
& GetBaseURL() const { return m_sBaseURL
; }
1909 // load a complete doc file
1910 ErrCode
LoadDoc(WW8Glossary
*pGloss
=nullptr);
1911 rtl_TextEncoding
GetCurrentCharSet();
1912 rtl_TextEncoding
GetCurrentCJKCharSet();
1913 rtl_TextEncoding
GetCharSetFromLanguage();
1914 rtl_TextEncoding
GetCJKCharSetFromLanguage();
1916 void PostProcessAttrs();
1917 void ReadEmbeddedData(SvStream
& rStrm
, SwDocShell
const * pDocShell
, struct HyperLinksTable
& hlStr
);
1918 void NotifyMacroEventRead();
1921 bool CanUseRemoteLink(const OUString
&rGrfName
);
1922 void UseListIndent(SwWW8StyInf
&rStyle
, const SwNumFormat
&rFormat
);
1923 void SetStyleIndent(SwWW8StyInf
&rStyleInfo
, const SwNumFormat
&rFormat
);
1926 void SyncIndentWithList( SvxLRSpaceItem
&rLR
,
1927 const SwNumFormat
&rFormat
,
1928 const bool bFirstLineOfStSet
,
1929 const bool bLeftIndentSet
);
1930 tools::Long
GetListFirstLineIndent(const SwNumFormat
&rFormat
);
1931 OUString
BookmarkToWriter(std::u16string_view rBookmark
);
1932 bool RTLGraphicsHack(SwTwips
&rLeft
, SwTwips nWidth
,
1933 sal_Int16 eHoriOri
, sal_Int16 eHoriRel
, SwTwips nPageLeft
,
1934 SwTwips nPageRight
, SwTwips nPageSize
);
1935 void MatchEscherMirrorIntoFlySet(const SvxMSDffImportRec
&rRecord
,
1936 SfxItemSet
&rFlySet
);
1939 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */