xref: /aoo42x/main/sw/inc/pagedesc.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _PAGEDESC_HXX
28 #define _PAGEDESC_HXX
29 
30 #include <tools/fract.hxx>
31 #include <tools/color.hxx>
32 #include <tools/string.hxx>
33 #include "swdllapi.h"
34 #include <swtypes.hxx>	//fuer SwTwips
35 #include <frmfmt.hxx>
36 //#ifndef _NUMRULE_HXX
37 //#include <numrule.hxx>
38 //#endif
39 #include <editeng/numitem.hxx>
40 
41 class SfxPoolItem;
42 class SwTxtFmtColl;
43 class SwNode;
44 
45 //Separator line adjustment
46 enum SwFtnAdj
47 {
48 	FTNADJ_LEFT,
49 	FTNADJ_CENTER,
50 	FTNADJ_RIGHT
51 };
52 
53 //footnote information
54 class SW_DLLPUBLIC SwPageFtnInfo
55 {
56 	SwTwips 	nMaxHeight;		//maximum height of the footnote area.
57 	sal_uLong		nLineWidth;		//width of separator line
58 	Color		aLineColor;		//color of the separator line
59 	Fraction    aWidth;			//percentage width of the separator line.
60 	SwFtnAdj	eAdj;			//line adjustment.
61 	SwTwips		nTopDist;		//distance between body and separator.
62 	SwTwips		nBottomDist;	//distance between separator and first footnote
63 
64 public:
65 	SwTwips   	GetHeight() const 		{ return nMaxHeight; }
66 	sal_uLong 			GetLineWidth() const { return nLineWidth; }
67 	const Color& 	GetLineColor() const { return aLineColor;}
68 	const Fraction&	GetWidth() const 	{ return aWidth; }
69 	SwFtnAdj	GetAdj()	const 		{ return eAdj; }
70 	SwTwips		GetTopDist()const 		{ return nTopDist; }
71 	SwTwips		GetBottomDist() const 	{ return nBottomDist; }
72 
73 	void SetHeight( SwTwips  nNew ) 	{ nMaxHeight = nNew; }
74 	void SetLineWidth(sal_uLong nSet  ) 	{ nLineWidth = nSet; }
75 	void SetLineColor(const Color& rCol )  { aLineColor = rCol;}
76 	void SetWidth( const Fraction &rNew){ aWidth = rNew; }
77 	void SetAdj   ( SwFtnAdj eNew ) 	{ eAdj = eNew; }
78 	void SetTopDist   ( SwTwips nNew ) 	{ nTopDist = nNew; }
79 	void SetBottomDist( SwTwips nNew ) 	{ nBottomDist = nNew; }
80 
81 	SwPageFtnInfo();
82 	SwPageFtnInfo( const SwPageFtnInfo& );
83 	SwPageFtnInfo& operator=( const SwPageFtnInfo& );
84 
85 	sal_Bool operator ==( const SwPageFtnInfo& ) const;
86 };
87 
88 /*
89  * Verwendung des UseOnPage (eUse) und der FrmFmt'e
90  *
91  *	RIGHT	- aMaster nur fuer rechte Seiten, linke  Seiten immer leer.
92  *	LEFT	- aLeft fuer linke  Seiten, rechte Seiten immer leer.
93  *			  aLeft ist eine Kopie des Master.
94  *  ALL		- aMaster fuer rechte Seiten, aLeft fuer Linke Seiten.
95  *			  aLeft ist eine Kopie des Master.
96  *	MIRROR	- aMaster fuer rechte Seiten, aLeft fuer linke Seiten.
97  *			  aLeft ist eine Kopie des Master, Raender sind gespiegelt.
98  *
99  * UI dreht auschliesslich am Master! aLeft wird beim Chg am Dokument
100  * enstprechend dem eUse eingestellt.
101  *
102  * Damit es die Filter etwas einfacher haben werden weitere Werte im
103  * eUse untergebracht:
104  *
105  * HEADERSHARE - Headerinhalt auf beiden Seiten gleich
106  * FOOTERSHARE - Footerinhalt auf beiden Seiten gleich
107  *
108  * Die Werte werden bei den entsprechenden Get-/Set-Methden ausmaskiert.
109  * Zugriff auf das volle eUse inclusive der Header-Footer information
110  * per ReadUseOn(), WriteUseOn() (fuer Filter und CopyCTor)!
111  *
112  * Die FrmFormate fuer Header/Footer werden anhand der Attribute fuer
113  * Header/Footer vom UI am Master eingestellt (Hoehe, Raender, Hintergrund...);
114  * Header/Footer fuer die Linke Seite werden entsprechen kopiert bzw.
115  * gespielt (Chg am Dokument).
116  * Das jew. Attribut fuer den Inhalt wird automatisch beim Chg am
117  * Dokument versorgt (entsprechen den SHARE-informationen werden Inhalte
118  * erzeugt bzw. entfernt).
119  *
120  */
121 
122 typedef sal_uInt16 UseOnPage;
123 namespace nsUseOnPage
124 {
125     const UseOnPage PD_NONE           = 0x0000; //for internal use only.
126     const UseOnPage PD_LEFT           = 0x0001;
127     const UseOnPage PD_RIGHT          = 0x0002;
128     const UseOnPage PD_ALL            = 0x0003;
129     const UseOnPage PD_MIRROR         = 0x0007;
130     const UseOnPage PD_HEADERSHARE    = 0x0040;
131     const UseOnPage PD_FOOTERSHARE    = 0x0080;
132     const UseOnPage PD_NOHEADERSHARE  = 0x00BF; //for internal use only
133     const UseOnPage PD_NOFOOTERSHARE  = 0x007F; //for internal use only
134 }
135 
136 class SW_DLLPUBLIC SwPageDesc : public SwModify
137 {
138 	friend class SwDoc;
139     friend class SwUndoPageDescExt;
140 
141 	String		aDescName;
142 	SvxNumberType	aNumType;
143 	SwFrmFmt	aMaster;
144 	SwFrmFmt	aLeft;
145 	SwDepend	aDepend;	// wg. Registerhaltigkeit
146 	SwPageDesc *pFollow;
147 	sal_uInt16		nRegHeight;	// Zeilenabstand und Fontascent der Vorlage
148 	sal_uInt16		nRegAscent; // fuer die Registerhaltigkeit
149 	UseOnPage	eUse;
150 	sal_Bool		bLandscape;
151 
152 	//Fussnoteninformationen
153 	SwPageFtnInfo aFtnInfo;
154 
155 	//Wird zum Spiegeln vom Chg (Doc) gerufen.
156 	//Kein Abgleich an anderer Stelle.
157 	SW_DLLPRIVATE void Mirror();
158 
159 	SW_DLLPRIVATE void ResetAllAttr( sal_Bool bLeft );
160 
161 	SW_DLLPRIVATE SwPageDesc(const String&, SwFrmFmt*, SwDoc *pDc );
162 
163 protected:
164    virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue );
165 
166 public:
167 	const String &GetName() const { return aDescName; }
168 		  void 	  SetName( const String& rNewName ) { aDescName = rNewName; }
169 
170 	sal_Bool GetLandscape() const { return bLandscape; }
171 	void SetLandscape( sal_Bool bNew ) { bLandscape = bNew; }
172 
173 	const SvxNumberType &GetNumType() const { return aNumType; }
174 		  void		 	SetNumType( const SvxNumberType& rNew ) { aNumType = rNew; }
175 
176 	const SwPageFtnInfo &GetFtnInfo() const { return aFtnInfo; }
177 		  SwPageFtnInfo &GetFtnInfo()		{ return aFtnInfo; }
178 	void  SetFtnInfo( const SwPageFtnInfo &rNew ) { aFtnInfo = rNew; }
179 
180 	inline sal_Bool IsHeaderShared() const;
181 	inline sal_Bool IsFooterShared() const;
182 	inline void ChgHeaderShare( sal_Bool bNew );
183 	inline void ChgFooterShare( sal_Bool bNew );
184 
185 	inline void		 SetUseOn( UseOnPage eNew );
186 	inline UseOnPage GetUseOn() const;
187 
188 	void	  WriteUseOn( UseOnPage eNew ) { eUse = eNew; }
189 	UseOnPage ReadUseOn () const { return eUse; }
190 
191 		  SwFrmFmt &GetMaster() { return aMaster; }
192 		  SwFrmFmt &GetLeft()   { return aLeft; }
193 	const SwFrmFmt &GetMaster() const { return aMaster; }
194 	const SwFrmFmt &GetLeft()   const { return aLeft; }
195 
196 	// Reset all attrs of the format but keep the ones a pagedesc
197 	// cannot live without.
198 	inline void ResetAllMasterAttr();
199 	inline void ResetAllLeftAttr();
200 
201 	//Mit den folgenden Methoden besorgt sich das Layout ein Format
202 	//um eine Seite erzeugen zu koennen
203 	inline SwFrmFmt *GetRightFmt();
204 	inline const SwFrmFmt *GetRightFmt() const;
205 	inline SwFrmFmt *GetLeftFmt();
206 	inline const SwFrmFmt *GetLeftFmt() const;
207 
208 	sal_uInt16 GetRegHeight() const { return nRegHeight; }
209 	sal_uInt16 GetRegAscent() const { return nRegAscent; }
210 	void SetRegHeight( sal_uInt16 nNew ){ nRegHeight = nNew; }
211 	void SetRegAscent( sal_uInt16 nNew ){ nRegAscent = nNew; }
212 
213 	inline void SetFollow( const SwPageDesc* pNew );
214 	const SwPageDesc* GetFollow() const { return pFollow; }
215 		  SwPageDesc* GetFollow() { return pFollow; }
216 
217 	void SetRegisterFmtColl( const SwTxtFmtColl* rFmt );
218 	const SwTxtFmtColl* GetRegisterFmtColl() const;
219 	void RegisterChange();
220 
221 	// erfragen und setzen der PoolFormat-Id
222 	sal_uInt16 GetPoolFmtId() const 		{ return aMaster.GetPoolFmtId(); }
223 	void SetPoolFmtId( sal_uInt16 nId ) 	{ aMaster.SetPoolFmtId( nId ); }
224 	sal_uInt16 GetPoolHelpId() const 		{ return aMaster.GetPoolHelpId(); }
225 	void SetPoolHelpId( sal_uInt16 nId ) 	{ aMaster.SetPoolHelpId( nId ); }
226 	sal_uInt8 GetPoolHlpFileId() const 		{ return aMaster.GetPoolHlpFileId(); }
227 	void SetPoolHlpFileId( sal_uInt8 nId )	{ aMaster.SetPoolHlpFileId( nId ); }
228 
229 		// erfrage vom Client Informationen
230 	virtual sal_Bool GetInfo( SfxPoolItem& ) const;
231 
232 	const SwFrmFmt* GetPageFmtOfNode( const SwNode& rNd,
233 									sal_Bool bCheckForThisPgDc = sal_True ) const;
234 	sal_Bool IsFollowNextPageOfNode( const SwNode& rNd ) const;
235 
236 	//Given a SwNode return the pagedesc in use at that location.
237 	static const SwPageDesc* GetPageDescOfNode(const SwNode& rNd);
238 
239 	SwPageDesc& operator=( const SwPageDesc& );
240 
241 	SwPageDesc( const SwPageDesc& );
242 	~SwPageDesc();
243 };
244 
245 inline void SwPageDesc::SetFollow( const SwPageDesc* pNew )
246 {
247 	pFollow = pNew ? (SwPageDesc*)pNew : this;
248 }
249 
250 inline sal_Bool SwPageDesc::IsHeaderShared() const
251 {
252 	return eUse & nsUseOnPage::PD_HEADERSHARE ? sal_True : sal_False;
253 }
254 inline sal_Bool SwPageDesc::IsFooterShared() const
255 {
256 	return eUse & nsUseOnPage::PD_FOOTERSHARE ? sal_True : sal_False;
257 }
258 inline void SwPageDesc::ChgHeaderShare( sal_Bool bNew )
259 {
260 	if ( bNew )
261 		eUse = (UseOnPage) (eUse | nsUseOnPage::PD_HEADERSHARE);
262 		// (sal_uInt16&)eUse |= (sal_uInt16)nsUseOnPage::PD_HEADERSHARE;
263 	else
264 		eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOHEADERSHARE);
265 		// (sal_uInt16&)eUse &= (sal_uInt16)nsUseOnPage::PD_NOHEADERSHARE;
266 }
267 inline void SwPageDesc::ChgFooterShare( sal_Bool bNew )
268 {
269 	if ( bNew )
270 		eUse = (UseOnPage) (eUse | nsUseOnPage::PD_FOOTERSHARE);
271 		// (sal_uInt16&)eUse |= (sal_uInt16)nsUseOnPage::PD_FOOTERSHARE;
272 	else
273 		eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOFOOTERSHARE);
274 		// (sal_uInt16&)eUse &= (sal_uInt16)nsUseOnPage::PD_NOFOOTERSHARE;
275 }
276 inline void	SwPageDesc::SetUseOn( UseOnPage eNew )
277 {
278 	UseOnPage eTmp = nsUseOnPage::PD_NONE;
279 	if ( eUse & nsUseOnPage::PD_HEADERSHARE )
280 		eTmp = nsUseOnPage::PD_HEADERSHARE;
281 		// (sal_uInt16&)eTmp |= (sal_uInt16)nsUseOnPage::PD_HEADERSHARE;
282 	if ( eUse & nsUseOnPage::PD_FOOTERSHARE )
283 		eTmp = (UseOnPage) (eTmp | nsUseOnPage::PD_FOOTERSHARE);
284 		// (sal_uInt16&)eTmp |= (sal_uInt16)nsUseOnPage::PD_FOOTERSHARE;
285 	eUse = (UseOnPage) (eTmp | eNew);
286 	// (sal_uInt16&)eUse = eTmp | eNew;
287 }
288 inline UseOnPage SwPageDesc::GetUseOn() const
289 {
290 	UseOnPage eRet = eUse;
291 	eRet = (UseOnPage) (eRet & nsUseOnPage::PD_NOHEADERSHARE);
292 	// (sal_uInt16&)eRet &= (sal_uInt16)nsUseOnPage::PD_NOHEADERSHARE;
293 	eRet = (UseOnPage) (eRet & nsUseOnPage::PD_NOFOOTERSHARE);
294 	// (sal_uInt16&)eRet &= (sal_uInt16)nsUseOnPage::PD_NOFOOTERSHARE;
295 	return eRet;
296 }
297 
298 inline void SwPageDesc::ResetAllMasterAttr()
299 {
300 	ResetAllAttr( sal_False );
301 }
302 
303 inline void SwPageDesc::ResetAllLeftAttr()
304 {
305 	ResetAllAttr( sal_True );
306 }
307 
308 inline SwFrmFmt *SwPageDesc::GetRightFmt()
309 {
310 	return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0;
311 }
312 inline const SwFrmFmt *SwPageDesc::GetRightFmt() const
313 {
314 	return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0;
315 }
316 inline SwFrmFmt *SwPageDesc::GetLeftFmt()
317 {
318 	return nsUseOnPage::PD_LEFT & eUse ? &aLeft : 0;
319 }
320 inline const SwFrmFmt *SwPageDesc::GetLeftFmt() const
321 {
322 	return nsUseOnPage::PD_LEFT & eUse ? &aLeft : 0;
323 }
324 
325 class SwPageDescExt
326 {
327     SwPageDesc aPageDesc;
328     SwDoc * pDoc;
329     String sFollow;
330 
331     void SetPageDesc(const SwPageDesc & aPageDesc);
332 
333 public:
334     SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * pDoc);
335     SwPageDescExt(const SwPageDescExt & rSrc);
336     ~SwPageDescExt();
337 
338     SwPageDescExt & operator = (const SwPageDescExt & rSrc);
339     SwPageDescExt & operator = (const SwPageDesc & rSrc);
340 
341     const String & GetName() const;
342 
343     operator SwPageDesc() const; // #i7983#
344 };
345 
346 
347 SwPageDesc* GetPageDescByName_Impl(SwDoc& rDoc, const String& rName);
348 
349 #endif	//_PAGEDESC_HXX
350