summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2023-05-30 08:21:33 +0200
committerMiklos Vajna <vmiklos@collabora.com>2023-05-30 12:49:52 +0200
commitd785d26a5599d3d546b96958b0f1c6d5ed777a0d (patch)
tree781599f1be544d032738fa1ba3e4628cacae1d40
parent5655cc201e5a80997fe21bc2a0c7abcbe4fb488f (diff)
sw floattable: handle \nobrkwrptbl in the RTF filter
This is the RTF import/export for the functionality added in commit 08fa2903df1a7cf9a1647fcf967e4c8b57dad793 (sw floattable: add a DoNotBreakWrappedTables compat flag, 2023-05-24). Change-Id: I3c458cbe1f4b0947a94651cc205f2a7660d2ec2c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152377 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--sw/qa/extras/rtfexport/rtfexport3.cxx23
-rw-r--r--sw/source/filter/ww8/rtfexport.cxx8
-rw-r--r--writerfilter/qa/cppunittests/rtftok/data/do-not-break-wrapped-tables.rtf10
-rw-r--r--writerfilter/qa/cppunittests/rtftok/rtfdispatchflag.cxx17
-rw-r--r--writerfilter/source/dmapper/SettingsTable.cxx3
-rw-r--r--writerfilter/source/rtftok/rtfdispatchflag.cxx8
-rw-r--r--writerfilter/source/rtftok/rtfdispatchvalue.cxx30
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx3
8 files changed, 60 insertions, 42 deletions
diff --git a/sw/qa/extras/rtfexport/rtfexport3.cxx b/sw/qa/extras/rtfexport/rtfexport3.cxx
index 2b45ca61f33e..8b5e2489a001 100644
--- a/sw/qa/extras/rtfexport/rtfexport3.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport3.cxx
@@ -28,6 +28,7 @@
#include <wrtsh.hxx>
#include <fmtpdsc.hxx>
#include <IDocumentContentOperations.hxx>
+#include <IDocumentSettingAccess.hxx>
using namespace css;
@@ -430,6 +431,28 @@ DECLARE_RTFEXPORT_TEST(testTdf128428_dntblnsbdb, "tdf128428_dntblnsbdb.rtf")
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
+CPPUNIT_TEST_FIXTURE(Test, testDontBreakWrappedTables)
+{
+ // Given a document with no DO_NOT_BREAK_WRAPPED_TABLES compat mode enabled:
+ createSwDoc();
+ {
+ SwDoc* pDoc = getSwDoc();
+ IDocumentSettingAccess& rIDSA = pDoc->getIDocumentSettingAccess();
+ rIDSA.set(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES, true);
+ }
+
+ // When saving to rtf:
+ reload(mpFilter, "dont-break-wrapped-tables.rtf");
+
+ // Then make sure \nobrkwrptbl is not written:
+ SwDoc* pDoc = getSwDoc();
+ IDocumentSettingAccess& rIDSA = pDoc->getIDocumentSettingAccess();
+ bool bDontBreakWrappedTables = rIDSA.get(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES);
+ // Without the accompanying fix in place, this test would have failed, the compat flag was not
+ // set.
+ CPPUNIT_ASSERT(bDontBreakWrappedTables);
+}
+
CPPUNIT_TEST_FIXTURE(Test, testRtlGutter)
{
auto verify = [this]() {
diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx
index 1bfc2ebc5740..96f0f628f6a9 100644
--- a/sw/source/filter/ww8/rtfexport.cxx
+++ b/sw/source/filter/ww8/rtfexport.cxx
@@ -829,7 +829,8 @@ ErrCode RtfExport::ExportDocument_Impl()
Strm().WriteOString(OOO_STRING_SVTOOLS_RTF_MARGMIRROR);
// Gutter at top?
- if (m_rDoc.getIDocumentSettingAccess().get(DocumentSettingId::GUTTER_AT_TOP))
+ IDocumentSettingAccess& rIDSA = m_rDoc.getIDocumentSettingAccess();
+ if (rIDSA.get(DocumentSettingId::GUTTER_AT_TOP))
{
Strm().WriteOString(LO_STRING_SVTOOLS_RTF_GUTTERPRL);
}
@@ -858,7 +859,10 @@ ErrCode RtfExport::ExportDocument_Impl()
// Enable breaking wrapped tables across pages: the "no" in the control word's name is
// confusing.
- Strm().WriteOString(LO_STRING_SVTOOLS_RTF_NOBRKWRPTBL);
+ if (!rIDSA.get(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES))
+ {
+ Strm().WriteOString(LO_STRING_SVTOOLS_RTF_NOBRKWRPTBL);
+ }
// size and empty margins of the page
if (m_rDoc.GetPageDescCnt())
diff --git a/writerfilter/qa/cppunittests/rtftok/data/do-not-break-wrapped-tables.rtf b/writerfilter/qa/cppunittests/rtftok/data/do-not-break-wrapped-tables.rtf
new file mode 100644
index 000000000000..f6ec013cb1dc
--- /dev/null
+++ b/writerfilter/qa/cppunittests/rtftok/data/do-not-break-wrapped-tables.rtf
@@ -0,0 +1,10 @@
+{\rtf1
+\paperw12240\paperh6203\margl1440\margr1440\margt1440\margb1440
+\pard\plain First paragraph\par
+\pard\plain\intbl A1\cell
+\pard\plain\trowd\trrh1812\tpvpara\tphcol\tposy10\tposx20\tdfrmtxtLeft30\tdfrmtxtRight40\cellx3828\row
+\pard\plain\intbl A2\cell
+\pard\plain\trowd\trrh1812\tpvpara\tphcol\tposy10\tposx20\tdfrmtxtLeft30\tdfrmtxtRight40\cellx3828\row
+\pard\plain Second paragraph.
+\par
+}
diff --git a/writerfilter/qa/cppunittests/rtftok/rtfdispatchflag.cxx b/writerfilter/qa/cppunittests/rtftok/rtfdispatchflag.cxx
index 810dc750d7d7..6d6b85be61c4 100644
--- a/writerfilter/qa/cppunittests/rtftok/rtfdispatchflag.cxx
+++ b/writerfilter/qa/cppunittests/rtftok/rtfdispatchflag.cxx
@@ -65,6 +65,23 @@ CPPUNIT_TEST_FIXTURE(Test, testFloatingTable)
nExpected = o3tl::convert(40, o3tl::Length::twip, o3tl::Length::mm100);
CPPUNIT_ASSERT_EQUAL(nExpected, nRightMargin);
}
+
+CPPUNIT_TEST_FIXTURE(Test, testDoNotBreakWrappedTables)
+{
+ // Given a document without \nobrkwrptbl:
+ // When importing that document:
+ loadFromURL(u"do-not-break-wrapped-tables.rtf");
+
+ // Then make sure that the matching compat flag is set:
+ uno::Reference<lang::XMultiServiceFactory> xDocument(mxComponent, uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xSettings(
+ xDocument->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY);
+ bool bDoNotBreakWrappedTables{};
+ xSettings->getPropertyValue("DoNotBreakWrappedTables") >>= bDoNotBreakWrappedTables;
+ // Without the accompanying fix in place, this test would have failed, the compat flag was not
+ // set.
+ CPPUNIT_ASSERT(bDoNotBreakWrappedTables);
+}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx
index 6ebdccddbfe7..586d8b752ef9 100644
--- a/writerfilter/source/dmapper/SettingsTable.cxx
+++ b/writerfilter/source/dmapper/SettingsTable.cxx
@@ -153,6 +153,7 @@ SettingsTable::SettingsTable(const DomainMapper& rDomainMapper)
m_pImpl->m_bDoNotUseHTMLParagraphAutoSpacing = true;
// Longer space sequence is opt-in for RTF, and not in OOXML.
m_pImpl->m_bLongerSpaceSequence = true;
+ m_pImpl->m_bDoNotBreakWrappedTables = true;
}
m_pImpl->m_pDocumentProtection = std::make_shared<DocumentProtection>();
m_pImpl->m_pWriteProtection = std::make_shared<WriteProtection>();
@@ -398,7 +399,7 @@ void SettingsTable::lcl_sprm(Sprm& rSprm)
m_pImpl->m_bGutterAtTop = nIntValue != 0;
break;
case NS_ooxml::LN_CT_Compat_doNotBreakWrappedTables:
- m_pImpl->m_bDoNotBreakWrappedTables = true;
+ m_pImpl->m_bDoNotBreakWrappedTables = nIntValue != 0;
break;
default:
{
diff --git a/writerfilter/source/rtftok/rtfdispatchflag.cxx b/writerfilter/source/rtftok/rtfdispatchflag.cxx
index bc3c3037e16d..0ca4d20645f1 100644
--- a/writerfilter/source/rtftok/rtfdispatchflag.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchflag.cxx
@@ -34,11 +34,6 @@ namespace writerfilter::rtftok
{
bool RTFDocumentImpl::dispatchFloatingTableFlag(RTFKeyword nKeyword)
{
- if (!m_bBreakWrappedTables)
- {
- return false;
- }
-
// Positioned Wrapped Tables
OUString aParam;
switch (nKeyword)
@@ -1337,7 +1332,8 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
break;
case RTFKeyword::NOBRKWRPTBL:
{
- m_bBreakWrappedTables = true;
+ m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_doNotBreakWrappedTables,
+ new RTFValue(0));
}
break;
default:
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index c1e3ec166fa5..69157a97829f 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -1844,66 +1844,36 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
break;
case RTFKeyword::TPOSY:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_tblpY, new RTFValue(nParam));
}
break;
case RTFKeyword::TPOSX:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_tblpX, new RTFValue(nParam));
}
break;
case RTFKeyword::TDFRMTXTLEFT:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_leftFromText, new RTFValue(nParam));
}
break;
case RTFKeyword::TDFRMTXTRIGHT:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_rightFromText, new RTFValue(nParam));
}
break;
case RTFKeyword::TDFRMTXTTOP:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_topFromText, new RTFValue(nParam));
}
break;
case RTFKeyword::TDFRMTXTBOTTOM:
{
- if (!m_bBreakWrappedTables)
- {
- break;
- }
-
putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
NS_ooxml::LN_CT_TblPPr_bottomFromText, new RTFValue(nParam));
}
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index bf1ff2c30611..47fedc431bfb 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -991,9 +991,6 @@ private:
/// Are we after a \cell, but before a \row?
bool m_bAfterCellBeforeRow;
-
- /// Floating tables are single-page by default.
- bool m_bBreakWrappedTables = false;
};
} // namespace writerfilter::rtftok