[Libreoffice-commits] core.git: sw/qa sw/source

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Wed Oct 21 06:38:52 UTC 2020


 sw/qa/extras/uiwriter/uiwriter2.cxx                     |   27 ++++++++++++++++
 sw/source/core/doc/DocumentContentOperationsManager.cxx |   13 +++++++
 sw/source/core/undo/unredln.cxx                         |   13 +++++++
 3 files changed, 53 insertions(+)

New commits:
commit 62596e7f52492305b49dab70bdf81daf82b930a1
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Tue Oct 20 11:33:47 2020 +0200
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Wed Oct 21 08:38:15 2020 +0200

    tdf#137526 sw ChangesInMargin: fix Undo of deleted words
    
    Follow-up of commit 1e383097aa929176bac33f46787e16d945a0a98b
    (tdf#34355 sw,offapi,officecfg: show track changes in margin).
    
    Change-Id: I81dd310b2664d19de272f7c61ba5ac142592f9f0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104557
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 8e7a9adffd62..b59708576b6b 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -1865,6 +1865,33 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf132160)
     dispatchCommand(mxComponent, ".uno:Undo", {});
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf137526)
+{
+    load(DATA_DIRECTORY, "tdf132160.odt");
+
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+
+    // switch on "Show changes in margin" mode
+    dispatchCommand(mxComponent, ".uno:ShowChangesInMargin", {});
+
+    SwWrtShell* const pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
+    CPPUNIT_ASSERT(pWrtShell->GetViewOptions()->IsShowChangesInMargin());
+
+    // select and delete a word
+    dispatchCommand(mxComponent, ".uno:WordRightSel", {});
+    dispatchCommand(mxComponent, ".uno:Delete", {});
+    CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("support"));
+
+    // this would crash due to bad redline range
+    dispatchCommand(mxComponent, ".uno:Undo", {});
+    CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Encryption"));
+
+    // switch off "Show changes in margin" mode
+    dispatchCommand(mxComponent, ".uno:ShowChangesInMargin", {});
+    CPPUNIT_ASSERT(!pWrtShell->GetViewOptions()->IsShowChangesInMargin());
+}
+
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf52391)
 {
     load(DATA_DIRECTORY, "tdf52391.fodt");
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 473e0dbe491b..48d258c0c3b6 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -3979,9 +3979,22 @@ bool DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl( SwPaM & rPa
                 "sw.core", "redlines will be moved in DeleteAndJoin");
         m_rDoc.getIDocumentRedlineAccess().SetRedlineFlags(
             RedlineFlags::On | RedlineFlags::ShowInsert | RedlineFlags::ShowDelete);
+
+        SwViewShell *pSh = m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell();
+        bool bShowChangesInMargin = pSh && pSh->GetViewOptions()->IsShowChangesInMargin();
+        const SwRedlineTable& rTable = m_rDoc.getIDocumentRedlineAccess().GetRedlineTable();
         for (SwRangeRedline * pRedline : redlines)
         {
             assert(pRedline->HasValidRange());
+
+            // deletions shown in margin
+            if (bShowChangesInMargin &&
+                    // within a paragraph TODO: fix also for paragraph join
+                    pRedline->GetPoint()->nNode == pRedline->GetMark()->nNode)
+            {
+                pRedline->Show(0, rTable.GetPos(pRedline), /*bForced=*/false);
+                pRedline->Show(1, rTable.GetPos(pRedline), /*bForced=*/false);
+            }
             undos.emplace_back(std::make_unique<SwUndoRedlineDelete>(
                         *pRedline, SwUndoId::DELETE));
         }
diff --git a/sw/source/core/undo/unredln.cxx b/sw/source/core/undo/unredln.cxx
index 92da377eb1bc..d2d60b60841f 100644
--- a/sw/source/core/undo/unredln.cxx
+++ b/sw/source/core/undo/unredln.cxx
@@ -90,6 +90,19 @@ void SwUndoRedline::UndoImpl(::sw::UndoRedoContext & rContext)
     SwDoc& rDoc = rContext.GetDoc();
     SwPaM& rPam(AddUndoRedoPaM(rContext));
 
+    // fix PaM for deletions shown in margin
+    SwRedlineTable::size_type nCurRedlinePos;
+    const SwRangeRedline * pRedline =
+            rDoc.getIDocumentRedlineAccess().GetRedline( *rPam.End(), &nCurRedlinePos );
+    if ( pRedline && !pRedline->IsVisible() )
+    {
+        const SwRedlineTable& rTable = rDoc.getIDocumentRedlineAccess().GetRedlineTable();
+        SwRangeRedline * pHiddenRedline( rTable[nCurRedlinePos] );
+        pHiddenRedline->Show(0, rTable.GetPos(pHiddenRedline), /*bForced=*/true);
+        pHiddenRedline->Show(1, rTable.GetPos(pHiddenRedline), /*bForced=*/true);
+        rPam = *pHiddenRedline;
+    }
+
     UndoRedlineImpl(rDoc, rPam);
 
     if( mpRedlSaveData )


More information about the Libreoffice-commits mailing list