diff options
Diffstat (limited to 'sw/inc/pagedesc.hxx')
-rw-r--r-- | sw/inc/pagedesc.hxx | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx new file mode 100644 index 000000000..382bbb5f0 --- /dev/null +++ b/sw/inc/pagedesc.hxx @@ -0,0 +1,466 @@ +/* -*- 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_PAGEDESC_HXX +#define INCLUDED_SW_INC_PAGEDESC_HXX + +#include <tools/fract.hxx> +#include <tools/color.hxx> +#include "swdllapi.h" +#include "swtypes.hxx" +#include "frmfmt.hxx" +#include <editeng/numitem.hxx> +#include <editeng/borderline.hxx> +#include <com/sun/star/drawing/TextVerticalAdjust.hpp> +#include <com/sun/star/text/HorizontalAdjust.hpp> +#include <o3tl/typed_flags_set.hxx> + +#include <boost/multi_index_container.hpp> +#include <boost/multi_index/identity.hpp> +#include <boost/multi_index/ordered_index.hpp> +#include <boost/multi_index/random_access_index.hpp> + +using namespace ::com::sun::star; + + +class SfxPoolItem; +class SwTextFormatColl; +class SwNode; +class SwPageDescs; +typedef struct _xmlTextWriter* xmlTextWriterPtr; + +/// Footnote information. +class SW_DLLPUBLIC SwPageFootnoteInfo +{ +private: + SwTwips m_nMaxHeight; ///< maximum height of the footnote area. + sal_uLong m_nLineWidth; ///< width of separator line + SvxBorderLineStyle m_eLineStyle; ///< Style of the separator line + Color m_LineColor; ///< color of the separator line + Fraction m_Width; ///< percentage width of the separator line. + css::text::HorizontalAdjust m_eAdjust; ///< line adjustment. + SwTwips m_nTopDist; ///< distance between body and separator. + SwTwips m_nBottomDist; ///< distance between separator and first footnote + +public: + SwTwips GetHeight() const { return m_nMaxHeight; } + sal_uLong GetLineWidth() const { return m_nLineWidth; } + const Color& GetLineColor() const { return m_LineColor;} + SvxBorderLineStyle GetLineStyle() const { return m_eLineStyle; } + const Fraction& GetWidth() const { return m_Width; } + css::text::HorizontalAdjust GetAdj() const { return m_eAdjust; } + SwTwips GetTopDist() const { return m_nTopDist; } + SwTwips GetBottomDist() const { return m_nBottomDist; } + + void SetHeight(SwTwips const nNew) { m_nMaxHeight = nNew; } + void SetLineWidth(sal_uLong const nSet) { m_nLineWidth = nSet; } + void SetLineStyle(SvxBorderLineStyle const eSet) {m_eLineStyle = eSet;} + void SetLineColor(const Color& rCol) { m_LineColor = rCol;} + void SetWidth(const Fraction & rNew) { m_Width = rNew; } + void SetAdj(css::text::HorizontalAdjust const eNew) { m_eAdjust = eNew; } + void SetTopDist (SwTwips const nNew) { m_nTopDist = nNew; } + void SetBottomDist(SwTwips const nNew) { m_nBottomDist = nNew; } + + SwPageFootnoteInfo(); + SwPageFootnoteInfo( const SwPageFootnoteInfo& ); + SwPageFootnoteInfo& operator=( const SwPageFootnoteInfo& ); + + bool operator ==( const SwPageFootnoteInfo& ) const; +}; + +/* + * Use of UseOnPage (m_eUse) and of FrameFormats + * + * RIGHT - m_Master only for right hand (odd) pages, left hand (even) pages + * always empty. + * LEFT - m_Left for left-hand pages, right-hand pages always empty. + * m_Left is a copy of master. + * ALL - m_Master for right hand pages, m_Left for left hand pages. + * - m_Left is a copy of master. + * MIRROR - m_Master for right hand pages, m_Left for left hand pagers. + * m_Left is a copy of master, margins are mirrored. + * + * UI works exclusively on master! m_Left is adjusted on Chg at document + * according to m_eUse. + * + * In order to simplify the work of the filters some more values are placed + * into m_eUse: + * + * HEADERSHARE - Content of header is equal on left and right hand pages. + * FOOTERSHARE - Content of footer is equal on left and right hand pages. + * + * The values are masked out in the respective getter and setter methods. + * Access to complete m_eUse including the information on header and footer + * via ReadUseOn(), WriteUseOn() (for Filter and CopyCTor)! + * + * The Frameformats for header/footer are adjusted by the UI according to + * the attributes for header and footer at master (height, margin, back- + * ground ...) + * Header/footer for left hand pages are copied or mirrored (Chg at + * document). + * The respective attribute for content is cared for automatically on Chg at + * document (contents are created or removed according to SHARE-information). + */ + +enum class UseOnPage : sal_uInt16 +{ + NONE = 0x0000, ///< For internal use only. + Left = 0x0001, + Right = 0x0002, + All = 0x0003, + Mirror = 0x0007, + HeaderShare = 0x0040, + FooterShare = 0x0080, + FirstShare = 0x0100, + NoHeaderShare = 0xFFBF, ///< For internal use only. + NoFooterShare = 0xFF7F, ///< For internal use only. + NoFirstShare = 0xFEFF +}; +namespace o3tl { + template<> struct typed_flags<UseOnPage> : is_typed_flags<UseOnPage, 0xffff> {}; +} + +class SW_DLLPUBLIC SwPageDesc final + : public sw::BroadcastingModify +{ + friend class SwDoc; + friend class SwPageDescs; + + OUString m_StyleName; + SvxNumberType m_NumType; + SwFrameFormat m_Master; + SwFrameFormat m_Left; + // FIXME epicycles growing here - page margins need to be stored differently + SwFrameFormat m_FirstMaster; + SwFrameFormat m_FirstLeft; + + struct StashedPageDesc + { + std::shared_ptr<SwFrameFormat> m_pStashedFirst; + std::shared_ptr<SwFrameFormat> m_pStashedLeft; + std::shared_ptr<SwFrameFormat> m_pStashedFirstLeft; + }; + + mutable StashedPageDesc m_aStashedHeader; + mutable StashedPageDesc m_aStashedFooter; + + sw::WriterMultiListener m_aDepends; ///< Because of grid alignment (Registerhaltigkeit). + mutable const SwTextFormatColl* m_pTextFormatColl; + SwPageDesc *m_pFollow; + sal_uInt16 m_nRegHeight; ///< Sentence spacing and fontascent of style. + sal_uInt16 m_nRegAscent; ///< For grid alignment (Registerhaltigkeit). + drawing::TextVerticalAdjust m_nVerticalAdjustment; // doc/docx: vertically center / justify / bottom + UseOnPage m_eUse; + bool m_IsLandscape; + bool m_IsHidden; + + /// Footnote information. + SwPageFootnoteInfo m_FootnoteInfo; + + /// Backref to the assigned SwPageDescs list to handle renames. + SwPageDescs *m_pdList; + + /** Called for mirroring of Chg (doc). + No adjustment at any other place. */ + SAL_DLLPRIVATE void Mirror(); + + SAL_DLLPRIVATE void ResetAllAttr(); + + SAL_DLLPRIVATE SwPageDesc(const OUString&, SwFrameFormat*, SwDoc *pDc ); + + struct change_name + { + change_name(const OUString &rName) : mName(rName) {} + void operator()(SwPageDesc *pPageDesc) { pPageDesc->m_StyleName = mName; } + const OUString &mName; + }; + + virtual void SwClientNotify(const SwModify&, const SfxHint&) override; + +public: + const OUString& GetName() const { return m_StyleName; } + bool SetName(const OUString& rNewName); + + bool GetLandscape() const { return m_IsLandscape; } + void SetLandscape( bool bNew ) { m_IsLandscape = bNew; } + + const SvxNumberType &GetNumType() const { return m_NumType; } + void SetNumType(const SvxNumberType& rNew) { m_NumType = rNew; } + + const SwPageFootnoteInfo &GetFootnoteInfo() const { return m_FootnoteInfo; } + SwPageFootnoteInfo &GetFootnoteInfo() { return m_FootnoteInfo; } + void SetFootnoteInfo(const SwPageFootnoteInfo &rNew) { m_FootnoteInfo = rNew; } + + inline bool IsHeaderShared() const; + inline bool IsFooterShared() const; + inline void ChgHeaderShare( bool bNew ); + inline void ChgFooterShare( bool bNew ); + bool IsFirstShared() const; + void ChgFirstShare( bool bNew ); + + bool IsHidden() const { return m_IsHidden; } + void SetHidden(bool const bValue) { m_IsHidden = bValue; } + + /// Remember original header/footer formats even when they are hidden by "sharing". + void StashFrameFormat(const SwFrameFormat& rFormat, bool bHeader, bool bLeft, bool bFirst); + + /// Used to restore hidden header/footer formats. + const SwFrameFormat* GetStashedFrameFormat(bool bHeader, bool bLeft, bool bFirst) const; + + /// Checks if the pagedescriptor has a stashed format according to the parameters or not. + bool HasStashedFormat(bool bHeader, bool bLeft, bool bFirst); + + /// Gives the feature of removing the stashed format by hand if it is necessary. + void RemoveStashedFormat(bool bHeader, bool bLeft, bool bFirst); + + /// Same as WriteUseOn(), but the >= HeaderShare part of the bitfield is not modified. + inline void SetUseOn( UseOnPage eNew ); + inline UseOnPage GetUseOn() const; + + void WriteUseOn(UseOnPage const eNew) { m_eUse = eNew; } + UseOnPage ReadUseOn() const { return m_eUse; } + + SwFrameFormat &GetMaster() { return m_Master; } + SwFrameFormat &GetLeft() { return m_Left; } + SwFrameFormat &GetFirstMaster() { return m_FirstMaster; } + SwFrameFormat &GetFirstLeft() { return m_FirstLeft; } + const SwFrameFormat &GetMaster() const { return m_Master; } + const SwFrameFormat &GetLeft() const { return m_Left; } + const SwFrameFormat &GetFirstMaster() const { return m_FirstMaster; } + const SwFrameFormat &GetFirstLeft() const { return m_FirstLeft; } + + /** Reset all attrs of the format but keep the ones a pagedesc + cannot live without. */ + inline void ResetAllMasterAttr(); + + /** Layout uses the following methods to obtain a format in order + to be able to create a page. */ + SwFrameFormat *GetRightFormat(bool const bFirst = false); + inline const SwFrameFormat *GetRightFormat(bool const bFirst = false) const; + SwFrameFormat *GetLeftFormat(bool const bFirst = false); + inline const SwFrameFormat *GetLeftFormat(bool const bFirst = false) const; + + sal_uInt16 GetRegHeight() const { return m_nRegHeight; } + sal_uInt16 GetRegAscent() const { return m_nRegAscent; } + void SetRegHeight(sal_uInt16 const nNew) { m_nRegHeight = nNew; } + void SetRegAscent(sal_uInt16 const nNew) { m_nRegAscent = nNew; } + + drawing::TextVerticalAdjust GetVerticalAdjustment () const {return m_nVerticalAdjustment; } + void SetVerticalAdjustment (const drawing::TextVerticalAdjust nVA) {m_nVerticalAdjustment = nVA; } + + inline void SetFollow( const SwPageDesc* pNew ); + const SwPageDesc* GetFollow() const { return m_pFollow; } + SwPageDesc* GetFollow() { return m_pFollow; } + + void SetRegisterFormatColl( const SwTextFormatColl* rFormat ); + const SwTextFormatColl* GetRegisterFormatColl() const; + void RegisterChange(); + + /// Query and set PoolFormat-Id. + sal_uInt16 GetPoolFormatId() const { return m_Master.GetPoolFormatId(); } + void SetPoolFormatId(sal_uInt16 const nId) { m_Master.SetPoolFormatId(nId); } + sal_uInt16 GetPoolHelpId() const { return m_Master.GetPoolHelpId(); } + void SetPoolHelpId(sal_uInt16 const nId){ m_Master.SetPoolHelpId(nId); } + sal_uInt8 GetPoolHlpFileId() const { return m_Master.GetPoolHlpFileId(); } + void SetPoolHlpFileId(sal_uInt8 const nId) { m_Master.SetPoolHlpFileId(nId); } + + /// Query information from Client. + virtual bool GetInfo( SfxPoolItem& ) const override; + + const SwFrameFormat* GetPageFormatOfNode( const SwNode& rNd, + bool bCheckForThisPgDc = true ) const; + bool IsFollowNextPageOfNode( const SwNode& rNd ) const; + + /// Given a SwNode return the pagedesc in use at that location. + static const SwPageDesc* GetPageDescOfNode(const SwNode& rNd); + + static SwPageDesc* GetByName(SwDoc& rDoc, std::u16string_view rName); + + SwPageDesc& operator=( const SwPageDesc& ); + + SwPageDesc( const SwPageDesc& ); + virtual ~SwPageDesc() override; + + void dumpAsXml(xmlTextWriterPtr pWriter) const; +}; + +namespace std { + template<> + struct less<SwPageDesc*> { + bool operator()(const SwPageDesc *pPageDesc, std::u16string_view rName) const + { return pPageDesc->GetName() < rName; } + bool operator()(std::u16string_view rName, const SwPageDesc *pPageDesc) const + { return rName < pPageDesc->GetName(); } + bool operator()(const SwPageDesc *lhs, const SwPageDesc *rhs) const + { return lhs->GetName() < rhs->GetName(); } + }; +} + +inline void SwPageDesc::SetFollow( const SwPageDesc* pNew ) +{ + m_pFollow = pNew ? const_cast<SwPageDesc*>(pNew) : this; +} + +inline bool SwPageDesc::IsHeaderShared() const +{ + return bool(m_eUse & UseOnPage::HeaderShare); +} +inline bool SwPageDesc::IsFooterShared() const +{ + return bool(m_eUse & UseOnPage::FooterShare); +} +inline void SwPageDesc::ChgHeaderShare( bool bNew ) +{ + if ( bNew ) + m_eUse |= UseOnPage::HeaderShare; + else + m_eUse &= UseOnPage::NoHeaderShare; +} +inline void SwPageDesc::ChgFooterShare( bool bNew ) +{ + if ( bNew ) + m_eUse |= UseOnPage::FooterShare; + else + m_eUse &= UseOnPage::NoFooterShare; +} +inline void SwPageDesc::SetUseOn( UseOnPage eNew ) +{ + UseOnPage eTmp = UseOnPage::NONE; + if (m_eUse & UseOnPage::HeaderShare) + eTmp = UseOnPage::HeaderShare; + if (m_eUse & UseOnPage::FooterShare) + eTmp |= UseOnPage::FooterShare; + if (m_eUse & UseOnPage::FirstShare) + eTmp |= UseOnPage::FirstShare; + m_eUse = eTmp | eNew; + +} +inline UseOnPage SwPageDesc::GetUseOn() const +{ + UseOnPage eRet = m_eUse; + eRet &= UseOnPage::NoHeaderShare; + eRet &= UseOnPage::NoFooterShare; + eRet &= UseOnPage::NoFirstShare; + return eRet; +} + +inline void SwPageDesc::ResetAllMasterAttr() +{ + ResetAllAttr(); +} + +inline const SwFrameFormat *SwPageDesc::GetRightFormat(bool const bFirst) const +{ + return const_cast<SwPageDesc*>(this)->GetRightFormat(bFirst); +} +inline const SwFrameFormat *SwPageDesc::GetLeftFormat(bool const bFirst) const +{ + return const_cast<SwPageDesc*>(this)->GetLeftFormat(bFirst); +} + +class SwPageDescExt +{ +public: + SwPageDesc m_PageDesc; +private: + SwDoc * m_pDoc; + OUString m_sFollow; + + void SetPageDesc(const SwPageDesc & rPageDesc); + +public: + SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * pDoc); + SwPageDescExt(const SwPageDescExt & rSrc); + ~SwPageDescExt(); + + SwPageDescExt & operator = (const SwPageDescExt & rSrc); + SwPageDescExt & operator = (const SwPageDesc & rSrc); + + OUString const & GetName() const; + + operator SwPageDesc() const; // #i7983# +}; + +namespace sw { + class PageFootnoteHint final : public SfxHint {}; + + SW_DLLPUBLIC SwTwips FootnoteSeparatorHeight(SwPageFootnoteInfo const&); +} + +typedef boost::multi_index_container< + SwPageDesc*, + boost::multi_index::indexed_by< + boost::multi_index::random_access<>, + boost::multi_index::ordered_unique< + boost::multi_index::identity<SwPageDesc*> > + > + > + SwPageDescsBase; + +class SwPageDescs final +{ + // function updating ByName index via modify + friend bool SwPageDesc::SetName( const OUString& rNewName ); + + typedef SwPageDescsBase::nth_index<0>::type ByPos; + typedef SwPageDescsBase::nth_index<1>::type ByName; + typedef ByPos::iterator iterator; + + iterator find_( const OUString &name ) const; + + SwPageDescsBase m_Array; + ByPos &m_PosIndex; + ByName &m_NameIndex; + +public: + typedef ByPos::const_iterator const_iterator; + typedef SwPageDescsBase::size_type size_type; + typedef SwPageDescsBase::value_type value_type; + + SwPageDescs(); + + // frees all SwPageDesc! + ~SwPageDescs(); + + void clear() { return m_Array.clear(); } + bool empty() const { return m_Array.empty(); } + size_t size() const { return m_Array.size(); } + + std::pair<const_iterator,bool> push_back( const value_type& x ); + void erase( const value_type& x ); + void erase( size_type index ); + void erase( const_iterator const& position ); + + const_iterator find( const OUString &name ) const + { return find_( name ); } + const value_type& operator[]( size_t index_ ) const + { return m_PosIndex.operator[]( index_ ); } + const value_type& front() const { return m_PosIndex.front(); } + const value_type& back() const { return m_PosIndex.back(); } + const_iterator begin() const { return m_PosIndex.begin(); } + const_iterator end() const { return m_PosIndex.end(); } + + bool contains( const value_type& x ) const + { return x->m_pdList == this; } + + void dumpAsXml(xmlTextWriterPtr pWriter) const; +}; + +#endif // INCLUDED_SW_INC_PAGEDESC_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |