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

László Németh (via logerrit) logerrit at kemper.freedesktop.org
Sat Nov 14 19:42:43 UTC 2020


 sw/inc/docary.hxx                                       |    5 +-
 sw/qa/extras/uiwriter/uiwriter2.cxx                     |   35 ++++++++++++++++
 sw/source/core/doc/DocumentContentOperationsManager.cxx |    9 ++++
 sw/source/core/doc/docredln.cxx                         |   10 +++-
 4 files changed, 56 insertions(+), 3 deletions(-)

New commits:
commit 4ad0459494303745b377c848c681a747f294fc64
Author:     László Németh <nemeth at numbertext.org>
AuthorDate: Fri Nov 13 20:07:09 2020 +0100
Commit:     László Németh <nemeth at numbertext.org>
CommitDate: Sat Nov 14 20:41:54 2020 +0100

    tdf#138135: sw ChangesInMargin: join characters at backspace
    
    Words deleted by pressing multiple backspaces weren't shown
    on margin, only their first letter.
    
    Change-Id: I2f5d0bb057250d3bfd788e1007f1ad24f8c3c2fd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105807
    Tested-by: Jenkins
    Reviewed-by: László Németh <nemeth at numbertext.org>

diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
index 9b4a6e80ea26..4a3e2031420e 100644
--- a/sw/inc/docary.hxx
+++ b/sw/inc/docary.hxx
@@ -259,8 +259,11 @@ public:
      @param tableIndex position in SwRedlineTable to start searching at, will be updated with the index of the returned
                        redline (or the next redline after the given position if not found)
      @param next true: redline starts at position and ends after, false: redline starts before position and ends at or after
+     @param visible    true: redline must be visible false: redline must be not visible
     */
-    const SwRangeRedline* FindAtPosition( const SwPosition& startPosition, size_type& tableIndex, bool next = true ) const;
+    const SwRangeRedline* FindAtPosition( const SwPosition& startPosition,
+                                          size_type& tableIndex,
+                                          bool next = true, bool visible = true ) const;
 
     bool                        empty() const { return maVector.empty(); }
     size_type                   size() const { return maVector.size(); }
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 31ce73fb1c0b..dccf9de83c70 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -1925,6 +1925,41 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf137684)
     CPPUNIT_ASSERT(!pWrtShell->GetViewOptions()->IsShowChangesInMargin());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf138135)
+{
+    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 letter by letter by using backspace
+    dispatchCommand(mxComponent, ".uno:GoToNextWord", {});
+
+    for (int i = 0; i <= 10; ++i)
+    {
+        dispatchCommand(mxComponent, ".uno:SwBackspace", {});
+    }
+    CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("support"));
+
+    // single Undo undoes the deletion of the whole word
+    //
+    // This was only a 1-character Undo because of missing
+    // joining of the deleted characters
+    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 2e018b7a0567..146095349261 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -3992,6 +3992,15 @@ bool DocumentContentOperationsManager::DeleteAndJoinWithRedlineImpl( SwPaM & rPa
                     // within a paragraph TODO: fix also for paragraph join
                     pRedline->GetPoint()->nNode == pRedline->GetMark()->nNode)
             {
+                // show hidden previous deletion for joining
+                SwRedlineTable::size_type index = 0;
+                const SwRangeRedline* pPrevRedline = rTable.FindAtPosition(
+                                *pRedline->End(), index, /*bNext=*/false, /*bGetVisible=*/false );
+                if ( pPrevRedline && RedlineType::Delete == pPrevRedline->GetType() )
+                {
+                    SwRangeRedline* pPrevRed = rTable[ index ];
+                    pPrevRed->Show(1, index, /*bForced=*/true);
+                }
                 pRedline->Show(0, rTable.GetPos(pRedline), /*bForced=*/false);
                 pRedline->Show(1, rTable.GetPos(pRedline), /*bForced=*/false);
             }
diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx
index a41348027471..ab57f1bb6b50 100644
--- a/sw/source/core/doc/docredln.cxx
+++ b/sw/source/core/doc/docredln.cxx
@@ -702,13 +702,14 @@ SwRedlineTable::size_type SwRedlineTable::FindPrevSeqNo( sal_uInt16 nSeqNo, size
 
 const SwRangeRedline* SwRedlineTable::FindAtPosition( const SwPosition& rSttPos,
                                         size_type& rPos,
-                                        bool bNext ) const
+                                        bool bNext, bool bGetVisible ) const
 {
     const SwRangeRedline* pFnd = nullptr;
     for( ; rPos < maVector.size() ; ++rPos )
     {
         const SwRangeRedline* pTmp = (*this)[ rPos ];
-        if( pTmp->HasMark() && pTmp->IsVisible() )
+        bool bIsVisible(pTmp->IsVisible());
+        if( (pTmp->HasMark()) && bIsVisible && bGetVisible )
         {
             const SwPosition* pRStt = pTmp->Start(),
                       * pREnd = pRStt == pTmp->GetPoint() ? pTmp->GetMark()
@@ -724,6 +725,11 @@ const SwRangeRedline* SwRedlineTable::FindAtPosition( const SwPosition& rSttPos,
             else
                 break;
         }
+        else if ( !bIsVisible && !bGetVisible && *pTmp->Start() == rSttPos )
+        {
+            pFnd = pTmp;
+            break;
+        }
     }
     return pFnd;
 }


More information about the Libreoffice-commits mailing list