tdf#130857 qt weld: Implement QtInstanceWidget::strip_mnemonic
[LibreOffice.git] / sw / inc / numrule.hxx
blobb9a30ec5554600b83668cb9c424dedc6d025a36c
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
19 #ifndef INCLUDED_SW_INC_NUMRULE_HXX
20 #define INCLUDED_SW_INC_NUMRULE_HXX
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 #include "fmtornt.hxx"
37 class SwTextFormatColl;
38 class IDocumentListsAccess;
39 class SwNodeNum;
40 namespace vcl { class Font; }
41 class SvxBrushItem;
42 class SfxGrabBagItem;
43 class SwDoc;
44 class SwTextNode;
45 class Size;
46 class SwWrtShell;
48 const sal_Unicode cBulletChar = 0x2022; ///< Character for lists.
50 class SW_DLLPUBLIC SwNumFormat final : public SvxNumberFormat, public SwClient
52 SwFormatVertOrient m_aVertOrient;
53 //For i120928,record the cp info of graphic within bullet
54 sal_Unicode m_cGrfBulletCP;
55 SAL_DLLPRIVATE void UpdateNumNodes(SwDoc& rDoc);
57 using SvxNumberFormat::operator ==;
58 using SvxNumberFormat::operator !=;
60 virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
62 public:
63 SwNumFormat();
64 SwNumFormat( const SwNumFormat& );
65 SwNumFormat( const SvxNumberFormat&, SwDoc* pDoc);
67 virtual ~SwNumFormat() override;
69 SwNumFormat& operator=( const SwNumFormat& );
71 bool operator==( const SwNumFormat& ) const;
72 bool operator!=( const SwNumFormat& r ) const { return !(*this == r); }
74 SwCharFormat* GetCharFormat() const { return const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(GetRegisteredIn())); }
75 void SetCharFormat( SwCharFormat* );
77 using SvxNumberFormat::SetCharFormatName;
78 virtual OUString GetCharFormatName() const override;
80 //For i120928,access the cp info of graphic within bullet
81 void SetGrfBulletCP(sal_Unicode cP){m_cGrfBulletCP = cP;}
82 sal_Unicode GetGrfBulletCP() const {return m_cGrfBulletCP;}
84 virtual void SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize = nullptr, const sal_Int16* pOrient = nullptr) override;
86 const SwFormatVertOrient* GetGraphicOrientation() const;
88 bool IsEnumeration() const; // #i22362#
89 bool IsItemize() const; // #i29560#
92 enum SwNumRuleType { OUTLINE_RULE = 0, NUM_RULE = 1, RULE_END = 2 };
93 class SwNumRule
96 public:
97 typedef std::vector< SwTextNode* > tTextNodeList;
98 typedef std::vector< SwTextFormatColl* > tParagraphStyleList;
100 struct Extremities
102 sal_uInt16 nPrefixChars;
103 sal_uInt16 nSuffixChars;
106 private:
107 friend void FinitCore();
109 static SwNumFormat* saBaseFormats [ RULE_END ][ MAXLEVEL ];
110 static const sal_uInt16 saDefNumIndents[ MAXLEVEL ];
111 /// default list level properties for position-and-space mode LABEL_ALIGNMENT
112 static SwNumFormat* saLabelAlignmentBaseFormats [ RULE_END ][ MAXLEVEL ];
113 static sal_uInt16 snRefCount;
115 std::unique_ptr<SwNumFormat> maFormats[ MAXLEVEL ];
117 /** container for associated text nodes */
118 tTextNodeList maTextNodeList;
120 /** container for associated paragraph styles */
121 tParagraphStyleList maParagraphStyleList;
123 /** unordered_map containing "name->rule" relation */
124 std::unordered_map<OUString, SwNumRule *> * mpNumRuleMap;
126 OUString msName;
127 SwNumRuleType meRuleType;
128 sal_uInt16 mnPoolFormatId; ///< Id-for NumRules created "automatically"
129 sal_uInt16 mnPoolHelpId; ///< HelpId for this Pool-style.
130 sal_uInt8 mnPoolHlpFileId; ///< FilePos at Doc on style helps.
131 bool mbAutoRuleFlag : 1;
132 bool mbInvalidRuleFlag : 1;
133 bool mbContinusNum : 1; ///< Continuous numbering without levels.
134 bool mbAbsSpaces : 1; ///< Levels represent absolute indents.
135 bool mbHidden : 1; ///< Is the numbering rule to be hidden in the UI?
136 bool mbCountPhantoms;
137 bool mbUsedByRedline; /// it needs to export as part of tracked numbering change
139 SvxNumberFormat::SvxNumPositionAndSpaceMode meDefaultNumberFormatPositionAndSpaceMode;
140 OUString msDefaultListId;
141 std::shared_ptr<SfxGrabBagItem> mpGrabBagItem; ///< Style InteropGrabBag.
143 public:
144 /// add parameter <eDefaultNumberFormatPositionAndSpaceMode>
145 SW_DLLPUBLIC SwNumRule( OUString aNm,
146 const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
147 SwNumRuleType = NUM_RULE );
149 SW_DLLPUBLIC SwNumRule( const SwNumRule& );
150 SW_DLLPUBLIC ~SwNumRule();
152 SW_DLLPUBLIC SwNumRule& operator=( const SwNumRule& );
153 SW_DLLPUBLIC bool operator==( const SwNumRule& ) const;
154 bool operator!=( const SwNumRule& r ) const { return !(*this == r); }
156 void Reset( const OUString& rName );
158 SW_DLLPUBLIC const SwNumFormat* GetNumFormat( sal_uInt16 i ) const;
159 SW_DLLPUBLIC const SwNumFormat& Get( sal_uInt16 i ) const;
161 bool IsHidden( ) const { return mbHidden; }
162 void SetHidden( bool bValue ) { mbHidden = bValue; }
164 void Set( sal_uInt16 i, const SwNumFormat* );
165 SW_DLLPUBLIC void Set( sal_uInt16 i, const SwNumFormat& );
166 OUString MakeNumString( const SwNodeNum&, bool bInclStrings = true ) const;
167 /** - add optional parameter <_nRestrictToThisLevel> in order to
168 restrict returned string to this level. */
169 SW_DLLPUBLIC OUString MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
170 const bool bInclStrings = true,
171 const unsigned int _nRestrictToThisLevel = MAXLEVEL,
172 const bool bHideNonNumerical = false,
173 Extremities* pExtremities = nullptr,
174 LanguageType nLang = LANGUAGE_SYSTEM) const;
175 OUString MakeRefNumString( const SwNodeNum& rNodeNum,
176 const bool bInclSuperiorNumLabels,
177 const int nRestrictInclToThisLevel,
178 const bool bHideNonNumerical ) const;
179 OUString MakeParagraphStyleListString() const;
181 /** @return list of associated text nodes */
182 void GetTextNodeList( SwNumRule::tTextNodeList& rTextNodeList ) const;
183 SwNumRule::tTextNodeList::size_type GetTextNodeListSize() const;
185 void AddTextNode( SwTextNode& rTextNode );
186 void RemoveTextNode( SwTextNode& rTextNode );
188 SwNumRule::tParagraphStyleList::size_type GetParagraphStyleListSize() const;
189 void AddParagraphStyle( SwTextFormatColl& rTextFormatColl );
190 void RemoveParagraphStyle( SwTextFormatColl& rTextFormatColl );
192 void SetDefaultListId( const OUString& sDefaultListId )
194 msDefaultListId = sDefaultListId;
196 const OUString& GetDefaultListId() const
198 return msDefaultListId;
201 Register this rule in a "name->numrule" map.
203 @param pNumRuleMap map to register in
205 void SetNumRuleMap(
206 std::unordered_map<OUString, SwNumRule *>* pNumRuleMap );
208 static OUString GetOutlineRuleName();
210 static sal_uInt16 GetNumIndent( sal_uInt8 nLvl );
211 static sal_uInt16 GetBullIndent( sal_uInt8 nLvl );
213 SwNumRuleType GetRuleType() const { return meRuleType; }
214 void SetRuleType( SwNumRuleType eNew ) { meRuleType = eNew;
215 mbInvalidRuleFlag = true; }
217 /** A kind of copy-constructor to make sure the num formats are
218 attached to the correctCharFormats of a document!!
219 (Copies the NumFormats and returns itself). */
220 SwNumRule& CopyNumRule( SwDoc&, const SwNumRule& );
222 /** Tests whether the CharFormats are from the given doc
223 and copies them if appropriate. */
224 void CheckCharFormats( SwDoc& rDoc );
226 const OUString& GetName() const { return msName; }
228 void SetName( const OUString& rNm,
229 IDocumentListsAccess& rDocListAccess );
231 bool IsAutoRule() const { return mbAutoRuleFlag; }
232 void SetAutoRule( bool bFlag ) { mbAutoRuleFlag = bFlag; }
234 bool IsInvalidRule() const { return mbInvalidRuleFlag; }
235 void Invalidate() { mbInvalidRuleFlag = true; }
237 bool IsContinusNum() const { return mbContinusNum; }
238 void SetContinusNum( bool bFlag ) { mbContinusNum = bFlag; }
240 bool IsAbsSpaces() const { return mbAbsSpaces; }
241 void SetAbsSpaces( bool bFlag ) { mbAbsSpaces = bFlag; }
243 bool IsOutlineRule() const { return meRuleType == OUTLINE_RULE; }
245 bool IsCountPhantoms() const { return mbCountPhantoms; }
246 void SetCountPhantoms(bool bCountPhantoms);
248 bool IsUsedByRedline() const { return mbUsedByRedline; }
249 void SetUsedByRedline(bool bUsed ) { mbUsedByRedline = bUsed; }
251 /// Query and set PoolFormat IDs.
252 sal_uInt16 GetPoolFormatId() const { return mnPoolFormatId; }
253 void SetPoolFormatId( sal_uInt16 nId ) { mnPoolFormatId = nId; }
255 /// Query and set Help-IDs for document styles.
256 sal_uInt16 GetPoolHelpId() const { return mnPoolHelpId; }
257 void SetPoolHelpId( sal_uInt32 nId ) { mnPoolHelpId = nId; }
258 sal_uInt8 GetPoolHlpFileId() const { return mnPoolHlpFileId; }
259 void SetPoolHlpFileId( sal_uInt8 nId ) { mnPoolHlpFileId = nId; }
261 void SetSvxRule(const SvxNumRule&, SwDoc* pDoc);
262 SvxNumRule MakeSvxNumRule() const;
264 /// change indent of all list levels by given difference
265 void ChangeIndent( const sal_Int32 nDiff );
266 /// set indent of certain list level to given value
267 void SetIndent( const short nNewIndent,
268 const sal_uInt16 nListLevel );
269 /** set indent of first list level to given value and change other list level's
270 indents accordingly */
271 void SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent );
273 void Validate(const SwDoc& rDoc);
274 void dumpAsXml(xmlTextWriterPtr w) const;
275 SW_DLLPUBLIC void GetGrabBagItem(css::uno::Any& rVal) const;
276 void SetGrabBagItem(const css::uno::Any& rVal);
279 /// namespace for static functions and methods for numbering and bullets
280 namespace numfunc
282 /** retrieve font family name used for the default bullet list characters */
283 OUString const & GetDefBulletFontname();
285 /** determine if default bullet font is user defined
287 The default bullet font is user defined, if it is given in the user configuration
289 bool IsDefBulletFontUserDefined();
291 /** retrieve font used for the default bullet list characters */
292 SW_DLLPUBLIC const vcl::Font& GetDefBulletFont();
294 /** retrieve unicode of character used for the default bullet list for the given list level */
295 sal_Unicode GetBulletChar( sal_uInt8 nLevel );
297 /** configuration, if at first position of the first list item the <TAB>-key
298 increased the indent of the complete list or only demotes this list item.
299 The same for <SHIFT-TAB>-key at the same position for decreasing the
300 indent of the complete list or only promotes this list item.
302 bool ChangeIndentOnTabAtFirstPosOfFirstListItem();
305 * Decides if increasing ("downing") the numbering level will change the amount of indentation
306 * or not. This is typically true, unless the numbering levels are invisible and have no
307 * indents.
309 bool NumDownChangesIndent(const SwWrtShell& rShell);
311 SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode();
314 #endif // INCLUDED_SW_INC_NUMRULE_HXX
316 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */