summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver-Rainer Wittmann <orw@apache.org>2014-06-16 08:40:28 +0000
committerCaolán McNamara <caolanm@redhat.com>2014-06-16 13:28:39 +0100
commit61df5e69df443dad24acbd8257a83aadb3888099 (patch)
tree4795f6478e3ddcebbd480b3c465ca1a4da4b4603
parente38acfa15b52353565ad9ddaf3cf96dd13c5b0fb (diff)
Resolves: #i125055# follow-up of fix for #i124338#
adjust condition to trigger sort of bookmarks in order to avoid serious performance decrease Kudos to Ariel for his analysis (cherry picked from commit 6895a55d74fe6a3b70ba15f77050652d3afee821) Change-Id: Ic72b0a07556ec85a6ee2568f814b8bcfaaabe42e
-rw-r--r--sw/source/core/txtnode/ndtxt.cxx24
1 files changed, 20 insertions, 4 deletions
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index d785c6a8d725..ba6061d5f679 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -1055,6 +1055,8 @@ void SwTxtNode::Update(
// Bookmarks must never grow to either side, when editing (directly) to the left or right (#i29942#)!
// And a bookmark with same start and end must remain to the left of the inserted text (used in XML import).
{
+ bool bAtLeastOneBookmarkMoved = false;
+ bool bAtLeastOneExpandedBookmarkAtInsertionPosition = false;
const IDocumentMarkAccess* const pMarkAccess = getIDocumentMarkAccess();
for ( IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
ppMark != pMarkAccess->getAllMarksEnd();
@@ -1062,14 +1064,28 @@ void SwTxtNode::Update(
{
const ::sw::mark::IMark* const pMark = ppMark->get();
const SwPosition* pEnd = &pMark->GetMarkEnd();
- SwIndex & rIdx = const_cast<SwIndex&>(pEnd->nContent);
+ SwIndex & rEndIdx = const_cast<SwIndex&>(pEnd->nContent);
if( this == &pEnd->nNode.GetNode() &&
- rPos.GetIndex() == rIdx.GetIndex() )
+ rPos.GetIndex() == rEndIdx.GetIndex() )
{
- rIdx.Assign( &aTmpIdxReg, rIdx.GetIndex() );
- bSortMarks = true;
+ rEndIdx.Assign( &aTmpIdxReg, rEndIdx.GetIndex() );
+ bAtLeastOneBookmarkMoved = true;
+ }
+ else if ( !bAtLeastOneExpandedBookmarkAtInsertionPosition )
+ {
+ if ( pMark->IsExpanded() )
+ {
+ const SwPosition* pStart = &pMark->GetMarkStart();
+ if ( this == &pStart->nNode.GetNode()
+ && rPos.GetIndex() == pStart->nContent.GetIndex() )
+ {
+ bAtLeastOneExpandedBookmarkAtInsertionPosition = true;
+ }
+ }
}
}
+
+ bSortMarks = bAtLeastOneBookmarkMoved && bAtLeastOneExpandedBookmarkAtInsertionPosition;
}
}