From 439f17c5cf43b38092b1b834bb006420220262e1 Mon Sep 17 00:00:00 2001 From: Bjoern Michaelsen Date: Thu, 10 May 2018 10:51:42 +0200 Subject: dont use SwClient/SwModify in unocore: HeadFootText MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Icf0fa7ec07c8c52981c50bc03a34ae0fa9683fcf Reviewed-on: https://gerrit.libreoffice.org/54184 Tested-by: Jenkins Reviewed-by: Björn Michaelsen --- sw/inc/calbck.hxx | 4 + sw/inc/frmfmt.hxx | 4 +- sw/inc/section.hxx | 1 - sw/inc/unotextbodyhf.hxx | 1 - sw/source/core/layout/atrfrm.cxx | 2 +- sw/source/core/unocore/unotext.cxx | 183 ++++++++++++++++--------------------- 6 files changed, 86 insertions(+), 109 deletions(-) diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx index f5748d50a728..913a7f6e173e 100644 --- a/sw/inc/calbck.hxx +++ b/sw/inc/calbck.hxx @@ -83,6 +83,10 @@ namespace sw class SW_DLLPUBLIC BroadcasterMixin { SvtBroadcaster m_aNotifier; public: + BroadcasterMixin& operator=(const BroadcasterMixin&) + { + return *this; // Listeners are never copied or moved. + } SvtBroadcaster& GetNotifier() { return m_aNotifier; } }; /// refactoring out the some of the more sane SwClient functionality diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx index 787988467407..a8f61f3cf17a 100644 --- a/sw/inc/frmfmt.hxx +++ b/sw/inc/frmfmt.hxx @@ -53,7 +53,9 @@ namespace sw class SwFrameFormats; /// Style of a layout element. -class SW_DLLPUBLIC SwFrameFormat: public SwFormat +class SW_DLLPUBLIC SwFrameFormat + : public SwFormat + , public sw::BroadcasterMixin { friend class SwDoc; friend class SwPageDesc; ///< Is allowed to call protected CTor. diff --git a/sw/inc/section.hxx b/sw/inc/section.hxx index eb4cc6913f38..30b582b89a80 100644 --- a/sw/inc/section.hxx +++ b/sw/inc/section.hxx @@ -270,7 +270,6 @@ enum class SectionSort { Not, Pos }; class SW_DLLPUBLIC SwSectionFormat : public SwFrameFormat , public ::sfx2::Metadatable - , public sw::BroadcasterMixin { friend class SwDoc; diff --git a/sw/inc/unotextbodyhf.hxx b/sw/inc/unotextbodyhf.hxx index 11aa3cbf794f..439d434dade0 100644 --- a/sw/inc/unotextbodyhf.hxx +++ b/sw/inc/unotextbodyhf.hxx @@ -116,7 +116,6 @@ public: static css::uno::Reference< css::text::XText > CreateXHeadFootText(SwFrameFormat & rHeadFootFormat, const bool bIsHeader); - static bool IsXHeadFootText(SwClient const *const pClient); // XInterface virtual css::uno::Any SAL_CALL queryInterface( diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx index bcc42a8b06f8..7f4d27ad6e1c 100644 --- a/sw/source/core/layout/atrfrm.cxx +++ b/sw/source/core/layout/atrfrm.cxx @@ -121,7 +121,7 @@ static void lcl_DelHFFormat( SwClient *pToRemove, SwFrameFormat *pFormat ) // It's suboptimal if the format is deleted beforehand. SwIterator aIter(*pFormat); for(SwClient* pLast = aIter.First(); bDel && pLast; pLast = aIter.Next()) - if (dynamic_cast(pLast) == nullptr && !SwXHeadFootText::IsXHeadFootText(pLast)) + if (dynamic_cast(pLast) == nullptr) bDel = false; } diff --git a/sw/source/core/unocore/unotext.cxx b/sw/source/core/unocore/unotext.cxx index 6d01370e5d19..5d9bde6d73a7 100644 --- a/sw/source/core/unocore/unotext.cxx +++ b/sw/source/core/unocore/unotext.cxx @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -2453,108 +2454,90 @@ SwXBodyText::hasElements() } class SwXHeadFootText::Impl - : public SwClient + : public SvtListener { + public: + SwFrameFormat* m_pHeadFootFormat; + bool m_bIsHeader; -public: - - bool m_bIsHeader; - - Impl( SwFrameFormat & rHeadFootFormat, const bool bIsHeader) - : SwClient(& rHeadFootFormat) - , m_bIsHeader(bIsHeader) - { - } - - SwFrameFormat * GetHeadFootFormat() const { - return static_cast( - const_cast(GetRegisteredIn())); - } + Impl(SwFrameFormat& rHeadFootFormat, const bool bIsHeader) + : m_pHeadFootFormat(&rHeadFootFormat) + , m_bIsHeader(bIsHeader) + { + if(m_pHeadFootFormat) + StartListening(m_pHeadFootFormat->GetNotifier()); + } - SwFrameFormat & GetHeadFootFormatOrThrow() { - SwFrameFormat *const pFormat( GetHeadFootFormat() ); - if (!pFormat) { - throw uno::RuntimeException("SwXHeadFootText: disposed or invalid", nullptr); + SwFrameFormat* GetHeadFootFormat() const { + return m_pHeadFootFormat; } - return *pFormat; - } -protected: - // SwClient - virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew) override; + SwFrameFormat& GetHeadFootFormatOrThrow() { + if (!m_pHeadFootFormat) { + throw uno::RuntimeException("SwXHeadFootText: disposed or invalid", nullptr); + } + return *m_pHeadFootFormat; + } + protected: + virtual void Notify(const SfxHint& rHint) override + { + if(rHint.GetId() == SfxHintId::Dying) + m_pHeadFootFormat = nullptr; + } }; -void SwXHeadFootText::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) -{ - ClientModify(this, pOld, pNew); -} - -bool SwXHeadFootText::IsXHeadFootText(SwClient const *const pClient) -{ - return dynamic_cast(pClient) != nullptr; -} - -uno::Reference< text::XText > -SwXHeadFootText::CreateXHeadFootText( - SwFrameFormat & rHeadFootFormat, const bool bIsHeader) +uno::Reference SwXHeadFootText::CreateXHeadFootText( + SwFrameFormat& rHeadFootFormat, + const bool bIsHeader) { // re-use existing SwXHeadFootText // #i105557#: do not iterate over the registered clients: race condition - uno::Reference< text::XText > xText(rHeadFootFormat.GetXObject(), - uno::UNO_QUERY); - if (!xText.is()) + uno::Reference xText(rHeadFootFormat.GetXObject(), uno::UNO_QUERY); + if(!xText.is()) { - SwXHeadFootText *const pXHFT( - new SwXHeadFootText(rHeadFootFormat, bIsHeader)); + const auto pXHFT(new SwXHeadFootText(rHeadFootFormat, bIsHeader)); xText.set(pXHFT); rHeadFootFormat.SetXObject(xText); } return xText; } -SwXHeadFootText::SwXHeadFootText(SwFrameFormat & rHeadFootFormat, const bool bIsHeader) - : SwXText(rHeadFootFormat.GetDoc(), +SwXHeadFootText::SwXHeadFootText(SwFrameFormat& rHeadFootFormat, const bool bIsHeader) + : SwXText( + rHeadFootFormat.GetDoc(), bIsHeader ? CursorType::Header : CursorType::Footer) - , m_pImpl( new SwXHeadFootText::Impl(rHeadFootFormat, bIsHeader) ) + , m_pImpl(new SwXHeadFootText::Impl(rHeadFootFormat, bIsHeader)) { } SwXHeadFootText::~SwXHeadFootText() -{ -} +{ } OUString SAL_CALL SwXHeadFootText::getImplementationName() { - return OUString("SwXHeadFootText"); + return {"SwXHeadFootText"}; } -static char const*const g_ServicesHeadFootText[] = -{ - "com.sun.star.text.Text", -}; - sal_Bool SAL_CALL SwXHeadFootText::supportsService(const OUString& rServiceName) { return cppu::supportsService(this, rServiceName); } -uno::Sequence< OUString > SAL_CALL +uno::Sequence SAL_CALL SwXHeadFootText::getSupportedServiceNames() { - return ::sw::GetSupportedServiceNamesImpl( - SAL_N_ELEMENTS(g_ServicesHeadFootText), - g_ServicesHeadFootText); + return {"com.sun.star.text.Text"}; } -const SwStartNode *SwXHeadFootText::GetStartNode() const +const SwStartNode* SwXHeadFootText::GetStartNode() const { - const SwStartNode *pSttNd = nullptr; - SwFrameFormat *const pHeadFootFormat = m_pImpl->GetHeadFootFormat(); + const SwStartNode* pSttNd = nullptr; + SwFrameFormat* const pHeadFootFormat = m_pImpl->GetHeadFootFormat(); if(pHeadFootFormat) { const SwFormatContent& rFlyContent = pHeadFootFormat->GetContent(); - if( rFlyContent.GetContentIdx() ) + if(rFlyContent.GetContentIdx()) { pSttNd = rFlyContent.GetContentIdx()->GetNode().GetStartNode(); } @@ -2562,43 +2545,38 @@ const SwStartNode *SwXHeadFootText::GetStartNode() const return pSttNd; } -uno::Reference< text::XTextCursor > -SwXHeadFootText::CreateCursor() +uno::Reference SwXHeadFootText::CreateCursor() { return createTextCursor(); } -uno::Sequence< uno::Type > SAL_CALL -SwXHeadFootText::getTypes() +uno::Sequence SAL_CALL SwXHeadFootText::getTypes() { - const uno::Sequence< uno::Type > aTypes = SwXHeadFootText_Base::getTypes(); - const uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes(); - return ::comphelper::concatSequences(aTypes, aTextTypes); + return ::comphelper::concatSequences( + SwXHeadFootText_Base::getTypes(), + SwXText::getTypes()); } -uno::Sequence< sal_Int8 > SAL_CALL -SwXHeadFootText::getImplementationId() +uno::Sequence SAL_CALL SwXHeadFootText::getImplementationId() { return css::uno::Sequence(); } -uno::Any SAL_CALL -SwXHeadFootText::queryInterface(const uno::Type& rType) +uno::Any SAL_CALL SwXHeadFootText::queryInterface(const uno::Type& rType) { const uno::Any ret = SwXHeadFootText_Base::queryInterface(rType); return (ret.getValueType() == cppu::UnoType::get()) - ? SwXText::queryInterface(rType) - : ret; + ? SwXText::queryInterface(rType) + : ret; } -uno::Reference< text::XTextCursor > SAL_CALL +uno::Reference SAL_CALL SwXHeadFootText::createTextCursor() { SolarMutexGuard aGuard; SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() ); - uno::Reference< text::XTextCursor > xRet; const SwFormatContent& rFlyContent = rHeadFootFormat.GetContent(); const SwNode& rNode = rFlyContent.GetContentIdx()->GetNode(); SwPosition aPos(rNode); @@ -2624,8 +2602,7 @@ SwXHeadFootText::createTextCursor() { rUnoCursor.GetPoint()->nContent.Assign(pCont, 0); } - SwStartNode const*const pNewStartNode = - rUnoCursor.GetNode().FindSttNodeByType( + SwStartNode const*const pNewStartNode = rUnoCursor.GetNode().FindSttNodeByType( (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode); if (!pNewStartNode || (pNewStartNode != pOwnStartNode)) { @@ -2633,69 +2610,65 @@ SwXHeadFootText::createTextCursor() aExcept.Message = "no text available"; throw aExcept; } - xRet = static_cast(pXCursor); - return xRet; + return static_cast(pXCursor); } -uno::Reference< text::XTextCursor > SAL_CALL -SwXHeadFootText::createTextCursorByRange( - const uno::Reference< text::XTextRange > & xTextPosition) +uno::Reference SAL_CALL SwXHeadFootText::createTextCursorByRange( + const uno::Reference& xTextPosition) { SolarMutexGuard aGuard; - - SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() ); + SwFrameFormat& rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() ); SwUnoInternalPaM aPam(*GetDoc()); - if (!::sw::XTextRangeToSwPaM(aPam, xTextPosition)) + if (!sw::XTextRangeToSwPaM(aPam, xTextPosition)) { uno::RuntimeException aRuntime; aRuntime.Message = cInvalidObject; throw aRuntime; } - uno::Reference< text::XTextCursor > xRet; SwNode& rNode = rHeadFootFormat.GetContent().GetContentIdx()->GetNode(); SwPosition aPos(rNode); SwPaM aHFPam(aPos); aHFPam.Move(fnMoveForward, GoInNode); - SwStartNode *const pOwnStartNode = aHFPam.GetNode().FindSttNodeByType( + SwStartNode* const pOwnStartNode = aHFPam.GetNode().FindSttNodeByType( (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode); - SwStartNode *const p1 = aPam.GetNode().FindSttNodeByType( + SwStartNode* const p1 = aPam.GetNode().FindSttNodeByType( (m_pImpl->m_bIsHeader) ? SwHeaderStartNode : SwFooterStartNode); if (p1 == pOwnStartNode) { - xRet = static_cast( - new SwXTextCursor(*GetDoc(), this, + return static_cast( + new SwXTextCursor( + *GetDoc(), + this, (m_pImpl->m_bIsHeader) ? CursorType::Header : CursorType::Footer, *aPam.GetPoint(), aPam.GetMark())); } - return xRet; + return nullptr; } -uno::Reference< container::XEnumeration > SAL_CALL -SwXHeadFootText::createEnumeration() +uno::Reference SAL_CALL SwXHeadFootText::createEnumeration() { SolarMutexGuard aGuard; - - SwFrameFormat & rHeadFootFormat( m_pImpl->GetHeadFootFormatOrThrow() ); + SwFrameFormat& rHeadFootFormat(m_pImpl->GetHeadFootFormatOrThrow()); const SwFormatContent& rFlyContent = rHeadFootFormat.GetContent(); const SwNode& rNode = rFlyContent.GetContentIdx()->GetNode(); SwPosition aPos(rNode); auto pUnoCursor(GetDoc()->CreateUnoCursor(aPos)); pUnoCursor->Move(fnMoveForward, GoInNode); - return SwXParagraphEnumeration::Create(this, pUnoCursor, (m_pImpl->m_bIsHeader) ? CursorType::Header : CursorType::Footer); + return SwXParagraphEnumeration::Create( + this, + pUnoCursor, + (m_pImpl->m_bIsHeader) + ? CursorType::Header + : CursorType::Footer); } -uno::Type SAL_CALL -SwXHeadFootText::getElementType() -{ - return cppu::UnoType::get(); -} +uno::Type SAL_CALL SwXHeadFootText::getElementType() + { return cppu::UnoType::get(); } sal_Bool SAL_CALL SwXHeadFootText::hasElements() -{ - return true; -} + { return true; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit