Author: steve_y
Date: Fri Feb 14 08:44:17 2014
New Revision: 1568219

URL: http://svn.apache.org/r1568219
Log:
Bug 124065 - [Performance] Low performance opening attached .ods

Modified:
    openoffice/trunk/main/sc/inc/document.hxx
    openoffice/trunk/main/sc/source/core/data/documen3.cxx
    openoffice/trunk/main/sc/source/ui/unoobj/nameuno.cxx

Modified: openoffice/trunk/main/sc/inc/document.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sc/inc/document.hxx?rev=1568219&r1=1568218&r2=1568219&view=diff
==============================================================================
--- openoffice/trunk/main/sc/inc/document.hxx (original)
+++ openoffice/trunk/main/sc/inc/document.hxx Fri Feb 14 08:44:17 2014
@@ -503,6 +503,7 @@ public:
        ScFieldEditEngine*      CreateFieldEditEngine();
        void                            
DisposeFieldEditEngine(ScFieldEditEngine*& rpEditEngine);
 
+       // Note: the returned ScRangeName is volatile, and it can be changed at 
any time.
        SC_DLLPUBLIC ScRangeName*       GetRangeName();
        void                    SetRangeName( ScRangeName* pNewRangeName );
        SCTAB                   GetMaxTableNumber() { return nMaxTableNumber; }

Modified: openoffice/trunk/main/sc/source/core/data/documen3.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/core/data/documen3.cxx?rev=1568219&r1=1568218&r2=1568219&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/core/data/documen3.cxx (original)
+++ openoffice/trunk/main/sc/source/core/data/documen3.cxx Fri Feb 14 08:44:17 
2014
@@ -95,6 +95,9 @@ ScRangeName* ScDocument::GetRangeName()
 
 void ScDocument::SetRangeName( ScRangeName* pNewRangeName )
 {
+       if (pRangeName == pNewRangeName)
+               return;
+
        if (pRangeName)
                delete pRangeName;
        pRangeName = pNewRangeName;

Modified: openoffice/trunk/main/sc/source/ui/unoobj/nameuno.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sc/source/ui/unoobj/nameuno.cxx?rev=1568219&r1=1568218&r2=1568219&view=diff
==============================================================================
--- openoffice/trunk/main/sc/source/ui/unoobj/nameuno.cxx (original)
+++ openoffice/trunk/main/sc/source/ui/unoobj/nameuno.cxx Fri Feb 14 08:44:17 
2014
@@ -159,8 +159,7 @@ void ScNamedRangeObj::Modify_Impl( const
                                                        else if (!pNewScopeName 
|| *pNewScopeName == EMPTY_STRING )
                                                                newNameScope = 
nameScope;
                                                        //end of add
-
-                            ScRangeName* pNewRanges = new ScRangeName( *pNames 
);
+                            
                             ScRangeData* pOld = (*pNames)[nPos];
 
                             String aInsName(pOld->GetName());
@@ -184,20 +183,40 @@ void ScNamedRangeObj::Modify_Impl( const
                                 pNew = new ScRangeData( pDoc, aInsName, 
aContent, aPos, nType, eGrammar );
                             pNew->SetIndex( pOld->GetIndex() );
                             pNew->SetRangeScope(newNameScope);
-                                                       
-                            pNewRanges->AtFree( nPos );
-                            if ( pNewRanges->Insert(pNew) )
-                            {
-                                 ScDocFunc aFunc(*pDocShell);
-                                 aFunc.SetNewRangeNames( pNewRanges, sal_True 
);
-                                 aName = aInsName;     //! broadcast?
-                                 aScopeName = pNewScopeName ? *pNewScopeName : 
aScopeName;
-                            }
-                            else
-                            {
-                                 delete pNew;          //! 
uno::Exception/Fehler oder so
-                                 delete pNewRanges;
-                            }
+
+                                                       const bool 
bSupportUndo(!pDoc->IsImportingXML());
+                                                       if ( bSupportUndo )
+                                                       {
+                                                               ScRangeName* 
pNewRanges = new ScRangeName( *pNames );
+                                                               
pNewRanges->AtFree( nPos );
+                                                               if ( 
pNewRanges->Insert(pNew) )
+                                                               {
+                                                                        
ScDocFunc aFunc(*pDocShell);
+                                                                        
aFunc.SetNewRangeNames( pNewRanges, sal_True );
+                                                                        aName 
= aInsName;      //! broadcast?
+                                                                        
aScopeName = pNewScopeName ? *pNewScopeName : aScopeName;
+                                                               }
+                                                               else
+                                                               {
+                                                                        delete 
pNew;           //! uno::Exception/Fehler oder so
+                                                                        delete 
pNewRanges;
+                                                               }
+                                                       }
+                                                       else
+                                                       {
+                                                               pNames->AtFree( 
nPos );
+                                                               if ( 
pNames->Insert(pNew) )
+                                                               {
+                                                                        
ScDocFunc aFunc(*pDocShell);
+                                                                        
aFunc.SetNewRangeNames( pNames, sal_True );
+                                                                        aName 
= aInsName;      //! broadcast?
+                                                                        
aScopeName = pNewScopeName ? *pNewScopeName : aScopeName;
+                                                               }
+                                                               else
+                                                               {
+                                                                        delete 
pNew;           //! uno::Exception/Fehler oder so                               
                                         
+                                                               }
+                                                       }
                        }
               }
        }
@@ -596,24 +615,42 @@ void ScNamedRangesObj::ImplAddNewByScope
               String aContStr(aContent);
                if (pNames && !pNames->SearchName(aNameStr, nIndex,aScope))
                {
-                   ScRangeName* pNewRanges = new ScRangeName( *pNames );
+                   
             // GRAM_PODF_A1 for API compatibility.
                    ScRangeData* pNew = new ScRangeData( pDoc, aNameStr, 
aContStr,
                                                                                
                aPos, nNewType,formula::FormulaGrammar::GRAM_PODF_A1 
);//GRAM_ODFF,//
 
                    pNew->SetRangeScope(aScope);
                        
-                   if ( pNewRanges->Insert(pNew) )
-                   {
-                               ScDocFunc aFunc(*pDocShell);
-                            aFunc.SetNewRangeNames( pNewRanges, sal_True );
-                               bDone = true;
-                   }
-                   else
-                   {
-                               delete pNew;
-                            delete pNewRanges;
-                   }
+                                  const bool 
bSupportUndo(!pDoc->IsImportingXML());
+                                  if ( bSupportUndo )
+                                  {
+                                          ScRangeName* pNewRanges = new 
ScRangeName( *pNames );
+                                          if ( pNewRanges->Insert(pNew) )
+                                          {
+                                                       ScDocFunc 
aFunc(*pDocShell);
+                                                       aFunc.SetNewRangeNames( 
pNewRanges, sal_True );
+                                                       bDone = true;
+                                          }
+                                          else
+                                          {
+                                                       delete pNew;
+                                                       delete pNewRanges;
+                                          }
+                                  }
+                                  else
+                                  {                                       
+                                          if ( pNames->Insert(pNew) )
+                                          {
+                                                       ScDocFunc 
aFunc(*pDocShell);
+                                                       aFunc.SetNewRangeNames( 
pNames, sal_True );
+                                                       bDone = true;
+                                          }
+                                          else
+                                          {
+                                                       delete pNew;
+                                          }
+                                  }
                }
        }
 


Reply via email to