[Libreoffice-commits] core.git: sw/inc sw/source

Bjoern Michaelsen bjoern.michaelsen at libreoffice.org
Mon Mar 19 07:21:11 UTC 2018


 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.michaelsen at 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 <ci at libreoffice.org>
    Reviewed-by: Björn Michaelsen <bjoern.michaelsen at 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(


More information about the Libreoffice-commits mailing list