1
0
Fork 0
libreoffice/include/xmloff/txtparae.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

599 lines
23 KiB
C++

/* -*- 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_XMLOFF_TXTPARAE_HXX
#define INCLUDED_XMLOFF_TXTPARAE_HXX
#include <sal/config.h>
#include <rtl/ref.hxx>
#include <xmloff/dllapi.h>
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Reference.h>
#include <xmloff/maptype.hxx>
#include <xmloff/styleexp.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/SinglePropertySetInfoCache.hxx>
#include <xmloff/XMLTextListAutoStylePool.hxx>
#include <o3tl/sorted_vector.hxx>
#include <memory>
#include <span>
#include <vector>
class XMLTextListsHelper;
class SvXMLExport;
class SvXMLAutoStylePoolP;
class XMLTextFieldExport;
class XMLTextNumRuleInfo;
class XMLSectionExport;
class XMLIndexMarkExport;
class XMLRedlineExport;
class MultiPropertySetHelper;
enum class XMLShapeExportFlags;
class SvXMLExportPropertyMapper;
namespace com::sun::star
{
namespace beans { class XPropertySet; class XPropertyState;
class XPropertySetInfo; }
namespace container { class XEnumeration; class XIndexAccess; class XNameReplace; }
namespace drawing { class XShape; }
namespace text { class XTextContent; class XTextRange; class XText;
class XFootnote; class XTextFrame; class XTextSection;
class XTextField; }
}
namespace xmloff
{
class OFormLayerXMLExport;
class BoundFrameSets;
}
namespace basegfx
{
class B2DPoint;
}
enum class TextPNS
{
ODF,
EXTENSION
};
class XMLOFF_DLLPUBLIC XMLTextParagraphExport : public XMLStyleExport
{
struct Impl;
std::unique_ptr<Impl> m_xImpl;
// SvXMLExport& rExport;
SvXMLAutoStylePoolP& m_rAutoStylePool;
rtl::Reference < SvXMLExportPropertyMapper > m_xParaPropMapper;
rtl::Reference < SvXMLExportPropertyMapper > m_xTextPropMapper;
rtl::Reference < SvXMLExportPropertyMapper > m_xFramePropMapper;
rtl::Reference < SvXMLExportPropertyMapper > m_xAutoFramePropMapper;
rtl::Reference < SvXMLExportPropertyMapper > m_xSectionPropMapper;
rtl::Reference < SvXMLExportPropertyMapper > m_xRubyPropMapper;
const ::std::unique_ptr< ::xmloff::BoundFrameSets > m_pBoundFrameSets;
std::unique_ptr<XMLTextFieldExport> m_pFieldExport;
std::vector<OUString> maListElements;
XMLTextListAutoStylePool maListAutoPool;
std::unique_ptr<XMLSectionExport> m_pSectionExport;
std::unique_ptr<XMLIndexMarkExport> m_pIndexMarkExport;
/// may be NULL (if no redlines should be exported; e.g. in block mode)
std::unique_ptr<XMLRedlineExport> m_pRedlineExport;
bool m_bProgress;
bool m_bBlock;
// keep track of open rubies
OUString m_sOpenRubyText;
OUString m_sOpenRubyCharStyle;
bool m_bOpenRuby;
XMLTextListsHelper* mpTextListsHelper;
::std::vector< std::unique_ptr<XMLTextListsHelper> > maTextListsHelperStack;
struct DocumentListNodes;
std::unique_ptr<DocumentListNodes> mpDocumentListNodes;
std::vector<sal_Int32> maDocumentNodeOrder;
bool bInDocumentNodeOrderCollection = false;
o3tl::sorted_vector<css::uno::Reference<css::text::XTextFrame>> maFrameRecurseGuard;
o3tl::sorted_vector<css::uno::Reference<css::drawing::XShape>> maShapeRecurseGuard;
bool mbCollected;
enum class FrameType { Text, Graphic, Embedded, Shape };
public:
enum FieldmarkType { NONE, TEXT, CHECK }; // Used for simulating fieldmarks in OpenDocument 1.n Strict (for n <= 2). CHECK currently ignored.
void exportTextRangeSpan(
const css::uno::Reference< css::text::XTextRange > & rTextRange,
css::uno::Reference< css::beans::XPropertySet > const & xPropSet,
css::uno::Reference < css::beans::XPropertySetInfo > & xPropSetInfo,
const bool bIsUICharStyle,
const bool bHasAutoStyle,
const OUString& sStyle,
bool& rPrevCharIsSpace,
FieldmarkType& openFieldMark);
private:
// Implement Title/Description Elements UI (#i73249#)
static constexpr OUString gsAnchorCharStyleName = u"AnchorCharStyleName"_ustr;
static constexpr OUString gsBeginNotice = u"BeginNotice"_ustr;
static constexpr OUString gsCategory = u"Category"_ustr;
static constexpr OUString gsCharStyleName = u"CharStyleName"_ustr;
static constexpr OUString gsCharStyleNames = u"CharStyleNames"_ustr;
static constexpr OUString gsEndNotice = u"EndNotice"_ustr;
static constexpr OUString gsFootnote = u"Footnote"_ustr;
static constexpr OUString gsFootnoteCounting = u"FootnoteCounting"_ustr;
static constexpr OUString gsNumberingType = u"NumberingType"_ustr;
static constexpr OUString gsPageDescName = u"PageDescName"_ustr;
static constexpr OUString gsPageStyleName = u"PageStyleName"_ustr;
static constexpr OUString gsParaStyleName = u"ParaStyleName"_ustr;
static constexpr OUString gsPositionEndOfDoc = u"PositionEndOfDoc"_ustr;
static constexpr OUString gsPrefix = u"Prefix"_ustr;
static constexpr OUString gsReferenceId = u"ReferenceId"_ustr;
static constexpr OUString gsStartAt = u"StartAt"_ustr;
static constexpr OUString gsSuffix = u"Suffix"_ustr;
static constexpr OUString gsTextEndnoteService = u"com.sun.star.text.Endnote"_ustr;
static constexpr OUString gsTextSection = u"TextSection"_ustr;
protected:
static constexpr OUString gsFrameStyleName = u"FrameStyleName"_ustr;
SinglePropertySetInfoCache m_aCharStyleNamesPropInfoCache;
SvXMLAutoStylePoolP& GetAutoStylePool() { return m_rAutoStylePool; }
const SvXMLAutoStylePoolP& GetAutoStylePool() const { return m_rAutoStylePool; }
public:
const rtl::Reference < SvXMLExportPropertyMapper >& GetParaPropMapper() const
{
return m_xParaPropMapper;
}
const rtl::Reference < SvXMLExportPropertyMapper >& GetTextPropMapper() const
{
return m_xTextPropMapper;
}
const rtl::Reference < SvXMLExportPropertyMapper >& GetAutoFramePropMapper() const
{
return m_xAutoFramePropMapper;
}
const rtl::Reference < SvXMLExportPropertyMapper >& GetSectionPropMapper() const
{
return m_xSectionPropMapper;
}
const rtl::Reference < SvXMLExportPropertyMapper >& GetRubyPropMapper() const
{
return m_xRubyPropMapper;
}
OUString FindTextStyle(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
bool& rbHasCharStyle,
bool& rbHasAutoStyle,
const XMLPropertyState** pAddState = nullptr) const;
void exportTextRangeEnumeration(
const css::uno::Reference< css::container::XEnumeration > & rRangeEnum,
bool bAutoStyles, bool bProgress, bool & rPrevCharIsSpace);
protected:
XMLShapeExportFlags addTextFrameAttributes(
const css::uno::Reference< css::beans::XPropertySet >& rPropSet,
bool bShape,
basegfx::B2DPoint* pCenter = nullptr,
OUString *pMinHeightValue = nullptr,
OUString *pMinWidthValue = nullptr );
virtual void exportStyleAttributes(
const css::uno::Reference< css::style::XStyle > & rStyle ) override final;
void exportPageFrames( bool bProgress );
void exportFrameFrames( bool bAutoStyles, bool bProgress,
const css::uno::Reference< css::text::XTextFrame >& rParentTxtFrame );
void exportNumStyles( bool bUsed );
void exportText(
const css::uno::Reference <
css::text::XText > & rText,
bool bAutoStyles, bool bProgress, bool bExportParagraph, TextPNS eExtensionNS = TextPNS::ODF );
void exportText(
const css::uno::Reference< css::text::XText > & rText,
const css::uno::Reference< css::text::XTextSection > & rBaseSection,
bool bAutoStyles, bool bProgress, bool bExportParagraph );
void exportTextContentEnumeration(
const css::uno::Reference< css::container::XEnumeration > & rContentEnum,
bool bAutoStyles,
const css::uno::Reference< css::text::XTextSection > & rBaseSection,
bool bProgress,
bool bExportParagraph = true,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet = nullptr,
TextPNS eExtensionNS = TextPNS::ODF);
void exportParagraph(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles, bool bProgress,
bool bExportParagraph,
MultiPropertySetHelper& rPropSetHelper,
TextPNS eExtensionNS);
virtual void exportTable(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles, bool bProgress );
void exportTextField(
const css::uno::Reference< css::text::XTextRange > & rTextRange,
bool bAutoStyles, bool bProgress, bool * pPrevCharIsSpace);
void exportTextField(
const css::uno::Reference< css::text::XTextField> & xTextField,
const bool bAutoStyles, const bool bProgress,
const bool bRecursive, bool * pPrevCharIsSpace);
void exportTextFieldStartEnd(
const css::uno::Reference< css::beans::XPropertySet > & xPropSet,
const bool bAutoStyles);
void exportAnyTextFrame(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
FrameType eTxpe,
bool bAutoStyles, bool bProgress, bool bExportContent,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet );
void _exportTextFrame(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const css::uno::Reference< css::beans::XPropertySetInfo > & rPropSetInfo,
bool bProgress );
inline void exportTextFrame(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles, bool bProgress, bool bExportContent,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet = nullptr );
inline void exportShape(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet = nullptr );
void exportContour(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const css::uno::Reference< css::beans::XPropertySetInfo > & rPropSetInfo );
void _exportTextGraphic(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const css::uno::Reference< css::beans::XPropertySetInfo > & rPropSetInfo );
inline void exportTextGraphic(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet = nullptr );
virtual void _collectTextEmbeddedAutoStyles(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet );
virtual void _exportTextEmbedded(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const css::uno::Reference< css::beans::XPropertySetInfo > & rPropSetInfo );
inline void exportTextEmbedded(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet = nullptr );
/// export a footnote and styles
void exportTextFootnote(
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const OUString& sString,
bool bAutoStyles, bool bProgress );
/// helper for exportTextFootnote
void exportTextFootnoteHelper(
const css::uno::Reference< css::text::XFootnote > & rPropSet,
const css::uno::Reference< css::text::XText> & rText,
const OUString& sString,
bool bAutoStyles,
bool bIsEndnote, bool bProgress );
/// export footnote and endnote configuration elements
void exportTextFootnoteConfiguration();
void exportTextFootnoteConfigurationHelper(
const css::uno::Reference< css::beans::XPropertySet> & rFootnoteSupplier,
bool bIsEndnote);
void exportTextMark(
const css::uno::Reference< css::beans::XPropertySet> & xPropSet,
const OUString& rProperty,
const enum ::xmloff::token::XMLTokenEnum pElements[],
bool bAutoStyles);
void exportSoftPageBreak();
void exportTextLineBreak(const css::uno::Reference<css::beans::XPropertySet>& xPropSet);
void exportTextRange(
const css::uno::Reference< css::text::XTextRange > & rTextRange,
bool bAutoStyles,
bool& rPrevCharWasSpace,
FieldmarkType& openFieldmarkType );
void exportListChange( const XMLTextNumRuleInfo& rPrvInfo,
const XMLTextNumRuleInfo& rNextInfo );
/// check if current section or current list has changed;
/// calls exportListChange as appropriate
void exportListAndSectionChange(
css::uno::Reference< css::text::XTextSection > & rOldSection,
const css::uno::Reference< css::text::XTextSection > & rNewSection,
const XMLTextNumRuleInfo& rOldList,
const XMLTextNumRuleInfo& rNewList,
bool bAutoStyles );
/// overload for exportListAndSectionChange;
/// takes new content rather than new section.
void exportListAndSectionChange(
css::uno::Reference< css::text::XTextSection > & rOldSection,
const css::uno::Reference< css::text::XTextContent > & rNewContent,
const XMLTextNumRuleInfo& rOldList,
const XMLTextNumRuleInfo& rNewList,
bool bAutoStyles );
void exportListAndSectionChange(
css::uno::Reference< css::text::XTextSection > & rOldSection,
MultiPropertySetHelper& rPropSetHelper,
sal_Int16 nTextSectionId,
const css::uno::Reference< css::text::XTextContent > & rNewContent,
const XMLTextNumRuleInfo& rOldList,
const XMLTextNumRuleInfo& rNewList,
bool bAutoStyles );
/// export a ruby
void exportRuby(
const css::uno::Reference< css::beans::XPropertySet> & rPortionPropSet,
bool bAutoStyles );
/// export a text:meta
void exportMeta(
const css::uno::Reference< css::beans::XPropertySet> & i_xPortion,
bool i_bAutoStyles, bool i_isProgress, bool & rPrevCharIsSpace);
/// Exports a <loext:content-control> element.
void ExportContentControl(const css::uno::Reference<css::beans::XPropertySet>& xPortion,
bool bAutoStyles, bool isProgress, bool& rPrevCharIsSpace);
bool isAutoStylesCollected() const { return mbCollected; }
virtual void exportTableAutoStyles();
public:
XMLTextParagraphExport(
SvXMLExport& rExp,
SvXMLAutoStylePoolP & rASP
);
virtual ~XMLTextParagraphExport() override;
/// add autostyle for specified family
void Add(
XmlStyleFamily nFamily,
MultiPropertySetHelper& rPropSetHelper,
const css::uno::Reference< css::beans::XPropertySet > & rPropSet );
void Add(
XmlStyleFamily nFamily,
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
std::span<const XMLPropertyState> aAddStates = {}, bool bDontSeek = false );
/// find style name for specified family and parent
OUString Find(
XmlStyleFamily nFamily,
const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const OUString& rParent,
const std::span<const XMLPropertyState> aAddStates = {} ) const;
static SvXMLExportPropertyMapper *CreateShapeExtPropMapper(
SvXMLExport& rExport );
static SvXMLExportPropertyMapper *CreateCharExtPropMapper(
SvXMLExport& rExport);
static SvXMLExportPropertyMapper *CreateParaExtPropMapper(
SvXMLExport& rExport);
static SvXMLExportPropertyMapper *CreateParaDefaultExtPropMapper(
SvXMLExport& rExport);
// This methods exports all (or all used) styles
void exportTextStyles( bool bUsed, bool bProg );
/// This method exports (text field) declarations etc.
void exportTextDeclarations();
/// export the (text field) declarations for a particular XText
void exportTextDeclarations(
const css::uno::Reference< css::text::XText > & rText );
/// export all declarations
void exportUsedDeclarations();
/// Export the list of change information (enclosed by <tracked-changes>)
/// (or the necessary automatic styles)
void exportTrackedChanges(bool bAutoStyle);
/// Export the list of change information (enclosed by <tracked-changes>)
/// (or the necessary automatic styles)
void exportTrackedChanges(const css::uno::Reference< css::text::XText > & rText,
bool bAutoStyle );
/// Record tracked changes for this particular XText
/// (empty reference stop recording)
/// This should be used if tracked changes for e.g. footers are to
/// be exported separately via the exportTrackedChanges(bool,
/// Reference<XText>) method.
void recordTrackedChangesForXText(
const css::uno::Reference< css::text::XText > & rText );
/// Stop recording tracked changes.
/// This is the same as calling recordTrackedChanges(...) with an
/// empty reference.
void recordTrackedChangesNoXText();
// This method exports the given OUString
void exportCharacterData(
const OUString& rText,
bool& rPrevCharWasSpace);
// This method collects all automatic styles for the given XText
void collectTextAutoStyles(
const css::uno::Reference< css::text::XText > & rText,
bool bIsProgress = false,
bool bExportParagraph = true )
{
exportText( rText, true, bIsProgress, bExportParagraph );
}
void collectTextAutoStyles(
const css::uno::Reference< css::text::XText > & rText,
const css::uno::Reference< css::text::XTextSection > & rBaseSection,
bool bIsProgress )
{
exportText( rText, rBaseSection, true, bIsProgress, true/*bExportParagraph*/ );
}
void collectTextAutoStylesAndNodeExportOrder(bool bIsProgress);
// This method exports all automatic styles that have been collected.
void exportTextAutoStyles();
void exportEvents( const css::uno::Reference< css::beans::XPropertySet > & rPropSet );
// Implement Title/Description Elements UI (#i73249#)
void exportTitleAndDescription( const css::uno::Reference< css::beans::XPropertySet > & rPropSet,
const css::uno::Reference< css::beans::XPropertySetInfo > & rPropSetInfo );
// This method exports the given XText
void exportText(
const css::uno::Reference< css::text::XText > & rText,
bool bIsProgress = false,
bool bExportParagraph = true, TextPNS eExtensionNS = TextPNS::ODF)
{
exportText( rText, false, bIsProgress, bExportParagraph, eExtensionNS );
}
void exportText(
const css::uno::Reference< css::text::XText > & rText,
const css::uno::Reference< css::text::XTextSection > & rBaseSection,
bool bIsProgress)
{
exportText( rText, rBaseSection, false, bIsProgress, true/*bExportParagraph*/ );
}
void exportFramesBoundToPage( bool bIsProgress )
{
exportPageFrames( bIsProgress );
}
inline const XMLTextListAutoStylePool& GetListAutoStylePool() const;
void SetBlockMode( bool bSet ) { m_bBlock = bSet; }
bool IsBlockMode() const { return m_bBlock; }
const rtl::Reference < SvXMLExportPropertyMapper >& GetParagraphPropertyMapper() const
{
return m_xParaPropMapper;
}
/** exclude form controls which are in mute sections.
*
* This method is necessary to prevent the form layer export from exporting
* control models whose controls are not represented in the document. To
* achieve this, this method iterates over all shapes, checks to see if
* they are control shapes, and if so, whether they should be exported or
* not. If not, the form layer export will be notified accordingly.
*
* The reason this method is located here is that it needs to access the
* XMLSectionExport, which is only available here.
*/
void PreventExportOfControlsInMuteSections(
const css::uno::Reference< css::container::XIndexAccess> & rShapes,
const rtl::Reference<xmloff::OFormLayerXMLExport>& xFormExport );
SinglePropertySetInfoCache& GetCharStyleNamesPropInfoCache() { return m_aCharStyleNamesPropInfoCache; }
void PushNewTextListsHelper();
void PopTextListsHelper();
private:
void RecordNodeIndex(const css::uno::Reference<css::text::XTextContent>& xTextContent);
bool ShouldSkipListId(const css::uno::Reference<css::text::XTextContent>& xTextContent);
bool ExportListId() const;
XMLTextParagraphExport(XMLTextParagraphExport const &) = delete;
};
inline const XMLTextListAutoStylePool&
XMLTextParagraphExport::GetListAutoStylePool() const
{
return maListAutoPool;
}
inline void XMLTextParagraphExport::exportTextFrame(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles, bool bIsProgress, bool bExportContent,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet)
{
exportAnyTextFrame( rTextContent, FrameType::Text, bAutoStyles, bIsProgress,
bExportContent, pRangePropSet );
}
inline void XMLTextParagraphExport::exportTextGraphic(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet )
{
exportAnyTextFrame( rTextContent, FrameType::Graphic, bAutoStyles, false,
true, pRangePropSet );
}
inline void XMLTextParagraphExport::exportTextEmbedded(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet )
{
exportAnyTextFrame( rTextContent, FrameType::Embedded, bAutoStyles, false,
true, pRangePropSet );
}
inline void XMLTextParagraphExport::exportShape(
const css::uno::Reference< css::text::XTextContent > & rTextContent,
bool bAutoStyles,
const css::uno::Reference< css::beans::XPropertySet > *pRangePropSet )
{
exportAnyTextFrame( rTextContent, FrameType::Shape, bAutoStyles, false,
true, pRangePropSet );
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */