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 _PAGEDESC_HXX
24 #define _PAGEDESC_HXX
25
26 #include <tools/fract.hxx>
27 #include <tools/color.hxx>
28 #include <tools/string.hxx>
29 #include "swdllapi.h"
30 #include <swtypes.hxx> //fuer SwTwips
31 #include <frmfmt.hxx>
32 //#ifndef _NUMRULE_HXX
33 //#include <numrule.hxx>
34 //#endif
35 #include <editeng/numitem.hxx>
36
37 class SfxPoolItem;
38 class SwTxtFmtColl;
39 class SwNode;
40
41 //Separator line adjustment
42 enum SwFtnAdj
43 {
44 FTNADJ_LEFT,
45 FTNADJ_CENTER,
46 FTNADJ_RIGHT
47 };
48
49 //footnote information
50 class SW_DLLPUBLIC SwPageFtnInfo
51 {
52 SwTwips nMaxHeight; //maximum height of the footnote area.
53 sal_uLong nLineWidth; //width of separator line
54 Color aLineColor; //color of the separator line
55 Fraction aWidth; //percentage width of the separator line.
56 SwFtnAdj eAdj; //line adjustment.
57 SwTwips nTopDist; //distance between body and separator.
58 SwTwips nBottomDist; //distance between separator and first footnote
59
60 public:
GetHeight() const61 SwTwips GetHeight() const { return nMaxHeight; }
GetLineWidth() const62 sal_uLong GetLineWidth() const { return nLineWidth; }
GetLineColor() const63 const Color& GetLineColor() const { return aLineColor;}
GetWidth() const64 const Fraction& GetWidth() const { return aWidth; }
GetAdj() const65 SwFtnAdj GetAdj() const { return eAdj; }
GetTopDist() const66 SwTwips GetTopDist()const { return nTopDist; }
GetBottomDist() const67 SwTwips GetBottomDist() const { return nBottomDist; }
68
SetHeight(SwTwips nNew)69 void SetHeight( SwTwips nNew ) { nMaxHeight = nNew; }
SetLineWidth(sal_uLong nSet)70 void SetLineWidth(sal_uLong nSet ) { nLineWidth = nSet; }
SetLineColor(const Color & rCol)71 void SetLineColor(const Color& rCol ) { aLineColor = rCol;}
SetWidth(const Fraction & rNew)72 void SetWidth( const Fraction &rNew){ aWidth = rNew; }
SetAdj(SwFtnAdj eNew)73 void SetAdj ( SwFtnAdj eNew ) { eAdj = eNew; }
SetTopDist(SwTwips nNew)74 void SetTopDist ( SwTwips nNew ) { nTopDist = nNew; }
SetBottomDist(SwTwips nNew)75 void SetBottomDist( SwTwips nNew ) { nBottomDist = nNew; }
76
77 SwPageFtnInfo();
78 SwPageFtnInfo( const SwPageFtnInfo& );
79 SwPageFtnInfo& operator=( const SwPageFtnInfo& );
80
81 sal_Bool operator ==( const SwPageFtnInfo& ) const;
82 };
83
84 /*
85 * Verwendung des UseOnPage (eUse) und der FrmFmt'e
86 *
87 * RIGHT - aMaster nur fuer rechte Seiten, linke Seiten immer leer.
88 * LEFT - aLeft fuer linke Seiten, rechte Seiten immer leer.
89 * aLeft ist eine Kopie des Master.
90 * ALL - aMaster fuer rechte Seiten, aLeft fuer Linke Seiten.
91 * aLeft ist eine Kopie des Master.
92 * MIRROR - aMaster fuer rechte Seiten, aLeft fuer linke Seiten.
93 * aLeft ist eine Kopie des Master, Raender sind gespiegelt.
94 *
95 * UI dreht auschliesslich am Master! aLeft wird beim Chg am Dokument
96 * enstprechend dem eUse eingestellt.
97 *
98 * Damit es die Filter etwas einfacher haben werden weitere Werte im
99 * eUse untergebracht:
100 *
101 * HEADERSHARE - Headerinhalt auf beiden Seiten gleich
102 * FOOTERSHARE - Footerinhalt auf beiden Seiten gleich
103 *
104 * Die Werte werden bei den entsprechenden Get-/Set-Methden ausmaskiert.
105 * Zugriff auf das volle eUse inclusive der Header-Footer information
106 * per ReadUseOn(), WriteUseOn() (fuer Filter und CopyCTor)!
107 *
108 * Die FrmFormate fuer Header/Footer werden anhand der Attribute fuer
109 * Header/Footer vom UI am Master eingestellt (Hoehe, Raender, Hintergrund...);
110 * Header/Footer fuer die Linke Seite werden entsprechen kopiert bzw.
111 * gespielt (Chg am Dokument).
112 * Das jew. Attribut fuer den Inhalt wird automatisch beim Chg am
113 * Dokument versorgt (entsprechen den SHARE-informationen werden Inhalte
114 * erzeugt bzw. entfernt).
115 *
116 */
117
118 typedef sal_uInt16 UseOnPage;
119 namespace nsUseOnPage
120 {
121 const UseOnPage PD_NONE = 0x0000; //for internal use only.
122 const UseOnPage PD_LEFT = 0x0001;
123 const UseOnPage PD_RIGHT = 0x0002;
124 const UseOnPage PD_ALL = 0x0003;
125 const UseOnPage PD_MIRROR = 0x0007;
126 const UseOnPage PD_HEADERSHARE = 0x0040;
127 const UseOnPage PD_FOOTERSHARE = 0x0080;
128 const UseOnPage PD_NOHEADERSHARE = 0x00BF; //for internal use only
129 const UseOnPage PD_NOFOOTERSHARE = 0x007F; //for internal use only
130 }
131
132 class SW_DLLPUBLIC SwPageDesc : public SwModify
133 {
134 friend class SwDoc;
135 friend class SwUndoPageDescExt;
136
137 String aDescName;
138 SvxNumberType aNumType;
139 SwFrmFmt aMaster;
140 SwFrmFmt aLeft;
141 SwDepend aDepend; // wg. Registerhaltigkeit
142 SwPageDesc *pFollow;
143 sal_uInt16 nRegHeight; // Zeilenabstand und Fontascent der Vorlage
144 sal_uInt16 nRegAscent; // fuer die Registerhaltigkeit
145 UseOnPage eUse;
146 sal_Bool bLandscape;
147
148 //Fussnoteninformationen
149 SwPageFtnInfo aFtnInfo;
150
151 //Wird zum Spiegeln vom Chg (Doc) gerufen.
152 //Kein Abgleich an anderer Stelle.
153 SW_DLLPRIVATE void Mirror();
154
155 SW_DLLPRIVATE void ResetAllAttr( sal_Bool bLeft );
156
157 SW_DLLPRIVATE SwPageDesc(const String&, SwFrmFmt*, SwDoc *pDc );
158
159 protected:
160 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNewValue );
161
162 public:
GetName() const163 const String &GetName() const { return aDescName; }
SetName(const String & rNewName)164 void SetName( const String& rNewName ) { aDescName = rNewName; }
165
GetLandscape() const166 sal_Bool GetLandscape() const { return bLandscape; }
SetLandscape(sal_Bool bNew)167 void SetLandscape( sal_Bool bNew ) { bLandscape = bNew; }
168
GetNumType() const169 const SvxNumberType &GetNumType() const { return aNumType; }
SetNumType(const SvxNumberType & rNew)170 void SetNumType( const SvxNumberType& rNew ) { aNumType = rNew; }
171
GetFtnInfo() const172 const SwPageFtnInfo &GetFtnInfo() const { return aFtnInfo; }
GetFtnInfo()173 SwPageFtnInfo &GetFtnInfo() { return aFtnInfo; }
SetFtnInfo(const SwPageFtnInfo & rNew)174 void SetFtnInfo( const SwPageFtnInfo &rNew ) { aFtnInfo = rNew; }
175
176 inline sal_Bool IsHeaderShared() const;
177 inline sal_Bool IsFooterShared() const;
178 inline void ChgHeaderShare( sal_Bool bNew );
179 inline void ChgFooterShare( sal_Bool bNew );
180
181 inline void SetUseOn( UseOnPage eNew );
182 inline UseOnPage GetUseOn() const;
183
WriteUseOn(UseOnPage eNew)184 void WriteUseOn( UseOnPage eNew ) { eUse = eNew; }
ReadUseOn() const185 UseOnPage ReadUseOn () const { return eUse; }
186
GetMaster()187 SwFrmFmt &GetMaster() { return aMaster; }
GetLeft()188 SwFrmFmt &GetLeft() { return aLeft; }
GetMaster() const189 const SwFrmFmt &GetMaster() const { return aMaster; }
GetLeft() const190 const SwFrmFmt &GetLeft() const { return aLeft; }
191
192 // Reset all attrs of the format but keep the ones a pagedesc
193 // cannot live without.
194 inline void ResetAllMasterAttr();
195 inline void ResetAllLeftAttr();
196
197 //Mit den folgenden Methoden besorgt sich das Layout ein Format
198 //um eine Seite erzeugen zu koennen
199 inline SwFrmFmt *GetRightFmt();
200 inline const SwFrmFmt *GetRightFmt() const;
201 inline SwFrmFmt *GetLeftFmt();
202 inline const SwFrmFmt *GetLeftFmt() const;
203
GetRegHeight() const204 sal_uInt16 GetRegHeight() const { return nRegHeight; }
GetRegAscent() const205 sal_uInt16 GetRegAscent() const { return nRegAscent; }
SetRegHeight(sal_uInt16 nNew)206 void SetRegHeight( sal_uInt16 nNew ){ nRegHeight = nNew; }
SetRegAscent(sal_uInt16 nNew)207 void SetRegAscent( sal_uInt16 nNew ){ nRegAscent = nNew; }
208
209 inline void SetFollow( const SwPageDesc* pNew );
GetFollow() const210 const SwPageDesc* GetFollow() const { return pFollow; }
GetFollow()211 SwPageDesc* GetFollow() { return pFollow; }
212
213 void SetRegisterFmtColl( const SwTxtFmtColl* rFmt );
214 const SwTxtFmtColl* GetRegisterFmtColl() const;
215 void RegisterChange();
216
217 // erfragen und setzen der PoolFormat-Id
GetPoolFmtId() const218 sal_uInt16 GetPoolFmtId() const { return aMaster.GetPoolFmtId(); }
SetPoolFmtId(sal_uInt16 nId)219 void SetPoolFmtId( sal_uInt16 nId ) { aMaster.SetPoolFmtId( nId ); }
GetPoolHelpId() const220 sal_uInt16 GetPoolHelpId() const { return aMaster.GetPoolHelpId(); }
SetPoolHelpId(sal_uInt16 nId)221 void SetPoolHelpId( sal_uInt16 nId ) { aMaster.SetPoolHelpId( nId ); }
GetPoolHlpFileId() const222 sal_uInt8 GetPoolHlpFileId() const { return aMaster.GetPoolHlpFileId(); }
SetPoolHlpFileId(sal_uInt8 nId)223 void SetPoolHlpFileId( sal_uInt8 nId ) { aMaster.SetPoolHlpFileId( nId ); }
224
225 // erfrage vom Client Informationen
226 virtual sal_Bool GetInfo( SfxPoolItem& ) const;
227
228 const SwFrmFmt* GetPageFmtOfNode( const SwNode& rNd,
229 sal_Bool bCheckForThisPgDc = sal_True ) const;
230 sal_Bool IsFollowNextPageOfNode( const SwNode& rNd ) const;
231
232 //Given a SwNode return the pagedesc in use at that location.
233 static const SwPageDesc* GetPageDescOfNode(const SwNode& rNd);
234
235 SwPageDesc& operator=( const SwPageDesc& );
236
237 SwPageDesc( const SwPageDesc& );
238 ~SwPageDesc();
239 };
240
SetFollow(const SwPageDesc * pNew)241 inline void SwPageDesc::SetFollow( const SwPageDesc* pNew )
242 {
243 pFollow = pNew ? (SwPageDesc*)pNew : this;
244 }
245
IsHeaderShared() const246 inline sal_Bool SwPageDesc::IsHeaderShared() const
247 {
248 return eUse & nsUseOnPage::PD_HEADERSHARE ? sal_True : sal_False;
249 }
IsFooterShared() const250 inline sal_Bool SwPageDesc::IsFooterShared() const
251 {
252 return eUse & nsUseOnPage::PD_FOOTERSHARE ? sal_True : sal_False;
253 }
ChgHeaderShare(sal_Bool bNew)254 inline void SwPageDesc::ChgHeaderShare( sal_Bool bNew )
255 {
256 if ( bNew )
257 eUse = (UseOnPage) (eUse | nsUseOnPage::PD_HEADERSHARE);
258 // (sal_uInt16&)eUse |= (sal_uInt16)nsUseOnPage::PD_HEADERSHARE;
259 else
260 eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOHEADERSHARE);
261 // (sal_uInt16&)eUse &= (sal_uInt16)nsUseOnPage::PD_NOHEADERSHARE;
262 }
ChgFooterShare(sal_Bool bNew)263 inline void SwPageDesc::ChgFooterShare( sal_Bool bNew )
264 {
265 if ( bNew )
266 eUse = (UseOnPage) (eUse | nsUseOnPage::PD_FOOTERSHARE);
267 // (sal_uInt16&)eUse |= (sal_uInt16)nsUseOnPage::PD_FOOTERSHARE;
268 else
269 eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOFOOTERSHARE);
270 // (sal_uInt16&)eUse &= (sal_uInt16)nsUseOnPage::PD_NOFOOTERSHARE;
271 }
SetUseOn(UseOnPage eNew)272 inline void SwPageDesc::SetUseOn( UseOnPage eNew )
273 {
274 UseOnPage eTmp = nsUseOnPage::PD_NONE;
275 if ( eUse & nsUseOnPage::PD_HEADERSHARE )
276 eTmp = nsUseOnPage::PD_HEADERSHARE;
277 // (sal_uInt16&)eTmp |= (sal_uInt16)nsUseOnPage::PD_HEADERSHARE;
278 if ( eUse & nsUseOnPage::PD_FOOTERSHARE )
279 eTmp = (UseOnPage) (eTmp | nsUseOnPage::PD_FOOTERSHARE);
280 // (sal_uInt16&)eTmp |= (sal_uInt16)nsUseOnPage::PD_FOOTERSHARE;
281 eUse = (UseOnPage) (eTmp | eNew);
282 // (sal_uInt16&)eUse = eTmp | eNew;
283 }
GetUseOn() const284 inline UseOnPage SwPageDesc::GetUseOn() const
285 {
286 UseOnPage eRet = eUse;
287 eRet = (UseOnPage) (eRet & nsUseOnPage::PD_NOHEADERSHARE);
288 // (sal_uInt16&)eRet &= (sal_uInt16)nsUseOnPage::PD_NOHEADERSHARE;
289 eRet = (UseOnPage) (eRet & nsUseOnPage::PD_NOFOOTERSHARE);
290 // (sal_uInt16&)eRet &= (sal_uInt16)nsUseOnPage::PD_NOFOOTERSHARE;
291 return eRet;
292 }
293
ResetAllMasterAttr()294 inline void SwPageDesc::ResetAllMasterAttr()
295 {
296 ResetAllAttr( sal_False );
297 }
298
ResetAllLeftAttr()299 inline void SwPageDesc::ResetAllLeftAttr()
300 {
301 ResetAllAttr( sal_True );
302 }
303
GetRightFmt()304 inline SwFrmFmt *SwPageDesc::GetRightFmt()
305 {
306 return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0;
307 }
GetRightFmt() const308 inline const SwFrmFmt *SwPageDesc::GetRightFmt() const
309 {
310 return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0;
311 }
GetLeftFmt()312 inline SwFrmFmt *SwPageDesc::GetLeftFmt()
313 {
314 return nsUseOnPage::PD_LEFT & eUse ? &aLeft : 0;
315 }
GetLeftFmt() const316 inline const SwFrmFmt *SwPageDesc::GetLeftFmt() const
317 {
318 return nsUseOnPage::PD_LEFT & eUse ? &aLeft : 0;
319 }
320
321 class SwPageDescExt
322 {
323 SwPageDesc aPageDesc;
324 SwDoc * pDoc;
325 String sFollow;
326
327 void SetPageDesc(const SwPageDesc & aPageDesc);
328
329 public:
330 SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * pDoc);
331 SwPageDescExt(const SwPageDescExt & rSrc);
332 ~SwPageDescExt();
333
334 SwPageDescExt & operator = (const SwPageDescExt & rSrc);
335 SwPageDescExt & operator = (const SwPageDesc & rSrc);
336
337 const String & GetName() const;
338
339 operator SwPageDesc() const; // #i7983#
340 };
341
342
343 SwPageDesc* GetPageDescByName_Impl(SwDoc& rDoc, const String& rName);
344
345 #endif //_PAGEDESC_HXX
346