summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-07-27 14:35:37 -0400
committerEike Rathke <erack@redhat.com>2014-07-28 08:21:28 +0000
commit0cb7d753b6b51411ab8dd72eab79f855a1d21c4d (patch)
tree5a5f1bfb4ea36669ac5825905f8256906fe11889
parentc5ed29a621396de4fff5e9fa7b61b7303295edc9 (diff)
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 (cherry picked from commit a3fc7f20089062afa4f778e70ba8be84032a30a7) Reviewed-on: https://gerrit.libreoffice.org/10581 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--sc/inc/table.hxx1
-rw-r--r--sc/source/core/data/table3.cxx8
-rw-r--r--sc/source/core/data/table7.cxx8
3 files changed, 17 insertions, 0 deletions
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index c4ad09e9b6b3..c5b58b5efe28 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -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 );
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index ecfd8503f455..91d72905a088 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -756,6 +756,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.
diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx
index f39e529c164d..6ff53de80739 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -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))