diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-04-25 21:38:28 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-06-01 17:31:55 +0200 |
commit | 1c0ea92c5722b19f515f3b2cd0bf2ddce94b58e7 (patch) | |
tree | 91a95e4b9acd153bec1b8abc8c5264a99715bf1a /sw/source | |
parent | e436f7139e246fa742a9dc62b18740ab99418400 (diff) |
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/36901
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/doc/DocumentRedlineManager.cxx | 21 | ||||
-rw-r--r-- | sw/source/core/inc/DocumentRedlineManager.hxx | 1 |
2 files changed, 22 insertions, 0 deletions
diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index fd8e3c21488f..093bdc719228 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; }; } |