sw/source/core/doc/DocumentRedlineManager.cxx | 21 +++++++++++++++++++++ sw/source/core/inc/DocumentRedlineManager.hxx | 1 + 2 files changed, 22 insertions(+)
New commits: commit 7ab4ee1677470ae09a843a53326da81c6e17714a Author: Michael Stahl <mst...@redhat.com> Date: Tue Apr 25 21:38:28 2017 +0200 ofz#1262 sw: DeleteAndJoin could delete proposed new redline ... because that calls CompressRedlines, which may combine the new redline with a previous one. In that case, the part of the new redline that follows the currently handled overlap cannot be checked for overlaps with subsequent existing redlines. So prevent this with a new flag m_isForbidCompressRedlines and instead call CompressRedlines() at the end of AppendRedline(). Change-Id: I7567962c31366ded9a433a13232d3db985745e43 Reviewed-on: https://gerrit.libreoffice.org/37765 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index b9e6b39e5025..047d345a1d6c 100644 --- a/sw/source/core/doc/DocumentRedlineManager.cxx +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -30,6 +30,7 @@ #include <swmodule.hxx> #include <editsh.hxx> #include <vcl/layout.hxx> +#include <comphelper/flagguard.hxx> using namespace com::sun::star; @@ -1226,10 +1227,15 @@ bool DocumentRedlineManager::AppendRedline( SwRangeRedline* pNewRedl, bool bCall // also dealt with when moving the indices. if( bCallDelete ) { + ::comphelper::FlagGuard g(m_isForbidCompressRedlines); mpRedlineTable->Insert( pNewRedl ); m_rDoc.getIDocumentContentOperations().DeleteAndJoin( *pRedl ); if( !mpRedlineTable->Remove( pNewRedl ) ) + { + assert(false); // can't happen pNewRedl = nullptr; + } + bCompress = true; // delayed compress } delete pRedl; } @@ -1253,10 +1259,15 @@ bool DocumentRedlineManager::AppendRedline( SwRangeRedline* pNewRedl, bool bCall { // We insert temporarily so that pNew is // also dealt with when moving the indices. + ::comphelper::FlagGuard g(m_isForbidCompressRedlines); mpRedlineTable->Insert( pNewRedl ); m_rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); if( !mpRedlineTable->Remove( pNewRedl ) ) + { + assert(false); // can't happen pNewRedl = nullptr; + } + bCompress = true; // delayed compress n = 0; // re-initialize } bDec = true; @@ -1279,10 +1290,15 @@ bool DocumentRedlineManager::AppendRedline( SwRangeRedline* pNewRedl, bool bCall { // We insert temporarily so that pNew is // also dealt with when moving the indices. + ::comphelper::FlagGuard g(m_isForbidCompressRedlines); mpRedlineTable->Insert( pNewRedl ); m_rDoc.getIDocumentContentOperations().DeleteAndJoin( aPam ); if( !mpRedlineTable->Remove( pNewRedl ) ) + { + assert(false); // can't happen pNewRedl = nullptr; + } + bCompress = true; // delayed compress n = 0; // re-initialize bDec = true; } @@ -1777,6 +1793,11 @@ bool DocumentRedlineManager::AppendTableCellRedline( SwTableCellRedline* pNewRed void DocumentRedlineManager::CompressRedlines() { + if (m_isForbidCompressRedlines) + { + return; + } + CHECK_REDLINE( *this ) void (SwRangeRedline::*pFnc)(sal_uInt16, size_t) = nullptr; diff --git a/sw/source/core/inc/DocumentRedlineManager.hxx b/sw/source/core/inc/DocumentRedlineManager.hxx index 785c8eac8313..2a5c1cd24d1f 100644 --- a/sw/source/core/inc/DocumentRedlineManager.hxx +++ b/sw/source/core/inc/DocumentRedlineManager.hxx @@ -137,6 +137,7 @@ private: sal_uInt16 mnAutoFormatRedlnCommentNo; /**< SeqNo for conjoining of AutoFormat-Redlines. by the UI. Managed by SwAutoFormat! */ css::uno::Sequence <sal_Int8 > maRedlinePasswd; + bool m_isForbidCompressRedlines = false; }; }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits