xref: /trunk/main/sw/inc/numrule.hxx (revision 41623124)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _NUMRULE_HXX
24 #define _NUMRULE_HXX
25 
26 #include <tools/link.hxx>
27 #include <tools/gen.hxx>
28 #include <tools/string.hxx>
29 #include <editeng/svxenum.hxx>
30 #include <editeng/numitem.hxx>
31 #include "swdllapi.h"
32 #include <swtypes.hxx>
33 #include <calbck.hxx>
34 #include <errhdl.hxx>
35 #include <error.h>
36 #include <hints.hxx>
37 #include <hash_map>
38 #include <stringhash.hxx>
39 #include <SwNumberTreeTypes.hxx>
40 #include <vector>
41 
42 class SwTxtFmtColl;
43 class IDocumentListsAccess;
44 class SwNodeNum;
45 class Font;
46 class SvxBrushItem;
47 class SvxNumRule;
48 class SwCharFmt;
49 class SwDoc;
50 class SwFmtVertOrient;
51 class SwTxtNode;
52 
53 const sal_Unicode cBulletChar	= 0x2022;	// Charakter fuer Aufzaehlungen
54 
55 class SW_DLLPUBLIC SwNumFmt : public SvxNumberFormat, public SwClient
56 {
57 	SwFmtVertOrient* pVertOrient;
58 	//For i120928,record the cp info of graphic within bullet
59 	sal_Unicode 	cGrfBulletCP;
60 	SW_DLLPRIVATE void UpdateNumNodes( SwDoc* pDoc );
61     SW_DLLPRIVATE virtual void NotifyGraphicArrived();
62 
63     using SvxNumberFormat::operator ==;
64     using SvxNumberFormat::operator !=;
65 
66 protected:
67    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew );
68 
69 public:
70 	SwNumFmt();
71 	SwNumFmt( const SwNumFmt& );
72 	SwNumFmt( const SvxNumberFormat&, SwDoc* pDoc);
73 
74 	virtual ~SwNumFmt();
75 
76 	SwNumFmt& operator=( const SwNumFmt& );
77 
78 	sal_Bool operator==( const SwNumFmt& ) const;
operator !=(const SwNumFmt & r) const79 	sal_Bool operator!=( const SwNumFmt& r ) const { return !(*this == r); }
80 
GetCharFmt() const81 	SwCharFmt* GetCharFmt() const { return (SwCharFmt*)GetRegisteredIn(); }
82 	void SetCharFmt( SwCharFmt* );
83 	//For i120928,access the cp info of graphic within bullet
SetGrfBulletCP(sal_Unicode cP)84 	void			SetGrfBulletCP(sal_Unicode cP){cGrfBulletCP = cP;}
GetGrfBulletCP() const85 	sal_Unicode 	GetGrfBulletCP()const {return cGrfBulletCP;}
86     void ForgetCharFmt();
87 
88 	virtual void			SetCharFmtName(const String& rSet);
89 	virtual const String&	GetCharFmtName()const;
90 
91     virtual void    SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize = 0, const sal_Int16* pOrient = 0);
92 
93     virtual void                SetVertOrient(sal_Int16 eSet);
94     virtual sal_Int16   GetVertOrient() const;
95     const SwFmtVertOrient*      GetGraphicOrientation() const;
96 
97     sal_Bool IsEnumeration() const; // #i22362#
98     sal_Bool IsItemize() const; // #i29560#
99 };
100 
101 class SwPaM;
102 enum SwNumRuleType { OUTLINE_RULE = 0, NUM_RULE = 1, RULE_END = 2 };
103 class SW_DLLPUBLIC SwNumRule
104 {
105 // --> OD 2008-02-19 #refactorlists#
106 public:
107     typedef std::vector< SwTxtNode* > tTxtNodeList;
108     typedef std::vector< SwTxtFmtColl* > tParagraphStyleList;
109 // <--
110 private:
111 	friend void _FinitCore();
112 
113 #ifdef DBG_UTIL
114     long int nSerial;
115     static long int nInstances;
116 #endif
117 
118 	static SwNumFmt* aBaseFmts [ RULE_END ][ MAXLEVEL ];
119 	static sal_uInt16 aDefNumIndents[ MAXLEVEL ];
120     // --> OD 2008-02-11 #newlistlevelattrs#
121     // default list level properties for position-and-space mode LABEL_ALIGNMENT
122     static SwNumFmt* aLabelAlignmentBaseFmts [ RULE_END ][ MAXLEVEL ];
123     // <--
124 	static sal_uInt16 nRefCount;
125 	static char* pDefOutlineName;
126 
127 	SwNumFmt* aFmts[ MAXLEVEL ];
128 
129     /** container for associated text nodes
130 
131     */
132     // --> OD 2008-02-19 #refactorlists#
133 //    SwTxtNodeTable* pTxtNodeList;
134     tTxtNodeList maTxtNodeList;
135     // <--
136 
137     /** container for associated paragraph styles
138 
139         OD 2008-03-03 #refactorlists#
140     */
141     tParagraphStyleList maParagraphStyleList;
142 
143     // #i36749#
144     /**
145        hash_map containing "name->rule" relation
146      */
147     std::hash_map<String, SwNumRule *, StringHash> * pNumRuleMap;
148 
149 	String sName;
150 	SwNumRuleType eRuleType;
151 	sal_uInt16 nPoolFmtId;		// Id-fuer "automatich" erzeugte NumRules
152 	sal_uInt16 nPoolHelpId;		// HelpId fuer diese Pool-Vorlage
153 	sal_uInt8 nPoolHlpFileId; 	// FilePos ans Doc auf die Vorlagen-Hilfen
154 	sal_Bool bAutoRuleFlag : 1;
155 	sal_Bool bInvalidRuleFlag : 1;
156 	sal_Bool bContinusNum : 1;	// Fortlaufende Numerierung - ohne Ebenen
157 	sal_Bool bAbsSpaces : 1;	// die Ebenen repraesentieren absol. Einzuege
158     bool mbCountPhantoms;
159 
160     // --> OD 2008-02-11 #newlistlevelattrs#
161     const SvxNumberFormat::SvxNumPositionAndSpaceMode meDefaultNumberFormatPositionAndSpaceMode;
162     // <--
163 
164     // --> OD 2008-04-03 #refactorlists#
165     String msDefaultListId;
166     // <--
167 
168 public:
169     // --> OD 2008-02-08 #newlistlevelattrs#
170     // add parameter <eDefaultNumberFormatPositionAndSpaceMode>
171     SwNumRule( const String& rNm,
172                const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
173                SwNumRuleType = NUM_RULE,
174                sal_Bool bAutoFlg = sal_True );
175 
176 	SwNumRule( const SwNumRule& );
177 	~SwNumRule();
178 
179 	SwNumRule& operator=( const SwNumRule& );
180 	sal_Bool operator==( const SwNumRule& ) const;
operator !=(const SwNumRule & r) const181 	sal_Bool operator!=( const SwNumRule& r ) const { return !(*this == r); }
182 
183 	const SwNumFmt* GetNumFmt( sal_uInt16 i ) const;
184 	const SwNumFmt& Get( sal_uInt16 i ) const;
185 
186 	void Set( sal_uInt16 i, const SwNumFmt* );
187 	void Set( sal_uInt16 i, const SwNumFmt& );
188 	String MakeNumString( const SwNodeNum&, sal_Bool bInclStrings = sal_True,
189 							sal_Bool bOnlyArabic = sal_False ) const;
190     // --> OD 2005-10-17 #126238#
191     // - add optional parameter <_nRestrictToThisLevel> in order to
192     //   restrict returned string to this level.
193     String MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
194                           const sal_Bool bInclStrings = sal_True,
195                           const sal_Bool bOnlyArabic = sal_False,
196                           const unsigned int _nRestrictToThisLevel = MAXLEVEL ) const;
197     // <--
198     // --> OD 2007-08-24 #i81002#
199     String MakeRefNumString( const SwNodeNum& rNodeNum,
200                              const bool bInclSuperiorNumLabels = false,
201                              const sal_uInt8 nRestrictInclToThisLevel = 0 ) const;
202     // <--
203 
204     /** Returns list of associated text nodes.
205 
206        OD 2008-02-19 #refactorlists#
207 
208        @return list of associated text nodes
209     */
210 //    const SwTxtNodeTable * GetTxtNodeList() const { return pTxtNodeList; }
211     void GetTxtNodeList( SwNumRule::tTxtNodeList& rTxtNodeList ) const;
212     SwNumRule::tTxtNodeList::size_type GetTxtNodeListSize() const;
213 
214     // --> OD 2008-02-19 #refactorlists#
215     void AddTxtNode( SwTxtNode& rTxtNode );
216     void RemoveTxtNode( SwTxtNode& rTxtNode );
217     // <--
218 
219     // --> OD 2008-03-03 #refactorlists#
220     SwNumRule::tParagraphStyleList::size_type GetParagraphStyleListSize() const;
221     void AddParagraphStyle( SwTxtFmtColl& rTxtFmtColl );
222     void RemoveParagraphStyle( SwTxtFmtColl& rTxtFmtColl );
223     // <--
224 
225     // --> OD 2008-04-03 #refactorlists#
SetDefaultListId(const String sDefaultListId)226     inline void SetDefaultListId( const String sDefaultListId )
227     {
228         msDefaultListId = sDefaultListId;
229     }
GetDefaultListId() const230     inline String GetDefaultListId() const
231     {
232         return msDefaultListId;
233     }
234     // <--
235     // #i36749#
236     /**
237        Register this rule in a "name->numrule" map.
238 
239        @param pNumRuleMap      map to register in
240      */
241     void SetNumRuleMap(
242                 std::hash_map<String, SwNumRule *, StringHash>* pNumRuleMap );
243 
GetOutlineRuleName()244 	static char* GetOutlineRuleName() { return pDefOutlineName; }
245 
246 	static sal_uInt16 GetNumIndent( sal_uInt8 nLvl );
247 	static sal_uInt16 GetBullIndent( sal_uInt8 nLvl );
248 
GetRuleType() const249 	SwNumRuleType GetRuleType() const 			{ return eRuleType; }
SetRuleType(SwNumRuleType eNew)250 	void SetRuleType( SwNumRuleType eNew ) 		{ eRuleType = eNew;
251 												  bInvalidRuleFlag = sal_True; }
252 
253 	// eine Art Copy-Constructor, damit die Num-Formate auch an den
254 	// richtigen CharFormaten eines Dokumentes haengen !!
255 	// (Kopiert die NumFormate und returnt sich selbst)
256 	SwNumRule& CopyNumRule( SwDoc*, const SwNumRule& );
257 
258 	// testet ob die CharFormate aus dem angegeben Doc sind und kopiert
259 	// die gegebenfalls
260 	void CheckCharFmts( SwDoc* pDoc );
261 
GetName() const262     const String& GetName() const       { return sName; }
263     // --> OD 2008-07-08 #i91400#
264     void SetName( const String& rNm,
265                   IDocumentListsAccess& rDocListAccess ); // #i36749#
266     // <--
267 
IsAutoRule() const268 	sal_Bool IsAutoRule() const 			{ return bAutoRuleFlag; }
SetAutoRule(sal_Bool bFlag)269 	void SetAutoRule( sal_Bool bFlag )		{ bAutoRuleFlag = bFlag; }
270 
IsInvalidRule() const271 	sal_Bool IsInvalidRule() const 			{ return bInvalidRuleFlag; }
272 	void SetInvalidRule( sal_Bool bFlag );
273 
IsContinusNum() const274 	sal_Bool IsContinusNum() const 			{ return bContinusNum; }
SetContinusNum(sal_Bool bFlag)275 	void SetContinusNum( sal_Bool bFlag )	{ bContinusNum = bFlag; }
276 
IsAbsSpaces() const277 	sal_Bool IsAbsSpaces() const 			{ return bAbsSpaces; }
SetAbsSpaces(sal_Bool bFlag)278 	void SetAbsSpaces( sal_Bool bFlag )		{ bAbsSpaces = bFlag; }
279 
280     // #115901#
IsOutlineRule() const281     sal_Bool IsOutlineRule() const { return eRuleType == OUTLINE_RULE; }
282 
283     bool IsCountPhantoms() const;
284     void SetCountPhantoms(bool bCountPhantoms);
285 
286 	// erfragen und setzen der Poolvorlagen-Id's
GetPoolFmtId() const287 	sal_uInt16 GetPoolFmtId() const			{ return nPoolFmtId; }
SetPoolFmtId(sal_uInt16 nId)288 	void SetPoolFmtId( sal_uInt16 nId ) 	{ nPoolFmtId = nId; }
289 
290 	// erfragen und setzen der Hilfe-Id's fuer die Document-Vorlagen
GetPoolHelpId() const291 	sal_uInt16 GetPoolHelpId() const 		{ return nPoolHelpId; }
SetPoolHelpId(sal_uInt16 nId)292 	void SetPoolHelpId( sal_uInt16 nId ) 	{ nPoolHelpId = nId; }
GetPoolHlpFileId() const293 	sal_uInt8 GetPoolHlpFileId() const 		{ return nPoolHlpFileId; }
SetPoolHlpFileId(sal_uInt8 nId)294 	void SetPoolHlpFileId( sal_uInt8 nId ) 	{ nPoolHlpFileId = nId; }
295 
296 	void		SetSvxRule(const SvxNumRule&, SwDoc* pDoc);
297 	SvxNumRule	MakeSvxNumRule() const;
298 
299     // #i23726#, #i23725#
300     // --> OD 2008-06-09 #i90078#
301     // refactoring: provide certain method for certain purpose
302 //    void        Indent(short aAmount, int nLevel = -1,
303 //                       int nReferenceLevel = -1, sal_Bool bRelative = sal_True,
304 //                       sal_Bool bFirstLine = sal_True, sal_Bool bCheckGtZero = sal_True);
305     // change indent of all list levels by given difference
306     void ChangeIndent( const short nDiff );
307     // set indent of certain list level to given value
308     void SetIndent( const short nNewIndent,
309                     const sal_uInt16 nListLevel );
310     // set indent of first list level to given value and change other list level's
311     // indents accordingly
312     void SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent );
313     // <--
314 
315     void Validate();
316 };
317 
318 // --> OD 2006-06-27 #b6440955#
319 // namespace for static functions and methods for numbering and bullets
320 namespace numfunc
321 {
322     /** retrieve font family name used for the default bullet list characters
323 
324         @author OD
325     */
326     const String& GetDefBulletFontname();
327 
328     /** determine if default bullet font is user defined
329 
330         OD 2008-06-06 #i63395#
331         The default bullet font is user defined, if it is given in the user configuration
332 
333         @author OD
334     */
335     bool IsDefBulletFontUserDefined();
336 
337     /** retrieve font used for the default bullet list characters
338 
339         @author OD
340     */
341     SW_DLLPUBLIC const Font& GetDefBulletFont();
342 
343     /** retrieve unicode of character used for the default bullet list for the given list level
344 
345         @author OD
346     */
347     sal_Unicode GetBulletChar( sal_uInt8 nLevel );
348 
349     /** configuration, if at first position of the first list item the <TAB>-key
350         increased the indent of the complete list or only demotes this list item.
351         The same for <SHIFT-TAB>-key at the same position for decreasing the
352         indent of the complete list or only promotes this list item.
353 
354         OD 2007-10-01 #b6600435#
355 
356         @author OD
357     */
358     sal_Bool ChangeIndentOnTabAtFirstPosOfFirstListItem();
359 
360     /**
361         OD 2008-06-06 #i89178#
362 
363         @author OD
364     */
365     SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode();
366 }
367 
368 #endif	// _NUMRULE_HXX
369