sc/inc/column.hxx | 6 ++++++ sc/source/core/data/table1.cxx | 12 +++++------- sc/source/core/data/table2.cxx | 3 +++ 3 files changed, 14 insertions(+), 7 deletions(-)
New commits: commit 93c6fdc58d577d059968a71ae08b80096f73ef1a Author: Czeber László Ádám <czeber.laszloa...@nisz.hu> AuthorDate: Thu Jun 8 14:55:34 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Jun 27 22:36:53 2023 +0200 tdf#153437 sc: fix broken formatting without performance regression Follow-up to commit 7be7e1ff95af485a9cb00748800d3d084f96387c "tdf#153437 sc: fix broken formatting at Undo of row/column insertion" by replacing that with a better version without performance regression. This keeps the original performance fix of commit 2e86718626a07e1656661df3ad69a64848bf4614 "don't allocate unnecessary columns when inserting a row" related to the support of 16k columns. The previous fix used extra memory to fix the broken formatting of the cells. I have now solved the error in tdf#153437 without taking extra memory. It doesn't change the reserved cells, it just deletes a row from the default attribute of the cells when deleting rows, so they don't slip. When deleting a column, the last column in the still reserved area loses its formatting. I copied the default value back here, as the other columns have this value. Change-Id: I35da1cb79ff4e3493e91d29766cc2b81412080eb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152742 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> (cherry picked from commit c61f5a5d55c07721f044befc1f6efa0231cd92f6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152814 Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153494 Tested-by: Jenkins diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 949ca30dd137..87d3dc730a9f 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -171,6 +171,7 @@ public: bool TestInsertRow( SCSIZE nSize ) const; void InsertRow( SCROW nStartRow, SCSIZE nSize ); + void DeleteRow( SCROW nStartRow, SCSIZE nSize ); }; // Use protected inheritance to prevent publishing some internal ScColumnData @@ -1054,4 +1055,9 @@ inline void ScColumnData::InsertRow( SCROW nStartRow, SCSIZE nSize ) pAttrArray->InsertRow( nStartRow, nSize ); } +inline void ScColumnData::DeleteRow(SCROW nStartRow, SCSIZE nSize) +{ + pAttrArray->DeleteRow( nStartRow, nSize ); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index 6cb5384c05f9..308025656319 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -1851,13 +1851,11 @@ void ScTable::UpdateReference( } else { - // When deleting row(s) or column(s), allocate the last column - // before updating the references - if (nDx < 0 || nDy < 0) - CreateColumnIfNotExists(rDocument.MaxCol()); - - for (SCCOL col : GetColumnsRange(0, rDocument.MaxCol())) - bUpdated |= CreateColumnIfNotExists(col).UpdateReference(rCxt, pUndoDoc); + for (SCCOL col : GetAllocatedColumnsRange(0, rDocument.MaxCol())) + bUpdated |= aCol[col].UpdateReference(rCxt, pUndoDoc); + // When deleting row(s), delete same row from the default attribute + if (nDy < 0) + aDefaultColData.DeleteRow(nRow1+nDy, -nDy); } if ( bIncludeDraw ) diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 4eb5671f0dc7..91f90dbb1ae4 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -400,6 +400,9 @@ void ScTable::DeleteCol( { for (SCCOL nCol = nStartCol + nSize; nCol < aCol.size(); ++nCol) aCol[nCol].SwapCol(aCol[nCol - nSize]); + // When delete column(s), inicialize the last columns from the default attributes + for (SCCOL nCol = aCol.size() - nSize; nCol < aCol.size(); ++nCol) + aCol[nCol].Init(nCol, aCol[nCol].GetTab(), rDocument, false); } else {