diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2019-04-05 19:30:45 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2019-04-10 10:51:51 +0200 |
commit | 3d74ddd190a5087e0a54ef7b14d0a43006745ec3 (patch) | |
tree | c8af061ae29bc376e1df749d4b730863b3d2a3e4 /sw/qa/extras | |
parent | c602bbaa89784681025ae487ad230ed0e86e9acb (diff) |
writerfilter: implement RTF derived styles defaulting
It turns out that the situation fixed in commit
1be0a3fa9ebb22b607c54b47739d4467acfed259 also applies to the definition
of the styles themselves.
To implement the same style import as Word, the style definitions need
to be stored twice: once as read from the file, and another time with
attributes defaulted and deduplicated vs. the parent style; the second
representation is then sent to the domain mapper.
To make this easier, add a bool parameter to cloneAndDeduplicate()
to disable the implicit pPr dereferencing that happens when creating the
hard formatted paragraph properties (this could potentially be cleaned
up further if those paragraph properties would use pPr wrapper
themselves).
Also implement defaulting of line spacing in getDefaultSPRM().
Change-Id: I4810e917697b3af244e5dbdd7f5a45b4767c93fc
Reviewed-on: https://gerrit.libreoffice.org/70320
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw/qa/extras')
-rw-r--r-- | sw/qa/extras/rtfexport/data/para-style-bottom-margin-2.rtf | 12 | ||||
-rw-r--r-- | sw/qa/extras/rtfexport/rtfexport5.cxx | 27 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/data/para-style-bottom-margin.rtf | 14 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 31 |
4 files changed, 84 insertions, 0 deletions
diff --git a/sw/qa/extras/rtfexport/data/para-style-bottom-margin-2.rtf b/sw/qa/extras/rtfexport/data/para-style-bottom-margin-2.rtf new file mode 100644 index 000000000000..b4261e717070 --- /dev/null +++ b/sw/qa/extras/rtfexport/data/para-style-bottom-margin-2.rtf @@ -0,0 +1,12 @@ +{\rtf1 +\ansi\ansicpg1252\deff0 +{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2 Times New Roman;}} +{\stylesheet +{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \snext0 Normal;} +{\s15\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \sbasedon0 \snext15 List Paragraph;} +} +\pard\plain \ltrpar\s15\ql \li720\ri0\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace +\par +\pard\plain +\par +} diff --git a/sw/qa/extras/rtfexport/rtfexport5.cxx b/sw/qa/extras/rtfexport/rtfexport5.cxx index a60eb485ccdf..b2b898738d1d 100644 --- a/sw/qa/extras/rtfexport/rtfexport5.cxx +++ b/sw/qa/extras/rtfexport/rtfexport5.cxx @@ -194,6 +194,33 @@ DECLARE_RTFEXPORT_TEST(testParaBottomMargin, "para-bottom-margin.rtf") CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getProperty<sal_Int32>(getParagraph(1), "ParaTopMargin")); } +DECLARE_RTFIMPORT_TEST(testParaStyleBottomMargin2, "para-style-bottom-margin-2.rtf") +{ + uno::Reference<beans::XPropertySet> xPropertySet( + getStyles("ParagraphStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(353), getProperty<sal_Int32>(xPropertySet, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, + getProperty<style::LineSpacing>(xPropertySet, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(115), + getProperty<style::LineSpacing>(xPropertySet, "ParaLineSpacing").Height); + + // the derived style contains \sa200, as does its parent + uno::Reference<beans::XPropertySet> xPropertySet1( + getStyles("ParagraphStyles")->getByName("List Paragraph"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(353), getProperty<sal_Int32>(xPropertySet1, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, + getProperty<style::LineSpacing>(xPropertySet1, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(115), + getProperty<style::LineSpacing>(xPropertySet1, "ParaLineSpacing").Height); + // for the paragraph there is no \saN, so it should default to 0 + auto const xPara(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, + getProperty<style::LineSpacing>(xPara, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(115), + getProperty<style::LineSpacing>(xPara, "ParaLineSpacing").Height); +} + DECLARE_RTFEXPORT_TEST(testFdo66040, "fdo66040.rtf") { uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); diff --git a/sw/qa/extras/rtfimport/data/para-style-bottom-margin.rtf b/sw/qa/extras/rtfimport/data/para-style-bottom-margin.rtf new file mode 100644 index 000000000000..d7ebc215f3fc --- /dev/null +++ b/sw/qa/extras/rtfimport/data/para-style-bottom-margin.rtf @@ -0,0 +1,14 @@ +{\rtf1 +\ansi\ansicpg1252\deff0 +{\fonttbl +{\f0 Times New Roman;} +} +{\stylesheet +{\sa200\sl276\slmult1 \snext0 Normal;} +{\s19 \sbasedon0 \snext0 toc 1;} +} +\pard\plain \s19 +foo +\par +\par +} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index fd87b50331cc..8e126203238f 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -19,6 +19,8 @@ #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/style/BreakType.hpp> +#include <com/sun/star/style/LineSpacing.hpp> +#include <com/sun/star/style/LineSpacingMode.hpp> #include <com/sun/star/style/ParagraphAdjust.hpp> #include <com/sun/star/style/TabStop.hpp> #include <com/sun/star/table/BorderLine2.hpp> @@ -1562,6 +1564,35 @@ DECLARE_RTFIMPORT_TEST(testDefaultValues, "default-values.rtf") CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_AUTO), getProperty<sal_Int32>(run, "CharColor")); } +DECLARE_RTFIMPORT_TEST(testParaStyleBottomMargin, "para-style-bottom-margin.rtf") +{ + uno::Reference<beans::XPropertySet> xPropertySet( + getStyles("ParagraphStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(353), getProperty<sal_Int32>(xPropertySet, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, + getProperty<style::LineSpacing>(xPropertySet, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(115), + getProperty<style::LineSpacing>(xPropertySet, "ParaLineSpacing").Height); + + // The reason why this is 0 despite the default style containing \sa200 + // is that Word will actually interpret \basedonN + // as "set style N and for every attribute of that style, + // set an attribute with default value on the style" + uno::Reference<beans::XPropertySet> xPropertySet1( + getStyles("ParagraphStyles")->getByName("Contents 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPropertySet1, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, + getProperty<style::LineSpacing>(xPropertySet1, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), + getProperty<style::LineSpacing>(xPropertySet1, "ParaLineSpacing").Height); + auto const xPara(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xPara, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, // 0 or 3 ??? + getProperty<style::LineSpacing>(xPara, "ParaLineSpacing").Mode); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), + getProperty<style::LineSpacing>(xPara, "ParaLineSpacing").Height); +} + // tests should only be added to rtfIMPORT *if* they fail round-tripping in rtfEXPORT CPPUNIT_PLUGIN_IMPLEMENT(); |