[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/qa sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Wed Jun 26 20:34:30 PDT 2013


 sc/qa/unit/ucalc.cxx           |   72 +++++++++++++++++++++++++++++++++++++++++
 sc/source/core/data/column.cxx |   36 --------------------
 2 files changed, 73 insertions(+), 35 deletions(-)

New commits:
commit 9b0905350a005c397f790a72b175cb20169c93cf
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Wed Jun 26 23:06:02 2013 -0400

    No need to increment formula row positions in InsertRow().
    
    UpdateReference() which gets called before InsertRow() moves the formula
    positions.
    
    Change-Id: I6d00607a1a1b4463f69bb58610f6ba41871e4475

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 36c3628..c66f3c0 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -237,6 +237,7 @@ public:
     void testUpdateReference();
     void testSearchCells();
     void testSharedFormulas();
+    void testFormulaPosition();
 
     /**
      * Make sure the sheet streams are invalidated properly.
@@ -354,6 +355,7 @@ public:
     CPPUNIT_TEST(testUpdateReference);
     CPPUNIT_TEST(testSearchCells);
     CPPUNIT_TEST(testSharedFormulas);
+    CPPUNIT_TEST(testFormulaPosition);
     CPPUNIT_TEST(testJumpToPrecedentsDependents);
     CPPUNIT_TEST(testSetBackgroundColor);
     CPPUNIT_TEST(testRenameTable);
@@ -6405,6 +6407,76 @@ void Test::testSharedFormulas()
 
 namespace {
 
+bool checkFormulaPosition(ScDocument& rDoc, const ScAddress& rPos)
+{
+    OUString aStr;
+    rPos.Format(aStr, SCA_VALID);
+    const ScFormulaCell* pFC = rDoc.GetFormulaCell(rPos);
+    if (!pFC)
+    {
+        cerr << "Formula cell expected at " << aStr << " but not found." << endl;
+        return false;
+    }
+
+    if (pFC->aPos != rPos)
+    {
+        OUString aStr2;
+        pFC->aPos.Format(aStr2, SCA_VALID);
+        cerr << "Formula cell at " << aStr << " has incorrect position of " << aStr2 << endl;
+        return false;
+    }
+
+    return true;
+}
+
+void checkFormulaPositions(ScDocument& rDoc, const ScAddress& rPos, const SCROW* pRows, size_t nRowCount)
+{
+    ScAddress aPos = rPos;
+    for (size_t i = 0; i < nRowCount; ++i)
+    {
+        SCROW nRow = pRows[i];
+        aPos.SetRow(nRow);
+
+        if (!checkFormulaPosition(rDoc, aPos))
+        {
+            OUString aStr;
+            aPos.Format(aStr, SCA_VALID);
+            std::ostringstream os;
+            os << "Formula cell position failed at " << aStr;
+            CPPUNIT_FAIL(os.str().c_str());
+        }
+    }
+}
+
+}
+
+void Test::testFormulaPosition()
+{
+    m_pDoc->InsertTab(0, "Test");
+
+    ScAddress aPos(0,0,0); // A1
+    m_pDoc->SetString(aPos, "=ROW()");
+    aPos.IncRow(); // A2
+    m_pDoc->SetString(aPos, "=ROW()");
+    aPos.SetRow(3); // A4;
+    m_pDoc->SetString(aPos, "=ROW()");
+
+    {
+        SCROW aRows[] = { 0, 1, 3 };
+        checkFormulaPositions(*m_pDoc, aPos, aRows, SAL_N_ELEMENTS(aRows));
+    }
+
+    m_pDoc->InsertRow(0,0,0,0,1,5); // Insert 5 rows at A2.
+    {
+        SCROW aRows[] = { 0, 6, 8 };
+        checkFormulaPositions(*m_pDoc, aPos, aRows, SAL_N_ELEMENTS(aRows));
+    }
+
+    m_pDoc->DeleteTab(0);
+}
+
+namespace {
+
 bool hasRange(const std::vector<ScTokenRef>& rRefTokens, const ScRange& rRange)
 {
     std::vector<ScTokenRef>::const_iterator it = rRefTokens.begin(), itEnd = rRefTokens.end();
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index de330f5..26edaa9 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1233,43 +1233,9 @@ void ScColumn::InsertRow( SCROW nStartRow, SCSIZE nSize )
     maCellTextAttrs.insert_empty(nStartRow, nSize);
     maCellTextAttrs.resize(MAXROWCOUNT);
 
-    sc::CellStoreType::position_type aPos = maCells.position(nStartRow);
-    sc::CellStoreType::iterator it = maCells.insert_empty(aPos.first, nStartRow, nSize);
+    maCells.insert_empty(nStartRow, nSize);
     maCells.resize(MAXROWCOUNT);
 
-    sc::AutoCalcSwitch aSwitch(*pDocument, false);
-
-    // Get the position of the first affected cell.
-    aPos = maCells.position(it, nStartRow+nSize);
-    it = aPos.first;
-
-    // Update the positions of all affected formula cells.
-    if (it->type == sc::element_type_formula)
-    {
-        sc::formula_block::iterator itf = sc::formula_block::begin(*it->data);
-        sc::formula_block::iterator itfEnd = sc::formula_block::end(*it->data);
-        std::advance(itf, aPos.second);
-        for (; itf != itfEnd; ++itf)
-        {
-            ScFormulaCell& rCell = **itf;
-            rCell.aPos.IncRow(nSize);
-        }
-    }
-
-    for (++it; it != maCells.end(); ++it)
-    {
-        if (it->type != sc::element_type_formula)
-            continue;
-
-        sc::formula_block::iterator itf = sc::formula_block::begin(*it->data);
-        sc::formula_block::iterator itfEnd = sc::formula_block::end(*it->data);
-        for (; itf != itfEnd; ++itf)
-        {
-            ScFormulaCell* pCell = *itf;
-            pCell->aPos.IncRow(nSize);
-        }
-    }
-
     CellStorageModified();
 
     // We *probably* don't need to broadcast here since the parent call seems


More information about the Libreoffice-commits mailing list