sc/qa/unit/ucalc.hxx | 2 + sc/qa/unit/ucalc_formula.cxx | 59 ++++++++++++++++++++++++++++++++++++++++++ sc/source/core/tool/token.cxx | 40 +++++++++++++++++++++++++--- 3 files changed, 97 insertions(+), 4 deletions(-)
New commits: commit 7937984a6a04446c0d3484832e6748ad925ddc80 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Sat Mar 28 15:35:13 2015 +0100 test for tdf#90001 Change-Id: If0cb056d5a5e82bec1f4b863e40ec05b405280ac diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index a60e478..1cec088 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -136,6 +136,7 @@ public: void testFormulaRefUpdate(); void testFormulaRefUpdateRange(); void testFormulaRefUpdateSheets(); + void testFormulaRefUpdateSheetsDelete(); void testFormulaRefUpdateInsertRows(); void testFormulaRefUpdateInsertColumns(); void testFormulaRefUpdateMove(); @@ -456,6 +457,7 @@ public: CPPUNIT_TEST(testFormulaRefUpdate); CPPUNIT_TEST(testFormulaRefUpdateRange); CPPUNIT_TEST(testFormulaRefUpdateSheets); + CPPUNIT_TEST(testFormulaRefUpdateSheetsDelete); CPPUNIT_TEST(testFormulaRefUpdateInsertRows); CPPUNIT_TEST(testFormulaRefUpdateInsertColumns); CPPUNIT_TEST(testFormulaRefUpdateMove); diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index ca731a2..fe7d417 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -1609,6 +1609,65 @@ void Test::testFormulaRefUpdateInsertRows() m_pDoc->DeleteTab(0); } +void Test::testFormulaRefUpdateSheetsDelete() +{ + m_pDoc->InsertTab(0, "Sheet1"); + m_pDoc->InsertTab(1, "Sheet2"); + m_pDoc->InsertTab(2, "Sheet3"); + m_pDoc->InsertTab(3, "Sheet4"); + + m_pDoc->SetString(ScAddress(1,1,1), "=SUM(Sheet1.A2:Sheet3.A2"); + m_pDoc->SetString(ScAddress(2,1,1), "=SUM(Sheet1.A1:Sheet2.A1"); + m_pDoc->SetString(ScAddress(3,1,1), "=SUM(Sheet2.A3:Sheet4.A3"); + + m_pDoc->SetString(ScAddress(1,2,1), "=SUM($Sheet1.A2:$Sheet3.A2"); + m_pDoc->SetString(ScAddress(2,2,1), "=SUM($Sheet1.A1:$Sheet2.A1"); + m_pDoc->SetString(ScAddress(3,2,1), "=SUM($Sheet2.A3:$Sheet4.A3"); + + m_pDoc->DeleteTab(2); + + if (!checkFormula(*m_pDoc, ScAddress(1,1,1), "SUM(Sheet1.A2:Sheet2.A2)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(2,1,1), "SUM(Sheet1.A1:Sheet2.A1)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(3,1,1), "SUM(Sheet2.A3:Sheet4.A3)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(1,2,1), "SUM($Sheet1.A2:$Sheet2.A2)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(2,2,1), "SUM($Sheet1.A1:$Sheet2.A1)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(3,2,1), "SUM($Sheet2.A3:$Sheet4.A3)")) + CPPUNIT_FAIL("Wrong Formula"); + + m_pDoc->DeleteTab(0); + + if (!checkFormula(*m_pDoc, ScAddress(1,1,0), "SUM(Sheet2.A2:Sheet2.A2)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(2,1,0), "SUM(Sheet2.A1:Sheet2.A1)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(3,1,0), "SUM(Sheet2.A3:Sheet4.A3)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM($Sheet2.A2:$Sheet2.A2)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(2,2,0), "SUM($Sheet2.A1:$Sheet2.A1)")) + CPPUNIT_FAIL("Wrong Formula"); + + if (!checkFormula(*m_pDoc, ScAddress(3,2,0), "SUM($Sheet2.A3:$Sheet4.A3)")) + CPPUNIT_FAIL("Wrong Formula"); + + m_pDoc->DeleteTab(0); + m_pDoc->DeleteTab(0); +} + void Test::testFormulaRefUpdateInsertColumns() { sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn auto calc on. commit be1b3daeeb64a44e577510561d02147b87db72c2 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Sat Mar 28 05:43:33 2015 +0100 3D refs with more than one sheet should not set sheets deleted, tdf#90001 Change-Id: I501ad421c283ec6a1f2629aa424f4d4c32228516 diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 6b582ec..ada4f91 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -3373,6 +3373,41 @@ bool adjustSingleRefOnInsertedTab( ScSingleRefData& rRef, SCTAB nInsPos, SCTAB n return false; } +bool adjustDoubleRefOnDeleteTab(ScComplexRefData& rRef, SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos, const ScAddress& rNewPos) +{ + ScSingleRefData& rRef1 = rRef.Ref1; + ScSingleRefData& rRef2 = rRef.Ref2; + ScAddress aStartPos = rRef1.toAbs(rOldPos); + ScAddress aEndPos = rRef2.toAbs(rOldPos); + bool bMoreThanOneTab = aStartPos.Tab() != aEndPos.Tab(); + bool bModified = false; + if (bMoreThanOneTab && aStartPos.Tab() == nDelPos) + { + if (rRef1.IsTabRel()) + { + aStartPos.IncTab(nSheets); + rRef1.SetAddress(aStartPos, rOldPos); + } + bModified = true; + } + else + { + bModified = adjustSingleRefOnDeletedTab(rRef1, nDelPos, nSheets, rOldPos, rNewPos); + } + + if (bMoreThanOneTab && aEndPos.Tab() == nDelPos) + { + aEndPos.IncTab(-nSheets); + rRef2.SetAddress(aEndPos, rNewPos); + bModified = true; + } + else + { + bModified |= adjustSingleRefOnDeletedTab(rRef2, nDelPos, nSheets, rOldPos, rNewPos); + } + return bModified; +} + } sc::RefUpdateResult ScTokenArray::AdjustReferenceOnDeletedTab( sc::RefUpdateDeleteTabContext& rCxt, const ScAddress& rOldPos ) @@ -3400,10 +3435,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnDeletedTab( sc::RefUpdateDele { formula::FormulaToken* pToken = *p; ScComplexRefData& rRef = *pToken->GetDoubleRef(); - if (adjustSingleRefOnDeletedTab(rRef.Ref1, rCxt.mnDeletePos, rCxt.mnSheets, rOldPos, aNewPos)) - aRes.mbReferenceModified = true; - if (adjustSingleRefOnDeletedTab(rRef.Ref2, rCxt.mnDeletePos, rCxt.mnSheets, rOldPos, aNewPos)) - aRes.mbReferenceModified = true; + aRes.mbReferenceModified |= adjustDoubleRefOnDeleteTab(rRef, rCxt.mnDeletePos, rCxt.mnSheets, rOldPos, aNewPos); } break; case svIndex: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits