diff options
Diffstat (limited to 'svl')
-rw-r--r-- | svl/source/notify/broadcast.cxx | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/svl/source/notify/broadcast.cxx b/svl/source/notify/broadcast.cxx index 7e59e36e2ec7..96d34a7f6ced 100644 --- a/svl/source/notify/broadcast.cxx +++ b/svl/source/notify/broadcast.cxx @@ -62,32 +62,49 @@ public: } +void SvtBroadcaster::Normalize() +{ + if (mbNormalized) + return; + + std::sort(maListeners.begin(), maListeners.end()); + ListenersType::iterator itUniqueEnd = std::unique(maListeners.begin(), maListeners.end()); + maListeners.erase(itUniqueEnd, maListeners.end()); + mbNormalized = true; +} + void SvtBroadcaster::Add( SvtListener* p ) { - maListeners.insert(p); + maListeners.push_back(p); + mbNormalized = false; } void SvtBroadcaster::Remove( SvtListener* p ) { - if (mbDying) + if (mbDisposing) return; - maListeners.erase(p); + Normalize(); + std::pair<ListenersType::iterator,ListenersType::iterator> r = + std::equal_range(maListeners.begin(), maListeners.end(), p); + + if (r.first != r.second) + maListeners.erase(r.first, r.second); if (maListeners.empty()) ListenersGone(); } -SvtBroadcaster::SvtBroadcaster() : mbDying(false) {} +SvtBroadcaster::SvtBroadcaster() : mbDisposing(false), mbNormalized(false) {} SvtBroadcaster::SvtBroadcaster( const SvtBroadcaster &rBC ) : - maListeners(rBC.maListeners), mbDying(false) + maListeners(rBC.maListeners), mbDisposing(false), mbNormalized(rBC.mbNormalized) { std::for_each(maListeners.begin(), maListeners.end(), StartListeningHandler(*this)); } SvtBroadcaster::~SvtBroadcaster() { - mbDying = true; + mbDisposing = true; Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); // unregister all listeners. @@ -96,6 +113,7 @@ SvtBroadcaster::~SvtBroadcaster() void SvtBroadcaster::Broadcast( const SfxHint &rHint ) { + Normalize(); std::for_each(maListeners.begin(), maListeners.end(), NotifyHandler(*this, rHint)); } |