[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Mon Jun 8 11:55:01 PDT 2015


 sc/source/core/data/document.cxx |   32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

New commits:
commit 97fea63ddf21f48ebb3950952b7d5c6c5f648de4
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Jun 8 20:35:48 2015 +0200

    destroy and reconstruct listeners only if content is affected
    
    Pasting formula content that created a formula group always constructed
    group listeners, then destroyed those listeners again and reconstructed
    the same listeners, because ScDocument::DeleteArea() is called with
    IDF_OBJECTS again if nothing is excluded from paste. Do the listener
    stuff only if one or more of the IDF_CONTENTS bits are set.
    
    Change-Id: I8c6b7f7bb3402590f2b1f3259ee730f26a906cdf

diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 1f4db41..da6f2a9 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -1787,28 +1787,36 @@ void ScDocument::DeleteArea(
     PutInOrder( nCol1, nCol2 );
     PutInOrder( nRow1, nRow2 );
 
-    // Record the positions of top and/or bottom formula groups that intersect
-    // the area borders.
     std::vector<ScAddress> aGroupPos;
-    sc::EndListeningContext aCxt(*this);
-    ScRange aRange(nCol1, nRow1, 0, nCol2, nRow2, 0);
-    for (size_t i = 0; i < maTabs.size(); ++i)
+    // Destroy and reconstruct listeners only if content is affected.
+    bool bDelContent = ((nDelFlag & ~IDF_CONTENTS) != nDelFlag);
+    if (bDelContent)
     {
-        aRange.aStart.SetTab(i);
-        aRange.aEnd.SetTab(i);
+        // Record the positions of top and/or bottom formula groups that intersect
+        // the area borders.
+        sc::EndListeningContext aCxt(*this);
+        ScRange aRange(nCol1, nRow1, 0, nCol2, nRow2, 0);
+        for (size_t i = 0; i < maTabs.size(); ++i)
+        {
+            aRange.aStart.SetTab(i);
+            aRange.aEnd.SetTab(i);
 
-        EndListeningIntersectedGroups(aCxt, aRange, &aGroupPos);
+            EndListeningIntersectedGroups(aCxt, aRange, &aGroupPos);
+        }
+        aCxt.purgeEmptyBroadcasters();
     }
-    aCxt.purgeEmptyBroadcasters();
 
     for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); i++)
         if (maTabs[i])
             if ( rMark.GetTableSelect(i) || bIsUndo )
                 maTabs[i]->DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag, bBroadcast, pBroadcastSpans);
 
-    // Re-start listeners on those top bottom groups that have been split.
-    SetNeedsListeningGroups(aGroupPos);
-    StartNeededListeners();
+    if (bDelContent)
+    {
+        // Re-start listeners on those top bottom groups that have been split.
+        SetNeedsListeningGroups(aGroupPos);
+        StartNeededListeners();
+    }
 }
 
 void ScDocument::DeleteAreaTab(SCCOL nCol1, SCROW nRow1,


More information about the Libreoffice-commits mailing list