diff options
Diffstat (limited to 'sc/source/core/data/documen7.cxx')
-rw-r--r-- | sc/source/core/data/documen7.cxx | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index 6fedfecc91e0..98e5321253a2 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -187,95 +187,6 @@ void ScDocument::BroadcastCells( const ScRange& rRange, SfxHintId nHint, bool bB BroadcastUno(SfxHint(SfxHintId::ScDataChanged)); } -namespace { - -class RefMovedNotifier -{ - const sc::RefMovedHint& mrHint; -public: - explicit RefMovedNotifier( const sc::RefMovedHint& rHint ) : mrHint(rHint) {} - - void operator() ( SvtListener* p ) - { - p->Notify(mrHint); - } -}; - -} - -void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) -{ - if (!pBASM) - // clipboard or undo document. - return; - - const ScRange& rSrcRange = rHint.getRange(); // old range - const ScAddress& rDelta = rHint.getDelta(); - - // Get all area listeners that listens on the old range, and end their listening. - std::vector<sc::AreaListener> aAreaListeners = pBASM->GetAllListeners(rSrcRange, sc::AreaInside); - { - for (auto& rAreaListener : aAreaListeners) - { - pBASM->EndListeningArea(rAreaListener.maArea, rAreaListener.mbGroupListening, rAreaListener.mpListener); - rAreaListener.mpListener->Notify(rHint); // Adjust the references. - } - } - - // 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); - if (!pTab) - continue; - - SCTAB nDestTab = nTab + rDelta.Tab(); - ScTable* pDestTab = FetchTable(nDestTab); - if (!pDestTab) - continue; - - // Move the listeners from the old location to the new. - pTab->TransferListeners( - *pDestTab, rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), - rSrcRange.aEnd.Col(), rSrcRange.aEnd.Row(), rDelta.Col(), rDelta.Row()); - } - - // Re-start area listeners on the new range. - { - ScRange aErrorRange( ScAddress::UNINITIALIZED ); - for (auto& rAreaListener : aAreaListeners) - { - ScRange aNewRange = rAreaListener.maArea; - if (!aNewRange.Move(rDelta.Col(), rDelta.Row(), rDelta.Tab(), aErrorRange)) - { - assert(!"can't move AreaListener"); - } - pBASM->StartListeningArea(aNewRange, rAreaListener.mbGroupListening, rAreaListener.mpListener); - } - } -} - void ScDocument::AreaBroadcast( const ScHint& rHint ) { if ( !pBASM ) |