fdo#81617: Split formula groups at sort range boundaries.
Otherwise, partially sorting a range may crash, or at best incorrectly update formula references. Change-Id: Iefcb86d205d83ccc5b684048bfd9aadabf6e13eb
This commit is contained in:
@@ -884,6 +884,7 @@ public:
|
||||
formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
|
||||
formula::VectorRefArray FetchVectorRefArray( SCCOL nCol, SCROW nRow1, SCROW nRow2 );
|
||||
|
||||
void SplitFormulaGroups( SCCOL nCol, std::vector<SCROW>& rRows );
|
||||
void UnshareFormulaCells( SCCOL nCol, std::vector<SCROW>& rRows );
|
||||
void RegroupFormulaCells( SCCOL nCol );
|
||||
|
||||
|
@@ -751,6 +751,14 @@ void ScTable::SortReorderByRow(
|
||||
ScSortInfoArray::RowsType* pRows = pArray->GetDataRows();
|
||||
assert(pRows); // In sort-by-row mode we must have data rows already populated.
|
||||
|
||||
// Split formula groups at the sort range boundaries (if applicable).
|
||||
std::vector<SCROW> aRowBounds;
|
||||
aRowBounds.reserve(2);
|
||||
aRowBounds.push_back(nRow1);
|
||||
aRowBounds.push_back(nRow2+1);
|
||||
for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
|
||||
SplitFormulaGroups(nCol, aRowBounds);
|
||||
|
||||
// Cells in the data rows only reference values in the document. Make
|
||||
// a copy before updating the document.
|
||||
|
||||
|
@@ -118,6 +118,14 @@ bool ScTable::HasUniformRowHeight( SCROW nRow1, SCROW nRow2 ) const
|
||||
return nRow2 <= aData.mnRow2;
|
||||
}
|
||||
|
||||
void ScTable::SplitFormulaGroups( SCCOL nCol, std::vector<SCROW>& rRows )
|
||||
{
|
||||
if (!ValidCol(nCol))
|
||||
return;
|
||||
|
||||
sc::SharedFormulaUtil::splitFormulaCellGroups(aCol[nCol].maCells, rRows);
|
||||
}
|
||||
|
||||
void ScTable::UnshareFormulaCells( SCCOL nCol, std::vector<SCROW>& rRows )
|
||||
{
|
||||
if (!ValidCol(nCol))
|
||||
|
Reference in New Issue
Block a user