summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/calbck.hxx12
-rw-r--r--sw/inc/switerator.hxx18
2 files changed, 20 insertions, 10 deletions
diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 5aab4dd9a255..88a9cb0f1f1f 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 4a9f277b0afb..440c4e63a281 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(); }
};