summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-10-31 10:22:28 +0100
committerLuboš Luňák <l.lunak@collabora.com>2014-11-14 13:26:01 +0100
commita6b78999adc23f70071de811d36c19ce01aee013 (patch)
tree83f1effefca682d25dba758536458a215ee06e21
parent5b09df234f11e4d964170e8872897552cdf71021 (diff)
SwDBManager::MergeMailFiles: set unique fly names at the end of the merge
When generating a unique fly name, we have to iterate over all the existing flys to find out what's the first not used one, so doing this for every new fly inserted by mail merge is O(n^2). During import, we already skip this and only do it once at the end of the import, which is O(n). Fix the performance problem by skipping the unique fly name generating when we produce a combined mail merge document as well, and just generate them once the mail merge is complete. For a test document having 12 text frames and 2000 mail merge records, the times for css::text::MailMerge::execute() is 9m37.330s -> 8m18.811s. Conflicts: sw/inc/doc.hxx sw/source/core/doc/DocumentLayoutManager.cxx sw/source/uibase/dbui/dbmgr.cxx Change-Id: Idfa8e9fe3acc93f1138f5bb12c2419c1492f8ff1
-rw-r--r--sw/inc/doc.hxx4
-rw-r--r--sw/source/core/doc/doclay.cxx2
-rw-r--r--sw/source/core/doc/docnew.cxx1
-rw-r--r--sw/source/ui/dbui/dbmgr.cxx8
4 files changed, 14 insertions, 1 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 86aae2817d6c..c7d7af8de5ef 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -436,6 +436,7 @@ private:
bool mbCopyIsMove : 1; ///< TRUE: Copy is a hidden Move.
bool mbVisibleLinks : 1; ///< TRUE: Links are inserted visibly.
bool mbInReading : 1; ///< TRUE: Document is in the process of being read.
+ bool mbInMailMerge : 1; //< TRUE: Document is in the process of being written by mail merge.
bool mbInXMLImport : 1; ///< TRUE: During xml import, attribute portion building is not necessary.
bool mbUpdateTOX : 1; ///< TRUE: After loading document, update TOX.
bool mbInLoadAsynchron : 1; ///< TRUE: Document is in the process of being loaded asynchronously.
@@ -1428,6 +1429,9 @@ public:
bool IsInReading() const { return mbInReading; }
void SetInReading( bool bNew ) { mbInReading = bNew; }
+ bool IsInMailMerge() const { return mbInMailMerge; }
+ void SetInMailMerge( bool bNew ) { mbInMailMerge = bNew; }
+
bool IsClipBoard() const { return mbClipBoard; }
/// N.B.: must be called right after constructor! (@see GetXmlIdRegistry)
void SetClipBoard( bool bNew ) { mbClipBoard = bNew; }
diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx
index 3097633a3aff..2da20a1546d4 100644
--- a/sw/source/core/doc/doclay.cxx
+++ b/sw/source/core/doc/doclay.cxx
@@ -411,7 +411,7 @@ SwFrmFmt *SwDoc::CopyLayoutFmt( const SwFrmFmt& rSource,
if( !mbCopyIsMove || this != pSrcDoc )
{
- if( mbInReading )
+ if( mbInReading || IsInMailMerge())
pDest->SetName( aEmptyStr );
else
{
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index 112bdf59a62b..bd24134527a2 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -259,6 +259,7 @@ SwDoc::SwDoc()
mbCopyIsMove(false),
mbVisibleLinks(true),
mbInReading(false),
+ mbInMailMerge(false),
mbInXMLImport(false),
mbUpdateTOX(false),
mbInLoadAsynchron(false),
diff --git a/sw/source/ui/dbui/dbmgr.cxx b/sw/source/ui/dbui/dbmgr.cxx
index 62d607f0b89a..9685b3ba495d 100644
--- a/sw/source/ui/dbui/dbmgr.cxx
+++ b/sw/source/ui/dbui/dbmgr.cxx
@@ -1024,6 +1024,7 @@ sal_Bool SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell,
pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() );
pTargetShell = pTargetView->GetWrtShellPtr();
pTargetDoc = pTargetShell->GetDoc();
+ pTargetDoc->SetInMailMerge(true);
//copy the styles from the source to the target document
pTargetView->GetDocShell()->_LoadStyles( *pSourceDocSh, sal_True );
@@ -1357,6 +1358,13 @@ sal_Bool SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell,
}
} while( !bCancel &&
(bSynchronizedDoc && (nStartRow != nEndRow)? ExistsNextRecord() : ToNextMergeRecord()));
+ if (rMergeDescriptor.bCreateSingleFile)
+ {
+ // sw::DocumentLayoutManager::CopyLayoutFmt() did not generate
+ // unique fly names, do it here once.
+ pTargetDoc->SetInMailMerge(false);
+ pTargetDoc->SetAllUniqueFlyNames();
+ }
for( sal_uInt16 i = 0; i < 25; i++)
Application::Reschedule();