[Libreoffice-commits] core.git: 2 commits - sc/inc sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Mon Jan 27 18:20:25 PST 2014


 sc/inc/document.hxx                |    5 +++
 sc/qa/unit/ucalc.cxx               |   53 ++++++++++++++++++++++++++++++++++++-
 sc/qa/unit/ucalc.hxx               |    2 +
 sc/source/core/data/document10.cxx |   20 +++++++++++++
 sc/source/ui/undo/undoblk.cxx      |    2 +
 5 files changed, 81 insertions(+), 1 deletion(-)

New commits:
commit 3032d08226f77505e7105fb7cfb7f4b4741fd3ca
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Mon Jan 27 21:06:30 2014 -0500

    fdo#74014: Broadcast cells on undoing of "cut".
    
    Change-Id: I0fdf518078c86f259e72307f8011a988555a9235

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 6a980ab..3b106d7 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1808,6 +1808,11 @@ public:
                          */
     void                Broadcast( const ScHint& rHint );
 
+    /**
+     * Cell broadcast in specified range.
+     */
+    void BroadcastCells( const ScRange& rRange, sal_uLong nHint );
+
                         /// only area, no cell broadcast
     void                AreaBroadcast( const ScHint& rHint );
                         /// only areas in range, no cell broadcasts
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index ee3e35d..805fb3c 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -170,4 +170,24 @@ bool ScDocument::CopyOneCellFromClip(
     return true;
 }
 
+void ScDocument::BroadcastCells( const ScRange& rRange, sal_uLong nHint )
+{
+    ScHint aHint(nHint, ScAddress());
+    ScAddress& rPos = aHint.GetAddress();
+
+    for (SCTAB nTab = rRange.aStart.Tab(); nTab <= rRange.aEnd.Tab(); ++nTab)
+    {
+        rPos.SetTab(nTab);
+        for (SCCOL nCol = rRange.aStart.Col(); nCol <= rRange.aEnd.Col(); ++nCol)
+        {
+            rPos.SetCol(nCol);
+            for (SCROW nRow = rRange.aStart.Row(); nRow <= rRange.aEnd.Row(); ++nRow)
+            {
+                rPos.SetRow(nRow);
+                Broadcast(aHint);
+            }
+        }
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index 946ed99..9d83309 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -786,6 +786,8 @@ void ScUndoCut::DoChange( const sal_Bool bUndo )
         ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
         if ( pChangeTrack )
             pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
+
+        pDoc->BroadcastCells(aCopyRange, SC_HINT_DATACHANGED);
     }
     else        // only for Redo
     {
commit fa11b0842a51b59eb131a084310c177235ebe487
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Mon Jan 27 20:22:48 2014 -0500

    fdo#74014: Write unit test for this first.
    
    Change-Id: I59fb04e2d7dc8148064564b900680e1b6e1b5e43

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index c4737cf..257afad 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -3537,7 +3537,6 @@ void Test::testCopyPasteAsLink()
 
 void Test::testCopyPasteTranspose()
 {
-
     m_pDoc->InsertTab(0, OUString("Sheet1"));
     m_pDoc->InsertTab(1, OUString("Sheet2"));
 
@@ -3602,6 +3601,58 @@ void Test::testCopyPasteTranspose()
 
 }
 
+void Test::testUndoCut()
+{
+    m_pDoc->InsertTab(0, "Test");
+
+    sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
+
+    // Insert values into A1:A3.
+    m_pDoc->SetValue(ScAddress(0,0,0), 1.0);
+    m_pDoc->SetValue(ScAddress(0,1,0), 10.0);
+    m_pDoc->SetValue(ScAddress(0,2,0), 100.0);
+
+    // SUM in A4.
+    m_pDoc->SetString(ScAddress(0,3,0), "=SUM(A1:A3)");
+    CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0,3,0));
+
+    // Select A1:A3.
+    ScMarkData aMark;
+    ScRange aRange(0,0,0,0,2,0);
+    aMark.SetMarkArea(aRange);
+    aMark.MarkToMulti();
+
+    // Set up an undo object for cutting A1:A3.
+    ScDocument* pUndoDoc = new ScDocument(SCDOCMODE_UNDO);
+    pUndoDoc->InitUndo(m_pDoc, 0 ,0);
+    m_pDoc->CopyToDocument(aRange, IDF_ALL, false, pUndoDoc);
+    CPPUNIT_ASSERT_EQUAL(  1.0, pUndoDoc->GetValue(ScAddress(0,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 10.0, pUndoDoc->GetValue(ScAddress(0,1,0)));
+    CPPUNIT_ASSERT_EQUAL(100.0, pUndoDoc->GetValue(ScAddress(0,2,0)));
+    ScUndoCut aUndo(&getDocShell(), aRange, aRange.aEnd, aMark, pUndoDoc);
+
+    // "Cut" the selection.
+    m_pDoc->DeleteSelection(IDF_ALL, aMark);
+    CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0,3,0)); // The SUM should be zero after the "cut".
+
+    // Undo it, and check the result.
+    aUndo.Undo();
+    CPPUNIT_ASSERT_EQUAL(  1.0, m_pDoc->GetValue(ScAddress(0,0,0)));
+    CPPUNIT_ASSERT_EQUAL( 10.0, m_pDoc->GetValue(ScAddress(0,1,0)));
+    CPPUNIT_ASSERT_EQUAL(100.0, m_pDoc->GetValue(ScAddress(0,2,0)));
+    CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0,3,0)); // The SUM value should be back to the original.
+
+    // Redo it and check.
+    aUndo.Redo();
+    CPPUNIT_ASSERT_EQUAL(0.0, m_pDoc->GetValue(0,3,0));
+
+    // Undo again.
+    aUndo.Undo();
+    CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0,3,0));
+
+    m_pDoc->DeleteTab(0);
+}
+
 void Test::testMoveBlock()
 {
     m_pDoc->InsertTab(0, "SheetNotes");
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index f6007ff..52fb51f 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -238,6 +238,7 @@ public:
     void testCopyPaste();
     void testCopyPasteAsLink();
     void testCopyPasteTranspose();
+    void testUndoCut();
     void testMoveBlock();
     void testCopyPasteRelativeFormula();
     void testMergedCells();
@@ -390,6 +391,7 @@ public:
     CPPUNIT_TEST(testCopyPaste);
     CPPUNIT_TEST(testCopyPasteAsLink);
     CPPUNIT_TEST(testCopyPasteTranspose);
+    CPPUNIT_TEST(testUndoCut);
     CPPUNIT_TEST(testMoveBlock);
     CPPUNIT_TEST(testCopyPasteRelativeFormula);
     CPPUNIT_TEST(testMergedCells);


More information about the Libreoffice-commits mailing list