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: 61 SwTwips GetHeight() const { return nMaxHeight; } 62 sal_uLong GetLineWidth() const { return nLineWidth; } 63 const Color& GetLineColor() const { return aLineColor;} 64 const Fraction& GetWidth() const { return aWidth; } 65 SwFtnAdj GetAdj() const { return eAdj; } 66 SwTwips GetTopDist()const { return nTopDist; } 67 SwTwips GetBottomDist() const { return nBottomDist; } 68 69 void SetHeight( SwTwips nNew ) { nMaxHeight = nNew; } 70 void SetLineWidth(sal_uLong nSet ) { nLineWidth = nSet; } 71 void SetLineColor(const Color& rCol ) { aLineColor = rCol;} 72 void SetWidth( const Fraction &rNew){ aWidth = rNew; } 73 void SetAdj ( SwFtnAdj eNew ) { eAdj = eNew; } 74 void SetTopDist ( SwTwips nNew ) { nTopDist = 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: 163 const String &GetName() const { return aDescName; } 164 void SetName( const String& rNewName ) { aDescName = rNewName; } 165 166 sal_Bool GetLandscape() const { return bLandscape; } 167 void SetLandscape( sal_Bool bNew ) { bLandscape = bNew; } 168 169 const SvxNumberType &GetNumType() const { return aNumType; } 170 void SetNumType( const SvxNumberType& rNew ) { aNumType = rNew; } 171 172 const SwPageFtnInfo &GetFtnInfo() const { return aFtnInfo; } 173 SwPageFtnInfo &GetFtnInfo() { return aFtnInfo; } 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 184 void WriteUseOn( UseOnPage eNew ) { eUse = eNew; } 185 UseOnPage ReadUseOn () const { return eUse; } 186 187 SwFrmFmt &GetMaster() { return aMaster; } 188 SwFrmFmt &GetLeft() { return aLeft; } 189 const SwFrmFmt &GetMaster() const { return aMaster; } 190 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 204 sal_uInt16 GetRegHeight() const { return nRegHeight; } 205 sal_uInt16 GetRegAscent() const { return nRegAscent; } 206 void SetRegHeight( sal_uInt16 nNew ){ nRegHeight = nNew; } 207 void SetRegAscent( sal_uInt16 nNew ){ nRegAscent = nNew; } 208 209 inline void SetFollow( const SwPageDesc* pNew ); 210 const SwPageDesc* GetFollow() const { return pFollow; } 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 218 sal_uInt16 GetPoolFmtId() const { return aMaster.GetPoolFmtId(); } 219 void SetPoolFmtId( sal_uInt16 nId ) { aMaster.SetPoolFmtId( nId ); } 220 sal_uInt16 GetPoolHelpId() const { return aMaster.GetPoolHelpId(); } 221 void SetPoolHelpId( sal_uInt16 nId ) { aMaster.SetPoolHelpId( nId ); } 222 sal_uInt8 GetPoolHlpFileId() const { return aMaster.GetPoolHlpFileId(); } 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 241 inline void SwPageDesc::SetFollow( const SwPageDesc* pNew ) 242 { 243 pFollow = pNew ? (SwPageDesc*)pNew : this; 244 } 245 246 inline sal_Bool SwPageDesc::IsHeaderShared() const 247 { 248 return eUse & nsUseOnPage::PD_HEADERSHARE ? sal_True : sal_False; 249 } 250 inline sal_Bool SwPageDesc::IsFooterShared() const 251 { 252 return eUse & nsUseOnPage::PD_FOOTERSHARE ? sal_True : sal_False; 253 } 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 } 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 } 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 } 284 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 294 inline void SwPageDesc::ResetAllMasterAttr() 295 { 296 ResetAllAttr( sal_False ); 297 } 298 299 inline void SwPageDesc::ResetAllLeftAttr() 300 { 301 ResetAllAttr( sal_True ); 302 } 303 304 inline SwFrmFmt *SwPageDesc::GetRightFmt() 305 { 306 return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0; 307 } 308 inline const SwFrmFmt *SwPageDesc::GetRightFmt() const 309 { 310 return nsUseOnPage::PD_RIGHT & eUse ? &aMaster : 0; 311 } 312 inline SwFrmFmt *SwPageDesc::GetLeftFmt() 313 { 314 return nsUseOnPage::PD_LEFT & eUse ? &aLeft : 0; 315 } 316 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