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