summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2013-05-20 12:25:19 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2013-05-20 20:19:28 -0400
commita3d2a042916edf54db544db34f89c1f841e69bf5 (patch)
tree7a0bad44994ad5bcd3063e9e7af173a3458e6d71
parentKeep track of column block positions when mass-pasting formula cells. (diff)
downloadcore-a3d2a042916edf54db544db34f89c1f841e69bf5.tar.gz
core-a3d2a042916edf54db544db34f89c1f841e69bf5.zip
Do the same trick when getting broadcasters during mass formula cell deletion.
Change-Id: Iee1b3ff637d10c6bd2d2342db518a2fc986327b7
-rw-r--r--sc/inc/listenercontext.hxx3
-rw-r--r--sc/source/core/data/column2.cxx13
-rw-r--r--sc/source/core/data/listenercontext.cxx7
3 files changed, 20 insertions, 3 deletions
diff --git a/sc/inc/listenercontext.hxx b/sc/inc/listenercontext.hxx
index 2503e726408c..f4fbb0f2a9da 100644
--- a/sc/inc/listenercontext.hxx
+++ b/sc/inc/listenercontext.hxx
@@ -35,10 +35,13 @@ class EndListeningContext : boost::noncopyable
{
ScDocument& mrDoc;
ColumnSpanSet maSet;
+ ColumnBlockPositionSet maPosSet;
public:
EndListeningContext(ScDocument& rDoc);
ScDocument& getDoc();
+ ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
+
void addEmptyBroadcasterPosition(SCTAB nTab, SCCOL nCol, SCROW nRow);
void purgeEmptyBroadcasters();
};
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 828dbe1259c7..fa603f522da0 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2107,10 +2107,19 @@ void ScColumn::StartListening( sc::StartListeningContext& rCxt, SCROW nRow, SvtL
void ScColumn::EndListening( sc::EndListeningContext& rCxt, SCROW nRow, SvtListener& rListener )
{
- SvtBroadcaster* pBC = GetBroadcaster(nRow);
- if (!pBC)
+ sc::ColumnBlockPosition* p = rCxt.getBlockPosition(nTab, nCol);
+ if (!p)
+ return;
+
+ sc::BroadcasterStoreType::iterator& it = p->miBroadcasterPos;
+ std::pair<sc::BroadcasterStoreType::iterator,size_t> aPos = maBroadcasters.position(it, nRow);
+ it = aPos.first; // store the block position for next iteration.
+ if (it->type != sc::element_type_broadcaster)
return;
+ SvtBroadcaster* pBC = sc::custom_broadcaster_block::at(*it->data, aPos.second);
+ OSL_ASSERT(pBC);
+
rListener.EndListening(*pBC);
if (!pBC->HasListeners())
// There is no more listeners for this cell. Add it to the purge list for later purging.
diff --git a/sc/source/core/data/listenercontext.cxx b/sc/source/core/data/listenercontext.cxx
index 7ab3799ad403..f53f1bcae771 100644
--- a/sc/source/core/data/listenercontext.cxx
+++ b/sc/source/core/data/listenercontext.cxx
@@ -40,13 +40,18 @@ ColumnBlockPosition* StartListeningContext::getBlockPosition(SCTAB nTab, SCCOL n
return maSet.getBlockPosition(nTab, nCol);
}
-EndListeningContext::EndListeningContext(ScDocument& rDoc) : mrDoc(rDoc) {}
+EndListeningContext::EndListeningContext(ScDocument& rDoc) : mrDoc(rDoc), maPosSet(rDoc) {}
ScDocument& EndListeningContext::getDoc()
{
return mrDoc;
}
+ColumnBlockPosition* EndListeningContext::getBlockPosition(SCTAB nTab, SCCOL nCol)
+{
+ return maPosSet.getBlockPosition(nTab, nCol);
+}
+
void EndListeningContext::addEmptyBroadcasterPosition(SCTAB nTab, SCCOL nCol, SCROW nRow)
{
maSet.set(nTab, nCol, nRow, true);