diff options
author | Michael Stahl <mstahl@redhat.com> | 2017-04-25 21:38:28 +0200 |
---|---|---|
committer | Björn Michaelsen <bjoern.michaelsen@libreoffice.org> | 2017-05-03 16:01:15 +0200 |
commit | 3b6d36eb02f894b348a1132d6e49cb5b6e2a6a2b (patch) | |
tree | 701e7cdcc26faddbf818f4163a9a933bb9988d1c | |
parent | 87a1f2b064303df317a618e9a21bcf256173cc81 (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/37041
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit 5d1c6f1c9f392679cec6f1f4ab9673ab31e96585)
Reviewed-on: https://gerrit.libreoffice.org/37195
Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
Tested-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
-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 6db6b797dc35..f2d51192759d 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 bdcd45c5fc67..999cbd7137ce 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; }; } |