[Libreoffice-commits] core.git: Branch 'libreoffice-7-1' - sc/source
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Tue Feb 23 08:26:57 UTC 2021
sc/source/core/data/column3.cxx | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
New commits:
commit e5440ba8a0f19bbb354b284cec77702fa58bf505
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Feb 18 15:28:14 2021 +0100
Commit: Xisco Fauli <xiscofauli at 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.lunak at 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)
More information about the Libreoffice-commits
mailing list