Files
libreoffice/sw/source/core/layout/hffrm.cxx

781 lines
23 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patches contributed by Oliver-Rainer Wittmann sw34bf06: #i117783# - Writer's implementation of XPagePrintable - apply print settings to new printing routines http://svn.apache.org/viewvc?view=revision&revision=1172115 sw34bf06: #o12311627# use <rtl_random> methods to create unique ids for list styles and list ids http://svn.apache.org/viewvc?view=revision&revision=1172112 sw34bf06 #i114725#,#i115828# - method <SwDoc::ClearDoc()> - clear list structures completely http://svn.apache.org/viewvc?view=revision&revision=1172122 i#118572 - remove ui string and help content regarding usage of Java Mail in Writer's Mail Merge as Java Mail is not used. http://svn.apache.org/viewvc?view=revision&revision=1197035 Patches contributed by Mathias Bauer cws mba34issues01: #i117718#: provide filter name in case storage of medium does not allow to detect one http://svn.apache.org/viewvc?view=revision&revision=1172350 cws mba34issues01: #i117721#: directly provide parameters retrieved from SfxMedium http://svn.apache.org/viewvc?view=revision&revision=1172353 gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 http://svn.apache.org/viewvc?view=revision&revision=1396797 http://svn.apache.org/viewvc?view=revision&revision=1397315 cws mba34issues01: #i117723#: convert assertion into trace http://svn.apache.org/viewvc?view=revision&revision=1172355 cws mba34issues01: #i117699#: keep layout alive until swdoc dies http://svn.apache.org/viewvc?view=revision&revision=1172362 cws mba34issues01: #i117943#: missing color attributes in RTF clipboard http://svn.apache.org/viewvc?view=revision&revision=1172363 Patch contributed by Henning Brinkmann imported patch i#103878 http://svn.apache.org/viewvc?view=revision&revision=1172109 Patches contributed by Michael Stahl sw34bf06: #i117955#: WW8 export: disable storing of section breaks in endnotes http://svn.apache.org/viewvc?view=revision&revision=1172119 Patch contributed by imacat Fixed the Asian language work count. http://svn.apache.org/viewvc?view=revision&revision=1241345 Patch contributed by Pedro Giffuni i#20878 - Add comment with BZ issue for reference. http://svn.apache.org/viewvc?view=revision&revision=1244517 Patch contributed by Andre Fischer Do not add targets for junit tests when junit is disabled. http://svn.apache.org/viewvc?view=revision&revision=1241508 add writerperfect dependency.
2011-03-31 10:05:04 +02:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
2000-09-18 23:08:29 +00:00
#include "pagefrm.hxx"
#include "viewsh.hxx"
#include "doc.hxx"
#include <fmtcntnt.hxx>
#include <fmthdft.hxx>
#include <fmtfsize.hxx>
#include "viewopt.hxx"
2000-09-18 23:08:29 +00:00
#include "hffrm.hxx"
#include "rootfrm.hxx"
2000-09-18 23:08:29 +00:00
#include "txtfrm.hxx"
#include "sectfrm.hxx"
#include "flyfrm.hxx"
#include "frmtool.hxx"
#include "dflyobj.hxx"
#include "frmfmt.hxx"
#include "ndindex.hxx"
#include "hfspacingitem.hxx"
// OD 2004-05-24 #i28701#
#include <sortedobjs.hxx>
// #i43771#
#include <objectformatter.hxx>
2000-09-18 23:08:29 +00:00
extern bool bObjsDirect; //frmtool.cxx
2000-09-18 23:08:29 +00:00
static SwTwips lcl_GetFrmMinHeight(const SwLayoutFrm & rFrm)
{
const SwFmtFrmSize &rSz = rFrm.GetFmt()->GetFrmSize();
SwTwips nMinHeight;
2000-09-18 23:08:29 +00:00
switch (rSz.GetHeightSizeType())
{
case ATT_MIN_SIZE:
nMinHeight = rSz.GetHeight();
2000-09-18 23:08:29 +00:00
break;
2000-09-18 23:08:29 +00:00
default:
nMinHeight = 0;
}
2000-09-18 23:08:29 +00:00
return nMinHeight;
2000-09-18 23:08:29 +00:00
}
2001-10-19 09:25:19 +00:00
static SwTwips lcl_CalcContentHeight(SwLayoutFrm & frm)
2000-09-18 23:08:29 +00:00
{
SwTwips nRemaining = 0;
sal_uInt16 nNum = 0;
SwFrm* pFrm = frm.Lower();
while ( pFrm )
{
SwTwips nTmp;
nTmp = pFrm->Frm().Height();
nRemaining += nTmp;
if( pFrm->IsTxtFrm() && ((SwTxtFrm*)pFrm)->IsUndersized() )
{
nTmp = ((SwTxtFrm*)pFrm)->GetParHeight()
- pFrm->Prt().Height();
// This TxtFrm would like to be a bit bigger
nRemaining += nTmp;
}
else if( pFrm->IsSctFrm() && ((SwSectionFrm*)pFrm)->IsUndersized() )
{
nTmp = ((SwSectionFrm*)pFrm)->Undersize();
nRemaining += nTmp;
}
pFrm = pFrm->GetNext();
nNum++;
}
return nRemaining;
2000-09-18 23:08:29 +00:00
}
static void lcl_LayoutFrmEnsureMinHeight(SwLayoutFrm & rFrm,
const SwBorderAttrs * )
{
SwTwips nMinHeight = lcl_GetFrmMinHeight(rFrm);
2000-09-18 23:08:29 +00:00
if (rFrm.Frm().Height() < nMinHeight)
{
rFrm.Grow(nMinHeight - rFrm.Frm().Height());
}
}
2000-09-18 23:08:29 +00:00
SwHeadFootFrm::SwHeadFootFrm( SwFrmFmt * pFmt, SwFrm* pSib, sal_uInt16 nTypeIn)
: SwLayoutFrm( pFmt, pSib )
2000-09-18 23:08:29 +00:00
{
nType = nTypeIn;
SetDerivedVert( sal_False );
2000-09-18 23:08:29 +00:00
const SwFmtCntnt &rCnt = pFmt->GetCntnt();
OSL_ENSURE( rCnt.GetCntntIdx(), "No content for Header." );
2000-09-18 23:08:29 +00:00
// Have the objects created right now for header and footer
bool bOld = bObjsDirect;
bObjsDirect = true;
sal_uLong nIndex = rCnt.GetCntntIdx()->GetIndex();
2000-09-18 23:08:29 +00:00
::_InsertCnt( this, pFmt->GetDoc(), ++nIndex );
bObjsDirect = bOld;
}
void SwHeadFootFrm::FormatPrt(SwTwips & nUL, const SwBorderAttrs * pAttrs)
2000-09-18 23:08:29 +00:00
{
if (GetEatSpacing())
{
/* The minimal height of the print area is the minimal height of the
frame without the height needed for borders and shadow. */
SwTwips nMinHeight = lcl_GetFrmMinHeight(*this);
2000-09-18 23:08:29 +00:00
nMinHeight -= pAttrs->CalcTop();
nMinHeight -= pAttrs->CalcBottom();
2000-09-18 23:08:29 +00:00
/* If the minimal height of the print area is negative, try to
compensate by overlapping */
SwTwips nOverlap = 0;
if (nMinHeight < 0)
{
nOverlap = -nMinHeight;
nMinHeight = 0;
}
2000-09-18 23:08:29 +00:00
/* Calculate desired height of content. The minimal height has to be
adhered. */
SwTwips nHeight;
if ( ! HasFixSize() )
nHeight = lcl_CalcContentHeight(*this);
else
nHeight = nMinHeight;
if (nHeight < nMinHeight)
nHeight = nMinHeight;
/* calculate initial spacing/line space */
SwTwips nSpace, nLine;
if (IsHeaderFrm())
{
nSpace = pAttrs->CalcBottom();
nLine = pAttrs->CalcBottomLine();
}
else
{
nSpace = pAttrs->CalcTop();
nLine = pAttrs->CalcTopLine();
}
/* calculate overlap and correct spacing */
nOverlap += nHeight - nMinHeight;
if (nOverlap < nSpace - nLine)
nSpace -= nOverlap;
else
nSpace = nLine;
/* calculate real vertical space between frame and print area */
if (IsHeaderFrm())
nUL = pAttrs->CalcTop() + nSpace;
else
nUL = pAttrs->CalcBottom() + nSpace;
/* set print area */
// OD 23.01.2003 #106895# - add first parameter to <SwBorderAttrs::CalcRight(..)>
SwTwips nLR = pAttrs->CalcLeft( this ) + pAttrs->CalcRight( this );
aPrt.Left(pAttrs->CalcLeft(this));
if (IsHeaderFrm())
aPrt.Top(pAttrs->CalcTop());
else
aPrt.Top(nSpace);
aPrt.Width(aFrm.Width() - nLR);
SwTwips nNewHeight;
if (nUL < aFrm.Height())
nNewHeight = aFrm.Height() - nUL;
else
nNewHeight = 0;
2000-09-18 23:08:29 +00:00
aPrt.Height(nNewHeight);
}
else
{
// Set position
2000-09-18 23:08:29 +00:00
aPrt.Left( pAttrs->CalcLeft( this ) );
aPrt.Top ( pAttrs->CalcTop() );
// Set sizes - the sizes are given by the surrounding Frm, just
// subtract the borders.
// OD 23.01.2003 #106895# - add first parameter to <SwBorderAttrs::CalcRight(..)>
SwTwips nLR = pAttrs->CalcLeft( this ) + pAttrs->CalcRight( this );
2000-09-18 23:08:29 +00:00
aPrt.Width ( aFrm.Width() - nLR );
aPrt.Height( aFrm.Height()- nUL );
2000-09-18 23:08:29 +00:00
}
bValidPrtArea = sal_True;
}
void SwHeadFootFrm::FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs)
{
if ( !HasFixSize() )
2000-09-18 23:08:29 +00:00
{
if( !IsColLocked() )
2000-09-18 23:08:29 +00:00
{
bValidSize = bValidPrtArea = sal_True;
2002-10-08 11:42:24 +00:00
const SwTwips nBorder = nUL;
SwTwips nMinHeight = lcl_GetFrmMinHeight(*this);
nMinHeight -= pAttrs->CalcTop();
nMinHeight -= pAttrs->CalcBottom();
if (nMinHeight < 0)
nMinHeight = 0;
ColLock();
SwTwips nMaxHeight = LONG_MAX;
SwTwips nRemaining, nOldHeight;
// #i64301#
// use the position of the footer printing area to control invalidation
// of the first footer content.
Point aOldFooterPrtPos;
2002-10-08 11:42:24 +00:00
do
{
nOldHeight = Prt().Height();
SwFrm* pFrm = Lower();
// #i64301#
if ( pFrm &&
aOldFooterPrtPos != ( Frm().Pos() + Prt().Pos() ) )
2000-09-18 23:08:29 +00:00
{
pFrm->_InvalidatePos();
aOldFooterPrtPos = Frm().Pos() + Prt().Pos();
}
while( pFrm )
{
pFrm->Calc();
// #i43771# - format also object anchored
// at the frame
// #i46941# - frame has to be valid.
// Note: frame could be invalid after calling its format,
// if it's locked
OSL_ENSURE( StackHack::IsLocked() || !pFrm->IsTxtFrm() ||
pFrm->IsValid() ||
static_cast<SwTxtFrm*>(pFrm)->IsJoinLocked(),
"<SwHeadFootFrm::FormatSize(..)> - text frame invalid and not locked." );
if ( pFrm->IsTxtFrm() && pFrm->IsValid() )
{
if ( !SwObjectFormatter::FormatObjsAtFrm( *pFrm,
*(pFrm->FindPageFrm()) ) )
{
// restart format with first content
pFrm = Lower();
continue;
}
}
pFrm = pFrm->GetNext();
}
nRemaining = 0;
pFrm = Lower();
while ( pFrm )
{
nRemaining += pFrm->Frm().Height();
if( pFrm->IsTxtFrm() &&
((SwTxtFrm*)pFrm)->IsUndersized() )
// This TxtFrm would like to be a bit bigger
nRemaining += ((SwTxtFrm*)pFrm)->GetParHeight()
- pFrm->Prt().Height();
else if( pFrm->IsSctFrm() &&
((SwSectionFrm*)pFrm)->IsUndersized() )
nRemaining += ((SwSectionFrm*)pFrm)->Undersize();
pFrm = pFrm->GetNext();
}
if ( nRemaining < nMinHeight )
nRemaining = nMinHeight;
SwTwips nDiff = nRemaining - nOldHeight;
if( !nDiff )
break;
if( nDiff < 0 )
{
nMaxHeight = nOldHeight;
2002-10-08 11:42:24 +00:00
if( nRemaining <= nMinHeight )
nRemaining = ( nMaxHeight + nMinHeight + 1 ) / 2;
}
else
{
if (nOldHeight > nMinHeight)
nMinHeight = nOldHeight;
if( nRemaining >= nMaxHeight )
nRemaining = ( nMaxHeight + nMinHeight + 1 ) / 2;
}
nDiff = nRemaining - nOldHeight;
if ( nDiff )
{
ColUnlock();
if ( nDiff > 0 )
2000-09-18 23:08:29 +00:00
{
if ( Grow( nDiff ) )
2002-08-19 14:30:36 +00:00
{
pFrm = Lower();
while ( pFrm )
{
if( pFrm->IsTxtFrm())
{
SwTxtFrm * pTmpFrm = (SwTxtFrm*) pFrm;
if (pTmpFrm->IsUndersized() )
{
pTmpFrm->InvalidateSize();
pTmpFrm->Prepare(PREP_ADJUST_FRM);
}
}
/* #i3568# Undersized sections need to be
invalidated too. */
else if (pFrm->IsSctFrm())
{
SwSectionFrm * pTmpFrm =
(SwSectionFrm*) pFrm;
if (pTmpFrm->IsUndersized() )
{
pTmpFrm->InvalidateSize();
pTmpFrm->Prepare(PREP_ADJUST_FRM);
}
}
pFrm = pFrm->GetNext();
}
2002-08-19 14:30:36 +00:00
}
2000-09-18 23:08:29 +00:00
}
else
Shrink( -nDiff );
// Quickly update the position
MakePos();
ColLock();
}
else
break;
// Don't overwrite the lower edge of the upper
if ( GetUpper() && Frm().Height() )
{
const SwTwips nDeadLine = GetUpper()->Frm().Top() +
GetUpper()->Prt().Bottom();
const SwTwips nBot = Frm().Bottom();
if ( nBot > nDeadLine )
2000-09-18 23:08:29 +00:00
{
Frm().Bottom( nDeadLine );
Prt().SSize().Height() = Frm().Height() - nBorder;
2000-09-18 23:08:29 +00:00
}
}
bValidSize = bValidPrtArea = sal_True;
2002-10-08 11:42:24 +00:00
} while( nRemaining<=nMaxHeight && nOldHeight!=Prt().Height() );
ColUnlock();
2000-09-18 23:08:29 +00:00
}
bValidSize = bValidPrtArea = sal_True;
}
else //if ( GetType() & 0x0018 )
{
do
2000-09-18 23:08:29 +00:00
{
if ( Frm().Height() != pAttrs->GetSize().Height() )
ChgSize( Size( Frm().Width(), pAttrs->GetSize().Height()));
bValidSize = sal_True;
MakePos();
} while ( !bValidSize );
2000-09-18 23:08:29 +00:00
}
}
void SwHeadFootFrm::Format(const SwBorderAttrs * pAttrs)
2001-10-19 09:25:19 +00:00
{
OSL_ENSURE( pAttrs, "SwFooterFrm::Format, pAttrs is 0." );
if ( bValidPrtArea && bValidSize )
return;
if ( ! GetEatSpacing() && IsHeaderFrm())
{
SwLayoutFrm::Format(pAttrs);
}
else
{
lcl_LayoutFrmEnsureMinHeight(*this, pAttrs);
long nUL = pAttrs->CalcTop() + pAttrs->CalcBottom();
if ( !bValidPrtArea )
FormatPrt(nUL, pAttrs);
if ( !bValidSize )
FormatSize(nUL, pAttrs);
}
2001-10-19 09:25:19 +00:00
}
SwTwips SwHeadFootFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo )
2001-10-19 09:25:19 +00:00
{
SwTwips nResult;
if ( IsColLocked() )
{
nResult = 0;
}
else if (!GetEatSpacing())
{
nResult = SwLayoutFrm::GrowFrm(nDist, bTst, bInfo);
}
else
{
nResult = 0;
SwBorderAttrAccess * pAccess =
new SwBorderAttrAccess( SwFrm::GetCache(), this );
OSL_ENSURE(pAccess, "no border attributes");
SwBorderAttrs * pAttrs = pAccess->Get();
/* First assume the whole amount to grow can be provided by eating
spacing. */
SwTwips nEat = nDist;
SwTwips nMaxEat;
/* calculate maximum eatable spacing */
if (IsHeaderFrm())
nMaxEat = aFrm.Height() - aPrt.Top() - aPrt.Height() - pAttrs->CalcBottomLine();
else
nMaxEat = aPrt.Top() - pAttrs->CalcTopLine();
delete pAccess;
if (nMaxEat < 0)
nMaxEat = 0;
/* If the frame is too small, eat less spacing thus letting the frame
grow more. */
SwTwips nMinHeight = lcl_GetFrmMinHeight(*this);
SwTwips nFrameTooSmall = nMinHeight - Frm().Height();
if (nFrameTooSmall > 0)
nEat -= nFrameTooSmall;
/* No negative eating, not eating more than allowed. */
if (nEat < 0)
nEat = 0;
else if (nEat > nMaxEat)
nEat = nMaxEat;
// OD 10.04.2003 #108719# - Notify fly frame, if header frame
// grows. Consider, that 'normal' grow of layout frame already notifys
// the fly frames.
sal_Bool bNotifyFlys = sal_False;
if (nEat > 0)
{
if ( ! bTst)
{
if (! IsHeaderFrm())
{
aPrt.Top(aPrt.Top() - nEat);
aPrt.Height(aPrt.Height() - nEat);
}
InvalidateAll();
}
nResult += nEat;
// OD 14.04.2003 #108719# - trigger fly frame notify.
if ( IsHeaderFrm() )
{
bNotifyFlys = sal_True;
}
}
if (nDist - nEat > 0)
{
SwTwips nFrmGrow =
SwLayoutFrm::GrowFrm( nDist - nEat, bTst, bInfo );
nResult += nFrmGrow;
if ( nFrmGrow > 0 )
{
bNotifyFlys = sal_False;
}
}
// OD 10.04.2003 #108719# - notify fly frames, if necessary and triggered.
if ( ( nResult > 0 ) && bNotifyFlys )
{
NotifyLowerObjs();
}
}
if ( nResult && !bTst )
SetCompletePaint();
return nResult;
2001-10-19 09:25:19 +00:00
}
SwTwips SwHeadFootFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo )
2000-09-18 23:08:29 +00:00
{
SwTwips nResult;
if ( IsColLocked() )
{
nResult = 0;
}
else if (! GetEatSpacing())
{
nResult = SwLayoutFrm::ShrinkFrm(nDist, bTst, bInfo);
}
else
{
nResult = 0;
SwTwips nMinHeight = lcl_GetFrmMinHeight(*this);
SwTwips nOldHeight = Frm().Height();
SwTwips nRest = 0; // Amount to shrink by spitting out spacing
if ( nOldHeight >= nMinHeight )
{
/* If the frame's height is bigger than its minimum height, shrink
the frame towards its minimum height. If this is not sufficient
to provide the shrinking requested provide the rest by spitting
out spacing. */
SwTwips nBiggerThanMin = nOldHeight - nMinHeight;
if (nBiggerThanMin < nDist)
{
nRest = nDist - nBiggerThanMin;
}
/* info: declaration of nRest -> else nRest = 0 */
}
else
/* The frame cannot shrink. Provide shrinking by spitting out
spacing. */
nRest = nDist;
// OD 10.04.2003 #108719# - Notify fly frame, if header/footer frame
// shrinks. Consider, that 'normal' shrink of layout frame already notifys
// the fly frames.
sal_Bool bNotifyFlys = sal_False;
if (nRest > 0)
{
SwBorderAttrAccess * pAccess =
new SwBorderAttrAccess( SwFrm::GetCache(), this );
OSL_ENSURE(pAccess, "no border attributes");
SwBorderAttrs * pAttrs = pAccess->Get();
/* minimal height of print area */
SwTwips nMinPrtHeight = nMinHeight
- pAttrs->CalcTop()
- pAttrs->CalcBottom();
if (nMinPrtHeight < 0)
nMinPrtHeight = 0;
delete pAccess;
/* assume all shrinking can be provided */
SwTwips nShrink = nRest;
/* calculate maximum shrinking */
SwTwips nMaxShrink = aPrt.Height() - nMinPrtHeight;
/* shrink no more than maximum shrinking */
if (nShrink > nMaxShrink)
{
//nRest -= nShrink - nMaxShrink;
nShrink = nMaxShrink;
}
if (!bTst)
{
if (! IsHeaderFrm() )
{
aPrt.Top(aPrt.Top() + nShrink);
aPrt.Height(aPrt.Height() - nShrink);
}
InvalidateAll();
}
nResult += nShrink;
// OD 14.04.2003 #108719# - trigger fly frame notify.
if ( IsHeaderFrm() )
{
bNotifyFlys = sal_True;
}
}
/* The shrinking not providable by spitting out spacing has to be done
by the frame. */
if (nDist - nRest > 0)
{
SwTwips nShrinkAmount = SwLayoutFrm::ShrinkFrm( nDist - nRest, bTst, bInfo );
nResult += nShrinkAmount;
if ( nShrinkAmount > 0 )
{
bNotifyFlys = sal_False;
}
}
// OD 10.04.2003 #108719# - notify fly frames, if necessary.
if ( ( nResult > 0 ) && bNotifyFlys )
{
NotifyLowerObjs();
}
}
return nResult;
2000-09-18 23:08:29 +00:00
}
sal_Bool SwHeadFootFrm::GetEatSpacing() const
2000-09-18 23:08:29 +00:00
{
const SwFrmFmt * pFmt = GetFmt();
OSL_ENSURE(pFmt, "SwHeadFootFrm: no format?");
if (pFmt->GetHeaderAndFooterEatSpacing().GetValue())
return sal_True;
return sal_False;
2000-09-18 23:08:29 +00:00
}
2000-09-18 23:08:29 +00:00
/*************************************************************************
|*
|* SwPageFrm::PrepareHeader()
|*
|* Description Creates or removes headers
2000-09-18 23:08:29 +00:00
|*
|*************************************************************************/
void DelFlys( SwLayoutFrm *pFrm, SwPageFrm *pPage )
{
for ( int i = 0; pPage->GetSortedObjs() &&
pPage->GetSortedObjs()->Count() &&
i < (int)pPage->GetSortedObjs()->Count(); ++i )
{
SwAnchoredObject* pObj = (*pPage->GetSortedObjs())[i];
if ( pObj->ISA(SwFlyFrm) )
2000-09-18 23:08:29 +00:00
{
SwFlyFrm* pFlyFrm = static_cast<SwFlyFrm*>(pObj);
if ( pFrm->IsAnLower( pFlyFrm ) )
2000-09-18 23:08:29 +00:00
{
delete pFlyFrm;
2000-09-18 23:08:29 +00:00
--i;
}
}
}
}
void SwPageFrm::PrepareHeader()
{
SwLayoutFrm *pLay = (SwLayoutFrm*)Lower();
if ( !pLay )
return;
const SwFmtHeader &rH = ((SwFrmFmt*)GetRegisteredIn())->GetHeader();
2000-09-18 23:08:29 +00:00
const ViewShell *pSh = getRootFrm()->GetCurrShell();
const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode());
2000-09-18 23:08:29 +00:00
if ( bOn && rH.IsActive() )
{ //Implant header, but remove first, if already present
OSL_ENSURE( rH.GetHeaderFmt(), "FrmFmt for Header not found." );
2000-09-18 23:08:29 +00:00
if ( pLay->GetFmt() == (SwFrmFmt*)rH.GetHeaderFmt() )
return; // Header is already the correct one.
2000-09-18 23:08:29 +00:00
if ( pLay->IsHeaderFrm() )
{ SwLayoutFrm *pDel = pLay;
pLay = (SwLayoutFrm*)pLay->GetNext();
::DelFlys( pDel, this );
pDel->Cut();
delete pDel;
}
OSL_ENSURE( pLay, "Where to with the Header?" );
SwHeaderFrm *pH = new SwHeaderFrm( (SwFrmFmt*)rH.GetHeaderFmt(), this );
2000-09-18 23:08:29 +00:00
pH->Paste( this, pLay );
if ( GetUpper() )
::RegistFlys( this, pH );
}
else if ( pLay && pLay->IsHeaderFrm() )
{ // Remove header if present.
2000-09-18 23:08:29 +00:00
::DelFlys( pLay, this );
pLay->Cut();
delete pLay;
}
}
/*************************************************************************
|*
|* SwPageFrm::PrepareFooter()
|*
|* Description Creates or removes footer
2000-09-18 23:08:29 +00:00
|*
|*************************************************************************/
void SwPageFrm::PrepareFooter()
{
SwLayoutFrm *pLay = (SwLayoutFrm*)Lower();
if ( !pLay )
return;
const SwFmtFooter &rF = ((SwFrmFmt*)GetRegisteredIn())->GetFooter();
2000-09-18 23:08:29 +00:00
while ( pLay->GetNext() )
pLay = (SwLayoutFrm*)pLay->GetNext();
const ViewShell *pSh = getRootFrm()->GetCurrShell();
const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode());
2000-09-18 23:08:29 +00:00
if ( bOn && rF.IsActive() )
{ //Implant footer, but remove first, if already present
OSL_ENSURE( rF.GetFooterFmt(), "FrmFmt for Footer not found." );
2000-09-18 23:08:29 +00:00
if ( pLay->GetFmt() == (SwFrmFmt*)rF.GetFooterFmt() )
return; // Footer is already the correct one.
2000-09-18 23:08:29 +00:00
if ( pLay->IsFooterFrm() )
{ ::DelFlys( pLay, this );
pLay->Cut();
delete pLay;
}
SwFooterFrm *pF = new SwFooterFrm( (SwFrmFmt*)rF.GetFooterFmt(), this );
2000-09-18 23:08:29 +00:00
pF->Paste( this );
if ( GetUpper() )
::RegistFlys( this, pF );
}
else if ( pLay && pLay->IsFooterFrm() )
{ // Remove footer if already present
2000-09-18 23:08:29 +00:00
::DelFlys( pLay, this );
ViewShell *pShell;
if ( pLay->GetPrev() && 0 != (pShell = getRootFrm()->GetCurrShell()) &&
pShell->VisArea().HasArea() )
pShell->InvalidateWindows( pShell->VisArea() );
2000-09-18 23:08:29 +00:00
pLay->Cut();
delete pLay;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */