summaryrefslogtreecommitdiffstats
path: root/sw/source/filter/ww8/docxattributeoutput.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/ww8/docxattributeoutput.hxx')
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx1200
1 files changed, 1200 insertions, 0 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
new file mode 100644
index 0000000000..28eb32caf8
--- /dev/null
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -0,0 +1,1200 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_SW_SOURCE_FILTER_WW8_DOCXATTRIBUTEOUTPUT_HXX
+#define INCLUDED_SW_SOURCE_FILTER_WW8_DOCXATTRIBUTEOUTPUT_HXX
+
+#include <memory>
+#include <string_view>
+
+#include "attributeoutputbase.hxx"
+#include "fields.hxx"
+#include <IMark.hxx>
+#include "docxexport.hxx"
+#include <wrtswtbl.hxx>
+#include <redline.hxx>
+
+#include <editeng/boxitem.hxx>
+#include <sax/fshelper.hxx>
+#include <sax/fastattribs.hxx>
+#include <vcl/vclenum.hxx>
+#include <svx/xenum.hxx>
+
+#include <fldbas.hxx>
+
+#include <vector>
+#include <optional>
+#include <o3tl/sorted_vector.hxx>
+#include <oox/export/vmlexport.hxx>
+#include <oox/export/drawingml.hxx>
+#include "docxtablestyleexport.hxx"
+
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+
+class SwGrfNode;
+class SdrObject;
+enum class SvxBoxItemLine;
+enum class SwLineBreakClear;
+class SwContentControl;
+
+namespace docx { class FootnotesList; }
+namespace oox::drawingml { class DrawingML; }
+
+struct FieldInfos
+{
+ std::shared_ptr<const SwField> pField;
+ const ::sw::mark::IFieldmark* pFieldmark;
+ ww::eField eType;
+ bool bOpen;
+ bool bSep;
+ bool bClose;
+ OUString sCmd;
+ FieldInfos()
+ : pFieldmark(nullptr), eType(ww::eUNKNOWN)
+ , bOpen(false), bSep(false), bClose(false)
+ {}
+};
+
+enum DocxColBreakStatus
+{
+ COLBRK_NONE,
+ COLBRK_POSTPONE,
+ COLBRK_WRITEANDPOSTPONE,
+ COLBRK_WRITE
+};
+
+/**
+ * A structure that holds information about the options selected
+ * when outputting a border to DOCX.
+ *
+ * There are 3 functions that initialize this structure:
+ * - lcl_getTableDefaultBorderOptions - retrieves the options for when outputting table default borders
+ * - lcl_getTableCellBorderOptions - retrieves the options for when outputting table cell borders
+ * - lcl_getBoxBorderOptions - retrieves the options for when outputting box borders
+ *
+ */
+struct OutputBorderOptions
+{
+ sal_Int32 tag = 0;
+ bool bUseStartEnd = false;
+ bool bWriteTag = true;
+ bool bWriteDistance = false;
+ SvxShadowLocation aShadowLocation = SvxShadowLocation::NONE;
+ std::shared_ptr<editeng::WordBorderDistances> pDistances;
+};
+
+struct DocxTableExportContext;
+
+/**
+ * A structure that holds flags for the table export.
+ */
+struct TableReference
+{
+ /// Remember if we are in an open cell, or not.
+ bool m_bTableCellOpen;
+
+ /// If paragraph sdt got opened in this table cell.
+ bool m_bTableCellParaSdtOpen;
+
+ /// Remember if we are in a deleted/inserted cell, or not.
+ bool m_bTableCellChanged;
+
+ /// Remember the current table depth.
+ sal_uInt32 m_nTableDepth;
+
+ TableReference()
+ : m_bTableCellOpen(false),
+ m_bTableCellParaSdtOpen(false),
+ m_bTableCellChanged(false),
+ m_nTableDepth(0)
+ {
+ }
+};
+
+/** Using framePr, a paragraph can be enclosed in a frame described by its pPr paragraph settings,
+ * and therefore it needs to apply the frame's properties when exporting the paragraph properties.
+ */
+class FramePrHelper
+{
+ ww8::Frame* m_pFrame;
+ sal_Int32 m_nTableDepth;
+ bool m_bUseFrameBorders;
+ bool m_bUseFrameBackground;
+ bool m_bUseFrameTextDirection;
+
+public:
+ FramePrHelper()
+ : m_pFrame(nullptr)
+ , m_nTableDepth(0)
+ , m_bUseFrameBorders(true)
+ , m_bUseFrameBackground(true)
+ , m_bUseFrameTextDirection(true)
+ {}
+
+ ww8::Frame* Frame() { return m_pFrame; }
+ void SetFrame(ww8::Frame* pSet, sal_Int32 nTableDepth = -1);
+ bool UseFrameBorders(sal_Int32 nTableDepth);
+ void SetUseFrameBorders(bool bSet) { m_bUseFrameBorders = bSet; }
+ bool UseFrameBackground();
+ void SetUseFrameBackground(bool bSet) { m_bUseFrameBackground = bSet; }
+ bool UseFrameTextDirection(sal_Int32 nTableDepth);
+ void SetUseFrameTextDirection(bool bSet) { m_bUseFrameTextDirection = bSet; }
+};
+
+class SdtBlockHelper
+{
+public:
+ SdtBlockHelper()
+ : m_nId(0)
+ , m_bStartedSdt(false)
+ , m_bShowingPlaceHolder(false)
+ , m_nTabIndex(0)
+ , m_nSdtPrToken(0)
+ {}
+
+ sal_Int32 m_nId;
+ bool m_bStartedSdt;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pTokenChildren;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pTokenAttributes;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pTextAttrs;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pDataBindingAttrs;
+ OUString m_aColor;
+ OUString m_aAppearance;
+ OUString m_aPlaceHolderDocPart;
+ bool m_bShowingPlaceHolder;
+ OUString m_aAlias;
+ OUString m_aTag;
+ sal_Int32 m_nTabIndex;
+ OUString m_aLock;
+ sal_Int32 m_nSdtPrToken;
+
+ void DeleteAndResetTheLists();
+
+ void WriteSdtBlock(const ::sax_fastparser::FSHelperPtr& pSerializer, bool bRunTextIsOn, bool bParagraphHasDrawing);
+ void WriteExtraParams(const ::sax_fastparser::FSHelperPtr& pSerializer);
+
+ /// Closes a currently open SDT block.
+ void EndSdtBlock(const ::sax_fastparser::FSHelperPtr& pSerializer);
+
+ void GetSdtParamsFromGrabBag(const uno::Sequence<beans::PropertyValue>& aGrabBagSdt);
+};
+
+/// The class that has handlers for various resource types when exporting as DOCX.
+class DocxAttributeOutput : public AttributeOutputBase, public oox::vml::VMLTextExport, public oox::drawingml::DMLTextExport
+{
+public:
+ /// Export the state of RTL/CJK.
+ virtual void RTLAndCJKState( bool bIsRTL, sal_uInt16 nScript ) override;
+
+ /// Start of the paragraph.
+ virtual sal_Int32 StartParagraph(ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo,
+ bool bGenerateParaId) override;
+
+ /// End of the paragraph.
+ virtual void EndParagraph( ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner ) override;
+
+ /// Empty paragraph.
+ virtual void EmptyParagraph() override;
+
+ /// Called in order to output section breaks.
+ virtual void SectionBreaks(const SwNode& rNode) override;
+
+ /// Called before we start outputting the attributes.
+ virtual void StartParagraphProperties() override;
+
+ /// Called after we end outputting the attributes.
+ virtual void EndParagraphProperties(const SfxItemSet& rParagraphMarkerProperties, const SwRedlineData* pRedlineData, const SwRedlineData* pRedlineParagraphMarkerDeleted, const SwRedlineData* pRedlineParagraphMarkerInserted) override;
+
+ /// Start of the text run.
+ virtual void StartRun( const SwRedlineData* pRedlineData, sal_Int32 nPos, bool bSingleEmptyRun = false ) override;
+
+ /// End of the text run.
+ virtual void EndRun(const SwTextNode* pNode, sal_Int32 nPos, sal_Int32 nLen, bool bLastRun = false) override;
+
+ /// Called before we start outputting the attributes.
+ virtual void StartRunProperties() override;
+
+ /// Called after we end outputting the attributes.
+ virtual void EndRunProperties( const SwRedlineData* pRedlineData ) override;
+
+ virtual bool FootnoteEndnoteRefTag() override;
+
+ virtual void SectFootnoteEndnotePr() override;
+
+ virtual void WritePostitFieldReference() override;
+
+ /// Output text (inside a run).
+ virtual void RunText( const OUString& rText, rtl_TextEncoding eCharSet = RTL_TEXTENCODING_UTF8, const OUString& rSymbolFont = OUString() ) override;
+
+ /// Output text (without markup).
+ virtual void RawText(const OUString& rText, rtl_TextEncoding eCharSet) override;
+
+ /// Output ruby start.
+ virtual void StartRuby( const SwTextNode& rNode, sal_Int32 nPos, const SwFormatRuby& rRuby ) override;
+
+ /// Output ruby end.
+ virtual void EndRuby(const SwTextNode& rNode, sal_Int32 nPos) override;
+
+ /// Output URL start.
+ virtual bool StartURL( const OUString& rUrl, const OUString& rTarget ) override;
+
+ /// Output URL end.
+ virtual bool EndURL(bool) override;
+
+ virtual void FieldVanish(const OUString& rText, ww::eField eType, OUString const*) override;
+
+ /// Output redlining.
+ ///
+ /// The common attribute that can be among the run properties.
+ virtual void Redline( const SwRedlineData* pRedline ) override;
+
+ /// Output redlining.
+ ///
+ /// Start of the tag that encloses the run, fills the info according to
+ /// the value of pRedlineData.
+ void StartRedline( const SwRedlineData * pRedlineData, bool bLastRun );
+
+ /// Output redlining.
+ ///
+ /// End of the tag that encloses the run.
+ void EndRedline( const SwRedlineData * pRedlineData, bool bLastRun );
+
+ virtual void SetStateOfFlyFrame( FlyProcessingState nStateOfFlyFrame ) override;
+ virtual void SetAnchorIsLinkedToNode( bool bAnchorLinkedToNode ) override;
+ virtual bool IsFlyProcessingPostponed() override;
+ virtual void ResetFlyProcessingFlag() override;
+
+ virtual void FormatDrop( const SwTextNode& rNode, const SwFormatDrop& rSwFormatDrop, sal_uInt16 nStyle, ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo, ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner ) override;
+
+ /// Output style.
+ virtual void ParagraphStyle( sal_uInt16 nStyle ) override;
+
+ virtual void TableInfoCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ void TableDefaultCellMargins( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner );
+ virtual void TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableRowRedline( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableCellRedline( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableBidi( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableVerticalCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer_t pNodeInfoInner ) override;
+ virtual void TableOrientation( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableSpacing( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) override;
+ virtual void TableRowEnd( sal_uInt32 nDepth ) override;
+
+ /// Start of the styles table.
+ virtual void StartStyles() override;
+
+ /// End of the styles table.
+ virtual void EndStyles( sal_uInt16 nNumberOfStyles ) override;
+
+ /// Write default style.
+ virtual void DefaultStyle() override;
+
+ /// Write Doc Defaults
+ void DocDefaults( );
+
+ /// Write latent styles.
+ void LatentStyles();
+
+ /** Similar to OutputItem(), but write something only if it is not the default.
+
+ This is to output the docDefaults, and we should write something out
+ only in case it is not what MSO already uses for the document by default.
+ */
+ void OutputDefaultItem(const SfxPoolItem& rHt);
+
+ /// Start of a style in the styles table.
+ virtual void StartStyle( const OUString& rName, StyleType eType,
+ sal_uInt16 nBase, sal_uInt16 nNext, sal_uInt16 nLink, sal_uInt16 nWwId, sal_uInt16 nSlot,
+ bool bAutoUpdate ) override;
+
+ /// End of a style in the styles table.
+ virtual void EndStyle() override;
+
+ /// Start of (paragraph or run) properties of a style.
+ virtual void StartStyleProperties( bool bParProp, sal_uInt16 nStyle ) override;
+
+ /// End of (paragraph or run) properties of a style.
+ virtual void EndStyleProperties( bool bParProp ) override;
+
+ /// Numbering rule and Id.
+ virtual void OutlineNumbering(sal_uInt8 nLvl) override;
+
+ /// Page break
+ /// As a paragraph property - the paragraph should be on the next page.
+ virtual void PageBreakBefore( bool bBreak ) override;
+
+ /// Write a section break
+ /// msword::ColumnBreak or msword::PageBreak
+ /// bBreakAfter: the break must be scheduled for insertion in the end of current paragraph
+ virtual void SectionBreak( sal_uInt8 nC, bool bBreakAfter, const WW8_SepInfo* pSectionInfo = nullptr, bool bExtraPageBreak = false ) override;
+
+ // preserve DOCX page vertical alignment
+ virtual void TextVerticalAdjustment( const css::drawing::TextVerticalAdjust ) override;
+
+ /// Start of the section properties.
+ virtual void StartSection() override;
+
+ /// End of the section properties.
+ virtual void EndSection() override;
+
+ /// Protection of forms.
+ virtual void SectionFormProtection( bool bProtected ) override;
+
+ /// Numbering of the lines in the document.
+ virtual void SectionLineNumbering( sal_uLong nRestartNo, const SwLineNumberInfo& rLnNumInfo ) override;
+
+ /// Has different headers/footers for the title page.
+ virtual void SectionTitlePage() override;
+
+ /// Description of the page borders.
+ virtual void SectionPageBorders( const SwFrameFormat* pFormat, const SwFrameFormat* pFirstPageFormat ) override;
+
+ /// Columns populated from right/numbers on the right side?
+ virtual void SectionBiDi( bool bBiDi ) override;
+
+ /// The style of the page numbers.
+ ///
+ virtual void SectionPageNumbering( sal_uInt16 nNumType, const ::std::optional<sal_uInt16>& oPageRestartNumber ) override;
+
+ /// The type of breaking.
+ virtual void SectionType( sal_uInt8 nBreakCode ) override;
+
+ /// Start the font.
+ void StartFont( const OUString& rFamilyName ) const;
+
+ /// End the font.
+ void EndFont() const;
+
+ /// Alternate name for the font.
+ void FontAlternateName( const OUString& rName ) const;
+
+ /// Font charset.
+ void FontCharset( sal_uInt8 nCharSet, rtl_TextEncoding nEncoding ) const;
+
+ /// Font family.
+ void FontFamilyType( FontFamily eFamily ) const;
+
+ /// Font pitch.
+ void FontPitchType( FontPitch ePitch ) const;
+
+ /// Write out the font into the document, if it's an embedded font.
+ void EmbedFont( std::u16string_view name, FontFamily family, FontPitch pitch );
+
+ /// Definition of a numbering instance.
+ virtual void NumberingDefinition( sal_uInt16 nId, const SwNumRule &rRule ) override;
+
+ /// Numbering definition that overrides abstract numbering definition
+ virtual void OverrideNumberingDefinition( SwNumRule const& rRule,
+ sal_uInt16 nNum, sal_uInt16 nAbstractNum,
+ const std::map< size_t, size_t > & rLevelOverrides ) override;
+
+ /// Start of the abstract numbering definition instance.
+ virtual void StartAbstractNumbering( sal_uInt16 nId ) override;
+
+ /// End of the abstract numbering definition instance.
+ virtual void EndAbstractNumbering() override;
+
+ /// All the numbering level information.
+ virtual void NumberingLevel( sal_uInt8 nLevel,
+ sal_uInt16 nStart,
+ sal_uInt16 nNumberingType,
+ SvxAdjust eAdjust,
+ const sal_uInt8 *pNumLvlPos,
+ sal_uInt8 nFollow,
+ const wwFont *pFont,
+ const SfxItemSet *pOutSet,
+ sal_Int16 nIndentAt,
+ sal_Int16 nFirstLineIndex,
+ sal_Int16 nListTabPos,
+ const OUString &rNumberingString,
+ const SvxBrushItem* pBrush,
+ bool isLegal ) override;
+
+ void WriteField_Impl(const SwField* pField, ww::eField eType,
+ const OUString& rFieldCmd, FieldFlags nMode,
+ OUString const* pBookmarkName = nullptr);
+ void WriteFormData_Impl( const ::sw::mark::IFieldmark& rFieldmark );
+
+ void WriteBookmarks_Impl( std::vector< OUString >& rStarts, std::vector< OUString >& rEnds, const SwRedlineData* pRedlineData = nullptr );
+ void WriteFinalBookmarks_Impl( std::vector< OUString >& rStarts, std::vector< OUString >& rEnds );
+ void WriteAnnotationMarks_Impl( std::vector< OUString >& rStarts, std::vector< OUString >& rEnds );
+ /// End possibly opened paragraph sdt block.
+ void EndParaSdtBlock();
+
+ void WriteFloatingTable(ww8::Frame const* pParentFrame);
+
+private:
+ /// Initialize the structures where we are going to collect some of the paragraph properties.
+ ///
+ /// Some of the properties have to be collected from more sources, and are
+ /// actually not written between StartParagraphProperties and
+ /// EndParagraphProperties. They are output in this method, which is
+ /// supposed to be called just before outputting </rPr> whenever it is done.
+ void InitCollectedParagraphProperties();
+
+ /// Output what we collected during the run properties output.
+ ///
+ /// @see WriteCollectedParagrapProperties().
+ void WriteCollectedParagraphProperties();
+
+ /// Initialize the structures where we are going to collect some of the run properties.
+ ///
+ /// This is an equivalent of InitCollectedParagraphProperties(), resp.
+ /// WriteCollectectedParagraphProperties().
+ ///
+ /// @see InitCollectedParagraphProperties().
+ void InitCollectedRunProperties();
+
+ /// Output what we collected during the run properties output.
+ ///
+ /// @see InitCollectedRunproperties(), WriteCollectedParagraphProperties()
+ void WriteCollectedRunProperties();
+
+ /// Output graphic fly frames or replacement graphics for OLE nodes.
+ ///
+ /// For graphic frames, just use the first two parameters, for OLE
+ /// replacement graphics, set the first as 0, and pass the remaining three.
+ ///
+ /// @see WriteOLE2Obj()
+ void FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size& rSize, const SwFlyFrameFormat* pOLEFrameFormat, SwOLENode* pOLENode, const SdrObject* pSdrObj = nullptr);
+ void WriteSrcRect(const css::uno::Reference<css::beans::XPropertySet>& xShapePropSet,
+ const SwFrameFormat* pFrameFormat);
+ void WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& rNode, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat, const sal_Int8 nFormulaAlignment);
+ bool WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat);
+ bool WriteOLEMath( const SwOLENode& rNode, const sal_Int8 nAlign );
+ void PostponeOLE( SwOLENode& rNode, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat );
+ void WriteOLE( SwOLENode& rNode, const Size& rSize, const SwFlyFrameFormat* rFlyFrameFormat );
+ void WriteOLEShape(const SwFlyFrameFormat& rFrameFormat, const Size& rSize,
+ std::string_view rShapeId, const OUString& rImageId);
+ static OString GetOLEStyle(const SwFlyFrameFormat& rFormat, const Size& rSize);
+ void ExportOLESurround(const SwFormatSurround& rWrap);
+
+ void WriteActiveXControl(const SdrObject* pObject, const SwFrameFormat& rFrameFormat, bool bInsideRun);
+ bool ExportAsActiveXControl(const SdrObject* pObject) const;
+
+ void InitTableHelper( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner );
+ void StartTable( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner );
+ void StartTableRow( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner );
+ void StartTableCell( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner, sal_uInt32 nCell, sal_uInt32 nRow );
+ void TableCellProperties( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner, sal_uInt32 nCell, sal_uInt32 nRow );
+ void EndTableCell( sal_uInt32 nCell );
+ void EndTableRow( );
+ void EndTable();
+ void SyncNodelessCells(ww8::WW8TableNodeInfoInner::Pointer_t const & pInner, sal_Int32 nCell, sal_uInt32 nRow);
+ void PopulateFrameProperties(const SwFrameFormat* pFrameFormat, const Size& rSize);
+ static bool TextBoxIsFramePr(const SwFrameFormat& rFrameFormat);
+ /// End cell, row, and even the entire table if necessary.
+ void FinishTableRowCell( ww8::WW8TableNodeInfoInner::Pointer_t const & pInner, bool bForceEmptyParagraph = false );
+
+ void WriteFFData( const FieldInfos& rInfos );
+ void WritePendingPlaceholder();
+
+ void EmbedFontStyle( std::u16string_view name, int tag, FontFamily family, FontItalic italic, FontWeight weight,
+ FontPitch pitch );
+
+ /**
+ * Translate an ico value to the corresponding HighlightColorValues enumeration item
+ *
+ * @param[in] nIco ico value [0..16]
+ * @return color name (e.g. "red"), if color is inside [1..16] range
+ * empty string, otherwise
+ **/
+ static OString TransHighlightColor( sal_uInt8 nIco );
+protected:
+
+ /// Output frames - the implementation.
+ virtual void OutputFlyFrame_Impl( const ww8::Frame& rFormat, const Point& rNdTopLeft ) override;
+
+ /// Sfx item Sfx item RES_CHRATR_CASEMAP
+ virtual void CharCaseMap( const SvxCaseMapItem& rCaseMap ) override;
+
+ /// Sfx item Sfx item RES_CHRATR_COLOR
+ virtual void CharColor( const SvxColorItem& rColor) override;
+
+ /// Sfx item Sfx item RES_CHRATR_CONTOUR
+ virtual void CharContour( const SvxContourItem& rContour ) override;
+
+ /// Sfx item RES_CHRATR_CROSSEDOUT
+ virtual void CharCrossedOut( const SvxCrossedOutItem& rCrossedOut ) override;
+
+ /// Sfx item RES_CHRATR_ESCAPEMENT
+ virtual void CharEscapement( const SvxEscapementItem& rEscapement ) override;
+
+ /// Sfx item RES_CHRATR_FONT
+ virtual void CharFont( const SvxFontItem& rFont ) override;
+
+ /// Sfx item RES_CHRATR_FONTSIZE
+ virtual void CharFontSize( const SvxFontHeightItem& rFontSize ) override;
+
+ /// Sfx item RES_CHRATR_KERNING
+ virtual void CharKerning( const SvxKerningItem& rKerning ) override;
+
+ /// Sfx item RES_CHRATR_LANGUAGE
+ virtual void CharLanguage( const SvxLanguageItem& rLanguage ) override;
+
+ /// Sfx item RES_CHRATR_POSTURE
+ virtual void CharPosture( const SvxPostureItem& rPosture ) override;
+
+ /// Sfx item RES_CHRATR_SHADOWED
+ virtual void CharShadow( const SvxShadowedItem& rShadow ) override;
+
+ /// Sfx item RES_CHRATR_UNDERLINE
+ virtual void CharUnderline( const SvxUnderlineItem& rUnderline ) override;
+
+ /// Sfx item RES_CHRATR_WEIGHT
+ virtual void CharWeight( const SvxWeightItem& rWeight ) override;
+
+ /// Sfx item RES_CHRATR_AUTOKERN
+ virtual void CharAutoKern( const SvxAutoKernItem& ) override;
+
+ /// Sfx item RES_CHRATR_BLINK
+ virtual void CharAnimatedText( const SvxBlinkItem& rBlink ) override;
+
+ /// Sfx item RES_CHRATR_BACKGROUND
+ virtual void CharBackground( const SvxBrushItem& rBrush ) override;
+
+ /// Sfx item RES_CHRATR_CJK_FONT
+ virtual void CharFontCJK( const SvxFontItem& rFont ) override;
+
+ /// Sfx item RES_CHRATR_CJK_FONTSIZE
+ virtual void CharFontSizeCJK( const SvxFontHeightItem& rFontSize ) override { CharFontSize( rFontSize ); }
+
+ /// Sfx item RES_CHRATR_CJK_LANGUAGE
+ virtual void CharLanguageCJK( const SvxLanguageItem& rLanguageItem ) override { CharLanguage( rLanguageItem ); }
+
+ /// Sfx item RES_CHRATR_CJK_POSTURE
+ virtual void CharPostureCJK( const SvxPostureItem& rPosture ) override;
+
+ /// Sfx item RES_CHRATR_CJK_WEIGHT
+ virtual void CharWeightCJK( const SvxWeightItem& rWeight ) override;
+
+ /// Sfx item RES_CHRATR_CTL_FONT
+ virtual void CharFontCTL( const SvxFontItem& rFont ) override;
+
+ /// Sfx item RES_CHRATR_CTL_FONTSIZE
+ virtual void CharFontSizeCTL( const SvxFontHeightItem& rFontSize ) override { CharFontSize( rFontSize ); }
+
+ /// Sfx item RES_CHRATR_CTL_LANGUAGE
+ virtual void CharLanguageCTL( const SvxLanguageItem& rLanguageItem ) override { CharLanguage( rLanguageItem); }
+
+ /// Sfx item RES_CHRATR_CTL_POSTURE
+ virtual void CharPostureCTL( const SvxPostureItem& rWeight ) override;
+
+ /// Sfx item RES_CHRATR_CTL_WEIGHT
+ virtual void CharWeightCTL( const SvxWeightItem& rWeight ) override;
+
+ /// Sfx item RES_CHRATR_BidiRTL
+ virtual void CharBidiRTL( const SfxPoolItem& ) override;
+
+ /// Sfx item RES_CHRATR_IdctHint
+ virtual void CharIdctHint( const SfxPoolItem& ) override;
+
+ /// Sfx item RES_CHRATR_ROTATE
+ virtual void CharRotate( const SvxCharRotateItem& rRotate ) override;
+
+ /// Sfx item RES_CHRATR_EMPHASIS_MARK
+ virtual void CharEmphasisMark( const SvxEmphasisMarkItem& rEmphasisMark ) override;
+
+ /// Sfx item RES_CHRATR_TWO_LINES
+ virtual void CharTwoLines( const SvxTwoLinesItem& rTwoLines ) override;
+
+ /// Sfx item RES_CHRATR_SCALEW
+ virtual void CharScaleWidth( const SvxCharScaleWidthItem& rScaleWidth ) override;
+
+ /// Sfx item RES_CHRATR_RELIEF
+ virtual void CharRelief( const SvxCharReliefItem& rRelief) override;
+
+ /// Sfx item RES_CHRATR_HIDDEN
+ virtual void CharHidden( const SvxCharHiddenItem& rHidden ) override;
+
+ /// Sfx item RES_CHRATR_BOX
+ virtual void CharBorder( const ::editeng::SvxBorderLine* pAllBorder, const sal_uInt16 nDist, const bool bShadow ) override;
+
+ /// Sfx item RES_CHRATR_HIGHLIGHT
+ virtual void CharHighlight( const SvxBrushItem& rHighlight ) override;
+
+ /// Sfx item RES_TXTATR_INETFMT
+ virtual void TextINetFormat( const SwFormatINetFormat& ) override;
+
+ /// Sfx item RES_TXTATR_CHARFMT
+ virtual void TextCharFormat( const SwFormatCharFormat& ) override;
+
+ /// Sfx item RES_TXTATR_FTN
+ virtual void TextFootnote_Impl( const SwFormatFootnote& ) override;
+
+ /// Output the footnote/endnote reference (if there's one to output).
+ void FootnoteEndnoteReference();
+
+ /// Sfx item RES_PARATR_LINESPACING
+ virtual void ParaLineSpacing_Impl( short nSpace, short nMulti ) override;
+
+ /// Sfx item RES_PARATR_ADJUST
+ virtual void ParaAdjust( const SvxAdjustItem& rAdjust ) override;
+
+ /// Sfx item RES_PARATR_SPLIT
+ virtual void ParaSplit( const SvxFormatSplitItem& rSplit ) override;
+
+ /// Sfx item RES_PARATR_WIDOWS
+ virtual void ParaWidows( const SvxWidowsItem& rWidows ) override;
+
+ /// Sfx item RES_PARATR_TABSTOP
+ virtual void ParaTabStop( const SvxTabStopItem& rTabStop ) override;
+
+ /// Sfx item RES_PARATR_HYPHENZONE
+ virtual void ParaHyphenZone( const SvxHyphenZoneItem& ) override;
+
+ /// Sfx item RES_PARATR_NUMRULE
+ virtual void ParaNumRule_Impl( const SwTextNode *pTextNd, sal_Int32 nLvl, sal_Int32 nNumId ) override;
+
+ /// Sfx item RES_PARATR_SCRIPTSPACE
+ virtual void ParaScriptSpace( const SfxBoolItem& ) override;
+
+ /// Sfx item RES_PARATR_HANGINGPUNCTUATION
+ virtual void ParaHangingPunctuation( const SfxBoolItem& ) override;
+
+ /// Sfx item RES_PARATR_FORBIDDEN_RULES
+ virtual void ParaForbiddenRules( const SfxBoolItem& ) override;
+
+ /// Sfx item RES_PARATR_VERTALIGN
+ virtual void ParaVerticalAlign( const SvxParaVertAlignItem& rAlign ) override;
+
+ /// Sfx item RES_PARATR_SNAPTOGRID
+ virtual void ParaSnapToGrid( const SvxParaGridItem& ) override;
+
+ /// Sfx item RES_FRM_SIZE
+ virtual void FormatFrameSize( const SwFormatFrameSize& ) override;
+
+ /// Sfx item RES_PAPER_BIN
+ virtual void FormatPaperBin( const SvxPaperBinItem& ) override;
+
+ /// Sfx item RES_MARGIN_FIRSTLINE
+ virtual void FormatFirstLineIndent(const SvxFirstLineIndentItem & rFirstLine) override;
+ /// Sfx item RES_MARGIN_TEXTLEFT
+ virtual void FormatTextLeftMargin(const SvxTextLeftMarginItem & rTextLeftMargin) override;
+ /// Sfx item RES_MARGIN_RIGHT
+ virtual void FormatRightMargin(const SvxRightMarginItem & rRightMargin) override;
+
+ /// Sfx item RES_LR_SPACE
+ virtual void FormatLRSpace( const SvxLRSpaceItem& rLRSpace ) override;
+
+ /// Sfx item RES_UL_SPACE
+ virtual void FormatULSpace( const SvxULSpaceItem& rULSpace ) override;
+
+ /// Sfx item RES_SURROUND
+ virtual void FormatSurround( const SwFormatSurround& ) override;
+
+ /// Sfx item RES_VERT_ORIENT
+ virtual void FormatVertOrientation( const SwFormatVertOrient& ) override;
+
+ /// Sfx item RES_HORI_ORIENT
+ virtual void FormatHorizOrientation( const SwFormatHoriOrient& ) override;
+
+ /// Sfx item RES_ANCHOR
+ virtual void FormatAnchor( const SwFormatAnchor& ) override;
+
+ /// Sfx item RES_BACKGROUND
+ virtual void FormatBackground( const SvxBrushItem& ) override;
+
+ /// Sfx item RES_FILL_STYLE
+ virtual void FormatFillStyle( const XFillStyleItem& ) override;
+
+ /// Sfx item RES_FILL_GRADIENT
+ virtual void FormatFillGradient( const XFillGradientItem& ) override;
+
+ /// Sfx item RES_BOX
+ virtual void FormatBox( const SvxBoxItem& ) override;
+
+ /// Sfx item RES_COL
+ virtual void FormatColumns_Impl( sal_uInt16 nCols, const SwFormatCol & rCol, bool bEven, SwTwips nPageSize ) override;
+
+ /// Sfx item RES_KEEP
+ virtual void FormatKeep( const SvxFormatKeepItem& ) override;
+
+ /// Sfx item RES_TEXTGRID
+ virtual void FormatTextGrid( const SwTextGridItem& ) override;
+
+ /// Sfx item RES_LINENUMBER
+ virtual void FormatLineNumbering( const SwFormatLineNumber& ) override;
+
+ /// Sfx item RES_FRAMEDIR
+ virtual void FormatFrameDirection( const SvxFrameDirectionItem& ) override;
+
+ /// Sfx item RES_PARATR_GRABBAG
+ virtual void ParaGrabBag( const SfxGrabBagItem& ) override;
+
+ /// Sfx item RES_CHRATR_GRABBAG
+ virtual void CharGrabBag( const SfxGrabBagItem& ) override;
+
+ // Sfx item RES_PARATR_OUTLINELEVEL
+ virtual void ParaOutlineLevel( const SfxUInt16Item& ) override;
+
+ /// Write the expanded field
+ virtual void WriteExpand( const SwField* pField ) override;
+
+ virtual void RefField( const SwField& rField, const OUString& rRef ) override;
+ virtual void HiddenField( const SwField& rField ) override;
+ virtual void SetField( const SwField& rField, ww::eField eType, const OUString& rCmd ) override;
+ virtual void PostitField( const SwField* pField ) override;
+ virtual bool DropdownField( const SwField* pField ) override;
+ virtual bool PlaceholderField( const SwField* pField ) override;
+
+ virtual bool AnalyzeURL( const OUString& rURL, const OUString& rTarget, OUString* pLinkURL, OUString* pMark ) override;
+
+ virtual void WriteBookmarkInActParagraph( const OUString& rName, sal_Int32 nFirstRunPos, sal_Int32 nLastRunPos ) override;
+
+ void SectionRtlGutter( const SfxBoolItem& rRtlGutter) override;
+
+ void TextLineBreak(const SwFormatLineBreak& rLineBreak) override;
+
+ /// Writes a clearing line break at the end of run properties, if there are any.
+ void WriteLineBreak();
+
+private:
+
+ void DoWriteBookmarkTagStart(const OUString& bookmarkName);
+ void DoWriteBookmarkTagEnd(sal_Int32 nId);
+ void DoWriteMoveRangeTagStart(std::u16string_view bookmarkName,
+ bool bFrom, const SwRedlineData* pRedlineData);
+ void DoWriteMoveRangeTagEnd(sal_Int32 nId, bool bFrom);
+ void DoWriteBookmarksStart(std::vector<OUString>& rStarts, const SwRedlineData* pRedlineData = nullptr);
+ void DoWriteBookmarksEnd(std::vector<OUString>& rEnds);
+ void DoWriteBookmarkStartIfExist(sal_Int32 nRunPos);
+ void DoWriteBookmarkEndIfExist(sal_Int32 nRunPos);
+
+ void DoWritePermissionTagStart(std::u16string_view permission);
+ void DoWritePermissionTagEnd(std::u16string_view permission);
+ void DoWritePermissionsStart();
+ void DoWritePermissionsEnd();
+
+ void DoWriteAnnotationMarks( );
+ void WritePostponedGraphic();
+ void WritePostponedMath(const SwOLENode* pObject, sal_Int8 /*nAlign*/);
+ void WritePostponedFormControl(const SdrObject* pObject);
+ void WritePostponedActiveXControl(bool bInsideRun);
+ void WritePostponedDiagram();
+ void WritePostponedChart();
+ void WritePostponedOLE();
+ void WritePostponedDMLDrawing();
+ void WritePostponedCustomShape();
+ void WriteFlyFrame(const ww8::Frame& rFrame);
+
+ void WriteFormDateStart(const OUString& sFullDate, const OUString& sDateFormat, const OUString& sLang, const uno::Sequence<beans::PropertyValue>& aGrabBagSdt);
+ void WriteSdtPlainText(const OUString& sValue, const uno::Sequence<beans::PropertyValue>& aGrabBagSdt);
+ void WriteSdtDropDownStart(const OUString& rName, OUString const& rSelected, uno::Sequence<OUString> const& rListItems);
+ void WriteSdtDropDownEnd(OUString const& rSelected, uno::Sequence<OUString> const& rListItems);
+ void WriteContentControlStart();
+ void WriteContentControlEnd();
+
+ void StartField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun = false );
+ void DoWriteCmd( std::u16string_view rCmd );
+ void CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun );
+ void CmdEndField_Impl( const SwTextNode* pNode, sal_Int32 nPos, bool bWriteRun );
+ void EndField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos& rInfos );
+ void DoWriteFieldRunProperties( const SwTextNode* pNode, sal_Int32 nPos, bool bWriteCombChars = false );
+
+ /// Reference to the export, where to get the data from
+ DocxExport &m_rExport;
+
+ /// Fast serializer to output the data
+ ::sax_fastparser::FSHelperPtr m_pSerializer;
+
+ /// DrawingML access
+ oox::drawingml::DrawingML &m_rDrawingML;
+
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pFontsAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pEastAsianLayoutAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pCharLangAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pSectionSpacingAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pLRSpaceAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pParagraphSpacingAttrList;
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pHyperlinkAttrList;
+ std::shared_ptr<SwContentControl> m_pContentControl;
+ /// If the current SDT around runs should be ended before the current run.
+ bool m_bEndCharSdt;
+ /// Attributes of the run color
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pColorAttrList;
+ sal_uInt8 m_nCharTransparence = 0;
+ /// Attributes of the paragraph background
+ rtl::Reference<sax_fastparser::FastAttributeList> m_pBackgroundAttrList;
+ OUString m_sOriginalBackgroundColor;
+ OUString m_hyperLinkAnchor;
+ bool m_endPageRef;
+ std::unique_ptr<docx::FootnotesList> m_pFootnotesList;
+ std::unique_ptr<docx::FootnotesList> m_pEndnotesList;
+ int m_footnoteEndnoteRefTag;
+ OUString m_footnoteCustomLabel;
+ std::unique_ptr< const WW8_SepInfo > m_pSectionInfo;
+
+ /// Redline data to remember in the text run.
+ const SwRedlineData *m_pRedlineData;
+
+ /// Id of the redline
+ sal_Int32 m_nRedlineId;
+
+ /// Flag indicating that the section properties are being written
+ bool m_bOpenedSectPr;
+ /// Did we have a section break in this paragraph? Set by StartSection(), reset by the next StartParagraph().
+ bool m_bHadSectPr;
+
+ /// Flag indicating that the Run Text is being written
+ bool m_bRunTextIsOn;
+
+ /// Flag indicating that the header \ footer are being written
+ bool m_bWritingHeaderFooter;
+ bool m_bAnchorLinkedToNode;
+
+ /// Flag indicating that multiple runs of a field are being written
+ bool m_bWritingField;
+
+ /// Field data to remember in the text run
+ bool m_bPreventDoubleFieldsHandling;
+ std::vector< FieldInfos > m_Fields;
+ OUString m_sFieldBkm;
+ sal_Int32 m_nNextBookmarkId;
+ sal_Int32 m_nNextAnnotationMarkId;
+
+ /// [MS-DOCX] section 2.6.2.3
+ sal_Int32 m_nNextParaId = 1; // MUST be greater than 0
+
+ OUString m_sRawText;
+
+ /// The first frame (anchored to the main text) is 0.
+ /// The second frame what is anchored to the previous in, is 1
+ /// The third anchored inside the second is the 2 etc.
+ sal_uInt32 m_nEmbedFlyLevel;
+
+ /// Stores the flys what are anchored inside a fly
+ std::vector<ww8::Frame> m_vPostponedFlys;
+
+ /// Bookmarks to output
+ std::vector<OUString> m_rBookmarksStart;
+ std::vector<OUString> m_rBookmarksEnd;
+ SwRedlineData* m_pMoveRedlineData;
+
+ /// Bookmarks to output at the end
+ std::vector<OUString> m_rFinalBookmarksStart;
+ std::vector<OUString> m_rFinalBookmarksEnd;
+
+ /// Bookmarks of the current paragraph
+ std::multimap<sal_Int32, OUString> m_aBookmarksOfParagraphStart;
+ std::multimap<sal_Int32, OUString> m_aBookmarksOfParagraphEnd;
+
+ /// Permissions to output
+ std::vector<OUString> m_rPermissionsStart;
+ std::vector<OUString> m_rPermissionsEnd;
+
+ /// Annotation marks to output
+ std::vector<OUString> m_rAnnotationMarksStart;
+ std::vector<OUString> m_rAnnotationMarksEnd;
+
+ /// Maps of the bookmarks ids
+ std::map<OUString, sal_Int32> m_rOpenedBookmarksIds;
+
+ /// Name of the last opened bookmark.
+ OUString m_sLastOpenedBookmark;
+
+ /// Set of ids of the saved bookmarks (used only for moveRange, yet)
+ std::unordered_set<sal_Int32> m_rSavedBookmarksIds;
+
+ /// Maps of the annotation marks ids
+ std::map<OUString, sal_Int32> m_rOpenedAnnotationMarksIds;
+
+ /// Name of the last opened annotation mark.
+ OUString m_sLastOpenedAnnotationMark;
+
+ /// If there are bookmarks around sequence fields, this map contains the
+ /// names of these bookmarks for each sequence.
+ std::map<OUString, std::vector<OUString> > m_aSeqBookmarksNames;
+
+ /// GrabBag for text effects like glow, shadow, ...
+ std::vector<css::beans::PropertyValue> m_aTextEffectsGrabBag;
+
+ /// The current table helper
+ std::unique_ptr<SwWriteTable> m_xTableWrt;
+
+ FramePrHelper m_aFramePr;
+
+ bool m_bParagraphOpened;
+ bool m_bParagraphFrameOpen;
+ bool m_bIsFirstParagraph;
+ bool m_bAlternateContentChoiceOpen;
+ bool m_bPostponedProcessingFly;
+
+ // Remember that a column break has to be opened at the
+ // beginning of the next paragraph
+ DocxColBreakStatus m_nColBreakStatus;
+
+ // Remember that a page break has to be opened at the
+ // beginning of the next paragraph
+ bool m_bPostponedPageBreak;
+
+ // This paragraph must end with page break
+ bool m_bPageBreakAfter = false;
+
+ std::stack< std::vector<ww8::Frame> > m_aFramesOfParagraph;
+ o3tl::sorted_vector<const SwFrameFormat*> m_aFloatingTablesOfParagraph;
+ sal_Int32 m_nTextFrameLevel;
+
+ // close of hyperlink needed
+ bool m_closeHyperlinkInThisRun;
+ bool m_closeHyperlinkInPreviousRun;
+ // Count nested HyperLinks
+ std::vector<sal_Int32> m_nHyperLinkCount;
+ sal_Int16 m_nFieldsInHyperlink;
+
+ // If the exported numbering rule defines the outlines
+ bool m_bExportingOutline;
+
+ struct PostponedGraphic
+ {
+ PostponedGraphic( const SwGrfNode* n, Size s, const SdrObject* sObj )
+ : grfNode( n ), size( s ), pSdrObj(sObj) {};
+
+ const SwGrfNode* grfNode;
+ Size size;
+ const SdrObject* pSdrObj;
+ };
+ std::optional< std::vector<PostponedGraphic> > m_oPostponedGraphic;
+ struct PostponedDiagram
+ {
+ PostponedDiagram( const SdrObject* o, const SwFrameFormat* frm ) : object( o ), frame( frm ) {};
+ const SdrObject* object;
+ const SwFrameFormat* frame;
+ };
+ std::optional< std::vector<PostponedDiagram> > m_oPostponedDiagrams;
+
+ struct PostponedDrawing
+ {
+ PostponedDrawing( const SdrObject* sdrObj, const SwFrameFormat* frm) : object( sdrObj ), frame( frm ) {};
+ const SdrObject* object;
+ const SwFrameFormat* frame;
+ };
+ std::optional< std::vector<PostponedDrawing> > m_oPostponedDMLDrawings;
+ std::optional< std::vector<PostponedDrawing> > m_oPostponedCustomShape;
+
+ struct PostponedOLE
+ {
+ PostponedOLE( SwOLENode* rObject, const Size& rSize, const SwFlyFrameFormat* rFrame ) : object( rObject ), size( rSize ), frame( rFrame ) {};
+ SwOLENode* object;
+ const Size size;
+ const SwFlyFrameFormat* frame;
+ };
+ std::optional< std::vector<PostponedOLE> > m_oPostponedOLEs;
+
+ struct PostponedMathObjects
+ {
+ SwOLENode* pMathObject;
+ sal_Int8 nMathObjAlignment;
+ };
+ std::vector<PostponedMathObjects> m_aPostponedMaths;
+ /// count charts consistently for unit tests
+ unsigned int m_nChartCount;
+ struct PostponedChart
+ {
+ PostponedChart( const SdrObject* sdrObject, const Size& rSize, const SwFlyFrameFormat* rFrame ) : object(sdrObject), size(rSize), frame(rFrame) {};
+ const SdrObject* object;
+ const Size size;
+ const SwFlyFrameFormat* frame;
+ };
+ std::vector<PostponedChart> m_aPostponedCharts;
+ std::vector<const SdrObject*> m_aPostponedFormControls;
+ std::vector<PostponedDrawing> m_aPostponedActiveXControls;
+ const SwField* m_PendingPlaceholder;
+
+ /// Used to store the parent status of a PostIt (parent/child/neither)
+ enum class ParentStatus
+ {
+ None,
+ IsParent,
+ HasParent
+ };
+ struct PostItDOCXData{
+ sal_Int32 id;
+ sal_Int32 lastParaId = 0; // [MS-DOCX] 2.5.3.1 CT_CommentEx needs paraId attribute
+ ParentStatus parentStatus = ParentStatus::None;
+ size_t parentIndex = 0;
+ };
+ /// Maps postit fields to ID's, used in commentRangeStart/End, commentReference and comment.xml.
+ std::vector<std::pair<const SwPostItField*, PostItDOCXData>> m_postitFields;
+ /// Number of postit fields which already have a commentReference written.
+ unsigned int m_postitFieldsMaxId;
+ int m_anchorId;
+ int m_nextFontId;
+ struct EmbeddedFontRef
+ {
+ OString relId;
+ OString fontKey;
+ };
+
+ TableReference m_tableReference;
+
+ std::map< OUString, EmbeddedFontRef > m_FontFilesMap; // font file url to data
+
+ // Remember first cell (used for default borders/margins) of each table
+ std::vector<ww8::WW8TableNodeInfoInner::Pointer_t> m_TableFirstCells;
+ // Remember last open and closed cells on each level
+ std::vector<sal_Int32> m_LastOpenCell;
+ std::vector<sal_Int32> m_LastClosedCell;
+
+ std::optional<css::drawing::FillStyle> m_oFillStyle;
+ /// If FormatBox() already handled fill style / gradient.
+ bool m_bIgnoreNextFill;
+
+ editeng::WordPageMargins m_pageMargins;
+
+ std::shared_ptr<DocxTableStyleExport> m_pTableStyleExport;
+ // flag to check if auto spacing was set in original file
+ bool m_bParaBeforeAutoSpacing,m_bParaAfterAutoSpacing;
+ // store hardcoded value which was set during import.
+ sal_Int32 m_nParaBeforeSpacing,m_nParaAfterSpacing;
+
+ SdtBlockHelper m_aParagraphSdt;
+ SdtBlockHelper m_aRunSdt;
+
+ /// State of the Fly at current position
+ FlyProcessingState m_nStateOfFlyFrame;
+
+ /// Same as m_aParagraphSdtPrAlias, but its content is available till the SDT is closed.
+ OUString m_aStartedParagraphSdtPrAlias;
+
+ std::vector<std::map<SvxBoxItemLine, css::table::BorderLine2>> m_aTableStyleConfs;
+
+ std::optional<SwLineBreakClear> m_oLineBreakClear;
+
+public:
+ DocxAttributeOutput( DocxExport &rExport, const ::sax_fastparser::FSHelperPtr& pSerializer, oox::drawingml::DrawingML* pDrawingML );
+
+ virtual ~DocxAttributeOutput() override;
+
+ /// Return the right export class.
+ virtual DocxExport& GetExport() override;
+ const DocxExport& GetExport() const { return const_cast< DocxAttributeOutput* >( this )->GetExport(); }
+
+ /// For e.g. the output of the styles, we need to switch the serializer to another one.
+ void SetSerializer( ::sax_fastparser::FSHelperPtr const & pSerializer );
+
+ /// Occasionally need to use this serializer from the outside
+ const ::sax_fastparser::FSHelperPtr& GetSerializer( ) const { return m_pSerializer; }
+
+ /// Do we have any footnotes?
+ bool HasFootnotes() const;
+
+ /// Do we have any endnotes?
+ bool HasEndnotes() const;
+
+ /// Output the content of the footnotes.xml resp. endnotes.xml
+ void FootnotesEndnotes( bool bFootnotes );
+
+ /// writes the footnotePr/endnotePr (depending on tag) section
+ static void WriteFootnoteEndnotePr( ::sax_fastparser::FSHelperPtr const & fs, int tag, const SwEndNoteInfo& info, int listtag );
+
+ bool HasPostitFields() const;
+ enum class hasProperties { no, yes };
+ hasProperties WritePostitFields();
+ void WritePostItFieldsResolved();
+
+ /// VMLTextExport
+ virtual void WriteOutliner(const OutlinerParaObject& rParaObj) override;
+ virtual void WriteVMLTextBox(css::uno::Reference<css::drawing::XShape> xShape) override;
+ /// DMLTextExport
+ virtual void WriteTextBox(css::uno::Reference<css::drawing::XShape> xShape) override;
+ virtual css::uno::Reference<css::text::XTextFrame> GetUnoTextFrame(
+ css::uno::Reference<css::drawing::XShape> xShape) override;
+ virtual oox::drawingml::DrawingML& GetDrawingML() override;
+ virtual bool MaybeOutputBrushItem(SfxItemSet const&) override;
+
+ void BulletDefinition(int nId, const Graphic& rGraphic, Size aSize) override;
+
+ void SetWritingHeaderFooter( bool bWritingHeaderFooter ) { m_bWritingHeaderFooter = bWritingHeaderFooter; }
+ bool GetWritingHeaderFooter( ) const { return m_bWritingHeaderFooter; }
+ void SetAlternateContentChoiceOpen( bool bAltContentChoiceOpen ) { m_bAlternateContentChoiceOpen = bAltContentChoiceOpen; }
+ bool IsAlternateContentChoiceOpen( ) const { return m_bAlternateContentChoiceOpen; }
+ void GetSdtEndBefore(const SdrObject* pSdrObj);
+ bool IsFirstParagraph() const { return m_bIsFirstParagraph; }
+
+ /// Stores the table export state to the passed context and resets own state.
+ void pushToTableExportContext(DocxTableExportContext& rContext);
+ /// Restores from the remembered state.
+ void popFromTableExportContext(DocxTableExportContext const & rContext);
+
+ static OString convertToOOXMLHoriOrient(sal_Int16 nOrient, bool bIsPosToggle);
+ static OString convertToOOXMLVertOrient(sal_Int16 nOrient);
+ static OString convertToOOXMLVertOrientRel(sal_Int16 nOrientRel);
+ static OString convertToOOXMLHoriOrientRel(sal_Int16 nOrientRel);
+ static void ImplCellMargins( sax_fastparser::FSHelperPtr const & pSerializer, const SvxBoxItem& rBox, sal_Int32 tag, bool bUseStartEnd, const SvxBoxItem* pDefaultMargins = nullptr);
+ template <class... Args>
+ static void AddToAttrList(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, Args&&... args)
+ {
+ if (!pAttrList)
+ pAttrList = sax_fastparser::FastSerializerHelper::createAttrList();
+ pAttrList->add(std::forward<Args>(args)...);
+ }
+
+ static const sal_Int32 Tag_StartParagraph_1 = 1;
+ static const sal_Int32 Tag_StartParagraph_2 = 2;
+ static const sal_Int32 Tag_WriteSdtBlock = 3;
+ static const sal_Int32 Tag_StartParagraphProperties = 4;
+ static const sal_Int32 Tag_InitCollectedParagraphProperties = 5;
+ static const sal_Int32 Tag_StartRun_1 = 6;
+ static const sal_Int32 Tag_StartRun_2 = 7;
+ static const sal_Int32 Tag_StartRun_3 = 8;
+ static const sal_Int32 Tag_EndRun_1 = 9;
+ static const sal_Int32 Tag_EndRun_2 = 10;
+ static const sal_Int32 Tag_StartRunProperties = 11;
+ static const sal_Int32 Tag_InitCollectedRunProperties = 12;
+ static const sal_Int32 Tag_Redline_1 = 13;
+ static const sal_Int32 Tag_Redline_2 = 14;
+ static const sal_Int32 Tag_TableDefinition = 15;
+ static const sal_Int32 Tag_OutputFlyFrame = 16;
+ static const sal_Int32 Tag_StartSection = 17;
+};
+
+/**
+* All the information that should be stashed away when we're in the middle of
+* of a table export and still have to do something else, e.g. export a shape.
+*/
+struct DocxTableExportContext
+{
+ DocxAttributeOutput& m_rOutput;
+ ww8::WW8TableInfo::Pointer_t m_pTableInfo;
+ bool m_bTableCellOpen;
+ bool m_bStartedParaSdt;
+ bool m_bStartedRunSdt;
+ sal_uInt32 m_nTableDepth;
+ sal_Int32 m_nHyperLinkCount = 0;
+ DocxTableExportContext(DocxAttributeOutput& rOutput) : m_rOutput(rOutput) { m_rOutput.pushToTableExportContext(*this); }
+ ~DocxTableExportContext() { m_rOutput.popFromTableExportContext(*this); }
+};
+
+namespace docx {
+
+rtl::Reference<sax_fastparser::FastAttributeList> SurroundToVMLWrap(SwFormatSurround const& rSurround);
+
+}
+
+#endif // INCLUDED_SW_SOURCE_FILTER_WW8_DOCXATTRIBUTEOUTPUT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */