diff options
Diffstat (limited to 'sw/source/core/layout/frmtool.cxx')
-rw-r--r-- | sw/source/core/layout/frmtool.cxx | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index c3fa35fcdc..eeab5c60c1 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -1025,7 +1025,7 @@ void SwContentNotify::ImplDestroy() SwSortedObjs* pObjs = pMasterFrame->GetDrawObjs(); for (SwAnchoredObject* pAnchoredObj : *pObjs) { - if ( pAnchoredObj->GetFrameFormat().GetAnchor().GetAnchorId() + if ( pAnchoredObj->GetFrameFormat()->GetAnchor().GetAnchorId() == RndStdIds::FLY_AT_CHAR ) { pAnchoredObj->CheckCharRectAndTopOfLine( !pMasterFrame->IsEmpty() ); @@ -2835,7 +2835,7 @@ static void lcl_RemoveObjsFromPage( SwFrame* _pFrame ) // #115759# - remove also drawing objects from page else if ( auto pDrawObj = dynamic_cast<SwAnchoredDrawObject*>( pObj) ) { - if (pObj->GetFrameFormat().GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR) + if (pObj->GetFrameFormat()->GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR) { if (SwPageFrame *pPg = pObj->GetPageFrame()) pPg->RemoveDrawObjFromPage( *pDrawObj ); @@ -2996,7 +2996,7 @@ static void lcl_AddObjsToPage( SwFrame* _pFrame, SwPageFrame* _pPage ) // #115759# - remove also drawing objects from page else if ( dynamic_cast<const SwAnchoredDrawObject*>( pObj) != nullptr ) { - if (pObj->GetFrameFormat().GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR) + if (pObj->GetFrameFormat()->GetAnchor().GetAnchorId() != RndStdIds::FLY_AS_CHAR) { pObj->InvalidateObjPos(); _pPage->AppendDrawObjToPage( @@ -3404,8 +3404,10 @@ void Notify_Background( const SdrObject* pObj, else { pFlyFrame = nullptr; - pAnchor = const_cast<SwFrame*>( - GetUserCall(pObj)->GetAnchoredObj( pObj )->GetAnchorFrame() ); + if (SwDrawContact* pC = static_cast<SwDrawContact*>(GetUserCall(pObj))) + pAnchor = const_cast<SwFrame*>(pC->GetAnchoredObj(pObj)->GetAnchorFrame()); + else + return; } if( PrepareHint::FlyFrameLeave != eHint && pAnchor->IsInFly() ) pArea = pAnchor->FindFlyFrame(); @@ -3879,7 +3881,32 @@ SwFrame* GetFrameOfModify(SwRootFrame const*const pLayout, sw::BroadcastingModif } while( bClientIterChanged ); if( pPos && pMinFrame && pMinFrame->IsTextFrame() ) - return static_cast<SwTextFrame*>(pMinFrame)->GetFrameAtPos( *pPos ); + { + SwTextFrame * pAtPos(static_cast<SwTextFrame*>(pMinFrame)->GetFrameAtPos(*pPos)); + if (!pViewPosAndCalcFrame) + { + return pAtPos; + } + TextFrameIndex nPos(pAtPos->MapModelToViewPos(*pPos)); + SwPageFrame const*const pPage(pAtPos->getRootFrame()->GetPageAtPos( + pViewPosAndCalcFrame->first, nullptr, true)); + SwFrame * pOnPage(pAtPos); // if all else fails return first one + ++nPos; // follow field portions are on follow frames that have mnOffset + // already incremented past the field, need to check that index too + while (pAtPos && pAtPos->GetOffset() <= nPos) + { + if (pAtPos->getFrameArea().Contains(pViewPosAndCalcFrame->first)) + { + return pAtPos; + } + if (pAtPos->FindPageFrame() == pPage) + { + pOnPage = pAtPos; + } + pAtPos = pAtPos->GetFollow(); + } + return pOnPage; + } return pMinFrame; } |