sw/source/core/access/accmap.cxx | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-)
New commits: commit 2376cc7ce9bd4319f0f011ab13445ceb6817c7f1 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Feb 26 10:21:40 2020 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Feb 26 18:42:13 2020 +0100 fix assert in fdo66141-1.odt after commit ec940941e0bd7db15c5cf7d43df82226e0d849dc Date: Tue Aug 20 17:03:13 2019 +0200 tdf#119388 add new UNO listener/broadcaster it appears that we can have more than one listener per shape because shapes can be in multiple accessibility contexts. Change-Id: I3724f27d5bfe8b5ab3548d4f062d60b071f3f2af Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89500 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx index 814fd99c91ef..ba71be7d8caa 100644 --- a/sw/source/core/access/accmap.cxx +++ b/sw/source/core/access/accmap.cxx @@ -24,6 +24,7 @@ #include <svx/unomod.hxx> #include <algorithm> #include <map> +#include <unordered_map> #include <list> #include <vector> #include <accmap.hxx> @@ -133,7 +134,7 @@ class SwDrawModellListener_Impl : public SfxListener, { mutable ::osl::Mutex maListenerMutex; ::comphelper::OInterfaceContainerHelper2 maEventListeners; - std::unordered_map<css::uno::Reference< css::drawing::XShape >, css::uno::Reference< css::document::XShapeEventListener >> maShapeListeners; + std::unordered_multimap<css::uno::Reference< css::drawing::XShape >, css::uno::Reference< css::document::XShapeEventListener >> maShapeListeners; SdrModel *mpDrawModel; protected: virtual ~SwDrawModellListener_Impl() override; @@ -182,9 +183,7 @@ void SAL_CALL SwDrawModellListener_Impl::addShapeEventListener( { assert(xShape.is() && "no shape?"); osl::MutexGuard aGuard(maListenerMutex); - auto rv = maShapeListeners.emplace(xShape, xListener); - assert(rv.second && "duplicate listener?"); - (void)rv; + maShapeListeners.emplace(xShape, xListener); } void SAL_CALL SwDrawModellListener_Impl::removeShapeEventListener( @@ -192,13 +191,13 @@ void SAL_CALL SwDrawModellListener_Impl::removeShapeEventListener( const uno::Reference< document::XShapeEventListener >& xListener ) { osl::MutexGuard aGuard(maListenerMutex); - auto it = maShapeListeners.find(xShape); - if (it != maShapeListeners.end()) - { - assert(it->second == xListener); - (void)xListener; - maShapeListeners.erase(it); - } + auto [itBegin, itEnd] = maShapeListeners.equal_range(xShape); + for (auto it = itBegin; it != itEnd; ++it) + if (it->second == xListener) + { + maShapeListeners.erase(it); + return; + } } void SwDrawModellListener_Impl::Notify( SfxBroadcaster& /*rBC*/, @@ -246,8 +245,8 @@ void SwDrawModellListener_Impl::Notify( SfxBroadcaster& /*rBC*/, auto pSdrObject = const_cast<SdrObject*>(pSdrHint->GetObject()); uno::Reference<drawing::XShape> xShape(pSdrObject->getUnoShape(), uno::UNO_QUERY); osl::MutexGuard aGuard(maListenerMutex); - auto it = maShapeListeners.find(xShape); - if (it != maShapeListeners.end()) + auto [itBegin, itEnd] = maShapeListeners.equal_range(xShape); + for (auto it = itBegin; it != itEnd; ++it) it->second->notifyShapeEvent(aEvent); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits