diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-09-04 14:34:03 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-09-19 10:08:55 +0200 |
commit | fcaff77cd1cd24f38f764e2d544b8652c8f5c535 (patch) | |
tree | 6df16459b2045c550198f1db321f4efbf4891c4f | |
parent | eb09e94fb8ba54f3508266553c9c6444df782b94 (diff) |
sw: avoid updating redlines to be empty in Overwrite()
The problem is that SwIndexReg::Update will correct a 1-character
redline in the middle of the newly-inserted part of the overwrite string
into a 0-length redline, which then a later SwTextNode::Update() will
correct in such a way that the whole thing becomes unsorted.
Just delete redlines in the entire overwrite range, which should help;
the aPam actually deletes them in the *last* character only which
seems rather unintentional anyway.
Change-Id: I61b6b312998e0779651d30f636312ef13556428c
-rw-r--r-- | sw/source/core/doc/DocumentContentOperationsManager.cxx | 9 | ||||
-rw-r--r-- | sw/source/core/doc/DocumentRedlineManager.cxx | 2 |
2 files changed, 9 insertions, 2 deletions
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 45010c29cd4f..e0f071dddcb6 100644 --- a/sw/source/core/doc/DocumentContentOperationsManager.cxx +++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx @@ -2357,8 +2357,12 @@ bool DocumentContentOperationsManager::MoveAndJoin( SwPaM& rPaM, SwPosition& rPo return bRet; } +// Overwrite only uses the point of the PaM, the mark is ignored; characters +// are replaced from point until the end of the node; at the end of the node, +// characters are inserted. bool DocumentContentOperationsManager::Overwrite( const SwPaM &rRg, const OUString &rStr ) { + assert(rStr.getLength()); SwPosition& rPt = *const_cast<SwPosition*>(rRg.GetPoint()); if( m_rDoc.GetAutoCorrExceptWord() ) // Add to AutoCorrect { @@ -2382,6 +2386,7 @@ bool DocumentContentOperationsManager::Overwrite( const SwPaM &rRg, const OUStri ? pNode->GetpSwpHints()->Count() : 0; SwDataChanged aTmp( rRg ); SwIndex& rIdx = rPt.nContent; + sal_Int32 const nActualStart(rIdx.GetIndex()); sal_Int32 nStart = 0; bool bOldExpFlg = pNode->IsIgnoreDontExpand(); @@ -2443,14 +2448,14 @@ bool DocumentContentOperationsManager::Overwrite( const SwPaM &rRg, const OUStri if (!m_rDoc.GetIDocumentUndoRedo().DoesUndo() && !m_rDoc.getIDocumentRedlineAccess().IsIgnoreRedline() && !m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().empty()) { - SwPaM aPam( rPt.nNode, nStart, rPt.nNode, rPt.nContent.GetIndex() ); + SwPaM aPam(rPt.nNode, nActualStart, rPt.nNode, rPt.nContent.GetIndex()); m_rDoc.getIDocumentRedlineAccess().DeleteRedline( aPam, true, USHRT_MAX ); } else if( m_rDoc.getIDocumentRedlineAccess().IsRedlineOn() ) { // FIXME: this redline is WRONG: there is no DELETE, and the skipped // characters are also included in aPam - SwPaM aPam( rPt.nNode, nStart, rPt.nNode, rPt.nContent.GetIndex() ); + SwPaM aPam(rPt.nNode, nActualStart, rPt.nNode, rPt.nContent.GetIndex()); m_rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); } diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index 631b35e9e925..0fbebe7649ee 100644 --- a/sw/source/core/doc/DocumentRedlineManager.cxx +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -82,6 +82,8 @@ using namespace com::sun::star; for(SwRangeRedline* j : rTable) { // check for empty redlines + // note: these can destroy sorting in SwTextNode::Update() + // if there's another one wihout mark on the same pos. OSL_ENSURE( ( *(j->GetPoint()) != *(j->GetMark()) ) || ( j->GetContentIdx() != nullptr ), ERROR_PREFIX "empty redline" ); |