sc/source/core/tool/formulagroup.cxx |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

New commits:
commit b259185373b2380d00909821e7582b9115d88650
Author: Kohei Yoshida <kohei.yosh...@gmail.com>
Date:   Tue Jul 2 16:47:31 2013 -0400

    Be aware that the top row may not always be the top of the group.
    
    Adjust the length and the starting row position for accordingly.
    
    Change-Id: I2f9c5a515887b98334bad51c5409461d5dd1505d

diff --git a/sc/source/core/tool/formulagroup.cxx 
b/sc/source/core/tool/formulagroup.cxx
index 4754bd0..3dd43e3 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -18,6 +18,8 @@
 
 #include "formula/vectortoken.hxx"
 
+#include <vector>
+
 namespace sc {
 
 ScMatrixRef FormulaGroupInterpreterSoftware::inverseMatrix(const ScMatrix& 
/*rMat*/)
@@ -29,12 +31,16 @@ bool FormulaGroupInterpreterSoftware::interpret(ScDocument& 
rDoc, const ScAddres
                                                 const ScFormulaCellGroupRef& 
xGroup,
                                                 ScTokenArray& rCode)
 {
-    // Until we implement group calculation for real, decompose the group into
-    // individual formula token arrays for individual calculation.
+    // Decompose the group into individual cells and calculate them 
individually.
+
     ScAddress aTmpPos = rTopPos;
-    for (sal_Int32 i = 0; i < xGroup->mnLength; ++i)
+    SCROW nOffset = rTopPos.Row() - xGroup->mnStart;
+    SCROW nLength = xGroup->mnLength - nOffset;
+    std::vector<double> aResults;
+    aResults.reserve(nLength);
+    for (SCROW i = 0; i < nLength; ++i)
     {
-        aTmpPos.SetRow(xGroup->mnStart + i);
+        aTmpPos.SetRow(rTopPos.Row() + i);
         ScTokenArray aCode2;
         for (const formula::FormulaToken* p = rCode.First(); p; p = 
rCode.Next())
         {
@@ -89,11 +95,12 @@ bool FormulaGroupInterpreterSoftware::interpret(ScDocument& 
rDoc, const ScAddres
         aComp.CompileTokenArray(); // Create RPN token array.
         ScInterpreter aInterpreter(pDest, &rDoc, aTmpPos, aCode2);
         aInterpreter.Interpret();
-        pDest->SetResultToken(aInterpreter.GetResultToken().get());
-        pDest->ResetDirty();
-        pDest->SetChanged(true);
+        aResults.push_back(aInterpreter.GetResultToken()->GetDouble());
     } // for loop end (xGroup->mnLength)
 
+    if (!aResults.empty())
+        rDoc.SetFormulaResults(rTopPos, &aResults[0], aResults.size());
+
     return true;
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to