diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2014-06-16 08:40:28 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-06-16 13:28:39 +0100 |
commit | 61df5e69df443dad24acbd8257a83aadb3888099 (patch) | |
tree | 4795f6478e3ddcebbd480b3c465ca1a4da4b4603 /sw | |
parent | e38acfa15b52353565ad9ddaf3cf96dd13c5b0fb (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
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 24 |
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; } } |