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:
Kohei Yoshida 2014-07-27 14:35:37 -04:00
parent 97f700721e
commit a3fc7f2008
3 changed files with 17 additions and 0 deletions

View File

@ -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 );

View File

@ -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.

View File

@ -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))