diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-12-05 13:22:44 +0000 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2019-01-17 14:50:02 +0100 |
commit | 42b6b9a5934dbf55d963dc6a3d9afdd4c202da19 (patch) | |
tree | 8b2173d72b987b49380700c09c7ce042c204eed2 | |
parent | 70e2ca96778af1b7734aa9dde9627567cd210bc4 (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
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)
Change-Id: I4622569eb9c757c6dcbdda32081ddc94e53db919
-rw-r--r-- | sw/source/core/inc/frame.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/inc/ftnfrm.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/layout/calcmove.cxx | 1 | ||||
-rw-r--r-- | sw/source/core/layout/ftnfrm.cxx | 29 | ||||
-rwxr-xr-x | sw/source/core/layout/tabfrm.cxx | 5 |
5 files changed, 34 insertions, 4 deletions
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx index 5d84ca5198a4..0e1f1fd7ae84 100644 --- a/sw/source/core/inc/frame.hxx +++ b/sw/source/core/inc/frame.hxx @@ -841,7 +841,7 @@ public: bool IsProtected() const; bool IsColLocked() const { return mbColLocked; } - bool IsDeleteForbidden() const { return mbForbidDelete; } + virtual bool IsDeleteForbidden() const { return mbForbidDelete; } /// this is the only way to delete a SwFrame instance static void DestroyFrame(SwFrame *const pFrame); diff --git a/sw/source/core/inc/ftnfrm.hxx b/sw/source/core/inc/ftnfrm.hxx index 3d3fbb38171b..9186a89737f2 100644 --- a/sw/source/core/inc/ftnfrm.hxx +++ b/sw/source/core/inc/ftnfrm.hxx @@ -68,6 +68,7 @@ class SwFootnoteFrame: public SwLayoutFrame public: SwFootnoteFrame( SwFrameFormat*, SwFrame*, SwContentFrame*, SwTextFootnote* ); + virtual bool IsDeleteForbidden() const override; virtual void Cut() override; virtual void Paste( SwFrame* pParent, SwFrame* pSibling = nullptr ) override; diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx index de694019e1bd..03303872835b 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 d49eac75c66c..7d463eb1e9b8 100644 --- a/sw/source/core/layout/ftnfrm.cxx +++ b/sw/source/core/layout/ftnfrm.cxx @@ -471,6 +471,27 @@ void SwFootnoteFrame::InvalidateNxtFootnoteCnts( SwPageFrame const *pPage ) } } +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() ) @@ -496,7 +517,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 ) @@ -1587,7 +1608,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); @@ -2192,7 +2214,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 71d83da9ff82..921659f032b7 100755 --- a/sw/source/core/layout/tabfrm.cxx +++ b/sw/source/core/layout/tabfrm.cxx @@ -861,6 +861,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) ); |