[Libreoffice-commits] .: 17 commits - sc/inc sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Tue Mar 15 21:05:12 PDT 2011


 sc/inc/document.hxx                 |   18 +-
 sc/inc/rangenam.hxx                 |   15 +
 sc/inc/table.hxx                    |    2 
 sc/inc/undorangename.hxx            |   66 +++++++
 sc/source/core/data/documen2.cxx    |   84 +++++----
 sc/source/core/data/documen3.cxx    |   59 +++++-
 sc/source/core/data/document.cxx    |   50 +++--
 sc/source/core/data/table2.cxx      |    8 
 sc/source/core/tool/rangenam.cxx    |   22 ++
 sc/source/filter/excel/xiname.cxx   |   15 -
 sc/source/ui/docshell/docfunc.cxx   |   29 +++
 sc/source/ui/inc/docfunc.hxx        |   14 +
 sc/source/ui/inc/namedlg.hrc        |    3 
 sc/source/ui/inc/namedlg.hxx        |   30 ++-
 sc/source/ui/inc/undobase.hxx       |    1 
 sc/source/ui/namedlg/namedlg.cxx    |  319 ++++++++++++++++++------------------
 sc/source/ui/src/namedlg.src        |   49 ++++-
 sc/source/ui/undo/makefile.mk       |    2 
 sc/source/ui/undo/undorangename.cxx |  117 +++++++++++++
 sc/source/ui/vba/vbarange.cxx       |   12 -
 20 files changed, 641 insertions(+), 274 deletions(-)

New commits:
commit 3e3dcbafa9da0e58705d43613b309413f9ea0200
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 23:50:18 2011 -0400

    ScRangeName doesn't need to store ScDocument pointer.

diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index 95383eb..8c6140d 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -180,10 +180,9 @@ class ScRangeName
 {
 private:
     typedef ::boost::ptr_set<ScRangeData> DataType;
-    DataType    maData;
-
-    ScDocument* mpDoc;
+    DataType maData;
     sal_uInt16  mnSharedMaxIndex;
+
 public:
     /// Map that manages stored ScRangeName instances.
     typedef ::boost::ptr_map<SCTAB, ScRangeName>  TabNameMap;
@@ -195,7 +194,7 @@ public:
     typedef DataType::const_iterator const_iterator;
     typedef DataType::iterator iterator;
 
-    ScRangeName(ScDocument* pDoc = NULL);
+    ScRangeName();
     ScRangeName(const ScRangeName& r);
 
     SC_DLLPUBLIC const ScRangeData* findByRange(const ScRange& rRange) const;
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 7fbb3c3..527c0bc 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -135,7 +135,7 @@ ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const
 ScRangeName* ScDocument::GetRangeName() const
 {
     if (!pRangeName)
-        pRangeName = new ScRangeName(const_cast<ScDocument*>(this));
+        pRangeName = new ScRangeName;
     return pRangeName;
 }
 
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 5d5b6ed..82fdac8 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3027,7 +3027,7 @@ void ScTable::SetRangeName(ScRangeName* pNew)
 ScRangeName* ScTable::GetRangeName() const
 {
     if (!mpRangeName)
-        mpRangeName = new ScRangeName(pDocument);
+        mpRangeName = new ScRangeName;
     return mpRangeName;
 }
 
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 258d037..d2df5b1 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -729,11 +729,10 @@ void ScRangeName::copyLocalNames(const TabNameMap& rNames, TabNameCopyMap& rCopy
     }
 }
 
-ScRangeName::ScRangeName(ScDocument* pDoc) :
-    mpDoc(pDoc) {}
+ScRangeName::ScRangeName() {}
 
 ScRangeName::ScRangeName(const ScRangeName& r) :
-    maData(r.maData), mpDoc(r.mpDoc), mnSharedMaxIndex(r.mnSharedMaxIndex) {}
+    maData(r.maData), mnSharedMaxIndex(r.mnSharedMaxIndex) {}
 
 const ScRangeData* ScRangeName::findByRange(const ScRange& rRange) const
 {
@@ -886,7 +885,7 @@ void ScRangeName::clear()
 
 bool ScRangeName::operator== (const ScRangeName& r) const
 {
-    return maData == r.maData && mpDoc == r.mpDoc && mnSharedMaxIndex == r.mnSharedMaxIndex;
+    return maData == r.maData && mnSharedMaxIndex == r.mnSharedMaxIndex;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit cdf81d7b73138c95dd3740749e5ca74fec7b683f
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 18:48:16 2011 -0400

    Common part into an own method.

diff --git a/sc/inc/undorangename.hxx b/sc/inc/undorangename.hxx
index eb3d5aa..8b6e8f6 100644
--- a/sc/inc/undorangename.hxx
+++ b/sc/inc/undorangename.hxx
@@ -54,6 +54,7 @@ public:
     virtual String GetComment() const;
 
 private:
+    void DoChange(const ScRangeName& rGlobal, const ScRangeName::TabNameMap& rLocal);
 
 private:
     ScRangeName maOldGlobalNames;
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index 87535bf..3543d9c 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -72,39 +72,42 @@ ScUndoAllRangeNames::~ScUndoAllRangeNames()
 
 void ScUndoAllRangeNames::Undo()
 {
-    ScDocument& rDoc = *pDocShell->GetDocument();
-
-    rDoc.CompileNameFormula(true);
+    DoChange(maOldGlobalNames, maOldLocalNames);
+}
 
-    // Global names.
-    if (maOldGlobalNames.empty())
-        rDoc.SetRangeName(NULL);
-    else
-        rDoc.SetRangeName(new ScRangeName(maOldGlobalNames));
+void ScUndoAllRangeNames::Redo()
+{
+    DoChange(maNewGlobalNames, maNewLocalNames);
+}
 
-    ScRangeName::TabNameCopyMap aCopy;
-    ScRangeName::copyLocalNames(maOldLocalNames, aCopy);
-    rDoc.SetAllTabRangeNames(aCopy);
+void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
+{
+}
 
-    rDoc.CompileNameFormula(true);
+BOOL ScUndoAllRangeNames::CanRepeat(SfxRepeatTarget& /*rTarget*/) const
+{
+    return false;
+}
 
-    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
+String ScUndoAllRangeNames::GetComment() const
+{
+    return ScGlobal::GetRscString(STR_UNDO_RANGENAMES);
 }
 
-void ScUndoAllRangeNames::Redo()
+void ScUndoAllRangeNames::DoChange(const ScRangeName& rGlobal, const ScRangeName::TabNameMap& rLocal)
 {
     ScDocument& rDoc = *pDocShell->GetDocument();
 
     rDoc.CompileNameFormula(true);
 
     // Global names.
-    if (maOldGlobalNames.empty())
+    if (rGlobal.empty())
         rDoc.SetRangeName(NULL);
     else
-        rDoc.SetRangeName(new ScRangeName(maNewGlobalNames));
+        rDoc.SetRangeName(new ScRangeName(rGlobal));
 
     ScRangeName::TabNameCopyMap aCopy;
-    ScRangeName::copyLocalNames(maNewLocalNames, aCopy);
+    ScRangeName::copyLocalNames(rLocal, aCopy);
     rDoc.SetAllTabRangeNames(aCopy);
 
     rDoc.CompileNameFormula(true);
@@ -112,17 +115,3 @@ void ScUndoAllRangeNames::Redo()
     SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
 
-void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
-{
-}
-
-BOOL ScUndoAllRangeNames::CanRepeat(SfxRepeatTarget& /*rTarget*/) const
-{
-    return false;
-}
-
-String ScUndoAllRangeNames::GetComment() const
-{
-    return ScGlobal::GetRscString(STR_UNDO_RANGENAMES);
-}
-
commit 4fc55078454e95176f685474abc067f89d0122d3
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 18:44:12 2011 -0400

    Implemented redo.

diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index c4c4225..87535bf 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -93,8 +93,23 @@ void ScUndoAllRangeNames::Undo()
 
 void ScUndoAllRangeNames::Redo()
 {
+    ScDocument& rDoc = *pDocShell->GetDocument();
+
+    rDoc.CompileNameFormula(true);
+
+    // Global names.
+    if (maOldGlobalNames.empty())
+        rDoc.SetRangeName(NULL);
+    else
+        rDoc.SetRangeName(new ScRangeName(maNewGlobalNames));
+
     ScRangeName::TabNameCopyMap aCopy;
     ScRangeName::copyLocalNames(maNewLocalNames, aCopy);
+    rDoc.SetAllTabRangeNames(aCopy);
+
+    rDoc.CompileNameFormula(true);
+
+    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
 
 void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
commit 1215c7b8fea6e73ebdd5747acfb102e8ddd752be
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 18:40:58 2011 -0400

    Fixed undo, caused by a silly copy-n-paste.

diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index aaa2bea..c4c4225 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -62,7 +62,7 @@ ScUndoAllRangeNames::ScUndoAllRangeNames(
     for (itr = rNewLocal.begin(), itrEnd = rNewLocal.end(); itr != itrEnd; ++itr)
     {
         auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
-        maOldLocalNames.insert(itr->first, p);
+        maNewLocalNames.insert(itr->first, p);
     }
 }
 
commit 00796eee6fb1dff10eacf18d8216e4e53bb89d28
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 17:27:02 2011 -0400

    Hopefully implemented the undo part, plus lazy-init the global range name.
    
    Went through the code to make sure we check for NULL pointer before doing
    anything with the global range name instance.  Calling GetRangeName()
    initializes the range name instance on-demand.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index a65e485..8baf3c0 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -239,7 +239,7 @@ private:
     ScValidationDataList* pValidationList;				// validity
     SvNumberFormatterIndexTable*	pFormatExchangeList;	// for application of number formats
     ScTable*			pTab[MAXTABCOUNT];
-    ScRangeName*		pRangeName;
+    mutable ScRangeName* pRangeName;
     ScDBCollection*		pDBCollection;
     ScDPCollection*		pDPCollection;
     ScChartCollection*	pChartCollection;
diff --git a/sc/inc/undorangename.hxx b/sc/inc/undorangename.hxx
index ee8fc41..eb3d5aa 100644
--- a/sc/inc/undorangename.hxx
+++ b/sc/inc/undorangename.hxx
@@ -54,6 +54,8 @@ public:
     virtual String GetComment() const;
 
 private:
+
+private:
     ScRangeName maOldGlobalNames;
     ScRangeName maNewGlobalNames;
     ScRangeName::TabNameMap maOldLocalNames;
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 4ced952..af44f64 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -139,6 +139,7 @@ ScDocument::ScDocument( ScDocumentMode	eMode,
         pCondFormList( NULL ),
         pValidationList( NULL ),
         pFormatExchangeList( NULL ),
+        pRangeName(NULL),
         pDPCollection( NULL ),
         pLinkManager( NULL ),
         pFormulaTree( NULL ),
@@ -250,7 +251,6 @@ ScDocument::ScDocument( ScDocumentMode	eMode,
     for (SCTAB i=1; i<=MAXTAB; i++)
         pTab[i] = NULL;
 
-    pRangeName = new ScRangeName(this);
     pDBCollection = new ScDBCollection( 4, 4, FALSE, this );
     pSelectionAttr = NULL;
     pChartCollection = new ScChartCollection;
@@ -740,7 +740,8 @@ BOOL ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos )
 
                 SCsTAB nDz = ((SCsTAB)nNewPos) - (SCsTAB)nOldPos;
                 ScRange aSourceRange( 0,0,nOldPos, MAXCOL,MAXROW,nOldPos );
-                pRangeName->UpdateTabRef(nOldPos, 3, nNewPos);
+                if (pRangeName)
+                    pRangeName->UpdateTabRef(nOldPos, 3, nNewPos);
                 pDBCollection->UpdateMoveTab( nOldPos, nNewPos );
                 xColNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
                 xRowNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
@@ -831,7 +832,8 @@ BOOL ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM
                 ScRange aRange( 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB );
                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
-                pRangeName->UpdateTabRef(nNewPos, 1);
+                if (pRangeName)
+                    pRangeName->UpdateTabRef(nNewPos, 1);
                 pDBCollection->UpdateReference(
                                     URM_INSDEL, 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
                 if (pDPCollection)
@@ -977,48 +979,51 @@ ULONG ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos,
             std::set<USHORT> aUsedNames;
             pSrcDoc->pTab[nSrcPos]->FindRangeNamesInUse( 0, 0, MAXCOL, MAXROW, aUsedNames );
 
-            ScRangeName::const_iterator itr = pSrcDoc->pRangeName->begin(), itrEnd = pSrcDoc->pRangeName->end();
-            for (; itr != itrEnd; ++itr)		//! DB-Bereiche Pivot-Bereiche auch !!!
+            if (pSrcDoc->pRangeName)
             {
-                USHORT nOldIndex = itr->GetIndex();
-                bool bInUse = ( aUsedNames.find(nOldIndex) != aUsedNames.end() );
-                if (bInUse)
+                ScRangeName::const_iterator itr = pSrcDoc->pRangeName->begin(), itrEnd = pSrcDoc->pRangeName->end();
+                for (; itr != itrEnd; ++itr)		//! DB-Bereiche Pivot-Bereiche auch !!!
                 {
-                    const ScRangeData* pExistingData = pRangeName->findByName(itr->GetName());
-                    if (pExistingData)
+                    USHORT nOldIndex = itr->GetIndex();
+                    bool bInUse = ( aUsedNames.find(nOldIndex) != aUsedNames.end() );
+                    if (bInUse)
                     {
-                        // the name exists already in the destination document
-                        // -> use the existing name, but show a warning
-                        // (when refreshing links, the existing name is used and the warning not shown)
+                        const ScRangeData* pExistingData = GetRangeName()->findByName(itr->GetName());
+                        if (pExistingData)
+                        {
+                            // the name exists already in the destination document
+                            // -> use the existing name, but show a warning
+                            // (when refreshing links, the existing name is used and the warning not shown)
 
-                        USHORT nExistingIndex = pExistingData->GetIndex();
+                            USHORT nExistingIndex = pExistingData->GetIndex();
 
-                        // don't modify the named range
-                        aSrcRangeMap.insert(
-                            ScRangeData::IndexMap::value_type(nOldIndex, nExistingIndex));
-                        bRangeNameReplace = TRUE;
-                        bNamesLost = TRUE;
-                    }
-                    else
-                    {
-                        ScRangeData* pData = new ScRangeData( *itr );
-                        pData->SetDocument(this);
-                        if ( pRangeName->findByIndex( pData->GetIndex() ) )
-                            pData->SetIndex(0);		// need new index, done in Insert
-                        if (!pRangeName->insert(pData))
-                        {
-                            OSL_FAIL("can't insert name");     // shouldn't happen
-                            delete pData;
+                            // don't modify the named range
+                            aSrcRangeMap.insert(
+                                ScRangeData::IndexMap::value_type(nOldIndex, nExistingIndex));
+                            bRangeNameReplace = TRUE;
+                            bNamesLost = TRUE;
                         }
                         else
                         {
-                            pData->TransferTabRef( nSrcPos, nDestPos );
-                            aSrcRangeNames.push_back(pData);
-                            USHORT nNewIndex = pData->GetIndex();
-                            aSrcRangeMap.insert(
-                                ScRangeData::IndexMap::value_type(nOldIndex, nNewIndex));
-                            if ( !bRangeNameReplace )
-                                bRangeNameReplace = ( nOldIndex != nNewIndex );
+                            ScRangeData* pData = new ScRangeData( *itr );
+                            pData->SetDocument(this);
+                            if ( pRangeName->findByIndex( pData->GetIndex() ) )
+                                pData->SetIndex(0);		// need new index, done in Insert
+                            if (!pRangeName->insert(pData))
+                            {
+                                OSL_FAIL("can't insert name");     // shouldn't happen
+                                delete pData;
+                            }
+                            else
+                            {
+                                pData->TransferTabRef( nSrcPos, nDestPos );
+                                aSrcRangeNames.push_back(pData);
+                                USHORT nNewIndex = pData->GetIndex();
+                                aSrcRangeMap.insert(
+                                    ScRangeData::IndexMap::value_type(nOldIndex, nNewIndex));
+                                if ( !bRangeNameReplace )
+                                    bRangeNameReplace = ( nOldIndex != nNewIndex );
+                            }
                         }
                     }
                 }
@@ -1126,6 +1131,9 @@ namespace {
 
 bool eraseUnusedSharedName(ScRangeName* pRangeName, ScTable* pTab[], USHORT nLevel)
 {
+    if (!pRangeName)
+        return false;
+
     ScRangeName::iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
     for (; itr != itrEnd; ++itr)
     {
@@ -1160,6 +1168,8 @@ bool eraseUnusedSharedName(ScRangeName* pRangeName, ScTable* pTab[], USHORT nLev
 
 void ScDocument::EraseNonUsedSharedNames(USHORT nLevel)
 {
+    if (!pRangeName)
+        return;
     while (eraseUnusedSharedName(pRangeName, pTab, nLevel))
         ;
 }
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 47507c0..7fbb3c3 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -134,6 +134,8 @@ ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const
 
 ScRangeName* ScDocument::GetRangeName() const
 {
+    if (!pRangeName)
+        pRangeName = new ScRangeName(const_cast<ScDocument*>(this));
     return pRangeName;
 }
 
@@ -147,8 +149,7 @@ void ScDocument::SetRangeName(SCTAB nTab, ScRangeName* pNew)
 
 void ScDocument::SetRangeName( ScRangeName* pNewRangeName )
 {
-    if (pRangeName)
-        delete pRangeName;
+    delete pRangeName;
     pRangeName = pNewRangeName;
 }
 
@@ -906,7 +907,8 @@ void ScDocument::UpdateReference( UpdateRefMode eUpdateRefMode,
             xColNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
             xRowNameRanges->UpdateReference( eUpdateRefMode, this, aRange, nDx, nDy, nDz );
             pDBCollection->UpdateReference( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
-            pRangeName->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
+            if (pRangeName)
+                pRangeName->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
             if ( pDPCollection )
                 pDPCollection->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz );
             UpdateChartRef( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, nDx, nDy, nDz );
@@ -982,8 +984,8 @@ void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDo
             aDest.SetTab( nDestTab );
 
             //	wie UpdateReference
-
-            pRangeName->UpdateTranspose( aSource, aDest );		// vor den Zellen!
+            if (pRangeName)
+                pRangeName->UpdateTranspose( aSource, aDest );		// vor den Zellen!
             for (SCTAB i=0; i<=MAXTAB; i++)
                 if (pTab[i])
                     pTab[i]->UpdateTranspose( aSource, aDest, pUndoDoc );
@@ -998,7 +1000,8 @@ void ScDocument::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY )
     //!	pPivotCollection
     //!	UpdateChartRef
 
-    pRangeName->UpdateGrow( rArea, nGrowX, nGrowY );
+    if (pRangeName)
+        pRangeName->UpdateGrow( rArea, nGrowX, nGrowY );
 
     for (SCTAB i=0; i<=MAXTAB && pTab[i]; i++)
         pTab[i]->UpdateGrow( rArea, nGrowX, nGrowY );
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index e064b63..66ca8da 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -348,7 +348,8 @@ BOOL ScDocument::InsertTab( SCTAB nPos, const String& rName,
                 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 );
-                pRangeName->UpdateTabRef( nPos, 1 );
+                if (pRangeName)
+                    pRangeName->UpdateTabRef( nPos, 1 );
                 pDBCollection->UpdateReference(
                                     URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
                 if (pDPCollection)
@@ -437,7 +438,8 @@ BOOL ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc )
                 aRange.aEnd.SetTab( MAXTAB );
                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 );
                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 );
-                pRangeName->UpdateTabRef( nTab, 2 );
+                if (pRangeName)
+                    pRangeName->UpdateTabRef( nTab, 2 );
                 pDBCollection->UpdateReference(
                                     URM_INSDEL, 0,0,nTab, MAXCOL,MAXROW,MAXTAB, 0,0,-1 );
                 if (pDPCollection)
@@ -1698,16 +1700,19 @@ void ScDocument::TransposeClip( ScDocument* pTransClip, USHORT nFlags, BOOL bAsL
 
         //	Bereiche uebernehmen
 
-    pTransClip->pRangeName->clear();
-    ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
-    for (; itr != itrEnd; ++itr)
+    if (pRangeName)
     {
-        USHORT nIndex = itr->GetIndex();
-        ScRangeData* pData = new ScRangeData(*itr);
-        if (!pTransClip->pRangeName->insert(pData))
-            delete pData;
-        else
-            pData->SetIndex(nIndex);
+        pTransClip->GetRangeName()->clear();
+        ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
+        for (; itr != itrEnd; ++itr)
+        {
+            USHORT nIndex = itr->GetIndex();
+            ScRangeData* pData = new ScRangeData(*itr);
+            if (!pTransClip->pRangeName->insert(pData))
+                delete pData;
+            else
+                pData->SetIndex(nIndex);
+        }
     }
 
     // The data
@@ -1779,6 +1784,9 @@ void copyUsedNamesToClip(ScRangeName* pClipRangeName, ScRangeName* pRangeName, c
 
 void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClipRange, const ScMarkData* pMarks, bool bAllTabs)
 {
+    if (!pRangeName || pRangeName->empty())
+        return;
+
     std::set<USHORT> aUsedNames;        // indexes of named ranges that are used in the copied cells
     for (SCTAB i = 0; i <= MAXTAB; ++i)
         if (pTab[i] && pClipDoc->pTab[i])
@@ -1787,11 +1795,14 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip
                     rClipRange.aStart.Col(), rClipRange.aStart.Row(),
                     rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames);
 
-    copyUsedNamesToClip(pClipDoc->pRangeName, pRangeName, aUsedNames);
+    copyUsedNamesToClip(pClipDoc->GetRangeName(), pRangeName, aUsedNames);
 }
 
 void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClipRange, SCTAB nTab)
 {
+    if (!pRangeName || pRangeName->empty())
+        return;
+
     // Indexes of named ranges that are used in the copied cells
     std::set<USHORT> aUsedNames;
     if ( pTab[nTab] && pClipDoc->pTab[nTab] )
@@ -1801,7 +1812,7 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip
             rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames );
     }
 
-    copyUsedNamesToClip(pClipDoc->pRangeName, pRangeName, aUsedNames);
+    copyUsedNamesToClip(pClipDoc->GetRangeName(), pRangeName, aUsedNames);
 }
 
 ScDocument::NumFmtMergeHandler::NumFmtMergeHandler(ScDocument* pDoc, ScDocument* pSrcDoc) :
@@ -1830,6 +1841,9 @@ void ScDocument::MergeNumberFormatter(ScDocument* pSrcDoc)
 
 void ScDocument::CopyRangeNamesFromClip(ScDocument* pClipDoc, ScClipRangeNameData& rRangeNames)
 {
+    if (!pClipDoc->pRangeName)
+        return;
+
     ScClipRangeNameData aClipRangeNames;
 
     ScRangeName::const_iterator itr = pClipDoc->pRangeName->begin();
@@ -1843,7 +1857,7 @@ void ScDocument::CopyRangeNamesFromClip(ScDocument* pClipDoc, ScClipRangeNameDat
             A proper solution would ask the user how to proceed.
             The adjustment of the indices in the formulas is done later.
         */
-        const ScRangeData* pExistingData = pRangeName->findByName(itr->GetName());
+        const ScRangeData* pExistingData = GetRangeName()->findByName(itr->GetName());
         if (pExistingData)
         {
             USHORT nOldIndex = itr->GetIndex();
diff --git a/sc/source/ui/inc/undobase.hxx b/sc/source/ui/inc/undobase.hxx
index d00f1fb..1e1b6ae 100644
--- a/sc/source/ui/inc/undobase.hxx
+++ b/sc/source/ui/inc/undobase.hxx
@@ -32,6 +32,7 @@
 #include <svl/undo.hxx>
 #include "global.hxx"
 #include "address.hxx"
+#include "docsh.hxx"
 
 class ScDocument;
 class ScDocShell;
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index c9021e8..aaa2bea 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -32,6 +32,9 @@
 #include "globstr.hrc"
 #include "global.hxx"
 #include "docfunc.hxx"
+#include "sc.hrc"
+
+#include "sfx2/app.hxx"
 
 #include <memory>
 
@@ -69,18 +72,29 @@ ScUndoAllRangeNames::~ScUndoAllRangeNames()
 
 void ScUndoAllRangeNames::Undo()
 {
-    ScDocFunc aFunc(*pDocShell);
+    ScDocument& rDoc = *pDocShell->GetDocument();
+
+    rDoc.CompileNameFormula(true);
+
+    // Global names.
+    if (maOldGlobalNames.empty())
+        rDoc.SetRangeName(NULL);
+    else
+        rDoc.SetRangeName(new ScRangeName(maOldGlobalNames));
+
     ScRangeName::TabNameCopyMap aCopy;
     ScRangeName::copyLocalNames(maOldLocalNames, aCopy);
-    aFunc.ModifyAllRangeNames(&maOldGlobalNames, aCopy);
+    rDoc.SetAllTabRangeNames(aCopy);
+
+    rDoc.CompileNameFormula(true);
+
+    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
 
 void ScUndoAllRangeNames::Redo()
 {
-    ScDocFunc aFunc(*pDocShell);
     ScRangeName::TabNameCopyMap aCopy;
     ScRangeName::copyLocalNames(maNewLocalNames, aCopy);
-    aFunc.ModifyAllRangeNames(&maNewGlobalNames, aCopy);
 }
 
 void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
commit 785147972f639a30d27d8250b1e3fad782241748
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 15:52:11 2011 -0400

    Implement undo and redo for real.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index efdc231..a65e485 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -464,10 +464,11 @@ public:
      * non-empty range name set.
      */
     void GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rRangeNames) const;
-    SC_DLLPUBLIC ScRangeName*   GetRangeName(SCTAB nTab) const;
-    SC_DLLPUBLIC ScRangeName*	GetRangeName() const;
-    void            SetRangeName(SCTAB nTab, ScRangeName* pNew);
-    void			SetRangeName( ScRangeName* pNewRangeName );
+    void SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rRangeNames);
+    SC_DLLPUBLIC ScRangeName* GetRangeName(SCTAB nTab) const;
+    SC_DLLPUBLIC ScRangeName* GetRangeName() const;
+    void SetRangeName(SCTAB nTab, ScRangeName* pNew);
+    void SetRangeName( ScRangeName* pNewRangeName );
     SCTAB			GetMaxTableNumber() { return nMaxTableNumber; }
     void			SetMaxTableNumber(SCTAB nNumber) { nMaxTableNumber = nNumber; }
 
diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index dc92ebd..95383eb 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -190,6 +190,8 @@ public:
     /// Map that stores non-managed pointers to ScRangeName instances.
     typedef ::std::map<SCTAB, const ScRangeName*> TabNameCopyMap;
 
+    static void copyLocalNames(const TabNameMap& rNames, TabNameCopyMap& rCopy);
+
     typedef DataType::const_iterator const_iterator;
     typedef DataType::iterator iterator;
 
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index e68603d..47507c0 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -107,6 +107,23 @@ void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const
     rNames.swap(aNames);
 }
 
+void ScDocument::SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rNames)
+{
+    // Remove all existing range names first.
+    for (SCTAB i = 0; i <= MAXTAB; ++i)
+    {
+        if (!pTab[i])
+            // no more tables to iterate through.
+            break;
+
+        pTab[i]->SetRangeName(NULL);
+    }
+
+    ScRangeName::TabNameCopyMap::const_iterator itr = rNames.begin(), itrEnd = rNames.end();
+    for (; itr != itrEnd; ++itr)
+        SetRangeName(itr->first, new ScRangeName(*itr->second));
+}
+
 ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const
 {
     if (!ValidTab(nTab) || !pTab[nTab])
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 1166297..258d037 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -714,6 +714,21 @@ public:
 
 }
 
+void ScRangeName::copyLocalNames(const TabNameMap& rNames, TabNameCopyMap& rCopy)
+{
+    TabNameMap::const_iterator itr = rNames.begin(), itrEnd = rNames.end();
+    for (; itr != itrEnd; ++itr)
+    {
+        const ScRangeName* p = itr->second;
+        if (!p || p->empty())
+            // Skip empty ones.
+            continue;
+
+        rCopy.insert(
+            TabNameCopyMap::value_type(itr->first, p));
+    }
+}
+
 ScRangeName::ScRangeName(ScDocument* pDoc) :
     mpDoc(pDoc) {}
 
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index d281bab..357b173 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -4506,9 +4506,7 @@ void ScDocFunc::ModifyAllRangeNames( const ScRangeName* pGlobal, const ScRangeNa
     pDoc->SetRangeName(new ScRangeName(*pGlobal));
 
     // sheet-local names
-    ScRangeName::TabNameCopyMap::const_iterator itr = rTabs.begin(), itrEnd = rTabs.end();
-    for (; itr != itrEnd; ++itr)
-        pDoc->SetRangeName(itr->first, new ScRangeName(*itr->second));
+    pDoc->SetAllTabRangeNames(rTabs);
 
     pDoc->CompileNameFormula(false);
 
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index 7819c07..99c79f7 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -471,13 +471,7 @@ void ScNameDlg::OKPushed()
 
         // Store pointers to sheet local names instances.
         ScRangeName::TabNameCopyMap aTabNames;
-        ScRangeName::TabNameMap::const_iterator itr = maTabRangeNames.begin(), itrEnd = maTabRangeNames.end();
-        for (; itr != itrEnd; ++itr)
-        {
-            const ScRangeName* p = itr->second;
-            aTabNames.insert(
-                ScRangeName::TabNameCopyMap::value_type(itr->first, p));
-        }
+        ScRangeName::copyLocalNames(maTabRangeNames, aTabNames);
         aFunc.ModifyAllRangeNames(&maGlobalRangeName, aTabNames);
         Close();
     }
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index 91e34ea..c9021e8 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -31,6 +31,7 @@
 #include "undorangename.hxx"
 #include "globstr.hrc"
 #include "global.hxx"
+#include "docfunc.hxx"
 
 #include <memory>
 
@@ -68,10 +69,18 @@ ScUndoAllRangeNames::~ScUndoAllRangeNames()
 
 void ScUndoAllRangeNames::Undo()
 {
+    ScDocFunc aFunc(*pDocShell);
+    ScRangeName::TabNameCopyMap aCopy;
+    ScRangeName::copyLocalNames(maOldLocalNames, aCopy);
+    aFunc.ModifyAllRangeNames(&maOldGlobalNames, aCopy);
 }
 
 void ScUndoAllRangeNames::Redo()
 {
+    ScDocFunc aFunc(*pDocShell);
+    ScRangeName::TabNameCopyMap aCopy;
+    ScRangeName::copyLocalNames(maNewLocalNames, aCopy);
+    aFunc.ModifyAllRangeNames(&maNewGlobalNames, aCopy);
 }
 
 void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
commit 391d644ef56b591d1129ae89fd21b7b3f5aa738d
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 14:50:20 2011 -0400

    Added skeleton for undo of all range names, global and local.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 003b6d6..efdc231 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -36,6 +36,7 @@
 #include <rtl/ref.hxx>
 #include "scdllapi.h"
 #include "rangelst.hxx"
+#include "rangenam.hxx"
 #include "table.hxx"
 #include "brdcst.hxx"
 #include "tabopparams.hxx"
@@ -462,7 +463,7 @@ public:
      * Get all range names that are local to each table.  It only returns
      * non-empty range name set.
      */
-    void GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rRangeNames) const;
+    void GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rRangeNames) const;
     SC_DLLPUBLIC ScRangeName*   GetRangeName(SCTAB nTab) const;
     SC_DLLPUBLIC ScRangeName*	GetRangeName() const;
     void            SetRangeName(SCTAB nTab, ScRangeName* pNew);
diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index d434f2c..dc92ebd 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -37,6 +37,7 @@
 
 #include <map>
 #include <boost/ptr_container/ptr_set.hpp>
+#include <boost/ptr_container/ptr_map.hpp>
 
 //------------------------------------------------------------------------
 
@@ -184,6 +185,11 @@ private:
     ScDocument* mpDoc;
     sal_uInt16  mnSharedMaxIndex;
 public:
+    /// Map that manages stored ScRangeName instances.
+    typedef ::boost::ptr_map<SCTAB, ScRangeName>  TabNameMap;
+    /// Map that stores non-managed pointers to ScRangeName instances.
+    typedef ::std::map<SCTAB, const ScRangeName*> TabNameCopyMap;
+
     typedef DataType::const_iterator const_iterator;
     typedef DataType::iterator iterator;
 
diff --git a/sc/inc/undorangename.hxx b/sc/inc/undorangename.hxx
new file mode 100644
index 0000000..ee8fc41
--- /dev/null
+++ b/sc/inc/undorangename.hxx
@@ -0,0 +1,63 @@
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ *       Kohei Yoshida <kyoshida at novell.com> (Novell, Inc)
+ * Portions created by the Initial Developer are Copyright (C) 2010 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#ifndef __SC_UNDORANGENAME_HXX__
+#define __SC_UNDORANGENAME_HXX__
+
+#include "undobase.hxx"
+#include "rangenam.hxx"
+
+class ScDocShell;
+
+/**
+ * Undo object for named ranges, both in global and sheet-local scopes.
+ */
+class ScUndoAllRangeNames : public ScSimpleUndo
+{
+public:
+    ScUndoAllRangeNames(ScDocShell* pDocSh,
+                        const ScRangeName* pOldGlobal,
+                        const ScRangeName* pNewGlobal,
+                        const ScRangeName::TabNameCopyMap& rOldLocal,
+                        const ScRangeName::TabNameCopyMap& rNewLocal);
+
+    virtual ~ScUndoAllRangeNames();
+
+    virtual void Undo();
+    virtual void Redo();
+    virtual void Repeat(SfxRepeatTarget& rTarget);
+    virtual BOOL CanRepeat(SfxRepeatTarget& rTarget) const;
+    virtual String GetComment() const;
+
+private:
+    ScRangeName maOldGlobalNames;
+    ScRangeName maNewGlobalNames;
+    ScRangeName::TabNameMap maOldLocalNames;
+    ScRangeName::TabNameMap maNewLocalNames;
+};
+
+#endif
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 83fcb1a..e68603d 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -88,10 +88,9 @@
 
 using namespace com::sun::star;
 
-void ScDocument::GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rNames) const
+void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const
 {
-    typedef ::std::map<SCTAB, const ScRangeName*> MapType;
-    MapType aNames;
+    ScRangeName::TabNameCopyMap aNames;
     for (SCTAB i = 0; i <= MAXTAB; ++i)
     {
         if (!pTab[i])
@@ -103,7 +102,7 @@ void ScDocument::GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rNam
             // ignore empty ones.
             continue;
 
-        aNames.insert(MapType::value_type(i, p));
+        aNames.insert(ScRangeName::TabNameCopyMap::value_type(i, p));
     }
     rNames.swap(aNames);
 }
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index 64c5413..d281bab 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -100,6 +100,7 @@
 #include "tabprotection.hxx"
 #include "clipparam.hxx"
 #include "externalrefmgr.hxx"
+#include "undorangename.hxx"
 
 #include <memory>
 #include <basic/basmgr.hxx>
@@ -4485,20 +4486,27 @@ bool ScDocFunc::ModifyRangeNames( const ScRangeName& rNewRanges )
     return SetNewRangeNames( new ScRangeName(rNewRanges) );
 }
 
-void ScDocFunc::ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs )
+void ScDocFunc::ModifyAllRangeNames( const ScRangeName* pGlobal, const ScRangeName::TabNameCopyMap& rTabs )
 {
-    typedef ::std::map<SCTAB, const ScRangeName*> MapType;
-
     ScDocShellModificator aModificator(rDocShell);
     ScDocument* pDoc = rDocShell.GetDocument();
 
+    if (pDoc->IsUndoEnabled())
+    {
+        ScRangeName* pOldGlobal = pDoc->GetRangeName();
+        ScRangeName::TabNameCopyMap aOldLocals;
+        pDoc->GetAllTabRangeNames(aOldLocals);
+        rDocShell.GetUndoManager()->AddUndoAction(
+            new ScUndoAllRangeNames(&rDocShell, pOldGlobal, pGlobal, aOldLocals, rTabs));
+    }
+
     pDoc->CompileNameFormula(true);
 
     // global names
     pDoc->SetRangeName(new ScRangeName(*pGlobal));
 
     // sheet-local names
-    MapType::const_iterator itr = rTabs.begin(), itrEnd = rTabs.end();
+    ScRangeName::TabNameCopyMap::const_iterator itr = rTabs.begin(), itrEnd = rTabs.end();
     for (; itr != itrEnd; ++itr)
         pDoc->SetRangeName(itr->first, new ScRangeName(*itr->second));
 
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index 82e14f7..725d03a 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -34,6 +34,7 @@
 #include "formula/grammar.hxx"
 #include "tabbgcolor.hxx"
 #include "token.hxx"
+#include "rangenam.hxx"
 
 #include <vector>
 #include <map>
@@ -46,7 +47,6 @@ class ScMarkData;
 class ScPatternAttr;
 class ScRange;
 class ScRangeList;
-class ScRangeName;
 class ScBaseCell;
 class ScTokenArray;
 struct ScTabOpParam;
@@ -188,12 +188,12 @@ public:
      * Modify all range names, global scope names as well as sheet local ones,
      * in one go.  Note that this method will <b>not</b> destroy the instances
      * passed as arguments (it creates copies); the caller is responsible for
-     * destroying them.
+     * destroying them. 
      *
      * @param pGlobal global scope range names.
      * @param rTabs sheet local range names.
      */
-    void            ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs );
+    void            ModifyAllRangeNames( const ScRangeName* pGlobal, const ScRangeName::TabNameCopyMap& rTabs );
 
     BOOL            CreateNames( const ScRange& rRange, USHORT nFlags, BOOL bApi );
     BOOL            InsertNameList( const ScAddress& rStartPos, BOOL bApi );
diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 0595920..8de0534 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -80,7 +80,7 @@ private:
     ScViewData*		pViewData;
     ScDocument*		pDoc;
     ScRangeName		maGlobalRangeName;
-    TabNameMapType  maTabRangeNames;
+    ScRangeName::TabNameMap maTabRangeNames;
     ScRangeName*    mpCurRangeName;    //! range name set currently selected
     const ScAddress	theCursorPos;
     Selection		theCurSel;
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index b4198eb..7819c07 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -52,8 +52,6 @@
 
 using ::std::auto_ptr;
 
-typedef ::std::map<SCTAB, const ScRangeName*> TabNameCopyMapType;
-
 // defines -------------------------------------------------------------------
 
 #define ABS_SREF		  SCA_VALID \
@@ -129,9 +127,9 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         mpImpl(new ScNameDlgImpl)
 {
     // Copy sheet-local range names.
-    TabNameCopyMapType aOldNames;
+    ScRangeName::TabNameCopyMap aOldNames;
     pDoc->GetAllTabRangeNames(aOldNames);
-    TabNameCopyMapType::const_iterator itr = aOldNames.begin(), itrEnd = aOldNames.end();
+    ScRangeName::TabNameCopyMap::const_iterator itr = aOldNames.begin(), itrEnd = aOldNames.end();
     for (; itr != itrEnd; ++itr)
     {
         auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
@@ -472,13 +470,13 @@ void ScNameDlg::OKPushed()
         ScDocFunc aFunc(*pDocSh);
 
         // Store pointers to sheet local names instances.
-        TabNameCopyMapType aTabNames;
-        TabNameMapType::const_iterator itr = maTabRangeNames.begin(), itrEnd = maTabRangeNames.end();
+        ScRangeName::TabNameCopyMap aTabNames;
+        ScRangeName::TabNameMap::const_iterator itr = maTabRangeNames.begin(), itrEnd = maTabRangeNames.end();
         for (; itr != itrEnd; ++itr)
         {
             const ScRangeName* p = itr->second;
             aTabNames.insert(
-                TabNameCopyMapType::value_type(itr->first, p));
+                ScRangeName::TabNameCopyMap::value_type(itr->first, p));
         }
         aFunc.ModifyAllRangeNames(&maGlobalRangeName, aTabNames);
         Close();
@@ -510,11 +508,11 @@ void ScNameDlg::ScopeChanged()
     {
         // Sheet scope
         SCTAB nTab = static_cast<SCTAB>(nPos-1);
-        TabNameMapType::iterator itr = maTabRangeNames.find(nTab);
+        ScRangeName::TabNameMap::iterator itr = maTabRangeNames.find(nTab);
         if (itr == maTabRangeNames.end())
         {
             auto_ptr<ScRangeName> p(new ScRangeName);
-            ::std::pair<TabNameMapType::iterator, bool> r =
+            ::std::pair<ScRangeName::TabNameMap::iterator, bool> r =
                 maTabRangeNames.insert(nTab, p);
             itr = r.first;
         }
diff --git a/sc/source/ui/undo/makefile.mk b/sc/source/ui/undo/makefile.mk
index 12c94fd..8dcc345 100644
--- a/sc/source/ui/undo/makefile.mk
+++ b/sc/source/ui/undo/makefile.mk
@@ -51,6 +51,7 @@ CXXFILES = \
         undoblk3.cxx \
         undodat.cxx \
         undodraw.cxx \
+        undorangename.cxx \
         undotab.cxx
 
 
@@ -71,6 +72,7 @@ EXCEPTIONSFILES= \
         $(SLO)$/undodraw.obj \
         $(SLO)$/undoolk.obj \
         $(SLO)$/undostyl.obj \
+        $(SLO)$/undorangename.obj \
         $(SLO)$/undotab.obj \
         $(SLO)$/undoutil.obj
 
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
new file mode 100644
index 0000000..91e34ea
--- /dev/null
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -0,0 +1,90 @@
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ *       Kohei Yoshida <kyoshida at novell.com> (Novell, Inc.)
+ * Portions created by the Initial Developer are Copyright (C) 2010 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): 
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+#include "undorangename.hxx"
+#include "globstr.hrc"
+#include "global.hxx"
+
+#include <memory>
+
+using ::std::auto_ptr;
+
+ScUndoAllRangeNames::ScUndoAllRangeNames(
+    ScDocShell* pDocSh,
+    const ScRangeName* pOldGlobal, const ScRangeName* pNewGlobal, 
+    const ScRangeName::TabNameCopyMap &rOldLocal, const ScRangeName::TabNameCopyMap &rNewLocal) :
+    ScSimpleUndo(pDocSh)
+{
+    if (pOldGlobal)
+        maOldGlobalNames = *pOldGlobal;
+    if (pNewGlobal)
+        maNewGlobalNames = *pNewGlobal;
+
+    // Copy sheet-local names.
+    ScRangeName::TabNameCopyMap::const_iterator itr, itrEnd;
+    for (itr = rOldLocal.begin(), itrEnd = rOldLocal.end(); itr != itrEnd; ++itr)
+    {
+        auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
+        maOldLocalNames.insert(itr->first, p);
+    }
+
+    for (itr = rNewLocal.begin(), itrEnd = rNewLocal.end(); itr != itrEnd; ++itr)
+    {
+        auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
+        maOldLocalNames.insert(itr->first, p);
+    }
+}
+
+ScUndoAllRangeNames::~ScUndoAllRangeNames()
+{
+}
+
+void ScUndoAllRangeNames::Undo()
+{
+}
+
+void ScUndoAllRangeNames::Redo()
+{
+}
+
+void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
+{
+}
+
+BOOL ScUndoAllRangeNames::CanRepeat(SfxRepeatTarget& /*rTarget*/) const
+{
+    return false;
+}
+
+String ScUndoAllRangeNames::GetComment() const
+{
+    return ScGlobal::GetRscString(STR_UNDO_RANGENAMES);
+}
+
commit 975517cd167bd24c6780504d37e691414d08ed56
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Tue Mar 15 11:12:55 2011 -0400

    Implement ModifyAllRangeNames(), minus undo.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index b29d37e..003b6d6 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -465,6 +465,7 @@ public:
     void GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rRangeNames) const;
     SC_DLLPUBLIC ScRangeName*   GetRangeName(SCTAB nTab) const;
     SC_DLLPUBLIC ScRangeName*	GetRangeName() const;
+    void            SetRangeName(SCTAB nTab, ScRangeName* pNew);
     void			SetRangeName( ScRangeName* pNewRangeName );
     SCTAB			GetMaxTableNumber() { return nMaxTableNumber; }
     void			SetMaxTableNumber(SCTAB nNumber) { nMaxTableNumber = nNumber; }
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index edc5bcf..c699278 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -793,6 +793,7 @@ public:
     void		DestroySortCollator();
     void        SetDrawPageSize( bool bResetStreamValid = true, bool bUpdateNoteCaptionPos = true );
 
+    void SetRangeName(ScRangeName* pNew);
     ScRangeName* GetRangeName() const;
 
 private:
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index f4645b1..83fcb1a 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -121,6 +121,14 @@ ScRangeName* ScDocument::GetRangeName() const
     return pRangeName;
 }
 
+void ScDocument::SetRangeName(SCTAB nTab, ScRangeName* pNew)
+{
+    if (!ValidTab(nTab) || !pTab[nTab])
+        return;
+
+    return pTab[nTab]->SetRangeName(pNew);
+}
+
 void ScDocument::SetRangeName( ScRangeName* pNewRangeName )
 {
     if (pRangeName)
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 0d06a32..5d5b6ed 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3018,6 +3018,12 @@ void ScTable::SetDrawPageSize(bool bResetStreamValid, bool bUpdateNoteCaptionPos
         SetStreamValid(FALSE);
 }
 
+void ScTable::SetRangeName(ScRangeName* pNew)
+{
+    delete mpRangeName;
+    mpRangeName = pNew;
+}
+
 ScRangeName* ScTable::GetRangeName() const
 {
     if (!mpRangeName)
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index e0d7e90..64c5413 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -4487,6 +4487,25 @@ bool ScDocFunc::ModifyRangeNames( const ScRangeName& rNewRanges )
 
 void ScDocFunc::ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs )
 {
+    typedef ::std::map<SCTAB, const ScRangeName*> MapType;
+
+    ScDocShellModificator aModificator(rDocShell);
+    ScDocument* pDoc = rDocShell.GetDocument();
+
+    pDoc->CompileNameFormula(true);
+
+    // global names
+    pDoc->SetRangeName(new ScRangeName(*pGlobal));
+
+    // sheet-local names
+    MapType::const_iterator itr = rTabs.begin(), itrEnd = rTabs.end();
+    for (; itr != itrEnd; ++itr)
+        pDoc->SetRangeName(itr->first, new ScRangeName(*itr->second));
+
+    pDoc->CompileNameFormula(false);
+
+    aModificator.SetDocumentModified();
+    SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
 
 bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc )     // takes ownership of pNewRanges
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index c613ea3..82e14f7 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -183,6 +183,16 @@ public:
 
     bool            SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc = true );     // takes ownership of pNewRanges
     bool            ModifyRangeNames( const ScRangeName& rNewRanges );
+
+    /**
+     * Modify all range names, global scope names as well as sheet local ones,
+     * in one go.  Note that this method will <b>not</b> destroy the instances
+     * passed as arguments (it creates copies); the caller is responsible for
+     * destroying them.
+     *
+     * @param pGlobal global scope range names.
+     * @param rTabs sheet local range names.
+     */
     void            ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs );
 
     BOOL            CreateNames( const ScRange& rRange, USHORT nFlags, BOOL bApi );
commit b96a8fb137e8fdf096ca079b49ff97452ba2ee09
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Sat Mar 12 14:48:44 2011 -0500

    Extracted macro-based method into real method (for better context tagging).
    
    Macro-based methods don't get tagged correctly in my editor which
    screws up cross-referencing.

diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 5771225..0595920 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -101,6 +101,7 @@ private:
     void OKPushed();
     void NameSelected();
     void ScopeChanged();
+    void NameModified(Edit* pEd);
 
     // Handler:
     DECL_LINK( OkBtnHdl, void * );
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index 923a9ad..b4198eb 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -524,36 +524,7 @@ void ScNameDlg::ScopeChanged()
     UpdateNames();
 }
 
-IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
-{
-    OKPushed();
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
-{
-    Close();
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
-{
-    return AddPushed();
-}
-
-IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
-{
-    RemovePushed();
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
-{
-    NameSelected();
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
+void ScNameDlg::NameModified(Edit* pEd)
 {
     String	theName 	= aEdName.GetText();
     String	theSymbol	= aEdAssign.GetText();
@@ -625,6 +596,40 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
             aBtnRemove.Disable();
         }
     }
+}
+
+IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
+{
+    OKPushed();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
+{
+    Close();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
+{
+    return AddPushed();
+}
+
+IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
+{
+    RemovePushed();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
+{
+    NameSelected();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
+{
+    NameModified(pEd);
     return 0;
 }
 
commit 8a0491911cfba949a3042a221a87b3a17eca5a7f
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Sat Mar 12 01:12:28 2011 -0500

    Store all range names from the dialog to the document.
    
    But I have yet to implement ScDocFunc::ModifyAllRangeNames().

diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index e9de219..e0d7e90 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -4485,6 +4485,10 @@ bool ScDocFunc::ModifyRangeNames( const ScRangeName& rNewRanges )
     return SetNewRangeNames( new ScRangeName(rNewRanges) );
 }
 
+void ScDocFunc::ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs )
+{
+}
+
 bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc )     // takes ownership of pNewRanges
 {
     ScDocShellModificator aModificator( rDocShell );
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index dee079f..c613ea3 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -36,6 +36,7 @@
 #include "token.hxx"
 
 #include <vector>
+#include <map>
 
 class ScEditEngineDefaulter;
 class SdrUndoAction;
@@ -182,6 +183,7 @@ public:
 
     bool            SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc = true );     // takes ownership of pNewRanges
     bool            ModifyRangeNames( const ScRangeName& rNewRanges );
+    void            ModifyAllRangeNames( const ScRangeName* pGlobal, const ::std::map<SCTAB, const ScRangeName*>& rTabs );
 
     BOOL            CreateNames( const ScRange& rRange, USHORT nFlags, BOOL bApi );
     BOOL            InsertNameList( const ScAddress& rStartPos, BOOL bApi );
diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 84762fe..5771225 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -98,6 +98,7 @@ private:
 
     bool AddPushed();
     void RemovePushed();
+    void OKPushed();
     void NameSelected();
     void ScopeChanged();
 
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index 59743e6..923a9ad 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -51,7 +51,8 @@
 #include <memory>
 
 using ::std::auto_ptr;
-using ::std::map;
+
+typedef ::std::map<SCTAB, const ScRangeName*> TabNameCopyMapType;
 
 // defines -------------------------------------------------------------------
 
@@ -128,10 +129,9 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         mpImpl(new ScNameDlgImpl)
 {
     // Copy sheet-local range names.
-    typedef map<SCTAB, const ScRangeName*> TabMapType;
-    TabMapType aOldNames;
+    TabNameCopyMapType aOldNames;
     pDoc->GetAllTabRangeNames(aOldNames);
-    TabMapType::const_iterator itr = aOldNames.begin(), itrEnd = aOldNames.end();
+    TabNameCopyMapType::const_iterator itr = aOldNames.begin(), itrEnd = aOldNames.end();
     for (; itr != itrEnd; ++itr)
     {
         auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
@@ -461,6 +461,30 @@ void ScNameDlg::RemovePushed()
     }
 }
 
+void ScNameDlg::OKPushed()
+{
+    if ( aBtnAdd.IsEnabled() )
+        AddPushed();
+
+    if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() )
+    {
+        ScDocShell* pDocSh = pViewData->GetDocShell();
+        ScDocFunc aFunc(*pDocSh);
+
+        // Store pointers to sheet local names instances.
+        TabNameCopyMapType aTabNames;
+        TabNameMapType::const_iterator itr = maTabRangeNames.begin(), itrEnd = maTabRangeNames.end();
+        for (; itr != itrEnd; ++itr)
+        {
+            const ScRangeName* p = itr->second;
+            aTabNames.insert(
+                TabNameCopyMapType::value_type(itr->first, p));
+        }
+        aFunc.ModifyAllRangeNames(&maGlobalRangeName, aTabNames);
+        Close();
+    }
+}
+
 void ScNameDlg::NameSelected()
 {
     ScRangeData* pData = mpCurRangeName->findByName(aEdName.GetText());
@@ -502,16 +526,7 @@ void ScNameDlg::ScopeChanged()
 
 IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
 {
-    if ( aBtnAdd.IsEnabled() )
-        AddBtnHdl( 0 );
-
-    if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() )
-    {
-        ScDocShell* pDocSh = pViewData->GetDocShell();
-        ScDocFunc aFunc(*pDocSh);
-        aFunc.ModifyRangeNames( maGlobalRangeName );
-        Close();
-    }
+    OKPushed();
     return 0;
 }
 
commit 9b2a8698258f038f7590628bf1945f0425bda4df
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Sat Mar 12 00:34:30 2011 -0500

    Retrieve sheet-local names and populate the dialog with them.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 021043b..b29d37e 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -458,6 +458,11 @@ public:
     ScFieldEditEngine*	CreateFieldEditEngine();
     void				DisposeFieldEditEngine(ScFieldEditEngine*& rpEditEngine);
 
+    /**
+     * Get all range names that are local to each table.  It only returns
+     * non-empty range name set.
+     */
+    void GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rRangeNames) const;
     SC_DLLPUBLIC ScRangeName*   GetRangeName(SCTAB nTab) const;
     SC_DLLPUBLIC ScRangeName*	GetRangeName() const;
     void			SetRangeName( ScRangeName* pNewRangeName );
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index 878dc49..f4645b1 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -88,7 +88,25 @@
 
 using namespace com::sun::star;
 
-//------------------------------------------------------------------------
+void ScDocument::GetAllTabRangeNames(::std::map<SCTAB, const ScRangeName*>& rNames) const
+{
+    typedef ::std::map<SCTAB, const ScRangeName*> MapType;
+    MapType aNames;
+    for (SCTAB i = 0; i <= MAXTAB; ++i)
+    {
+        if (!pTab[i])
+            // no more tables to iterate through.
+            break;
+
+        const ScRangeName* p = pTab[i]->GetRangeName();
+        if (!p || p->empty())
+            // ignore empty ones.
+            continue;
+
+        aNames.insert(MapType::value_type(i, p));
+    }
+    rNames.swap(aNames);
+}
 
 ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const
 {
diff --git a/sc/source/ui/inc/namedlg.hrc b/sc/source/ui/inc/namedlg.hrc
index 891ba02..363684f 100644
--- a/sc/source/ui/inc/namedlg.hrc
+++ b/sc/source/ui/inc/namedlg.hrc
@@ -45,6 +45,7 @@
 #define STR_ADD			21
 #define STR_MODIFY		22
 #define STR_INVALIDSYMBOL 23
+#define STR_GLOBAL_SCOPE 24
 
 #define BTN_CRITERIA	31
 #define BTN_PRINTAREA	32
diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 42cb1c5..84762fe 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -37,6 +37,8 @@
 #include "rangenam.hxx"
 #include "anyrefdg.hxx"
 
+#include <boost/ptr_container/ptr_map.hpp>
+
 class ScViewData;
 class ScDocument;
 struct ScNameDlgImpl;
@@ -46,6 +48,7 @@ struct ScNameDlgImpl;
 class ScNameDlg : public ScAnyRefDlg
 {
 private:
+    typedef ::boost::ptr_map<SCTAB, ScRangeName> TabNameMapType;
     FixedText       maFtScope;
     ListBox         maLbScope;
     FixedLine       aFlName;
@@ -72,13 +75,16 @@ private:
     const String	aStrAdd;	// "Hinzufuegen"
     const String	aStrModify;	// "Aendern"
     const String	errMsgInvalidSym;
+    const ::rtl::OUString maGlobalNameStr;
 
     ScViewData*		pViewData;
     ScDocument*		pDoc;
-    ScRangeName		aLocalRangeName;
+    ScRangeName		maGlobalRangeName;
+    TabNameMapType  maTabRangeNames;
+    ScRangeName*    mpCurRangeName;    //! range name set currently selected
     const ScAddress	theCursorPos;
     Selection		theCurSel;
-
+    
     ScNameDlgImpl*  mpImpl;
 
 private:
@@ -87,8 +93,13 @@ private:
     void UpdateNames();
     void CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData );
 
-    void SaveData();
-    void RestoreData();
+    void SaveControlStates();
+    void RestoreControlStates();
+
+    bool AddPushed();
+    void RemovePushed();
+    void NameSelected();
+    void ScopeChanged();
 
     // Handler:
     DECL_LINK( OkBtnHdl, void * );
@@ -98,6 +109,7 @@ private:
     DECL_LINK( EdModifyHdl, Edit * );
     DECL_LINK( NameSelectHdl, void * );
     DECL_LINK( AssignGetFocusHdl, void * );
+    DECL_LINK( ScopeChangedHdl, ListBox* );
 
 protected:
     virtual void	RefInputDone( BOOL bForced = FALSE );
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index 7ddba4e..59743e6 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -43,10 +43,15 @@
 #include "globstr.hrc"
 #include "namedlg.hrc"
 #include "namedlg.hxx"
+#include "viewdata.hxx"
 
 #include <vcl/msgbox.hxx>
 
+#include <map>
+#include <memory>
 
+using ::std::auto_ptr;
+using ::std::map;
 
 // defines -------------------------------------------------------------------
 
@@ -113,13 +118,26 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         aStrAdd 		( ScResId( STR_ADD ) ),
         aStrModify		( ScResId( STR_MODIFY ) ),
         errMsgInvalidSym( ScResId( STR_INVALIDSYMBOL ) ),
+        maGlobalNameStr( ResId::toString(ScResId(STR_GLOBAL_SCOPE)) ),
         //
         pViewData		( ptrViewData ),
         pDoc			( ptrViewData->GetDocument() ),
-        aLocalRangeName ( *(pDoc->GetRangeName()) ),
+        maGlobalRangeName(*pDoc->GetRangeName()),
+        mpCurRangeName(&maGlobalRangeName),
         theCursorPos	( aCursorPos ),
         mpImpl(new ScNameDlgImpl)
 {
+    // Copy sheet-local range names.
+    typedef map<SCTAB, const ScRangeName*> TabMapType;
+    TabMapType aOldNames;
+    pDoc->GetAllTabRangeNames(aOldNames);
+    TabMapType::const_iterator itr = aOldNames.begin(), itrEnd = aOldNames.end();
+    for (; itr != itrEnd; ++itr)
+    {
+        auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
+        maTabRangeNames.insert(itr->first, p);
+    }
+
     Init();
     FreeResource();
 }
@@ -136,6 +154,7 @@ void ScNameDlg::Init()
 
     DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" );
 
+    maLbScope.SetSelectHdl( LINK(this, ScNameDlg, ScopeChangedHdl) );
     aBtnOk.SetClickHdl		( LINK( this, ScNameDlg, OkBtnHdl ) );
     aBtnCancel.SetClickHdl	( LINK( this, ScNameDlg, CancelBtnHdl ) );
     aBtnAdd.SetClickHdl		( LINK( this, ScNameDlg, AddBtnHdl ) );
@@ -156,6 +175,17 @@ void ScNameDlg::Init()
     aBtnMore.AddWindow( &aBtnColHeader );
     aBtnMore.AddWindow( &aBtnRowHeader );
 
+    // Initialize scope list.
+    maLbScope.InsertEntry(maGlobalNameStr);
+    maLbScope.SelectEntryPos(0);
+    SCTAB n = pDoc->GetTableCount();
+    for (SCTAB i = 0; i < n; ++i)
+    {
+        String aTabName;
+        pDoc->GetName(i, aTabName);
+        maLbScope.InsertEntry(aTabName);
+    }
+
     UpdateNames();
 
     pViewData->GetSimpleArea( aRange );
@@ -176,7 +206,7 @@ void ScNameDlg::Init()
     EdModifyHdl( 0 );
 
     bSaved=TRUE;
-    SaveData();
+    SaveControlStates();
 }
 
 BOOL ScNameDlg::IsRefInputMode() const
@@ -216,7 +246,7 @@ void ScNameDlg::SetActive()
 
 void ScNameDlg::UpdateChecks()
 {
-    const ScRangeData* pData = aLocalRangeName.findByName(aEdName.GetText());
+    const ScRangeData* pData = mpCurRangeName->findByName(aEdName.GetText());
     if (pData)
     {
         aBtnCriteria .Check( pData->HasType( RT_CRITERIA ) );
@@ -260,7 +290,7 @@ void ScNameDlg::UpdateNames()
 
     aEdAssign.SetText( EMPTY_STRING );
 
-    if (aLocalRangeName.empty())
+    if (mpCurRangeName->empty())
     {
         aBtnAdd.SetText( aStrAdd );
         aBtnAdd.Disable();
@@ -268,7 +298,7 @@ void ScNameDlg::UpdateNames()
     }
     else
     {
-        ScRangeName::const_iterator itr = aLocalRangeName.begin(), itrEnd = aLocalRangeName.end();
+        ScRangeName::const_iterator itr = mpCurRangeName->begin(), itrEnd = mpCurRangeName->end();
         for (; itr != itrEnd; ++itr)
         {
             if (!itr->HasType(RT_DATABASE) && !itr->HasType(RT_SHARED))
@@ -295,7 +325,7 @@ void ScNameDlg::CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData )
     }
 }
 
-void ScNameDlg::SaveData()
+void ScNameDlg::SaveControlStates()
 {
     mpImpl->aStrSymbol = aEdAssign.GetText();
     mpImpl->bCriteria  = aBtnCriteria.IsChecked();
@@ -305,7 +335,7 @@ void ScNameDlg::SaveData()
     mpImpl->bDirty = true;
 }
 
-void ScNameDlg::RestoreData()
+void ScNameDlg::RestoreControlStates()
 {
     if ( mpImpl->bDirty )
     {
@@ -318,30 +348,9 @@ void ScNameDlg::RestoreData()
     }
 }
 
-IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
-{
-    if ( aBtnAdd.IsEnabled() )
-        AddBtnHdl( 0 );
-
-    if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() )
-    {
-        ScDocShell* pDocSh = pViewData->GetDocShell();
-        ScDocFunc aFunc(*pDocSh);
-        aFunc.ModifyRangeNames( aLocalRangeName );
-        Close();
-    }
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
-{
-    Close();
-    return 0;
-}
-
-IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
+bool ScNameDlg::AddPushed()
 {
-    BOOL	bAdded	  = FALSE;
+    bool bAdded = false;
     String	aNewEntry = aEdName.GetText();
     USHORT  nNamePos = aEdName.GetTopEntry();
     aNewEntry.EraseLeadingChars( ' ' );
@@ -379,21 +388,21 @@ IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
                 //	  in ein Token-Array uebersetzt werden?)
                 if ( 0 == pNewEntry->GetErrCode() )
                 {
-                    ScRangeData* pData = aLocalRangeName.findByName(aNewEntry);
+                    ScRangeData* pData = mpCurRangeName->findByName(aNewEntry);
                     if (pData)
                     {
                         pNewEntry->SetIndex(pData->GetIndex());
-                        aLocalRangeName.erase(*pData);
+                        mpCurRangeName->erase(*pData);
                     }
                     else
                         mpImpl->Clear();
 
-                    if ( !aLocalRangeName.insert( pNewEntry ) )
+                    if ( !mpCurRangeName->insert( pNewEntry ) )
                         delete pNewEntry;
 
                     UpdateNames();
                     bSaved=FALSE;
-                    RestoreData();
+                    RestoreControlStates();
                     aEdName.SetText(EMPTY_STRING);
                     aEdName.GrabFocus();
                     UpdateChecks();
@@ -424,10 +433,10 @@ IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
     return bAdded;
 }
 
-IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
+void ScNameDlg::RemovePushed()
 {
     const String aStrEntry = aEdName.GetText();
-    ScRangeData* pData = aLocalRangeName.findByName(aStrEntry);
+    ScRangeData* pData = mpCurRangeName->findByName(aStrEntry);
     if (pData)
     {
         String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
@@ -439,23 +448,22 @@ IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
         if ( RET_YES ==
              QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() )
         {
-            aLocalRangeName.erase(*pData);
+            mpCurRangeName->erase(*pData);
             UpdateNames();
             UpdateChecks();
             bSaved=FALSE;
-            RestoreData();
+            RestoreControlStates();
             theCurSel = Selection( 0, SELECTION_MAX );
             aBtnAdd.SetText( aStrAdd );
             aBtnAdd.Disable();
             aBtnRemove.Disable();
         }
     }
-    return 0;
 }
 
-IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
+void ScNameDlg::NameSelected()
 {
-    ScRangeData* pData = aLocalRangeName.findByName(aEdName.GetText());
+    ScRangeData* pData = mpCurRangeName->findByName(aEdName.GetText());
     if (pData)
     {
         String aSymbol;
@@ -466,6 +474,67 @@ IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
         theCurSel = Selection( 0, SELECTION_MAX );
     }
     UpdateChecks();
+}
+
+void ScNameDlg::ScopeChanged()
+{
+    sal_uInt16 nPos = maLbScope.GetSelectEntryPos();
+    if (nPos == 0)
+        // Global scope
+        mpCurRangeName = &maGlobalRangeName;
+    else
+    {
+        // Sheet scope
+        SCTAB nTab = static_cast<SCTAB>(nPos-1);
+        TabNameMapType::iterator itr = maTabRangeNames.find(nTab);
+        if (itr == maTabRangeNames.end())
+        {
+            auto_ptr<ScRangeName> p(new ScRangeName);
+            ::std::pair<TabNameMapType::iterator, bool> r =
+                maTabRangeNames.insert(nTab, p);
+            itr = r.first;
+        }
+        mpCurRangeName = itr->second;
+    }
+    aEdName.SetText(rtl::OUString());
+    UpdateNames();
+}
+
+IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
+{
+    if ( aBtnAdd.IsEnabled() )
+        AddBtnHdl( 0 );
+
+    if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() )
+    {
+        ScDocShell* pDocSh = pViewData->GetDocShell();
+        ScDocFunc aFunc(*pDocSh);
+        aFunc.ModifyRangeNames( maGlobalRangeName );
+        Close();
+    }
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
+{
+    Close();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
+{
+    return AddPushed();
+}
+
+IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
+{
+    RemovePushed();
+    return 0;
+}
+
+IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
+{
+    NameSelected();
     return 0;
 }
 
@@ -500,7 +569,7 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
                 if(!bSaved)
                 {
                     bSaved=TRUE;
-                    SaveData();
+                    SaveControlStates();
                 }
                 NameSelectHdl( 0 );
             }
@@ -511,7 +580,7 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
                 aBtnRemove.Disable();
 
                 bSaved=FALSE;
-                RestoreData();
+                RestoreControlStates();
             }
             theSymbol = aEdAssign.GetText();
 
@@ -550,4 +619,10 @@ IMPL_LINK( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
     return 0;
 }
 
+IMPL_LINK( ScNameDlg, ScopeChangedHdl, ListBox*, EMPTYARG )
+{
+    ScopeChanged();
+    return 0;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/src/namedlg.src b/sc/source/ui/src/namedlg.src
index 2029ca9..78fd1f7 100644
--- a/sc/source/ui/src/namedlg.src
+++ b/sc/source/ui/src/namedlg.src
@@ -162,16 +162,24 @@ ModelessDialog RID_SCDLG_NAMES
         Text [ en-US ] = "Repeat ~column" ;
         TabStop = TRUE ;
     };
+
     String STR_ADD
     {
         Text [ en-US ] = "~Add" ;
     };
+
     String STR_MODIFY
     {
         Text [ en-US ] = "Mod~ify" ;
     };
+
     String STR_INVALIDSYMBOL
     {
         Text [ en-US ] = "Invalid expression" ;
     };
+
+    String STR_GLOBAL_SCOPE
+    {
+        Text [ en-US ] = "Document (Global)";
+    };
 };
commit e9b1e56314015877a36848573bd75ed2e983a53b
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 20:44:54 2011 -0500

    Removed useless comments.

diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index 54c13d6..7ddba4e 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -57,11 +57,6 @@
 #define ABS_SREF3D		ABS_SREF | SCA_TAB_3D
 #define ABS_DREF3D		ABS_DREF | SCA_TAB_3D
 
-
-//============================================================================
-// Hilfsklasse: Merken der aktuellen Bereichsoptionen,
-// wenn ein Name in der ComboBox gefunden wird.
-
 struct ScNameDlgImpl
 {
     ScNameDlgImpl() :
@@ -86,12 +81,6 @@ struct ScNameDlgImpl
 
 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute();
 
-
-//============================================================================
-//	class ScNameDlg
-
-//----------------------------------------------------------------------------
-
 ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
                       ScViewData*		ptrViewData,
                       const ScAddress&	aCursorPos )
@@ -188,9 +177,6 @@ void ScNameDlg::Init()
 
     bSaved=TRUE;
     SaveData();
-
-    //@BugID 54702
-    //SFX_APPWINDOW->Disable(FALSE);		//! allgemeine Methode im ScAnyRefDlg
 }
 
 BOOL ScNameDlg::IsRefInputMode() const
@@ -203,10 +189,6 @@ void ScNameDlg::RefInputDone( BOOL bForced)
     ScAnyRefDlg::RefInputDone(bForced);
     EdModifyHdl(&aEdAssign);
 }
-//----------------------------------------------------------------------------
-// Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als
-// neue Selektion im Referenz-Edit angezeigt wird.
-
 
 void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
 {
@@ -243,8 +225,6 @@ void ScNameDlg::UpdateChecks()
         aBtnRowHeader.Check( pData->HasType( RT_ROWHEADER ) );
     }
 
-    // Falls Edit-Feld leer ist: Typ-CheckBoxen deaktivieren:
-
     if ( aEdName.GetText().Len() != 0 )
     {
         if ( !aFlType.IsEnabled() )
@@ -421,12 +401,9 @@ IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
                     aBtnAdd.Disable();
                     aBtnRemove.Disable();
 
-                    //@BugID 54702 raus mit dem Sch.
-                    //SFX_APPWINDOW->Disable(FALSE);		//! allgemeine Methode im ScAnyRefDlg
-
                     bAdded = TRUE;
                 }
-                else // theSymbol ungueltig
+                else
                 {
                     delete pNewEntry;
                     ERRORBOX( errMsgInvalidSym );
@@ -510,8 +487,6 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
             aFlAssign.Disable();
             aEdAssign.Disable();
             aRbAssign.Disable();
-            //@BugID 54702 raus mit dem Sch.
-            //SFX_APPWINDOW->Disable(FALSE);		//! allgemeine Methode im ScAnyRefDlg
         }
         else
         {
@@ -548,8 +523,6 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
             aFlAssign.Enable();
             aEdAssign.Enable();
             aRbAssign.Enable();
-            //@BugID 54702 raus mit dem Sch.
-            //SFX_APPWINDOW->Enable();
         }
         UpdateChecks();
         theCurSel = Selection( 0, SELECTION_MAX );
commit 08f5f0015af2fb0f2ba0955d264aae47e3fc69e4
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 20:41:01 2011 -0500

    More cleanups.

diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index f5d0899..54c13d6 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -64,25 +64,24 @@
 
 struct ScNameDlgImpl
 {
-    ScNameDlgImpl()
-        : bCriteria(FALSE),bPrintArea(FALSE),
-          bColHeader(FALSE),bRowHeader(FALSE),
-          bDirty(FALSE) {}
+    ScNameDlgImpl() :
+        bCriteria(false), bPrintArea(false),
+        bColHeader(false), bRowHeader(false),
+        bDirty(false) {}
 
     void Clear()
-        {
-            aStrSymbol.Erase();
-            bCriteria  = bPrintArea =
-            bColHeader = bRowHeader = FALSE;
-            bDirty = TRUE;
-        }
+    {
+        aStrSymbol = ::rtl::OUString();
+        bCriteria  = bPrintArea = bColHeader = bRowHeader = false;
+        bDirty = true;
+    }
 
-    String	aStrSymbol;
-    BOOL	bCriteria:1;
-    BOOL	bPrintArea:1;
-    BOOL	bColHeader:1;
-    BOOL	bRowHeader:1;
-    BOOL	bDirty:1;
+    ::rtl::OUString aStrSymbol;
+    bool bCriteria:1;
+    bool bPrintArea:1;
+    bool bColHeader:1;
+    bool bRowHeader:1;
+    bool bDirty:1;
 };
 
 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute();
commit ce30f0af33d3960a68852a307a15aa364738c872
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 20:22:38 2011 -0500

    Use data member and member methods instead of global and macros...

diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 287f3fa..42cb1c5 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -39,7 +39,7 @@
 
 class ScViewData;
 class ScDocument;
-
+struct ScNameDlgImpl;
 
 //==================================================================
 
@@ -79,12 +79,17 @@ private:
     const ScAddress	theCursorPos;
     Selection		theCurSel;
 
+    ScNameDlgImpl*  mpImpl;
+
 private:
     void Init();
     void UpdateChecks();
     void UpdateNames();
     void CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData );
 
+    void SaveData();
+    void RestoreData();
+
     // Handler:
     DECL_LINK( OkBtnHdl, void * );
     DECL_LINK( CancelBtnHdl, void * );
@@ -95,10 +100,8 @@ private:
     DECL_LINK( AssignGetFocusHdl, void * );
 
 protected:
-
     virtual void	RefInputDone( BOOL bForced = FALSE );
 
-
 public:
                     ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
                                ScViewData*		ptrViewData,
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index fa8561c..f5d0899 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -62,9 +62,9 @@
 // Hilfsklasse: Merken der aktuellen Bereichsoptionen,
 // wenn ein Name in der ComboBox gefunden wird.
 
-struct SaveData
+struct ScNameDlgImpl
 {
-    SaveData()
+    ScNameDlgImpl()
         : bCriteria(FALSE),bPrintArea(FALSE),
           bColHeader(FALSE),bRowHeader(FALSE),
           bDirty(FALSE) {}
@@ -85,27 +85,6 @@ struct SaveData
     BOOL	bDirty:1;
 };
 
-static SaveData* pSaveObj = NULL;
-
-#define SAVE_DATA() \
-    pSaveObj->aStrSymbol = aEdAssign.GetText(); 		\
-    pSaveObj->bCriteria  = aBtnCriteria.IsChecked();	\
-    pSaveObj->bPrintArea = aBtnPrintArea.IsChecked();	\
-    pSaveObj->bColHeader = aBtnColHeader.IsChecked();	\
-    pSaveObj->bRowHeader = aBtnRowHeader.IsChecked();	\
-    pSaveObj->bDirty	 = TRUE;
-
-#define RESTORE_DATA() \
-    if ( pSaveObj->bDirty ) 							\
-    {													\
-        aEdAssign.SetText( pSaveObj->aStrSymbol );		\
-        aBtnCriteria.Check( pSaveObj->bCriteria );		\
-        aBtnPrintArea.Check( pSaveObj->bPrintArea );	\
-        aBtnColHeader.Check( pSaveObj->bColHeader );	\
-        aBtnRowHeader.Check( pSaveObj->bRowHeader );	\
-        pSaveObj->bDirty = FALSE;						\
-    }
-
 #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute();
 
 
@@ -150,16 +129,16 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         pViewData		( ptrViewData ),
         pDoc			( ptrViewData->GetDocument() ),
         aLocalRangeName ( *(pDoc->GetRangeName()) ),
-        theCursorPos	( aCursorPos )  // zum Berechnen der Referenzen
+        theCursorPos	( aCursorPos ),
+        mpImpl(new ScNameDlgImpl)
 {
-    pSaveObj = new SaveData;
     Init();
     FreeResource();
 }
 
 ScNameDlg::~ScNameDlg()
 {
-    DELETEZ( pSaveObj );
+    delete mpImpl;
 }
 
 void ScNameDlg::Init()
@@ -209,7 +188,7 @@ void ScNameDlg::Init()
     EdModifyHdl( 0 );
 
     bSaved=TRUE;
-    SAVE_DATA()
+    SaveData();
 
     //@BugID 54702
     //SFX_APPWINDOW->Disable(FALSE);		//! allgemeine Methode im ScAnyRefDlg
@@ -337,6 +316,29 @@ void ScNameDlg::CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData )
     }
 }
 
+void ScNameDlg::SaveData()
+{
+    mpImpl->aStrSymbol = aEdAssign.GetText();
+    mpImpl->bCriteria  = aBtnCriteria.IsChecked();
+    mpImpl->bPrintArea = aBtnPrintArea.IsChecked();
+    mpImpl->bColHeader = aBtnColHeader.IsChecked();
+    mpImpl->bRowHeader = aBtnRowHeader.IsChecked();
+    mpImpl->bDirty = true;
+}
+
+void ScNameDlg::RestoreData()
+{
+    if ( mpImpl->bDirty )
+    {
+        aEdAssign.SetText( mpImpl->aStrSymbol );
+        aBtnCriteria.Check( mpImpl->bCriteria );
+        aBtnPrintArea.Check( mpImpl->bPrintArea );
+        aBtnColHeader.Check( mpImpl->bColHeader );
+        aBtnRowHeader.Check( mpImpl->bRowHeader );
+        mpImpl->bDirty = false;
+    }
+}
+
 IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
 {
     if ( aBtnAdd.IsEnabled() )
@@ -405,14 +407,14 @@ IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
                         aLocalRangeName.erase(*pData);
                     }
                     else
-                        pSaveObj->Clear();
+                        mpImpl->Clear();
 
                     if ( !aLocalRangeName.insert( pNewEntry ) )
                         delete pNewEntry;
 
                     UpdateNames();
                     bSaved=FALSE;
-                    RESTORE_DATA()
+                    RestoreData();
                     aEdName.SetText(EMPTY_STRING);
                     aEdName.GrabFocus();
                     UpdateChecks();
@@ -465,7 +467,7 @@ IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
             UpdateNames();
             UpdateChecks();
             bSaved=FALSE;
-            RESTORE_DATA()
+            RestoreData();
             theCurSel = Selection( 0, SELECTION_MAX );
             aBtnAdd.SetText( aStrAdd );
             aBtnAdd.Disable();
@@ -524,7 +526,7 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
                 if(!bSaved)
                 {
                     bSaved=TRUE;
-                    SAVE_DATA()
+                    SaveData();
                 }
                 NameSelectHdl( 0 );
             }
@@ -535,7 +537,7 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
                 aBtnRemove.Disable();
 
                 bSaved=FALSE;
-                RESTORE_DATA()
+                RestoreData();
             }
             theSymbol = aEdAssign.GetText();
 
commit bcbb2af3aa22aeb695f13973e7307fccb51fd481
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 19:38:19 2011 -0500

    Code cleanups.

diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 5a14cb5..287f3fa 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -79,7 +79,6 @@ private:
     const ScAddress	theCursorPos;
     Selection		theCurSel;
 
-#ifdef _NAMEDLG_CXX
 private:
     void Init();
     void UpdateChecks();
@@ -94,7 +93,6 @@ private:
     DECL_LINK( EdModifyHdl, Edit * );
     DECL_LINK( NameSelectHdl, void * );
     DECL_LINK( AssignGetFocusHdl, void * );
-#endif
 
 protected:
 
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index b2e828e..fa8561c 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -42,10 +42,8 @@
 #include "scresid.hxx"
 #include "globstr.hrc"
 #include "namedlg.hrc"
-
-#define _NAMEDLG_CXX
 #include "namedlg.hxx"
-#undef _NAMEDLG_CXX
+
 #include <vcl/msgbox.hxx>
 
 
@@ -159,17 +157,11 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
     FreeResource();
 }
 
-
-//----------------------------------------------------------------------------
-
 ScNameDlg::~ScNameDlg()
 {
     DELETEZ( pSaveObj );
 }
 
-
-//----------------------------------------------------------------------------
-
 void ScNameDlg::Init()
 {
     String	aAreaStr;
@@ -223,7 +215,6 @@ void ScNameDlg::Init()
     //SFX_APPWINDOW->Disable(FALSE);		//! allgemeine Methode im ScAnyRefDlg
 }
 
-//----------------------------------------------------------------------------
 BOOL ScNameDlg::IsRefInputMode() const
 {
     return aEdAssign.IsEnabled();
@@ -252,25 +243,17 @@ void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
     }
 }
 
-
-//----------------------------------------------------------------------------
 BOOL ScNameDlg::Close()
 {
     return DoClose( ScNameDlgWrapper::GetChildWindowId() );
 }
 
-
-//----------------------------------------------------------------------------
-
 void ScNameDlg::SetActive()
 {
     aEdAssign.GrabFocus();
     RefInputDone();
 }
 
-
-//----------------------------------------------------------------------------
-
 void ScNameDlg::UpdateChecks()
 {
     const ScRangeData* pData = aLocalRangeName.findByName(aEdName.GetText());
@@ -311,9 +294,6 @@ void ScNameDlg::UpdateChecks()
     }
 }
 
-
-//----------------------------------------------------------------------------
-
 void ScNameDlg::UpdateNames()
 {
     aEdName.SetUpdateMode( FALSE );
@@ -343,9 +323,6 @@ void ScNameDlg::UpdateNames()
     aEdName.Invalidate();
 }
 
-
-//----------------------------------------------------------------------------
-
 void ScNameDlg::CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData )
 {
     if ( pRangeData )
@@ -360,11 +337,6 @@ void ScNameDlg::CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData )
     }
 }
 
-
-//----------------------------------------------------------------------------
-// Handler:
-// ========
-
 IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
 {
     if ( aBtnAdd.IsEnabled() )
@@ -380,18 +352,11 @@ IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG )
     return 0;
 }
 
-
-//----------------------------------------------------------------------------
-
-IMPL_LINK_INLINE_START( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
+IMPL_LINK( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
 {
     Close();
     return 0;
 }
-IMPL_LINK_INLINE_END( ScNameDlg, CancelBtnHdl, void *, EMPTYARG )
-
-
-//----------------------------------------------------------------------------
 
 IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
 {
@@ -481,9 +446,6 @@ IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG )
     return bAdded;
 }
 
-
-//----------------------------------------------------------------------------
-
 IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
 {
     const String aStrEntry = aEdName.GetText();
@@ -513,9 +475,6 @@ IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG )
     return 0;
 }
 
-
-//----------------------------------------------------------------------------
-
 IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
 {
     ScRangeData* pData = aLocalRangeName.findByName(aEdName.GetText());
@@ -532,9 +491,6 @@ IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG )
     return 0;
 }
 
-
-//----------------------------------------------------------------------------
-
 IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
 {
     String	theName 	= aEdName.GetText();
@@ -614,14 +570,10 @@ IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd )
     return 0;
 }
 
-//------------------------------------------------------------------------
-
-IMPL_LINK_INLINE_START( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
+IMPL_LINK( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
 {
     EdModifyHdl( &aEdAssign );
     return 0;
 }
-IMPL_LINK_INLINE_END( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG )
-
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 3ec91537fd2c3ea4d554cad910166fc51b8dbe2a
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 19:05:40 2011 -0500

    Added new list box for the scopes, and adjusted the dialog layout.

diff --git a/sc/source/ui/inc/namedlg.hrc b/sc/source/ui/inc/namedlg.hrc
index d0560f9..891ba02 100644
--- a/sc/source/ui/inc/namedlg.hrc
+++ b/sc/source/ui/inc/namedlg.hrc
@@ -34,6 +34,8 @@
 #define BTN_HELP		5
 #define BTN_MORE		6
 
+#define FT_SCOPE        7
+#define LB_SCOPE        8
 #define FL_NAME         11
 #define ED_NAME			12
 #define FL_ASSIGN       13
diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx
index 1d62684..5a14cb5 100644
--- a/sc/source/ui/inc/namedlg.hxx
+++ b/sc/source/ui/inc/namedlg.hxx
@@ -33,6 +33,7 @@
 #include <vcl/combobox.hxx>
 #include <vcl/group.hxx>
 #include <vcl/fixed.hxx>
+#include <vcl/lstbox.hxx>
 #include "rangenam.hxx"
 #include "anyrefdg.hxx"
 
@@ -45,6 +46,8 @@ class ScDocument;
 class ScNameDlg : public ScAnyRefDlg
 {
 private:
+    FixedText       maFtScope;
+    ListBox         maLbScope;
     FixedLine       aFlName;
     ComboBox		aEdName;
 
diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx
index b467ab8..b2e828e 100644
--- a/sc/source/ui/namedlg/namedlg.cxx
+++ b/sc/source/ui/namedlg/namedlg.cxx
@@ -122,6 +122,8 @@ ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
 
     :	ScAnyRefDlg	( pB, pCW, pParent, RID_SCDLG_NAMES ),
         //
+        maFtScope( this, ScResId(FT_SCOPE) ),
+        maLbScope( this, ScResId(LB_SCOPE) ),
         aFlName         ( this, ScResId( FL_NAME ) ),
         aEdName 		( this, ScResId( ED_NAME ) ),
         //
diff --git a/sc/source/ui/src/namedlg.src b/sc/source/ui/src/namedlg.src
index b6a80b1..2029ca9 100644
--- a/sc/source/ui/src/namedlg.src
+++ b/sc/source/ui/src/namedlg.src
@@ -32,7 +32,7 @@ ModelessDialog RID_SCDLG_NAMES
     HelpId = FID_DEFINE_NAME ;
     Hide = TRUE ;
     SVLook = TRUE ;
-    Size = MAP_APPFONT ( 222 , 142 ) ;
+    Size = MAP_APPFONT ( 222 , 165 ) ;
     Text [ en-US ] = "Define Names" ;
     Moveable = TRUE ;
      // Closeable = TRUE;	// Dieser Dialog hat einen Cancel-Button !
@@ -69,15 +69,32 @@ ModelessDialog RID_SCDLG_NAMES
         Text [ en-US ] = "~Delete" ;
         TabStop = TRUE ;
     };
+
+    FixedText FT_SCOPE
+    {
+        Pos = MAP_APPFONT( 6, 8 );
+        Size = MAP_APPFONT( 40, 8 );
+        Text [ en-US ] = "Scope" ;
+    };
+
+    ListBox LB_SCOPE
+    {
+        Border = TRUE ;
+        Pos = MAP_APPFONT ( 50 , 7 ) ;
+        Size = MAP_APPFONT ( 100 , 80 ) ;
+        TabStop = TRUE ;
+        DropDown = TRUE ;
+    };
+
     FixedLine FL_NAME
     {
-        Pos = MAP_APPFONT ( 6 , 3 ) ;
+        Pos = MAP_APPFONT ( 6 , 24 ) ;
         Size = MAP_APPFONT ( 154 , 8 ) ;
         Text [ en-US ] = "Name" ;
     };
     ComboBox ED_NAME
     {
-        Pos = MAP_APPFONT ( 12 , 14 ) ;
+        Pos = MAP_APPFONT ( 12 , 37 ) ;
         Size = MAP_APPFONT ( 145 , 92 ) ;
         TabStop = TRUE ;
         VScroll = TRUE ;
@@ -85,27 +102,27 @@ ModelessDialog RID_SCDLG_NAMES
     };
     FixedLine FL_ASSIGN
     {
-        Pos = MAP_APPFONT ( 6 , 112 ) ;
+        Pos = MAP_APPFONT ( 6 , 135 ) ;
         Size = MAP_APPFONT ( 154 , 8 ) ;
         Text [ en-US ] = "Assigned to" ;
     };
     Edit ED_ASSIGN
     {
         Border = TRUE ;
-        Pos = MAP_APPFONT ( 12 , 123 ) ;
+        Pos = MAP_APPFONT ( 12 , 146 ) ;
         Size = MAP_APPFONT ( 131 , 12 ) ;
         TabStop = TRUE ;
     };
     ImageButton RB_ASSIGN
     {
-        Pos = MAP_APPFONT ( 145 , 122 ) ;
+        Pos = MAP_APPFONT ( 145 , 145 ) ;
         Size = MAP_APPFONT ( 13 , 15 ) ;
         TabStop = FALSE ;
         QuickHelpText [ en-US ] = "Shrink" ;
     };
     MoreButton BTN_MORE
     {
-        Pos = MAP_APPFONT ( 166 , 122 ) ;
+        Pos = MAP_APPFONT ( 166 , 146 ) ;
         Size = MAP_APPFONT ( 50 , 14 ) ;
         TabStop = TRUE ;
         MapUnit = MAP_APPFONT ;
@@ -113,34 +130,34 @@ ModelessDialog RID_SCDLG_NAMES
     };
     FixedLine FL_TYPE
     {
-        Pos = MAP_APPFONT ( 6 , 142 ) ;
+        Pos = MAP_APPFONT ( 6 , 168 ) ;
         Size = MAP_APPFONT ( 154 , 8 ) ;
         Text [ en-US ] = "Area type" ;
     };
     CheckBox BTN_PRINTAREA
     {
-        Pos = MAP_APPFONT ( 12 , 153 ) ;
+        Pos = MAP_APPFONT ( 12 , 179 ) ;
         Size = MAP_APPFONT ( 60 , 10 ) ;
         Text [ en-US ] = "~Print range" ;
         TabStop = TRUE ;
     };
     CheckBox BTN_CRITERIA
     {
-        Pos = MAP_APPFONT ( 12 , 167 ) ;
+        Pos = MAP_APPFONT ( 12 , 193 ) ;
         Size = MAP_APPFONT ( 60 , 10 ) ;
         Text [ en-US ] = "~Filter" ;
         TabStop = TRUE ;
     };
     CheckBox BTN_ROWHEADER
     {
-        Pos = MAP_APPFONT ( 75 , 167 ) ;
+        Pos = MAP_APPFONT ( 75 , 193 ) ;
         Size = MAP_APPFONT ( 82 , 10 ) ;
         Text [ en-US ] = "Repeat ~row" ;
         TabStop = TRUE ;
     };
     CheckBox BTN_COLHEADER
     {
-        Pos = MAP_APPFONT ( 75 , 153 ) ;
+        Pos = MAP_APPFONT ( 75 , 179 ) ;
         Size = MAP_APPFONT ( 82 , 10 ) ;
         Text [ en-US ] = "Repeat ~column" ;
         TabStop = TRUE ;
commit 8d92e67ed3b93965e81b0c9c079d81283560b624
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Mar 11 16:54:17 2011 -0500

    Removed the old sheet local name mapping bits.
    
    This was there for the VBA code to work around Calc's lack of
    sheet local named ranges.

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index aea4431..021043b 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -429,8 +429,6 @@ public:
     const String& 	GetCodeName() const { return aDocCodeName; }
     void                SetCodeName( const String& r ) { aDocCodeName = r; }
 
-    SC_DLLPUBLIC NameToNameMap*              GetLocalNameMap( SCTAB& rTab );
-
     void			GetDocStat( ScDocStat& rDocStat );
 
     SC_DLLPUBLIC void			InitDrawLayer( SfxObjectShell* pDocShell = NULL );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index eb13062..edc5bcf 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -187,7 +187,6 @@ private:
     Color           aTabBgColor;
     USHORT			nScenarioFlags;
     BOOL			bActiveScenario;
-    NameToNameMap       localNameToGlobalName;
     mutable ScRangeName* mpRangeName;
     bool            mbPageBreaksValid;
 
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 99779db..e064b63 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -199,14 +199,6 @@ BOOL ScDocument::GetCodeName( SCTAB nTab, String& rName ) const
     return FALSE;
 }
 
-NameToNameMap*
-ScDocument::GetLocalNameMap( SCTAB& rTab )
-{
-    if ( !HasTable( rTab ) )
-        return NULL;
-    return &pTab[rTab]->localNameToGlobalName;
-}
-
 BOOL ScDocument::GetTable( const String& rName, SCTAB& rTab ) const
 {
     String aUpperName = rName;
diff --git a/sc/source/filter/excel/xiname.cxx b/sc/source/filter/excel/xiname.cxx
index e59cee0..ca1271e 100644
--- a/sc/source/filter/excel/xiname.cxx
+++ b/sc/source/filter/excel/xiname.cxx
@@ -142,14 +142,6 @@ XclImpName::XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ) :
         mnScTab = static_cast< SCTAB >( nUsedTab - 1 );
     }
 
-#if 0
-    // find an unused name
-    String aOrigName( maScName );
-    sal_Int32 nCounter = 0;
-    while( rRangeNames.findByName(maScName) )
-        maScName.Assign( aOrigName ).Append( ' ' ).Append( String::CreateFromInt32( ++nCounter ) );
-#endif
-
     // 3) *** convert the name definition formula *** -------------------------
 
     rFmlaConv.Reset();
@@ -238,13 +230,6 @@ XclImpName::XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ) :
                 if ( pData->IsValidReference( aRange ) )
                 {
                     GetExtDocOptions().GetOrCreateTabSettings( nXclTab );
-                    // create a mapping between the unmodified localname to
-                    // the name in the global name container for named ranges
-                    OSL_TRACE(" mapping local name to global name for tab %d which exists? %s", nXclTab, GetDoc().HasTable( mnScTab ) ? "true" : "false" );
-                    SCTAB nTab( static_cast< SCTAB >( mnScTab ) );
-                    NameToNameMap* pMap = GetDoc().GetLocalNameMap( nTab );
-                    if ( pMap )
-                       (*pMap)[ aRealOrigName ] = maScName;
                 }
             }
         }
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index 3dd34ca..9c6df88 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -1122,19 +1122,19 @@ bool getScRangeListForAddress( const rtl::OUString& sName, ScDocShell* pDocSh, S
         rtl::OUString sAddress = (*it).trim();
         // if a local name ( on the active sheet ) exists this will
         // take precedence over a global with the same name
+        bool bLocalName = false;
         if ( !xNameAccess->hasByName( sAddress ) && pDocSh )
         {
             // try a local name
             ScDocument* pDoc = pDocSh->GetDocument();
-            SCTAB nCurTab = pDocSh->GetCurTab();
             if ( pDoc )
             {
-                NameToNameMap* pMap = pDoc->GetLocalNameMap( nCurTab );
-                if ( pMap )
+                SCTAB nCurTab = pDocSh->GetCurTab();
+                ScRangeName* pRangeName = pDoc->GetRangeName(nCurTab);
+                if (pRangeName)
                 {
-                    NameToNameMap::iterator itTmp = pMap->find( sAddress );
-                    if ( itTmp != pMap->end() ) // found a mapping
-                        sAddress = itTmp->second;
+                    bLocalName = pRangeName->findByName(sAddress) != NULL;
+                    // TODO: Handle local names correctly.
                 }
             }
         }


More information about the Libreoffice-commits mailing list