diff options
Diffstat (limited to 'sw/source/core/layout/newfrm.cxx')
-rw-r--r-- | sw/source/core/layout/newfrm.cxx | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx new file mode 100644 index 000000000..07ba49b7b --- /dev/null +++ b/sw/source/core/layout/newfrm.cxx @@ -0,0 +1,613 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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 . + */ + +#include <sal/config.h> + +#include <o3tl/safeint.hxx> +#include <svx/svdpage.hxx> +#include <drawdoc.hxx> +#include <fmtpdsc.hxx> +#include <swtable.hxx> +#include <rootfrm.hxx> +#include <pagefrm.hxx> +#include <dflyobj.hxx> +#include <frmtool.hxx> +#include "virtoutp.hxx" +#include <notxtfrm.hxx> +#include <pagedesc.hxx> +#include <viewimp.hxx> +#include <hints.hxx> +#include <viewopt.hxx> +#include <set> +#include <IDocumentDrawModelAccess.hxx> +#include <IDocumentSettingAccess.hxx> +#include <IDocumentFieldsAccess.hxx> +#include <DocumentLayoutManager.hxx> +#include <DocumentRedlineManager.hxx> +#include <ndindex.hxx> + +SwLayVout *SwRootFrame::s_pVout = nullptr; +bool SwRootFrame::s_isInPaint = false; +bool SwRootFrame::s_isNoVirDev = false; + +SwCache *SwFrame::mpCache = nullptr; + +static long FirstMinusSecond( long nFirst, long nSecond ) + { return nFirst - nSecond; } +static long SecondMinusFirst( long nFirst, long nSecond ) + { return nSecond - nFirst; } +static long SwIncrement( long nA, long nAdd ) + { return nA + nAdd; } +static long SwDecrement( long nA, long nSub ) + { return nA - nSub; } + +static SwRectFnCollection aHorizontal = { + /*.fnGetTop =*/&SwRect::Top_, + /*.fnGetBottom =*/&SwRect::Bottom_, + /*.fnGetLeft =*/&SwRect::Left_, + /*.fnGetRight =*/&SwRect::Right_, + /*.fnGetWidth =*/&SwRect::Width_, + /*.fnGetHeight =*/&SwRect::Height_, + /*.fnGetPos =*/&SwRect::TopLeft, + /*.fnGetSize =*/&SwRect::Size_, + + /*.fnSetTop =*/&SwRect::Top_, + /*.fnSetBottom =*/&SwRect::Bottom_, + /*.fnSetLeft =*/&SwRect::Left_, + /*.fnSetRight =*/&SwRect::Right_, + /*.fnSetWidth =*/&SwRect::Width_, + /*.fnSetHeight =*/&SwRect::Height_, + + /*.fnSubTop =*/&SwRect::SubTop, + /*.fnAddBottom =*/&SwRect::AddBottom, + /*.fnSubLeft =*/&SwRect::SubLeft, + /*.fnAddRight =*/&SwRect::AddRight, + /*.fnAddWidth =*/&SwRect::AddWidth, + /*.fnAddHeight =*/&SwRect::AddHeight, + + /*.fnSetPosX =*/&SwRect::SetPosX, + /*.fnSetPosY =*/&SwRect::SetPosY, + + /*.fnGetTopMargin =*/&SwFrame::GetTopMargin, + /*.fnGetBottomMargin =*/&SwFrame::GetBottomMargin, + /*.fnGetLeftMargin =*/&SwFrame::GetLeftMargin, + /*.fnGetRightMargin =*/&SwFrame::GetRightMargin, + /*.fnSetXMargins =*/&SwFrame::SetLeftRightMargins, + /*.fnSetYMargins =*/&SwFrame::SetTopBottomMargins, + /*.fnGetPrtTop =*/&SwFrame::GetPrtTop, + /*.fnGetPrtBottom =*/&SwFrame::GetPrtBottom, + /*.fnGetPrtLeft =*/&SwFrame::GetPrtLeft, + /*.fnGetPrtRight =*/&SwFrame::GetPrtRight, + /*.fnTopDist =*/&SwRect::GetTopDistance, + /*.fnBottomDist =*/&SwRect::GetBottomDistance, + /*.fnLeftDist =*/&SwRect::GetLeftDistance, + /*.fnRightDist =*/&SwRect::GetRightDistance, + /*.fnSetLimit =*/&SwFrame::SetMaxBottom, + /*.fnOverStep =*/&SwRect::OverStepBottom, + + /*.fnSetPos =*/&SwRect::SetUpperLeftCorner, + /*.fnMakePos =*/&SwFrame::MakeBelowPos, + /*.fnXDiff =*/&FirstMinusSecond, + /*.fnYDiff =*/&FirstMinusSecond, + /*.fnXInc =*/&SwIncrement, + /*.fnYInc =*/&o3tl::saturating_add<long>, + + /*.fnSetLeftAndWidth =*/&SwRect::SetLeftAndWidth, + /*.fnSetTopAndHeight =*/&SwRect::SetTopAndHeight +}; + +static SwRectFnCollection aVertical = { + /*.fnGetTop =*/&SwRect::Right_, + /*.fnGetBottom =*/&SwRect::Left_, + /*.fnGetLeft =*/&SwRect::Top_, + /*.fnGetRight =*/&SwRect::Bottom_, + /*.fnGetWidth =*/&SwRect::Height_, + /*.fnGetHeight =*/&SwRect::Width_, + /*.fnGetPos =*/&SwRect::TopRight, + /*.fnGetSize =*/&SwRect::SwappedSize, + + /*.fnSetTop =*/&SwRect::Right_, + /*.fnSetBottom =*/&SwRect::Left_, + /*.fnSetLeft =*/&SwRect::Top_, + /*.fnSetRight =*/&SwRect::Bottom_, + /*.fnSetWidth =*/&SwRect::Height_, + /*.fnSetHeight =*/&SwRect::Width_, + + /*.fnSubTop =*/&SwRect::AddRight, + /*.fnAddBottom =*/&SwRect::SubLeft, + /*.fnSubLeft =*/&SwRect::SubTop, + /*.fnAddRight =*/&SwRect::AddBottom, + /*.fnAddWidth =*/&SwRect::AddHeight, + /*.fnAddHeight =*/&SwRect::AddWidth, + + /*.fnSetPosX =*/&SwRect::SetPosY, + /*.fnSetPosY =*/&SwRect::SetPosX, + + /*.fnGetTopMargin =*/&SwFrame::GetRightMargin, + /*.fnGetBottomMargin =*/&SwFrame::GetLeftMargin, + /*.fnGetLeftMargin =*/&SwFrame::GetTopMargin, + /*.fnGetRightMargin =*/&SwFrame::GetBottomMargin, + /*.fnSetXMargins =*/&SwFrame::SetTopBottomMargins, + /*.fnSetYMargins =*/&SwFrame::SetRightLeftMargins, + /*.fnGetPrtTop =*/&SwFrame::GetPrtRight, + /*.fnGetPrtBottom =*/&SwFrame::GetPrtLeft, + /*.fnGetPrtLeft =*/&SwFrame::GetPrtTop, + /*.fnGetPrtRight =*/&SwFrame::GetPrtBottom, + /*.fnTopDist =*/&SwRect::GetRightDistance, + /*.fnBottomDist =*/&SwRect::GetLeftDistance, + /*.fnLeftDist =*/&SwRect::GetTopDistance, + /*.fnRightDist =*/&SwRect::GetBottomDistance, + /*.fnSetLimit =*/&SwFrame::SetMinLeft, + /*.fnOverStep =*/&SwRect::OverStepLeft, + + /*.fnSetPos =*/&SwRect::SetUpperRightCorner, + /*.fnMakePos =*/&SwFrame::MakeLeftPos, + /*.fnXDiff =*/&FirstMinusSecond, + /*.fnYDiff =*/&SecondMinusFirst, + /*.fnXInc =*/&SwIncrement, + /*.fnYInc =*/&SwDecrement, + + /*.fnSetLeftAndWidth =*/&SwRect::SetTopAndHeight, + /*.fnSetTopAndHeight =*/&SwRect::SetRightAndWidth +}; + +static SwRectFnCollection aVerticalLeftToRight = { + /*.fnGetTop =*/&SwRect::Left_, + /*.fnGetBottom =*/&SwRect::Right_, + /*.fnGetLeft =*/&SwRect::Top_, + /*.fnGetRight =*/&SwRect::Bottom_, + /*.fnGetWidth =*/&SwRect::Height_, + /*.fnGetHeight =*/&SwRect::Width_, + /*.fnGetPos =*/&SwRect::TopLeft, + /*.fnGetSize =*/&SwRect::SwappedSize, + + /*.fnSetTop =*/&SwRect::Left_, + /*.fnSetBottom =*/&SwRect::Right_, + /*.fnSetLeft =*/&SwRect::Top_, + /*.fnSetRight =*/&SwRect::Bottom_, + /*.fnSetWidth =*/&SwRect::Height_, + /*.fnSetHeight =*/&SwRect::Width_, + + /*.fnSubTop =*/&SwRect::SubLeft, + /*.fnAddBottom =*/&SwRect::AddRight, + /*.fnSubLeft =*/&SwRect::SubTop, + /*.fnAddRight =*/&SwRect::AddBottom, + /*.fnAddWidth =*/&SwRect::AddHeight, + /*.fnAddHeight =*/&SwRect::AddWidth, + + /*.fnSetPosX =*/&SwRect::SetPosY, + /*.fnSetPosY =*/&SwRect::SetPosX, + + /*.fnGetTopMargin =*/&SwFrame::GetLeftMargin, + /*.fnGetBottomMargin =*/&SwFrame::GetRightMargin, + /*.fnGetLeftMargin =*/&SwFrame::GetTopMargin, + /*.fnGetRightMargin =*/&SwFrame::GetBottomMargin, + /*.fnSetXMargins =*/&SwFrame::SetTopBottomMargins, + /*.fnSetYMargins =*/&SwFrame::SetLeftRightMargins, + /*.fnGetPrtTop =*/&SwFrame::GetPrtLeft, + /*.fnGetPrtBottom =*/&SwFrame::GetPrtRight, + /*.fnGetPrtLeft =*/&SwFrame::GetPrtTop, + /*.fnGetPrtRight =*/&SwFrame::GetPrtBottom, + /*.fnTopDist =*/&SwRect::GetLeftDistance, + /*.fnBottomDist =*/&SwRect::GetRightDistance, + /*.fnLeftDist =*/&SwRect::GetTopDistance, + /*.fnRightDist =*/&SwRect::GetBottomDistance, + /*.fnSetLimit =*/&SwFrame::SetMaxRight, + /*.fnOverStep =*/&SwRect::OverStepRight, + + /*.fnSetPos =*/&SwRect::SetUpperLeftCorner, + /*.fnMakePos =*/&SwFrame::MakeRightPos, + /*.fnXDiff =*/&FirstMinusSecond, + /*.fnYDiff =*/&FirstMinusSecond, + /*.fnXInc =*/&SwIncrement, + /*.fnYInc =*/&SwIncrement, + + /*.fnSetLeftAndWidth =*/&SwRect::SetTopAndHeight, + /*.fnSetTopAndHeight =*/&SwRect::SetLeftAndWidth +}; + +/** + * This is the same as horizontal, but rotated counter-clockwise by 90 degrees. + * This means logical top is physical left, bottom is right, left is bottom, + * finally right is top. Values map from logical to physical. + */ +static SwRectFnCollection aVerticalLeftToRightBottomToTop = { + /*.fnGetTop =*/&SwRect::Left_, + /*.fnGetBottom =*/&SwRect::Right_, + /*.fnGetLeft =*/&SwRect::Bottom_, + /*.fnGetRight =*/&SwRect::Top_, + /*.fnGetWidth =*/&SwRect::Height_, + /*.fnGetHeight =*/&SwRect::Width_, + /*.fnGetPos =*/&SwRect::BottomLeft, + /*.fnGetSize =*/&SwRect::SwappedSize, + + /*.fnSetTop =*/&SwRect::Left_, + /*.fnSetBottom =*/&SwRect::Right_, + /*.fnSetLeft =*/&SwRect::Bottom_, + /*.fnSetRight =*/&SwRect::Top_, + /*.fnSetWidth =*/&SwRect::Height_, + /*.fnSetHeight =*/&SwRect::Width_, + + /*.fnSubTop =*/&SwRect::SubLeft, + /*.fnAddBottom =*/&SwRect::AddRight, + /*.fnSubLeft =*/&SwRect::AddBottom, + /*.fnAddRight =*/&SwRect::SubTop, + /*.fnAddWidth =*/&SwRect::AddHeight, + /*.fnAddHeight =*/&SwRect::AddWidth, + + /*.fnSetPosX =*/&SwRect::SetPosY, + /*.fnSetPosY =*/&SwRect::SetPosX, + + /*.fnGetTopMargin =*/&SwFrame::GetLeftMargin, + /*.fnGetBottomMargin =*/&SwFrame::GetRightMargin, + /*.fnGetLeftMargin =*/&SwFrame::GetBottomMargin, + /*.fnGetRightMargin =*/&SwFrame::GetTopMargin, + /*.fnSetXMargins =*/&SwFrame::SetTopBottomMargins, + /*.fnSetYMargins =*/&SwFrame::SetLeftRightMargins, + /*.fnGetPrtTop =*/&SwFrame::GetPrtLeft, + /*.fnGetPrtBottom =*/&SwFrame::GetPrtRight, + /*.fnGetPrtLeft =*/&SwFrame::GetPrtBottom, + /*.fnGetPrtRight =*/&SwFrame::GetPrtTop, + /*.fnTopDist =*/&SwRect::GetLeftDistance, + /*.fnBottomDist =*/&SwRect::GetRightDistance, + /*.fnLeftDist =*/&SwRect::GetBottomDistance, + /*.fnRightDist =*/&SwRect::GetTopDistance, + /*.fnSetLimit =*/&SwFrame::SetMaxRight, + /*.fnOverStep =*/&SwRect::OverStepRight, + + /*.fnSetPos =*/&SwRect::SetLowerLeftCorner, + /*.fnMakePos =*/&SwFrame::MakeRightPos, + /*.fnXDiff =*/&SecondMinusFirst, + /*.fnYDiff =*/&FirstMinusSecond, + /*.fnXInc =*/&SwDecrement, + /*.fnYInc =*/&SwIncrement, + + /*.fnSetLeftAndWidth =*/&SwRect::SetBottomAndHeight, + /*.fnSetTopAndHeight =*/&SwRect::SetLeftAndWidth +}; + +SwRectFn fnRectHori = &aHorizontal; +SwRectFn fnRectVert = &aVertical; +SwRectFn fnRectVertL2R = &aVerticalLeftToRight; +SwRectFn fnRectVertL2RB2T = &aVerticalLeftToRightBottomToTop; + +// #i65250# +sal_uInt32 SwFrameAreaDefinition::mnLastFrameId=0; + + +void FrameInit() +{ + SwRootFrame::s_pVout = new SwLayVout(); + SwCache *pNew = new SwCache( 100 +#ifdef DBG_UTIL + , "static SwBorderAttrs::pCache" +#endif + ); + SwFrame::SetCache( pNew ); +} + +void FrameFinit() +{ +#if OSL_DEBUG_LEVEL > 0 + // The cache may only contain null pointers at this time. + for( size_t n = SwFrame::GetCachePtr()->size(); n; ) + if( (*SwFrame::GetCachePtr())[ --n ] ) + { + SwCacheObj* pObj = (*SwFrame::GetCachePtr())[ n ]; + OSL_ENSURE( !pObj, "Who didn't deregister?"); + } +#endif + delete SwRootFrame::s_pVout; + delete SwFrame::GetCachePtr(); +} + +// RootFrame::Everything that belongs to CurrShell + +CurrShell::CurrShell( SwViewShell *pNew ) +{ + OSL_ENSURE( pNew, "insert 0-Shell?" ); + pRoot = pNew->GetLayout(); + if ( pRoot ) + { + pPrev = pRoot->mpCurrShell; + pRoot->mpCurrShell = pNew; + pRoot->mpCurrShells->insert( this ); + } + else + pPrev = nullptr; +} + +CurrShell::~CurrShell() +{ + if ( pRoot ) + { + pRoot->mpCurrShells->erase( this ); + if ( pPrev ) + pRoot->mpCurrShell = pPrev; + if ( pRoot->mpCurrShells->empty() && pRoot->mpWaitingCurrShell ) + { + pRoot->mpCurrShell = pRoot->mpWaitingCurrShell; + pRoot->mpWaitingCurrShell = nullptr; + } + } +} + +void SetShell( SwViewShell *pSh ) +{ + SwRootFrame *pRoot = pSh->GetLayout(); + if ( pRoot->mpCurrShells->empty() ) + pRoot->mpCurrShell = pSh; + else + pRoot->mpWaitingCurrShell = pSh; +} + +void SwRootFrame::DeRegisterShell( SwViewShell *pSh ) +{ + // Activate some shell if possible + if ( mpCurrShell == pSh ) + { + mpCurrShell = nullptr; + for(SwViewShell& rShell : pSh->GetRingContainer()) + { + if(&rShell != pSh) + { + mpCurrShell = &rShell; + break; + } + } + } + + // Doesn't matter anymore + if ( mpWaitingCurrShell == pSh ) + mpWaitingCurrShell = nullptr; + + // Remove references + for ( CurrShell *pC : *mpCurrShells ) + { + if (pC->pPrev == pSh) + pC->pPrev = nullptr; + } +} + +void InitCurrShells( SwRootFrame *pRoot ) +{ + pRoot->mpCurrShells.reset( new SwCurrShells ); +} + +/* +|* The RootFrame requests an own FrameFormat from the document, which it is +|* going to delete again in the dtor. The own FrameFormat is derived from +|* the passed FrameFormat. +|*/ +SwRootFrame::SwRootFrame( SwFrameFormat *pFormat, SwViewShell * pSh ) : + SwLayoutFrame( pFormat->GetDoc()->MakeFrameFormat( + "Root", pFormat ), nullptr ), + maPagesArea(), + mnViewWidth( -1 ), + mnColumns( 0 ), + mbBookMode( false ), + mbSidebarChanged( false ), + mbNeedGrammarCheck( false ), + mbCheckSuperfluous( false ), + mbIdleFormat( true ), + mbBrowseWidthValid( false ), + mbTurboAllowed( true ), + mbAssertFlyPages( true ), + mbIsVirtPageNum( false ), + mbIsNewLayout( true ), + mbCallbackActionEnabled ( false ), + mbLayoutFreezed ( false ), + mbHideRedlines(pFormat->GetDoc()->GetDocumentRedlineManager().IsHideRedlines()), + mnBrowseWidth(MIN_BROWSE_WIDTH), + mpTurbo( nullptr ), + mpLastPage( nullptr ), + mpCurrShell( pSh ), + mpWaitingCurrShell( nullptr ), + mpDrawPage( nullptr ), + mnPhyPageNums( 0 ), + mnAccessibleShells( 0 ) +{ + mnFrameType = SwFrameType::Root; + setRootFrame( this ); +} + +void SwRootFrame::Init( SwFrameFormat* pFormat ) +{ + InitCurrShells( this ); + + IDocumentTimerAccess& rTimerAccess = pFormat->getIDocumentTimerAccess(); + IDocumentLayoutAccess& rLayoutAccess = pFormat->getIDocumentLayoutAccess(); + IDocumentFieldsAccess& rFieldsAccess = pFormat->getIDocumentFieldsAccess(); + const IDocumentSettingAccess& rSettingAccess = pFormat->getIDocumentSettingAccess(); + rTimerAccess.StopIdling(); + // For creating the Flys by MakeFrames() + rLayoutAccess.SetCurrentViewShell( GetCurrShell() ); + mbCallbackActionEnabled = false; // needs to be set to true before leaving! + + SwDrawModel* pMd = pFormat->getIDocumentDrawModelAccess().GetDrawModel(); + if ( pMd ) + { + // Disable "multiple layout" + mpDrawPage = pMd->GetPage(0); + + mpDrawPage->SetSize( getFrameArea().SSize() ); + } + + // Initialize the layout: create pages, link content with Content etc. + // First, initialize some stuff, then get hold of the first + // node (which will be needed for the PageDesc). + + SwDoc* pDoc = pFormat->GetDoc(); + SwNodeIndex aIndex( *pDoc->GetNodes().GetEndOfContent().StartOfSectionNode() ); + SwContentNode *pNode = pDoc->GetNodes().GoNextSection( &aIndex, true, false ); + // #123067# pNode = 0 can really happen + SwTableNode *pTableNd= pNode ? pNode->FindTableNode() : nullptr; + + // Get hold of PageDesc (either via FrameFormat of the first node or the initial one). + SwPageDesc *pDesc = nullptr; + ::std::optional<sal_uInt16> oPgNum; + + if ( pTableNd ) + { + const SwFormatPageDesc &rDesc = pTableNd->GetTable().GetFrameFormat()->GetPageDesc(); + pDesc = const_cast<SwPageDesc*>(rDesc.GetPageDesc()); + //#19104# respect the page number offset!! + oPgNum = rDesc.GetNumOffset(); + if (oPgNum) + mbIsVirtPageNum = true; + } + else if ( pNode ) + { + const SwFormatPageDesc &rDesc = pNode->GetSwAttrSet().GetPageDesc(); + pDesc = const_cast<SwPageDesc*>(rDesc.GetPageDesc()); + //#19104# respect the page number offset!! + oPgNum = rDesc.GetNumOffset(); + if (oPgNum) + mbIsVirtPageNum = true; + } + else + mbIsVirtPageNum = false; + if ( !pDesc ) + pDesc = &pDoc->GetPageDesc( 0 ); + + // Create a page and put it in the layout + // The first page is always a right-page and always a first-page + SwPageFrame *pPage = ::InsertNewPage(*pDesc, this, true, true, false, false, nullptr); + + // Find the first page in the Bodytext section. + SwLayoutFrame *pLay = pPage->FindBodyCont(); + while( pLay->Lower() ) + pLay = static_cast<SwLayoutFrame*>(pLay->Lower()); + + SwNodeIndex aTmp( *pDoc->GetNodes().GetEndOfContent().StartOfSectionNode(), 1 ); + ::InsertCnt_( pLay, pDoc, aTmp.GetIndex(), true ); + //Remove masters that haven't been replaced yet from the list. + RemoveMasterObjs( mpDrawPage ); + if( rSettingAccess.get(DocumentSettingId::GLOBAL_DOCUMENT) ) + rFieldsAccess.UpdateRefFields(); + //b6433357: Update page fields after loading + if ( !mpCurrShell || !mpCurrShell->Imp()->IsUpdateExpFields() ) + { + SwDocPosUpdate aMsgHint( pPage->getFrameArea().Top() ); + rFieldsAccess.UpdatePageFields( &aMsgHint ); + } + + rTimerAccess.StartIdling(); + mbCallbackActionEnabled = true; + + SwViewShell *pViewSh = GetCurrShell(); + if (pViewSh) + mbNeedGrammarCheck = pViewSh->GetViewOptions()->IsOnlineSpell(); +} + +void SwRootFrame::DestroyImpl() +{ + mbTurboAllowed = false; + mpTurbo = nullptr; + + SwFrameFormat *pRegisteredInNonConst = static_cast<SwFrameFormat*>(GetDep()); + if ( pRegisteredInNonConst ) + { + SwDoc *pDoc = pRegisteredInNonConst->GetDoc(); + pDoc->DelFrameFormat( pRegisteredInNonConst ); + // do this before calling RemoveFootnotes() because footnotes + // can contain anchored objects + pDoc->GetDocumentLayoutManager().ClearSwLayouterEntries(); + } + + mpDestroy.reset(); + + // Remove references + for ( auto& rpCurrShell : *mpCurrShells ) + rpCurrShell->pRoot = nullptr; + + mpCurrShells.reset(); + + // Some accessible shells are left => problems on second SwFrame::Destroy call + assert(0 == mnAccessibleShells); + + // fdo#39510 crash on document close with footnotes + // Object ownership in writer and esp. in layout are a mess: Before the + // document/layout split SwDoc and SwRootFrame were essentially one object + // and magically/uncleanly worked around their common destruction by call + // to SwDoc::IsInDtor() -- even from the layout. As of now destruction of + // the layout proceeds forward through the frames. Since SwTextFootnote::DelFrames + // also searches backwards to find the master of footnotes, they must be + // considered to be owned by the SwRootFrame and also be destroyed here, + // before tearing down the (now footnote free) rest of the layout. + RemoveFootnotes(nullptr, false, true); + + SwLayoutFrame::DestroyImpl(); +} + +SwRootFrame::~SwRootFrame() +{ +} + +void SwRootFrame::RemoveMasterObjs( SdrPage *pPg ) +{ + // Remove all master objects from the Page. But don't delete! + for( size_t i = pPg ? pPg->GetObjCount() : 0; i; ) + { + SdrObject* pObj = pPg->GetObj( --i ); + if( dynamic_cast< const SwFlyDrawObj *>( pObj ) != nullptr ) + pPg->RemoveObject( i ); + } +} + +void SwRootFrame::AllCheckPageDescs() const +{ + if ( !IsLayoutFreezed() ) + CheckPageDescs( const_cast<SwPageFrame*>(static_cast<const SwPageFrame*>(Lower())) ); +} + +void SwRootFrame::AllInvalidateAutoCompleteWords() const +{ + SwPageFrame *pPage = const_cast<SwPageFrame*>(static_cast<const SwPageFrame*>(Lower())); + while ( pPage ) + { + pPage->InvalidateAutoCompleteWords(); + pPage = static_cast<SwPageFrame*>(pPage->GetNext()); + } +} + +void SwRootFrame::AllAddPaintRect() const +{ + GetCurrShell()->AddPaintRect( getFrameArea() ); +} + +void SwRootFrame::AllRemoveFootnotes() +{ + RemoveFootnotes(); +} + +void SwRootFrame::AllInvalidateSmartTagsOrSpelling(bool bSmartTags) const +{ + SwPageFrame *pPage = const_cast<SwPageFrame*>(static_cast<const SwPageFrame*>(Lower())); + while ( pPage ) + { + if ( bSmartTags ) + pPage->InvalidateSmartTags(); + + pPage->InvalidateSpelling(); + pPage = static_cast<SwPageFrame*>(pPage->GetNext()); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |