tdf#120270 : ScUndoDragDrop - Notifying listeners of the area...

is not enough. This needs to be done recursively, ie notify the
listeners, notify the listeners of the listeners and so on.
ScDocument::BroadcastCells() seems to do exactly that, so lets
use it here intead of collect+notify.

Change-Id: Ifa273fea5f08af661958cd9b4c3d01d9044b8727
Reviewed-on: https://gerrit.libreoffice.org/70044
Reviewed-by: Dennis Francis <dennis.francis@collabora.com>
Tested-by: Dennis Francis <dennis.francis@collabora.com>
(cherry picked from commit 86ba9cdc69976d9cdb7d6ec1a527012647abf10d)
Reviewed-on: https://gerrit.libreoffice.org/70179
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index 4e98282..71e29b1 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -1317,22 +1317,6 @@ void ScUndoDragDrop::DoUndo( ScRange aRange )
    maPaintRanges.Join(aPaintRange);
}

namespace {

class DataChangeNotifier
{
    ScHint const maHint;
public:
    DataChangeNotifier() : maHint(SfxHintId::ScDataChanged, ScAddress()) {}

    void operator() ( SvtListener* p )
    {
        p->Notify(maHint);
    }
};

}

void ScUndoDragDrop::Undo()
{
    mnPaintExtFlags = 0;
@@ -1385,17 +1369,7 @@ void ScUndoDragDrop::Undo()
        DoUndo(aDestRange);
        DoUndo(aSrcRange);

        // Notify all area listeners whose listened areas are partially moved, to
        // recalculate.
        std::vector<SvtListener*> aListeners;
        rDoc.CollectAllAreaListeners(aListeners, aSrcRange, sc::AreaPartialOverlap);

        // 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());

        std::for_each(aListeners.begin(), aListeners.end(), DataChangeNotifier());
        rDoc.BroadcastCells(aSrcRange, SfxHintId::ScDataChanged, false);
    }
    else
        DoUndo(aDestRange);