summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2021-11-03 12:46:41 +0100
committerLászló Németh <nemeth@numbertext.org>2021-11-03 14:14:58 +0100
commit643bbf9e47e909b2d4acefaee791c9dd7d9e4a8d (patch)
treecfb4b702c7c75fd1b58d91a527c2c29def84286a
parente72bbb8d41cdf3eec86804afa1a6dd527925be04 (diff)
tdf#145311 sw track changes: fix moving over empty list item
which was changed to tracked insertion. Follow-up to commit 4c982dbafdac900e233d7b68d95c9c99244defc1 "tdf#145225 sw track changes: fix bad insert at moving". Change-Id: If3d70da71188e95b5aeea9b72e7c9de22d7c7150 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124645 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r--sw/qa/extras/uiwriter/data/tdf145311.fodt39
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx35
-rw-r--r--sw/source/core/doc/docnum.cxx51
3 files changed, 125 insertions, 0 deletions
diff --git a/sw/qa/extras/uiwriter/data/tdf145311.fodt b/sw/qa/extras/uiwriter/data/tdf145311.fodt
new file mode 100644
index 000000000000..2ebc9d0ebf14
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf145311.fodt
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:officeooo="http://openoffice.org/2009/office" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <office:styles>
+ <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+ <style:default-style style:family="paragraph">
+ <style:text-properties fo:language="en" fo:country="US"/>
+ </style:default-style>
+ </office:styles>
+ <office:body>
+ <office:text>
+ <text:list xml:id="list3957351959" text:style-name="L1">
+ <text:list-item>
+ <text:p text:style-name="P1">January</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">February</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">March</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1"/>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">April</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">May</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">June</text:p>
+ </text:list-item>
+ <text:list-item>
+ <text:p text:style-name="P1">July</text:p>
+ </text:list-item>
+ </text:list>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index b9904e0d3f3e..202c6d5855ff 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -959,6 +959,41 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf145066_bad_paragraph_deletion)
pTextDoc->getText()->getString());
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf145311_move_over_empty_paragraphs)
+{
+ // check move up/down with redlining: jumping over an empty paragraph
+ // resulted bad insertion of the empty paragraph in Show Changes mode
+ SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf145311.fodt");
+
+ //turn on red-lining and show changes
+ pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete
+ | RedlineFlags::ShowInsert);
+ CPPUNIT_ASSERT_MESSAGE("redlining should be on",
+ pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+ CPPUNIT_ASSERT_MESSAGE(
+ "redlines should be visible",
+ IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+
+ // 8 paragraphs (list items)
+ CPPUNIT_ASSERT_EQUAL(8, getParagraphs());
+
+ // move down the first item over the empty paragraph
+ for (int i = 0; i < 4; ++i)
+ dispatchCommand(mxComponent, ".uno:MoveDown", {});
+
+ SwEditShell* const pEditShell(pDoc->GetEditShell());
+ // This was 3 (bad conversion of the empty item to a tracked insertion)
+ CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), pEditShell->GetRedlineCount());
+
+ // check move up
+
+ for (int i = 0; i < 3; ++i)
+ dispatchCommand(mxComponent, ".uno:MoveUp", {});
+
+ // This was 3 (bad conversion of the empty item to a tracked insertion)
+ CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(2), pEditShell->GetRedlineCount());
+}
+
CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf54819)
{
SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf54819.fodt");
diff --git a/sw/source/core/doc/docnum.cxx b/sw/source/core/doc/docnum.cxx
index c496fa9db4dd..12b23c2fbb42 100644
--- a/sw/source/core/doc/docnum.cxx
+++ b/sw/source/core/doc/docnum.cxx
@@ -2172,6 +2172,12 @@ bool SwDoc::MoveParagraphImpl(SwPaM& rPam, SwNodeOffset const nOffset,
--aIdx; // move before insertion
+ // adjust empty nodes later
+ SwTextNode const*const pIsEmptyNode(nOffset < SwNodeOffset(0)
+ ? aInsPos.nNode.GetNode().GetTextNode()
+ : aIdx.GetNode().GetTextNode());
+ bool bIsEmptyNode = pIsEmptyNode && pIsEmptyNode->Len() == 0;
+
getIDocumentContentOperations().CopyRange(aPam, aInsPos, SwCopyFlags::CheckPosInFly);
// now delete all the delete redlines that were copied
@@ -2282,6 +2288,51 @@ bool SwDoc::MoveParagraphImpl(SwPaM& rPam, SwNodeOffset const nOffset,
aPam.GetBound(false).nContent.Assign(aPam.GetBound(false).nNode.GetNode().GetContentNode(), 0);
sw::UpdateFramesForAddDeleteRedline(*this, aPam);
+ // avoid setting empty nodes to tracked insertion
+ if ( bIsEmptyNode )
+ {
+ SwRedlineTable& rTable = getIDocumentRedlineAccess().GetRedlineTable();
+ SwRedlineTable::size_type nRedlPosWithEmpty =
+ getIDocumentRedlineAccess().GetRedlinePos( pStt->nNode.GetNode(), RedlineType::Insert );
+ if ( SwRedlineTable::npos != nRedlPosWithEmpty )
+ {
+ pOwnRedl = rTable[nRedlPosWithEmpty];
+ SwPosition *pRPos = nOffset < SwNodeOffset(0) ? pOwnRedl->End() : pOwnRedl->Start();
+ SwNodeIndex aIdx2 ( pRPos->nNode );
+ SwTextNode const*const pEmptyNode0(aIdx2.GetNode().GetTextNode());
+ if ( nOffset < SwNodeOffset(0) )
+ {
+ // move up
+ --aIdx2;
+ SwTextNode const*const pEmptyNode(aIdx2.GetNode().GetTextNode());
+ if ( pEmptyNode && pEmptyNode->Len() == 0 )
+ {
+ --(pRPos->nNode);
+ pRPos->nContent.Assign( aIdx2.GetNode().GetContentNode(), 0 );
+ }
+ }
+ else if ( pEmptyNode0 && pEmptyNode0->Len() == 0 )
+ {
+ // move down
+ ++aIdx2;
+ SwTextNode const*const pEmptyNode(aIdx2.GetNode().GetTextNode());
+ if (pEmptyNode)
+ {
+ ++(pRPos->nNode);
+ pRPos->nContent.Assign( aIdx2.GetNode().GetContentNode(), 0 );
+ }
+ }
+
+ // sort redlines, when the trimmed range results bad redline order
+ if ( nRedlPosWithEmpty + 1 < rTable.size() &&
+ *rTable[nRedlPosWithEmpty + 1] < *rTable[nRedlPosWithEmpty] )
+ {
+ rTable.Remove(nRedlPosWithEmpty);
+ rTable.Insert(pOwnRedl);
+ }
+ }
+ }
+
getIDocumentRedlineAccess().SetRedlineFlags( eOld );
GetIDocumentUndoRedo().EndUndo( SwUndoId::END, nullptr );
getIDocumentState().SetModified();