diff options
author | Cor Nouws <oolst@nouenoff.nl> | 2015-09-23 00:40:06 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-09-23 23:55:53 +0200 |
commit | 2fcf8923d2c520a5a16b1b3a45877adaadd7eab4 (patch) | |
tree | 1b2439cf8c3ff23f20618fef778faa7f42ff0251 | |
parent | 12c2bbc317b355353d4f725c9439fbde803b4fc4 (diff) |
tdf#86397 Bookmark: no consecutive name numbering applied when copied
this partially changes behaviour introduced with commit bb00a0097900ae054401f7758a915047cfde4065
but without the performace problems from the old code
thanks to kendy for helping
Change-Id: I5dab81b58262f67db1c70223c612636a8b8c90ee
-rw-r--r-- | sw/source/core/doc/docbm.cxx | 12 | ||||
-rw-r--r-- | sw/source/core/inc/MarkManager.hxx | 2 |
2 files changed, 11 insertions, 3 deletions
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 916323e0b4e2..556ba8ea5f2f 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -1105,9 +1105,13 @@ namespace sw { namespace mark OUStringBuffer sBuf; OUString sTmp; - // Try the name "<rName>XXX", where XXX is a number. Start the number at the existing count rather than 1 - // in order to increase the chance that already the first one will not exist. - sal_Int32 nCnt = m_vAllMarks.size() + 1; + // try the name "<rName>XXX" (where XXX is a number starting from 1) unless there is + // a unused name. Due to performance-reasons (especially in mailmerge-Szenarios) there + // is a map m_aMarkBasenameMapUniqueOffset which holds the next possible offset (XXX) for + // rName (so there is no need to test for nCnt-values smaller than the offset). + sal_Int32 nCnt = 1; + MarkBasenameMapUniqueOffset_t::const_iterator aIter = m_aMarkBasenameMapUniqueOffset.find(rName); + if(aIter != m_aMarkBasenameMapUniqueOffset.end()) nCnt = aIter->second; while(nCnt < SAL_MAX_INT32) { sTmp = sBuf.append(rName).append(nCnt).makeStringAndClear(); @@ -1117,6 +1121,8 @@ namespace sw { namespace mark break; } } + m_aMarkBasenameMapUniqueOffset[rName] = nCnt; + return sTmp; } diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index e3484a2995c7..479a0ee0f3a9 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -28,6 +28,7 @@ namespace sw { namespace mark { + typedef std::unordered_map<OUString, sal_Int32, OUStringHash> MarkBasenameMapUniqueOffset_t; class MarkManager : private ::boost::noncopyable @@ -110,6 +111,7 @@ namespace sw { container_t m_vFieldmarks; std::unordered_set<OUString, OUStringHash> m_aMarkNamesSet; + mutable MarkBasenameMapUniqueOffset_t m_aMarkBasenameMapUniqueOffset; // container for annotation marks container_t m_vAnnotationMarks; |