[Libreoffice-commits] core.git: Branch 'private/kohei/chart-controller-study' - 5 commits - chart2/source sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Fri Apr 11 06:28:45 PDT 2014


 chart2/source/controller/main/ChartController.cxx        |   13 +++
 chart2/source/controller/main/ChartController.hxx        |    4 +
 chart2/source/controller/main/ChartController_Window.cxx |   16 ++++
 sc/qa/unit/ucalc_sharedformula.cxx                       |   26 +++++++
 sc/source/core/data/column4.cxx                          |   54 ++++++++-------
 5 files changed, 88 insertions(+), 25 deletions(-)

New commits:
commit a5120eb4a2f14ee59222ada0b46144a6b80986b7
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Apr 11 09:27:59 2014 -0400

    Several more Window events to intercept for the GL3D chart.
    
    But not painting or resizing events. Those are generic enough that no
    branching is needed.
    
    Change-Id: I0fb186da61c583c5326d2608b2153aced3fab77b

diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx
index 8786b3f..9c8c490 100644
--- a/chart2/source/controller/main/ChartController.cxx
+++ b/chart2/source/controller/main/ChartController.cxx
@@ -1410,6 +1410,19 @@ void ChartController::queryGL3DChart()
     m_bGL3DChart = GL3DHelper::isGL3DDiagram(xDiagram);
 }
 
+void ChartController::executeGL3D_Tracking( const TrackingEvent& /*rTEvt*/ )
+{
+}
+
+void ChartController::executeGL3D_Command( const CommandEvent& /*rCEvt*/ )
+{
+}
+
+bool ChartController::executeGL3D_KeyInput( const KeyEvent& /*rKEvt*/ )
+{
+    return false;
+}
+
 void ChartController::executeGL3D_MouseButtonUp( const MouseEvent& /*rMEvt*/ )
 {
 }
diff --git a/chart2/source/controller/main/ChartController.hxx b/chart2/source/controller/main/ChartController.hxx
index e62904a..0698d56 100644
--- a/chart2/source/controller/main/ChartController.hxx
+++ b/chart2/source/controller/main/ChartController.hxx
@@ -433,6 +433,10 @@ private:
 
     void queryGL3DChart();
 
+    void executeGL3D_Tracking( const TrackingEvent& rTEvt );
+    void executeGL3D_Command( const CommandEvent& rCEvt );
+    bool executeGL3D_KeyInput( const KeyEvent& rKEvt );
+
     void executeGL3D_MouseButtonUp( const MouseEvent& rMEvt );
     void executeGL3D_MouseButtonDown( const MouseEvent& rMEvt );
     void executeGL3D_MouseMove( const MouseEvent& rMEvt );
diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx
index e420b3b..66ea74f 100644
--- a/chart2/source/controller/main/ChartController_Window.cxx
+++ b/chart2/source/controller/main/ChartController_Window.cxx
@@ -746,8 +746,13 @@ void ChartController::execute_MouseMove( const MouseEvent& rMEvt )
     impl_SetMousePointer( rMEvt );
 }
 
-void ChartController::execute_Tracking( const TrackingEvent& /* rTEvt */ )
+void ChartController::execute_Tracking( const TrackingEvent& rTEvt )
 {
+    if (m_bGL3DChart)
+    {
+        executeGL3D_Tracking(rTEvt);
+        return;
+    }
 }
 
 void ChartController::execute_MouseButtonUp( const MouseEvent& rMEvt )
@@ -988,6 +993,12 @@ void ChartController::execute_LoseFocus()
 
 void ChartController::execute_Command( const CommandEvent& rCEvt )
 {
+    if (m_bGL3DChart)
+    {
+        executeGL3D_Command(rCEvt);
+        return;
+    }
+
     bool bIsAction = false;
     {
         SolarMutexGuard aGuard;
@@ -1303,6 +1314,9 @@ void ChartController::execute_Command( const CommandEvent& rCEvt )
 
 bool ChartController::execute_KeyInput( const KeyEvent& rKEvt )
 {
+    if (m_bGL3DChart)
+        return executeGL3D_KeyInput(rKEvt);
+
     bool bReturn=false;
 
     DrawViewWrapper* pDrawViewWrapper = m_pDrawViewWrapper;
commit 4fc780b4d861e0ea0fece5f5e4ff11dc73153470
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Apr 11 00:55:10 2014 -0400

    fdo#77300: Do the same for the shared formula case as well.
    
    Change-Id: I560b0beabe81907e3f85d8845041a9df25d2200d

diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index 7d87177..ec938d8 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -637,23 +637,26 @@ public:
             ScFormulaCell* pTop = *rEntry.mpCells;
             OUString aFormula = pTop->GetHybridFormula();
 
-            // Create a new token array from the hybrid formula string, and
-            // set it to the group.
-            ScCompiler aComp(mrCompileFormulaCxt, pTop->aPos);
-            ScTokenArray* pNewCode = aComp.CompileString(aFormula);
-            ScFormulaCellGroupRef xGroup = pTop->GetCellGroup();
-            assert(xGroup);
-            xGroup->setCode(pNewCode);
-            xGroup->compileCode(*mpDoc, pTop->aPos, mpDoc->GetGrammar());
-
-            // Propagate the new token array to all formula cells in the group.
-            ScFormulaCell** pp = rEntry.mpCells;
-            ScFormulaCell** ppEnd = pp + rEntry.mnLength;
-            for (; pp != ppEnd; ++pp)
+            if (!aFormula.isEmpty())
             {
-                ScFormulaCell* p = *pp;
-                p->SyncSharedCode();
-                p->SetDirty();
+                // Create a new token array from the hybrid formula string, and
+                // set it to the group.
+                ScCompiler aComp(mrCompileFormulaCxt, pTop->aPos);
+                ScTokenArray* pNewCode = aComp.CompileString(aFormula);
+                ScFormulaCellGroupRef xGroup = pTop->GetCellGroup();
+                assert(xGroup);
+                xGroup->setCode(pNewCode);
+                xGroup->compileCode(*mpDoc, pTop->aPos, mpDoc->GetGrammar());
+
+                // Propagate the new token array to all formula cells in the group.
+                ScFormulaCell** pp = rEntry.mpCells;
+                ScFormulaCell** ppEnd = pp + rEntry.mnLength;
+                for (; pp != ppEnd; ++pp)
+                {
+                    ScFormulaCell* p = *pp;
+                    p->SyncSharedCode();
+                    p->SetDirty();
+                }
             }
         }
         else
commit 567f256a48e2f5a697792b8aa1b9edc6e56f5332
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Apr 11 00:53:49 2014 -0400

    fdo#77300: Add more test to cover the shared formula case.
    
    Change-Id: I076cb7b8d5f9b51e7337a512bb86efbabee021a8

diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx
index 603e26e..d482216 100644
--- a/sc/qa/unit/ucalc_sharedformula.cxx
+++ b/sc/qa/unit/ucalc_sharedformula.cxx
@@ -1225,17 +1225,29 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
     // Set single formula with no named range to B5.
     m_pDoc->SetString(ScAddress(1,4,0), "=ROW()");
 
+    // Set shared formula with no named range to B7:B8.
+    m_pDoc->SetString(ScAddress(1,6,0), "=ROW()");
+    m_pDoc->SetString(ScAddress(1,7,0), "=ROW()");
+
     // B1:B3 should be grouped.
     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1,0,0));
     CPPUNIT_ASSERT(pFC);
     CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(0), pFC->GetSharedTopRow());
     CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(3), pFC->GetSharedLength());
 
+    // B7:B8 should be grouped.
+    pFC = m_pDoc->GetFormulaCell(ScAddress(1,6,0));
+    CPPUNIT_ASSERT(pFC);
+    CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(6), pFC->GetSharedTopRow());
+    CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(2), pFC->GetSharedLength());
+
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,0,0)));
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,1,0)));
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,2,0)));
 
     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(1,4,0)));
+    CPPUNIT_ASSERT_EQUAL(7.0, m_pDoc->GetValue(ScAddress(1,6,0)));
+    CPPUNIT_ASSERT_EQUAL(8.0, m_pDoc->GetValue(ScAddress(1,7,0)));
 
     // Set a single formula to C1.
     m_pDoc->SetString(ScAddress(2,0,0), "=AVERAGE(MyRange)");
@@ -1267,6 +1279,10 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
         CPPUNIT_FAIL("Wrong formula!");
     if (!checkFormula(*m_pDoc, ScAddress(1,4,0), "ROW()"))
         CPPUNIT_FAIL("Wrong formula!");
+    if (!checkFormula(*m_pDoc, ScAddress(1,6,0), "ROW()"))
+        CPPUNIT_FAIL("Wrong formula!");
+    if (!checkFormula(*m_pDoc, ScAddress(1,7,0), "ROW()"))
+        CPPUNIT_FAIL("Wrong formula!");
     if (!checkFormula(*m_pDoc, ScAddress(2,0,0), "AVERAGE(MyRange)"))
         CPPUNIT_FAIL("Wrong formula!");
 
@@ -1275,6 +1291,8 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(1,1,0)));
     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(1,2,0)));
     CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(1,4,0)));
+    CPPUNIT_ASSERT_EQUAL(7.0, m_pDoc->GetValue(ScAddress(1,6,0)));
+    CPPUNIT_ASSERT_EQUAL(8.0, m_pDoc->GetValue(ScAddress(1,7,0)));
     CPPUNIT_ASSERT_EQUAL(2.5, m_pDoc->GetValue(ScAddress(2,0,0)));
 
     m_pDoc->DeleteTab(0);
commit b04edce60dab90ab15390e202c8848f943260b2f
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Apr 11 00:43:18 2014 -0400

    fdo#77300: Don't re-compile formulas when the hybrid formula is not there.
    
    Change-Id: I9b0f8d031fec08bb8d92333ff67074fdc739e034

diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index c658124..7d87177 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -661,16 +661,19 @@ public:
             ScFormulaCell* pCell = rEntry.mpCell;
             OUString aFormula = pCell->GetHybridFormula();
 
-            // Create token array from formula string.
-            ScCompiler aComp(mrCompileFormulaCxt, pCell->aPos);
-            ScTokenArray* pNewCode = aComp.CompileString(aFormula);
+            if (!aFormula.isEmpty())
+            {
+                // Create token array from formula string.
+                ScCompiler aComp(mrCompileFormulaCxt, pCell->aPos);
+                ScTokenArray* pNewCode = aComp.CompileString(aFormula);
 
-            // Generate RPN tokens.
-            ScCompiler aComp2(mpDoc, pCell->aPos, *pNewCode);
-            aComp2.CompileTokenArray();
+                // Generate RPN tokens.
+                ScCompiler aComp2(mpDoc, pCell->aPos, *pNewCode);
+                aComp2.CompileTokenArray();
 
-            pCell->SetCode(pNewCode);
-            pCell->SetDirty();
+                pCell->SetCode(pNewCode);
+                pCell->SetDirty();
+            }
         }
     }
 };
commit a85348c5e5334292e26ef67ff027c98131f478aa
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Apr 11 00:34:37 2014 -0400

    fdo#77300: Add test for this.
    
    Change-Id: Ib870d8f115b074a4ad80ee6910f92ba8d4b0c01e

diff --git a/sc/qa/unit/ucalc_sharedformula.cxx b/sc/qa/unit/ucalc_sharedformula.cxx
index acb249a..603e26e 100644
--- a/sc/qa/unit/ucalc_sharedformula.cxx
+++ b/sc/qa/unit/ucalc_sharedformula.cxx
@@ -1222,6 +1222,9 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
     m_pDoc->SetString(ScAddress(1,1,0), "=SUM(MyRange)");
     m_pDoc->SetString(ScAddress(1,2,0), "=SUM(MyRange)");
 
+    // Set single formula with no named range to B5.
+    m_pDoc->SetString(ScAddress(1,4,0), "=ROW()");
+
     // B1:B3 should be grouped.
     ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(1,0,0));
     CPPUNIT_ASSERT(pFC);
@@ -1232,6 +1235,8 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,1,0)));
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,2,0)));
 
+    CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(1,4,0)));
+
     // Set a single formula to C1.
     m_pDoc->SetString(ScAddress(2,0,0), "=AVERAGE(MyRange)");
     pFC = m_pDoc->GetFormulaCell(ScAddress(2,0,0));
@@ -1260,6 +1265,8 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
         CPPUNIT_FAIL("Wrong formula!");
     if (!checkFormula(*m_pDoc, ScAddress(1,2,0), "SUM(MyRange)"))
         CPPUNIT_FAIL("Wrong formula!");
+    if (!checkFormula(*m_pDoc, ScAddress(1,4,0), "ROW()"))
+        CPPUNIT_FAIL("Wrong formula!");
     if (!checkFormula(*m_pDoc, ScAddress(2,0,0), "AVERAGE(MyRange)"))
         CPPUNIT_FAIL("Wrong formula!");
 
@@ -1267,6 +1274,7 @@ void Test::testSharedFormulaUpdateOnNamedRangeChange()
     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(1,0,0)));
     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(1,1,0)));
     CPPUNIT_ASSERT_EQUAL(10.0, m_pDoc->GetValue(ScAddress(1,2,0)));
+    CPPUNIT_ASSERT_EQUAL(5.0, m_pDoc->GetValue(ScAddress(1,4,0)));
     CPPUNIT_ASSERT_EQUAL(2.5, m_pDoc->GetValue(ScAddress(2,0,0)));
 
     m_pDoc->DeleteTab(0);


More information about the Libreoffice-commits mailing list