sw/inc/ftninfo.hxx | 24 ++--- sw/source/core/doc/docftn.cxx | 161 ++++++++++++++++++++++--------------- sw/source/core/unocore/unosett.cxx | 24 ----- 3 files changed, 111 insertions(+), 98 deletions(-)
New commits: commit 1a3b2668d63d00b9ae004c8be883c8e4c0f8996c Author: Bjoern Michaelsen <bjoern.michael...@libreoffice.org> Date: Tue Mar 13 00:04:04 2018 +0100 use sw::WriterMultiListener instead of SwDepend in SwEndNoteInfo Change-Id: I9d313ee573728d4b593183b441a3be2062ecbf5c Reviewed-on: https://gerrit.libreoffice.org/51185 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Björn Michaelsen <bjoern.michael...@libreoffice.org> diff --git a/sw/inc/ftninfo.hxx b/sw/inc/ftninfo.hxx index 9a6982a81893..2af826afa02a 100644 --- a/sw/inc/ftninfo.hxx +++ b/sw/inc/ftninfo.hxx @@ -32,33 +32,35 @@ class SwDoc; class SW_DLLPUBLIC SwEndNoteInfo : public SwClient { - SwDepend aPageDescDep; - SwDepend aCharFormatDep, aAnchorCharFormatDep; + mutable sw::WriterMultiListener aDepends; + mutable SwTextFormatColl* pTextFormatColl; + mutable SwPageDesc* pPageDesc; + mutable SwCharFormat* pCharFormat; + mutable SwCharFormat* pAnchorFormat; OUString sPrefix; OUString sSuffix; protected: bool m_bEndNote; - virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) override; + virtual void SwClientNotify( const SwModify&, const SfxHint&) override; public: SvxNumberType aFormat; sal_uInt16 nFootnoteOffset; - void ChgPageDesc( SwPageDesc *pDesc ); - SwPageDesc* GetPageDesc( SwDoc &rDoc ) const; - bool KnowsPageDesc() const; - bool DependsOn( const SwPageDesc* ) const; + void ChgPageDesc(SwPageDesc* pDesc); + SwPageDesc* GetPageDesc(SwDoc& rDoc) const; + bool KnowsPageDesc() const; + bool DependsOn(const SwPageDesc*) const; void SetFootnoteTextColl(SwTextFormatColl& rColl); - SwTextFormatColl* GetFootnoteTextColl() const { return const_cast<SwTextFormatColl*>(static_cast<const SwTextFormatColl*>(GetRegisteredIn())); } // can be 0. + SwTextFormatColl* GetFootnoteTextColl() const { return pTextFormatColl; } // can be 0. SwCharFormat* GetCharFormat(SwDoc &rDoc) const; void SetCharFormat( SwCharFormat* ); - SwClient *GetCharFormatDep() const { return const_cast<SwClient*>(static_cast<SwClient const *>(&aCharFormatDep)); } SwCharFormat* GetAnchorCharFormat(SwDoc &rDoc) const; - void SetAnchorCharFormat( SwCharFormat* ); - SwClient *GetAnchorCharFormatDep() const { return const_cast<SwClient*>(static_cast<SwClient const *>(&aAnchorCharFormatDep)); } + void SetAnchorCharFormat(SwCharFormat*); + SwCharFormat* GetCurrentCharFormat(const bool bAnchor) const; SwEndNoteInfo & operator=(const SwEndNoteInfo&); bool operator==( const SwEndNoteInfo &rInf ) const; diff --git a/sw/source/core/doc/docftn.cxx b/sw/source/core/doc/docftn.cxx index 3ddfcf96c9ee..8f1c4e43ea1a 100644 --- a/sw/source/core/doc/docftn.cxx +++ b/sw/source/core/doc/docftn.cxx @@ -39,10 +39,15 @@ SwEndNoteInfo& SwEndNoteInfo::operator=(const SwEndNoteInfo& rInfo) { - StartListeningToSameModifyAs(rInfo); - aPageDescDep.StartListeningToSameModifyAs(rInfo.aPageDescDep); - aCharFormatDep.StartListeningToSameModifyAs(rInfo.aCharFormatDep); - aAnchorCharFormatDep.StartListeningToSameModifyAs(rInfo.aAnchorCharFormatDep); + pTextFormatColl = rInfo.pTextFormatColl; + pPageDesc = rInfo.pPageDesc; + pCharFormat = rInfo.pCharFormat; + pAnchorFormat = rInfo.pAnchorFormat; + aDepends.EndListeningAll(); + aDepends.StartListening(pTextFormatColl); + aDepends.StartListening(pPageDesc); + aDepends.StartListening(pCharFormat); + aDepends.StartListening(pAnchorFormat); aFormat = rInfo.aFormat; nFootnoteOffset = rInfo.nFootnoteOffset; @@ -54,13 +59,11 @@ SwEndNoteInfo& SwEndNoteInfo::operator=(const SwEndNoteInfo& rInfo) bool SwEndNoteInfo::operator==( const SwEndNoteInfo& rInfo ) const { - return aPageDescDep.GetRegisteredIn() == - rInfo.aPageDescDep.GetRegisteredIn() && - aCharFormatDep.GetRegisteredIn() == - rInfo.aCharFormatDep.GetRegisteredIn() && - aAnchorCharFormatDep.GetRegisteredIn() == - rInfo.aAnchorCharFormatDep.GetRegisteredIn() && - GetFootnoteTextColl() == rInfo.GetFootnoteTextColl() && + return + pTextFormatColl == rInfo.pTextFormatColl && + pPageDesc == rInfo.pPageDesc && + pCharFormat == rInfo.pCharFormat && + pAnchorFormat == rInfo.pAnchorFormat && aFormat.GetNumberingType() == rInfo.aFormat.GetNumberingType() && nFootnoteOffset == rInfo.nFootnoteOffset && m_bEndNote == rInfo.m_bEndNote && @@ -69,123 +72,151 @@ bool SwEndNoteInfo::operator==( const SwEndNoteInfo& rInfo ) const } SwEndNoteInfo::SwEndNoteInfo(const SwEndNoteInfo& rInfo) : - SwClient( rInfo.GetFootnoteTextColl() ), - aPageDescDep( this, nullptr ), - aCharFormatDep( this, nullptr ), - aAnchorCharFormatDep( this, nullptr ), + SwClient(nullptr), + aDepends(*this), + pTextFormatColl(rInfo.pTextFormatColl), + pPageDesc(rInfo.pPageDesc), + pCharFormat(rInfo.pCharFormat), + pAnchorFormat(rInfo.pAnchorFormat), sPrefix( rInfo.sPrefix ), sSuffix( rInfo.sSuffix ), m_bEndNote( true ), aFormat( rInfo.aFormat ), nFootnoteOffset( rInfo.nFootnoteOffset ) { - aPageDescDep.StartListeningToSameModifyAs(rInfo.aPageDescDep); - aCharFormatDep.StartListeningToSameModifyAs(rInfo.aCharFormatDep); - aAnchorCharFormatDep.StartListeningToSameModifyAs(rInfo.aAnchorCharFormatDep); + aDepends.StartListening(pTextFormatColl); + aDepends.StartListening(pPageDesc); + aDepends.StartListening(pCharFormat); + aDepends.StartListening(pAnchorFormat); } SwEndNoteInfo::SwEndNoteInfo() : SwClient(nullptr), - aPageDescDep( this, nullptr ), - aCharFormatDep( this, nullptr ), - aAnchorCharFormatDep( this, nullptr ), + aDepends(*this), + pTextFormatColl(nullptr), + pPageDesc(nullptr), + pCharFormat(nullptr), + pAnchorFormat(nullptr), m_bEndNote( true ), nFootnoteOffset( 0 ) { aFormat.SetNumberingType(SVX_NUM_ROMAN_LOWER); } -SwPageDesc *SwEndNoteInfo::GetPageDesc( SwDoc &rDoc ) const +SwPageDesc* SwEndNoteInfo::GetPageDesc(SwDoc& rDoc) const { - if ( !aPageDescDep.GetRegisteredIn() ) + if(!pPageDesc) { - SwPageDesc *pDesc = rDoc.getIDocumentStylePoolAccess().GetPageDescFromPool( static_cast<sal_uInt16>( - m_bEndNote ? RES_POOLPAGE_ENDNOTE : RES_POOLPAGE_FOOTNOTE ) ); - pDesc->Add( &const_cast<SwClient&>(static_cast<const SwClient&>(aPageDescDep)) ); + pPageDesc = rDoc.getIDocumentStylePoolAccess().GetPageDescFromPool( static_cast<sal_uInt16>( + m_bEndNote ? RES_POOLPAGE_ENDNOTE : RES_POOLPAGE_FOOTNOTE ) ); + aDepends.StartListening(pPageDesc); } - - return const_cast<SwPageDesc*>(static_cast<const SwPageDesc*>( aPageDescDep.GetRegisteredIn() )); + return pPageDesc; } bool SwEndNoteInfo::KnowsPageDesc() const { - return (aPageDescDep.GetRegisteredIn() != nullptr); + return pPageDesc != nullptr; } -bool SwEndNoteInfo::DependsOn( const SwPageDesc* pDesc ) const +bool SwEndNoteInfo::DependsOn(const SwPageDesc* pDesc) const { - return ( aPageDescDep.GetRegisteredIn() == pDesc ); + return pPageDesc == pDesc; } -void SwEndNoteInfo::ChgPageDesc( SwPageDesc *pDesc ) +void SwEndNoteInfo::ChgPageDesc(SwPageDesc* pDesc) { - pDesc->Add( &static_cast<SwClient&>(aPageDescDep) ); + aDepends.EndListening(pPageDesc); + pPageDesc = pDesc; + aDepends.StartListening(pPageDesc); } void SwEndNoteInfo::SetFootnoteTextColl(SwTextFormatColl& rFormat) { - rFormat.Add(this); + aDepends.EndListening(pTextFormatColl); + pTextFormatColl = &rFormat; + aDepends.StartListening(pTextFormatColl); } SwCharFormat* SwEndNoteInfo::GetCharFormat(SwDoc &rDoc) const { - if ( !aCharFormatDep.GetRegisteredIn() ) + if (!pCharFormat) { - SwCharFormat* pFormat = rDoc.getIDocumentStylePoolAccess().GetCharFormatFromPool( static_cast<sal_uInt16>( + pCharFormat = rDoc.getIDocumentStylePoolAccess().GetCharFormatFromPool( static_cast<sal_uInt16>( m_bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE ) ); - pFormat->Add( &const_cast<SwClient&>(static_cast<const SwClient&>(aCharFormatDep)) ); + aDepends.StartListening(pCharFormat); } - return const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(aCharFormatDep.GetRegisteredIn())); + return pCharFormat; } void SwEndNoteInfo::SetCharFormat( SwCharFormat* pChFormat ) { - OSL_ENSURE(pChFormat, "no CharFormat?"); - pChFormat->Add( &static_cast<SwClient&>(aCharFormatDep) ); + aDepends.EndListening(pCharFormat); + pCharFormat = pChFormat; + aDepends.StartListening(pCharFormat); } -SwCharFormat* SwEndNoteInfo::GetAnchorCharFormat(SwDoc &rDoc) const +SwCharFormat* SwEndNoteInfo::GetAnchorCharFormat(SwDoc& rDoc) const { - if( !aAnchorCharFormatDep.GetRegisteredIn() ) + if(!pAnchorFormat) { - SwCharFormat* pFormat = rDoc.getIDocumentStylePoolAccess().GetCharFormatFromPool( static_cast<sal_uInt16>( + pAnchorFormat = rDoc.getIDocumentStylePoolAccess().GetCharFormatFromPool( static_cast<sal_uInt16>( m_bEndNote ? RES_POOLCHR_ENDNOTE_ANCHOR : RES_POOLCHR_FOOTNOTE_ANCHOR ) ); - pFormat->Add( &const_cast<SwClient&>(static_cast<const SwClient&>(aAnchorCharFormatDep)) ); + aDepends.StartListening(pAnchorFormat); } - return const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(aAnchorCharFormatDep.GetRegisteredIn())); + return pAnchorFormat; } -void SwEndNoteInfo::SetAnchorCharFormat( SwCharFormat* pChFormat ) +void SwEndNoteInfo::SetAnchorCharFormat(SwCharFormat* pFormat) { - OSL_ENSURE(pChFormat, "no CharFormat?"); - pChFormat->Add( &static_cast<SwClient&>(aAnchorCharFormatDep) ); + pAnchorFormat = pFormat; + aDepends.StartListening(pAnchorFormat); } -void SwEndNoteInfo::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) +SwCharFormat* SwEndNoteInfo::GetCurrentCharFormat(const bool bAnchor) const { - const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ; + return bAnchor + ? pAnchorFormat + : pCharFormat; +} - if( RES_ATTRSET_CHG == nWhich || - RES_FMT_CHG == nWhich ) +void SwEndNoteInfo::SwClientNotify( const SwModify& rModify, const SfxHint& rHint) +{ + if (auto pLegacyHint = dynamic_cast<const sw::LegacyModifyHint*>(&rHint)) { - SwDoc* pDoc; - if( aCharFormatDep.GetRegisteredIn() ) - pDoc = static_cast<SwFormat*>(aCharFormatDep.GetRegisteredIn())->GetDoc(); - else - pDoc = static_cast<SwFormat*>(aAnchorCharFormatDep.GetRegisteredIn())->GetDoc(); - SwFootnoteIdxs& rFootnoteIdxs = pDoc->GetFootnoteIdxs(); - for( size_t nPos = 0; nPos < rFootnoteIdxs.size(); ++nPos ) + const sal_uInt16 nWhich = pLegacyHint->m_pOld ? pLegacyHint->m_pOld->Which() : pLegacyHint->m_pNew ? pLegacyHint->m_pNew->Which() : 0 ; + if( RES_ATTRSET_CHG == nWhich || + RES_FMT_CHG == nWhich ) { - SwTextFootnote *pTextFootnote = rFootnoteIdxs[ nPos ]; - const SwFormatFootnote &rFootnote = pTextFootnote->GetFootnote(); - if ( rFootnote.IsEndNote() == m_bEndNote ) + auto pFormat = GetCurrentCharFormat(pCharFormat != nullptr); + if(!aDepends.IsListeningTo(pFormat) || pFormat->IsFormatInDTOR()) + return; + SwDoc* pDoc = pFormat->GetDoc(); + SwFootnoteIdxs& rFootnoteIdxs = pDoc->GetFootnoteIdxs(); + for( size_t nPos = 0; nPos < rFootnoteIdxs.size(); ++nPos ) { - pTextFootnote->SetNumber(rFootnote.GetNumber(), rFootnote.GetNumStr()); + SwTextFootnote *pTextFootnote = rFootnoteIdxs[ nPos ]; + const SwFormatFootnote &rFootnote = pTextFootnote->GetFootnote(); + if ( rFootnote.IsEndNote() == m_bEndNote ) + { + pTextFootnote->SetNumber(rFootnote.GetNumber(), rFootnote.GetNumStr()); + } } } + else + CheckRegistration( pLegacyHint->m_pOld ); + } + else if (auto pModifyChangedHint = dynamic_cast<const sw::ModifyChangedHint*>(&rHint)) + { + if(pAnchorFormat == &rModify) + pAnchorFormat = const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(pModifyChangedHint->m_pNew)); + else if(pCharFormat == &rModify) + pAnchorFormat = const_cast<SwCharFormat*>(static_cast<const SwCharFormat*>(pModifyChangedHint->m_pNew)); + else if(pPageDesc == &rModify) + pPageDesc = const_cast<SwPageDesc*>(static_cast<const SwPageDesc*>(pModifyChangedHint->m_pNew)); + else if(pTextFormatColl == &rModify) + pTextFormatColl = const_cast<SwTextFormatColl*>(static_cast<const SwTextFormatColl*>(pModifyChangedHint->m_pNew)); } - else - CheckRegistration( pOld ); } SwFootnoteInfo& SwFootnoteInfo::operator=(const SwFootnoteInfo& rInfo) diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx index 2e0a8fbc131b..4f5aa306b32f 100644 --- a/sw/source/core/unocore/unosett.cxx +++ b/sw/source/core/unocore/unosett.cxx @@ -490,17 +490,7 @@ uno::Any SwXFootnoteProperties::getPropertyValue(const OUString& rPropertyName) case WID_CHARACTER_STYLE: { OUString aString; - const SwCharFormat* pCharFormat = nullptr; - if( pEntry->nWID == WID_ANCHOR_CHARACTER_STYLE ) - { - if( rFootnoteInfo.GetAnchorCharFormatDep()->GetRegisteredIn() ) - pCharFormat = rFootnoteInfo.GetAnchorCharFormat(*pDoc); - } - else - { - if( rFootnoteInfo.GetCharFormatDep()->GetRegisteredIn() ) - pCharFormat = rFootnoteInfo.GetCharFormat(*pDoc); - } + const SwCharFormat* pCharFormat = rFootnoteInfo.GetCurrentCharFormat(pEntry->nWID == WID_ANCHOR_CHARACTER_STYLE); if( pCharFormat ) { SwStyleNameMapper::FillProgName( @@ -713,17 +703,7 @@ uno::Any SwXEndnoteProperties::getPropertyValue(const OUString& rPropertyName) case WID_CHARACTER_STYLE: { OUString aString; - const SwCharFormat* pCharFormat = nullptr; - if( pEntry->nWID == WID_ANCHOR_CHARACTER_STYLE ) - { - if( rEndInfo.GetAnchorCharFormatDep()->GetRegisteredIn() ) - pCharFormat = rEndInfo.GetAnchorCharFormat(*pDoc); - } - else - { - if( rEndInfo.GetCharFormatDep()->GetRegisteredIn() ) - pCharFormat = rEndInfo.GetCharFormat(*pDoc); - } + const SwCharFormat* pCharFormat = rEndInfo.GetCurrentCharFormat( pEntry->nWID == WID_ANCHOR_CHARACTER_STYLE ); if( pCharFormat ) { SwStyleNameMapper::FillProgName( _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits