sw/source/core/doc/DocumentContentOperationsManager.cxx |   34 ++++++++++++++++
 1 file changed, 34 insertions(+)

New commits:
commit 985015195007ee236e62254bc5685816f7e4ec5a
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Wed Sep 27 00:41:22 2023 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Mon Oct 9 15:52:26 2023 +0200

    tdf#141198 sw: fix cycle case with change tracking
    
    Fix cycle case with change tracking by rejecting
    changes of the word, and setting the cursor inside
    the original word.
    
    Previously the cycle case resulted only in a tracked
    deletion and tracked insertion, putting the text
    cursor at after the word, so it was not possible to
    cycle on the different cases e.g. by pressing Shift-F3
    multiple times (and moving the text cursor inside
    the tracked insertion didn't help, because resulted
    in broken text at asking for the next cycle).
    
    A regression from commit 2d3c77e9b10f20091ef338e262ba7756eb280ce9
    "tdf#109266 sw change tracking: track transliteration".
    
    Change-Id: I819cf0ec722d54852bfc31f7765e0f06e2a07fd3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157303
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>
    (cherry picked from commit dc748d7dbd114fbf663752258dbaf003af2926c3)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157321
    Tested-by: Jenkins
    Reviewed-by: Patrick Luby <plub...@neooffice.org>

diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx 
b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index f7d24dd55ea0..47e5b818b2fb 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 #include <DocumentContentOperationsManager.hxx>
+#include <DocumentRedlineManager.hxx>
+#include <wrtsh.hxx>
 #include <doc.hxx>
 #include <IDocumentUndoRedo.hxx>
 #include <IDocumentMarkAccess.hxx>
@@ -2999,6 +3001,38 @@ void DocumentContentOperationsManager::TransliterateText(
             }
         } else {
             /* Cursor is not inside of a word. Nothing should happen. */
+            /* Except in the case of change tracking, when the cursor is at 
the end of the change */
+            /* Recognize and reject the previous deleted and inserted words to 
allow to cycle */
+            IDocumentRedlineAccess& rIDRA = m_rDoc.getIDocumentRedlineAccess();
+            if ( IDocumentRedlineAccess::IsShowChanges( 
rIDRA.GetRedlineFlags() ) &&
+                            pStt->GetContentIndex() > 0 )
+            {
+                SwPosition aPos(*pStt->GetContentNode(), 
pStt->GetContentIndex() - 1);
+                SwRedlineTable::size_type n = 0;
+
+                const SwRangeRedline* pFnd =
+                                    rIDRA.GetRedlineTable().FindAtPosition( 
aPos, n );
+                if ( pFnd && RedlineType::Insert == pFnd->GetType() && n > 0 )
+                {
+                    const SwRangeRedline* pFnd2 = rIDRA.GetRedlineTable()[n-1];
+                    if ( RedlineType::Delete == pFnd2->GetType() &&
+                          
m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell() &&
+                          *pFnd2->End() == *pFnd->Start() &&
+                          pFnd->GetAuthor() == pFnd2->GetAuthor() )
+                    {
+                        SwPosition aPos2(*pFnd2->End());
+                        rIDRA.RejectRedline(*pFnd, true);
+                        rIDRA.RejectRedline(*pFnd2, true);
+                        // positionate the text cursor inside the changed word 
to allow to cycle
+                        if ( SwWrtShell *pWrtShell = dynamic_cast<SwWrtShell*>(
+                                
m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell()) )
+                        {
+                            pWrtShell->GetCursor()->GetPoint()->
+                                    Assign(*aPos2.GetContentNode(), 
aPos2.GetContentIndex() - 1);
+                        }
+                    }
+                }
+            }
             return;
         }
     }

Reply via email to