summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Yin <steve_y@apache.org>2014-02-14 08:44:17 +0000
committerSteve Yin <steve_y@apache.org>2014-02-14 08:44:17 +0000
commitd89ee4f6306ce8f290e01c80edbcc28a5cd8dcc3 (patch)
tree8f356d48e98619afc20eb235f4df9ff45afe998d
parent95eeed58af27c63977a43c4d688b1467ef3cf047 (diff)
Bug 124065 - [Performance] Low performance opening attached .ods
Notes
-rw-r--r--sc/inc/document.hxx1
-rw-r--r--sc/source/core/data/documen3.cxx3
-rw-r--r--sc/source/ui/unoobj/nameuno.cxx67
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;
+ }
}
}
}