sw/source/core/inc/ftnboss.hxx | 15 --- sw/source/core/inc/ftnfrm.hxx | 15 +++ sw/source/core/layout/flowfrm.cxx | 11 -- sw/source/core/layout/ftnfrm.cxx | 155 ++++++++++++++++---------------------- sw/source/core/text/txtftn.cxx | 2 5 files changed, 90 insertions(+), 108 deletions(-)
New commits: commit 24caeee8236576abd92086974c1dbbf15b81a4c5 Author: Jan-Marek Glogowski <[email protected]> AuthorDate: Sun Dec 8 17:33:53 2019 +0000 Commit: Jan-Marek Glogowski <[email protected]> CommitDate: Fri Feb 28 10:34:58 2020 +0100 Refactor a bit of the footnote handling code While working on some bug, I noticed some code duplication and wrong comments, which don't make any sense w.r.t. ithe current code base. So this just cleans this up. Change-Id: I3e62b817cdb2ffc99fcce9a69c555113cc17b140 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89250 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <[email protected]> diff --git a/sw/source/core/inc/ftnboss.hxx b/sw/source/core/inc/ftnboss.hxx index 6e1f5c24fd67..3ee7859bf8f3 100644 --- a/sw/source/core/inc/ftnboss.hxx +++ b/sw/source/core/inc/ftnboss.hxx @@ -59,6 +59,9 @@ class SAL_DLLPUBLIC_RTTI SwFootnoteBossFrame: public SwLayoutFrame SwFootnoteFrame *FindFirstFootnote(); SwNeighbourAdjust NeighbourhoodAdjustment_() const; + static void CollectFootnotes_(const SwContentFrame*, SwFootnoteFrame*, + SwFootnoteFrames&, const SwFootnoteBossFrame*); + protected: void InsertFootnote( SwFootnoteFrame * ); static void ResetFootnote( const SwFootnoteFrame *pAssumed ); @@ -96,18 +99,8 @@ public: SwTwips GetVarSpace() const; // methods needed for layouting - // The parameters <_bCollectOnlyPreviousFootnotes> and <_pRefFootnoteBossFrame> control - // if only footnotes that are positioned before the given reference - // footnote boss-frame have to be collected. - // Note: if parameter <_bCollectOnlyPreviousFootnotes> is true, then parameter - // <_pRefFootnoteBossFrame> has to be referenced by an object. - static void CollectFootnotes_( const SwContentFrame* _pRef, - SwFootnoteFrame* _pFootnote, - SwFootnoteFrames& _rFootnoteArr, - const bool _bCollectOnlyPreviousFootnotes = false, - const SwFootnoteBossFrame* _pRefFootnoteBossFrame = nullptr); // The parameter <_bCollectOnlyPreviousFootnotes> controls if only footnotes - // that are positioned before the footnote boss-frame <this> have to be + // that are positioned before the this footnote boss-frame have to be // collected. void CollectFootnotes( const SwContentFrame* _pRef, SwFootnoteBossFrame* _pOld, diff --git a/sw/source/core/inc/ftnfrm.hxx b/sw/source/core/inc/ftnfrm.hxx index 618353c6256b..0cedbad4f40c 100644 --- a/sw/source/core/inc/ftnfrm.hxx +++ b/sw/source/core/inc/ftnfrm.hxx @@ -45,11 +45,16 @@ void RemoveFootnotesForNode( // continue on another page. class SwFootnoteContFrame: public SwLayoutFrame { + static SwFootnoteFrame* AddChained(bool bAppend, SwFrame *pNewUpper, bool bDefaultFormat); + public: SwFootnoteContFrame( SwFrameFormat*, SwFrame* ); const SwFootnoteFrame* FindFootNote() const; + static inline SwFootnoteFrame* AppendChained(SwFrame* pThis, bool bDefaultFormat); + static inline SwFootnoteFrame* PrepedChained(SwFrame* pThis, bool bDefaultFormat); + virtual SwTwips ShrinkFrame( SwTwips, bool bTst = false, bool bInfo = false ) override; virtual SwTwips GrowFrame ( SwTwips, bool bTst = false, bool bInfo = false ) override; virtual void Format( vcl::RenderContext* pRenderContext, const SwBorderAttrs *pAttrs = nullptr ) override; @@ -61,6 +66,16 @@ public: void PaintLine( const SwRect &, const SwPageFrame * ) const; }; +inline SwFootnoteFrame* SwFootnoteContFrame::AppendChained(SwFrame* pThis, bool bDefaultFormat) +{ + return AddChained(true, pThis, bDefaultFormat); +} + +inline SwFootnoteFrame* SwFootnoteContFrame::PrepedChained(SwFrame* pThis, bool bDefaultFormat) +{ + return AddChained(false, pThis, bDefaultFormat); +} + class SwFootnoteFrame: public SwLayoutFrame { // Pointer to FootnoteFrame in which the footnote will be continued: diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx index 6a4b853196ca..685efcf791db 100644 --- a/sw/source/core/layout/flowfrm.cxx +++ b/sw/source/core/layout/flowfrm.cxx @@ -2473,16 +2473,7 @@ bool SwFlowFrame::MoveBwd( bool &rbReformat ) if ( pNewUpper->IsFootnoteContFrame() ) { // I may have gotten a Container - SwFootnoteFrame *pOld = m_rThis.FindFootnoteFrame(); - SwFootnoteFrame *pNew = new SwFootnoteFrame( pOld->GetFormat(), pOld, - pOld->GetRef(), pOld->GetAttr() ); - if ( pOld->GetMaster() ) - { - pNew->SetMaster( pOld->GetMaster() ); - pOld->GetMaster()->SetFollow( pNew ); - } - pNew->SetFollow( pOld ); - pOld->SetMaster( pNew ); + SwFootnoteFrame *pNew = SwFootnoteContFrame::AppendChained(&m_rThis, false); pNew->Paste( pNewUpper ); pNewUpper = pNew; } diff --git a/sw/source/core/layout/ftnfrm.cxx b/sw/source/core/layout/ftnfrm.cxx index 90aa3bf989dc..0431934534f4 100644 --- a/sw/source/core/layout/ftnfrm.cxx +++ b/sw/source/core/layout/ftnfrm.cxx @@ -153,6 +153,38 @@ SwFootnoteContFrame::SwFootnoteContFrame( SwFrameFormat *pFormat, SwFrame* pSib mnFrameType = SwFrameType::FtnCont; } +SwFootnoteFrame* SwFootnoteContFrame::AddChained(bool bAppend, SwFrame* pThis, bool bDefaultFormat) +{ + SwFootnoteFrame *pOld = pThis->FindFootnoteFrame(); + SwFrameFormat *pFormat = pOld->GetFormat(); + if (bDefaultFormat) + pFormat = pFormat->GetDoc()->GetDfltFrameFormat(); + + SwFootnoteFrame *pNew = new SwFootnoteFrame(pFormat, pOld, pOld->GetRef(), pOld->GetAttr()); + + if (bAppend) + { + if (pOld->GetFollow()) + { + pNew->SetFollow(pOld->GetFollow()); + pOld->GetFollow()->SetMaster(pNew); + } + pOld->SetFollow(pNew); + pNew->SetMaster(pOld); + } + else + { + if (pOld->GetMaster()) + { + pNew->SetMaster(pOld->GetMaster()); + pOld->GetMaster()->SetFollow(pNew); + } + pNew->SetFollow(pOld); + pOld->SetMaster(pNew); + } + + return pNew; +} // lcl_Undersize(..) walks over a SwFrame and its contents // and returns the sum of all requested TextFrame magnifications. @@ -1420,6 +1452,33 @@ void SwFootnoteBossFrame::InsertFootnote( SwFootnoteFrame* pNew ) pNew->Paste( pParent, pSibling ); } +static SwPageFrame* lcl_GetApproximateFootnotePage(const bool bEnd, const SwPageFrame* pPage, + const SwDoc *pDoc, const SwTextFootnote *pAttr) +{ + // We can at least search the approximately correct page + // to ensure that we will finish in finite time even if + // hundreds of footnotes exist. + const SwPageFrame *pNxt = static_cast<const SwPageFrame*>(pPage->GetNext()); + const sal_uLong nStPos = ::lcl_FindFootnotePos(pDoc, pAttr); + while (pNxt && (bEnd ? pNxt->IsEndNotePage() : pNxt->IsFootnotePage() && !pNxt->IsEndNotePage())) + { + const SwFootnoteContFrame *pCont = pNxt->FindFootnoteCont(); + if (pCont && pCont->Lower()) + { + OSL_ENSURE( pCont->Lower()->IsFootnoteFrame(), "no footnote in the container" ); + if (nStPos > ::lcl_FindFootnotePos(pDoc, + static_cast<const SwFootnoteFrame*>(pCont->Lower())->GetAttr())) + { + pPage = pNxt; + pNxt = static_cast<const SwPageFrame*>(pPage->GetNext()); + continue; + } + } + break; + } + return const_cast<SwPageFrame*>(pPage); +} + void SwFootnoteBossFrame::AppendFootnote( SwContentFrame *pRef, SwTextFootnote *pAttr ) { // If the footnote already exists, do nothing. @@ -1436,10 +1495,9 @@ void SwFootnoteBossFrame::AppendFootnote( SwContentFrame *pRef, SwTextFootnote * SwPageFrame *pPage = FindPageFrame(); SwPageFrame *pMyPage = pPage; bool bChgPage = false; - bool bEnd = false; - if ( pAttr->GetFootnote().IsEndNote() ) + const bool bEnd = pAttr->GetFootnote().IsEndNote(); + if (bEnd) { - bEnd = true; const IDocumentSettingAccess& rSettings = *pAttr->GetTextNode().getIDocumentSettingAccess(); if( GetUpper()->IsSctFrame() && static_cast<SwSectionFrame*>(GetUpper())->IsEndnAtEnd() ) @@ -1476,29 +1534,7 @@ void SwFootnoteBossFrame::AppendFootnote( SwContentFrame *pRef, SwTextFootnote * bChgPage = true; } else - { - // At least we can search the approximately correct page. - // To ensure to be finished in finite time even if hundreds - // of footnotes exist - SwPageFrame *pNxt = static_cast<SwPageFrame*>(pPage->GetNext()); - const sal_uLong nStPos = ::lcl_FindFootnotePos( pDoc, pAttr ); - while ( pNxt && pNxt->IsEndNotePage() ) - { - SwFootnoteContFrame *pCont = pNxt->FindFootnoteCont(); - if ( pCont && pCont->Lower() ) - { - OSL_ENSURE( pCont->Lower()->IsFootnoteFrame(), "no footnote in the container" ); - if ( nStPos > ::lcl_FindFootnotePos( pDoc, - static_cast<SwFootnoteFrame*>(pCont->Lower())->GetAttr())) - { - pPage = pNxt; - pNxt = static_cast<SwPageFrame*>(pPage->GetNext()); - continue; - } - } - break; - } - } + pPage = lcl_GetApproximateFootnotePage(true, pPage, pDoc, pAttr); } } else if( FTNPOS_CHAPTER == pDoc->GetFootnoteInfo().m_ePos && ( !GetUpper()-> @@ -1519,29 +1555,7 @@ void SwFootnoteBossFrame::AppendFootnote( SwContentFrame *pRef, SwTextFootnote * bChgPage = true; } else - { - // We can at least search the approximately correct page - // to ensure that we will finish in finite time even if - // hundreds of footnotes exist. - SwPageFrame *pNxt = static_cast<SwPageFrame*>(pPage->GetNext()); - const sal_uLong nStPos = ::lcl_FindFootnotePos( pDoc, pAttr ); - while ( pNxt && pNxt->IsFootnotePage() && !pNxt->IsEndNotePage() ) - { - SwFootnoteContFrame *pCont = pNxt->FindFootnoteCont(); - if ( pCont && pCont->Lower() ) - { - OSL_ENSURE( pCont->Lower()->IsFootnoteFrame(), "no footnote in the container" ); - if ( nStPos > ::lcl_FindFootnotePos( pDoc, - static_cast<SwFootnoteFrame*>(pCont->Lower())->GetAttr())) - { - pPage = pNxt; - pNxt = static_cast<SwPageFrame*>(pPage->GetNext()); - continue; - } - } - break; - } - } + pPage = lcl_GetApproximateFootnotePage(false, pPage, pDoc, pAttr); } // For now, create a footnote and the corresponding content frames @@ -1772,13 +1786,8 @@ void SwFootnoteBossFrame::CollectFootnotes( const SwContentFrame* _pRef, pFootnote = _pOld->FindFirstFootnote(); } } - // OD 03.04.2003 #108446# - consider new parameter <_bCollectOnlyPreviousFootnotes> - SwFootnoteBossFrame* pRefBossFrame = nullptr; - if ( _bCollectOnlyPreviousFootnotes ) - { - pRefBossFrame = this; - } - CollectFootnotes_( _pRef, pFootnote, _rFootnoteArr, _bCollectOnlyPreviousFootnotes, pRefBossFrame ); + + CollectFootnotes_(_pRef, pFootnote, _rFootnoteArr, _bCollectOnlyPreviousFootnotes ? this : nullptr); } static void FootnoteInArr( SwFootnoteFrames& rFootnoteArr, SwFootnoteFrame* pFootnote ) @@ -1787,24 +1796,11 @@ static void FootnoteInArr( SwFootnoteFrames& rFootnoteArr, SwFootnoteFrame* pFoo rFootnoteArr.push_back( pFootnote ); } -/// OD 03.04.2003 #108446# - add parameters <_bCollectOnlyPreviousFootnotes> and -/// <_pRefFootnoteBossFrame> in order to control, if only footnotes, which are positioned -/// before the given reference footnote boss frame have to be collected. -/// Note: if parameter <_bCollectOnlyPreviousFootnotes> is true, then parameter -/// <_pRefFootnoteBossFrame> have to be referenced to an object. -/// Adjust parameter names. void SwFootnoteBossFrame::CollectFootnotes_( const SwContentFrame* _pRef, SwFootnoteFrame* _pFootnote, SwFootnoteFrames& _rFootnoteArr, - bool _bCollectOnlyPreviousFootnotes, const SwFootnoteBossFrame* _pRefFootnoteBossFrame) { - // OD 03.04.2003 #108446# - assert, that no reference footnote boss frame - // is set, in spite of the order, that only previous footnotes has to be - // collected. - OSL_ENSURE( !_bCollectOnlyPreviousFootnotes || _pRefFootnoteBossFrame, - "<SwFootnoteBossFrame::CollectFootnotes_(..)> - No reference footnote boss frame for collecting only previous footnotes set.\nCrash will be caused!" ); - // Collect all footnotes referenced by pRef (attribute by attribute), combine them // (the content might be divided over multiple pages) and cut them. @@ -1874,7 +1870,7 @@ void SwFootnoteBossFrame::CollectFootnotes_( const SwContentFrame* _pRef, bool bContinuousEndnotes = rSettings.get(DocumentSettingId::CONTINUOUS_ENDNOTES); if (_pFootnote->GetRef() == _pRef && (!bEndNote || bContinuousEndnotes)) { - if ( _bCollectOnlyPreviousFootnotes ) + if (_pRefFootnoteBossFrame) { SwFootnoteBossFrame* pBossOfFoundFootnote = _pFootnote->FindFootnoteBossFrame( true ); OSL_ENSURE( pBossOfFoundFootnote, @@ -2165,7 +2161,7 @@ void SwFootnoteBossFrame::MoveFootnotes( const SwContentFrame *pSrc, SwContentFr if( pDestBoss ) // robust { SwFootnoteFrames aFootnoteArr; - SwFootnoteBossFrame::CollectFootnotes_( pDest, pFootnote, aFootnoteArr ); + SwFootnoteBossFrame::CollectFootnotes_(pDest, pFootnote, aFootnoteArr, nullptr); if ( !aFootnoteArr.empty() ) { pDestBoss->MoveFootnotes_( aFootnoteArr, true ); @@ -2782,23 +2778,10 @@ bool SwContentFrame::MoveFootnoteCntFwd( bool bMakePage, SwFootnoteBossFrame *pO // it into the container. // Create also a SectionFrame if currently in an area inside a footnote. SwFootnoteFrame* pTmpFootnote = pNewUpper->IsFootnoteFrame() ? static_cast<SwFootnoteFrame*>(pNewUpper) : nullptr; - if( !pTmpFootnote ) + if (!pTmpFootnote && pNewUpper->IsFootnoteContFrame()) { - OSL_ENSURE( pNewUpper->IsFootnoteContFrame(), "New Upper not a FootnoteCont."); SwFootnoteContFrame *pCont = static_cast<SwFootnoteContFrame*>(pNewUpper); - - // create footnote - SwFootnoteFrame *pOld = FindFootnoteFrame(); - pTmpFootnote = new SwFootnoteFrame( pOld->GetFormat()->GetDoc()->GetDfltFrameFormat(), - pOld, pOld->GetRef(), pOld->GetAttr() ); - // chaining of footnotes - if ( pOld->GetFollow() ) - { - pTmpFootnote->SetFollow( pOld->GetFollow() ); - pOld->GetFollow()->SetMaster( pTmpFootnote ); - } - pOld->SetFollow( pTmpFootnote ); - pTmpFootnote->SetMaster( pOld ); + pTmpFootnote = SwFootnoteContFrame::AppendChained(this, true); SwFrame* pNx = pCont->Lower(); if( pNx && pTmpFootnote->GetAttr()->GetFootnote().IsEndNote() ) while(pNx && !static_cast<SwFootnoteFrame*>(pNx)->GetAttr()->GetFootnote().IsEndNote()) diff --git a/sw/source/core/text/txtftn.cxx b/sw/source/core/text/txtftn.cxx index fde611eabbb1..a0309aa0e77f 100644 --- a/sw/source/core/text/txtftn.cxx +++ b/sw/source/core/text/txtftn.cxx @@ -585,7 +585,7 @@ void SwTextFrame::ConnectFootnote( SwTextFootnote *pFootnote, const SwTwips nDea mbInFootnoteConnect = true; // Just reset! // See if pFootnote is an endnote on a separate endnote page. const IDocumentSettingAccess& rSettings = GetDoc().getIDocumentSettingAccess(); - bool bContinuousEndnotes = rSettings.get(DocumentSettingId::CONTINUOUS_ENDNOTES); + const bool bContinuousEndnotes = rSettings.get(DocumentSettingId::CONTINUOUS_ENDNOTES); const bool bEnd = pFootnote->GetFootnote().IsEndNote(); // We want to store this value, because it is needed as a fallback _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
