sc/qa/unit/ucalc.cxx | 26 ++++++++++++++++--------- sc/qa/unit/ucalc.hxx | 3 ++ sc/qa/unit/ucalc_sharedformula.cxx | 38 +++++++++++++++++++++++++++++++++++++ sc/source/core/data/column.cxx | 15 +++++--------- 4 files changed, 64 insertions(+), 18 deletions(-)
New commits: commit c6f020fae150cdbf8a2a64fc41d0f328534c2a51 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 9 23:04:50 2013 -0400 Add test for formula grouping during undo. Change-Id: Ifab98b1eedf4420ed5b609e0684422c8aae0d33c diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index e592ccd..1f13dfe 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -5738,16 +5738,13 @@ void Test::testCopyPaste() ScDocument aClipDoc(SCDOCMODE_CLIP); copyToClip(m_pDoc, aRange, &aClipDoc); - sal_uInt16 nFlags = IDF_ALL; aRange = ScRange(0,1,1,2,1,1);//target: Sheet2.A2:C2 ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO); pUndoDoc->InitUndo(m_pDoc, 1, 1, true, true); - ScMarkData aMarkData2; - aMarkData2.SetMarkArea(aRange); - ScRefUndoData* pRefUndoData= new ScRefUndoData(m_pDoc); - ScUndoPaste aUndo( - &m_xDocShRef, aRange, aMarkData2, pUndoDoc, NULL, IDF_ALL, pRefUndoData, false); - m_pDoc->CopyFromClip(aRange, aMarkData2, nFlags, NULL, &aClipDoc); + boost::scoped_ptr<ScUndoPaste> pUndo(createUndoPaste(*m_xDocShRef, aRange, pUndoDoc)); + ScMarkData aMark; + aMark.SetMarkArea(aRange); + m_pDoc->CopyFromClip(aRange, aMark, IDF_ALL, NULL, &aClipDoc); //check values after copying OUString aString; @@ -5769,13 +5766,13 @@ void Test::testCopyPaste() //check undo and redo - aUndo.Undo(); + pUndo->Undo(); fValue = m_pDoc->GetValue(ScAddress(1,1,1)); ASSERT_DOUBLES_EQUAL_MESSAGE("after undo formula should return nothing", fValue, 0); aString = m_pDoc->GetString(2, 1, 1); CPPUNIT_ASSERT_MESSAGE("after undo string should be removed", aString.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(""))); - aUndo.Redo(); + pUndo->Redo(); fValue = m_pDoc->GetValue(ScAddress(1,1,1)); ASSERT_DOUBLES_EQUAL_MESSAGE("formula should return 2 after redo", fValue, 2); aString = m_pDoc->GetString(2, 1, 1); @@ -6941,6 +6938,17 @@ void Test::pasteFromClip(ScDocument* pDestDoc, const ScRange& rDestRange, ScDocu pDestDoc->CopyFromClip(rDestRange, aMark, IDF_ALL, NULL, pClipDoc); } +ScUndoPaste* Test::createUndoPaste(ScDocShell& rDocSh, const ScRange& rRange, ScDocument* pUndoDoc) +{ + ScDocument* pDoc = rDocSh.GetDocument(); + ScMarkData aMarkData; + aMarkData.SetMarkArea(rRange); + ScRefUndoData* pRefUndoData = new ScRefUndoData(pDoc); + + return new ScUndoPaste( + &rDocSh, rRange, aMarkData, pUndoDoc, NULL, IDF_ALL, pRefUndoData, false); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 1a141a0..513a4c0 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -12,6 +12,8 @@ #include "helper/qahelper.hxx" +class ScUndoPaste; + /** * Temporarily set formula grammar. */ @@ -31,6 +33,7 @@ public: static void clearRange(ScDocument* pDoc, const ScRange& rRange); static void copyToClip(ScDocument* pSrcDoc, const ScRange& rRange, ScDocument* pClipDoc); static void pasteFromClip(ScDocument* pDestDoc, const ScRange& rDestRange, ScDocument* pClipDoc); + static ScUndoPaste* createUndoPaste(ScDocShell& rDocSh, const ScRange& rRange, ScDocument* pUndoDoc); Test(); diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx index 0ce78e9..3fee4dc 100644 --- a/sc/qa/unit/ucalc_sharedformula.cxx +++ b/sc/qa/unit/ucalc_sharedformula.cxx @@ -10,6 +10,7 @@ #include "ucalc.hxx" #include "editutil.hxx" #include "clipparam.hxx" +#include "undoblk.hxx" #include "formula/grammar.hxx" @@ -263,6 +264,43 @@ void Test::testSharedFormulasCopyPaste() CPPUNIT_ASSERT_EQUAL(1, pFC->GetSharedTopRow()); CPPUNIT_ASSERT_EQUAL(9, pFC->GetSharedLength()); + ScRange aRange(1,0,0,1,9,0); // B1:B10 + ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO); + pUndoDoc->InitUndo(m_pDoc, 0, 0, true, true); + m_pDoc->CopyToDocument(aRange, IDF_CONTENTS, false, pUndoDoc); + boost::scoped_ptr<ScUndoPaste> pUndo(createUndoPaste(*m_xDocShRef, aRange, pUndoDoc)); + + // First, make sure the formula cells are shared in the undo document. + aPos.SetCol(1); + for (SCROW i = 0; i <= 9; ++i) + { + aPos.SetRow(i); + pFC = pUndoDoc->GetFormulaCell(aPos); + CPPUNIT_ASSERT_MESSAGE("Must be a formula cell.", pFC); + CPPUNIT_ASSERT_EQUAL(0, pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(10, pFC->GetSharedLength()); + } + + // Overwrite B1:B10. + for (SCROW i = 0; i <= 9; ++i) + m_pDoc->SetValue(ScAddress(1,i,0), i*10); + + for (SCROW i = 0; i <= 9; ++i) + CPPUNIT_ASSERT_MESSAGE("Numeric cell was expected.", m_pDoc->GetCellType(ScAddress(1,i,0)) == CELLTYPE_VALUE); + + // Undo the action to fill B1:B10 with formula cells again. + pUndo->Undo(); + + aPos.SetCol(1); + for (SCROW i = 0; i <= 9; ++i) + { + aPos.SetRow(i); + pFC = m_pDoc->GetFormulaCell(aPos); + CPPUNIT_ASSERT_MESSAGE("This should be a formula cell.", pFC); + CPPUNIT_ASSERT_EQUAL(0, pFC->GetSharedTopRow()); + CPPUNIT_ASSERT_EQUAL(10, pFC->GetSharedLength()); + } + m_pDoc->DeleteTab(0); } commit f69b88bc6074bca58e450b37beb68e5a2c007405 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Tue Jul 9 22:56:30 2013 -0400 Grouping of formula cells during undo. Change-Id: I57693eee34a073cd3f39fdd4f5a74eafb12c9dc7 diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index c69a3c1..7ce2d5b 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1572,7 +1572,6 @@ class CopyAsLinkHandler sc::ColumnBlockPosition maDestPos; sc::ColumnBlockPosition* mpDestPos; sal_uInt16 mnCopyFlags; - std::vector<ScFormulaCell*> maCellBuffer; void setDefaultAttrToDest(size_t nRow) { @@ -1602,13 +1601,12 @@ class CopyAsLinkHandler { size_t nTopRow = aNode.position + nOffset; - maCellBuffer.clear(); - maCellBuffer.reserve(nDataSize); - for (size_t i = 0; i < nDataSize; ++i) - maCellBuffer.push_back(createRefCell(nTopRow + i)); + { + SCROW nRow = nTopRow + i; + mrDestCol.SetFormulaCell(maDestPos, nRow, createRefCell(nRow)); + } - maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nTopRow, maCellBuffer.begin(), maCellBuffer.end()); setDefaultAttrsToDest(nTopRow, nDataSize); } @@ -1727,7 +1725,7 @@ class CopyByCloneHandler // Clone as formula cell. ScFormulaCell* pCell = new ScFormulaCell(rSrcCell, mrDestCol.GetDoc(), aDestPos); pCell->SetDirtyVar(); - maDestPos.miCellPos = mrDestCol.GetCellStore().set(maDestPos.miCellPos, nRow, pCell); + mrDestCol.SetFormulaCell(maDestPos, nRow, pCell); setDefaultAttrToDest(nRow); return; } @@ -1743,8 +1741,7 @@ class CopyByCloneHandler // error codes are cloned with values ScFormulaCell* pErrCell = new ScFormulaCell(&mrDestCol.GetDoc(), aDestPos); pErrCell->SetErrCode(nErr); - maDestPos.miCellPos = mrDestCol.GetCellStore().set( - maDestPos.miCellPos, nRow, new ScFormulaCell(rSrcCell, mrDestCol.GetDoc(), aDestPos)); + mrDestCol.SetFormulaCell(maDestPos, nRow, pErrCell); setDefaultAttrToDest(nRow); return; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits