From 612629f4a81acd7b851b7eccc97aba9a5915d13c Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 24 Oct 2023 09:06:54 +0200 Subject: tdf#155040 sw floattable, RTF: fix table is overlapped by subsequent inline one The document had overlapping text on load since commit 05425f73bfa41d3f7591461e2ad0beb4fafc39b4 (sw floatable: teach the RTF import about SwFormatFlySplit, 2023-04-21). Interestingly the DOCX equivalent was fine, there the inline table is shifted down, below the floating table, so the overlap doesn't happen. Fix the problem by moving the AddVerticalFrameOffsets=true code from the DOCX filter to the shared dmapper, because RTF needs the same. See commit 50223ea6e212b60b7d33839c2753c5601fb50f95 (tdf#98987 sw: add AddVerticalFrameOffsets compat mode, 2016-03-31) for more details about this compat flag. It was already enabled for DOC, too. Change-Id: I948b179c9ec5fa24377014b0e86826568c417b6f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158372 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- writerfilter/CppunitTest_writerfilter_dmapper.mk | 1 + .../qa/cppunittests/dmapper/SettingsTable.cxx | 32 ++++++++++++++-- .../data/floattable-vertical-frame-offset.rtf | 43 ++++++++++++++++++++++ writerfilter/source/dmapper/SettingsTable.cxx | 2 + writerfilter/source/filter/WriterFilter.cxx | 1 - 5 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 writerfilter/qa/cppunittests/dmapper/data/floattable-vertical-frame-offset.rtf (limited to 'writerfilter') diff --git a/writerfilter/CppunitTest_writerfilter_dmapper.mk b/writerfilter/CppunitTest_writerfilter_dmapper.mk index 6b7611b41996..8a4745630c29 100644 --- a/writerfilter/CppunitTest_writerfilter_dmapper.mk +++ b/writerfilter/CppunitTest_writerfilter_dmapper.mk @@ -13,6 +13,7 @@ $(eval $(call gb_CppunitTest_CppunitTest,writerfilter_dmapper)) $(eval $(call gb_CppunitTest_use_externals,writerfilter_dmapper,\ boost_headers \ + libxml2 \ )) $(eval $(call gb_CppunitTest_add_exception_objects,writerfilter_dmapper, \ diff --git a/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx b/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx index 00d4147bfb05..5afad898f8e4 100644 --- a/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx +++ b/writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx @@ -7,20 +7,23 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include +#include #include +#include + +#include using namespace com::sun::star; namespace { /// Tests for writerfilter/source/dmapper/SettingsTable.cxx. -class Test : public UnoApiTest +class Test : public UnoApiXmlTest { public: Test() - : UnoApiTest("/writerfilter/qa/cppunittests/dmapper/data/") + : UnoApiXmlTest("/writerfilter/qa/cppunittests/dmapper/data/") { } }; @@ -59,6 +62,29 @@ CPPUNIT_TEST_FIXTURE(Test, testAllowTextAfterFloatingTableBreak) // set. CPPUNIT_ASSERT(bAllowTextAfterFloatingTableBreak); } + +CPPUNIT_TEST_FIXTURE(Test, testAddVerticalFrameOffsetsRTF) +{ + // Given a document with a floating table, immediately followed by an inline table: + // When importing that document: + loadFromURL(u"floattable-vertical-frame-offset.rtf"); + + // Then make sure the floating and the inline tables don't overlap: + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + css::uno::Reference xDumper(xModel->getCurrentController(), uno::UNO_QUERY); + OString aDump = xDumper->dump("layout").toUtf8(); + auto pCharBuffer = reinterpret_cast(aDump.getStr()); + xmlDocUniquePtr pXmlDoc(xmlParseDoc(pCharBuffer)); + sal_Int32 nFlyBottom = getXPath(pXmlDoc, "//fly/infos/bounds", "bottom").toInt32(); + sal_Int32 nTableFrameTop = getXPath(pXmlDoc, "//body/tab/infos/bounds", "top").toInt32(); + sal_Int32 nTableTopMargin = getXPath(pXmlDoc, "//body/tab/infos/prtBounds", "top").toInt32(); + sal_Int32 nTableTop = nTableFrameTop + nTableTopMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 2747 + // - Actual : 1449 + // i.e. table top should be ~2748, but was less, leading to an overlap. + CPPUNIT_ASSERT_GREATER(nFlyBottom, nTableTop); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/data/floattable-vertical-frame-offset.rtf b/writerfilter/qa/cppunittests/dmapper/data/floattable-vertical-frame-offset.rtf new file mode 100644 index 000000000000..a7f8c45e83c8 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/floattable-vertical-frame-offset.rtf @@ -0,0 +1,43 @@ +{\rtf1 +\paperw11907\paperh16840\margl567\margr397\margt567\margb397 +\pard\plain\par +\par +\trowd +\trgaph70\trrh1315\trleft-70\tpvpara\tphmrg\tposx211\tposnegy-16\trautofit1\tblind0\tblindtype3 \clvertalt\clbrdrt +\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrtbl \cltxlrtb\clshdrawnil \cellx2694 +\cellx4678\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\pvpara\phmrg\posx211\posnegy-16\dxfrtext141\dfrmtxtx141\dfrmtxty0\wraparound\faauto\adjustright\rin0\lin0\pararsid5002879 +{\rtlch\fcs1 \ab\af1 \ltrch\fcs0 +\b\fs14\lang1053\langfe1033\langnp1053\insrsid1249889 Table1:A1} +{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs14\lang1053\langfe1033\langnp1053\insrsid1249889 \cell } +\pard \ltrpar\ql \li0\ri0\widctlpar\intbl +\tx2694\pvpara\phmrg\posx211\posnegy-16\dxfrtext141\dfrmtxtx141\dfrmtxty0\wraparound\faauto\adjustright\rin0\lin0\pararsid935586 +{\rtlch\fcs1 \af1 \ltrch\fcs0 \fs14\insrsid1249889 Table1:B1} +{\rtlch\fcs1 \af1\afs4 \ltrch\fcs0 +\fs14\lang1053\langfe1033\langnp1053\insrsid1249889 \cell } +\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +{\rtlch\fcs1 \af1 \ltrch\fcs0 \lang1053\langfe1033\langnp1053\insrsid1249889\charrsid15953318 +\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph70\trrh1315\trleft-70\tpvpara\tphmrg\tposx211\tposnegy-16\trautofit1\trpaddl70\trpaddr70\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5002879 +\tblind0\tblindtype3\cltxlrtb\clshdrawnil \cellx2694\clvertalt\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrtbl \clbrdrb\brdrs\brdrw30 \clbrdrr +\brdrtbl \cltxlrtb\clshdrawnil \cellx4678\row } +\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 +{\rtlch\fcs1 \af1\afs4 \ltrch\fcs0 \fs4\lang1053\langfe1033\langnp1053\insrsid16530204 +\par \ltrrow} +\trowd \irow0\irowband0\lastrow \ltrrow\trqc\trgaph108\trrh-609\trleft-57\trkeep\trbrdrt\brdrs\brdrw10 +\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid1533051\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalc\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 +\clbrdrb\brdrs\brdrw30 \clbrdrr\brdrnone \cltxlrtb\clpadt57\clpadr57\clpadft3\clpadfr3\clshdrawnil \cellx1303\clvertalc\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 +\cltxlrtb\clpadt57\clpadr57\clpadft3\clpadfr3\clshdrawnil \cellx7294\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\adjustright\rin0\lin0 +{\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid1533051 Table2:A1} +{\rtlch\fcs1 \af1 +\ltrch\fcs0 \fs18\insrsid1533051 \cell } +{\rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\fs14\insrsid1533051 Table2:B1} +{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\fs14\insrsid1533051 \cell } +\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +{\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid1533051 \trowd \irow0\irowband0\lastrow \ltrrow\ts11\trqc\trgaph108\trrh-609\trleft-57\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl +\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid1533051\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalc\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrs\brdrw30 +\clbrdrb\brdrs\brdrw30 \clbrdrr\brdrnone \cltxlrtb\clpadt57\clpadr57\clpadft3\clpadfr3\clshdrawnil \cellx1303\clvertalc\clbrdrt\brdrs\brdrw30 \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw30 \clbrdrr\brdrs\brdrw30 +\cltxlrtb\clpadt57\clpadr57\clpadft3\clpadfr3\clshdrawnil \cellx7294\row } +\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 +\par +} diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx index a6bae79e1e69..43ef02f68134 100644 --- a/writerfilter/source/dmapper/SettingsTable.cxx +++ b/writerfilter/source/dmapper/SettingsTable.cxx @@ -592,7 +592,9 @@ void SettingsTable::ApplyProperties(uno::Reference const& x uno::Reference xTextFactory(xDoc, uno::UNO_QUERY_THROW); uno::Reference xDocumentSettings(xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY_THROW); + // Shared between DOCX and RTF, unconditional flags. xDocumentSettings->setPropertyValue("TableRowKeep", uno::Any(true)); + xDocumentSettings->setPropertyValue("AddVerticalFrameOffsets", uno::Any(true)); if (GetWordCompatibilityMode() <= 14) { diff --git a/writerfilter/source/filter/WriterFilter.cxx b/writerfilter/source/filter/WriterFilter.cxx index 58e7cf113c7f..1f97e8e70a30 100644 --- a/writerfilter/source/filter/WriterFilter.cxx +++ b/writerfilter/source/filter/WriterFilter.cxx @@ -302,7 +302,6 @@ void WriterFilter::setTargetDocument(const uno::Reference& xDo uno::Reference xSettings( xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY); - xSettings->setPropertyValue("AddVerticalFrameOffsets", uno::Any(true)); xSettings->setPropertyValue("UseOldNumbering", uno::Any(false)); xSettings->setPropertyValue("IgnoreFirstLineIndentInNumbering", uno::Any(false)); xSettings->setPropertyValue("DoNotResetParaAttrsForNumFont", uno::Any(false)); -- cgit