summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2023-10-24 09:06:54 +0200
committerMiklos Vajna <vmiklos@collabora.com>2023-10-24 10:43:42 +0200
commit612629f4a81acd7b851b7eccc97aba9a5915d13c (patch)
treee3fbcf457cb630733cf3c6a15a5349125b08e63a /writerfilter
parentb7c857fab92ec26ed0a32e30243ff688f83a40be (diff)
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 <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/CppunitTest_writerfilter_dmapper.mk1
-rw-r--r--writerfilter/qa/cppunittests/dmapper/SettingsTable.cxx32
-rw-r--r--writerfilter/qa/cppunittests/dmapper/data/floattable-vertical-frame-offset.rtf43
-rw-r--r--writerfilter/source/dmapper/SettingsTable.cxx2
-rw-r--r--writerfilter/source/filter/WriterFilter.cxx1
5 files changed, 75 insertions, 4 deletions
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 <test/unoapi_test.hxx>
+#include <test/unoapixml_test.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/qa/XDumper.hpp>
+
+#include <test/xmldocptr.hxx>
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<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+ css::uno::Reference<qa::XDumper> xDumper(xModel->getCurrentController(), uno::UNO_QUERY);
+ OString aDump = xDumper->dump("layout").toUtf8();
+ auto pCharBuffer = reinterpret_cast<const xmlChar*>(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<text::XTextDocument> const& x
uno::Reference<lang::XMultiServiceFactory> xTextFactory(xDoc, uno::UNO_QUERY_THROW);
uno::Reference<beans::XPropertySet> 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<lang::XComponent>& xDo
uno::Reference<beans::XPropertySet> 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));