sc/source/core/data/bcaslot.cxx | 17 ++++++++++++----- sc/source/core/data/documen7.cxx | 18 ++++++++---------- sc/source/core/inc/bcaslot.hxx | 14 ++++++++++++-- 3 files changed, 32 insertions(+), 17 deletions(-)
New commits: commit 83ee6b640eaf86f9aef6f42a4dd9c8a930cf9135 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Sat Mar 15 15:29:36 2014 -0400 Use listener's listening range when re-activating area listeners. Otherwise listeners may end up listening to larger areas than their original listening areas after the relocation. Change-Id: I12a7f49aec1c78611db5c31ba2d18574e91a5416 diff --git a/sc/source/core/data/bcaslot.cxx b/sc/source/core/data/bcaslot.cxx index cccddb0..2dfc9a7 100644 --- a/sc/source/core/data/bcaslot.cxx +++ b/sc/source/core/data/bcaslot.cxx @@ -446,7 +446,7 @@ void ScBroadcastAreaSlot::EraseArea( ScBroadcastAreas::iterator& rIter ) } } -void ScBroadcastAreaSlot::GetAllListeners( const ScRange& rRange, std::vector<SvtListener*>& rListeners ) +void ScBroadcastAreaSlot::GetAllListeners( const ScRange& rRange, std::vector<sc::AreaListener>& rListeners ) { for (ScBroadcastAreas::const_iterator aIter( aBroadcastAreaTbl.begin()), aIterEnd( aBroadcastAreaTbl.end()); aIter != aIterEnd; ++aIter ) @@ -456,11 +456,18 @@ void ScBroadcastAreaSlot::GetAllListeners( const ScRange& rRange, std::vector<Sv ScBroadcastArea* pArea = (*aIter).mpArea; const ScRange& rAreaRange = pArea->GetRange(); - if (!rAreaRange.Intersects(rRange)) + if (!rRange.In(rAreaRange)) continue; SvtBroadcaster::ListenersType& rLst = pArea->GetBroadcaster().GetAllListeners(); - std::copy(rLst.begin(), rLst.end(), std::back_inserter(rListeners)); + SvtBroadcaster::ListenersType::iterator itLst = rLst.begin(), itLstEnd = rLst.end(); + for (; itLst != itLstEnd; ++itLst) + { + sc::AreaListener aEntry; + aEntry.maArea = rAreaRange; + aEntry.mpListener = *itLst; + rListeners.push_back(aEntry); + } } } @@ -993,9 +1000,9 @@ void ScBroadcastAreaSlotMachine::FinallyEraseAreas( ScBroadcastAreaSlot* pSlot ) maAreasToBeErased.swap( aCopy); } -std::vector<SvtListener*> ScBroadcastAreaSlotMachine::GetAllListeners( const ScRange& rRange ) +std::vector<sc::AreaListener> ScBroadcastAreaSlotMachine::GetAllListeners( const ScRange& rRange ) { - std::vector<SvtListener*> aRet; + std::vector<sc::AreaListener> aRet; SCTAB nEndTab = rRange.aEnd.Tab(); for (TableSlotsMap::const_iterator iTab( aTableSlotsMap.lower_bound( rRange.aStart.Tab())); diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index d48acbf..658bd8d 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -140,14 +140,13 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) const ScAddress& rDelta = rHint.getDelta(); // Get all area listeners that listens on the old range, and end their listening. - std::vector<SvtListener*> aAreaListeners = pBASM->GetAllListeners(rSrcRange); + std::vector<sc::AreaListener> aAreaListeners = pBASM->GetAllListeners(rSrcRange); { - std::vector<SvtListener*>::iterator it = aAreaListeners.begin(), itEnd = aAreaListeners.end(); + std::vector<sc::AreaListener>::iterator it = aAreaListeners.begin(), itEnd = aAreaListeners.end(); for (; it != itEnd; ++it) { - SvtListener* p = *it; - pBASM->EndListeningArea(rSrcRange, p); - p->Notify(rHint); // Adjust the references. + pBASM->EndListeningArea(it->maArea, it->mpListener); + it->mpListener->Notify(rHint); // Adjust the references. } } @@ -171,14 +170,13 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) } // Re-start area listeners on the new range. - ScRange aNewRange = rSrcRange; - aNewRange.Move(rDelta.Col(), rDelta.Row(), rDelta.Tab()); { - std::vector<SvtListener*>::iterator it = aAreaListeners.begin(), itEnd = aAreaListeners.end(); + std::vector<sc::AreaListener>::iterator it = aAreaListeners.begin(), itEnd = aAreaListeners.end(); for (; it != itEnd; ++it) { - SvtListener* p = *it; - pBASM->StartListeningArea(aNewRange, p); + ScRange aNewRange = it->maArea; + aNewRange.Move(rDelta.Col(), rDelta.Row(), rDelta.Tab()); + pBASM->StartListeningArea(aNewRange, it->mpListener); } } } diff --git a/sc/source/core/inc/bcaslot.hxx b/sc/source/core/inc/bcaslot.hxx index 9bd416c..4509cc9 100644 --- a/sc/source/core/inc/bcaslot.hxx +++ b/sc/source/core/inc/bcaslot.hxx @@ -28,6 +28,16 @@ #include "global.hxx" #include "brdcst.hxx" +namespace sc { + +struct AreaListener +{ + ScRange maArea; + SvtListener* mpListener; +}; + +} + /** Used in a Unique Associative Container. */ @@ -211,7 +221,7 @@ public: */ void EraseArea( ScBroadcastAreas::iterator& rIter ); - void GetAllListeners( const ScRange& rRange, std::vector<SvtListener*>& rListeners ); + void GetAllListeners( const ScRange& rRange, std::vector<sc::AreaListener>& rListeners ); }; @@ -307,7 +317,7 @@ public: // only for ScBroadcastAreaSlot void FinallyEraseAreas( ScBroadcastAreaSlot* pSlot ); - std::vector<SvtListener*> GetAllListeners( const ScRange& rRange ); + std::vector<sc::AreaListener> GetAllListeners( const ScRange& rRange ); }; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits