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_NUMRULE_HXX
20 #define INCLUDED_SW_INC_NUMRULE_HXX
21 
22 #include <sal/types.h>
23 #include <rtl/ustring.hxx>
24 #include <editeng/numitem.hxx>
25 #include <i18nlangtag/lang.h>
26 #include "swdllapi.h"
27 #include "swtypes.hxx"
28 #include "calbck.hxx"
29 #include "SwNumberTreeTypes.hxx"
30 #include "ndarr.hxx"
31 #include <unordered_map>
32 #include <memory>
33 #include <vector>
34 #include "charfmt.hxx"
35 
36 class SwTextFormatColl;
37 class IDocumentListsAccess;
38 class SwNodeNum;
39 namespace vcl { class Font; }
40 class SvxBrushItem;
41 class SfxGrabBagItem;
42 class SwDoc;
43 class SwFormatVertOrient;
44 class SwTextNode;
45 class Size;
46 
47 const sal_Unicode cBulletChar = 0x2022; ///< Character for lists.
48 
49 class SW_DLLPUBLIC SwNumFormat final : public SvxNumberFormat, public SwClient
50 {
51     std::unique_ptr<SwFormatVertOrient> m_pVertOrient;
52     //For i120928,record the cp info of graphic within bullet
53     sal_Unicode     m_cGrfBulletCP;
54     SAL_DLLPRIVATE void UpdateNumNodes( SwDoc* pDoc );
55 
56     using SvxNumberFormat::operator ==;
57     using SvxNumberFormat::operator !=;
58 
59     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override;
60 
61 public:
62     SwNumFormat();
63     SwNumFormat( const SwNumFormat& );
64     SwNumFormat( const SvxNumberFormat&, SwDoc* pDoc);
65 
66     virtual ~SwNumFormat() override;
67 
68     SwNumFormat& operator=( const SwNumFormat& );
69 
70     bool operator==( const SwNumFormat& ) const;
operator !=(const SwNumFormat & r) const71     bool operator!=( const SwNumFormat& r ) const { return !(*this == r); }
72 
GetCharFormat() const73     SwCharFormat* GetCharFormat() const { return const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(GetRegisteredIn())); }
74     void       SetCharFormat( SwCharFormat* );
75 
76     using SvxNumberFormat::SetCharFormatName;
77     virtual OUString        GetCharFormatName() const override;
78 
79     //For i120928,access the cp info of graphic within bullet
SetGrfBulletCP(sal_Unicode cP)80     void            SetGrfBulletCP(sal_Unicode cP){m_cGrfBulletCP = cP;}
GetGrfBulletCP() const81     sal_Unicode     GetGrfBulletCP() const {return m_cGrfBulletCP;}
82 
83     virtual void    SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize = nullptr, const sal_Int16* pOrient = nullptr) override;
84 
85     const SwFormatVertOrient*      GetGraphicOrientation() const;
86 
87     bool IsEnumeration() const; // #i22362#
88     bool IsItemize() const; // #i29560#
89 };
90 
91 enum SwNumRuleType { OUTLINE_RULE = 0, NUM_RULE = 1, RULE_END = 2 };
92 class SW_DLLPUBLIC SwNumRule
93 {
94 
95 public:
96     typedef std::vector< SwTextNode* > tTextNodeList;
97     typedef std::vector< SwTextFormatColl* > tParagraphStyleList;
98 
99     struct Extremities
100     {
101         sal_uInt16 nPrefixChars;
102         sal_uInt16 nSuffixChars;
103     };
104 
105 private:
106     friend void FinitCore();
107 
108     static SwNumFormat* maBaseFormats [ RULE_END ][ MAXLEVEL ];
109     static const sal_uInt16 maDefNumIndents[ MAXLEVEL ];
110     /// default list level properties for position-and-space mode LABEL_ALIGNMENT
111     static SwNumFormat* maLabelAlignmentBaseFormats [ RULE_END ][ MAXLEVEL ];
112     static sal_uInt16 mnRefCount;
113 
114     std::unique_ptr<SwNumFormat> maFormats[ MAXLEVEL ];
115 
116     /** container for associated text nodes */
117     tTextNodeList maTextNodeList;
118 
119     /** container for associated paragraph styles */
120     tParagraphStyleList maParagraphStyleList;
121 
122     /** unordered_map containing "name->rule" relation */
123     std::unordered_map<OUString, SwNumRule *> * mpNumRuleMap;
124 
125     OUString msName;
126     SwNumRuleType meRuleType;
127     sal_uInt16 mnPoolFormatId;      ///< Id-for NumRules created "automatically"
128     sal_uInt16 mnPoolHelpId;     ///< HelpId for this Pool-style.
129     sal_uInt8 mnPoolHlpFileId;   ///< FilePos at Doc on style helps.
130     bool mbAutoRuleFlag : 1;
131     bool mbInvalidRuleFlag : 1;
132     bool mbContinusNum : 1;  ///< Continuous numbering without levels.
133     bool mbAbsSpaces : 1;    ///< Levels represent absolute indents.
134     bool mbHidden : 1;       ///< Is the numbering rule to be hidden in the UI?
135     bool mbCountPhantoms;
136     bool mbUsedByRedline;    /// it needs to export as part of tracked numbering change
137 
138     const SvxNumberFormat::SvxNumPositionAndSpaceMode meDefaultNumberFormatPositionAndSpaceMode;
139     OUString msDefaultListId;
140     std::shared_ptr<SfxGrabBagItem> mpGrabBagItem; ///< Style InteropGrabBag.
141 
142 public:
143     /// add parameter <eDefaultNumberFormatPositionAndSpaceMode>
144     SwNumRule( const OUString& rNm,
145                const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
146                SwNumRuleType = NUM_RULE );
147 
148     SwNumRule( const SwNumRule& );
149     ~SwNumRule();
150 
151     SwNumRule& operator=( const SwNumRule& );
152     bool operator==( const SwNumRule& ) const;
operator !=(const SwNumRule & r) const153     bool operator!=( const SwNumRule& r ) const { return !(*this == r); }
154 
155     const SwNumFormat* GetNumFormat( sal_uInt16 i ) const;
156     const SwNumFormat& Get( sal_uInt16 i ) const;
157 
IsHidden() const158     bool IsHidden( ) const { return mbHidden; }
SetHidden(bool bValue)159     void SetHidden( bool bValue ) { mbHidden = bValue; }
160 
161     void Set( sal_uInt16 i, const SwNumFormat* );
162     void Set( sal_uInt16 i, const SwNumFormat& );
163     OUString MakeNumString( const SwNodeNum&, bool bInclStrings = true ) const;
164     /** - add optional parameter <_nRestrictToThisLevel> in order to
165          restrict returned string to this level. */
166     OUString MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
167                           const bool bInclStrings = true,
168                           const bool bOnlyArabic = false,
169                           const unsigned int _nRestrictToThisLevel = MAXLEVEL,
170                           Extremities* pExtremities = nullptr,
171                           LanguageType nLang = LANGUAGE_SYSTEM) const;
172     OUString MakeRefNumString( const SwNodeNum& rNodeNum,
173                              const bool bInclSuperiorNumLabels,
174                              const int nRestrictInclToThisLevel ) const;
175     OUString MakeParagraphStyleListString() const;
176 
177     /** @return list of associated text nodes */
178     void GetTextNodeList( SwNumRule::tTextNodeList& rTextNodeList ) const;
179     SwNumRule::tTextNodeList::size_type GetTextNodeListSize() const;
180 
181     void AddTextNode( SwTextNode& rTextNode );
182     void RemoveTextNode( SwTextNode& rTextNode );
183 
184     SwNumRule::tParagraphStyleList::size_type GetParagraphStyleListSize() const;
185     void AddParagraphStyle( SwTextFormatColl& rTextFormatColl );
186     void RemoveParagraphStyle( SwTextFormatColl& rTextFormatColl );
187 
SetDefaultListId(const OUString & sDefaultListId)188     void SetDefaultListId( const OUString& sDefaultListId )
189     {
190         msDefaultListId = sDefaultListId;
191     }
GetDefaultListId() const192     const OUString& GetDefaultListId() const
193     {
194         return msDefaultListId;
195     }
196     /**
197        Register this rule in a "name->numrule" map.
198 
199        @param pNumRuleMap      map to register in
200      */
201     void SetNumRuleMap(
202                 std::unordered_map<OUString, SwNumRule *>* pNumRuleMap );
203 
204     static OUString GetOutlineRuleName();
205 
206     static sal_uInt16 GetNumIndent( sal_uInt8 nLvl );
207     static sal_uInt16 GetBullIndent( sal_uInt8 nLvl );
208 
GetRuleType() const209     SwNumRuleType GetRuleType() const           { return meRuleType; }
SetRuleType(SwNumRuleType eNew)210     void SetRuleType( SwNumRuleType eNew )      { meRuleType = eNew;
211                                                   mbInvalidRuleFlag = true; }
212 
213     /** A kind of copy-constructor to make sure the num formats are
214        attached to the correctCharFormats of a document!!
215        (Copies the NumFormats and returns itself). */
216     SwNumRule& CopyNumRule( SwDoc*, const SwNumRule& );
217 
218     /** Tests whether the CharFormats are from the given doc
219        and copies them if appropriate. */
220     void CheckCharFormats( SwDoc* pDoc );
221 
GetName() const222     const OUString& GetName() const { return msName; }
223 
224     void SetName( const OUString& rNm,
225                   IDocumentListsAccess& rDocListAccess );
226 
IsAutoRule() const227     bool IsAutoRule() const             { return mbAutoRuleFlag; }
SetAutoRule(bool bFlag)228     void SetAutoRule( bool bFlag )      { mbAutoRuleFlag = bFlag; }
229 
IsInvalidRule() const230     bool IsInvalidRule() const          { return mbInvalidRuleFlag; }
231     void SetInvalidRule( bool bFlag );
232 
IsContinusNum() const233     bool IsContinusNum() const          { return mbContinusNum; }
SetContinusNum(bool bFlag)234     void SetContinusNum( bool bFlag )   { mbContinusNum = bFlag; }
235 
IsAbsSpaces() const236     bool IsAbsSpaces() const            { return mbAbsSpaces; }
SetAbsSpaces(bool bFlag)237     void SetAbsSpaces( bool bFlag )     { mbAbsSpaces = bFlag; }
238 
IsOutlineRule() const239     bool IsOutlineRule() const { return meRuleType == OUTLINE_RULE; }
240 
IsCountPhantoms() const241     bool IsCountPhantoms() const        { return mbCountPhantoms; }
242     void SetCountPhantoms(bool bCountPhantoms);
243 
IsUsedByRedline() const244     bool IsUsedByRedline() const        { return mbUsedByRedline; }
SetUsedByRedline(bool bUsed)245     void SetUsedByRedline(bool bUsed )  { mbUsedByRedline = bUsed; }
246 
247     /// Query and set PoolFormat IDs.
GetPoolFormatId() const248     sal_uInt16 GetPoolFormatId() const         { return mnPoolFormatId; }
SetPoolFormatId(sal_uInt16 nId)249     void SetPoolFormatId( sal_uInt16 nId )     { mnPoolFormatId = nId; }
250 
251     /// Query and set Help-IDs for document styles.
GetPoolHelpId() const252     sal_uInt16 GetPoolHelpId() const        { return mnPoolHelpId; }
SetPoolHelpId(sal_uInt16 nId)253     void SetPoolHelpId( sal_uInt16 nId )    { mnPoolHelpId = nId; }
GetPoolHlpFileId() const254     sal_uInt8 GetPoolHlpFileId() const      { return mnPoolHlpFileId; }
SetPoolHlpFileId(sal_uInt8 nId)255     void SetPoolHlpFileId( sal_uInt8 nId )  { mnPoolHlpFileId = nId; }
256 
257     void        SetSvxRule(const SvxNumRule&, SwDoc* pDoc);
258     SvxNumRule  MakeSvxNumRule() const;
259 
260     /// change indent of all list levels by given difference
261     void ChangeIndent( const sal_Int32 nDiff );
262     /// set indent of certain list level to given value
263     void SetIndent( const short nNewIndent,
264                     const sal_uInt16 nListLevel );
265     /** set indent of first list level to given value and change other list level's
266        indents accordingly */
267     void SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent );
268 
269     void Validate();
270     void dumpAsXml(xmlTextWriterPtr w) const;
271     void GetGrabBagItem(css::uno::Any& rVal) const;
272     void SetGrabBagItem(const css::uno::Any& rVal);
273 };
274 
275 /// namespace for static functions and methods for numbering and bullets
276 namespace numfunc
277 {
278     /** retrieve font family name used for the default bullet list characters */
279     OUString const & GetDefBulletFontname();
280 
281     /** determine if default bullet font is user defined
282 
283         The default bullet font is user defined, if it is given in the user configuration
284     */
285     bool IsDefBulletFontUserDefined();
286 
287     /** retrieve font used for the default bullet list characters */
288     SW_DLLPUBLIC const vcl::Font& GetDefBulletFont();
289 
290     /** retrieve unicode of character used for the default bullet list for the given list level */
291     sal_Unicode GetBulletChar( sal_uInt8 nLevel );
292 
293     /** configuration, if at first position of the first list item the <TAB>-key
294         increased the indent of the complete list or only demotes this list item.
295         The same for <SHIFT-TAB>-key at the same position for decreasing the
296         indent of the complete list or only promotes this list item.
297     */
298     bool ChangeIndentOnTabAtFirstPosOfFirstListItem();
299 
300     SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode();
301 }
302 
303 #endif // INCLUDED_SW_INC_NUMRULE_HXX
304 
305 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
306