summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-12-03 23:19:39 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-12-04 00:47:57 -0500
commit4eb381147bd0c9c7a48f86de0e3ae1d4c3bbe12f (patch)
tree167bc0a2100a522a575842683fa244ee916ea6ce /svl
parenta09a709594dd0f6e38f8c6bf28433bd391e8842d (diff)
pIimplize SfxBroadcaster and SfxListener.
Change-Id: I0d1d73402f11cc61ea9e7629bea34e24c22f5beb
Diffstat (limited to 'svl')
-rw-r--r--svl/source/notify/SfxBroadcaster.cxx88
-rw-r--r--svl/source/notify/lstner.cxx50
2 files changed, 89 insertions, 49 deletions
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];
}