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

Bjoern Michaelsen bjoern.michaelsen at canonical.com
Mon Mar 16 12:45:10 PDT 2015


 sw/inc/calbck.hxx                 |   98 ++++++++++++++++++--------------------
 sw/inc/switerator.hxx             |   41 +++++++++++++--
 sw/source/core/fields/ddetbl.cxx  |    3 -
 sw/source/core/layout/atrfrm.cxx  |    3 -
 sw/source/core/layout/sectfrm.cxx |    1 
 sw/source/core/txtnode/atrfld.cxx |    3 -
 sw/source/core/txtnode/ndtxt.cxx  |    1 
 7 files changed, 90 insertions(+), 60 deletions(-)

New commits:
commit 7ea33ed5622961342a793d6df2dba0f2e962999a
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 21:21:04 2015 +0100

    remove 'shortcut' that is longer than the original
    
    Change-Id: Id038f22e4c334cdcd56e1638d9d212b0dd1fa8b3

diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index 440c4e6..499c6e18 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -62,7 +62,6 @@ public:
             aClientIter.m_pPosition = aClientIter.GetLeftOfPos();
         return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
     }
-    static TElementType* FirstElement( const TSource& rMod ) { return SwIterator<TElementType, TSource>(rMod).First(); }
     bool IsChanged()          { return aClientIter.IsChanged(); }
 };
 
commit b0dae8c4c57aa50bbff7b3fd4d84476636bf1677
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 19:56:49 2015 +0100

    Fixes for moving stuff to SwIterator
    
    Change-Id: I834afb711920e480045a9f932770dab27dd1f3ad

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 5aab4dd..88a9cb0 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -257,6 +257,8 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
     // is marked down to become the current object in the next step
     // this is necessary because iteration requires access to members of the current object
     SwClient* m_pPosition;
+    SwClient* GetLeftOfPos() { return static_cast<SwClient*>(m_pPosition->m_pLeft); }
+    SwClient* GetRighOfPos() { return static_cast<SwClient*>(m_pPosition->m_pRight); }
 
     // iterator can be limited to return only SwClient objects of a certain type
     TypeId m_aSearchType;
@@ -330,8 +332,16 @@ SwClient::SwClient( SwModify* pToRegisterIn )
 void SwModify::ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType)
 {
     SwClientIter aIter(*this);
-    for(aIter.First(nType); aIter; aIter.Next())
+    aIter.GoStart();
+    while(aIter)
+    {
+        if( aIter.m_pPosition == aIter.m_pCurrent )
+            aIter.m_pPosition = static_cast<SwClient*>(aIter.m_pPosition->m_pRight);
+        while(aIter.m_pPosition && !aIter.m_pPosition->IsA( nType ) )
+            aIter.m_pPosition = static_cast<SwClient*>(aIter.m_pPosition->m_pRight);
+        aIter.m_pCurrent = aIter.m_pPosition;
         aIter->Modify( pOldValue, pNewValue );
+    }
 }
 
 void SwModify::CallSwClientNotify( const SfxHint& rHint ) const
diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index 4a9f277..440c4e6 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -35,34 +35,34 @@ public:
         if(!aClientIter.m_pPosition)
             return nullptr;
         aClientIter.m_pCurrent = nullptr;
-        return PTR_CAST(TElementType,aClientIter.Next());
+        return Next();
     }
     TElementType* Last()
     {
         aClientIter.m_aSearchType = TYPE(TElementType);
-        GoEnd();
+        aClientIter.GoEnd();
         if(!aClientIter.m_pPosition)
             return nullptr;
-        if(aClientIter.m_pPosition->IsA(TYPE(TElementType))
+        if(aClientIter.m_pPosition->IsA(TYPE(TElementType)))
             return PTR_CAST(TElementType,aClientIter.m_pPosition);
-        return PTR_CAST(TElementType,aClientIter.Previous());
+        return Previous();
     }
     TElementType* Next()
     {
         if( aClientIter.m_pPosition == aClientIter.m_pCurrent )
-            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pRight);
+            aClientIter.m_pPosition = aClientIter.GetRighOfPos();
         while(aClientIter.m_pPosition && !aClientIter.m_pPosition->IsA( TYPE(TElementType) ) )
-            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pRight);
+            aClientIter.m_pPosition = aClientIter.GetRighOfPos();
         return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
     }
     TElementType* Previous()
     {
-        aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pLeft);
+        aClientIter.m_pPosition = aClientIter.GetLeftOfPos();
         while(aClientIter.m_pPosition && !aClientIter.m_pPosition->IsA( TYPE(TElementType) ) )
-            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pLeft);
+            aClientIter.m_pPosition = aClientIter.GetLeftOfPos();
         return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
     }
-    static TElementType* FirstElement( const TSource& rMod ) { SwClient* p = SwClientIter(rMod).First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
+    static TElementType* FirstElement( const TSource& rMod ) { return SwIterator<TElementType, TSource>(rMod).First(); }
     bool IsChanged()          { return aClientIter.IsChanged(); }
 };
 
commit 059b2b0385e632459c3f0a7c110b7a5ab6b6ce51
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 19:06:29 2015 +0100

    Move SwClientIter::Previous() to SwIterator
    
    Change-Id: Idd1f794f81612d7593095a230580234cdce30725

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index bde2e5b..5aab4dd 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -263,14 +263,6 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 
     static SW_DLLPUBLIC SwClientIter* our_pClientIters;
 
-    SwClient* Previous()
-    {
-        m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
-        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
-        return m_pCurrent = m_pPosition;
-    }
-
 public:
     SwClientIter( const SwModify& rModify )
         : m_rRoot(rModify)
diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index fd943ba..4a9f277 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -55,7 +55,13 @@ public:
             aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pRight);
         return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
     }
-    TElementType* Previous()  { SwClient* p = aClientIter.Previous(); return PTR_CAST(TElementType,p);  }
+    TElementType* Previous()
+    {
+        aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pLeft);
+        while(aClientIter.m_pPosition && !aClientIter.m_pPosition->IsA( TYPE(TElementType) ) )
+            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pLeft);
+        return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
+    }
     static TElementType* FirstElement( const TSource& rMod ) { SwClient* p = SwClientIter(rMod).First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
     bool IsChanged()          { return aClientIter.IsChanged(); }
 };
commit 32d322a133960a0533403581df1ba7251b7dc700
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 19:01:48 2015 +0100

    Move SwClientIter::Next() to SwIterator
    
    Change-Id: I7e0a9d1a02fa91fd2d685c3c6c1c3340be5cf41d

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 81dc181..bde2e5b 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -263,15 +263,6 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 
     static SW_DLLPUBLIC SwClientIter* our_pClientIters;
 
-    SwClient* Next()
-    {
-        if( m_pPosition == m_pCurrent )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
-        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
-        return m_pCurrent = m_pPosition;
-    }
-
     SwClient* Previous()
     {
         m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index a054d07..fd943ba 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -47,7 +47,14 @@ public:
             return PTR_CAST(TElementType,aClientIter.m_pPosition);
         return PTR_CAST(TElementType,aClientIter.Previous());
     }
-    TElementType* Next()      { SwClient* p = aClientIter.Next();     return PTR_CAST(TElementType,p); }
+    TElementType* Next()
+    {
+        if( aClientIter.m_pPosition == aClientIter.m_pCurrent )
+            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pRight);
+        while(aClientIter.m_pPosition && !aClientIter.m_pPosition->IsA( TYPE(TElementType) ) )
+            aClientIter.m_pPosition = static_cast<SwClient*>(aClientIter.m_pPosition->m_pRight);
+        return PTR_CAST(TElementType,aClientIter.m_pCurrent = aClientIter.m_pPosition);
+    }
     TElementType* Previous()  { SwClient* p = aClientIter.Previous(); return PTR_CAST(TElementType,p);  }
     static TElementType* FirstElement( const TSource& rMod ) { SwClient* p = SwClientIter(rMod).First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
     bool IsChanged()          { return aClientIter.IsChanged(); }
commit a583f445cfca85bd9a8692154774d08f28d9a508
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 18:52:36 2015 +0100

    Move SwClientIter::Last() to SwIterator
    
    Change-Id: I7ec3feaec7a07871a3470f7f41dd203fa0f83fd0

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 798b4b6..81dc181 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -263,16 +263,6 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 
     static SW_DLLPUBLIC SwClientIter* our_pClientIters;
 
-    SwClient* Last( TypeId nType )
-    {
-        m_aSearchType = nType;
-        GoEnd();
-        if(!m_pPosition)
-            return nullptr;
-        if( m_pPosition->IsA( m_aSearchType ) )
-            return m_pPosition;
-        return Previous();
-    }
     SwClient* Next()
     {
         if( m_pPosition == m_pCurrent )
diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index 3a6a126..a054d07 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -37,7 +37,16 @@ public:
         aClientIter.m_pCurrent = nullptr;
         return PTR_CAST(TElementType,aClientIter.Next());
     }
-    TElementType* Last()      { SwClient* p = aClientIter.Last( TYPE(TElementType)); return PTR_CAST(TElementType,p); }
+    TElementType* Last()
+    {
+        aClientIter.m_aSearchType = TYPE(TElementType);
+        GoEnd();
+        if(!aClientIter.m_pPosition)
+            return nullptr;
+        if(aClientIter.m_pPosition->IsA(TYPE(TElementType))
+            return PTR_CAST(TElementType,aClientIter.m_pPosition);
+        return PTR_CAST(TElementType,aClientIter.Previous());
+    }
     TElementType* Next()      { SwClient* p = aClientIter.Next();     return PTR_CAST(TElementType,p); }
     TElementType* Previous()  { SwClient* p = aClientIter.Previous(); return PTR_CAST(TElementType,p);  }
     static TElementType* FirstElement( const TSource& rMod ) { SwClient* p = SwClientIter(rMod).First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
commit 82a0260f9e9ea88301ace2cf8dfa15368f089c74
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 18:46:41 2015 +0100

    move SwClientIter::First() to SwIterator
    
    Change-Id: I165dfaf2894352ad6610855ae9a18bd553ef07be

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index f2ea656..798b4b6 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -263,15 +263,6 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 
     static SW_DLLPUBLIC SwClientIter* our_pClientIters;
 
-    SwClient* First( TypeId nType )
-    {
-        m_aSearchType = nType;
-        GoStart();
-        if(!m_pPosition)
-            return nullptr;
-        m_pCurrent = nullptr;
-        return Next();
-    }
     SwClient* Last( TypeId nType )
     {
         m_aSearchType = nType;
diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index 9cefc92..3a6a126 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -28,7 +28,15 @@ template< class TElementType, class TSource > class SwIterator SAL_FINAL
 public:
 
     SwIterator( const TSource& rSrc ) : aClientIter(rSrc) { assert(TElementType::IsOf( TYPE(SwClient) )); }
-    TElementType* First()     { SwClient* p = aClientIter.First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
+    TElementType* First()
+    {
+        aClientIter.m_aSearchType = TYPE(TElementType);
+        aClientIter.GoStart();
+        if(!aClientIter.m_pPosition)
+            return nullptr;
+        aClientIter.m_pCurrent = nullptr;
+        return PTR_CAST(TElementType,aClientIter.Next());
+    }
     TElementType* Last()      { SwClient* p = aClientIter.Last( TYPE(TElementType)); return PTR_CAST(TElementType,p); }
     TElementType* Next()      { SwClient* p = aClientIter.Next();     return PTR_CAST(TElementType,p); }
     TElementType* Previous()  { SwClient* p = aClientIter.Previous(); return PTR_CAST(TElementType,p);  }
commit 0c2731410ebd8b4414d07b9daf11b3e70f48e1fb
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 18:40:57 2015 +0100

    assert hard here
    
    Change-Id: Ie8eba16f0696f80748ed6ea64bef02d6f015a5ff

diff --git a/sw/inc/switerator.hxx b/sw/inc/switerator.hxx
index 9df5906..9cefc92 100644
--- a/sw/inc/switerator.hxx
+++ b/sw/inc/switerator.hxx
@@ -27,7 +27,7 @@ template< class TElementType, class TSource > class SwIterator SAL_FINAL
     SwClientIter aClientIter;
 public:
 
-    SwIterator( const TSource& rSrc ) : aClientIter(rSrc) { SAL_WARN_IF( !TElementType::IsOf( TYPE(SwClient) ), "sw", "Incompatible types!" ); }
+    SwIterator( const TSource& rSrc ) : aClientIter(rSrc) { assert(TElementType::IsOf( TYPE(SwClient) )); }
     TElementType* First()     { SwClient* p = aClientIter.First(TYPE(TElementType)); return PTR_CAST(TElementType,p); }
     TElementType* Last()      { SwClient* p = aClientIter.Last( TYPE(TElementType)); return PTR_CAST(TElementType,p); }
     TElementType* Next()      { SwClient* p = aClientIter.Next();     return PTR_CAST(TElementType,p); }
commit d7ab0bc37ee62d6006abe8c2a281ba9975c08770
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 18:37:17 2015 +0100

    make typed iteration private in SwClientIter now
    
    Change-Id: If3887cd7a126834a8c3bfd156dc25335229d929b

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 6e1a1cc..f2ea656 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -64,6 +64,8 @@ class SfxHint;
 class SwModify;
 class SwClient;
 class SwClientIter;
+template<typename E, typename S> class SwIterator;
+
 namespace sw
 {
     struct LegacyModifyHint SAL_FINAL: SfxHint
@@ -241,8 +243,10 @@ protected:
 
 class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 {
-    friend SwClient* SwModify::Remove(SwClient *); ///< for pointer adjustments
-    friend void SwModify::Add(SwClient *pDepend);   ///< for pointer adjustments
+    friend SwClient* SwModify::Remove(SwClient*); ///< for pointer adjustments
+    friend void SwModify::Add(SwClient*);   ///< for pointer adjustments
+    template<typename E, typename S> friend class SwIterator; ///< for typed interation
+    friend void SwModify::ModifyBroadcast( const SfxPoolItem*, const SfxPoolItem*, TypeId); ///< for typed iteration
 
     const SwModify& m_rRoot;
 
@@ -259,6 +263,42 @@ class SwClientIter SAL_FINAL : public sw::Ring<SwClientIter>
 
     static SW_DLLPUBLIC SwClientIter* our_pClientIters;
 
+    SwClient* First( TypeId nType )
+    {
+        m_aSearchType = nType;
+        GoStart();
+        if(!m_pPosition)
+            return nullptr;
+        m_pCurrent = nullptr;
+        return Next();
+    }
+    SwClient* Last( TypeId nType )
+    {
+        m_aSearchType = nType;
+        GoEnd();
+        if(!m_pPosition)
+            return nullptr;
+        if( m_pPosition->IsA( m_aSearchType ) )
+            return m_pPosition;
+        return Previous();
+    }
+    SwClient* Next()
+    {
+        if( m_pPosition == m_pCurrent )
+            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
+        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
+            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
+        return m_pCurrent = m_pPosition;
+    }
+
+    SwClient* Previous()
+    {
+        m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
+        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
+            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
+        return m_pCurrent = m_pPosition;
+    }
+
 public:
     SwClientIter( const SwModify& rModify )
         : m_rRoot(rModify)
@@ -314,42 +354,6 @@ public:
     // adding objects to a client chain in iteration is forbidden
     // SwModify::Add() asserts this
     bool IsChanged() const { return m_pPosition != m_pCurrent; }
-
-    SwClient* First( TypeId nType )
-    {
-        m_aSearchType = nType;
-        GoStart();
-        if(!m_pPosition)
-            return nullptr;
-        m_pCurrent = nullptr;
-        return Next();
-    }
-    SwClient* Last( TypeId nType )
-    {
-        m_aSearchType = nType;
-        GoEnd();
-        if(!m_pPosition)
-            return nullptr;
-        if( m_pPosition->IsA( m_aSearchType ) )
-            return m_pPosition;
-        return Previous();
-    }
-    SwClient* Next()
-    {
-        if( m_pPosition == m_pCurrent )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
-        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pRight);
-        return m_pCurrent = m_pPosition;
-    }
-
-    SwClient* Previous()
-    {
-        m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
-        while(m_pPosition && !m_pPosition->IsA( m_aSearchType ) )
-            m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
-        return m_pCurrent = m_pPosition;
-    }
 };
 
 SwClient::SwClient( SwModify* pToRegisterIn )
commit 1fb1016eca1d8e9f43baad18bf7228913aa29715
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sat Mar 14 17:41:46 2015 +0100

    Pipe legacy Modify calls through SwClientModify
    
    Change-Id: Ic55abdee0486021d8361271fabec9fcaa06c3502

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 89f9f75..6e1a1cc 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -26,6 +26,7 @@
 #include <ring.hxx>
 #include <hintids.hxx>
 #include <hints.hxx>
+#include <typeinfo>
 
 
 class SwModify;
@@ -65,6 +66,12 @@ class SwClient;
 class SwClientIter;
 namespace sw
 {
+    struct LegacyModifyHint SAL_FINAL: SfxHint
+    {
+        LegacyModifyHint(const SfxPoolItem* pOld, const SfxPoolItem* pNew) : m_pOld(pOld), m_pNew(pNew) {};
+        const SfxPoolItem* m_pOld;
+        const SfxPoolItem* m_pNew;
+    };
     /// refactoring out the some of the more sane SwClient functionality
     class SW_DLLPUBLIC WriterListener : ::boost::noncopyable
     {
@@ -79,11 +86,7 @@ namespace sw
                 : m_pLeft(nullptr), m_pRight(nullptr)
             {}
             virtual ~WriterListener() {};
-            // callbacks received from SwModify (friend class - so these methods can be private)
-            // should be called only from SwModify the client is registered in
-            // mba: IMHO these methods should be pure virtual
-            virtual void Modify(const SfxPoolItem*, const SfxPoolItem*) {};
-            virtual void SwClientNotify( const SwModify&, const SfxHint&) {};
+            virtual void SwClientNotify( const SwModify&, const SfxHint& rHint) =0;
         public:
             bool IsLast() const { return !m_pLeft && !m_pRight; }
    };
@@ -108,8 +111,20 @@ public:
 
     SwClient() : pRegisteredIn(nullptr) {}
     virtual ~SwClient() SAL_OVERRIDE;
+    // callbacks received from SwModify (friend class - so these methods can be private)
+    // should be called only from SwModify the client is registered in
+    // mba: IMHO this method should be pure virtual
+    // DO NOT USE IN NEW CODE! use SwClientNotify instead.
     virtual void Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue ) SAL_OVERRIDE
         { CheckRegistration( pOldValue, pNewValue ); }
+    // when overriding this, you MUST call SwClient::SwClientModify() in the override!
+    virtual void SwClientNotify( const SwModify&, const SfxHint& rHint)
+    {
+        // assuming the compiler to realize that a dynamic_cast to a final class is just a pointer compare ...
+        auto pLegacyHint(dynamic_cast<const sw::LegacyModifyHint*>(&rHint));
+        if(pLegacyHint)
+            Modify(pLegacyHint->m_pOld, pLegacyHint->m_pNew);
+    };
 
     // in case an SwModify object is destroyed that itself is registered in another SwModify,
     // its SwClient objects can decide to get registered to the latter instead by calling this method
@@ -144,6 +159,7 @@ class SW_DLLPUBLIC SwModify: public SwClient
     bool bInSwFntCache : 1;
 
     // mba: IMHO this method should be pure virtual
+    // DO NOT USE IN NEW CODE! use CallSwClientNotify instead.
     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) SAL_OVERRIDE
         { NotifyClients( pOld, pNew ); };
 
@@ -151,23 +167,25 @@ public:
     SwModify()
         : SwClient(nullptr), pRoot(nullptr), bModifyLocked(false), bLockClientList(false), bInDocDTOR(false), bInCache(false), bInSwFntCache(false)
     {}
+    explicit SwModify( SwModify* pToRegisterIn )
+        : SwClient(pToRegisterIn), pRoot(nullptr), bModifyLocked(false), bLockClientList(false), bInDocDTOR(false), bInCache(false), bInSwFntCache(false)
+    {}
 
     // broadcasting: send notifications to all clients
+    // DO NOT USE IN NEW CODE! use CallSwClientNotify instead.
     void NotifyClients( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue );
-
+    // DO NOT USE IN NEW CODE! use CallSwClientNotify instead.
+    void ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue)
+        { CallSwClientNotify( sw::LegacyModifyHint{ pOldValue, pNewValue } ); };
     // the same, but without setting bModifyLocked or checking for any of the flags
     // mba: it would be interesting to know why this is necessary
     // also allows to limit callback to certain type (HACK)
-    inline void ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType = TYPE(SwClient) );
+    // DO NOT USE IN NEW CODE! use CallSwClientNotify instead.
+    inline void ModifyBroadcast( const SfxPoolItem *pOldValue, const SfxPoolItem *pNewValue, TypeId nType );
 
     // a more universal broadcasting mechanism
     inline void CallSwClientNotify( const SfxHint& rHint ) const;
 
-    // single argument ctors shall be explicit.
-    explicit SwModify( SwModify* pToRegisterIn )
-        : SwClient(pToRegisterIn), pRoot(nullptr), bModifyLocked(false), bLockClientList(false), bInDocDTOR(false), bInCache(false), bInSwFntCache(false)
-    {}
-
     virtual ~SwModify();
 
     void Add(SwClient *pDepend);
diff --git a/sw/source/core/fields/ddetbl.cxx b/sw/source/core/fields/ddetbl.cxx
index be1212d..277438e 100644
--- a/sw/source/core/fields/ddetbl.cxx
+++ b/sw/source/core/fields/ddetbl.cxx
@@ -86,8 +86,9 @@ void SwDDETable::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
         SwTable::Modify( pOld, pNew );
 }
 
-void SwDDETable::SwClientNotify( const SwModify&, const SfxHint& rHint )
+void SwDDETable::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
 {
+    SwClient::SwClientNotify(rModify, rHint);
     const SwFieldHint* pHint = dynamic_cast<const SwFieldHint*>( &rHint );
     if ( pHint )
         // replace DDETable by real table
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index d93118f..c1d3ae6 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -628,8 +628,9 @@ SfxPoolItem*  SwFmtPageDesc::Clone( SfxItemPool* ) const
     return new SwFmtPageDesc( *this );
 }
 
-void SwFmtPageDesc::SwClientNotify( const SwModify&, const SfxHint& rHint )
+void SwFmtPageDesc::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
 {
+    SwClient::SwClientNotify(rModify, rHint);
     const SwPageDescHint* pHint = dynamic_cast<const SwPageDescHint*>(&rHint);
     if ( pHint )
     {
diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx
index f0a6c85..e719b88 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -2283,6 +2283,7 @@ void SwSectionFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem * pNew )
 
 void SwSectionFrm::SwClientNotify( const SwModify& rMod, const SfxHint& rHint )
 {
+    SwClient::SwClientNotify(rMod, rHint);
     // #i117863#
     const SwSectionFrmMoveAndDeleteHint* pHint =
                     dynamic_cast<const SwSectionFrmMoveAndDeleteHint*>(&rHint);
diff --git a/sw/source/core/txtnode/atrfld.cxx b/sw/source/core/txtnode/atrfld.cxx
index bf45bba..34aee5e 100644
--- a/sw/source/core/txtnode/atrfld.cxx
+++ b/sw/source/core/txtnode/atrfld.cxx
@@ -204,8 +204,9 @@ void SwFmtFld::InvalidateField()
     NotifyClients(&item, &item);
 }
 
-void SwFmtFld::SwClientNotify( const SwModify&, const SfxHint& rHint )
+void SwFmtFld::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
 {
+    SwClient::SwClientNotify(rModify, rHint);
     if( !mpTxtFld )
         return;
 
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 55bdf18..308004b 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -5069,6 +5069,7 @@ bool SwTxtNode::IsInContent() const
 
 void SwTxtNode::SwClientNotify( const SwModify& rModify, const SfxHint& rHint )
 {
+    SwClient::SwClientNotify(rModify, rHint);
     const SwAttrHint* pHint = dynamic_cast<const SwAttrHint*>(&rHint);
     if ( pHint && pHint->GetId() == RES_CONDTXTFMTCOLL && &rModify == GetRegisteredIn() )
         ChkCondColl();


More information about the Libreoffice-commits mailing list