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 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 27 28 29 #include <hintids.hxx> 30 #include <editeng/pbinitem.hxx> 31 #include <editeng/ulspitem.hxx> 32 #include <editeng/boxitem.hxx> 33 #include <editeng/brshitem.hxx> 34 #include <editeng/shaditem.hxx> 35 #include <editeng/lrspitem.hxx> 36 #include "editeng/frmdiritem.hxx" 37 #include <fmtclds.hxx> 38 #include <fmtfsize.hxx> 39 #include <frmatr.hxx> 40 #include <pagefrm.hxx> 41 #include <pagedesc.hxx> 42 #include <frmfmt.hxx> 43 #include <fmtcol.hxx> // SwTxtFmtColl 44 #include <node.hxx> 45 #include <swtable.hxx> 46 #include <frmtool.hxx> 47 #include <doc.hxx> // fuer GetAttrPool 48 #include <poolfmt.hxx> 49 #include <switerator.hxx> 50 51 /************************************************************************* 52 |* 53 |* SwPageDesc::SwPageDesc() 54 |* 55 |* Ersterstellung MA 25. Jan. 93 56 |* Letzte Aenderung MA 16. Feb. 94 57 |* 58 |*************************************************************************/ 59 60 61 62 SwPageDesc::SwPageDesc( const String& rName, SwFrmFmt *pFmt, SwDoc *pDc ) : 63 SwModify( 0 ), 64 aDescName( rName ), 65 aMaster( pDc->GetAttrPool(), rName, pFmt ), 66 aLeft( pDc->GetAttrPool(), rName, pFmt ), 67 aDepend( this, 0 ), 68 pFollow( this ), 69 nRegHeight( 0 ), 70 nRegAscent( 0 ), 71 eUse( (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE) ), 72 bLandscape( sal_False ), 73 aFtnInfo() 74 { 75 } 76 77 SwPageDesc::SwPageDesc( const SwPageDesc &rCpy ) : 78 SwModify( 0 ), 79 aDescName( rCpy.GetName() ), 80 aNumType( rCpy.GetNumType() ), 81 aMaster( rCpy.GetMaster() ), 82 aLeft( rCpy.GetLeft() ), 83 aDepend( this, (SwModify*)rCpy.aDepend.GetRegisteredIn() ), 84 pFollow( rCpy.pFollow ), 85 nRegHeight( rCpy.GetRegHeight() ), 86 nRegAscent( rCpy.GetRegAscent() ), 87 eUse( rCpy.ReadUseOn() ), 88 bLandscape( rCpy.GetLandscape() ), 89 aFtnInfo( rCpy.GetFtnInfo() ) 90 { 91 } 92 93 SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc) 94 { 95 aDescName = rSrc.aDescName; 96 aNumType = rSrc.aNumType; 97 aMaster = rSrc.aMaster; 98 aLeft = rSrc.aLeft; 99 100 if (rSrc.pFollow == &rSrc) 101 pFollow = this; 102 else 103 pFollow = rSrc.pFollow; 104 105 nRegHeight = rSrc.nRegHeight; 106 nRegAscent = rSrc.nRegAscent; 107 eUse = rSrc.eUse; 108 bLandscape = rSrc.bLandscape; 109 return *this; 110 } 111 112 SwPageDesc::~SwPageDesc() 113 { 114 } 115 116 /************************************************************************* 117 |* 118 |* SwPageDesc::Mirror() 119 |* 120 |* Beschreibung Gespiegelt werden nur die Raender. 121 |* Attribute wie Umrandung und dergleichen werden 1:1 kopiert. 122 |* Ersterstellung MA 25. Jan. 93 123 |* Letzte Aenderung 01. Nov. 94 124 |* 125 |*************************************************************************/ 126 127 128 129 void SwPageDesc::Mirror() 130 { 131 //Das Spiegeln findet nur beim RandAttribut statt, alle anderen Werte 132 //werden schlicht uebertragen. 133 SvxLRSpaceItem aLR( RES_LR_SPACE ); 134 const SvxLRSpaceItem &rLR = aMaster.GetLRSpace(); 135 aLR.SetLeft( rLR.GetRight() ); 136 aLR.SetRight( rLR.GetLeft() ); 137 138 SfxItemSet aSet( *aMaster.GetAttrSet().GetPool(), 139 aMaster.GetAttrSet().GetRanges() ); 140 aSet.Put( aLR ); 141 aSet.Put( aMaster.GetFrmSize() ); 142 aSet.Put( aMaster.GetPaperBin() ); 143 aSet.Put( aMaster.GetULSpace() ); 144 aSet.Put( aMaster.GetBox() ); 145 aSet.Put( aMaster.GetBackground() ); 146 aSet.Put( aMaster.GetShadow() ); 147 aSet.Put( aMaster.GetCol() ); 148 aSet.Put( aMaster.GetFrmDir() ); // #112217# 149 aLeft.SetFmtAttr( aSet ); 150 } 151 152 void SwPageDesc::ResetAllAttr( sal_Bool bLeft ) 153 { 154 SwFrmFmt& rFmt = bLeft ? GetLeft() : GetMaster(); 155 156 // --> OD 2007-01-25 #i73790# - method renamed 157 rFmt.ResetAllFmtAttr(); 158 // <-- 159 rFmt.SetFmtAttr( SvxFrameDirectionItem(FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR) ); 160 } 161 162 /************************************************************************* 163 |* 164 |* SwPageDesc::GetInfo() 165 |* 166 |* Beschreibung erfragt Informationen 167 |* Ersterstellung JP 31.03.94 168 |* Letzte Aenderung JP 31.03.94 169 |* 170 *************************************************************************/ 171 172 173 // erfrage vom Modify Informationen 174 sal_Bool SwPageDesc::GetInfo( SfxPoolItem & rInfo ) const 175 { 176 // if( RES_AUTOFMT_DOCNODE == rInfo.Which() ) 177 // { 178 // dann weiter zum Format 179 if( !aMaster.GetInfo( rInfo ) ) 180 return sal_False; // gefunden 181 return aLeft.GetInfo( rInfo ); 182 // } 183 // return sal_True; // weiter suchen 184 } 185 186 /************************************************************************* 187 |* 188 |* SwPageDesc::SetRegisterFmtColl() 189 |* 190 |* Beschreibung setzt die Vorlage fuer die Registerhaltigkeit 191 |* Ersterstellung AMA 22.07.96 192 |* Letzte Aenderung AMA 22.07.96 193 |* 194 *************************************************************************/ 195 196 197 void SwPageDesc::SetRegisterFmtColl( const SwTxtFmtColl* pFmt ) 198 { 199 if( pFmt != GetRegisterFmtColl() ) 200 { 201 if( pFmt ) 202 ((SwTxtFmtColl*)pFmt)->Add( &aDepend ); 203 else 204 ((SwTxtFmtColl*)GetRegisterFmtColl())->Remove( &aDepend ); 205 206 RegisterChange(); 207 } 208 } 209 210 /************************************************************************* 211 |* 212 |* SwPageDesc::GetRegisterFmtColl() 213 |* 214 |* Beschreibung holt die Vorlage fuer die Registerhaltigkeit 215 |* Ersterstellung AMA 22.07.96 216 |* Letzte Aenderung AMA 22.07.96 217 |* 218 *************************************************************************/ 219 220 221 const SwTxtFmtColl* SwPageDesc::GetRegisterFmtColl() const 222 { 223 const SwModify* pReg = aDepend.GetRegisteredIn(); 224 return (SwTxtFmtColl*)pReg; 225 } 226 227 /************************************************************************* 228 |* 229 |* SwPageDesc::RegisterChange() 230 |* 231 |* Beschreibung benachrichtigt alle betroffenen PageFrames 232 |* Ersterstellung AMA 22.07.96 233 |* Letzte Aenderung AMA 22.07.96 234 |* 235 *************************************************************************/ 236 237 238 void SwPageDesc::RegisterChange() 239 { 240 // --> OD 2004-06-15 #117072# - During destruction of the document <SwDoc> 241 // the page description is modified. Thus, do nothing, if the document 242 // is in destruction respectively if no viewshell exists. 243 SwDoc* pDoc = GetMaster().GetDoc(); 244 if ( !pDoc || pDoc->IsInDtor() ) 245 { 246 return; 247 } 248 ViewShell* pSh = 0L; 249 pDoc->GetEditShell( &pSh ); 250 if ( !pSh ) 251 { 252 return; 253 } 254 255 nRegHeight = 0; 256 { 257 SwIterator<SwFrm,SwFmt> aIter( GetMaster() ); 258 for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) 259 { 260 if( pLast->IsPageFrm() ) 261 ((SwPageFrm*)pLast)->PrepareRegisterChg(); 262 } 263 } 264 { 265 SwIterator<SwFrm,SwFmt> aIter( GetLeft() ); 266 for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) 267 { 268 if( pLast->IsPageFrm() ) 269 ((SwPageFrm*)pLast)->PrepareRegisterChg(); 270 } 271 } 272 } 273 274 /************************************************************************* 275 |* 276 |* SwPageDesc::Modify() 277 |* 278 |* Beschreibung reagiert insbesondere auf Aenderungen 279 |* der Vorlage fuer die Registerhaltigkeit 280 |* Ersterstellung AMA 22.07.96 281 |* Letzte Aenderung AMA 22.07.96 282 |* 283 *************************************************************************/ 284 285 286 void SwPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ) 287 { 288 const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; 289 NotifyClients( pOld, pNew ); 290 291 if ( (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich) 292 || isCHRATR(nWhich) || (RES_PARATR_LINESPACING == nWhich) ) 293 { 294 RegisterChange(); 295 } 296 } 297 298 static const SwFrm* lcl_GetFrmOfNode( const SwNode& rNd ) 299 { 300 SwModify* pMod; 301 sal_uInt16 nFrmType = FRM_CNTNT; 302 303 if( rNd.IsCntntNode() ) 304 { 305 pMod = &(SwCntntNode&)rNd; 306 } 307 else if( rNd.IsTableNode() ) 308 { 309 pMod = ((SwTableNode&)rNd).GetTable().GetFrmFmt(); 310 nFrmType = FRM_TAB; 311 } 312 else 313 pMod = 0; 314 315 Point aNullPt; 316 return pMod ? ::GetFrmOfModify( 0, *pMod, nFrmType, &aNullPt, 0, sal_False ) 317 : 0; 318 } 319 320 const SwPageDesc* SwPageDesc::GetPageDescOfNode(const SwNode& rNd) 321 { 322 const SwPageDesc* pRet = 0; 323 const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); 324 if (pChkFrm && 0 != (pChkFrm = pChkFrm->FindPageFrm())) 325 pRet = ((const SwPageFrm*)pChkFrm)->GetPageDesc(); 326 return pRet; 327 } 328 329 const SwFrmFmt* SwPageDesc::GetPageFmtOfNode( const SwNode& rNd, 330 sal_Bool bCheckForThisPgDc ) const 331 { 332 // welches PageDescFormat ist fuer diesen Node gueltig? 333 const SwFrmFmt* pRet; 334 const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); 335 336 if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() )) 337 { 338 const SwPageDesc* pPd = bCheckForThisPgDc ? this : 339 ((SwPageFrm*)pChkFrm)->GetPageDesc(); 340 pRet = &pPd->GetMaster(); 341 ASSERT( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, "Wrong node for detection of page format!" ); 342 // an welchem Format haengt diese Seite? 343 if( !pChkFrm->KnowsFormat(*pRet) ) 344 { 345 pRet = &pPd->GetLeft(); 346 ASSERT( pChkFrm->KnowsFormat(*pRet), "Wrong node for detection of page format!" ); 347 } 348 } 349 else 350 pRet = &GetMaster(); 351 return pRet; 352 } 353 354 sal_Bool SwPageDesc::IsFollowNextPageOfNode( const SwNode& rNd ) const 355 { 356 sal_Bool bRet = sal_False; 357 if( GetFollow() && this != GetFollow() ) 358 { 359 const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd ); 360 if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ) && 361 pChkFrm->IsPageFrm() && 362 ( !pChkFrm->GetNext() || GetFollow() == 363 ((SwPageFrm*)pChkFrm->GetNext())->GetPageDesc() )) 364 // die Seite gefunden, auf die der Follow verweist 365 bRet = sal_True; 366 } 367 return bRet; 368 } 369 370 /************************************************************************* 371 |* 372 |* SwPageFtnInfo::SwPageFtnInfo() 373 |* 374 |* Ersterstellung MA 24. Feb. 93 375 |* Letzte Aenderung MA 24. Feb. 93 376 |* 377 |*************************************************************************/ 378 379 380 381 SwPageFtnInfo::SwPageFtnInfo() : 382 nMaxHeight( 0 ), 383 // aPen( PEN_SOLID ), 384 nLineWidth(10), 385 aWidth( 25, 100 ), 386 nTopDist( 57 ), //1mm 387 nBottomDist( 57 ) 388 { 389 eAdj = FRMDIR_HORI_RIGHT_TOP == GetDefaultFrameDirection(GetAppLanguage()) ? 390 FTNADJ_RIGHT : 391 FTNADJ_LEFT; 392 // aPen.SetWidth( 10 ); 393 } 394 395 396 397 SwPageFtnInfo::SwPageFtnInfo( const SwPageFtnInfo &rCpy ) : 398 nMaxHeight( rCpy.GetHeight() ), 399 nLineWidth(rCpy.nLineWidth), 400 aLineColor(rCpy.aLineColor), 401 aWidth( rCpy.GetWidth() ), 402 eAdj( rCpy.GetAdj() ), 403 nTopDist( rCpy.GetTopDist() ), 404 nBottomDist( rCpy.GetBottomDist() ) 405 { 406 } 407 408 /************************************************************************* 409 |* 410 |* SwPageFtnInfo::operator= 411 |* 412 |* Ersterstellung MA 24. Feb. 93 413 |* Letzte Aenderung MA 24. Feb. 93 414 |* 415 |*************************************************************************/ 416 417 418 419 SwPageFtnInfo &SwPageFtnInfo::operator=( const SwPageFtnInfo& rCpy ) 420 { 421 nMaxHeight = rCpy.GetHeight(); 422 nLineWidth = rCpy.nLineWidth; 423 aLineColor = rCpy.aLineColor; 424 aWidth = rCpy.GetWidth(); 425 eAdj = rCpy.GetAdj(); 426 nTopDist = rCpy.GetTopDist(); 427 nBottomDist = rCpy.GetBottomDist(); 428 return *this; 429 } 430 /************************************************************************* 431 |* 432 |* SwPageFtnInfo::operator== 433 |* 434 |* Ersterstellung MA 01. Mar. 93 435 |* Letzte Aenderung MA 01. Mar. 93 436 |* 437 |*************************************************************************/ 438 439 440 441 sal_Bool SwPageFtnInfo::operator==( const SwPageFtnInfo& rCmp ) const 442 { 443 return ( nMaxHeight == rCmp.GetHeight() && 444 nLineWidth == rCmp.nLineWidth && 445 aLineColor == rCmp.aLineColor && 446 aWidth == rCmp.GetWidth() && 447 eAdj == rCmp.GetAdj() && 448 nTopDist == rCmp.GetTopDist() && 449 nBottomDist== rCmp.GetBottomDist() ); 450 } 451 452 SwPageDescExt::SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * _pDoc) 453 : aPageDesc(rPageDesc), pDoc(_pDoc) 454 { 455 SetPageDesc(rPageDesc); 456 } 457 458 SwPageDescExt::SwPageDescExt(const SwPageDescExt & rSrc) 459 : aPageDesc(rSrc.aPageDesc), pDoc(rSrc.pDoc) 460 { 461 SetPageDesc(rSrc.aPageDesc); 462 } 463 464 SwPageDescExt::~SwPageDescExt() 465 { 466 } 467 468 const String & SwPageDescExt::GetName() const 469 { 470 return aPageDesc.GetName(); 471 } 472 473 void SwPageDescExt::SetPageDesc(const SwPageDesc & _aPageDesc) 474 { 475 aPageDesc = _aPageDesc; 476 477 if (aPageDesc.GetFollow()) 478 sFollow = aPageDesc.GetFollow()->GetName(); 479 } 480 481 SwPageDescExt & SwPageDescExt::operator = (const SwPageDesc & rSrc) 482 { 483 SetPageDesc(rSrc); 484 485 return *this; 486 } 487 488 SwPageDescExt & SwPageDescExt::operator = (const SwPageDescExt & rSrc) 489 { 490 SetPageDesc(rSrc.aPageDesc); 491 492 return *this; 493 } 494 495 SwPageDescExt::operator SwPageDesc() const 496 { 497 SwPageDesc aResult(aPageDesc); 498 499 SwPageDesc * pPageDesc = pDoc->GetPageDesc(sFollow); 500 501 if ( 0 != pPageDesc ) 502 aResult.SetFollow(pPageDesc); 503 504 return aResult; 505 } 506