summaryrefslogtreecommitdiff
path: root/sfx2/source/doc/sfxbasemodel.cxx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-08-26 12:37:07 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-08-26 21:43:33 +0200
commitf0f576d2d91e8baa674fae65b3e2a024f1f81c45 (patch)
tree965b86f86a519dbe46b80f4bb6b7f51e418bbace /sfx2/source/doc/sfxbasemodel.cxx
parent205c47443ea43341cacec52acbe53a470f41acc6 (diff)
fix impress crash in shape listener
after commit ec940941e0bd7db15c5cf7d43df82226e0d849dc Date: Tue Aug 20 17:03:13 2019 +0200 tdf#119388 add new UNO listener/broadcaster grumble grumble stoopid AccessiblePageShape that overrides AccessibleShape but doesn't actually set any shape on it. Also, there appear to multiple copies of something listening to the same shape somewhere, but I didn't track that further. Change-Id: I78713716788dd99b1f56519d960b43e5538c1304 Reviewed-on: https://gerrit.libreoffice.org/78120 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sfx2/source/doc/sfxbasemodel.cxx')
-rw-r--r--sfx2/source/doc/sfxbasemodel.cxx21
1 files changed, 13 insertions, 8 deletions
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index 19cfb2dd49f3..08c5f83ba54d 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -199,7 +199,7 @@ struct IMPL_SfxBaseModel_DataContainer : public ::sfx2::IModifiableDocument
OUString m_aPreusedFilterName ;
::cppu::OMultiTypeInterfaceContainerHelper m_aInterfaceContainer ;
std::unordered_map<css::uno::Reference< css::drawing::XShape >,
- css::uno::Reference< css::document::XShapeEventListener >> maShapeListeners;
+ std::vector<css::uno::Reference< css::document::XShapeEventListener >>> maShapeListeners;
Reference< XInterface > m_xParent ;
Reference< frame::XController > m_xCurrent ;
Reference< document::XDocumentProperties > m_xDocumentProperties ;
@@ -2376,11 +2376,10 @@ void SAL_CALL SfxBaseModel::removeEventListener( const Reference< document::XEve
void SAL_CALL SfxBaseModel::addShapeEventListener( const css::uno::Reference< css::drawing::XShape >& xShape, const Reference< document::XShapeEventListener >& xListener )
{
+ assert(xShape.is() && "no shape?");
SfxModelGuard aGuard( *this, SfxModelGuard::E_INITIALIZING );
- auto rv = m_pData->maShapeListeners.emplace(xShape, xListener);
- assert(rv.second && "duplicate listener?");
- (void)rv;
+ m_pData->maShapeListeners[xShape].push_back(xListener);
}
@@ -2394,9 +2393,14 @@ void SAL_CALL SfxBaseModel::removeShapeEventListener( const css::uno::Reference<
auto it = m_pData->maShapeListeners.find(xShape);
if (it != m_pData->maShapeListeners.end())
{
- assert(it->second == xListener && "removing wrong listener?");
- (void)xListener;
- m_pData->maShapeListeners.erase(it);
+ auto rVec = it->second;
+ auto it2 = std::find(rVec.begin(), rVec.end(), xListener);
+ if (it2 != rVec.end())
+ {
+ rVec.erase(it2);
+ if (rVec.empty())
+ m_pData->maShapeListeners.erase(it);
+ }
}
}
@@ -3256,7 +3260,8 @@ void SfxBaseModel::notifyEvent( const document::EventObject& aEvent ) const
{
auto it = m_pData->maShapeListeners.find(xShape);
if (it != m_pData->maShapeListeners.end())
- it->second->notifyShapeEvent(aEvent);
+ for (auto const & rListenerUnoRef : it->second)
+ rListenerUnoRef->notifyShapeEvent(aEvent);
}
}
}