summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-10-31 10:22:28 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-10-31 10:57:58 +0100
commit997055f50db39557425c9da58bcd3f01a8584676 (patch)
treefe281896b6db3f1ba42724c4b42ef1d7fc099496
parentbf4aa9172a906353251b39bd4d3c27f7f30efee7 (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. Change-Id: Idfa8e9fe3acc93f1138f5bb12c2419c1492f8ff1
-rw-r--r--sw/inc/doc.hxx4
-rw-r--r--sw/source/core/doc/DocumentLayoutManager.cxx2
-rw-r--r--sw/source/core/doc/docnew.cxx1
-rw-r--r--sw/source/uibase/dbui/dbmgr.cxx8
4 files changed, 14 insertions, 1 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 3bbf5462bef2..eb1a240b62f7 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -372,6 +372,7 @@ private:
frames need deletion. */
bool mbCopyIsMove : 1; //< TRUE: Copy is a hidden Move.
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.
@@ -1016,6 +1017,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/DocumentLayoutManager.cxx b/sw/source/core/doc/DocumentLayoutManager.cxx
index 19b07cbecbd6..63146ac23fbe 100644
--- a/sw/source/core/doc/DocumentLayoutManager.cxx
+++ b/sw/source/core/doc/DocumentLayoutManager.cxx
@@ -412,7 +412,7 @@ SwFrmFmt *DocumentLayoutManager::CopyLayoutFmt(
if( !m_rSwdoc.IsCopyIsMove() || &m_rSwdoc != pSrcDoc )
{
- if( m_rSwdoc.IsInReading() )
+ if( m_rSwdoc.IsInReading() || m_rSwdoc.IsInMailMerge() )
pDest->SetName( OUString() );
else
{
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index 227dcc7d1de7..a8405d551317 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -262,6 +262,7 @@ SwDoc::SwDoc()
mbDtor(false),
mbCopyIsMove(false),
mbInReading(false),
+ mbInMailMerge(false),
mbInXMLImport(false),
mbUpdateTOX(false),
mbInLoadAsynchron(false),
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx
index 141f9a2891e3..6f17f51875fb 100644
--- a/sw/source/uibase/dbui/dbmgr.cxx
+++ b/sw/source/uibase/dbui/dbmgr.cxx
@@ -941,6 +941,7 @@ bool SwDBManager::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, true );
@@ -1267,6 +1268,13 @@ bool SwDBManager::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();