sw/source/core/access/accfrmobj.cxx | 15 ++- sw/source/core/doc/docdraw.cxx | 12 +++ sw/source/core/draw/dview.cxx | 108 ++++++++++++++++----------- sw/source/core/frmedt/fecopy.cxx | 25 +++--- sw/source/core/frmedt/fefly1.cxx | 13 ++- sw/source/core/frmedt/feshview.cxx | 37 ++++++--- sw/source/core/layout/anchoreddrawobject.cxx | 4 + sw/source/core/layout/anchoredobject.cxx | 11 +- sw/source/core/layout/fly.cxx | 4 - sw/source/core/layout/flylay.cxx | 41 +++++----- sw/source/core/layout/frmtool.cxx | 40 ++++++---- sw/source/core/layout/pagechg.cxx | 19 ++-- sw/source/core/layout/trvlfrm.cxx | 39 +++++---- sw/source/core/txtnode/atrflyin.cxx | 3 sw/source/core/undo/undraw.cxx | 31 ++++--- 15 files changed, 242 insertions(+), 160 deletions(-)
New commits: commit 67af2cc487450a274ae7ba988249c9c362eaa95d Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Thu Apr 25 18:15:12 2024 +0200 Commit: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> CommitDate: Thu May 16 19:58:34 2024 +0200 sw: check GetUserCall It might return nullptr See https://crashreport.libreoffice.org/stats/signature/SwFEShell::ShouldObjectBeSelected(Point%20const%20&) Change-Id: Ia0ed355a7eb9084b9f57163ffbfe6b549c8bdb3f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166642 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 495b5db74f0db59395ff68bacc8d8ca67595b66e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166710 Reviewed-by: Christian Lohmaier <lohmaier+libreoff...@googlemail.com> diff --git a/sw/source/core/access/accfrmobj.cxx b/sw/source/core/access/accfrmobj.cxx index f78dc2d155db..004ca4ab94e0 100644 --- a/sw/source/core/access/accfrmobj.cxx +++ b/sw/source/core/access/accfrmobj.cxx @@ -240,13 +240,16 @@ SwRect SwAccessibleChild::GetBox( const SwAccessibleMap& rAccMap ) const // by the mpFrame case above b) for genuine SdrObject this must be set // if it's connected to layout assert(dynamic_cast<SwDrawContact const*>(pContact)); - SwPageFrame const*const pPage(const_cast<SwAnchoredObject *>( - pContact->GetAnchoredObj(mpDrawObj))->FindPageFrameOfAnchor()); - if (pPage) // may end up here with partial layout -> not visible + if (pContact) { - aBox = SwRect( mpDrawObj->GetCurrentBoundRect() ); - // tdf#91260 drawing object may be partially off-page - aBox.Intersection(pPage->getFrameArea()); + SwPageFrame const*const pPage(const_cast<SwAnchoredObject *>( + pContact->GetAnchoredObj(mpDrawObj))->FindPageFrameOfAnchor()); + if (pPage) // may end up here with partial layout -> not visible + { + aBox = SwRect( mpDrawObj->GetCurrentBoundRect() ); + // tdf#91260 drawing object may be partially off-page + aBox.Intersection(pPage->getFrameArea()); + } } } else if ( mpWindow ) diff --git a/sw/source/core/doc/docdraw.cxx b/sw/source/core/doc/docdraw.cxx index 521ca2b0ba15..09b1d9afb697 100644 --- a/sw/source/core/doc/docdraw.cxx +++ b/sw/source/core/doc/docdraw.cxx @@ -68,6 +68,9 @@ static void lcl_AdjustPositioningAttr( SwDrawFrameFormat* _pFrameFormat, const SwContact* pContact = GetUserCall( &_rSdrObj ); OSL_ENSURE( pContact, "<lcl_AdjustPositioningAttr(..)> - missing contact object." ); + if (!pContact) + return; + // determine position of new group object relative to its anchor frame position SwTwips nHoriRelPos = 0; SwTwips nVertRelPos = 0; @@ -195,6 +198,9 @@ SwDrawContact* SwDoc::GroupSelection( SdrView& rDrawView ) // Revoke anchor attribute. SwDrawContact *pMyContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pMyContact) + return pNewContact; + const SwFormatAnchor aAnch( pMyContact->GetFormat()->GetAnchor() ); std::unique_ptr<SwUndoDrawGroup> pUndo; @@ -216,6 +222,9 @@ SwDrawContact* SwDoc::GroupSelection( SdrView& rDrawView ) pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + continue; + // #i53320# #if OSL_DEBUG_LEVEL > 0 SwAnchoredDrawObject* pAnchoredDrawObj = @@ -352,6 +361,9 @@ void SwDoc::UnGroupSelection( SdrView& rDrawView ) { SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + continue; + std::shared_ptr<SwTextBoxNode> pTextBoxNode; if (auto pGroupFormat = pContact->GetFormat()) pTextBoxNode = pGroupFormat->GetOtherTextBoxFormats(); diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx index fe0db61925c4..39ecb982c00c 100644 --- a/sw/source/core/draw/dview.cxx +++ b/sw/source/core/draw/dview.cxx @@ -210,10 +210,14 @@ void SwDrawView::AddCustomHdl() { const SdrMarkList &rMrkList = GetMarkedObjectList(); - if(rMrkList.GetMarkCount() != 1 || !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj())) + if(rMrkList.GetMarkCount() != 1) return; SdrObject *pObj = rMrkList.GetMark(0)->GetMarkedSdrObj(); + SwContact* pContact = ::GetUserCall( pObj ); + if (!pContact) + return; + // make code robust SwFrameFormat* pFrameFormat( ::FindFrameFormat( pObj ) ); if ( !pFrameFormat ) @@ -236,7 +240,7 @@ void SwDrawView::AddCustomHdl() { // #i28701# - use last character rectangle saved at object // in order to avoid a format of the anchor frame - SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj ); + SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj ); // Invalidate/recalc LastCharRect which can contain invalid frame offset because // of later frame changes @@ -360,7 +364,8 @@ void SwDrawView::MoveRepeatedObjs( const SwAnchoredObject& _rMovedAnchoredObj, { const SwContact* pContact = ::GetUserCall( _rMovedAnchoredObj.GetDrawObj() ); assert(pContact && "SwDrawView::MoveRepeatedObjs(..) - missing contact object -> crash."); - pContact->GetAnchoredObjs( aAnchoredObjs ); + if (pContact) + pContact->GetAnchoredObjs( aAnchoredObjs ); } // check, if 'repeated' objects exists. @@ -402,7 +407,8 @@ void SwDrawView::MoveRepeatedObjs( const SwAnchoredObject& _rMovedAnchoredObj, { const SwContact* pContact = ::GetUserCall( pChildObj ); assert(pContact && "SwDrawView::MoveRepeatedObjs(..) - missing contact object -> crash."); - pContact->GetAnchoredObjs( aAnchoredObjs ); + if (pContact) + pContact->GetAnchoredObjs( aAnchoredObjs ); } // move 'repeated' ones to the same order number as the already moved one. const size_t nTmpNewPos = pChildObj->GetOrdNum(); @@ -449,8 +455,11 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t nOldPos, pDrawPage->RecalcObjOrdNums(); const size_t nObjCount = pDrawPage->GetObjCount(); - SwAnchoredObject* pMovedAnchoredObj = - ::GetUserCall( pObj )->GetAnchoredObj( pObj ); + SwContact* pContact = ::GetUserCall( pObj ); + if (!pContact) + return; + + SwAnchoredObject* pMovedAnchoredObj = pContact->GetAnchoredObj( pObj ); const SwFlyFrame* pParentAnchoredObj = pMovedAnchoredObj->GetAnchorFrame()->FindFlyFrame(); @@ -493,21 +502,22 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t nOldPos, if ( pTmpObj ) { size_t nTmpNewPos( nNewPos ); - if ( bMovedForward ) - { - // move before the top 'repeated' object - const sal_uInt32 nTmpMaxOrdNum = - ::GetUserCall( pTmpObj )->GetMaxOrdNum(); - if ( nTmpMaxOrdNum > nNewPos ) - nTmpNewPos = nTmpMaxOrdNum; - } - else + if (const SwContact* pContact2 = ::GetUserCall( pTmpObj )) { - // move behind the bottom 'repeated' object - const sal_uInt32 nTmpMinOrdNum = - ::GetUserCall( pTmpObj )->GetMinOrdNum(); - if ( nTmpMinOrdNum < nNewPos ) - nTmpNewPos = nTmpMinOrdNum; + if ( bMovedForward ) + { + // move before the top 'repeated' object + const sal_uInt32 nTmpMaxOrdNum = pContact2->GetMaxOrdNum(); + if ( nTmpMaxOrdNum > nNewPos ) + nTmpNewPos = nTmpMaxOrdNum; + } + else + { + // move behind the bottom 'repeated' object + const sal_uInt32 nTmpMinOrdNum = pContact2->GetMinOrdNum(); + if ( nTmpMinOrdNum < nNewPos ) + nTmpNewPos = nTmpMinOrdNum; + } } if ( nTmpNewPos != nNewPos ) { @@ -529,18 +539,25 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t nOldPos, { // determine position before the object before its top 'child' object const SdrObject* pTmpObj = pDrawPage->GetObj( nMaxChildOrdNum ); - size_t nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum() + 1; - if ( nTmpNewPos >= nObjCount ) + if (SwContact* pContact2 = ::GetUserCall( pTmpObj )) { - --nTmpNewPos; + size_t nTmpNewPos = pContact2->GetMaxOrdNum() + 1; + if ( nTmpNewPos >= nObjCount ) + { + --nTmpNewPos; + } + // assure, that determined position isn't between 'repeated' objects + pTmpObj = pDrawPage->GetObj( nTmpNewPos ); + pContact2 = ::GetUserCall( pTmpObj ); + if (pContact2) + { + nTmpNewPos = pContact2->GetMaxOrdNum(); + // apply new position + pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos ); + nNewPos = nTmpNewPos; + pDrawPage->RecalcObjOrdNums(); + } } - // assure, that determined position isn't between 'repeated' objects - pTmpObj = pDrawPage->GetObj( nTmpNewPos ); - nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum(); - // apply new position - pDrawPage->SetObjectOrdNum( nNewPos, nTmpNewPos ); - nNewPos = nTmpNewPos; - pDrawPage->RecalcObjOrdNums(); } } @@ -564,16 +581,18 @@ void SwDrawView::ObjOrderChanged( SdrObject* pObj, size_t nOldPos, if ( pTmpParentObj && pTmpParentObj->GetFrameFormat() != pParentFrameFormat ) { - if ( bMovedForward ) + if (const SwContact* pContact2 = ::GetUserCall( pTmpObj )) { - nTmpNewPos = ::GetUserCall( pTmpObj )->GetMaxOrdNum(); - pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 ); - } - else - { - nTmpNewPos = ::GetUserCall( pTmpParentObj->GetDrawObj() ) - ->GetMinOrdNum(); - pTmpObj = pTmpParentObj->GetDrawObj(); + if ( bMovedForward ) + { + nTmpNewPos = pContact2->GetMaxOrdNum(); + pTmpObj = pDrawPage->GetObj( nTmpNewPos + 1 ); + } + else + { + nTmpNewPos = pContact2->GetMinOrdNum(); + pTmpObj = pTmpParentObj->GetDrawObj(); + } } } else @@ -687,6 +706,9 @@ const SwFrame* SwDrawView::CalcAnchor() return nullptr; SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); + SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + return nullptr; //Search for paragraph bound objects, otherwise only the //current anchor. Search only if we currently drag. @@ -700,16 +722,15 @@ const SwFrame* SwDrawView::CalcAnchor() } else { - SwDrawContact *pC = static_cast<SwDrawContact*>(GetUserCall(pObj)); // determine correct anchor position for 'virtual' drawing objects. // #i26791# - pAnch = pC->GetAnchorFrame( pObj ); + pAnch = pContact->GetAnchorFrame( pObj ); if( !pAnch ) { - pC->ConnectToLayout(); + pContact->ConnectToLayout(); // determine correct anchor position for 'virtual' drawing objects. // #i26791# - pAnch = pC->GetAnchorFrame( pObj ); + pAnch = pContact->GetAnchorFrame( pObj ); } aMyRect = pObj->GetSnapRect(); } @@ -744,7 +765,6 @@ const SwFrame* SwDrawView::CalcAnchor() { const SwRect aRect( aPt.getX(), aPt.getY(), 1, 1 ); - SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); if ( pContact->GetAnchorFrame( pObj ) && pContact->GetAnchorFrame( pObj )->IsPageFrame() ) pAnch = pContact->GetPageFrame(); diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx index 69fae8bf0ae0..01eee5072fb6 100644 --- a/sw/source/core/frmedt/fecopy.cxx +++ b/sw/source/core/frmedt/fecopy.cxx @@ -195,18 +195,20 @@ void SwFEShell::Copy( SwDoc& rClpDoc, const OUString* pNewClpText ) } else { - SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall( pObj )); - SwFrameFormat *pFormat = pContact->GetFormat(); - SwFormatAnchor aAnchor( pFormat->GetAnchor() ); - if ((RndStdIds::FLY_AT_PARA == aAnchor.GetAnchorId()) || - (RndStdIds::FLY_AT_CHAR == aAnchor.GetAnchorId()) || - (RndStdIds::FLY_AT_FLY == aAnchor.GetAnchorId()) || - (RndStdIds::FLY_AS_CHAR == aAnchor.GetAnchorId())) + if (SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall( pObj ))) { - aAnchor.SetAnchor( &aPos ); - } + SwFrameFormat *pFormat = pContact->GetFormat(); + SwFormatAnchor aAnchor( pFormat->GetAnchor() ); + if ((RndStdIds::FLY_AT_PARA == aAnchor.GetAnchorId()) || + (RndStdIds::FLY_AT_CHAR == aAnchor.GetAnchorId()) || + (RndStdIds::FLY_AT_FLY == aAnchor.GetAnchorId()) || + (RndStdIds::FLY_AS_CHAR == aAnchor.GetAnchorId())) + { + aAnchor.SetAnchor( &aPos ); + } - rClpDoc.getIDocumentLayoutAccess().CopyLayoutFormat( *pFormat, aAnchor, true, true ); + rClpDoc.getIDocumentLayoutAccess().CopyLayoutFormat( *pFormat, aAnchor, true, true ); + } } } } @@ -297,6 +299,9 @@ bool SwFEShell::CopyDrawSel( SwFEShell& rDestShell, const Point& rSttPt, SdrObject *pObj = aMrkList.GetMark( i )->GetMarkedSdrObj(); SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall( pObj )); + if (!pContact) + continue; + SwFrameFormat *pFormat = pContact->GetFormat(); const SwFormatAnchor& rAnchor = pFormat->GetAnchor(); diff --git a/sw/source/core/frmedt/fefly1.cxx b/sw/source/core/frmedt/fefly1.cxx index 2e5b8bf53d15..644c5ccf0e40 100644 --- a/sw/source/core/frmedt/fefly1.cxx +++ b/sw/source/core/frmedt/fefly1.cxx @@ -382,11 +382,13 @@ const SwFrameFormat* SwFEShell::IsFlyInFly() return nullptr; return pFly->GetFormat(); } - else if ( rMrkList.GetMarkCount() != 1 || - !GetUserCall(rMrkList.GetMark( 0 )->GetMarkedSdrObj()) ) + else if ( rMrkList.GetMarkCount() != 1 ) return nullptr; SdrObject *pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj(); + SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + return nullptr; SwFrameFormat *pFormat = FindFrameFormat( pObj ); if( pFormat && RndStdIds::FLY_AT_FLY == pFormat->GetAnchor().GetAnchorId() ) @@ -398,7 +400,7 @@ const SwFrameFormat* SwFEShell::IsFlyInFly() } else { - pFly = static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame(pObj); + pFly = pContact->GetAnchorFrame(pObj); } OSL_ENSURE( pFly, "IsFlyInFly: Where's my anchor?" ); @@ -491,11 +493,12 @@ Point SwFEShell::FindAnchorPos( const Point& rAbsPos, bool bMoveIt ) SdrObject* pObj = rMrkList.GetMark(0)->GetMarkedSdrObj(); - if (!GetUserCall(pObj)) + SwContact* pContact = ::GetUserCall( pObj ); + if (!pContact) return aRet; // #i28701# - SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj ); + SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj ); SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat(); const RndStdIds nAnchorId = pFormat->GetAnchor().GetAnchorId(); diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx index 4ad0747619ee..353cb5214ea8 100644 --- a/sw/source/core/frmedt/feshview.cxx +++ b/sw/source/core/frmedt/feshview.cxx @@ -377,22 +377,27 @@ bool SwFEShell::MoveAnchor( SwMove nDir ) const SdrMarkList& pMrkList = Imp()->GetDrawView()->GetMarkedObjectList(); if (1 != pMrkList.GetMarkCount()) return false; + + SdrObject *pObj = pMrkList.GetMark( 0 )->GetMarkedSdrObj(); + SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + return false; + SwFrame* pOld; SwFlyFrame* pFly = nullptr; - SdrObject *pObj = pMrkList.GetMark( 0 )->GetMarkedSdrObj(); if (SwVirtFlyDrawObj* pVirtO = dynamic_cast<SwVirtFlyDrawObj*>(pObj)) { pFly = pVirtO->GetFlyFrame(); pOld = pFly->AnchorFrame(); } else - pOld = static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame( pObj ); + pOld = pContact->GetAnchorFrame( pObj ); bool bRet = false; if( pOld ) { SwFrame* pNew = pOld; // #i28701# - SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj ); + SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj ); SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat(); SwFormatAnchor aAnch( pFormat->GetAnchor() ); RndStdIds nAnchorId = aAnch.GetAnchorId(); @@ -875,7 +880,11 @@ static void lcl_NotifyNeighbours( const SdrMarkList *pLst ) } else { - SwFrame* pAnch = static_cast<SwDrawContact*>( GetUserCall(pO) )->GetAnchorFrame( pO ); + SwDrawContact* pContact = static_cast<SwDrawContact*>(GetUserCall(pO)); + if (!pContact) + continue; + + SwFrame* pAnch = pContact->GetAnchorFrame( pO ); if( !pAnch ) continue; pPage = pAnch->FindPageFrame(); @@ -1317,12 +1326,15 @@ bool SwFEShell::ShouldObjectBeSelected(const Point& rPt) { if ( pObj->GetLayer() == rIDDMA.GetHellId() ) { - const SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj ); - const SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat(); - const SwFormatSurround& rSurround = pFormat->GetSurround(); - if ( rSurround.GetSurround() == css::text::WrapTextMode_THROUGH ) + if (const SwContact* pContact = ::GetUserCall( pObj )) { - bObjInBackground = true; + const SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( pObj ); + const SwFrameFormat* pFormat = pAnchoredObj->GetFrameFormat(); + const SwFormatSurround& rSurround = pFormat->GetSurround(); + if ( rSurround.GetSurround() == css::text::WrapTextMode_THROUGH ) + { + bObjInBackground = true; + } } } } @@ -2352,7 +2364,7 @@ bool SwFEShell::IsGroupSelected(bool bAllowDiagams) // Thus, use corresponding method instead of checking type. if ( pObj->IsGroupObject() && // --> #i38505# No ungroup allowed for 3d objects - !pObj->Is3DObj() && + !pObj->Is3DObj() && GetUserCall(pObj) && RndStdIds::FLY_AS_CHAR != static_cast<SwDrawContact*>(GetUserCall(pObj))-> GetFormat()->GetAnchor().GetAnchorId() ) { @@ -2681,7 +2693,6 @@ bool SwFEShell::GetObjAttr( SfxItemSet &rSet ) const { SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); - // --> make code robust OSL_ENSURE( pContact, "<SwFEShell::GetObjAttr(..)> - missing <pContact>." ); if ( pContact ) { @@ -2711,8 +2722,8 @@ void SwFEShell::SetObjAttr( const SfxItemSet& rSet ) for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i ) { SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj(); - SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); - GetDoc()->SetAttr( rSet, *pContact->GetFormat() ); + if (SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj))) + GetDoc()->SetAttr( rSet, *pContact->GetFormat() ); } EndUndo( SwUndoId::INSATTR ); diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx index 5a9e1245afd8..fe01bbc3b395 100644 --- a/sw/source/core/layout/anchoreddrawobject.cxx +++ b/sw/source/core/layout/anchoreddrawobject.cxx @@ -266,6 +266,8 @@ void SwAnchoredDrawObject::MakeObjPos() SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(::GetUserCall( GetDrawObj() )); + if (!pDrawContact) + return; // --> #i28749# - if anchored drawing object hasn't been yet // positioned, convert its positioning attributes, if its positioning @@ -849,6 +851,8 @@ void SwAnchoredDrawObject::SetPositioningAttr() { SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(GetUserCall( GetDrawObj() )); + if (!pDrawContact) + return; SwFrameFormat* pObjFormat = GetFrameFormat(); if ( !pDrawContact->ObjAnchoredAsChar() ) diff --git a/sw/source/core/layout/anchoredobject.cxx b/sw/source/core/layout/anchoredobject.cxx index a74438afb361..43c5baa396c5 100644 --- a/sw/source/core/layout/anchoredobject.cxx +++ b/sw/source/core/layout/anchoredobject.cxx @@ -44,10 +44,13 @@ SwObjPositioningInProgress::SwObjPositioningInProgress( SdrObject& _rSdrObj ) : // --> #i52904# mbOldObjPositioningInProgress( false ) { - mpAnchoredObj = ::GetUserCall( &_rSdrObj )->GetAnchoredObj( &_rSdrObj ); - // --> #i52904# - mbOldObjPositioningInProgress = mpAnchoredObj->IsPositioningInProgress(); - mpAnchoredObj->SetPositioningInProgress( true ); + if (SwContact* pContact = ::GetUserCall( &_rSdrObj )) + { + mpAnchoredObj = pContact->GetAnchoredObj( &_rSdrObj ); + // --> #i52904# + mbOldObjPositioningInProgress = mpAnchoredObj->IsPositioningInProgress(); + mpAnchoredObj->SetPositioningInProgress( true ); + } } SwObjPositioningInProgress::SwObjPositioningInProgress( SwAnchoredObject& _rAnchoredObj ) : mpAnchoredObj( &_rAnchoredObj ), diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx index db50a42de053..b454bd95917f 100644 --- a/sw/source/core/layout/fly.cxx +++ b/sw/source/core/layout/fly.cxx @@ -2528,8 +2528,8 @@ void SwFrame::AppendDrawObj( SwAnchoredObject& _rNewObj ) assert(!m_pDrawObjs || m_pDrawObjs->is_sorted()); // perform disconnect from layout, if 'master' drawing object is appended // to a new frame. - static_cast<SwDrawContact*>(::GetUserCall( _rNewObj.GetDrawObj() ))-> - DisconnectFromLayout( false ); + if (SwDrawContact* pContact = static_cast<SwDrawContact*>(::GetUserCall( _rNewObj.GetDrawObj() ))) + pContact->DisconnectFromLayout( false ); assert(!m_pDrawObjs || m_pDrawObjs->is_sorted()); } diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx index 7ac95d65e0d8..b0ef08a01f75 100644 --- a/sw/source/core/layout/flylay.cxx +++ b/sw/source/core/layout/flylay.cxx @@ -1430,27 +1430,30 @@ bool CalcClipRect( const SdrObject *pSdrObj, SwRect &rRect, bool bMove ) } tools::Long nHeight = (9*aRectFnSet.GetHeight(rRect))/10; tools::Long nTop; - const SwFormat *pFormat = GetUserCall(pSdrObj)->GetFormat(); - const SvxULSpaceItem &rUL = pFormat->GetULSpace(); - if( bMove ) + if (const SwContact* pContact = ::GetUserCall( pSdrObj )) { - nTop = aRectFnSet.IsVert() ? static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().X() : - static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().Y(); - nTop = aRectFnSet.YInc( nTop, -nHeight ); - tools::Long nWidth = aRectFnSet.GetWidth(pFly->getFrameArea()); - aRectFnSet.SetLeftAndWidth( rRect, aRectFnSet.IsVert() ? - static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().Y() : - static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().X(), nWidth ); - nHeight = 2*nHeight - rUL.GetLower() - rUL.GetUpper(); - } - else - { - nTop = aRectFnSet.YInc( aRectFnSet.GetBottom(pFly->getFrameArea()), - rUL.GetLower() - nHeight ); - nHeight = 2*nHeight - aRectFnSet.GetHeight(pFly->getFrameArea()) - - rUL.GetLower() - rUL.GetUpper(); + const SwFormat *pFormat = pContact->GetFormat(); + const SvxULSpaceItem &rUL = pFormat->GetULSpace(); + if( bMove ) + { + nTop = aRectFnSet.IsVert() ? static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().X() : + static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().Y(); + nTop = aRectFnSet.YInc( nTop, -nHeight ); + tools::Long nWidth = aRectFnSet.GetWidth(pFly->getFrameArea()); + aRectFnSet.SetLeftAndWidth( rRect, aRectFnSet.IsVert() ? + static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().Y() : + static_cast<const SwFlyInContentFrame*>(pFly)->GetRefPoint().X(), nWidth ); + nHeight = 2*nHeight - rUL.GetLower() - rUL.GetUpper(); + } + else + { + nTop = aRectFnSet.YInc( aRectFnSet.GetBottom(pFly->getFrameArea()), + rUL.GetLower() - nHeight ); + nHeight = 2*nHeight - aRectFnSet.GetHeight(pFly->getFrameArea()) + - rUL.GetLower() - rUL.GetUpper(); + } + aRectFnSet.SetTopAndHeight( rRect, nTop, nHeight ); } - aRectFnSet.SetTopAndHeight( rRect, nTop, nHeight ); } } else diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx index baf632d6ebff..38667bd5c428 100644 --- a/sw/source/core/layout/frmtool.cxx +++ b/sw/source/core/layout/frmtool.cxx @@ -297,6 +297,8 @@ void SwFrameNotify::ImplDestroy() bool bNotify = false; bool bNotifySize = false; SwContact* pContact = ::GetUserCall( pObj->GetDrawObj() ); + if (!pContact) + continue; const bool bAnchoredAsChar = pContact->ObjAnchoredAsChar(); if ( !bAnchoredAsChar ) { @@ -1067,22 +1069,23 @@ void AppendObj(SwFrame *const pFrame, SwPageFrame *const pPage, SwFrameFormat *c InsertObject(pSdrObj, pSdrObj->GetOrdNumDirect()); } - SwDrawContact* pNew = - static_cast<SwDrawContact*>(GetUserCall( pSdrObj )); - if ( !pNew->GetAnchorFrame() ) - { - pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( nullptr )) ); - } - // OD 19.06.2003 #108784# - add 'virtual' drawing object, - // if necessary. But control objects have to be excluded. - else if ( !::CheckControlLayer( pSdrObj ) && - pNew->GetAnchorFrame() != pFrame && - !pNew->GetDrawObjectByAnchorFrame( *pFrame ) ) + if (SwDrawContact* pNew = static_cast<SwDrawContact*>(GetUserCall( pSdrObj ))) { - SwDrawVirtObj* pDrawVirtObj = pNew->AddVirtObj(*pFrame); - pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( pDrawVirtObj )) ); + if ( !pNew->GetAnchorFrame() ) + { + pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( nullptr )) ); + } + // OD 19.06.2003 #108784# - add 'virtual' drawing object, + // if necessary. But control objects have to be excluded. + else if ( !::CheckControlLayer( pSdrObj ) && + pNew->GetAnchorFrame() != pFrame && + !pNew->GetDrawObjectByAnchorFrame( *pFrame ) ) + { + SwDrawVirtObj* pDrawVirtObj = pNew->AddVirtObj(*pFrame); + pFrame->AppendDrawObj( *(pNew->GetAnchoredObj( pDrawVirtObj )) ); - pDrawVirtObj->ActionChanged(); + pDrawVirtObj->ActionChanged(); + } } } else @@ -3598,8 +3601,13 @@ bool Is_Lower_Of(const SwFrame *pCurrFrame, const SdrObject* pObj) } else { - pFrame = static_cast<SwDrawContact*>(GetUserCall(pObj))->GetAnchorFrame(pObj); - aPos = pObj->GetCurrentBoundRect().TopLeft(); + if (SwDrawContact* pC = static_cast<SwDrawContact*>(GetUserCall(pObj))) + { + pFrame = pC->GetAnchorFrame(pObj); + aPos = pObj->GetCurrentBoundRect().TopLeft(); + } + else + return false; } OSL_ENSURE( pFrame, "8-( Fly is lost in Space." ); pFrame = GetVirtualUpper( pFrame, aPos ); diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx index 6aad283273fc..2575c9827886 100644 --- a/sw/source/core/layout/pagechg.cxx +++ b/sw/source/core/layout/pagechg.cxx @@ -446,22 +446,21 @@ static void lcl_MakeObjs(const sw::FrameFormats<sw::SpzFrameFormat*>& rSpzs, SwP if ( bSdrObj ) { // OD 23.06.2003 #108784# - consider 'virtual' drawing objects - SwDrawContact *pContact = - static_cast<SwDrawContact*>(::GetUserCall(pSdrObj)); - if ( auto pDrawVirtObj = dynamic_cast<SwDrawVirtObj *>( pSdrObj ) ) + if (SwDrawContact *pContact = + static_cast<SwDrawContact*>(::GetUserCall(pSdrObj))) { - if ( pContact ) + if ( auto pDrawVirtObj = dynamic_cast<SwDrawVirtObj *>( pSdrObj ) ) { pDrawVirtObj->RemoveFromWriterLayout(); pDrawVirtObj->RemoveFromDrawingPage(); pPg->AppendDrawObj( *(pContact->GetAnchoredObj( pDrawVirtObj )) ); } - } - else - { - if ( pContact->GetAnchorFrame() ) - pContact->DisconnectFromLayout( false ); - pPg->AppendDrawObj( *(pContact->GetAnchoredObj( pSdrObj )) ); + else + { + if ( pContact->GetAnchorFrame() ) + pContact->DisconnectFromLayout( false ); + pPg->AppendDrawObj( *(pContact->GetAnchoredObj( pSdrObj )) ); + } } } else diff --git a/sw/source/core/layout/trvlfrm.cxx b/sw/source/core/layout/trvlfrm.cxx index 89a5f03302ac..0e3d13570678 100644 --- a/sw/source/core/layout/trvlfrm.cxx +++ b/sw/source/core/layout/trvlfrm.cxx @@ -70,26 +70,29 @@ namespace { { const SwVirtFlyDrawObj* pObj = static_cast<const SwVirtFlyDrawObj*>(aIter()); - const SwAnchoredObject* pAnchoredObj = GetUserCall( aIter() )->GetAnchoredObj( aIter() ); - const SwFrameFormat* pObjFormat = pAnchoredObj->GetFrameFormat(); - const SwFormatSurround& rSurround = pObjFormat->GetSurround(); - const SvxOpaqueItem& rOpaque = pObjFormat->GetOpaque(); - bool bInBackground = ( rSurround.GetSurround() == css::text::WrapTextMode_THROUGH ) && !rOpaque.GetValue(); - - bool bBackgroundMatches = bInBackground == bSearchBackground; - - const SwFlyFrame* pFly = pObj ? pObj->GetFlyFrame() : nullptr; - if ( pFly && bBackgroundMatches && - ( ( pCMS && pCMS->m_bSetInReadOnly ) || - !pFly->IsProtected() ) && - pFly->GetModelPositionForViewPoint( pPos, aPoint, pCMS ) ) + if (const SwContact* pContact = ::GetUserCall( aIter() )) { - bRet = true; - break; - } + const SwAnchoredObject* pAnchoredObj = pContact->GetAnchoredObj( aIter() ); + const SwFrameFormat* pObjFormat = pAnchoredObj->GetFrameFormat(); + const SwFormatSurround& rSurround = pObjFormat->GetSurround(); + const SvxOpaqueItem& rOpaque = pObjFormat->GetOpaque(); + bool bInBackground = ( rSurround.GetSurround() == css::text::WrapTextMode_THROUGH ) && !rOpaque.GetValue(); + + bool bBackgroundMatches = bInBackground == bSearchBackground; + + const SwFlyFrame* pFly = pObj ? pObj->GetFlyFrame() : nullptr; + if ( pFly && bBackgroundMatches && + ( ( pCMS && pCMS->m_bSetInReadOnly ) || + !pFly->IsProtected() ) && + pFly->GetModelPositionForViewPoint( pPos, aPoint, pCMS ) ) + { + bRet = true; + break; + } - if ( pCMS && pCMS->m_bStop ) - return false; + if ( pCMS && pCMS->m_bStop ) + return false; + } aIter.Prev(); } return bRet; diff --git a/sw/source/core/txtnode/atrflyin.cxx b/sw/source/core/txtnode/atrflyin.cxx index 28eb7b38e530..fbefb76fa851 100644 --- a/sw/source/core/txtnode/atrflyin.cxx +++ b/sw/source/core/txtnode/atrflyin.cxx @@ -197,7 +197,8 @@ void SwTextFlyCnt::SetAnchor( const SwTextNode *pNode ) { if (SdrObject const*const pObj = pFormat->FindSdrObject()) { // tdf#123259 disconnect with *old* anchor position - static_cast<SwDrawContact*>(::GetUserCall(pObj))->DisconnectFromLayout(false); + if (SwDrawContact* pContact = static_cast<SwDrawContact*>(::GetUserCall( pObj ))) + pContact->DisconnectFromLayout(false); } } pFormat->SetFormatAttr( aAnchor ); // only set the anchor diff --git a/sw/source/core/undo/undraw.cxx b/sw/source/core/undo/undraw.cxx index 134c6862971e..73a58a0f52e5 100644 --- a/sw/source/core/undo/undraw.cxx +++ b/sw/source/core/undo/undraw.cxx @@ -274,6 +274,8 @@ void SwUndoDrawGroup::RedoImpl(::sw::UndoRedoContext &) SdrObject* pObj = rSave.pObj; SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + continue; // Save the textboxes if (auto pOldTextBoxNode = rSave.pFormat->GetOtherTextBoxFormats()) @@ -350,23 +352,25 @@ SwUndoDrawUnGroup::SwUndoDrawUnGroup( SdrObjGroup* pObj, const SwDoc& rDoc ) m_nSize = o3tl::narrowing<sal_uInt16>(pObj->GetSubList()->GetObjCount()) + 1; m_pObjArray.reset( new SwUndoGroupObjImpl[ m_nSize ] ); - SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); - SwDrawFrameFormat* pFormat = static_cast<SwDrawFrameFormat*>(pContact->GetFormat()); + if (SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj))) + { + SwDrawFrameFormat* pFormat = static_cast<SwDrawFrameFormat*>(pContact->GetFormat()); - m_pObjArray[0].pObj = pObj; - m_pObjArray[0].pFormat = pFormat; + m_pObjArray[0].pObj = pObj; + m_pObjArray[0].pFormat = pFormat; - // object will destroy itself - pContact->Changed( *pObj, SdrUserCallType::Delete, pObj->GetLastBoundRect() ); - pObj->SetUserCall( nullptr ); + // object will destroy itself + pContact->Changed( *pObj, SdrUserCallType::Delete, pObj->GetLastBoundRect() ); + pObj->SetUserCall( nullptr ); - ::lcl_SaveAnchor( pFormat, m_pObjArray[0].nNodeIdx ); + ::lcl_SaveAnchor( pFormat, m_pObjArray[0].nNodeIdx ); - pFormat->RemoveAllUnos(); + pFormat->RemoveAllUnos(); - // remove from array - sw::SpzFrameFormats& rFlyFormats = *pFormat->GetDoc()->GetSpzFrameFormats(); - rFlyFormats.erase( std::find( rFlyFormats.begin(), rFlyFormats.end(), pFormat )); + // remove from array + sw::SpzFrameFormats& rFlyFormats = *pFormat->GetDoc()->GetSpzFrameFormats(); + rFlyFormats.erase( std::find( rFlyFormats.begin(), rFlyFormats.end(), pFormat )); + } } SwUndoDrawUnGroup::~SwUndoDrawUnGroup() @@ -622,6 +626,9 @@ void SwUndoDrawDelete::RedoImpl(::sw::UndoRedoContext & rContext) SwUndoGroupObjImpl& rSave = m_pObjArray[n]; SdrObject *pObj = rSave.pObj; SwDrawContact *pContact = static_cast<SwDrawContact*>(GetUserCall(pObj)); + if (!pContact) + continue; + SwDrawFrameFormat *pFormat = static_cast<SwDrawFrameFormat*>(pContact->GetFormat()); // object will destroy itself