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

Eike Rathke erack at redhat.com
Fri Apr 29 22:30:57 UTC 2016


 sc/inc/document.hxx                 |   12 +++++++++++-
 sc/inc/rangenam.hxx                 |   20 ++++++++++++++++++++
 sc/qa/unit/ucalc_formula.cxx        |   16 ++++++++++++++++
 sc/source/core/data/documen2.cxx    |   18 +++++++++++++++++-
 sc/source/core/data/document10.cxx  |    7 +++++--
 sc/source/core/data/formulacell.cxx |    2 +-
 sc/source/core/tool/rangenam.cxx    |   16 ++++++++++++++++
 7 files changed, 86 insertions(+), 5 deletions(-)

New commits:
commit 02a8589553b5ce0e57a7ee9e66327376125b4378
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 29 22:05:05 2016 +0200

    Resolves: tdf#76523 copy used names or pointing to sheet to other document
    
    Change-Id: I767ed1f212c257741fd982e8bbd0882a29d439c1

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a38279f..05b93f3 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -628,11 +628,21 @@ public:
                 position of the existing name adjusted for Tab.
                 rOldPos.nTab MUST point to the old sheet copied from.
 
+        @param  bGlobalNamesToLocal
+                If TRUE, affected global names are copied to sheet-local names.
+                If FALSE, global names are copied to global names in another document.
+
+        @param  bUsedByFormula
+                If TRUE, forces a global name to be affected/used.
+                If FALSE, a global name is only affected if it evaluates to be
+                referencing the sheet.
+
         @return TRUE if copied and caller may need to evaluate rpRangeData and rSheet and rIndex.
                 FALSE if nothing to be done.
      */
     bool CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData, ScDocument& rNewDoc,
-            const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal) const;
+            const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal,
+            const bool bUsedByFormula ) const;
 
     /**
      * Call this immediately before updating all named ranges.
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index a393463..e92b6a8 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -987,6 +987,14 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos,
             nDestPos = std::min(nDestPos, (SCTAB)(GetTableCount() - 1));
             {   // scope for bulk broadcast
                 ScBulkBroadcast aBulkBroadcast( pBASM);
+                if (!bResultsOnly)
+                {
+                    const bool bGlobalNamesToLocal = false;
+                    const ScRangeName* pNames = pSrcDoc->GetRangeName( nSrcPos);
+                    if (pNames)
+                        pNames->CopyUsedNames( nSrcPos, nSrcPos, nDestPos, *pSrcDoc, *this, bGlobalNamesToLocal);
+                    pSrcDoc->GetRangeName()->CopyUsedNames( -1, nSrcPos, nDestPos, *pSrcDoc, *this, bGlobalNamesToLocal);
+                }
                 pSrcDoc->maTabs[nSrcPos]->CopyToTable(aCxt, 0, 0, MAXCOL, MAXROW,
                         ( bResultsOnly ? InsertDeleteFlags::ALL & ~InsertDeleteFlags::FORMULA : InsertDeleteFlags::ALL),
                         false, maTabs[nDestPos] );
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index f7ed6e8..4690f9b 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -656,7 +656,8 @@ ScRangeData* copyRangeNames( SheetIndexMap& rSheetIndexMap, std::vector<ScRangeD
 }   // namespace
 
 bool ScDocument::CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRangeData*& rpRangeData,
-        ScDocument& rNewDoc, const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal) const
+        ScDocument& rNewDoc, const ScAddress& rNewPos, const ScAddress& rOldPos, const bool bGlobalNamesToLocal,
+        const bool bUsedByFormula ) const
 {
     const bool bSameDoc = (rNewDoc.GetPool() == const_cast<ScDocument*>(this)->GetPool());
     if (bSameDoc && ((rSheet < 0 && !bGlobalNamesToLocal) || (rSheet >= 0 && rSheet != rOldPos.Tab())))
@@ -725,7 +726,9 @@ bool ScDocument::CopyAdjustRangeName( SCTAB& rSheet, sal_uInt16& rIndex, ScRange
     // If no range name was found copy it.
     if (!rpRangeData)
     {
-        bool bEarlyBailOut = (nOldSheet < 0 && bSameDoc);
+        // Do not copy global name if it doesn't reference sheet or is not used
+        // by a formula copied to another document.
+        bool bEarlyBailOut = (nOldSheet < 0 && (bSameDoc || !bUsedByFormula));
         MightReferenceSheet eMightReference = mightRangeNameReferenceSheet( pOldRangeData, nOldTab);
         if (bEarlyBailOut && eMightReference == MightReferenceSheet::NONE)
             return false;
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index b61d89c..6e3bbca 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -430,7 +430,7 @@ void adjustRangeName(formula::FormulaToken* pToken, ScDocument& rNewDoc, const S
     ScRangeData* pRangeData = nullptr;
     SCTAB nSheet = pToken->GetSheet();
     sal_uInt16 nIndex = pToken->GetIndex();
-    if (!pOldDoc->CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, rNewPos, rOldPos, bGlobalNamesToLocal))
+    if (!pOldDoc->CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, rNewPos, rOldPos, bGlobalNamesToLocal, true))
         return; // nothing to do
 
     if (!pRangeData)
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 89500ac..62b90c7 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -797,7 +797,7 @@ void ScRangeName::CopyUsedNames( const SCTAB nLocalTab, const SCTAB nOldTab, con
         ScAddress aNewPos( aOldPos);
         aNewPos.SetTab( nNewTab);
         ScRangeData* pRangeData = nullptr;
-        rOldDoc.CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, aNewPos, aOldPos, bGlobalNamesToLocal);
+        rOldDoc.CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, aNewPos, aOldPos, bGlobalNamesToLocal, false);
     }
 }
 
commit 8162cf2a005be68262525c2a11947fa0e10d15ed
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 29 21:55:51 2016 +0200

    unit test for copying names not used in formulas during sheet-copy
    
    ... but global or local name references copied sheet, or all local names.
    
    Change-Id: I84b22f444b72b032a339d5826989ad934cc10981

diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index a58ec4d..d47ea6a 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -3045,10 +3045,18 @@ void Test::testFormulaRefUpdateNameCopySheet()
     CPPUNIT_ASSERT(bInserted);
     bInserted = m_pDoc->InsertNewRangeName( "global_local", aPos, "local*1000");
     CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( "global_unused", aPos, "$Test2.$A$1");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( "global_unused_noref", aPos, "42");
+    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);
+    bInserted = m_pDoc->InsertNewRangeName( aPos.Tab(), "local_unused", aPos, "$Test2.$A$2");
+    CPPUNIT_ASSERT(bInserted);
+    bInserted = m_pDoc->InsertNewRangeName( aPos.Tab(), "local_unused_noref", aPos, "23");
+    CPPUNIT_ASSERT(bInserted);
 
     m_pDoc->SetString(aPos, "=SHEET()");
     aPos.IncRow();
@@ -3093,10 +3101,18 @@ void Test::testFormulaRefUpdateNameCopySheetCheckTab( SCTAB nTab, bool bCheckNam
         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("GLOBAL_UNUSED");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name GLOBAL_UNUSED should exist", pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("GLOBAL_UNUSED_NOREF");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name GLOBAL_UNUSED_NOREF should not 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);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("LOCAL_UNUSED");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name LOCAL_UNUSED should exist", pName);
+        pName = m_pDoc->GetRangeName(nTab)->findByUpperName("LOCAL_UNUSED_NOREF");
+        CPPUNIT_ASSERT_MESSAGE("Sheet-local name LOCAL_UNUSED_NOREF should exist", pName);
     }
 
     ScAddress aPos(0,0,0);
commit 043df58d1acf247f6ea85985b0531de41906bd4f
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 29 20:17:56 2016 +0200

    during copying sheet copy all global and sheet-local names pointing to it
    
    ... not just names that are used by formula cells copied along.
    
    Change-Id: Ibe7d0e4b45c8e4c68dbaa1f570903e942be85087

diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 0d7b311..a393463 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -873,10 +873,18 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM
     if (bValid)
     {
         SetNoListening( true );     // noch nicht bei CopyToTable/Insert
+
+        const bool bGlobalNamesToLocal = true;
+        const SCTAB nRealOldPos = (nNewPos < nOldPos) ? nOldPos - 1 : nOldPos;
+        const ScRangeName* pNames = GetRangeName( nOldPos);
+        if (pNames)
+            pNames->CopyUsedNames( nOldPos, nRealOldPos, nNewPos, *this, *this, bGlobalNamesToLocal);
+        GetRangeName()->CopyUsedNames( -1, nRealOldPos, nNewPos, *this, *this, bGlobalNamesToLocal);
+
         sc::CopyToDocContext aCopyDocCxt(*this);
         maTabs[nOldPos]->CopyToTable(aCopyDocCxt, 0, 0, MAXCOL, MAXROW, InsertDeleteFlags::ALL,
                 (pOnlyMarked != nullptr), maTabs[nNewPos], pOnlyMarked,
-                false /*bAsLink*/, true /*bColRowFlags*/, true /*bGlobalNamesToLocal*/ );
+                false /*bAsLink*/, true /*bColRowFlags*/, bGlobalNamesToLocal );
         maTabs[nNewPos]->SetTabBgColor(maTabs[nOldPos]->GetTabBgColor());
 
         SCTAB nDz = nNewPos - nOldPos;
commit 450a10d5fb193ec2a7d85ae604790b9dda1e3602
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Apr 29 15:56:24 2016 +0200

    introduce ScRangeName::CopyUsedNames()
    
    Change-Id: I2f3e88f70e5d7b9b4728f5bdd0a8237c7bcc7dcb

diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index c3fff07..a7a5aa8 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -213,6 +213,26 @@ public:
      */
     void CompileUnresolvedXML( sc::CompileFormulaContext& rCxt );
 
+    /** Copy names while copying a sheet if they reference the sheet to be copied.
+
+        Assumes that new sheet was already inserted, global names have been
+        updated/adjusted, but sheet-local names on nOldTab are not, as is the
+        case in ScDocument::CopyTab()
+
+        @param  nLocalTab
+                -1 when operating on global names, else sheet/tab of
+                sheet-local name scope. The already adjusted tab on which to
+                find the name.
+
+        @param  nOldTab
+                The original unadjusted tab position.
+
+        @param  nNewTab
+                The new tab position.
+     */
+    void CopyUsedNames( const SCTAB nLocalTab, const SCTAB nOldTab, const SCTAB nNewTab,
+            const ScDocument& rOldDoc, ScDocument& rNewDoc, const bool bGlobalNamesToLocal ) const;
+
     SC_DLLPUBLIC const_iterator begin() const;
     SC_DLLPUBLIC const_iterator end() const;
     SC_DLLPUBLIC iterator begin();
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index a9ab515..89500ac 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -785,6 +785,22 @@ void ScRangeName::CompileUnresolvedXML( sc::CompileFormulaContext& rCxt )
     }
 }
 
+void ScRangeName::CopyUsedNames( const SCTAB nLocalTab, const SCTAB nOldTab, const SCTAB nNewTab,
+        const ScDocument& rOldDoc, ScDocument& rNewDoc, const bool bGlobalNamesToLocal ) const
+{
+    for (auto const& itr : m_Data)
+    {
+        SCTAB nSheet = (nLocalTab < 0) ? nLocalTab : nOldTab;
+        sal_uInt16 nIndex = itr.second->GetIndex();
+        ScAddress aOldPos( itr.second->GetPos());
+        aOldPos.SetTab( nOldTab);
+        ScAddress aNewPos( aOldPos);
+        aNewPos.SetTab( nNewTab);
+        ScRangeData* pRangeData = nullptr;
+        rOldDoc.CopyAdjustRangeName( nSheet, nIndex, pRangeData, rNewDoc, aNewPos, aOldPos, bGlobalNamesToLocal);
+    }
+}
+
 ScRangeName::const_iterator ScRangeName::begin() const
 {
     return m_Data.begin();


More information about the Libreoffice-commits mailing list