summaryrefslogtreecommitdiff
path: root/sc/source/core
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-03-15 15:29:36 -0400
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-03-15 15:33:38 -0400
commit83ee6b640eaf86f9aef6f42a4dd9c8a930cf9135 (patch)
treedec4339aabbfcb812c3ceba13673d0164b6d2bf8 /sc/source/core
parent2e3969cb8bb235fed483ce49ddee5ea731376893 (diff)
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
Diffstat (limited to 'sc/source/core')
-rw-r--r--sc/source/core/data/bcaslot.cxx17
-rw-r--r--sc/source/core/data/documen7.cxx18
-rw-r--r--sc/source/core/inc/bcaslot.hxx14
3 files changed, 32 insertions, 17 deletions
diff --git a/sc/source/core/data/bcaslot.cxx b/sc/source/core/data/bcaslot.cxx
index cccddb0d16fa..2dfc9a7d6ac6 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 d48acbf583b1..658bd8d3448f 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 9bd416c46111..4509cc95134c 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 );
};