diff options
-rw-r--r-- | sw/inc/frmfmt.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/undo/undobj1.cxx | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx index 2dd3c81a52f8..6c2de6c35e20 100644 --- a/sw/inc/frmfmt.hxx +++ b/sw/inc/frmfmt.hxx @@ -61,6 +61,7 @@ class SW_DLLPUBLIC SwFrameFormat: public SwFormat friend class ::sw::DocumentLayoutManager; ///< Is allowed to call protected CTor. friend class SwFrameFormats; ///< Is allowed to update the list backref. friend class SwTextBoxHelper; + friend class SwUndoFlyBase; ///< calls SetOtherTextBoxFormat css::uno::WeakReference<css::uno::XInterface> m_wXObject; diff --git a/sw/source/core/undo/undobj1.cxx b/sw/source/core/undo/undobj1.cxx index d35f7730cf9e..8011e77dd031 100644 --- a/sw/source/core/undo/undobj1.cxx +++ b/sw/source/core/undo/undobj1.cxx @@ -52,7 +52,13 @@ SwUndoFlyBase::SwUndoFlyBase( SwFrameFormat* pFormat, SwUndoId nUndoId ) SwUndoFlyBase::~SwUndoFlyBase() { if( bDelFormat ) // delete during an Undo? + { + if (pFrameFormat->GetOtherTextBoxFormat()) + { // clear that before delete + pFrameFormat->SetOtherTextBoxFormat(nullptr); + } delete pFrameFormat; + } } void SwUndoFlyBase::InsFly(::sw::UndoRedoContext & rContext, bool bShowSelFrame) @@ -107,6 +113,13 @@ void SwUndoFlyBase::InsFly(::sw::UndoRedoContext & rContext, bool bShowSelFrame) pCNd->GetTextNode()->InsertItem(aFormat, nCntPos, nCntPos, SetAttrMode::NOHINTEXPAND); } + if (pFrameFormat->GetOtherTextBoxFormat()) + { + // recklessly assume that this thing will live longer than the + // SwUndoFlyBase - not sure what could be done if that isn't the case... + pFrameFormat->GetOtherTextBoxFormat()->SetOtherTextBoxFormat(pFrameFormat); + } + pFrameFormat->MakeFrames(); if( bShowSelFrame ) @@ -146,6 +159,11 @@ void SwUndoFlyBase::DelFly( SwDoc* pDoc ) bDelFormat = true; // delete Format in DTOR pFrameFormat->DelFrames(); // destroy Frames + if (pFrameFormat->GetOtherTextBoxFormat()) + { // tdf#108867 clear that pointer + pFrameFormat->GetOtherTextBoxFormat()->SetOtherTextBoxFormat(nullptr); + } + // all Uno objects should now log themselves off { SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT, pFrameFormat ); |