/* -*- 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_INC_TOX_HXX #define INCLUDED_SW_INC_TOX_HXX #include #include #include #include #include #include #include #include #include #include "calbck.hxx" #include "hints.hxx" #include "swtypes.hxx" #include "toxe.hxx" namespace com::sun::star { namespace text { class XDocumentIndexMark; } } class SwTOXType; class SwTOXMark; class SwTextTOXMark; class SwDoc; class SwRootFrame; class SwContentFrame; typedef std::vector SwTOXMarks; namespace sw { struct CollectTextMarksHint final : SfxHint { SwTOXMarks& m_rMarks; CollectTextMarksHint(SwTOXMarks& rMarks) : m_rMarks(rMarks) {} }; struct FindContentFrameHint final : SfxHint { SwContentFrame*& m_rpContentFrame; const SwDoc& m_rDoc; const SwRootFrame& m_rLayout; FindContentFrameHint(SwContentFrame*& rpContentFrame, const SwDoc& rDoc, const SwRootFrame& rLayout) : m_rpContentFrame(rpContentFrame) , m_rDoc(rDoc) , m_rLayout(rLayout) {} }; struct CollectTextTOXMarksForLayoutHint final : SfxHint { std::vector>& m_rMarks; const SwRootFrame* m_pLayout; CollectTextTOXMarksForLayoutHint(std::vector>& rMarks, const SwRootFrame* pLayout) : m_rMarks(rMarks), m_pLayout(pLayout) {} }; SW_DLLPUBLIC auto PrepareJumpToTOXMark(SwDoc const& rDoc, OUString const& rName) -> std::optional>; } // Entry of content index, alphabetical index or user defined index extern const sal_Unicode C_NUM_REPL; extern const sal_Unicode C_END_PAGE_NUM; class SW_DLLPUBLIC SwTOXMark final : public SfxPoolItem , public sw::BroadcastingModify , public SvtListener { friend void InitCore(); friend class SwTextTOXMark; const SwTOXType* m_pType; OUString m_aAltText; // Text of caption is different. OUString m_aPrimaryKey; OUString m_aSecondaryKey; // three more strings for phonetic sorting OUString m_aTextReading; OUString m_aPrimaryKeyReading; OUString m_aSecondaryKeyReading; SwTextTOXMark* m_pTextAttr; sal_uInt16 m_nLevel; OUString m_aBookmarkName; bool m_bAutoGenerated; // generated using a concordance file bool m_bMainEntry; // main entry emphasized by character style css::uno::WeakReference m_wXDocumentIndexMark; SwTOXMark(); // to create the default attribute in InitCore virtual void Notify(const SfxHint& rHint) override; public: // single argument ctors shall be explicit. explicit SwTOXMark( const SwTOXType* pTyp ); virtual ~SwTOXMark() override; SwTOXMark( const SwTOXMark& rCopy ); SwTOXMark& operator=( const SwTOXMark& rCopy ); // "pure virtual methods" of SfxPoolItem virtual bool operator==( const SfxPoolItem& ) const override; virtual SwTOXMark* Clone( SfxItemPool* pPool = nullptr ) const override; void InvalidateTOXMark(); OUString GetText(SwRootFrame const* pLayout) const; inline bool IsAlternativeText() const; inline const OUString& GetAlternativeText() const; inline void SetAlternativeText( const OUString& rAlt ); // content or user defined index inline void SetLevel(sal_uInt16 nLevel); inline sal_uInt16 GetLevel() const; inline void SetBookmarkName( const OUString& bName); inline const OUString& GetBookmarkName() const; // for alphabetical index only inline void SetPrimaryKey(const OUString& rStr ); inline void SetSecondaryKey(const OUString& rStr); inline void SetTextReading(const OUString& rStr); inline void SetPrimaryKeyReading(const OUString& rStr ); inline void SetSecondaryKeyReading(const OUString& rStr); inline OUString const & GetPrimaryKey() const; inline OUString const & GetSecondaryKey() const; inline OUString const & GetTextReading() const; inline OUString const & GetPrimaryKeyReading() const; inline OUString const & GetSecondaryKeyReading() const; bool IsAutoGenerated() const {return m_bAutoGenerated;} void SetAutoGenerated(bool bSet) {m_bAutoGenerated = bSet;} bool IsMainEntry() const {return m_bMainEntry;} void SetMainEntry(bool bSet) { m_bMainEntry = bSet;} inline const SwTOXType* GetTOXType() const; const SwTextTOXMark* GetTextTOXMark() const { return m_pTextAttr; } SwTextTOXMark* GetTextTOXMark() { return m_pTextAttr; } SAL_DLLPRIVATE css::uno::WeakReference const& GetXTOXMark() const { return m_wXDocumentIndexMark; } SAL_DLLPRIVATE void SetXTOXMark(css::uno::Reference const& xMark) { m_wXDocumentIndexMark = xMark; } void RegisterToTOXType( SwTOXType& rMark ); static constexpr OUStringLiteral S_PAGE_DELI = u", "; }; // index types class SwTOXType final: public sw::BroadcastingModify { public: SwTOXType(SwDoc& rDoc, TOXTypes eTyp, const OUString& rName); // @@@ public copy ctor, but no copy assignment? SwTOXType(const SwTOXType& rCopy); inline const OUString& GetTypeName() const; inline TOXTypes GetType() const; SwDoc& GetDoc() const { return m_rDoc; } void CollectTextMarks(SwTOXMarks& rMarks) const { const_cast(this)->GetNotifier().Broadcast(sw::CollectTextMarksHint(rMarks)); } SwContentFrame* FindContentFrame(const SwDoc& rDoc, const SwRootFrame& rLayout) const { SwContentFrame* pContentFrame = nullptr; const_cast(this)->GetNotifier().Broadcast(sw::FindContentFrameHint(pContentFrame, rDoc, rLayout)); return pContentFrame; } void CollectTextTOXMarksForLayout(std::vector>& rMarks, const SwRootFrame* pLayout) const { const_cast(this)->GetNotifier().Broadcast(sw::CollectTextTOXMarksForLayoutHint(rMarks, pLayout)); } private: SwDoc& m_rDoc; OUString m_aName; TOXTypes m_eType; // @@@ public copy ctor, but no copy assignment? SwTOXType & operator= (const SwTOXType &) = delete; }; // Structure of the index lines #define FORM_TITLE 0 #define FORM_ALPHA_DELIMITER 1 #define FORM_PRIMARY_KEY 2 #define FORM_SECONDARY_KEY 3 #define FORM_ENTRY 4 /* Pattern structure - entry number - entry text - entry text and number - tab stop - chapter info n = {0, 1, 2, 3, 4 } values of SwChapterFormat - text token <#> - Page number <# CharStyleName,PoolId> - Link start - Link end - Authority entry field */ // These enum values are stored and must not be changed! enum FormTokenType { TOKEN_ENTRY_NO, TOKEN_ENTRY_TEXT, TOKEN_ENTRY, TOKEN_TAB_STOP, TOKEN_TEXT, TOKEN_PAGE_NUMS, TOKEN_CHAPTER_INFO, TOKEN_LINK_START, TOKEN_LINK_END, TOKEN_AUTHORITY, TOKEN_END }; struct SW_DLLPUBLIC SwFormToken { OUString sText; OUString sCharStyleName; SwTwips nTabStopPosition; FormTokenType eTokenType; sal_uInt16 nPoolId; SvxTabAdjust eTabAlign; sal_uInt16 nChapterFormat; //SwChapterFormat; sal_uInt16 nOutlineLevel;//the maximum permitted outline level in numbering sal_uInt16 nAuthorityField; //enum ToxAuthorityField sal_Unicode cTabFillChar; bool bWithTab; // true: do generate tab // character only the tab stop // #i21237# SwFormToken(FormTokenType eType ) : nTabStopPosition(0), eTokenType(eType), nPoolId(USHRT_MAX), eTabAlign( SvxTabAdjust::Left ), nChapterFormat(0 /*CF_NUMBER*/), nOutlineLevel(MAXLEVEL), //default to maximum outline level nAuthorityField(0 /*AUTH_FIELD_IDENTIFIER*/), cTabFillChar(' '), bWithTab(true) // #i21237# {} OUString GetString() const; }; struct SwFormTokenEqualToFormTokenType { FormTokenType eType; SwFormTokenEqualToFormTokenType(FormTokenType _eType) : eType(_eType) {} bool operator()(const SwFormToken & rToken) { return rToken.eTokenType == eType; } }; /// Vector of tokens. typedef std::vector SwFormTokens; /** Helper class that converts vectors of tokens to strings and vice versa. */ class SwFormTokensHelper { /// the tokens SwFormTokens m_Tokens; public: /** constructor @param rStr string representation of the tokens */ SwFormTokensHelper(const OUString & rStr); /** Returns vector of tokens. @return vector of tokens */ const SwFormTokens & GetTokens() const { return m_Tokens; } }; class SW_DLLPUBLIC SwForm { SwFormTokens m_aPattern[ AUTH_TYPE_END + 1 ]; // #i21237# OUString m_aTemplate[ AUTH_TYPE_END + 1 ]; TOXTypes m_eType; sal_uInt16 m_nFormMaxLevel; bool m_bIsRelTabPos : 1; bool m_bCommaSeparated : 1; public: SwForm( TOXTypes eTOXType = TOX_CONTENT ); SwForm( const SwForm& rForm ); SwForm& operator=( const SwForm& rForm ); inline void SetTemplate(sal_uInt16 nLevel, const OUString& rName); inline OUString const & GetTemplate(sal_uInt16 nLevel) const; // #i21237# void SetPattern(sal_uInt16 nLevel, SwFormTokens&& rName); void SetPattern(sal_uInt16 nLevel, const OUString& rStr); const SwFormTokens& GetPattern(sal_uInt16 nLevel) const; // fill tab stop positions from template to pattern- #i21237# void AdjustTabStops( SwDoc const & rDoc ); inline TOXTypes GetTOXType() const; inline sal_uInt16 GetFormMax() const; bool IsRelTabPos() const { return m_bIsRelTabPos; } void SetRelTabPos( bool b ) { m_bIsRelTabPos = b; } bool IsCommaSeparated() const { return m_bCommaSeparated;} void SetCommaSeparated( bool b) { m_bCommaSeparated = b;} static sal_uInt16 GetFormMaxLevel( TOXTypes eType ); static OUString GetFormEntry(); static OUString GetFormTab(); static OUString GetFormPageNums(); static OUString GetFormLinkStt(); static OUString GetFormLinkEnd(); static OUString GetFormEntryNum(); static OUString GetFormEntryText(); static OUString GetFormChapterMark(); static OUString GetFormText(); static OUString GetFormAuth(); }; // Content to create indexes of enum class SwTOXElement : sal_uInt16 { NONE = 0x0000, Mark = 0x0001, OutlineLevel = 0x0002, Template = 0x0004, Ole = 0x0008, Table = 0x0010, Graphic = 0x0020, Frame = 0x0040, Sequence = 0x0080, TableLeader = 0x0100, TableInToc = 0x0200, Bookmark = 0x0400, Newline = 0x0800, ParagraphOutlineLevel = 0x1000, }; namespace o3tl { template<> struct typed_flags : is_typed_flags {}; } enum class SwTOIOptions : sal_uInt16 { NONE = 0x00, SameEntry = 0x01, FF = 0x02, CaseSensitive = 0x04, KeyAsEntry = 0x08, AlphaDelimiter = 0x10, Dash = 0x20, InitialCaps = 0x40, }; namespace o3tl { template<> struct typed_flags : is_typed_flags {}; } //which part of the caption is to be displayed enum SwCaptionDisplay { CAPTION_COMPLETE, CAPTION_NUMBER, CAPTION_TEXT }; enum class SwTOOElements : sal_uInt16 { NONE = 0x00, Math = 0x01, Chart = 0x02, Calc = 0x08, DrawImpress = 0x10, Other = 0x80, }; namespace o3tl { template<> struct typed_flags : is_typed_flags {}; } #define TOX_STYLE_DELIMITER u'\x0001' // Class for all indexes class SW_DLLPUBLIC SwTOXBase : public SwClient { SwForm m_aForm; // description of the lines OUString m_aName; // unique name OUString m_aTitle; // title OUString m_aBookmarkName; //Bookmark Name OUString m_sMainEntryCharStyle; // name of the character style applied to main index entries OUString m_aStyleNames[MAXLEVEL]; // (additional) style names TOX_CONTENT, TOX_USER OUString m_sSequenceName; // FieldTypeName of a caption sequence LanguageType m_eLanguage; OUString m_sSortAlgorithm; union { sal_uInt16 nLevel; // consider outline levels SwTOIOptions nOptions; // options of alphabetical index } m_aData; SwTOXElement m_nCreateType; // sources to create the index from SwTOOElements m_nOLEOptions; // OLE sources SwCaptionDisplay m_eCaptionDisplay; bool m_bProtected : 1; // index protected ? bool m_bFromChapter : 1; // create from chapter or document bool m_bFromObjectNames : 1; // create a table or object index // from the names rather than the caption bool m_bLevelFromChapter : 1; // User index: get the level from the source chapter protected: // Add a data member, for record the TOC field expression of MS Word binary format // For keeping fidelity and may giving a better exporting performance OUString maMSTOCExpression; bool mbKeepExpression; public: SwTOXBase( const SwTOXType* pTyp, const SwForm& rForm, SwTOXElement nCreaType, const OUString& rTitle ); SwTOXBase( const SwTOXBase& rCopy, SwDoc* pDoc = nullptr ); virtual ~SwTOXBase() override; virtual void SwClientNotify(const SwModify& rMod, const SfxHint& rHint) override { if(dynamic_cast(&rHint)) GetRegisteredIn()->Remove(this); else SwClient::SwClientNotify(rMod, rHint); } // a kind of CopyCtor - check if the TOXBase is at TOXType of the doc. // If not, so create it and copy all other used things. void CopyTOXBase( SwDoc*, const SwTOXBase& ); const SwTOXType* GetTOXType() const; SwTOXElement GetCreateType() const; // creation types const OUString& GetTOXName() const {return m_aName;} void SetTOXName(const OUString& rSet) {m_aName = rSet;} // for record the TOC field expression of MS Word binary format const OUString& GetMSTOCExpression() const{return maMSTOCExpression;} void SetMSTOCExpression(const OUString& rExp) {maMSTOCExpression = rExp;} void EnableKeepExpression() {mbKeepExpression = true;} void DisableKeepExpression() {mbKeepExpression = false;} const OUString& GetTitle() const; // Title const OUString& GetBookmarkName() const; OUString const & GetTypeName() const; // Name const SwForm& GetTOXForm() const; // description of the lines void SetCreate(SwTOXElement); void SetTitle(const OUString& rTitle); void SetTOXForm(const SwForm& rForm); void SetBookmarkName(const OUString& bName); TOXTypes GetType() const; const OUString& GetMainEntryCharStyle() const {return m_sMainEntryCharStyle;} void SetMainEntryCharStyle(const OUString& rSet) {m_sMainEntryCharStyle = rSet;} // content index only inline void SetLevel(sal_uInt16); // consider outline level inline sal_uInt16 GetLevel() const; // alphabetical index only inline SwTOIOptions GetOptions() const; // alphabetical index options inline void SetOptions(SwTOIOptions nOpt); // index of objects SwTOOElements GetOLEOptions() const {return m_nOLEOptions;} void SetOLEOptions(SwTOOElements nOpt) {m_nOLEOptions = nOpt;} // index of objects OUString const & GetStyleNames(sal_uInt16 nLevel) const { SAL_WARN_IF( nLevel >= MAXLEVEL, "sw", "Which level?"); return m_aStyleNames[nLevel]; } void SetStyleNames(const OUString& rSet, sal_uInt16 nLevel) { SAL_WARN_IF( nLevel >= MAXLEVEL, "sw", "Which level?"); m_aStyleNames[nLevel] = rSet; } bool IsFromChapter() const { return m_bFromChapter;} void SetFromChapter(bool bSet) { m_bFromChapter = bSet;} bool IsFromObjectNames() const {return m_bFromObjectNames;} void SetFromObjectNames(bool bSet) {m_bFromObjectNames = bSet;} bool IsLevelFromChapter() const {return m_bLevelFromChapter;} void SetLevelFromChapter(bool bSet) {m_bLevelFromChapter = bSet;} bool IsProtected() const { return m_bProtected; } void SetProtected(bool bSet) { m_bProtected = bSet; } const OUString& GetSequenceName() const {return m_sSequenceName;} void SetSequenceName(const OUString& rSet) {m_sSequenceName = rSet;} SwCaptionDisplay GetCaptionDisplay() const { return m_eCaptionDisplay;} void SetCaptionDisplay(SwCaptionDisplay eSet) {m_eCaptionDisplay = eSet;} bool IsTOXBaseInReadonly() const; const SfxItemSet* GetAttrSet() const; void SetAttrSet( const SfxItemSet& ); LanguageType GetLanguage() const {return m_eLanguage;} void SetLanguage(LanguageType nLang) {m_eLanguage = nLang;} const OUString& GetSortAlgorithm()const {return m_sSortAlgorithm;} void SetSortAlgorithm(const OUString& rSet) {m_sSortAlgorithm = rSet;} // #i21237# void AdjustTabStops( SwDoc const & rDoc ) { m_aForm.AdjustTabStops( rDoc ); } SwTOXBase& operator=(const SwTOXBase& rSource); void RegisterToTOXType( SwTOXType& rMark ); virtual bool IsVisible() const { return true; } }; //SwTOXMark inline const OUString& SwTOXMark::GetAlternativeText() const { return m_aAltText; } inline const OUString& SwTOXMark::GetBookmarkName() const { return m_aBookmarkName; } inline const SwTOXType* SwTOXMark::GetTOXType() const { return m_pType; } inline bool SwTOXMark::IsAlternativeText() const { return !m_aAltText.isEmpty(); } inline void SwTOXMark::SetAlternativeText(const OUString& rAlt) { m_aAltText = rAlt; } inline void SwTOXMark::SetBookmarkName(const OUString& bName) { m_aBookmarkName = bName; } inline void SwTOXMark::SetLevel( sal_uInt16 nLvl ) { SAL_WARN_IF( GetTOXType() && GetTOXType()->GetType() == TOX_INDEX, "sw", "Wrong type"); m_nLevel = nLvl; } inline void SwTOXMark::SetPrimaryKey( const OUString& rKey ) { SAL_WARN_IF( GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aPrimaryKey = rKey; } inline void SwTOXMark::SetSecondaryKey( const OUString& rKey ) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aSecondaryKey = rKey; } inline void SwTOXMark::SetTextReading( const OUString& rText ) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aTextReading = rText; } inline void SwTOXMark::SetPrimaryKeyReading( const OUString& rKey ) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aPrimaryKeyReading = rKey; } inline void SwTOXMark::SetSecondaryKeyReading( const OUString& rKey ) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aSecondaryKeyReading = rKey; } inline sal_uInt16 SwTOXMark::GetLevel() const { SAL_WARN_IF( GetTOXType() && GetTOXType()->GetType() == TOX_INDEX, "sw", "Wrong type"); return m_nLevel; } inline OUString const & SwTOXMark::GetPrimaryKey() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aPrimaryKey; } inline OUString const & SwTOXMark::GetSecondaryKey() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aSecondaryKey; } inline OUString const & SwTOXMark::GetTextReading() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aTextReading; } inline OUString const & SwTOXMark::GetPrimaryKeyReading() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aPrimaryKeyReading; } inline OUString const & SwTOXMark::GetSecondaryKeyReading() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aSecondaryKeyReading; } //SwForm inline void SwForm::SetTemplate(sal_uInt16 nLevel, const OUString& rTemplate) { SAL_WARN_IF(nLevel >= GetFormMax(), "sw", "Index >= GetFormMax()"); m_aTemplate[nLevel] = rTemplate; } inline OUString const & SwForm::GetTemplate(sal_uInt16 nLevel) const { SAL_WARN_IF(nLevel >= GetFormMax(), "sw", "Index >= GetFormMax()"); return m_aTemplate[nLevel]; } inline TOXTypes SwForm::GetTOXType() const { return m_eType; } inline sal_uInt16 SwForm::GetFormMax() const { return m_nFormMaxLevel; } //SwTOXType inline const OUString& SwTOXType::GetTypeName() const { return m_aName; } inline TOXTypes SwTOXType::GetType() const { return m_eType; } // SwTOXBase inline const SwTOXType* SwTOXBase::GetTOXType() const { return static_cast(GetRegisteredIn()); } inline SwTOXElement SwTOXBase::GetCreateType() const { return m_nCreateType; } inline const OUString& SwTOXBase::GetTitle() const { return m_aTitle; } inline const OUString& SwTOXBase::GetBookmarkName() const { return m_aBookmarkName; } inline OUString const & SwTOXBase::GetTypeName() const { return GetTOXType()->GetTypeName(); } inline const SwForm& SwTOXBase::GetTOXForm() const { return m_aForm; } inline void SwTOXBase::SetCreate(SwTOXElement nCreate) { m_nCreateType = nCreate; } inline void SwTOXBase::SetTOXForm(const SwForm& rForm) { m_aForm = rForm; } inline TOXTypes SwTOXBase::GetType() const { return GetTOXType()->GetType(); } inline void SwTOXBase::SetLevel(sal_uInt16 nLev) { SAL_WARN_IF(GetTOXType()->GetType() == TOX_INDEX, "sw", "Wrong type"); m_aData.nLevel = nLev; } inline sal_uInt16 SwTOXBase::GetLevel() const { SAL_WARN_IF(GetTOXType()->GetType() == TOX_INDEX, "sw", "Wrong type"); return m_aData.nLevel; } inline SwTOIOptions SwTOXBase::GetOptions() const { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); return m_aData.nOptions; } inline void SwTOXBase::SetOptions(SwTOIOptions nOpt) { SAL_WARN_IF(GetTOXType()->GetType() != TOX_INDEX, "sw", "Wrong type"); m_aData.nOptions = nOpt; } #endif // INCLUDED_SW_INC_TOX_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */