From 71f9ab6537e09a1d893c31dc3fe0f6c5618aa9dd Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Tue, 3 Nov 2020 16:53:55 +0000 Subject: ofz#26943 detect if FormatOfJustInsertedApo was deleted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit move FrameDeleteWatch for reuse in the doc filter Change-Id: I6e53549a837968cb738b5188e8670dd3e38a9c0e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105264 Tested-by: Jenkins Reviewed-by: Caolán McNamara (cherry picked from commit 2a7a62c09582ec24247022a94e929610d141a4c9) --- sw/source/filter/basflt/fltshell.cxx | 27 +++++++++++++++++++++++++++ sw/source/filter/html/htmltab.cxx | 35 ----------------------------------- sw/source/filter/inc/fltshell.hxx | 22 ++++++++++++++++++++++ sw/source/filter/ww8/ww8par.cxx | 3 +-- sw/source/filter/ww8/ww8par.hxx | 2 +- sw/source/filter/ww8/ww8par2.cxx | 12 +++++++----- sw/source/filter/ww8/ww8par6.cxx | 2 +- 7 files changed, 59 insertions(+), 44 deletions(-) diff --git a/sw/source/filter/basflt/fltshell.cxx b/sw/source/filter/basflt/fltshell.cxx index e6e0517a0489..5daa1310d810 100644 --- a/sw/source/filter/basflt/fltshell.cxx +++ b/sw/source/filter/basflt/fltshell.cxx @@ -1126,4 +1126,31 @@ void UpdatePageDescs(SwDoc &rDoc, size_t nInPageDescOffset) rDoc.ChgPageDesc(i, rDoc.GetPageDesc(i)); } +FrameDeleteWatch::FrameDeleteWatch(SwFrameFormat* pFormat) + : m_pFormat(pFormat) +{ + if(m_pFormat) + StartListening(pFormat->GetNotifier()); +} + +void FrameDeleteWatch::Notify(const SfxHint& rHint) +{ + bool bDying = false; + if (rHint.GetId() == SfxHintId::Dying) + bDying = true; + else if (auto pDrawFrameFormatHint = dynamic_cast(&rHint)) + bDying = pDrawFrameFormatHint->m_eId == sw::DrawFrameFormatHintId::DYING; + if (bDying) + { + m_pFormat = nullptr; + EndListeningAll(); + } +} + +FrameDeleteWatch::~FrameDeleteWatch() +{ + m_pFormat = nullptr; + EndListeningAll(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/html/htmltab.cxx b/sw/source/filter/html/htmltab.cxx index 0d659d7dfd65..ce689df01b9d 100644 --- a/sw/source/filter/html/htmltab.cxx +++ b/sw/source/filter/html/htmltab.cxx @@ -4860,41 +4860,6 @@ HTMLTableOptions::HTMLTableOptions( const HTMLOptions& rOptions, namespace { - class FrameDeleteWatch final: public SvtListener - { - SwFrameFormat* m_pFormat; - public: - FrameDeleteWatch(SwFrameFormat* pFormat) - : m_pFormat(pFormat) - { - if(m_pFormat) - StartListening(pFormat->GetNotifier()); - } - - virtual void Notify(const SfxHint& rHint) override - { - if (auto pDrawFrameFormatHint = dynamic_cast(&rHint)) - { - if (pDrawFrameFormatHint->m_eId == sw::DrawFrameFormatHintId::DYING) - { - m_pFormat = nullptr; - EndListeningAll(); - } - } - } - - bool WasDeleted() const - { - return !m_pFormat; - } - - virtual ~FrameDeleteWatch() override - { - m_pFormat = nullptr; - EndListeningAll(); - } - }; - class IndexInRange { private: diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx index 2f8450556d39..1e6bf6c8a735 100644 --- a/sw/source/filter/inc/fltshell.hxx +++ b/sw/source/filter/inc/fltshell.hxx @@ -330,6 +330,28 @@ public: } }; +// detect if the SwFrameFormat it is watching was deleted +class SW_DLLPUBLIC FrameDeleteWatch final: public SvtListener +{ + SwFrameFormat* m_pFormat; +public: + FrameDeleteWatch(SwFrameFormat* pFormat); + + virtual void Notify(const SfxHint& rHint) override; + + SwFrameFormat* GetFormat() + { + return m_pFormat; + } + + bool WasDeleted() const + { + return !m_pFormat; + } + + virtual ~FrameDeleteWatch() override; +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 44812a67ad1f..f5bdacffe32d 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -2170,7 +2170,7 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) std::unique_ptr pOutliner = ImportAsOutliner( sText, pRes->nCp2OrIdx, pRes->nCp2OrIdx + pRes->nMemLen, MAN_AND ); - m_pFormatOfJustInsertedApo = nullptr; + m_xFormatOfJustInsertedApo.reset(); SwPostItField aPostIt( static_cast(m_rDoc.getIDocumentFieldsAccess().GetSysFieldType(SwFieldIds::Postit)), sAuthor, sText, sInitials, OUString(), aDate ); @@ -4260,7 +4260,6 @@ SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SotStorage* pStorage, , m_aParaStyleMapper(rD) , m_aCharStyleMapper(rD) , m_pFlyFormatOfJustInsertedGraphic(nullptr) - , m_pFormatOfJustInsertedApo(nullptr) , m_pPreviousNumPaM(nullptr) , m_pPrevNumRule(nullptr) , m_aTextNodesHavingFirstLineOfstSet() diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 61e30e6618ed..74953aa2016c 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1196,7 +1196,7 @@ private: std::unique_ptr m_xFormImpl; // implementation of control SwFlyFrameFormat* m_pFlyFormatOfJustInsertedGraphic; - SwFrameFormat* m_pFormatOfJustInsertedApo; + std::unique_ptr m_xFormatOfJustInsertedApo; SwPaM* m_pPreviousNumPaM; const SwNumRule* m_pPrevNumRule; diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx index f0a12ad3005e..6edc842e48ee 100644 --- a/sw/source/filter/ww8/ww8par2.cxx +++ b/sw/source/filter/ww8/ww8par2.cxx @@ -2399,18 +2399,20 @@ void WW8TabDesc::CreateSwTable() Set fly anchor to its anchor pos, so that if a table starts immediately at this position a new node will be inserted before inserting the table. */ - if (!bInsNode && m_pIo->m_pFormatOfJustInsertedApo) + SwFrameFormat* pFormat = (!bInsNode && m_pIo->m_xFormatOfJustInsertedApo) + ? m_pIo->m_xFormatOfJustInsertedApo->GetFormat() : nullptr; + if (pFormat) { const SwPosition* pAPos = - m_pIo->m_pFormatOfJustInsertedApo->GetAnchor().GetContentAnchor(); + pFormat->GetAnchor().GetContentAnchor(); if (pAPos && &pAPos->nNode.GetNode() == &pPoint->nNode.GetNode()) { bInsNode = true; bSetMinHeight = true; - SwFormatSurround aSur(m_pIo->m_pFormatOfJustInsertedApo->GetSurround()); + SwFormatSurround aSur(pFormat->GetSurround()); aSur.SetAnchorOnly(true); - m_pIo->m_pFormatOfJustInsertedApo->SetFormatAttr(aSur); + pFormat->SetFormatAttr(aSur); } } @@ -2797,7 +2799,7 @@ void WW8TabDesc::FinishSwTable() } } } - m_pIo->m_pFormatOfJustInsertedApo = nullptr; + m_pIo->m_xFormatOfJustInsertedApo.reset(); m_MergeGroups.clear(); } } diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index 499fdc8e223e..1e68d7a592b4 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -2716,7 +2716,7 @@ void SwWW8ImplReader::StopApo() //#i8062# if (m_xSFlyPara && m_xSFlyPara->pFlyFormat) - m_pFormatOfJustInsertedApo = m_xSFlyPara->pFlyFormat; + m_xFormatOfJustInsertedApo.reset(new FrameDeleteWatch(m_xSFlyPara->pFlyFormat)); m_xSFlyPara.reset(); m_xWFlyPara.reset(); -- cgit