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 #include "pagefrm.hxx" 28 #include "viewsh.hxx" 29 #include "doc.hxx" 30 #include "errhdl.hxx" 31 #include <fmtcntnt.hxx> 32 #include <fmthdft.hxx> 33 #include <fmtfsize.hxx> 34 #include "viewopt.hxx" 35 #include "hffrm.hxx" 36 #include "rootfrm.hxx" 37 #include "txtfrm.hxx" 38 #include "sectfrm.hxx" 39 #include "flyfrm.hxx" 40 #include "frmtool.hxx" 41 #include "dflyobj.hxx" 42 #include "frmfmt.hxx" 43 #include "ndindex.hxx" 44 #include "hfspacingitem.hxx" 45 // OD 2004-05-24 #i28701# 46 #include <sortedobjs.hxx> 47 // --> OD 2005-03-03 #i43771# 48 #include <objectformatter.hxx> 49 // <-- 50 51 extern sal_Bool bObjsDirect; //frmtool.cxx 52 53 static SwTwips lcl_GetFrmMinHeight(const SwLayoutFrm & rFrm) 54 { 55 const SwFmtFrmSize &rSz = rFrm.GetFmt()->GetFrmSize(); 56 SwTwips nMinHeight; 57 58 switch (rSz.GetHeightSizeType()) 59 { 60 case ATT_MIN_SIZE: 61 nMinHeight = rSz.GetHeight(); 62 63 break; 64 65 default: 66 nMinHeight = 0; 67 } 68 69 70 return nMinHeight; 71 } 72 73 74 static SwTwips lcl_CalcContentHeight(SwLayoutFrm & frm) 75 { 76 SwFrm* pFrm = frm.Lower(); 77 78 SwTwips nRemaining = 0; 79 sal_uInt16 nNum = 0; 80 pFrm = frm.Lower(); 81 while ( pFrm ) 82 { 83 SwTwips nTmp; 84 85 nTmp = pFrm->Frm().Height(); 86 nRemaining += nTmp; 87 if( pFrm->IsTxtFrm() && ((SwTxtFrm*)pFrm)->IsUndersized() ) 88 { 89 nTmp = ((SwTxtFrm*)pFrm)->GetParHeight() 90 - pFrm->Prt().Height(); 91 // Dieser TxtFrm waere gern ein bisschen groesser 92 nRemaining += nTmp; 93 } 94 else if( pFrm->IsSctFrm() && ((SwSectionFrm*)pFrm)->IsUndersized() ) 95 { 96 nTmp = ((SwSectionFrm*)pFrm)->Undersize(); 97 nRemaining += nTmp; 98 } 99 pFrm = pFrm->GetNext(); 100 101 nNum++; 102 } 103 104 return nRemaining; 105 } 106 107 static void lcl_LayoutFrmEnsureMinHeight(SwLayoutFrm & rFrm, 108 const SwBorderAttrs * ) 109 { 110 SwTwips nMinHeight = lcl_GetFrmMinHeight(rFrm); 111 112 if (rFrm.Frm().Height() < nMinHeight) 113 { 114 rFrm.Grow(nMinHeight - rFrm.Frm().Height()); 115 } 116 } 117 118 SwHeadFootFrm::SwHeadFootFrm( SwFrmFmt * pFmt, SwFrm* pSib, sal_uInt16 nTypeIn) 119 : SwLayoutFrm( pFmt, pSib ) 120 { 121 nType = nTypeIn; 122 SetDerivedVert( sal_False ); 123 124 const SwFmtCntnt &rCnt = pFmt->GetCntnt(); 125 126 ASSERT( rCnt.GetCntntIdx(), "Kein Inhalt fuer Header." ); 127 128 //Fuer Header Footer die Objekte gleich erzeugen lassen. 129 sal_Bool bOld = bObjsDirect; 130 bObjsDirect = sal_True; 131 sal_uLong nIndex = rCnt.GetCntntIdx()->GetIndex(); 132 ::_InsertCnt( this, pFmt->GetDoc(), ++nIndex ); 133 bObjsDirect = bOld; 134 } 135 136 void SwHeadFootFrm::FormatPrt(SwTwips & nUL, const SwBorderAttrs * pAttrs) 137 { 138 if (GetEatSpacing()) 139 { 140 /* The minimal height of the print area is the minimal height of the 141 frame without the height needed for borders and shadow. */ 142 SwTwips nMinHeight = lcl_GetFrmMinHeight(*this); 143 144 nMinHeight -= pAttrs->CalcTop(); 145 nMinHeight -= pAttrs->CalcBottom(); 146 147 /* If the minimal height of the print area is negative, try to 148 compensate by overlapping */ 149 SwTwips nOverlap = 0; 150 if (nMinHeight < 0) 151 { 152 nOverlap = -nMinHeight; 153 nMinHeight = 0; 154 } 155 156 /* Calculate desired height of content. The minimal height has to be 157 adhered. */ 158 SwTwips nHeight; 159 160 if ( ! HasFixSize() ) 161 nHeight = lcl_CalcContentHeight(*this); 162 else 163 nHeight = nMinHeight; 164 165 if (nHeight < nMinHeight) 166 nHeight = nMinHeight; 167 168 /* calculate initial spacing/line space */ 169 SwTwips nSpace, nLine; 170 171 if (IsHeaderFrm()) 172 { 173 nSpace = pAttrs->CalcBottom(); 174 nLine = pAttrs->CalcBottomLine(); 175 } 176 else 177 { 178 nSpace = pAttrs->CalcTop(); 179 nLine = pAttrs->CalcTopLine(); 180 } 181 182 /* calculate overlap and correct spacing */ 183 nOverlap += nHeight - nMinHeight; 184 if (nOverlap < nSpace - nLine) 185 nSpace -= nOverlap; 186 else 187 nSpace = nLine; 188 189 /* calculate real vertical space between frame and print area */ 190 if (IsHeaderFrm()) 191 nUL = pAttrs->CalcTop() + nSpace; 192 else 193 nUL = pAttrs->CalcBottom() + nSpace; 194 195 /* set print area */ 196 // OD 23.01.2003 #106895# - add first parameter to <SwBorderAttrs::CalcRight(..)> 197 SwTwips nLR = pAttrs->CalcLeft( this ) + pAttrs->CalcRight( this ); 198 199 aPrt.Left(pAttrs->CalcLeft(this)); 200 201 if (IsHeaderFrm()) 202 aPrt.Top(pAttrs->CalcTop()); 203 else 204 aPrt.Top(nSpace); 205 206 aPrt.Width(aFrm.Width() - nLR); 207 208 SwTwips nNewHeight; 209 210 if (nUL < aFrm.Height()) 211 nNewHeight = aFrm.Height() - nUL; 212 else 213 nNewHeight = 0; 214 215 aPrt.Height(nNewHeight); 216 217 } 218 else 219 { 220 //Position einstellen. 221 aPrt.Left( pAttrs->CalcLeft( this ) ); 222 aPrt.Top ( pAttrs->CalcTop() ); 223 224 //Sizes einstellen; die Groesse gibt der umgebende Frm vor, die 225 //die Raender werden einfach abgezogen. 226 // OD 23.01.2003 #106895# - add first parameter to <SwBorderAttrs::CalcRight(..)> 227 SwTwips nLR = pAttrs->CalcLeft( this ) + pAttrs->CalcRight( this ); 228 aPrt.Width ( aFrm.Width() - nLR ); 229 aPrt.Height( aFrm.Height()- nUL ); 230 231 } 232 233 bValidPrtArea = sal_True; 234 } 235 236 void SwHeadFootFrm::FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs) 237 { 238 if ( !HasFixSize() ) 239 { 240 if( !IsColLocked() ) 241 { 242 bValidSize = bValidPrtArea = sal_True; 243 244 const SwTwips nBorder = nUL; 245 SwTwips nMinHeight = lcl_GetFrmMinHeight(*this); 246 nMinHeight -= pAttrs->CalcTop(); 247 nMinHeight -= pAttrs->CalcBottom(); 248 249 if (nMinHeight < 0) 250 nMinHeight = 0; 251 252 ColLock(); 253 254 SwTwips nMaxHeight = LONG_MAX; 255 SwTwips nRemaining, nOldHeight; 256 // --> OD 2006-05-24 #i64301# 257 // use the position of the footer printing area to control invalidation 258 // of the first footer content. 259 Point aOldFooterPrtPos; 260 // <-- 261 262 do 263 { 264 nOldHeight = Prt().Height(); 265 SwFrm* pFrm = Lower(); 266 // --> OD 2006-05-24 #i64301# 267 if ( pFrm && 268 aOldFooterPrtPos != ( Frm().Pos() + Prt().Pos() ) ) 269 { 270 pFrm->_InvalidatePos(); 271 aOldFooterPrtPos = Frm().Pos() + Prt().Pos(); 272 } 273 // <-- 274 while( pFrm ) 275 { 276 pFrm->Calc(); 277 // --> OD 2005-03-03 #i43771# - format also object anchored 278 // at the frame 279 // --> OD 2005-05-03 #i46941# - frame has to be valid. 280 // Note: frame could be invalid after calling its format, 281 // if it's locked 282 ASSERT( StackHack::IsLocked() || !pFrm->IsTxtFrm() || 283 pFrm->IsValid() || 284 static_cast<SwTxtFrm*>(pFrm)->IsJoinLocked(), 285 "<SwHeadFootFrm::FormatSize(..)> - text frame invalid and not locked." ); 286 if ( pFrm->IsTxtFrm() && pFrm->IsValid() ) 287 { 288 if ( !SwObjectFormatter::FormatObjsAtFrm( *pFrm, 289 *(pFrm->FindPageFrm()) ) ) 290 { 291 // restart format with first content 292 pFrm = Lower(); 293 continue; 294 } 295 } 296 // <-- 297 pFrm = pFrm->GetNext(); 298 } 299 nRemaining = 0; 300 pFrm = Lower(); 301 302 while ( pFrm ) 303 { 304 nRemaining += pFrm->Frm().Height(); 305 306 if( pFrm->IsTxtFrm() && 307 ((SwTxtFrm*)pFrm)->IsUndersized() ) 308 // Dieser TxtFrm waere gern ein bisschen groesser 309 nRemaining += ((SwTxtFrm*)pFrm)->GetParHeight() 310 - pFrm->Prt().Height(); 311 else if( pFrm->IsSctFrm() && 312 ((SwSectionFrm*)pFrm)->IsUndersized() ) 313 nRemaining += ((SwSectionFrm*)pFrm)->Undersize(); 314 pFrm = pFrm->GetNext(); 315 } 316 if ( nRemaining < nMinHeight ) 317 nRemaining = nMinHeight; 318 319 SwTwips nDiff = nRemaining - nOldHeight; 320 321 if( !nDiff ) 322 break; 323 if( nDiff < 0 ) 324 { 325 nMaxHeight = nOldHeight; 326 327 if( nRemaining <= nMinHeight ) 328 nRemaining = ( nMaxHeight + nMinHeight + 1 ) / 2; 329 } 330 else 331 { 332 if (nOldHeight > nMinHeight) 333 nMinHeight = nOldHeight; 334 335 if( nRemaining >= nMaxHeight ) 336 nRemaining = ( nMaxHeight + nMinHeight + 1 ) / 2; 337 } 338 339 nDiff = nRemaining - nOldHeight; 340 341 if ( nDiff ) 342 { 343 ColUnlock(); 344 if ( nDiff > 0 ) 345 { 346 if ( Grow( nDiff ) ) 347 { 348 pFrm = Lower(); 349 350 while ( pFrm ) 351 { 352 if( pFrm->IsTxtFrm()) 353 { 354 SwTxtFrm * pTmpFrm = (SwTxtFrm*) pFrm; 355 if (pTmpFrm->IsUndersized() ) 356 { 357 pTmpFrm->InvalidateSize(); 358 pTmpFrm->Prepare(PREP_ADJUST_FRM); 359 } 360 } 361 /* #i3568# Undersized sections need to be 362 invalidated too. */ 363 else if (pFrm->IsSctFrm()) 364 { 365 SwSectionFrm * pTmpFrm = 366 (SwSectionFrm*) pFrm; 367 if (pTmpFrm->IsUndersized() ) 368 { 369 pTmpFrm->InvalidateSize(); 370 pTmpFrm->Prepare(PREP_ADJUST_FRM); 371 } 372 } 373 pFrm = pFrm->GetNext(); 374 } 375 } 376 } 377 else 378 Shrink( -nDiff ); 379 //Schnell auf dem kurzen Dienstweg die Position updaten. 380 381 MakePos(); 382 ColLock(); 383 } 384 else 385 break; 386 //Unterkante des Uppers nicht ueberschreiten. 387 if ( GetUpper() && Frm().Height() ) 388 { 389 const SwTwips nDeadLine = GetUpper()->Frm().Top() + 390 GetUpper()->Prt().Bottom(); 391 const SwTwips nBot = Frm().Bottom(); 392 if ( nBot > nDeadLine ) 393 { 394 Frm().Bottom( nDeadLine ); 395 Prt().SSize().Height() = Frm().Height() - nBorder; 396 } 397 } 398 bValidSize = bValidPrtArea = sal_True; 399 } while( nRemaining<=nMaxHeight && nOldHeight!=Prt().Height() ); 400 ColUnlock(); 401 } 402 bValidSize = bValidPrtArea = sal_True; 403 } 404 else //if ( GetType() & 0x0018 ) 405 { 406 do 407 { 408 if ( Frm().Height() != pAttrs->GetSize().Height() ) 409 ChgSize( Size( Frm().Width(), pAttrs->GetSize().Height())); 410 bValidSize = sal_True; 411 MakePos(); 412 } while ( !bValidSize ); 413 } 414 } 415 416 void SwHeadFootFrm::Format(const SwBorderAttrs * pAttrs) 417 { 418 ASSERT( pAttrs, "SwFooterFrm::Format, pAttrs ist 0." ); 419 420 if ( bValidPrtArea && bValidSize ) 421 return; 422 423 if ( ! GetEatSpacing() && IsHeaderFrm()) 424 { 425 SwLayoutFrm::Format(pAttrs); 426 } 427 else 428 { 429 lcl_LayoutFrmEnsureMinHeight(*this, pAttrs); 430 431 long nUL = pAttrs->CalcTop() + pAttrs->CalcBottom(); 432 433 if ( !bValidPrtArea ) 434 FormatPrt(nUL, pAttrs); 435 436 if ( !bValidSize ) 437 FormatSize(nUL, pAttrs); 438 } 439 } 440 441 SwTwips SwHeadFootFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) 442 { 443 SwTwips nResult; 444 445 if ( IsColLocked() ) 446 { 447 nResult = 0; 448 } 449 else if (!GetEatSpacing()) 450 { 451 nResult = SwLayoutFrm::GrowFrm(nDist, bTst, bInfo); 452 } 453 else 454 { 455 nResult = 0; 456 457 SwBorderAttrAccess * pAccess = 458 new SwBorderAttrAccess( SwFrm::GetCache(), this ); 459 ASSERT(pAccess, "no border attributes"); 460 461 SwBorderAttrs * pAttrs = pAccess->Get(); 462 463 /* First assume the whole amount to grow can be provided by eating 464 spacing. */ 465 SwTwips nEat = nDist; 466 SwTwips nMaxEat; 467 468 /* calculate maximum eatable spacing */ 469 if (IsHeaderFrm()) 470 nMaxEat = aFrm.Height() - aPrt.Top() - aPrt.Height() - pAttrs->CalcBottomLine(); 471 else 472 nMaxEat = aPrt.Top() - pAttrs->CalcTopLine(); 473 474 delete pAccess; 475 476 if (nMaxEat < 0) 477 nMaxEat = 0; 478 479 /* If the frame is too small, eat less spacing thus letting the frame 480 grow more. */ 481 SwTwips nMinHeight = lcl_GetFrmMinHeight(*this); 482 SwTwips nFrameTooSmall = nMinHeight - Frm().Height(); 483 484 if (nFrameTooSmall > 0) 485 nEat -= nFrameTooSmall; 486 487 /* No negative eating, not eating more than allowed. */ 488 if (nEat < 0) 489 nEat = 0; 490 else if (nEat > nMaxEat) 491 nEat = nMaxEat; 492 493 // OD 10.04.2003 #108719# - Notify fly frame, if header frame 494 // grows. Consider, that 'normal' grow of layout frame already notifys 495 // the fly frames. 496 sal_Bool bNotifyFlys = sal_False; 497 if (nEat > 0) 498 { 499 if ( ! bTst) 500 { 501 if (! IsHeaderFrm()) 502 { 503 aPrt.Top(aPrt.Top() - nEat); 504 aPrt.Height(aPrt.Height() - nEat); 505 } 506 507 InvalidateAll(); 508 } 509 510 nResult += nEat; 511 // OD 14.04.2003 #108719# - trigger fly frame notify. 512 if ( IsHeaderFrm() ) 513 { 514 bNotifyFlys = sal_True; 515 } 516 } 517 518 if (nDist - nEat > 0) 519 { 520 SwTwips nFrmGrow = 521 SwLayoutFrm::GrowFrm( nDist - nEat, bTst, bInfo ); 522 523 nResult += nFrmGrow; 524 if ( nFrmGrow > 0 ) 525 { 526 bNotifyFlys = sal_False; 527 } 528 } 529 530 // OD 10.04.2003 #108719# - notify fly frames, if necessary and triggered. 531 if ( ( nResult > 0 ) && bNotifyFlys ) 532 { 533 NotifyLowerObjs(); 534 } 535 } 536 537 if ( nResult && !bTst ) 538 SetCompletePaint(); 539 540 return nResult; 541 } 542 543 SwTwips SwHeadFootFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) 544 { 545 SwTwips nResult; 546 547 if ( IsColLocked() ) 548 { 549 nResult = 0; 550 } 551 else if (! GetEatSpacing()) 552 { 553 nResult = SwLayoutFrm::ShrinkFrm(nDist, bTst, bInfo); 554 } 555 else 556 { 557 nResult = 0; 558 559 SwTwips nMinHeight = lcl_GetFrmMinHeight(*this); 560 SwTwips nOldHeight = Frm().Height(); 561 SwTwips nRest = 0; // Amount to shrink by spitting out spacing 562 563 if ( nOldHeight >= nMinHeight ) 564 { 565 /* If the frame's height is bigger than its minimum height, shrink 566 the frame towards its minimum height. If this is not sufficient 567 to provide the shrinking requested provide the rest by spitting 568 out spacing. */ 569 570 SwTwips nBiggerThanMin = nOldHeight - nMinHeight; 571 572 if (nBiggerThanMin < nDist) 573 { 574 nRest = nDist - nBiggerThanMin; 575 } 576 /* info: declaration of nRest -> else nRest = 0 */ 577 } 578 else 579 /* The frame cannot shrink. Provide shrinking by spitting out 580 spacing. */ 581 nRest = nDist; 582 583 // OD 10.04.2003 #108719# - Notify fly frame, if header/footer frame 584 // shrinks. Consider, that 'normal' shrink of layout frame already notifys 585 // the fly frames. 586 sal_Bool bNotifyFlys = sal_False; 587 if (nRest > 0) 588 { 589 590 SwBorderAttrAccess * pAccess = 591 new SwBorderAttrAccess( SwFrm::GetCache(), this ); 592 ASSERT(pAccess, "no border attributes"); 593 594 SwBorderAttrs * pAttrs = pAccess->Get(); 595 596 /* minimal height of print area */ 597 SwTwips nMinPrtHeight = nMinHeight 598 - pAttrs->CalcTop() 599 - pAttrs->CalcBottom(); 600 601 if (nMinPrtHeight < 0) 602 nMinPrtHeight = 0; 603 604 delete pAccess; 605 606 /* assume all shrinking can be provided */ 607 SwTwips nShrink = nRest; 608 609 /* calculate maximum shrinking */ 610 SwTwips nMaxShrink = aPrt.Height() - nMinPrtHeight; 611 612 /* shrink no more than maximum shrinking */ 613 if (nShrink > nMaxShrink) 614 { 615 //nRest -= nShrink - nMaxShrink; 616 nShrink = nMaxShrink; 617 } 618 619 if (!bTst) 620 { 621 if (! IsHeaderFrm() ) 622 { 623 aPrt.Top(aPrt.Top() + nShrink); 624 aPrt.Height(aPrt.Height() - nShrink); 625 } 626 627 InvalidateAll(); 628 } 629 nResult += nShrink; 630 // OD 14.04.2003 #108719# - trigger fly frame notify. 631 if ( IsHeaderFrm() ) 632 { 633 bNotifyFlys = sal_True; 634 } 635 } 636 637 /* The shrinking not providable by spitting out spacing has to be done 638 by the frame. */ 639 if (nDist - nRest > 0) 640 { 641 SwTwips nShrinkAmount = SwLayoutFrm::ShrinkFrm( nDist - nRest, bTst, bInfo ); 642 nResult += nShrinkAmount; 643 if ( nShrinkAmount > 0 ) 644 { 645 bNotifyFlys = sal_False; 646 } 647 } 648 649 // OD 10.04.2003 #108719# - notify fly frames, if necessary. 650 if ( ( nResult > 0 ) && bNotifyFlys ) 651 { 652 NotifyLowerObjs(); 653 } 654 } 655 656 return nResult; 657 } 658 659 sal_Bool SwHeadFootFrm::GetEatSpacing() const 660 { 661 const SwFrmFmt * pFmt = GetFmt(); 662 ASSERT(pFmt, "SwHeadFootFrm: no format?"); 663 664 if (pFmt->GetHeaderAndFooterEatSpacing().GetValue()) 665 return sal_True; 666 667 return sal_False; 668 } 669 670 671 /************************************************************************* 672 |* 673 |* SwPageFrm::PrepareHeader() 674 |* 675 |* Beschreibung Erzeugt oder Entfernt Header 676 |* Ersterstellung MA 04. Feb. 93 677 |* Letzte Aenderung MA 12. May. 96 678 |* 679 |*************************************************************************/ 680 681 682 void DelFlys( SwLayoutFrm *pFrm, SwPageFrm *pPage ) 683 { 684 for ( int i = 0; pPage->GetSortedObjs() && 685 pPage->GetSortedObjs()->Count() && 686 i < (int)pPage->GetSortedObjs()->Count(); ++i ) 687 { 688 SwAnchoredObject* pObj = (*pPage->GetSortedObjs())[i]; 689 if ( pObj->ISA(SwFlyFrm) ) 690 { 691 SwFlyFrm* pFlyFrm = static_cast<SwFlyFrm*>(pObj); 692 if ( pFrm->IsAnLower( pFlyFrm ) ) 693 { 694 delete pFlyFrm; 695 --i; 696 } 697 } 698 } 699 } 700 701 702 703 void SwPageFrm::PrepareHeader() 704 { 705 SwLayoutFrm *pLay = (SwLayoutFrm*)Lower(); 706 if ( !pLay ) 707 return; 708 709 const SwFmtHeader &rH = ((SwFrmFmt*)GetRegisteredIn())->GetHeader(); 710 711 const ViewShell *pSh = getRootFrm()->GetCurrShell(); 712 const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); 713 714 if ( bOn && rH.IsActive() ) 715 { //Header einsetzen, vorher entfernen falls vorhanden. 716 ASSERT( rH.GetHeaderFmt(), "FrmFmt fuer Header nicht gefunden." ); 717 718 if ( pLay->GetFmt() == (SwFrmFmt*)rH.GetHeaderFmt() ) 719 return; //Der Footer ist bereits der richtige 720 721 if ( pLay->IsHeaderFrm() ) 722 { SwLayoutFrm *pDel = pLay; 723 pLay = (SwLayoutFrm*)pLay->GetNext(); 724 ::DelFlys( pDel, this ); 725 pDel->Cut(); 726 delete pDel; 727 } 728 ASSERT( pLay, "Wohin mit dem Header?" ); 729 SwHeaderFrm *pH = new SwHeaderFrm( (SwFrmFmt*)rH.GetHeaderFmt(), this ); 730 pH->Paste( this, pLay ); 731 if ( GetUpper() ) 732 ::RegistFlys( this, pH ); 733 } 734 else if ( pLay && pLay->IsHeaderFrm() ) 735 { //Header entfernen falls vorhanden. 736 ::DelFlys( pLay, this ); 737 pLay->Cut(); 738 delete pLay; 739 } 740 } 741 /************************************************************************* 742 |* 743 |* SwPageFrm::PrepareFooter() 744 |* 745 |* Beschreibung Erzeugt oder Entfernt Footer 746 |* Ersterstellung MA 04. Feb. 93 747 |* Letzte Aenderung MA 12. May. 96 748 |* 749 |*************************************************************************/ 750 751 752 void SwPageFrm::PrepareFooter() 753 { 754 SwLayoutFrm *pLay = (SwLayoutFrm*)Lower(); 755 if ( !pLay ) 756 return; 757 758 const SwFmtFooter &rF = ((SwFrmFmt*)GetRegisteredIn())->GetFooter(); 759 while ( pLay->GetNext() ) 760 pLay = (SwLayoutFrm*)pLay->GetNext(); 761 762 const ViewShell *pSh = getRootFrm()->GetCurrShell(); 763 const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); 764 765 if ( bOn && rF.IsActive() ) 766 { //Footer einsetzen, vorher entfernen falls vorhanden. 767 ASSERT( rF.GetFooterFmt(), "FrmFmt fuer Footer nicht gefunden." ); 768 769 if ( pLay->GetFmt() == (SwFrmFmt*)rF.GetFooterFmt() ) 770 return; //Der Footer ist bereits der richtige. 771 772 if ( pLay->IsFooterFrm() ) 773 { ::DelFlys( pLay, this ); 774 pLay->Cut(); 775 delete pLay; 776 } 777 SwFooterFrm *pF = new SwFooterFrm( (SwFrmFmt*)rF.GetFooterFmt(), this ); 778 pF->Paste( this ); 779 if ( GetUpper() ) 780 ::RegistFlys( this, pF ); 781 } 782 else if ( pLay && pLay->IsFooterFrm() ) 783 { //Footer entfernen falls vorhanden. 784 ::DelFlys( pLay, this ); 785 ViewShell *pShell; 786 if ( pLay->GetPrev() && 0 != (pShell = getRootFrm()->GetCurrShell()) && 787 pShell->VisArea().HasArea() ) 788 pShell->InvalidateWindows( pShell->VisArea() ); 789 pLay->Cut(); 790 delete pLay; 791 } 792 } 793 794 795 796