summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svl/SfxBroadcaster.hxx16
-rw-r--r--include/svl/lstner.hxx14
-rw-r--r--svl/source/notify/SfxBroadcaster.cxx88
-rw-r--r--svl/source/notify/lstner.cxx50
-rw-r--r--sw/inc/unotxdoc.hxx2
5 files changed, 99 insertions, 71 deletions
diff --git a/include/svl/SfxBroadcaster.hxx b/include/svl/SfxBroadcaster.hxx
index a29a5c008798..56a335730041 100644
--- a/include/svl/SfxBroadcaster.hxx
+++ b/include/svl/SfxBroadcaster.hxx
@@ -21,7 +21,6 @@
#include <svl/svldllapi.h>
#include <tools/rtti.hxx>
-#include <vector>
class SfxListener;
class SfxHint;
@@ -29,11 +28,8 @@ class SfxBroadcasterTest;
class SVL_DLLPUBLIC SfxBroadcaster
{
- typedef std::vector<SfxListener*> SfxListenerArr_Impl;
-
- /** Contains the positions of removed listeners. */
- std::vector<size_t> m_RemovedPositions;
- SfxListenerArr_Impl m_Listeners;
+ struct Impl;
+ Impl* mpImpl;
private:
void AddListener( SfxListener& rListener );
@@ -60,16 +56,12 @@ public:
/** Get the size of the internally stored vector.
* Use it to iterate over all listeners.
*/
- size_t GetSizeOfVector() const {
- return m_Listeners.size();
- }
+ size_t GetSizeOfVector() const;
/** Get a listener by its position in the internally stored vector.
* Note that this method may return NULL
*/
- SfxListener* GetListener( size_t nNo ) const {
- return m_Listeners[nNo];
- }
+ SfxListener* GetListener( size_t nNo ) const;
friend class SfxListener;
friend class ::SfxBroadcasterTest;
diff --git a/include/svl/lstner.hxx b/include/svl/lstner.hxx
index 0bdf6e23dc9e..8792c01ff041 100644
--- a/include/svl/lstner.hxx
+++ b/include/svl/lstner.hxx
@@ -21,21 +21,17 @@
#include <svl/svldllapi.h>
#include <tools/rtti.hxx>
-#include <deque>
class SfxBroadcaster;
class SfxHint;
-typedef std::deque<SfxBroadcaster*> SfxBroadcasterArr_Impl;
-
#define SFX_NOTIFY( rBC, rBCT, rHint, rHintT ) \
Notify( rBC, rHint )
-
-
class SVL_DLLPUBLIC SfxListener
{
- SfxBroadcasterArr_Impl aBCs;
+ struct Impl;
+ Impl* mpImpl;
private:
const SfxListener& operator=(const SfxListener &); // n.i., ist verboten
@@ -52,10 +48,8 @@ public:
void EndListeningAll();
bool IsListening( SfxBroadcaster& rBroadcaster ) const;
- sal_uInt16 GetBroadcasterCount() const
- { return aBCs.size(); }
- SfxBroadcaster* GetBroadcasterJOE( sal_uInt16 nNo ) const
- { return aBCs[nNo]; }
+ sal_uInt16 GetBroadcasterCount() const;
+ SfxBroadcaster* GetBroadcasterJOE( sal_uInt16 nNo ) const;
virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
diff --git a/svl/source/notify/SfxBroadcaster.cxx b/svl/source/notify/SfxBroadcaster.cxx
index f7ae2521d059..37527e442a26 100644
--- a/svl/source/notify/SfxBroadcaster.cxx
+++ b/svl/source/notify/SfxBroadcaster.cxx
@@ -17,29 +17,38 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include <assert.h>
+#include <svl/SfxBroadcaster.hxx>
#include <svl/hint.hxx>
#include <svl/smplhint.hxx>
#include <svl/lstner.hxx>
+#include <tools/debug.hxx>
-#include <svl/SfxBroadcaster.hxx>
#include <algorithm>
-#include <tools/debug.hxx>
+#include <cassert>
+#include <vector>
TYPEINIT0(SfxBroadcaster);
+typedef std::vector<SfxListener*> SfxListenerArr_Impl;
+
+struct SfxBroadcaster::Impl
+{
+ /** Contains the positions of removed listeners. */
+ std::vector<size_t> m_RemovedPositions;
+ SfxListenerArr_Impl m_Listeners;
+};
+
// broadcast immediately
void SfxBroadcaster::Broadcast( const SfxHint &rHint )
{
// notify all registered listeners exactly once
- for (size_t n = 0; n < m_Listeners.size(); ++n)
+ for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i)
{
- SfxListener *const pListener = m_Listeners[n];
- if (pListener) {
+ SfxListener *const pListener = mpImpl->m_Listeners[i];
+ if (pListener)
pListener->Notify( *this, rHint );
- }
}
}
@@ -50,19 +59,20 @@ SfxBroadcaster::~SfxBroadcaster()
Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
// remove all still registered listeners
- for (size_t nPos = 0; nPos < m_Listeners.size(); ++nPos)
+ for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i)
{
- SfxListener *const pListener = m_Listeners[nPos];
- if (pListener) {
+ SfxListener *const pListener = mpImpl->m_Listeners[i];
+ if (pListener)
pListener->RemoveBroadcaster_Impl(*this);
- }
}
+
+ delete mpImpl;
}
// simple ctor of class SfxBroadcaster
-SfxBroadcaster::SfxBroadcaster()
+SfxBroadcaster::SfxBroadcaster() : mpImpl(new Impl)
{
}
@@ -70,14 +80,13 @@ SfxBroadcaster::SfxBroadcaster()
// copy ctor of class SfxBroadcaster
-SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
+SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) : mpImpl(new Impl)
{
- for (size_t n = 0; n < rBC.m_Listeners.size(); ++n)
+ for (size_t i = 0; i < rBC.mpImpl->m_Listeners.size(); ++i)
{
- SfxListener *const pListener = rBC.m_Listeners[n];
- if (pListener) {
+ SfxListener *const pListener = rBC.mpImpl->m_Listeners[i];
+ if (pListener)
pListener->StartListening( *this );
- }
}
}
@@ -87,14 +96,16 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
void SfxBroadcaster::AddListener( SfxListener& rListener )
{
DBG_TESTSOLARMUTEX();
- if (m_RemovedPositions.empty()) {
- m_Listeners.push_back(&rListener);
+ if (mpImpl->m_RemovedPositions.empty())
+ {
+ mpImpl->m_Listeners.push_back(&rListener);
}
- else {
- size_t targetPosition = m_RemovedPositions.back();
- m_RemovedPositions.pop_back();
- assert(m_Listeners[targetPosition] == NULL);
- m_Listeners[targetPosition] = &rListener;
+ else
+ {
+ size_t targetPosition = mpImpl->m_RemovedPositions.back();
+ mpImpl->m_RemovedPositions.pop_back();
+ assert(mpImpl->m_Listeners[targetPosition] == NULL);
+ mpImpl->m_Listeners[targetPosition] = &rListener;
}
}
@@ -110,12 +121,11 @@ void SfxBroadcaster::ListenersGone()
void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const SfxHint& rHint)
{
- for (size_t i = 0; i < m_Listeners.size(); ++i)
+ for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i)
{
- SfxListener *const pListener = m_Listeners[i];
- if (pListener) {
+ SfxListener *const pListener = mpImpl->m_Listeners[i];
+ if (pListener)
pListener->Notify( rBC, rHint );
- }
}
}
@@ -126,13 +136,13 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
{
DBG_TESTSOLARMUTEX();
SfxListenerArr_Impl::iterator aIter = std::find(
- m_Listeners.begin(), m_Listeners.end(), &rListener);
- assert(aIter != m_Listeners.end()); // "RemoveListener: Listener unknown"
+ mpImpl->m_Listeners.begin(), mpImpl->m_Listeners.end(), &rListener);
+ assert(aIter != mpImpl->m_Listeners.end()); // "RemoveListener: Listener unknown"
// DO NOT erase the listener, set the pointer to 0
// because the current continuation may contain this->Broadcast
*aIter = 0;
- size_t positionOfRemovedElement = std::distance(m_Listeners.begin(), aIter);
- m_RemovedPositions.push_back(positionOfRemovedElement);
+ size_t positionOfRemovedElement = std::distance(mpImpl->m_Listeners.begin(), aIter);
+ mpImpl->m_RemovedPositions.push_back(positionOfRemovedElement);
if ( !HasListeners() )
ListenersGone();
@@ -145,8 +155,18 @@ bool SfxBroadcaster::HasListeners() const
size_t SfxBroadcaster::GetListenerCount() const
{
- assert(m_Listeners.size() >= m_RemovedPositions.size());
- return m_Listeners.size() - m_RemovedPositions.size();
+ assert(mpImpl->m_Listeners.size() >= mpImpl->m_RemovedPositions.size());
+ return mpImpl->m_Listeners.size() - mpImpl->m_RemovedPositions.size();
+}
+
+size_t SfxBroadcaster::GetSizeOfVector() const
+{
+ return mpImpl->m_Listeners.size();
+}
+
+SfxListener* SfxBroadcaster::GetListener( size_t nNo ) const
+{
+ return mpImpl->m_Listeners[nNo];
}
diff --git a/svl/source/notify/lstner.cxx b/svl/source/notify/lstner.cxx
index bef588ad1d27..4c3dc073f3ab 100644
--- a/svl/source/notify/lstner.cxx
+++ b/svl/source/notify/lstner.cxx
@@ -24,21 +24,29 @@
#include <algorithm>
#include <cassert>
+#include <deque>
TYPEINIT0(SfxListener);
+typedef std::deque<SfxBroadcaster*> SfxBroadcasterArr_Impl;
+
+struct SfxListener::Impl
+{
+ SfxBroadcasterArr_Impl maBCs;
+};
+
// simple ctor of class SfxListener
-SfxListener::SfxListener()
+SfxListener::SfxListener() : mpImpl(new Impl)
{
}
// copy ctor of class SfxListener
-SfxListener::SfxListener( const SfxListener &rListener )
+SfxListener::SfxListener( const SfxListener &rListener ) : mpImpl(new Impl)
{
- for ( sal_uInt16 n = 0; n < rListener.aBCs.size(); ++n )
- StartListening( *rListener.aBCs[n] );
+ for ( sal_uInt16 n = 0; n < rListener.mpImpl->maBCs.size(); ++n )
+ StartListening( *rListener.mpImpl->maBCs[n] );
}
// unregisters the SfxListener from its SfxBroadcasters
@@ -46,11 +54,13 @@ SfxListener::SfxListener( const SfxListener &rListener )
SfxListener::~SfxListener()
{
// unregister at all remaining broadcasters
- for ( sal_uInt16 nPos = 0; nPos < aBCs.size(); ++nPos )
+ for ( sal_uInt16 nPos = 0; nPos < mpImpl->maBCs.size(); ++nPos )
{
- SfxBroadcaster *pBC = aBCs[nPos];
+ SfxBroadcaster *pBC = mpImpl->maBCs[nPos];
pBC->RemoveListener(*this);
}
+
+ delete mpImpl;
}
@@ -58,7 +68,7 @@ SfxListener::~SfxListener()
void SfxListener::RemoveBroadcaster_Impl( SfxBroadcaster& rBroadcaster )
{
- aBCs.erase( std::find( aBCs.begin(), aBCs.end(), &rBroadcaster ) );
+ mpImpl->maBCs.erase( std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster ) );
}
@@ -69,7 +79,7 @@ void SfxListener::StartListening( SfxBroadcaster& rBroadcaster, bool bPreventDup
if ( !bPreventDups || !IsListening( rBroadcaster ) )
{
rBroadcaster.AddListener(*this);
- aBCs.push_back( &rBroadcaster );
+ mpImpl->maBCs.push_back( &rBroadcaster );
assert(IsListening(rBroadcaster) && "StartListening failed");
}
@@ -82,13 +92,13 @@ void SfxListener::EndListening( SfxBroadcaster& rBroadcaster, bool bAllDups )
{
do
{
- SfxBroadcasterArr_Impl::iterator it = std::find( aBCs.begin(), aBCs.end(), &rBroadcaster );
- if ( it == aBCs.end() )
+ SfxBroadcasterArr_Impl::iterator it = std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster );
+ if ( it == mpImpl->maBCs.end() )
{
break;
}
rBroadcaster.RemoveListener(*this);
- aBCs.erase( it );
+ mpImpl->maBCs.erase( it );
}
while ( bAllDups );
}
@@ -99,18 +109,28 @@ void SfxListener::EndListening( SfxBroadcaster& rBroadcaster, bool bAllDups )
void SfxListener::EndListeningAll()
{
// Attention: when optimizing this: Respect sideffects of RemoveListener!
- while ( !aBCs.empty() )
+ while ( !mpImpl->maBCs.empty() )
{
- SfxBroadcaster *pBC = aBCs.front();
+ SfxBroadcaster *pBC = mpImpl->maBCs.front();
pBC->RemoveListener(*this);
- aBCs.pop_front();
+ mpImpl->maBCs.pop_front();
}
}
bool SfxListener::IsListening( SfxBroadcaster& rBroadcaster ) const
{
- return aBCs.end() != std::find( aBCs.begin(), aBCs.end(), &rBroadcaster );
+ return mpImpl->maBCs.end() != std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster );
+}
+
+sal_uInt16 SfxListener::GetBroadcasterCount() const
+{
+ return mpImpl->maBCs.size();
+}
+
+SfxBroadcaster* SfxListener::GetBroadcasterJOE( sal_uInt16 nNo ) const
+{
+ return mpImpl->maBCs[nNo];
}
diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
index a48a8f34bab5..de1507be5ea6 100644
--- a/sw/inc/unotxdoc.hxx
+++ b/sw/inc/unotxdoc.hxx
@@ -72,6 +72,8 @@
#include <unobaseclass.hxx>
#include <viewopt.hxx>
+#include <deque>
+
#define __IFC32 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \
Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31, Ifc32