sc/inc/table.hxx               |    1 +
 sc/source/core/data/table3.cxx |    8 ++++++++
 sc/source/core/data/table7.cxx |    8 ++++++++
 3 files changed, 17 insertions(+)

New commits:
commit 290d0d779551b84dfa42e0c026ce4d7c0f00ea7a
Author: Kohei Yoshida <kohei.yosh...@collabora.com>
Date:   Sun Jul 27 14:35:37 2014 -0400

    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/10583
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 97ee720..f8928de 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -888,6 +888,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 31cfe2e..3b63f7e 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -755,6 +755,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 f3528dd..b427617 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -79,6 +79,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))
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to