sc/source/core/data/column3.cxx |   35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

New commits:
commit e5440ba8a0f19bbb354b284cec77702fa58bf505
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Thu Feb 18 15:28:14 2021 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Feb 23 09:26:22 2021 +0100

    "delete" also empty Calc cells if it helps mdds (tdf#139820)
    
    With mixed non-empty and empty cells, deleting a range would normally
    mean deleting just the non-empty cell ranges, which would make
    mdds repeatedly move parts of the underlying vector. Including
    empty cells in the range to delete may result in just one pass.
    
    Change-Id: Ia2ebcaba054c6e46f3cf6c964ba883bb600d6ee0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111125
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>
    (cherry picked from commit b9921adae997579915b4600c688719620f9adaf6)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111191

diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index f1a621a985b5..a72619bd1a3a 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -812,6 +812,11 @@ class DeleteAreaHandler
     bool mbDateTime:1;
     ScColumn& mrCol;
 
+    SCROW mLastToDeleteRow1;
+    SCROW mLastToDeleteRow2;
+    SCROW mLastEmptyRow1;
+    SCROW mLastEmptyRow2;
+
 public:
     DeleteAreaHandler(ScDocument& rDoc, InsertDeleteFlags nDelFlag, ScColumn& 
rCol) :
         mrDoc(rDoc),
@@ -820,7 +825,12 @@ public:
         mbString(nDelFlag & InsertDeleteFlags::STRING),
         mbFormula(nDelFlag & InsertDeleteFlags::FORMULA),
         mbDateTime(nDelFlag & InsertDeleteFlags::DATETIME),
-        mrCol(rCol) {}
+        mrCol(rCol),
+        mLastToDeleteRow1(-1),
+        mLastToDeleteRow2(-1),
+        mLastEmptyRow1(-1),
+        mLastEmptyRow2(-1)
+        {}
 
     void operator() (const sc::CellStoreType::value_type& node, size_t 
nOffset, size_t nDataSize)
     {
@@ -858,6 +868,20 @@ public:
             }
             break;
             case sc::element_type_empty:
+            {
+                // See usage below.
+                if( mLastToDeleteRow1 >= 0 )
+                {
+                    SCROW nRow1 = node.position + nOffset;
+                    SCROW nRow2 = nRow1 + nDataSize - 1;
+                    if( nRow1 == mLastToDeleteRow2 + 1 )
+                    {
+                        mLastEmptyRow1 = nRow1;
+                        mLastEmptyRow2 = nRow2;
+                    }
+                }
+                return;
+            }
             default:
                 return;
         }
@@ -865,7 +889,16 @@ public:
         // Tag these cells for deletion.
         SCROW nRow1 = node.position + nOffset;
         SCROW nRow2 = nRow1 + nDataSize - 1;
+        // tdf#139820: Decide whether to include 'empty' cells in the range to 
delete.
+        // This may make sense because if the column contains a mix of empty 
and non-empty
+        // cells, then deleting a range of those cells would normally make 
mdds operate
+        // on ranges of such cells, event though it could simply delete them 
all in one go.
+        if( mLastEmptyRow1 >= 0 && nRow1 == mLastEmptyRow2 + 1 )
+            nRow1 = mLastEmptyRow1;
         maDeleteRanges.set(nRow1, nRow2, true);
+        mLastToDeleteRow1 = nRow1;
+        mLastToDeleteRow2 = nRow2;
+        mLastEmptyRow1 = mLastEmptyRow2 = -1;
     }
 
     void deleteNumeric(const sc::CellStoreType::value_type& node, size_t 
nOffset, size_t nDataSize)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to