diff options
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/core/data/column.cxx | 27 | ||||
-rw-r--r-- | sc/source/core/data/column4.cxx | 3 | ||||
-rw-r--r-- | sc/source/core/data/documen7.cxx | 40 | ||||
-rw-r--r-- | sc/source/core/data/table2.cxx | 7 | ||||
-rw-r--r-- | sc/source/core/data/table7.cxx | 10 |
5 files changed, 51 insertions, 36 deletions
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 2d0a01872303..10da725f64a7 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -3119,33 +3119,6 @@ void ScColumn::BroadcastRecalcOnRefMove() namespace { -class BroadcastRefMovedHandler -{ - const sc::RefMovedHint& mrHint; -public: - BroadcastRefMovedHandler( const sc::RefMovedHint& rHint ) : mrHint(rHint) {} - - void operator() ( size_t, SvtBroadcaster* p ) - { - p->Broadcast(mrHint); - } -}; - -} - -void ScColumn::BroadcastRefMoved( const sc::RefMovedHint& rHint ) -{ - const ScRange& rRange = rHint.getRange(); - SCROW nRow1 = rRange.aStart.Row(); - SCROW nRow2 = rRange.aEnd.Row(); - - // Notify all listeners within specified rows. - BroadcastRefMovedHandler aFunc(rHint); - sc::ProcessBroadcaster(maBroadcasters.begin(), maBroadcasters, nRow1, nRow2, aFunc); -} - -namespace { - class TransferListenersHandler { public: diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx index bf3b8178b475..d1aacddf4adb 100644 --- a/sc/source/core/data/column4.cxx +++ b/sc/source/core/data/column4.cxx @@ -533,6 +533,9 @@ public: void ScColumn::CollectListeners( std::vector<SvtListener*>& rListeners, SCROW nRow1, SCROW nRow2 ) { + if (nRow2 < nRow1 || !ValidRow(nRow1) || !ValidRow(nRow2)) + return; + ListenerCollector aFunc(rListeners); sc::ProcessBroadcaster(maBroadcasters.begin(), maBroadcasters, nRow1, nRow2, aFunc); } diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index 02a75fb2add2..a960c5a7011b 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -130,6 +130,22 @@ void ScDocument::BroadcastCells( const ScRange& rRange, sal_uLong nHint ) BroadcastUno(SfxSimpleHint(SC_HINT_DATACHANGED)); } +namespace { + +class RefMovedNotifier : std::unary_function<SvtListener*, void> +{ + const sc::RefMovedHint& mrHint; +public: + RefMovedNotifier( const sc::RefMovedHint& rHint ) : mrHint(rHint) {} + + void operator() ( SvtListener* p ) + { + p->Notify(mrHint); + } +}; + +} + void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) { if (!pBASM) @@ -150,6 +166,28 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) } } + // Collect all listeners listening into the range. + std::vector<SvtListener*> aListeners; + for (SCTAB nTab = rSrcRange.aStart.Tab(); nTab <= rSrcRange.aEnd.Tab(); ++nTab) + { + ScTable* pTab = FetchTable(nTab); + if (!pTab) + continue; + + pTab->CollectListeners( + aListeners, + rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), + rSrcRange.aEnd.Col(), rSrcRange.aEnd.Row()); + } + + // Remove any duplicate listener entries. We must ensure that we notify + // each unique listener only once. + std::sort(aListeners.begin(), aListeners.end()); + aListeners.erase(std::unique(aListeners.begin(), aListeners.end()), aListeners.end()); + + // Notify the listeners. + std::for_each(aListeners.begin(), aListeners.end(), RefMovedNotifier(rHint)); + for (SCTAB nTab = rSrcRange.aStart.Tab(); nTab <= rSrcRange.aEnd.Tab(); ++nTab) { ScTable* pTab = FetchTable(nTab); @@ -161,8 +199,6 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) if (!pDestTab) continue; - // Adjust the references. - pTab->BroadcastRefMoved(rHint); // Move the listeners from the old location to the new. pTab->TransferListeners( *pDestTab, rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 3f0d190be7bd..1a3780152fcc 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1739,13 +1739,6 @@ void ScTable::BroadcastRecalcOnRefMove() aCol[i].BroadcastRecalcOnRefMove(); } -void ScTable::BroadcastRefMoved( const sc::RefMovedHint& rHint ) -{ - const ScRange& rRange = rHint.getRange(); - for (SCCOL nCol = rRange.aStart.Col(); nCol <= rRange.aEnd.Col(); ++nCol) - aCol[nCol].BroadcastRefMoved(rHint); -} - void ScTable::TransferListeners( ScTable& rDestTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCCOL nColDelta, SCROW nRowDelta ) diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx index 1ede729829dc..ff976a21d25e 100644 --- a/sc/source/core/data/table7.cxx +++ b/sc/source/core/data/table7.cxx @@ -110,4 +110,14 @@ void ScTable::RegroupFormulaCells( SCCOL nCol ) aCol[nCol].RegroupFormulaCells(); } +void ScTable::CollectListeners( + std::vector<SvtListener*>& rListeners, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) +{ + if (nCol2 < nCol1 || !ValidCol(nCol1) || !ValidCol(nCol2)) + return; + + for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) + aCol[nCol].CollectListeners(rListeners, nRow1, nRow2); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |