[Libreoffice-commits] core.git: include/svtools sw/qa sw/source

Miklos Vajna vmiklos at collabora.co.uk
Tue May 9 11:52:35 UTC 2017


 include/svtools/rtfkeywd.hxx                |    3 +
 sw/qa/extras/rtfexport/data/tdf107620.docx  |binary
 sw/qa/extras/rtfexport/rtfexport.cxx        |   11 +++++
 sw/source/filter/ww8/rtfattributeoutput.cxx |   60 +++++++++++++++++++++++++---
 sw/source/filter/ww8/rtfattributeoutput.hxx |    9 ++++
 sw/source/filter/ww8/rtfexport.cxx          |    5 ++
 6 files changed, 83 insertions(+), 5 deletions(-)

New commits:
commit 3a9854a92923df8013ca832c48aa9f284bcb1adc
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue May 9 09:10:24 2017 +0200

    tdf#107620 RTF export: handle DocumentSettingId::PARA_SPACE_MAX compat setting
    
    As it turns out it has a dedicated RTF control word.  With this, the
    bugdoc is again kept as a one-page document during DOCX -> RTF
    conversion.
    
    If we are at it, also write the automatic before/after paragraph spacing
    markup.
    
    Change-Id: I78de644f0631e59ef507dfaa07c5a812d4ef10cd

diff --git a/include/svtools/rtfkeywd.hxx b/include/svtools/rtfkeywd.hxx
index 55d97f51bd16..ec6053f14434 100644
--- a/include/svtools/rtfkeywd.hxx
+++ b/include/svtools/rtfkeywd.hxx
@@ -1208,6 +1208,9 @@
 #define LO_STRING_SVTOOLS_RTF_BRDRSH "\\brdrsh"
 #define LO_STRING_SVTOOLS_RTF_GENERATOR "\\generator"
 #define LO_STRING_SVTOOLS_RTF_VIEWBKSP "\\viewbksp"
+#define LO_STRING_SVTOOLS_RTF_SBAUTO "\\sbauto"
+#define LO_STRING_SVTOOLS_RTF_SAAUTO "\\saauto"
+#define LO_STRING_SVTOOLS_RTF_HTMAUTSP "\\htmautsp"
 
 #endif // INCLUDED_SVTOOLS_RTFKEYWD_HXX
 
diff --git a/sw/qa/extras/rtfexport/data/tdf107620.docx b/sw/qa/extras/rtfexport/data/tdf107620.docx
new file mode 100644
index 000000000000..285bd92ae670
Binary files /dev/null and b/sw/qa/extras/rtfexport/data/tdf107620.docx differ
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx
index 0eccf65dd748..87e86c198612 100644
--- a/sw/qa/extras/rtfexport/rtfexport.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport.cxx
@@ -1193,6 +1193,17 @@ DECLARE_RTFEXPORT_TEST(testHyperlinkTarget, "hyperlink-target.rtf")
     CPPUNIT_ASSERT_EQUAL(OUString("_blank"), getProperty<OUString>(getRun(getParagraph(1), 1), "HyperLinkTarget"));
 }
 
+DECLARE_RTFEXPORT_TEST(testTdf107620, "tdf107620.docx")
+{
+    // This failed, RTF export didn't write the \htmautsp compat flag, the
+    // original bugdoc resulting in 2 pages instead of 1.
+    uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
+    uno::Reference<beans::XPropertySet> xSettings(xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY);
+    bool bAddParaTableSpacing = true;
+    xSettings->getPropertyValue("AddParaTableSpacing") >>= bAddParaTableSpacing;
+    CPPUNIT_ASSERT(!bAddParaTableSpacing);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 4cce69b69bfd..6352aeb63bbb 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -80,6 +80,7 @@
 #include <oox/mathml/export.hxx>
 #include <com/sun/star/i18n/ScriptType.hpp>
 #include <o3tl/make_unique.hxx>
+#include <svl/grabbagitem.hxx>
 
 using namespace ::com::sun::star;
 using namespace sw::util;
@@ -3017,10 +3018,39 @@ void RtfAttributeOutput::FormatULSpace(const SvxULSpaceItem& rULSpace)
         }
         else
         {
-            m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SB);
-            m_aStyles.append((sal_Int32) rULSpace.GetUpper());
-            m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SA);
-            m_aStyles.append((sal_Int32) rULSpace.GetLower());
+            // Spacing before.
+            if (m_bParaBeforeAutoSpacing && m_nParaBeforeSpacing == rULSpace.GetUpper())
+                m_aStyles.append(LO_STRING_SVTOOLS_RTF_SBAUTO "1");
+            else if (m_bParaBeforeAutoSpacing && m_nParaBeforeSpacing == -1)
+            {
+                m_aStyles.append(LO_STRING_SVTOOLS_RTF_SBAUTO "0");
+                m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SB);
+                m_aStyles.append(static_cast<sal_Int32>(rULSpace.GetUpper()));
+            }
+            else
+            {
+                m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SB);
+                m_aStyles.append(static_cast<sal_Int32>(rULSpace.GetUpper()));
+            }
+            m_bParaBeforeAutoSpacing = false;
+
+            // Spacing after.
+            if (m_bParaAfterAutoSpacing && m_nParaAfterSpacing == rULSpace.GetLower())
+                m_aStyles.append(LO_STRING_SVTOOLS_RTF_SAAUTO "1");
+            else if (m_bParaAfterAutoSpacing && m_nParaAfterSpacing == -1)
+            {
+                m_aStyles.append(LO_STRING_SVTOOLS_RTF_SAAUTO "0");
+                m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SA);
+                m_aStyles.append(static_cast<sal_Int32>(rULSpace.GetLower()));
+            }
+            else
+            {
+                m_aStyles.append(OOO_STRING_SVTOOLS_RTF_SA);
+                m_aStyles.append(static_cast<sal_Int32>(rULSpace.GetLower()));
+            }
+            m_bParaAfterAutoSpacing = false;
+
+            // Contextual spacing.
             if (rULSpace.GetContext())
                 m_aStyles.append(OOO_STRING_SVTOOLS_RTF_CONTEXTUALSPACE);
         }
@@ -3381,8 +3411,24 @@ void RtfAttributeOutput::FormatFrameDirection(const SvxFrameDirectionItem& rDire
     }
 }
 
-void RtfAttributeOutput::ParaGrabBag(const SfxGrabBagItem& /*rItem*/)
+void RtfAttributeOutput::ParaGrabBag(const SfxGrabBagItem& rItem)
 {
+    const std::map<OUString, css::uno::Any>& rMap = rItem.GetGrabBag();
+    for (const auto& rValue : rMap)
+    {
+        if (rValue.first == "ParaTopMarginBeforeAutoSpacing")
+        {
+            m_bParaBeforeAutoSpacing = true;
+            rValue.second >>= m_nParaBeforeSpacing;
+            m_nParaBeforeSpacing = convertMm100ToTwip(m_nParaBeforeSpacing);
+        }
+        else if (rValue.first == "ParaBottomMarginAfterAutoSpacing")
+        {
+            m_bParaAfterAutoSpacing = true;
+            rValue.second >>= m_nParaAfterSpacing;
+            m_nParaAfterSpacing = convertMm100ToTwip(m_nParaAfterSpacing);
+        }
+    }
 }
 
 void RtfAttributeOutput::CharGrabBag(const SfxGrabBagItem& /*rItem*/)
@@ -3497,6 +3543,10 @@ RtfAttributeOutput::RtfAttributeOutput(RtfExport& rExport)
       m_bSingleEmptyRun(false),
       m_bInRun(false),
       m_pFlyFrameSize(nullptr),
+      m_bParaBeforeAutoSpacing(false),
+      m_nParaBeforeSpacing(0),
+      m_bParaAfterAutoSpacing(false),
+      m_nParaAfterSpacing(0),
       m_pPrevPageDesc(nullptr)
 {
 }
diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx
index 2a5fca3c8309..23e8466681da 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.hxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.hxx
@@ -595,6 +595,15 @@ private:
     /// If we're in the process of exporting a hyperlink, then its URL.
     OUString m_sURL;
 
+    /// If original file had \sbauto.
+    bool m_bParaBeforeAutoSpacing;
+    /// If m_bParaBeforeAutoSpacing is set, value of \sb.
+    sal_Int32 m_nParaBeforeSpacing;
+    /// If original file had \saauto.
+    bool m_bParaAfterAutoSpacing;
+    /// If m_bParaBeforeAutoSpacing is set, value of \sa.
+    sal_Int32 m_nParaAfterSpacing;
+
 public:
     explicit RtfAttributeOutput(RtfExport& rExport);
 
diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx
index aa481c62bfbb..8b2de89d8bc7 100644
--- a/sw/source/filter/ww8/rtfexport.cxx
+++ b/sw/source/filter/ww8/rtfexport.cxx
@@ -48,6 +48,7 @@
 #include <editeng/hyphenzoneitem.hxx>
 #include <fmtmeta.hxx>
 #include <o3tl/make_unique.hxx>
+#include <IDocumentSettingAccess.hxx>
 
 using namespace ::com::sun::star;
 
@@ -862,6 +863,10 @@ void RtfExport::ExportDocument_Impl()
         Strm().WriteCharPtr(pOut);
     }
 
+    if (!m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::PARA_SPACE_MAX))
+        // RTF default is true, so write compat flag if this should be false.
+        Strm().WriteCharPtr(LO_STRING_SVTOOLS_RTF_HTMAUTSP);
+
     Strm().WriteCharPtr(SAL_NEWLINE_STRING);
 
     WriteFootnoteSettings();


More information about the Libreoffice-commits mailing list