SwXDocumentIndexMark::Impl: MultiWriterListener no more

Change-Id: I9c167c5b56c098cfd85693a3bf5f16da51b6033c
Reviewed-on: https://gerrit.libreoffice.org/79290
Tested-by: Jenkins
Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
This commit is contained in:
Bjoern Michaelsen 2019-09-20 10:31:40 +02:00 committed by Björn Michaelsen
parent ca637f21a3
commit a5081700ba
3 changed files with 59 additions and 62 deletions

View file

@ -53,7 +53,7 @@ extern const OUString S_PAGE_DELI;
class SW_DLLPUBLIC SwTOXMark
: public SfxPoolItem
, public SwModify
, public sw::BroadcastingModify
{
friend void InitCore();
friend class SwTextTOXMark;
@ -146,7 +146,7 @@ public:
};
// index types
class SwTOXType : public SwModify
class SwTOXType final: public sw::BroadcastingModify
{
public:
SwTOXType(TOXTypes eTyp, const OUString& aName);

View file

@ -96,36 +96,34 @@ void lcl_FillAuthPattern(SwFormTokens &rAuthTokens, sal_uInt16 nTypeId)
/// pool default constructor
SwTOXMark::SwTOXMark()
: SfxPoolItem( RES_TXTATR_TOXMARK )
, SwModify( nullptr )
,
m_pTextAttr( nullptr ), m_nLevel( 0 ),
m_bAutoGenerated(false),
m_bMainEntry(false)
{
, m_pTextAttr( nullptr ), m_nLevel( 0 )
, m_bAutoGenerated(false)
, m_bMainEntry(false)
{ }
SwTOXMark::SwTOXMark(const SwTOXType* pTyp)
: SfxPoolItem(RES_TXTATR_TOXMARK )
, m_pTextAttr( nullptr )
, m_nLevel( 0 )
, m_bAutoGenerated(false)
, m_bMainEntry(false)
{
const_cast<SwTOXType*>(pTyp)->Add(this);
}
SwTOXMark::SwTOXMark( const SwTOXType* pTyp )
: SfxPoolItem( RES_TXTATR_TOXMARK )
, SwModify( const_cast<SwTOXType*>(pTyp) )
,
m_pTextAttr( nullptr ), m_nLevel( 0 ),
m_bAutoGenerated(false),
m_bMainEntry(false)
{
}
SwTOXMark::SwTOXMark( const SwTOXMark& rCopy )
: SfxPoolItem( RES_TXTATR_TOXMARK )
, SwModify(rCopy.GetRegisteredInNonConst())
,
m_aPrimaryKey( rCopy.m_aPrimaryKey ), m_aSecondaryKey( rCopy.m_aSecondaryKey ),
m_aTextReading( rCopy.m_aTextReading ),
m_aPrimaryKeyReading( rCopy.m_aPrimaryKeyReading ),
m_aSecondaryKeyReading( rCopy.m_aSecondaryKeyReading ),
m_pTextAttr( nullptr ), m_nLevel( rCopy.m_nLevel ),
m_bAutoGenerated( rCopy.m_bAutoGenerated),
m_bMainEntry(rCopy.m_bMainEntry)
SwTOXMark::SwTOXMark(const SwTOXMark& rCopy)
: SfxPoolItem(RES_TXTATR_TOXMARK)
, m_aPrimaryKey(rCopy.m_aPrimaryKey)
, m_aSecondaryKey(rCopy.m_aSecondaryKey)
, m_aTextReading(rCopy.m_aTextReading)
, m_aPrimaryKeyReading(rCopy.m_aPrimaryKeyReading)
, m_aSecondaryKeyReading(rCopy.m_aSecondaryKeyReading)
, m_pTextAttr(nullptr)
, m_nLevel(rCopy.m_nLevel)
, m_bAutoGenerated(rCopy.m_bAutoGenerated)
, m_bMainEntry(rCopy.m_bMainEntry)
{
const_cast<SwTOXMark*>(&rCopy)->GetRegisteredIn()->Add(this);
// Copy AlternativString
m_aAltText = rCopy.m_aAltText;
}
@ -198,18 +196,16 @@ void SwTOXMark::InsertTOXMarks( SwTOXMarks& aMarks, const SwTOXType& rType )
}
// Manage types of TOX
SwTOXType::SwTOXType( TOXTypes eTyp, const OUString& rName )
: SwModify(nullptr),
m_aName(rName),
m_eType(eTyp)
{
}
SwTOXType::SwTOXType(TOXTypes eTyp, const OUString& rName)
: m_aName(rName)
, m_eType(eTyp)
{ }
SwTOXType::SwTOXType(const SwTOXType& rCopy)
: SwModify( const_cast<SwModify*>(rCopy.GetRegisteredIn()) ),
m_aName(rCopy.m_aName),
m_eType(rCopy.m_eType)
: m_aName(rCopy.m_aName)
, m_eType(rCopy.m_eType)
{
const_cast<SwTOXType*>(&rCopy)->GetRegisteredIn()->Add(this);
}
static const char* STR_POOLCOLL_TOX_ARY[] =

View file

@ -67,6 +67,7 @@
#include <comphelper/string.hxx>
#include <cppuhelper/implbase.hxx>
#include <svl/itemprop.hxx>
#include <svl/listener.hxx>
using namespace ::com::sun::star;
@ -288,8 +289,7 @@ lcl_TypeToPropertyMap_Index(const TOXTypes eType)
}
}
class SwXDocumentIndex::Impl
: public SvtListener
class SwXDocumentIndex::Impl final: public SvtListener
{
private:
::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper2
@ -1489,8 +1489,7 @@ lcl_TypeToPropertyMap_Mark(const TOXTypes eType)
}
}
class SwXDocumentIndexMark::Impl
: public SwClient
class SwXDocumentIndexMark::Impl final: public SvtListener
{
private:
::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper2
@ -1504,7 +1503,6 @@ public:
const TOXTypes m_eTOXType;
::comphelper::OInterfaceContainerHelper2 m_EventListeners;
bool m_bIsDescriptor;
sw::WriterMultiListener m_aListener;
const SwTOXType* m_pTOXType;
const SwTOXMark* m_pTOXMark;
SwDoc* m_pDoc;
@ -1524,24 +1522,28 @@ public:
Impl(SwXDocumentIndexMark& rThis,
SwDoc* const pDoc,
const enum TOXTypes eType,
SwTOXType* const pType, SwTOXMark const*const pMark)
: SwClient()
, m_rThis(rThis)
SwTOXType* const pType,
SwTOXMark const*const pMark)
: m_rThis(rThis)
, m_bInReplaceMark(false)
, m_rPropSet(
*aSwMapProvider.GetPropertySet(lcl_TypeToPropertyMap_Mark(eType)))
, m_eTOXType(eType)
, m_EventListeners(m_Mutex)
, m_bIsDescriptor(nullptr == pMark)
, m_aListener(*this)
, m_pTOXType(pType)
, m_pTOXMark(pMark)
, m_pDoc(pDoc)
, m_bMainEntry(false)
, m_nLevel(0)
{
m_aListener.StartListening(const_cast<SwTOXMark*>(pMark));
m_aListener.StartListening(pType);
auto pMarkNonConst = const_cast<SwTOXMark*>(m_pTOXMark);
auto pTypeNonConst = const_cast<SwTOXType*>(m_pTOXType);
if(pMarkNonConst)
StartListening(pMarkNonConst->GetNotifier());
if(pTypeNonConst)
StartListening(pTypeNonConst->GetNotifier());
}
SwTOXType* GetTOXType() const {
@ -1550,7 +1552,8 @@ public:
void DeleteTOXMark()
{
m_pDoc->DeleteTOXMark(m_pTOXMark); // calls Invalidate() via Notify
m_pDoc->DeleteTOXMark(m_pTOXMark);
Invalidate();
}
void InsertTOXMark(SwTOXType & rTOXType, SwTOXMark & rMark, SwPaM & rPam,
@ -1573,9 +1576,7 @@ public:
}
void Invalidate();
protected:
// SwClient
virtual void SwClientNotify(const SwModify&, const SfxHint& ) override;
virtual void Notify(const SfxHint&) override;
};
void SwXDocumentIndexMark::Impl::Invalidate()
@ -1590,21 +1591,21 @@ void SwXDocumentIndexMark::Impl::Invalidate()
m_EventListeners.disposeAndClear(ev);
}
}
m_aListener.EndListeningAll();
EndListeningAll();
m_pDoc = nullptr;
m_pTOXMark = nullptr;
m_pTOXType = nullptr;
}
void SwXDocumentIndexMark::Impl::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
void SwXDocumentIndexMark::Impl::Notify(const SfxHint& rHint)
{
assert(!GetRegisteredIn()); // we should only listen with the WriterMultiListener from now on
if(auto pModifyChangedHint = dynamic_cast<const sw::ModifyChangedHint*>(&rHint))
{
if(pModifyChangedHint->m_pNew == nullptr || &rModify == m_pTOXMark)
if(auto pNewType = dynamic_cast<const SwTOXType*>(pModifyChangedHint->m_pNew))
m_pTOXType = pNewType;
else
Invalidate();
else if(&rModify == m_pTOXType)
m_pTOXType = dynamic_cast<const SwTOXType*>(pModifyChangedHint->m_pNew);
}
}
@ -1941,9 +1942,9 @@ void SwXDocumentIndexMark::Impl::InsertTOXMark(
m_pDoc = pDoc;
m_pTOXMark = &pNewTextAttr->GetTOXMark();
m_pTOXType = &rTOXType;
m_aListener.EndListeningAll();
m_aListener.StartListening(const_cast<SwTOXMark*>(m_pTOXMark));
m_aListener.StartListening(const_cast<SwTOXType*>(m_pTOXType));
EndListeningAll();
StartListening(const_cast<SwTOXMark*>(m_pTOXMark)->GetNotifier());
StartListening(const_cast<SwTOXType*>(m_pTOXType)->GetNotifier());
}
uno::Reference< text::XTextRange > SAL_CALL