sw/source/core/doc/DocumentRedlineManager.cxx |   21 +++++++++++++++++++++
 sw/source/core/inc/DocumentRedlineManager.hxx |    1 +
 2 files changed, 22 insertions(+)

New commits:
commit 3b6d36eb02f894b348a1132d6e49cb5b6e2a6a2b
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/37041
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>
    (cherry picked from commit 5d1c6f1c9f392679cec6f1f4ab9673ab31e96585)
    Reviewed-on: https://gerrit.libreoffice.org/37195
    Reviewed-by: Björn Michaelsen <bjoern.michael...@libreoffice.org>
    Tested-by: Björn Michaelsen <bjoern.michael...@libreoffice.org>

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;
 };
 
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to