[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - sc/inc sc/qa sc/source

Kohei Yoshida kohei.yoshida at gmail.com
Mon Jul 29 21:11:09 PDT 2013


 sc/inc/column.hxx                        |    5 ++--
 sc/inc/formulacell.hxx                   |    3 +-
 sc/inc/rangenam.hxx                      |    3 ++
 sc/inc/refupdatecontext.hxx              |   35 ++++++++++++++++++++++------
 sc/inc/table.hxx                         |    3 +-
 sc/inc/tokenarray.hxx                    |    3 +-
 sc/qa/unit/ucalc_formula.cxx             |   10 ++++++++
 sc/source/core/data/column.cxx           |   20 ++++++++--------
 sc/source/core/data/documen2.cxx         |    8 ++++--
 sc/source/core/data/document.cxx         |   11 +++++---
 sc/source/core/data/formulacell.cxx      |   14 +++++++----
 sc/source/core/data/refupdatecontext.cxx |   33 ++++++++++++++------------
 sc/source/core/data/table1.cxx           |   21 ++++++++---------
 sc/source/core/tool/rangenam.cxx         |   20 +++++++++++-----
 sc/source/core/tool/token.cxx            |   38 +++++++++++++++++++++----------
 15 files changed, 150 insertions(+), 77 deletions(-)

New commits:
commit 3cec25591b32237e8b2e08eabe73d05be6af1f3b
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date:   Tue Jul 30 00:11:06 2013 -0400

    Handle named range update on sheet insertion.
    
    Change-Id: I05b43bad84333ac8aeee7928898bdd90eed53c38

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 9850840..03d05e1 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -48,6 +48,7 @@ namespace sc {
     struct ColumnBlockPosition;
     class SingleColumnSpanSet;
     struct RefUpdateContext;
+    struct RefUpdateInsertTabContext;
 }
 
 class Fraction;
@@ -322,8 +323,8 @@ public:
      */
     bool UpdateReference( const sc::RefUpdateContext& rCxt, ScDocument* pUndoDoc = NULL );
 
-    void UpdateInsertTab(SCTAB nInsPos, SCTAB nNewSheets = 1);
-    void UpdateInsertTabOnlyCells(SCTAB nInsPos, SCTAB nNewSheets = 1);
+    void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
+    void UpdateInsertTabOnlyCells( sc::RefUpdateInsertTabContext& rCxt );
     void UpdateDeleteTab(SCTAB nDelPos, SCTAB nSheets = 1);
     void        UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo);
     void        UpdateCompile( bool bForceIfNameInUse = false );
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index d19c01c..4c41305 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -33,6 +33,7 @@ namespace sc {
 class StartListeningContext;
 class EndListeningContext;
 struct RefUpdateContext;
+struct RefUpdateInsertTabContext;
 
 }
 
@@ -209,7 +210,7 @@ public:
 
     void            UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY );
 
-    void            UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets = 1);
+    void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
     void            UpdateInsertTabAbs(SCTAB nTable);
     bool UpdateDeleteTab(SCTAB nTable, SCTAB nSheets = 1);
     void            UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo);
diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index a040a6b..cceb4d6 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -35,6 +35,7 @@ class ScTokenArray;
 
 namespace sc {
     struct RefUpdateContext;
+    struct RefUpdateInsertTabContext;
 }
 
 typedef sal_uInt16 RangeType;
@@ -141,6 +142,7 @@ public:
     bool                        IsRangeAtBlock( const ScRange& ) const;
 
     void UpdateTabRef(SCTAB nOldTable, TabRefUpdateMode eMode, SCTAB nNewTable, SCTAB nNewSheets);
+    void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt, SCTAB nLocalTab = -1 );
 
     void            ValidateTabRefs();
 
@@ -189,6 +191,7 @@ public:
     SC_DLLPUBLIC const ScRangeData* findByUpperName(const OUString& rName) const;
     SC_DLLPUBLIC ScRangeData* findByIndex(sal_uInt16 i) const;
     void UpdateReference( sc::RefUpdateContext& rCxt, SCTAB nLocalTab = -1 );
+    void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt, SCTAB nLocalTab = -1 );
     void UpdateTabRef(SCTAB nTable, ScRangeData::TabRefUpdateMode eMode, SCTAB nNewTable = 0, SCTAB nNewSheets = 1);
     void UpdateTranspose(const ScRange& rSource, const ScAddress& rDest);
     void UpdateGrow(const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY);
diff --git a/sc/inc/refupdatecontext.hxx b/sc/inc/refupdatecontext.hxx
index 6bb4e73..036ee9a 100644
--- a/sc/inc/refupdatecontext.hxx
+++ b/sc/inc/refupdatecontext.hxx
@@ -20,11 +20,28 @@ class ScDocument;
 
 namespace sc {
 
-struct RefUpdateContext
+/**
+ * Keep track of all named expressions that have been updated during
+ * reference update.
+ */
+class UpdatedRangeNames
 {
     typedef boost::unordered_set<sal_uInt16> NameIndicesType;
     typedef boost::unordered_map<SCTAB, NameIndicesType> UpdatedNamesType;
 
+    UpdatedNamesType maUpdatedNames;
+
+public:
+    void setUpdatedName(SCTAB nTab, sal_uInt16 nIndex);
+    bool isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const;
+};
+
+/**
+ * Context for reference update during shifting, moving or copying of cell
+ * ranges.
+ */
+struct RefUpdateContext
+{
     ScDocument& mrDoc;
 
     /**
@@ -48,17 +65,12 @@ struct RefUpdateContext
     /** Amount and direction of movement in the sheet direction. */
     SCTAB mnTabDelta;
 
-    /** All named expressions that have been updated during this reference
-     *  update run. */
-    UpdatedNamesType maUpdatedNames;
+    UpdatedRangeNames maUpdatedNames;
 
     RefUpdateContext(ScDocument& rDoc);
 
     bool isInserted() const;
     bool isDeleted() const;
-
-    void setUpdatedName(SCTAB nTab, sal_uInt16 nIndex);
-    bool isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const;
 };
 
 struct RefUpdateResult
@@ -71,6 +83,15 @@ struct RefUpdateResult
     RefUpdateResult(const RefUpdateResult& r);
 };
 
+struct RefUpdateInsertTabContext
+{
+    SCTAB mnInsertPos;
+    SCTAB mnSheets;
+    UpdatedRangeNames maUpdatedNames;
+
+    RefUpdateInsertTabContext(SCTAB nInsertPos, SCTAB nSheets);
+};
+
 }
 
 #endif
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 14c68ec..95b7feb 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -60,6 +60,7 @@ namespace sc {
     class ColumnSpanSet;
     struct ColumnBlockPosition;
     struct RefUpdateContext;
+    struct RefUpdateInsertTabContext;
 }
 
 class SfxItemSet;
@@ -514,7 +515,7 @@ public:
 
     void        UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY );
 
-    void        UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets = 1);
+    void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt );
     void UpdateDeleteTab( SCTAB nTable, SCTAB nSheets = 1 );
     void        UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo, ScProgress* pProgress );
     void        UpdateCompile( bool bForceIfNameInUse = false );
diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index 54bd2fb..f2d59ce 100644
--- a/sc/inc/tokenarray.hxx
+++ b/sc/inc/tokenarray.hxx
@@ -30,6 +30,7 @@
 namespace sc {
 
 struct RefUpdateContext;
+struct RefUpdateInsertTabContext;
 struct RefUpdateResult;
 
 }
@@ -153,7 +154,7 @@ public:
      */
     bool AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, const ScAddress& rOldPos );
 
-    bool AdjustReferenceOnInsertedTab( SCTAB nInsPos, SCTAB nSheets, const ScAddress& rOldPos );
+    sc::RefUpdateResult AdjustReferenceOnInsertedTab( sc::RefUpdateInsertTabContext& rCxt, const ScAddress& rOldPos );
 
     void AdjustReferenceOnMovedTab( SCTAB nOldPos, SCTAB nNewPos, const ScAddress& rOldPos );
 
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index d082c19..1dba453 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -1049,6 +1049,16 @@ void Test::testFormulaRefUpdateNamedExpression()
     m_pDoc->SetValue(ScAddress(3,9,0), 20);
     CPPUNIT_ASSERT_EQUAL(43.0, m_pDoc->GetValue(ScAddress(2,7,0)));
 
+    // Insert a new sheet before the current.
+    m_pDoc->InsertTab(0, "New");
+    m_pDoc->CalcAll();
+    OUString aName;
+    m_pDoc->GetName(1, aName);
+    CPPUNIT_ASSERT_EQUAL(OUString("Formula"), aName);
+    CPPUNIT_ASSERT_EQUAL(43.0, m_pDoc->GetValue(ScAddress(2,7,1)));
+
+    m_pDoc->DeleteTab(0);
+
     m_pDoc->DeleteTab(0);
 }
 
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 2e63c90..c338369 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2403,6 +2403,7 @@ public:
 
 class InsertTabUpdater
 {
+    sc::RefUpdateInsertTabContext& mrCxt;
     sc::CellTextAttrStoreType& mrTextAttrs;
     sc::CellTextAttrStoreType::iterator miAttrPos;
     SCTAB mnTab;
@@ -2411,17 +2412,16 @@ class InsertTabUpdater
     bool mbModified;
 
 public:
-    InsertTabUpdater(sc::CellTextAttrStoreType& rTextAttrs, SCTAB nTab, SCTAB nInsPos, SCTAB nNewSheets) :
+    InsertTabUpdater(sc::RefUpdateInsertTabContext& rCxt, sc::CellTextAttrStoreType& rTextAttrs, SCTAB nTab) :
+        mrCxt(rCxt),
         mrTextAttrs(rTextAttrs),
         miAttrPos(rTextAttrs.begin()),
         mnTab(nTab),
-        mnInsPos(nInsPos),
-        mnNewSheets(nNewSheets),
         mbModified(false) {}
 
     void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
     {
-        pCell->UpdateInsertTab(mnInsPos, mnNewSheets);
+        pCell->UpdateInsertTab(mrCxt);
         mbModified = true;
     }
 
@@ -2871,20 +2871,20 @@ void ScColumn::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
 }
 
 
-void ScColumn::UpdateInsertTab(SCTAB nInsPos, SCTAB nNewSheets)
+void ScColumn::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt )
 {
-    if (nTab >= nInsPos)
+    if (nTab >= rCxt.mnInsertPos)
     {
-        nTab += nNewSheets;
+        nTab += rCxt.mnSheets;
         pAttrArray->SetTab(nTab);
     }
 
-    UpdateInsertTabOnlyCells(nInsPos, nNewSheets);
+    UpdateInsertTabOnlyCells(rCxt);
 }
 
-void ScColumn::UpdateInsertTabOnlyCells(SCTAB nInsPos, SCTAB nNewSheets)
+void ScColumn::UpdateInsertTabOnlyCells( sc::RefUpdateInsertTabContext& rCxt )
 {
-    InsertTabUpdater aFunc(maCellTextAttrs, nTab, nInsPos, nNewSheets);
+    InsertTabUpdater aFunc(rCxt, maCellTextAttrs, nTab);
     sc::ProcessFormulaEditText(maCells, aFunc);
     if (aFunc.isModified())
         CellStorageModified();
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 72f912f..3179eff 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -812,9 +812,10 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM
                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) );
 
                 SCTAB i;
+                sc::RefUpdateInsertTabContext aCxt(nNewPos, 1);
                 for (TableContainer::iterator it = maTabs.begin(); it != maTabs.end(); ++it)
                     if (*it && it != (maTabs.begin() + nOldPos))
-                        (*it)->UpdateInsertTab(nNewPos);
+                        (*it)->UpdateInsertTab(aCxt);
                 maTabs.push_back(NULL);
                 for (i = static_cast<SCTAB>(maTabs.size())-1; i > nNewPos; i--)
                     maTabs[i] = maTabs[i - 1];
@@ -841,9 +842,9 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM
     }
     if (bValid)
     {
-        sc::CopyToDocContext aCxt(*this);
 
         SetNoListening( true );     // noch nicht bei CopyToTable/Insert
+        sc::CopyToDocContext aCxt(*this);
         maTabs[nOldPos]->CopyToTable(aCxt, 0, 0, MAXCOL, MAXROW, IDF_ALL, (pOnlyMarked != NULL),
                                         maTabs[nNewPos], pOnlyMarked );
         maTabs[nNewPos]->SetTabBgColor(maTabs[nOldPos]->GetTabBgColor());
@@ -855,8 +856,9 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM
         aRefCxt.mnTabDelta = nDz;
         maTabs[nNewPos]->UpdateReference(aRefCxt, NULL);
 
+        sc::RefUpdateInsertTabContext aInsTabCxt(nNewPos, 1);
         maTabs[nNewPos]->UpdateInsertTabAbs(nNewPos); // alle abs. um eins hoch!!
-        maTabs[nOldPos]->UpdateInsertTab(nNewPos);
+        maTabs[nOldPos]->UpdateInsertTab(aInsTabCxt);
 
         maTabs[nOldPos]->UpdateCompile();
         maTabs[nNewPos]->UpdateCompile( true ); //  maybe already compiled in Clone, but used names need recompilation
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 8cbb01f..6935c76 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -457,11 +457,13 @@ bool ScDocument::InsertTab( SCTAB nPos, const OUString& rName,
         {
             if (ValidTab(nPos) && (nPos < nTabCount))
             {
+                sc::RefUpdateInsertTabContext aCxt(nPos, 1);
+
                 ScRange aRange( 0,0,nPos, MAXCOL,MAXROW,MAXTAB );
                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
                 if (pRangeName)
-                    pRangeName->UpdateTabRef(nPos, ScRangeData::Insert);
+                    pRangeName->UpdateInsertTab(aCxt);
                 pDBCollection->UpdateReference(
                                     URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
                 if (pDPCollection)
@@ -477,7 +479,7 @@ bool ScDocument::InsertTab( SCTAB nPos, const OUString& rName,
                 TableContainer::iterator it = maTabs.begin();
                 for (; it != maTabs.end(); ++it)
                     if ( *it )
-                        (*it)->UpdateInsertTab(nPos);
+                        (*it)->UpdateInsertTab(aCxt);
                 maTabs.push_back(NULL);
                 for (i = nTabCount; i > nPos; i--)
                 {
@@ -542,11 +544,12 @@ bool ScDocument::InsertTabs( SCTAB nPos, const std::vector<OUString>& rNames,
         {
             if (ValidTab(nPos) && (nPos < nTabCount))
             {
+                sc::RefUpdateInsertTabContext aCxt(nPos, nNewSheets);
                 ScRange aRange( 0,0,nPos, MAXCOL,MAXROW,MAXTAB );
                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,nNewSheets );
                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,nNewSheets );
                 if (pRangeName)
-                    pRangeName->UpdateTabRef(nPos, ScRangeData::Insert, 0, nNewSheets);
+                    pRangeName->UpdateInsertTab(aCxt);
                 pDBCollection->UpdateReference(
                                     URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,nNewSheets );
                 if (pDPCollection)
@@ -561,7 +564,7 @@ bool ScDocument::InsertTabs( SCTAB nPos, const std::vector<OUString>& rNames,
                 TableContainer::iterator it = maTabs.begin();
                 for (; it != maTabs.end(); ++it)
                     if ( *it )
-                        (*it)->UpdateInsertTab(nPos, nNewSheets);
+                        (*it)->UpdateInsertTab(aCxt);
                 it = maTabs.begin();
                 maTabs.insert(it+nPos,nNewSheets, NULL);
                 for (SCTAB i = 0; i < nNewSheets; ++i)
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index c6c567f..7dcfaaf 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -2556,14 +2556,14 @@ bool ScFormulaCell::UpdateReference(
     return false;
 }
 
-void ScFormulaCell::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets)
+void ScFormulaCell::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt )
 {
-    bool bPosChanged = (nTable <= aPos.Tab());
+    bool bPosChanged = (rCxt.mnInsertPos <= aPos.Tab());
     pCode->Reset();
     if (pDocument->IsClipOrUndo() || !pCode->GetNextReferenceRPN())
     {
         if (bPosChanged)
-            aPos.IncTab(nNewSheets);
+            aPos.IncTab(rCxt.mnSheets);
 
         return;
     }
@@ -2572,9 +2572,13 @@ void ScFormulaCell::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets)
     ScAddress aOldPos = aPos;
     // IncTab _after_ EndListeningTo and _before_ Compiler UpdateInsertTab!
     if (bPosChanged)
-        aPos.IncTab(nNewSheets);
+        aPos.IncTab(rCxt.mnSheets);
+
+    sc::RefUpdateResult aRes = pCode->AdjustReferenceOnInsertedTab(rCxt, aOldPos);
+    if (aRes.mbNameModified)
+        // Re-compile after new sheet(s) have been inserted.
+        bCompile = true;
 
-    pCode->AdjustReferenceOnInsertedTab(nTable, nNewSheets, aOldPos);
     // no StartListeningTo because the new sheets have not been inserted yet.
 }
 
diff --git a/sc/source/core/data/refupdatecontext.cxx b/sc/source/core/data/refupdatecontext.cxx
index 25ffceb..ff68ea8 100644
--- a/sc/source/core/data/refupdatecontext.cxx
+++ b/sc/source/core/data/refupdatecontext.cxx
@@ -11,20 +11,7 @@
 
 namespace sc {
 
-RefUpdateContext::RefUpdateContext(ScDocument& rDoc) :
-    mrDoc(rDoc), meMode(URM_INSDEL), mnColDelta(0), mnRowDelta(0), mnTabDelta(0) {}
-
-bool RefUpdateContext::isInserted() const
-{
-    return (meMode == URM_INSDEL) && (mnColDelta > 0 || mnRowDelta > 0 || mnTabDelta > 0);
-}
-
-bool RefUpdateContext::isDeleted() const
-{
-    return (meMode == URM_INSDEL) && (mnColDelta < 0 || mnRowDelta < 0 || mnTabDelta < 0);
-}
-
-void RefUpdateContext::setUpdatedName(SCTAB nTab, sal_uInt16 nIndex)
+void UpdatedRangeNames::setUpdatedName(SCTAB nTab, sal_uInt16 nIndex)
 {
     UpdatedNamesType::iterator it = maUpdatedNames.find(nTab);
     if (it == maUpdatedNames.end())
@@ -45,7 +32,7 @@ void RefUpdateContext::setUpdatedName(SCTAB nTab, sal_uInt16 nIndex)
     rIndices.insert(nIndex);
 }
 
-bool RefUpdateContext::isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const
+bool UpdatedRangeNames::isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const
 {
     UpdatedNamesType::const_iterator it = maUpdatedNames.find(nTab);
     if (it == maUpdatedNames.end())
@@ -55,12 +42,28 @@ bool RefUpdateContext::isNameUpdated(SCTAB nTab, sal_uInt16 nIndex) const
     return rIndices.count(nIndex) > 0;
 }
 
+RefUpdateContext::RefUpdateContext(ScDocument& rDoc) :
+    mrDoc(rDoc), meMode(URM_INSDEL), mnColDelta(0), mnRowDelta(0), mnTabDelta(0) {}
+
+bool RefUpdateContext::isInserted() const
+{
+    return (meMode == URM_INSDEL) && (mnColDelta > 0 || mnRowDelta > 0 || mnTabDelta > 0);
+}
+
+bool RefUpdateContext::isDeleted() const
+{
+    return (meMode == URM_INSDEL) && (mnColDelta < 0 || mnRowDelta < 0 || mnTabDelta < 0);
+}
+
 RefUpdateResult::RefUpdateResult() : mbValueChanged(false), mbReferenceModified(false), mbNameModified(false) {}
 RefUpdateResult::RefUpdateResult(const RefUpdateResult& r) :
     mbValueChanged(r.mbValueChanged),
     mbReferenceModified(r.mbReferenceModified),
     mbNameModified(r.mbNameModified) {}
 
+RefUpdateInsertTabContext::RefUpdateInsertTabContext(SCTAB nInsertPos, SCTAB nSheets) :
+    mnInsertPos(nInsertPos), mnSheets(nSheets) {}
+
 }
 
 
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index f74c09f..ad2d17e 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1580,27 +1580,28 @@ void ScTable::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
         aCol[i].UpdateGrow( rArea, nGrowX, nGrowY );
 }
 
-void ScTable::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets)
+void ScTable::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt )
 {
-    if (nTab >= nTable)
+    if (nTab >= rCxt.mnInsertPos)
     {
-        nTab += nNewSheets;
+        nTab += rCxt.mnSheets;
         if (pDBDataNoName)
             pDBDataNoName->UpdateMoveTab(nTab - 1 ,nTab);
     }
-    for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].UpdateInsertTab(nTable, nNewSheets);
+    for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].UpdateInsertTab(rCxt);
 
     if (mpRangeName)
-    {
-        mpRangeName->UpdateTabRef(nTable, ScRangeData::Insert, 0, nNewSheets);
-        mpRangeName->UpdateTabRef(nTable, ScRangeData::Insert);
-    }
+        mpRangeName->UpdateInsertTab(rCxt, nTab);
 
     if (IsStreamValid())
         SetStreamValid(false);
 
-    if(mpCondFormatList)
-        mpCondFormatList->UpdateReference( URM_INSDEL, ScRange(0,0, nTable, MAXCOL, MAXROW, nTable+nNewSheets-1),0,0, nNewSheets);
+    if (mpCondFormatList)
+    {
+        mpCondFormatList->UpdateReference(
+            URM_INSDEL, ScRange(0, 0, rCxt.mnInsertPos, MAXCOL, MAXROW, rCxt.mnInsertPos+rCxt.mnSheets-1),
+            0, 0, rCxt.mnSheets);
+    }
 }
 
 void ScTable::UpdateDeleteTab( SCTAB nTable, SCTAB nSheets )
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 846a208c..6f2beca 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -273,12 +273,10 @@ void ScRangeData::UpdateSymbol( OUStringBuffer& rBuffer, const ScAddress& rPos,
 
 void ScRangeData::UpdateReference( sc::RefUpdateContext& rCxt, SCTAB nLocalTab )
 {
-    OUString aStr;
-    rCxt.maRange.Format(aStr, SCR_ABS_3D, pDoc);
     sc::RefUpdateResult aRes = pCode->AdjustReferenceInName(rCxt, aPos);
     bModified = aRes.mbReferenceModified;
     if (aRes.mbReferenceModified)
-        rCxt.setUpdatedName(nLocalTab, nIndex);
+        rCxt.maUpdatedNames.setUpdatedName(nLocalTab, nIndex);
 }
 
 void ScRangeData::UpdateTranspose( const ScRange& rSource, const ScAddress& rDest )
@@ -407,9 +405,6 @@ void ScRangeData::UpdateTabRef(SCTAB nOldTable, TabRefUpdateMode eMode, SCTAB nN
 
     switch (eMode)
     {
-        case Insert:
-            pCode->AdjustReferenceOnInsertedTab(nOldTable, nNewSheets, aPos);
-        break;
         case Delete:
             pCode->AdjustReferenceOnDeletedTab(nOldTable, nNewSheets, aPos);
         break;
@@ -423,6 +418,12 @@ void ScRangeData::UpdateTabRef(SCTAB nOldTable, TabRefUpdateMode eMode, SCTAB nN
     }
 }
 
+void ScRangeData::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt, SCTAB nLocalTab )
+{
+    sc::RefUpdateResult aRes = pCode->AdjustReferenceOnInsertedTab(rCxt, aPos);
+    if (aRes.mbReferenceModified)
+        rCxt.maUpdatedNames.setUpdatedName(nLocalTab, nIndex);
+}
 
 void ScRangeData::MakeValidName( String& rName )
 {
@@ -723,6 +724,13 @@ void ScRangeName::UpdateReference(sc::RefUpdateContext& rCxt, SCTAB nLocalTab )
         itr->second->UpdateReference(rCxt, nLocalTab);
 }
 
+void ScRangeName::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt, SCTAB nLocalTab )
+{
+    DataType::iterator itr = maData.begin(), itrEnd = maData.end();
+    for (; itr != itrEnd; ++itr)
+        itr->second->UpdateInsertTab(rCxt, nLocalTab);
+}
+
 void ScRangeName::UpdateTabRef(SCTAB nTable, ScRangeData::TabRefUpdateMode eMode, SCTAB nNewTable, SCTAB nNewSheets)
 {
     DataType::iterator itr = maData.begin(), itrEnd = maData.end();
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 469063c..1a14bd5 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -2481,7 +2481,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon
                         nTab = rOldPos.Tab();
 
                     // Check if this named expression has been modified.
-                    if (rCxt.isNameUpdated(nTab, pToken->GetIndex()))
+                    if (rCxt.maUpdatedNames.isNameUpdated(nTab, pToken->GetIndex()))
                         aRes.mbNameModified = true;
                 }
             }
@@ -2724,12 +2724,12 @@ bool ScTokenArray::AdjustReferenceOnDeletedTab( SCTAB nDelPos, SCTAB nSheets, co
     return bRefChanged;
 }
 
-bool ScTokenArray::AdjustReferenceOnInsertedTab( SCTAB nInsPos, SCTAB nSheets, const ScAddress& rOldPos )
+sc::RefUpdateResult ScTokenArray::AdjustReferenceOnInsertedTab( sc::RefUpdateInsertTabContext& rCxt, const ScAddress& rOldPos )
 {
-    bool bRefChanged = false;
+    sc::RefUpdateResult aRes;
     ScAddress aNewPos = rOldPos;
-    if (nInsPos <= rOldPos.Tab())
-        aNewPos.IncTab(nSheets);
+    if (rCxt.mnInsertPos <= rOldPos.Tab())
+        aNewPos.IncTab(rCxt.mnSheets);
 
     FormulaToken** p = pCode;
     FormulaToken** pEnd = p + static_cast<size_t>(nLen);
@@ -2741,25 +2741,39 @@ bool ScTokenArray::AdjustReferenceOnInsertedTab( SCTAB nInsPos, SCTAB nSheets, c
             {
                 ScToken* pToken = static_cast<ScToken*>(*p);
                 ScSingleRefData& rRef = pToken->GetSingleRef();
-                if (adjustSingleRefOnInsertedTab(rRef, nInsPos, nSheets, rOldPos, aNewPos))
-                    bRefChanged = true;
+                if (adjustSingleRefOnInsertedTab(rRef, rCxt.mnInsertPos, rCxt.mnSheets, rOldPos, aNewPos))
+                    aRes.mbReferenceModified = true;
             }
             break;
             case svDoubleRef:
             {
                 ScToken* pToken = static_cast<ScToken*>(*p);
                 ScComplexRefData& rRef = pToken->GetDoubleRef();
-                if (adjustSingleRefOnInsertedTab(rRef.Ref1, nInsPos, nSheets, rOldPos, aNewPos))
-                    bRefChanged = true;
-                if (adjustSingleRefOnInsertedTab(rRef.Ref2, nInsPos, nSheets, rOldPos, aNewPos))
-                    bRefChanged = true;
+                if (adjustSingleRefOnInsertedTab(rRef.Ref1, rCxt.mnInsertPos, rCxt.mnSheets, rOldPos, aNewPos))
+                    aRes.mbReferenceModified = true;
+                if (adjustSingleRefOnInsertedTab(rRef.Ref2, rCxt.mnInsertPos, rCxt.mnSheets, rOldPos, aNewPos))
+                    aRes.mbReferenceModified = true;
             }
             break;
+            case svIndex:
+            {
+                const formula::FormulaToken* pToken = *p;
+                if (pToken->GetOpCode() == ocName)
+                {
+                    SCTAB nTab = -1;
+                    if (!pToken->IsGlobal())
+                        nTab = rOldPos.Tab();
+
+                    // Check if this named expression has been modified.
+                    if (rCxt.maUpdatedNames.isNameUpdated(nTab, pToken->GetIndex()))
+                        aRes.mbNameModified = true;
+                }
+            }
             default:
                 ;
         }
     }
-    return bRefChanged;
+    return aRes;
 }
 
 namespace {


More information about the Libreoffice-commits mailing list