sc/inc/document.hxx              |   13 ++++++
 sc/qa/unit/ucalc.hxx             |    1 
 sc/qa/unit/ucalc_formula.cxx     |   83 +++++++++++++++++++++++++++++++++++++++
 sc/source/core/data/documen3.cxx |   10 ++++
 4 files changed, 107 insertions(+)

New commits:
commit 3d88efbe9ed1c42f2e8ccd2e71724f0cb96d3c3e
Author: Eike Rathke <er...@redhat.com>
Date:   Thu Mar 31 23:34:01 2016 +0200

    unit test for copying nested names during copying sheet
    
    Change-Id: Id165e7e2ce229949b919424338a4938e15aaab4d

diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index d284597..1f469b1 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -151,6 +151,7 @@ public:
     void testFormulaRefUpdateNameExpandRef();
     void testFormulaRefUpdateNameDeleteRow();
     void testFormulaRefUpdateNameCopySheet();
+    void testFormulaRefUpdateNameCopySheetCheckTab( SCTAB Tab, bool 
bCheckNames );
     void testFormulaRefUpdateNameDelete();
     void testFormulaRefUpdateValidity();
     void testMultipleOperations();
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 6c1ac90..634576f 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -3216,6 +3216,89 @@ void Test::testFormulaRefUpdateNameCopySheet()
     m_pDoc->DeleteTab(2);
     m_pDoc->DeleteTab(1);
     m_pDoc->DeleteTab(0);
+    m_pDoc->SetRangeName(nullptr);
+
+    // Test nested names during copying sheet.
+
+    m_pDoc->InsertTab(0, "Test2");
+    ScAddress aPos(0,0,0);
+    bInserted = m_pDoc->InsertNewRangeName( "global", aPos, "$Test2.$A$1");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( aPos.Tab(), "local", aPos, 
"$Test2.$A$2");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( "global_global", aPos, 
"global*100");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( "global_local", aPos, 
"local*1000");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( aPos.Tab(), "local_global", aPos, 
"global*10000");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( aPos.Tab(), "local_local", aPos, 
"local*100000");
+    CPPUNIT_ASSERT(bInserted);
+
+    m_pDoc->SetString(aPos, "=SHEET()");
+    aPos.IncRow();
+    m_pDoc->SetString(aPos, "=A1*10+SHEET()");
+    aPos.IncRow();
+    m_pDoc->SetString(aPos, "=global_global");
+    aPos.IncRow();
+    m_pDoc->SetString(aPos, "=global_local");
+    aPos.IncRow();
+    m_pDoc->SetString(aPos, "=local_global");
+    aPos.IncRow();
+    m_pDoc->SetString(aPos, "=local_local");
+
+    testFormulaRefUpdateNameCopySheetCheckTab( 0, false);
+
+    // Copy sheet after.
+    m_pDoc->CopyTab(0, 1);
+    testFormulaRefUpdateNameCopySheetCheckTab( 0, false);
+    testFormulaRefUpdateNameCopySheetCheckTab( 1, true);
+
+    // Copy sheet before, shifting following now two sheets.
+    m_pDoc->CopyTab(1, 0);
+    testFormulaRefUpdateNameCopySheetCheckTab( 0, true);
+    testFormulaRefUpdateNameCopySheetCheckTab( 1, false);
+    testFormulaRefUpdateNameCopySheetCheckTab( 2, true);
+
+    m_pDoc->DeleteTab(2);
+    m_pDoc->DeleteTab(1);
+    m_pDoc->DeleteTab(0);
+}
+
+void Test::testFormulaRefUpdateNameCopySheetCheckTab( SCTAB nTab, bool 
bCheckNames )
+{
+    if (bCheckNames)
+    {
+        const ScRangeData* pName;
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("GLOBAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name GLOBAL should exist", pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("LOCAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name LOCAL should exist", pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("GLOBAL_GLOBAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name GLOBAL_GLOBAL should exist", 
pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("GLOBAL_LOCAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name GLOBAL_LOCAL should exist", 
pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("LOCAL_GLOBAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name LOCAL_GLOBAL should exist", 
pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("LOCAL_LOCAL");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name LOCAL_LOCAL should exist", 
pName);
+    }
+
+    ScAddress aPos(0,0,0);
+    aPos.SetRow(0);
+    aPos.SetTab(nTab);
+    int nSheet = nTab + 1;
+    CPPUNIT_ASSERT_EQUAL( 1.0 * nSheet, m_pDoc->GetValue(aPos));
+    aPos.IncRow();
+    CPPUNIT_ASSERT_EQUAL( 11.0 * nSheet, m_pDoc->GetValue(aPos));
+    aPos.IncRow();
+    CPPUNIT_ASSERT_EQUAL( 100.0 * nSheet, m_pDoc->GetValue(aPos));
+    aPos.IncRow();
+    CPPUNIT_ASSERT_EQUAL( 11000.0 * nSheet, m_pDoc->GetValue(aPos));
+    aPos.IncRow();
+    CPPUNIT_ASSERT_EQUAL( 10000.0 * nSheet, m_pDoc->GetValue(aPos));
+    aPos.IncRow();
+    CPPUNIT_ASSERT_EQUAL( 1100000.0 * nSheet, m_pDoc->GetValue(aPos));
 }
 
 void Test::testFormulaRefUpdateNameDelete()
commit 58f4f2491b4f1705ad7064131203b0854485fc43
Author: Eike Rathke <er...@redhat.com>
Date:   Thu Mar 31 22:22:12 2016 +0200

    add ScDocument::InsertNewRangeName() for sheet-local scope
    
    Change-Id: Id7e13a31a092e83c9c7cf6334cced45a28000f98

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 8caca17..4502a26 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -569,6 +569,19 @@ public:
      */
     bool InsertNewRangeName( const OUString& rName, const ScAddress& rPos, 
const OUString& rExpr );
 
+    /**
+     * Insert a new named expression to a sheet-local scope.
+     *
+     * @param nTab  sheet for local scope.
+     * @param rName name for the expression.
+     * @param rPos base position.
+     * @param rExpr formula expression to be associated with the name.  The
+     *              current grammar is used to compile this expression.
+     *
+     * @return true if inserted successfully, false otherwise.
+     */
+    bool InsertNewRangeName( SCTAB nTab, const OUString& rName, const 
ScAddress& rPos, const OUString& rExpr );
+
     SCTAB           GetMaxTableNumber() { return 
static_cast<SCTAB>(maTabs.size()) - 1; }
 
     ScRangePairList*    GetColNameRanges() { return &xColNameRanges; }
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index bbc0c42..c6ae38f 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -222,6 +222,16 @@ bool ScDocument::InsertNewRangeName( const OUString& 
rName, const ScAddress& rPo
     return pGlobalNames->insert(pName);
 }
 
+bool ScDocument::InsertNewRangeName( SCTAB nTab, const OUString& rName, const 
ScAddress& rPos, const OUString& rExpr )
+{
+    ScRangeName* pLocalNames = GetRangeName(nTab);
+    if (!pLocalNames)
+        return false;
+
+    ScRangeData* pName = new ScRangeData(this, rName, rExpr, rPos, 
ScRangeData::Type::Name, GetGrammar());
+    return pLocalNames->insert(pName);
+}
+
 const ScRangeData* ScDocument::GetRangeAtBlock( const ScRange& rBlock, 
OUString* pName ) const
 {
     const ScRangeData* pData = nullptr;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to