diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sw/inc/docstyle.hxx | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sw/inc/docstyle.hxx')
-rw-r--r-- | sw/inc/docstyle.hxx | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/sw/inc/docstyle.hxx b/sw/inc/docstyle.hxx new file mode 100644 index 0000000000..b411bfe4b1 --- /dev/null +++ b/sw/inc/docstyle.hxx @@ -0,0 +1,250 @@ +/* -*- 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_DOCSTYLE_HXX +#define INCLUDED_SW_INC_DOCSTYLE_HXX + +#include <rtl/ref.hxx> +#include <rtl/ustring.hxx> + +#include <svl/style.hxx> +#include <svl/itemset.hxx> +#include "swdllapi.h" + +#include <unordered_map> +#include <memory> +#include <optional> +#include <vector> + +class SwDoc; +class SwDocStyleSheetPool; +class SwPageDesc; +class SwCharFormat; +class SwTextFormatColl; +class SwFrameFormat; +class SwNumRule; +class SwTableAutoFormat; +class SwBoxAutoFormat; +enum class SwGetPoolIdFromName : sal_uInt16; + +// Temporary StyleSheet. +class SW_DLLPUBLIC SwDocStyleSheet final : public SfxStyleSheetBase +{ + friend class SwDocStyleSheetPool; + friend class SwStyleSheetIterator; + + SwCharFormat* m_pCharFormat; + SwTextFormatColl* m_pColl; + SwFrameFormat* m_pFrameFormat; + const SwPageDesc* m_pDesc; + const SwNumRule* m_pNumRule; + SwTableAutoFormat* m_pTableFormat; + const SwBoxAutoFormat* m_pBoxFormat; + SwDoc& m_rDoc; + SfxItemSet m_aCoreSet; + + bool m_bPhysical; + OUString m_aLink; + + /// Make empty shell a real StyleSheet (Core). + SAL_DLLPRIVATE void Create(); + + /// Fill StyleSheet with data. + enum FillStyleType { + FillOnlyName, + FillAllInfo, + FillPhysical, + FillPreview, + }; + + SAL_DLLPRIVATE bool FillStyleSheet(FillStyleType eFType, + std::optional<SfxItemSet> * o_ppFlatSet = nullptr); + + virtual ~SwDocStyleSheet() override; + +public: + SwDocStyleSheet( SwDoc& rDoc, + SwDocStyleSheetPool& rPool); + + SwDocStyleSheet( const SwDocStyleSheet& ); + + void Reset(); + + void SetFamily(SfxStyleFamily eFam) { nFamily = eFam; } + + bool IsPhysical() const { return m_bPhysical; } + void SetPhysical(bool bPhys); + + virtual void SetHidden( bool bHidden ) override; + virtual bool IsHidden( ) const override; + void SetGrabBagItem(const css::uno::Any& rVal); + void GetGrabBagItem(css::uno::Any& rVal) const; + + /** add optional parameter <bResetIndentAttrsAtParagraphStyle>, default value false, + which indicates that the indent attributes at a paragraph style should + be reset in case that a list style is applied to the paragraph style and + no indent attributes are applied. */ + void SetItemSet( const SfxItemSet& rSet, const bool bBroadcast = true, + const bool bResetIndentAttrsAtParagraphStyle = false ); + + virtual SfxItemSet& GetItemSet() override; + virtual std::optional<SfxItemSet> GetItemSetForPreview() override; + /** new method for paragraph styles to merge indent attributes of applied list + style into the given item set, if the list style indent attributes are applicable. */ + void MergeIndentAttrsOfListStyle( SfxItemSet& rSet ); + virtual const OUString& GetParent() const override; + virtual const OUString& GetFollow() const override; + const OUString& GetLink() const; + + virtual sal_uLong GetHelpId( OUString& rFile ) override; + virtual void SetHelpId( const OUString& r, sal_uLong nId ) override; + + /** Preset the members without physical access. + Used by StyleSheetPool. */ + void PresetName(const OUString& rName) { aName = rName; } + void PresetNameAndFamily(SfxStyleFamily eFamily, const OUString& rName); + void PresetParent(const OUString& rName){ aParent = rName; } + void PresetFollow(const OUString& rName){ aFollow = rName; } + + virtual bool SetName(const OUString& rNewName, bool bReindexNow = true) override; + virtual bool SetParent( const OUString& rStr) override; + virtual bool SetFollow( const OUString& rStr) override; + void SetLink(const OUString& rStr); + + virtual bool HasFollowSupport() const override; + virtual bool HasParentSupport() const override; + virtual bool HasClearParentSupport() const override; + virtual OUString GetDescription(MapUnit eUnit) override; + + virtual OUString GetUsedBy() override; + + SwCharFormat* GetCharFormat(); + SwTextFormatColl* GetCollection(); + SwFrameFormat* GetFrameFormat(); + const SwPageDesc* GetPageDesc(); + const SwNumRule* GetNumRule(); + void SetNumRule(const SwNumRule& rRule); + SwTableAutoFormat* GetTableFormat(); + + virtual bool IsUsed() const override; +}; + +namespace std { +template<> +struct hash<std::pair<SfxStyleFamily,OUString>> +{ + std::size_t operator()(std::pair<SfxStyleFamily,OUString> const & pair) const + { return static_cast<std::size_t>(pair.first) ^ std::size_t(pair.second.hashCode()); } +}; +} + + +// Iterator for Pool. +class SwStyleSheetIterator final : public SfxStyleSheetIterator, public SfxListener +{ + // Local helper class. + class SwPoolFormatList + { + std::vector<std::pair<SfxStyleFamily, OUString>> maImpl; + typedef std::unordered_map<std::pair<SfxStyleFamily, OUString>, sal_uInt32> UniqueHash; + UniqueHash maUnique; + void rehash(); + public: + SwPoolFormatList() {} + void Append( SfxStyleFamily eFam, const OUString& rStr ); + void clear() { maImpl.clear(); maUnique.clear(); } + size_t size() { return maImpl.size(); } + bool empty() { return maImpl.empty(); } + sal_uInt32 FindName(SfxStyleFamily eFam, const OUString& rName); + void RemoveName(SfxStyleFamily eFam, const OUString& rName); + const std::pair<SfxStyleFamily,OUString> &operator[](sal_uInt32 nIdx) { return maImpl[ nIdx ]; } + }; + + rtl::Reference< SwDocStyleSheet > mxIterSheet; + rtl::Reference< SwDocStyleSheet > mxStyleSheet; + SwPoolFormatList m_aLst; + sal_uInt32 m_nLastPos; + bool m_bFirstCalled; + + bool IsUsedInComments(const OUString& rName) const; + void AppendStyleList(const std::vector<OUString>& rLst, + bool bUsed, + bool bTestHidden, + bool bOnlyHidden, + SwGetPoolIdFromName nSection, + SfxStyleFamily eFamily); + +public: + SwStyleSheetIterator(SwDocStyleSheetPool& rBase, + SfxStyleFamily eFam, SfxStyleSearchBits n); + virtual ~SwStyleSheetIterator() override; + + virtual sal_Int32 Count() override; + virtual SfxStyleSheetBase *operator[](sal_Int32 nIdx) override; + virtual SfxStyleSheetBase* First() override; + virtual SfxStyleSheetBase* Next() override; + virtual SfxStyleSheetBase* Find(const OUString& rStr) override; + + virtual void Notify( SfxBroadcaster&, const SfxHint& ) override; + + void InvalidateIterator(); +}; + +class SwDocStyleSheetPool final : public SfxStyleSheetBasePool +{ + rtl::Reference< SwDocStyleSheet > mxStyleSheet; + rtl::Reference< SfxStyleSheetPool > mxEEStyleSheetPool; + SwDoc& m_rDoc; + bool m_bOrganizer : 1; ///< Organizer + + virtual rtl::Reference<SfxStyleSheetBase> Create( const OUString&, SfxStyleFamily, SfxStyleSearchBits nMask) override; + virtual rtl::Reference<SfxStyleSheetBase> Create( const SfxStyleSheetBase& ) override; + + using SfxStyleSheetBasePool::Find; + +public: + SwDocStyleSheetPool( SwDoc&, bool bOrganizer ); + + virtual SfxStyleSheetBase& Make(const OUString&, SfxStyleFamily, + SfxStyleSearchBits nMask = SfxStyleSearchBits::All) override; + + virtual SfxStyleSheetBase* Find( const OUString&, SfxStyleFamily eFam, + SfxStyleSearchBits n=SfxStyleSearchBits::All ) override; + + virtual void Remove( SfxStyleSheetBase* pStyle) override; + + bool IsOrganizerMode() const { return m_bOrganizer; } + + virtual std::unique_ptr<SfxStyleSheetIterator> CreateIterator( SfxStyleFamily, SfxStyleSearchBits nMask = SfxStyleSearchBits::All) override; + + SwDoc& GetDoc() const { return m_rDoc; } + SfxStyleSheetPool* GetEEStyleSheetPool() const { return mxEEStyleSheetPool.get(); } + + void dispose(); + + void InvalidateIterator(); + +private: + virtual ~SwDocStyleSheetPool() override; + + SwDocStyleSheetPool( const SwDocStyleSheetPool& ) = delete; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |