diff options
author | Steve Yin <steve_y@apache.org> | 2014-02-14 08:44:17 +0000 |
---|---|---|
committer | Steve Yin <steve_y@apache.org> | 2014-02-14 08:44:17 +0000 |
commit | d89ee4f6306ce8f290e01c80edbcc28a5cd8dcc3 (patch) | |
tree | 8f356d48e98619afc20eb235f4df9ff45afe998d | |
parent | 95eeed58af27c63977a43c4d688b1467ef3cf047 (diff) |
Bug 124065 - [Performance] Low performance opening attached .ods
Notes
merged as: 8610d99b04720958b42047f08ef1f5b00a2d4f4f
-rw-r--r-- | sc/inc/document.hxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/documen3.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/unoobj/nameuno.cxx | 67 |
3 files changed, 56 insertions, 15 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 3338e255cfd6..d49f648023fe 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -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; } diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index 739028c16c0f..7be975f6b3c8 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -95,6 +95,9 @@ ScRangeName* ScDocument::GetRangeName() void ScDocument::SetRangeName( ScRangeName* pNewRangeName ) { + if (pRangeName == pNewRangeName) + return; + if (pRangeName) delete pRangeName; pRangeName = pNewRangeName; diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx index d4fc7ca23d7b..203603deb48c 100644 --- a/sc/source/ui/unoobj/nameuno.cxx +++ b/sc/source/ui/unoobj/nameuno.cxx @@ -160,7 +160,6 @@ void ScNamedRangeObj::Modify_Impl( const String* pNewRangeName, const ScTokenArr newNameScope = nameScope; //end of add - ScRangeName* pNewRanges = new ScRangeName( *pNames ); ScRangeData* pOld = (*pNames)[nPos]; String aInsName(pOld->GetName()); @@ -185,18 +184,38 @@ void ScNamedRangeObj::Modify_Impl( const String* pNewRangeName, const ScTokenArr pNew->SetIndex( pOld->GetIndex() ); pNew->SetRangeScope(newNameScope); - pNewRanges->AtFree( nPos ); - if ( pNewRanges->Insert(pNew) ) + const bool bSupportUndo(!pDoc->IsImportingXML()); + if ( bSupportUndo ) { - ScDocFunc aFunc(*pDocShell); - aFunc.SetNewRangeNames( pNewRanges, sal_True ); - aName = aInsName; //! broadcast? - aScopeName = pNewScopeName ? *pNewScopeName : aScopeName; + 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 { - delete pNew; //! uno::Exception/Fehler oder so - delete pNewRanges; + 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,23 +615,41 @@ void ScNamedRangesObj::ImplAddNewByScopeAndName(SCTAB aScope, const ::rtl::OUStr 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) ) + const bool bSupportUndo(!pDoc->IsImportingXML()); + if ( bSupportUndo ) { - ScDocFunc aFunc(*pDocShell); + ScRangeName* pNewRanges = new ScRangeName( *pNames ); + if ( pNewRanges->Insert(pNew) ) + { + ScDocFunc aFunc(*pDocShell); aFunc.SetNewRangeNames( pNewRanges, sal_True ); - bDone = true; + bDone = true; + } + else + { + delete pNew; + delete pNewRanges; + } } else { - delete pNew; - delete pNewRanges; + if ( pNames->Insert(pNew) ) + { + ScDocFunc aFunc(*pDocShell); + aFunc.SetNewRangeNames( pNames, sal_True ); + bDone = true; + } + else + { + delete pNew; + } } } } |