diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-12-05 13:22:44 +0000 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2021-05-10 16:33:50 +0200 |
commit | 8d300dd55221f25c86ddca42beb234d495890c5f (patch) | |
tree | 50097ae68fc60a54c42d8925d65cc38e20df6d91 /sw/source/core/layout | |
parent | d114007a25b4ccd590818cfe8fefd91ddfeb7969 (diff) |
tdf#119126 forcepoint#76 avoid deleting footnote that would delete ...
... undeletable page
(cherry picked from commit 0005b330eaed0b5559042d2597fb45e0c9125d7e)
Conflicts:
sw/qa/extras/layout/layout.cxx
Change-Id: I4622569eb9c757c6dcbdda32081ddc94e53db919
Reviewed-on: https://gerrit.libreoffice.org/66393
Tested-by: Xisco Faulí <xiscofauli@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit 558f01a29cb640760e73724f6efdc0a1be20c8e3)
Diffstat (limited to 'sw/source/core/layout')
-rw-r--r-- | sw/source/core/layout/calcmove.cxx | 1 | ||||
-rw-r--r-- | sw/source/core/layout/ftnfrm.cxx | 29 | ||||
-rw-r--r-- | sw/source/core/layout/tabfrm.cxx | 5 |
3 files changed, 32 insertions, 3 deletions
diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index 24484b3e8104..5179d4d2971a 100644 --- a/sw/source/core/layout/calcmove.cxx +++ b/sw/source/core/layout/calcmove.cxx @@ -245,6 +245,7 @@ void SwFrame::PrepareMake(vcl::RenderContext* pRenderContext) StackHack aHack; if ( GetUpper() ) { + SwFrameDeleteGuard aDeleteGuard(this); if ( lcl_IsCalcUpperAllowed( *this ) ) GetUpper()->Calc(pRenderContext); OSL_ENSURE( GetUpper(), ":-( Layout unstable (Upper gone)." ); diff --git a/sw/source/core/layout/ftnfrm.cxx b/sw/source/core/layout/ftnfrm.cxx index f6df5180d51c..d371c1d316df 100644 --- a/sw/source/core/layout/ftnfrm.cxx +++ b/sw/source/core/layout/ftnfrm.cxx @@ -483,6 +483,27 @@ SwTwips SwFootnoteFrame::ShrinkFrame( SwTwips nDist, bool bTst, bool bInfo ) } #endif +bool SwFootnoteFrame::IsDeleteForbidden() const +{ + if (SwLayoutFrame::IsDeleteForbidden()) + return true; + // needs to be in sync with the ::Cut logic + const SwLayoutFrame *pUp = GetUpper(); + if (pUp) + { + if (GetPrev()) + return false; + + // The last footnote takes its container along if it + // is deleted. Cut would put pUp->Lower() to the value + // of GetNext(), so if there is no GetNext then + // Cut would delete pUp. If that condition is true + // here then check if the container is delete-forbidden + return !GetNext() && pUp->IsDeleteForbidden(); + } + return false; +} + void SwFootnoteFrame::Cut() { if ( GetNext() ) @@ -508,7 +529,7 @@ void SwFootnoteFrame::Cut() if ( pUp ) { // The last footnote takes its container along - if ( !pUp->Lower() ) + if (!pUp->Lower()) { SwPageFrame *pPage = pUp->FindPageFrame(); if ( pPage ) @@ -1598,7 +1619,8 @@ void SwFootnoteBossFrame::AppendFootnote( SwContentFrame *pRef, SwTextFootnote * pNew->Calc(getRootFrame()->GetCurrShell()->GetOut()); // #i57914# - adjust fix #i49383# if ( !bOldFootnoteFrameLocked && !pNew->GetLower() && - !pNew->IsColLocked() && !pNew->IsBackMoveLocked() ) + !pNew->IsColLocked() && !pNew->IsBackMoveLocked() && + !pNew->IsDeleteForbidden() ) { pNew->Cut(); SwFrame::DestroyFrame(pNew); @@ -2182,7 +2204,8 @@ void SwFootnoteBossFrame::RearrangeFootnotes( const SwTwips nDeadLine, const boo if ( !bLock && bUnlockLastFootnoteFrame && !pLastFootnoteFrame->GetLower() && !pLastFootnoteFrame->IsColLocked() && - !pLastFootnoteFrame->IsBackMoveLocked() ) + !pLastFootnoteFrame->IsBackMoveLocked() && + !pLastFootnoteFrame->IsDeleteForbidden() ) { pLastFootnoteFrame->Cut(); SwFrame::DestroyFrame(pLastFootnoteFrame); diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx index fdeb528a86f0..8496239b92c5 100644 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -845,6 +845,11 @@ bool SwTabFrame::RemoveFollowFlowLine() // #140081# Make code robust. if ( !pFollowFlowLine || !pLastLine ) return true; + if (pFollowFlowLine->IsDeleteForbidden()) + { + SAL_WARN("sw.layout", "Cannot remove in-use Follow Flow Line"); + return true; + } // Move content lcl_MoveRowContent( *pFollowFlowLine, *static_cast<SwRowFrame*>(pLastLine) ); |