1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #ifndef INCLUDED_SW_INC_FORMAT_HXX
20 #define INCLUDED_SW_INC_FORMAT_HXX
21 
22 #include "swdllapi.h"
23 #include "swatrset.hxx"
24 #include "calbck.hxx"
25 #include <memory>
26 
27 class IDocumentSettingAccess;
28 class IDocumentDrawModelAccess;
29 class IDocumentLayoutAccess;
30 class IDocumentTimerAccess;
31 class IDocumentFieldsAccess;
32 class IDocumentChartDataProviderAccess;
33 class SwDoc;
34 class SfxGrabBagItem;
35 class SwTextGridItem;
36 
37 namespace drawinglayer { namespace attribute {
38     class SdrAllFillAttributesHelper;
39     typedef std::shared_ptr< SdrAllFillAttributesHelper > SdrAllFillAttributesHelperPtr;
40 }}
41 
42 /// Base class for various Writer styles.
43 class SW_DLLPUBLIC SwFormat : public sw::BroadcastingModify
44 {
45     friend class SwFrameFormat;
46 
47     OUString m_aFormatName;
48     SwAttrSet m_aSet;
49 
50     sal_uInt16 m_nWhichId;
51     sal_uInt16 m_nPoolFormatId;        /**< Id for "automatically" created formats.
52                                        (is not hard attribution!!!) */
53     sal_uInt16 m_nPoolHelpId;       ///< HelpId for this Pool-style.
54     sal_uInt8 m_nPoolHlpFileId;     ///< FilePos to Doc to these style helps.
55     bool   m_bAutoFormat : 1;      /**< FALSE: it is a template.
56                                        default is true! */
57     bool   m_bFormatInDTOR : 1;    /**< TRUE: Format becomes deleted. In order to be able
58                                        to recognize this in FormatChg-message!! */
59     bool   m_bAutoUpdateFormat : 1;/**< TRUE: Set attributes of a whole paragraph
60                                        at format (UI-side!). */
61     bool m_bHidden : 1;
62     std::shared_ptr<SfxGrabBagItem> m_pGrabBagItem; ///< Style InteropGrabBag.
63 
64 protected:
65     SwFormat( SwAttrPool& rPool, const sal_Char* pFormatNm,
66             const sal_uInt16* pWhichRanges, SwFormat *pDrvdFrame, sal_uInt16 nFormatWhich );
67     SwFormat( SwAttrPool& rPool, const OUString &rFormatNm, const sal_uInt16* pWhichRanges,
68             SwFormat *pDrvdFrame, sal_uInt16 nFormatWhich );
69     SwFormat( const SwFormat& rFormat );
70     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ) override;
71 
72 public:
73 
74     virtual ~SwFormat() override;
75     SwFormat &operator=(const SwFormat&);
76 
77     /// for Querying of Writer-functions.
Which() const78     sal_uInt16 Which() const { return m_nWhichId; }
79 
80     /// Copy attributes even among documents.
81     void CopyAttrs( const SwFormat& );
82 
83     /// Delete all attributes that are not in rFormat.
84     void DelDiffs( const SfxItemSet& rSet );
DelDiffs(const SwFormat & rFormat)85     void DelDiffs( const SwFormat& rFormat ) { DelDiffs( rFormat.GetAttrSet() ); }
86 
87     /// 0 is Default.
88     bool SetDerivedFrom(SwFormat *pDerivedFrom = nullptr);
89 
90     /// If bInParents is FALSE, search only in this format for attribute.
91     const SfxPoolItem& GetFormatAttr( sal_uInt16 nWhich,
92                                    bool bInParents = true ) const;
GetFormatAttr(TypedWhichId<T> nWhich,bool bInParents=true) const93     template<class T> const T& GetFormatAttr( TypedWhichId<T> nWhich, bool bInParents = true ) const
94     {
95         return static_cast<const T&>(GetFormatAttr(sal_uInt16(nWhich), bInParents));
96     }
97     SfxItemState GetItemState( sal_uInt16 nWhich, bool bSrchInParent = true,
98                                     const SfxPoolItem **ppItem = nullptr ) const;
99     SfxItemState GetBackgroundState(std::shared_ptr<SvxBrushItem>& rItem) const;
100     virtual bool SetFormatAttr( const SfxPoolItem& rAttr );
101     virtual bool SetFormatAttr( const SfxItemSet& rSet );
102     virtual bool ResetFormatAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 = 0 );
103 
104     /** Takes all hints from Delta-Array,
105         @return count of deleted hints. */
106     virtual sal_uInt16 ResetAllFormatAttr();
107 
DerivedFrom() const108     SwFormat* DerivedFrom() const { return const_cast<SwFormat*>(static_cast<const SwFormat*>(GetRegisteredIn())); }
IsDefault() const109     bool IsDefault() const { return DerivedFrom() == nullptr; }
110 
GetName() const111     const OUString& GetName() const                  { return m_aFormatName; }
HasName(const OUString & rName) const112     bool HasName(const OUString &rName) const { return m_aFormatName == rName; }
113     virtual void SetName( const OUString& rNewName, bool bBroadcast=false );
114 
115     /// For querying the attribute array.
GetAttrSet() const116     const SwAttrSet& GetAttrSet() const { return m_aSet; }
117 
118     /** The document is set in SwAttrPool now, therefore you always can access it. */
GetDoc() const119     const SwDoc *GetDoc() const         { return m_aSet.GetDoc(); }
GetDoc()120           SwDoc *GetDoc()               { return m_aSet.GetDoc(); }
121 
122     /// Provides access to the document settings interface.
123     const IDocumentSettingAccess& getIDocumentSettingAccess() const;
124 
125     /// Provides access to the document draw model interface.
126     const IDocumentDrawModelAccess& getIDocumentDrawModelAccess() const;
127           IDocumentDrawModelAccess& getIDocumentDrawModelAccess();
128 
129     /// Provides access to the document layout interface.
130     const IDocumentLayoutAccess& getIDocumentLayoutAccess() const;
131           IDocumentLayoutAccess& getIDocumentLayoutAccess();
132 
133      /// Provides access to the document idle timer interface.
134      IDocumentTimerAccess& getIDocumentTimerAccess();
135 
136      /// Provides access to the document idle timer interface.
137     IDocumentFieldsAccess& getIDocumentFieldsAccess();
138 
139      /// Gives access to the chart data-provider.
140     IDocumentChartDataProviderAccess& getIDocumentChartDataProviderAccess();
141 
142     /// Get and set Pool style IDs.
GetPoolFormatId() const143     sal_uInt16 GetPoolFormatId() const { return m_nPoolFormatId; }
SetPoolFormatId(sal_uInt16 nId)144     void SetPoolFormatId( sal_uInt16 nId ) { m_nPoolFormatId = nId; }
145 
146     /// Get and set Help-IDs for document templates.
GetPoolHelpId() const147     sal_uInt16 GetPoolHelpId() const { return m_nPoolHelpId; }
SetPoolHelpId(sal_uInt16 nId)148     void SetPoolHelpId( sal_uInt16 nId ) { m_nPoolHelpId = nId; }
GetPoolHlpFileId() const149     sal_uInt8 GetPoolHlpFileId() const { return m_nPoolHlpFileId; }
SetPoolHlpFileId(sal_uInt8 nId)150     void SetPoolHlpFileId( sal_uInt8 nId ) { m_nPoolHlpFileId = nId; }
151 
152     /// Get attribute-description. Returns passed string.
GetPresentation(SfxItemPresentation ePres,MapUnit eCoreMetric,MapUnit ePresMetric,OUString & rText) const153     void GetPresentation( SfxItemPresentation ePres,
154         MapUnit eCoreMetric, MapUnit ePresMetric, OUString &rText ) const
155         { m_aSet.GetPresentation( ePres, eCoreMetric, ePresMetric, rText ); }
156 
157     /// Query / set AutoFormat-flag.
IsAuto() const158     bool IsAuto() const                 { return m_bAutoFormat; }
SetAuto(bool bNew)159     void SetAuto( bool bNew )           { m_bAutoFormat = bNew; }
160 
IsHidden() const161     bool IsHidden() const               { return m_bHidden; }
SetHidden(bool bValue)162     void SetHidden( bool bValue )       { m_bHidden = bValue; }
163 
164     void GetGrabBagItem(css::uno::Any& rVal) const;
165     void SetGrabBagItem(const css::uno::Any& rVal);
166 
167     /// Query / set bAutoUpdateFormat-flag.
IsAutoUpdateFormat() const168     bool IsAutoUpdateFormat() const                { return m_bAutoUpdateFormat; }
SetAutoUpdateFormat(bool bNew=true)169     void SetAutoUpdateFormat( bool bNew = true )   { m_bAutoUpdateFormat = bNew; }
170 
IsFormatInDTOR() const171     bool IsFormatInDTOR() const { return m_bFormatInDTOR; }
172 
173     /** GetMethods: Bool indicates whether to search only in Set (FALSE)
174      or also in Parents.
175      If nothing is found the defaulted attribute is returned. */
176 
177     /// Character-attributes - implemented in charatr.hxx
178     inline const SvxUnderlineItem    &GetUnderline( bool = true ) const;
179     inline const SvxFontHeightItem   &GetSize( bool = true ) const;
180     inline const SvxFontItem         &GetFont( bool = true ) const;
181     inline const SvxColorItem        &GetColor( bool = true ) const;
182     inline const SvxFontItem         &GetCJKFont( bool = true ) const;
183     inline const SvxFontItem         &GetCTLFont( bool = true ) const;
184 
185     /// Frame-attributes - implemented in frmatr.hxx.
186     inline const SwFormatFillOrder           &GetFillOrder( bool = true ) const;
187     inline const SwFormatFrameSize             &GetFrameSize( bool = true ) const;
188     inline const SwFormatHeader          &GetHeader( bool = true ) const;
189     inline const SwFormatFooter          &GetFooter( bool = true ) const;
190     inline const SwFormatSurround            &GetSurround( bool = true ) const;
191     inline const SwFormatHoriOrient      &GetHoriOrient( bool = true ) const;
192     inline const SwFormatAnchor          &GetAnchor( bool = true ) const;
193     inline const SwFormatCol                 &GetCol( bool = true ) const;
194     inline const SvxPaperBinItem      &GetPaperBin( bool = true ) const;
195     inline const SvxLRSpaceItem           &GetLRSpace( bool = true ) const;
196     inline const SvxULSpaceItem           &GetULSpace( bool = true ) const;
197     inline const SwFormatContent           &GetContent( bool = true ) const;
198     inline const SvxPrintItem             &GetPrint( bool = true ) const;
199     inline const SvxOpaqueItem            &GetOpaque( bool = true ) const;
200     inline const SvxProtectItem           &GetProtect( bool = true ) const;
201     inline const SwFormatVertOrient      &GetVertOrient( bool = true ) const;
202     inline const SvxBoxItem               &GetBox( bool = true ) const;
203     inline const SvxFormatKeepItem         &GetKeep( bool = true ) const;
204 
205     // Create SvxBrushItem for Background fill (partially for backwards compatibility)
206     std::shared_ptr<SvxBrushItem> makeBackgroundBrushItem( bool = true ) const;
207 
208     inline const SvxShadowItem            &GetShadow( bool = true ) const;
209     inline const SwFormatPageDesc            &GetPageDesc( bool = true ) const;
210     inline const SvxFormatBreakItem      &GetBreak( bool = true ) const;
211     inline const SvxMacroItem             &GetMacro( bool = true ) const;
212     inline const SwFormatURL             &GetURL( bool = true ) const;
213     inline const SwFormatEditInReadonly  &GetEditInReadonly( bool = true ) const;
214     inline const SwFormatLayoutSplit     &GetLayoutSplit( bool = true ) const;
215     inline const SwFormatRowSplit          &GetRowSplit( bool = true ) const;
216     inline const SwFormatChain               &GetChain( bool = true ) const;
217     inline const SwFormatFootnoteAtTextEnd     &GetFootnoteAtTextEnd( bool = true ) const;
218     inline const SwFormatEndAtTextEnd     &GetEndAtTextEnd( bool = true ) const;
219     inline const SwFormatNoBalancedColumns &GetBalancedColumns( bool = true ) const;
220     inline const SvxFrameDirectionItem    &GetFrameDir( bool = true ) const;
221     inline const SwTextGridItem         &GetTextGrid( bool = true ) const;
222     inline const SwHeaderAndFooterEatSpacingItem &GetHeaderAndFooterEatSpacing( bool = true ) const;
223     // #i18732#
224     inline const SwFormatFollowTextFlow    &GetFollowTextFlow(bool = true) const;
225     // #i28701#
226     inline const SwFormatWrapInfluenceOnObjPos& GetWrapInfluenceOnObjPos(bool = true) const;
227     inline const SdrTextVertAdjustItem& GetTextVertAdjust(bool = true) const;
228 
229     /// Paragraph-attributes - implemented in paratr.hxx.
230     inline const SvxLineSpacingItem       &GetLineSpacing( bool = true ) const;
231     inline const SwNumRuleItem            &GetNumRule( bool = true ) const;
232     inline const SvxTabStopItem           &GetTabStops( bool = true ) const;
233     inline const SwFormatDrop                &GetDrop( bool = true ) const;
234 
235     /// TableBox attributes - implemented in cellatr.hxx.
236     inline  const SwTableBoxNumFormat     &GetTableBoxNumFormat( bool = true ) const;
237     inline  const SwTableBoxFormula       &GetTableBoxFormula( bool = true ) const;
238     inline  const SwTableBoxValue         &GetTableBoxValue( bool = true ) const;
239 
240     /** SwFormat::IsBackgroundTransparent
241 
242         Virtual method to determine, if background of format is transparent.
243         Default implementation returns false. Thus, subclasses have to override
244         method, if the specific subclass can have a transparent background.
245 
246         @return false, default implementation
247     */
248     virtual bool IsBackgroundTransparent() const;
249 
250     // Access to DrawingLayer FillAttributes in a preprocessed form for primitive usage
251     virtual drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const;
252     virtual bool supportsFullDrawingLayerFillAttributeSet() const;
253 };
254 
255 #endif // INCLUDED_SW_INC_FORMAT_HXX
256 
257 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
258