diff options
Diffstat (limited to 'sw/source/core/layout/hffrm.cxx')
-rw-r--r-- | sw/source/core/layout/hffrm.cxx | 796 |
1 files changed, 796 insertions, 0 deletions
diff --git a/sw/source/core/layout/hffrm.cxx b/sw/source/core/layout/hffrm.cxx new file mode 100644 index 000000000000..b8168dca941a --- /dev/null +++ b/sw/source/core/layout/hffrm.cxx @@ -0,0 +1,796 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#include "pagefrm.hxx" +#include "viewsh.hxx" +#include "doc.hxx" +#include <fmtcntnt.hxx> +#include <fmthdft.hxx> +#include <fmtfsize.hxx> +#include "viewopt.hxx" +#include "hffrm.hxx" +#include "rootfrm.hxx" +#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> +// --> OD 2005-03-03 #i43771# +#include <objectformatter.hxx> +// <-- + +extern sal_Bool bObjsDirect; //frmtool.cxx + +static SwTwips lcl_GetFrmMinHeight(const SwLayoutFrm & rFrm) +{ + const SwFmtFrmSize &rSz = rFrm.GetFmt()->GetFrmSize(); + SwTwips nMinHeight; + + switch (rSz.GetHeightSizeType()) + { + case ATT_MIN_SIZE: + nMinHeight = rSz.GetHeight(); + + break; + + default: + nMinHeight = 0; + } + + + return nMinHeight; +} + + +static SwTwips lcl_CalcContentHeight(SwLayoutFrm & frm) +{ + SwFrm* pFrm = frm.Lower(); + + SwTwips nRemaining = 0; + sal_uInt16 nNum = 0; + 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(); + // Dieser TxtFrm waere gern ein bisschen groesser + nRemaining += nTmp; + } + else if( pFrm->IsSctFrm() && ((SwSectionFrm*)pFrm)->IsUndersized() ) + { + nTmp = ((SwSectionFrm*)pFrm)->Undersize(); + nRemaining += nTmp; + } + pFrm = pFrm->GetNext(); + + nNum++; + } + + return nRemaining; +} + +static void lcl_LayoutFrmEnsureMinHeight(SwLayoutFrm & rFrm, + const SwBorderAttrs * ) +{ + SwTwips nMinHeight = lcl_GetFrmMinHeight(rFrm); + + if (rFrm.Frm().Height() < nMinHeight) + { + rFrm.Grow(nMinHeight - rFrm.Frm().Height()); + } +} + +SwHeadFootFrm::SwHeadFootFrm( SwFrmFmt * pFmt, SwFrm* pSib, sal_uInt16 nTypeIn) + : SwLayoutFrm( pFmt, pSib ) +{ + nType = nTypeIn; + SetDerivedVert( sal_False ); + + const SwFmtCntnt &rCnt = pFmt->GetCntnt(); + + OSL_ENSURE( rCnt.GetCntntIdx(), "Kein Inhalt fuer Header." ); + + //Fuer Header Footer die Objekte gleich erzeugen lassen. + sal_Bool bOld = bObjsDirect; + bObjsDirect = sal_True; + sal_uLong nIndex = rCnt.GetCntntIdx()->GetIndex(); + ::_InsertCnt( this, pFmt->GetDoc(), ++nIndex ); + bObjsDirect = bOld; +} + +void SwHeadFootFrm::FormatPrt(SwTwips & nUL, const SwBorderAttrs * pAttrs) +{ + 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); + + nMinHeight -= pAttrs->CalcTop(); + nMinHeight -= pAttrs->CalcBottom(); + + /* 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; + } + + /* 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; + + aPrt.Height(nNewHeight); + + } + else + { + //Position einstellen. + aPrt.Left( pAttrs->CalcLeft( this ) ); + aPrt.Top ( pAttrs->CalcTop() ); + + //Sizes einstellen; die Groesse gibt der umgebende Frm vor, die + //die Raender werden einfach abgezogen. + // OD 23.01.2003 #106895# - add first parameter to <SwBorderAttrs::CalcRight(..)> + SwTwips nLR = pAttrs->CalcLeft( this ) + pAttrs->CalcRight( this ); + aPrt.Width ( aFrm.Width() - nLR ); + aPrt.Height( aFrm.Height()- nUL ); + + } + + bValidPrtArea = sal_True; +} + +void SwHeadFootFrm::FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs) +{ + if ( !HasFixSize() ) + { + if( !IsColLocked() ) + { + bValidSize = bValidPrtArea = sal_True; + + 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; + // --> OD 2006-05-24 #i64301# + // use the position of the footer printing area to control invalidation + // of the first footer content. + Point aOldFooterPrtPos; + // <-- + + do + { + nOldHeight = Prt().Height(); + SwFrm* pFrm = Lower(); + // --> OD 2006-05-24 #i64301# + if ( pFrm && + aOldFooterPrtPos != ( Frm().Pos() + Prt().Pos() ) ) + { + pFrm->_InvalidatePos(); + aOldFooterPrtPos = Frm().Pos() + Prt().Pos(); + } + // <-- + while( pFrm ) + { + pFrm->Calc(); + // --> OD 2005-03-03 #i43771# - format also object anchored + // at the frame + // --> OD 2005-05-03 #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() ) + // Dieser TxtFrm waere gern ein bisschen groesser + 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; + + 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 ) + { + if ( Grow( nDiff ) ) + { + 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(); + } + } + } + else + Shrink( -nDiff ); + //Schnell auf dem kurzen Dienstweg die Position updaten. + + MakePos(); + ColLock(); + } + else + break; + //Unterkante des Uppers nicht ueberschreiten. + if ( GetUpper() && Frm().Height() ) + { + const SwTwips nDeadLine = GetUpper()->Frm().Top() + + GetUpper()->Prt().Bottom(); + const SwTwips nBot = Frm().Bottom(); + if ( nBot > nDeadLine ) + { + Frm().Bottom( nDeadLine ); + Prt().SSize().Height() = Frm().Height() - nBorder; + } + } + bValidSize = bValidPrtArea = sal_True; + } while( nRemaining<=nMaxHeight && nOldHeight!=Prt().Height() ); + ColUnlock(); + } + bValidSize = bValidPrtArea = sal_True; + } + else //if ( GetType() & 0x0018 ) + { + do + { + if ( Frm().Height() != pAttrs->GetSize().Height() ) + ChgSize( Size( Frm().Width(), pAttrs->GetSize().Height())); + bValidSize = sal_True; + MakePos(); + } while ( !bValidSize ); + } +} + +void SwHeadFootFrm::Format(const SwBorderAttrs * pAttrs) +{ + OSL_ENSURE( pAttrs, "SwFooterFrm::Format, pAttrs ist 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); + } +} + +SwTwips SwHeadFootFrm::GrowFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) +{ + 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; +} + +SwTwips SwHeadFootFrm::ShrinkFrm( SwTwips nDist, sal_Bool bTst, sal_Bool bInfo ) +{ + 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; +} + +sal_Bool SwHeadFootFrm::GetEatSpacing() const +{ + const SwFrmFmt * pFmt = GetFmt(); + OSL_ENSURE(pFmt, "SwHeadFootFrm: no format?"); + + if (pFmt->GetHeaderAndFooterEatSpacing().GetValue()) + return sal_True; + + return sal_False; +} + + +/************************************************************************* +|* +|* SwPageFrm::PrepareHeader() +|* +|* Beschreibung Erzeugt oder Entfernt Header +|* +|*************************************************************************/ + + +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) ) + { + SwFlyFrm* pFlyFrm = static_cast<SwFlyFrm*>(pObj); + if ( pFrm->IsAnLower( pFlyFrm ) ) + { + delete pFlyFrm; + --i; + } + } + } +} + + + +void SwPageFrm::PrepareHeader() +{ + SwLayoutFrm *pLay = (SwLayoutFrm*)Lower(); + if ( !pLay ) + return; + + const SwFmtHeader &rH = ((SwFrmFmt*)GetRegisteredIn())->GetHeader(); + + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); + + if ( bOn && rH.IsActive() ) + { //Header einsetzen, vorher entfernen falls vorhanden. + OSL_ENSURE( rH.GetHeaderFmt(), "FrmFmt fuer Header nicht gefunden." ); + + if ( pLay->GetFmt() == (SwFrmFmt*)rH.GetHeaderFmt() ) + return; //Der Footer ist bereits der richtige + + if ( pLay->IsHeaderFrm() ) + { SwLayoutFrm *pDel = pLay; + pLay = (SwLayoutFrm*)pLay->GetNext(); + ::DelFlys( pDel, this ); + pDel->Cut(); + delete pDel; + } + OSL_ENSURE( pLay, "Wohin mit dem Header?" ); + SwHeaderFrm *pH = new SwHeaderFrm( (SwFrmFmt*)rH.GetHeaderFmt(), this ); + pH->Paste( this, pLay ); + if ( GetUpper() ) + ::RegistFlys( this, pH ); + } + else if ( pLay && pLay->IsHeaderFrm() ) + { //Header entfernen falls vorhanden. + ::DelFlys( pLay, this ); + pLay->Cut(); + delete pLay; + } +} +/************************************************************************* +|* +|* SwPageFrm::PrepareFooter() +|* +|* Beschreibung Erzeugt oder Entfernt Footer +|* +|*************************************************************************/ + + +void SwPageFrm::PrepareFooter() +{ + SwLayoutFrm *pLay = (SwLayoutFrm*)Lower(); + if ( !pLay ) + return; + + const SwFmtFooter &rF = ((SwFrmFmt*)GetRegisteredIn())->GetFooter(); + while ( pLay->GetNext() ) + pLay = (SwLayoutFrm*)pLay->GetNext(); + + const ViewShell *pSh = getRootFrm()->GetCurrShell(); + const sal_Bool bOn = !(pSh && pSh->GetViewOptions()->getBrowseMode()); + + if ( bOn && rF.IsActive() ) + { //Footer einsetzen, vorher entfernen falls vorhanden. + OSL_ENSURE( rF.GetFooterFmt(), "FrmFmt fuer Footer nicht gefunden." ); + + if ( pLay->GetFmt() == (SwFrmFmt*)rF.GetFooterFmt() ) + return; //Der Footer ist bereits der richtige. + + if ( pLay->IsFooterFrm() ) + { ::DelFlys( pLay, this ); + pLay->Cut(); + delete pLay; + } + SwFooterFrm *pF = new SwFooterFrm( (SwFrmFmt*)rF.GetFooterFmt(), this ); + pF->Paste( this ); + if ( GetUpper() ) + ::RegistFlys( this, pF ); + } + else if ( pLay && pLay->IsFooterFrm() ) + { //Footer entfernen falls vorhanden. + ::DelFlys( pLay, this ); + ViewShell *pShell; + if ( pLay->GetPrev() && 0 != (pShell = getRootFrm()->GetCurrShell()) && + pShell->VisArea().HasArea() ) + pShell->InvalidateWindows( pShell->VisArea() ); + pLay->Cut(); + delete pLay; + } +} + + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |