[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