summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2021-05-07 17:01:10 +0200
committerLászló Németh <nemeth@numbertext.org>2021-05-10 14:37:02 +0200
commitb11287cda0ce308f5fddac4c0877718fec7c70a5 (patch)
treed008356f4dbf18ffb2345d125110335ea1ac7cc7
parent0038386cdecc3856da5f1d9696cc13713f0e206d (diff)
tdf#142130 sw track changes: fix crossing out of neighboring images
Normal images got crossing out from the next deleted images. Fix it by using only the start position of the image in CheckLine() instead of the 1-character length range of the anchor point. Note: add unit test also for tdf#78864. Follow-up to commit d845b91bcc6eb885c55494d4d4fab4ec09577e1d (tdf#78864 sw track changes: cross out deleted images). Change-Id: I8894e625d479adea4b1003f55f24f292064ed7ba Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115255 Tested-by: Jenkins Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r--sw/qa/extras/uiwriter/data/tdf142130.fodt37
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx39
-rw-r--r--sw/source/core/text/porlay.cxx6
-rw-r--r--sw/source/core/text/redlnitr.cxx4
-rw-r--r--sw/source/core/text/redlnitr.hxx3
5 files changed, 82 insertions, 7 deletions
diff --git a/sw/qa/extras/uiwriter/data/tdf142130.fodt b/sw/qa/extras/uiwriter/data/tdf142130.fodt
new file mode 100644
index 000000000000..1bc26e6acf22
--- /dev/null
+++ b/sw/qa/extras/uiwriter/data/tdf142130.fodt
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <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:tracked-changes text:track-changes="false">
+ <text:changed-region xml:id="ct94146400887392" text:id="ct94146400887392">
+ <text:deletion>
+ <office:change-info>
+ <dc:creator>X</dc:creator>
+ <dc:date>2021-05-07T17:32:23</dc:date>
+ </office:change-info>
+ </text:deletion>
+ </text:changed-region>
+ </text:tracked-changes>
+ <text:p text:style-name="Standard"><draw:frame text:anchor-type="as-char" svg:width="7.276cm" svg:height="4.842cm" draw:z-index="0"><draw:image draw:mime-type="image/png">
+ <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAABmJLR0QA/wD/AP+gvaeTAAAA
+ CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QUGCg8pr2vxSAAAAB1pVFh0Q29tbWVudAAA
+ AAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAADElEQVQI12N4stkEAARKAcxTwEa2AAAAAElF
+ TkSuQmCC
+ </office:binary-data>
+ </draw:image>
+ </draw:frame><text:change-start text:change-id="ct94146400887392"/><draw:frame text:anchor-type="as-char" svg:width="10.663cm" svg:height="5.415cm" draw:z-index="1"><draw:image draw:mime-type="image/png">
+ <office:binary-data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAAAmJLR0QA/4ePzL8AAAAJcEhZ
+ cwAACxMAAAsTAQCanBgAAAAHdElNRQflBQYKGR4LTuGQAAAACklEQVQI12M4DwAA0QDQfVbA
+ HQAAAABJRU5ErkJggg==
+ </office:binary-data>
+ </draw:image>
+ </draw:frame><text:change-end text:change-id="ct94146400887392"/></text:p>
+ </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 7945d6aa28a8..b2c5a71e1164 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -2170,6 +2170,45 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf137771)
CPPUNIT_ASSERT(!pWrtShell->GetViewOptions()->IsShowChangesInMargin());
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf142130)
+{
+ load(DATA_DIRECTORY, "tdf142130.fodt");
+
+ SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT(pTextDoc);
+
+ //turn on red-lining and show changes
+ SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+ 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()));
+
+ // Dump the rendering of the first page as an XML file.
+ SwDocShell* pShell = pTextDoc->GetDocShell();
+ std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
+ MetafileXmlDump dumper;
+ xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile);
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // This was 6 (crossing out of the first, not deleted image)
+ // (4 lines = 2 lines for crossing out of the second image, 2 lines for the
+ // vertical lines before the two lines)
+ assertXPath(pXmlDoc, "/metafile/push/push/push/line", 4);
+
+ // reject deletion of the second image
+ IDocumentRedlineAccess& rIDRA(pDoc->getIDocumentRedlineAccess());
+ rIDRA.AcceptAllRedline(false);
+
+ xMetaFile = pShell->GetPreviewMetaFile();
+ xmlDocUniquePtr pXmlDoc2 = dumpAndParse(dumper, *xMetaFile);
+ // no crossing out and vertical redlines
+ assertXPath(pXmlDoc2, "/metafile/push/push/push/line", 0);
+}
+
CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf139120)
{
SwDoc* pDoc = createDoc("tdf54819.fodt");
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index f4dc4bd46661..be984e137b99 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -646,11 +646,9 @@ void SwLineLayout::CalcLine( SwTextFormatter &rLine, SwTextFormatInfo &rInf )
enum RedlineType eRedlineEnd;
std::pair<SwTextNode const*, sal_Int32> const flyStart(
rInf.GetTextFrame()->MapViewToModel(nPorSttIdx));
- std::pair<SwTextNode const*, sal_Int32> const flyEnd(
- rInf.GetTextFrame()->MapViewToModel(nPorSttIdx + pPos->GetLen()));
bool bHasFlyRedline = rLine.GetRedln()->CheckLine(flyStart.first->GetIndex(),
- flyStart.second, flyEnd.first->GetIndex(), flyEnd.second, sRedlineText,
- bHasRedlineEnd, eRedlineEnd);
+ flyStart.second, flyStart.first->GetIndex(), flyStart.second, sRedlineText,
+ bHasRedlineEnd, eRedlineEnd, /*bFullLine=*/false);
bDeleted = bHasFlyRedline && eRedlineEnd == RedlineType::Delete;
}
static_cast<SwFlyCntPortion*>(pPos)->SetDeleted(bDeleted);
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 65834cf27077..faeb0fbbaa8d 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -941,13 +941,13 @@ bool SwRedlineItr::ChkSpecialUnderline_() const
bool SwRedlineItr::CheckLine(
sal_uLong const nStartNode, sal_Int32 const nChkStart,
sal_uLong const nEndNode, sal_Int32 nChkEnd, OUString& rRedlineText,
- bool& bRedlineEnd, RedlineType& eRedlineEnd)
+ bool& bRedlineEnd, RedlineType& eRedlineEnd, bool bFullLine)
{
// note: previously this would return true in the (!m_bShow && m_pExt)
// case, but surely that was a bug?
if (m_nFirst == SwRedlineTable::npos || m_eMode != Mode::Show)
return false;
- if( nChkEnd == nChkStart ) // empty lines look one char further
+ if( nChkEnd == nChkStart && bFullLine ) // empty lines look one char further
++nChkEnd;
sal_Int32 nOldStart = m_nStart;
sal_Int32 nOldEnd = m_nEnd;
diff --git a/sw/source/core/text/redlnitr.hxx b/sw/source/core/text/redlnitr.hxx
index cfd8514cae54..0d0e013ff6d5 100644
--- a/sw/source/core/text/redlnitr.hxx
+++ b/sw/source/core/text/redlnitr.hxx
@@ -118,7 +118,8 @@ public:
bool ChkSpecialUnderline() const
{ return IsOn() && ChkSpecialUnderline_(); }
bool CheckLine(sal_uLong nStartNode, sal_Int32 nChkStart, sal_uLong nEndNode,
- sal_Int32 nChkEnd, OUString& rRedlineText, bool& bRedlineEnd, RedlineType& eRedlineEnd);
+ sal_Int32 nChkEnd, OUString& rRedlineText, bool& bRedlineEnd,
+ RedlineType& eRedlineEnd, bool bFullLine = true);
bool LeaveExtend(SwFont& rFnt, sal_uLong const nNode, sal_Int32 const nNew)
{ return m_pExt->Leave(rFnt, nNode, nNew); }
bool ExtOn() {