include/svtools/rtfkeywd.hxx                     |    1 
 sw/qa/extras/rtfexport/data/clearing-break.rtf   |   22 +++++++++++++++
 sw/qa/extras/rtfexport/rtfexport4.cxx            |   33 +++++++++++++++++++++++
 sw/source/filter/ww8/rtfattributeoutput.cxx      |   10 ++++++
 writerfilter/source/rtftok/rtfdispatchsymbol.cxx |    2 -
 writerfilter/source/rtftok/rtfdispatchvalue.cxx  |   23 ++++++++++++++++
 6 files changed, 89 insertions(+), 2 deletions(-)

New commits:
commit a9fea2d3d9385acc06487623a736e0bb2932f266
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Mon Mar 21 10:20:34 2022 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Mar 31 08:24:51 2022 +0200

    sw clearing breaks: add RTF filter
    
    Map between SwLineBreakClear and \lbr<N>.
    
    (cherry picked from commit 3afe4f66f7266ede9922ce0682db38c9369349b7)
    
    Conflicts:
            sw/qa/extras/rtfexport/rtfexport4.cxx
    
    Change-Id: Ibed94ad74157a08787212a34176590a1dc4d5547
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132293
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/include/svtools/rtfkeywd.hxx b/include/svtools/rtfkeywd.hxx
index 113faa14389e..49771933cc04 100644
--- a/include/svtools/rtfkeywd.hxx
+++ b/include/svtools/rtfkeywd.hxx
@@ -1225,5 +1225,6 @@
 #define LO_STRING_SVTOOLS_RTF_HTMAUTSP "\\htmautsp"
 #define LO_STRING_SVTOOLS_RTF_GUTTERPRL "\\gutterprl"
 #define LO_STRING_SVTOOLS_RTF_RTLGUTTER "\\rtlgutter"
+#define LO_STRING_SVTOOLS_RTF_LBR "\\lbr"
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/extras/rtfexport/data/clearing-break.rtf 
b/sw/qa/extras/rtfexport/data/clearing-break.rtf
new file mode 100644
index 000000000000..aa99b1677c22
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/clearing-break.rtf
@@ -0,0 +1,22 @@
+{\rtf1
+\pard\plain
+{\shp
+{\*\shpinst\shpleft0\shptop0\shpright1024\shpbottom1024\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr2\shpwrk0\shpfblwtxt0\shpz0
+{\sp
+{\sn shapeType}
+{\sv 75}
+}
+{\sp
+{\sn pib}
+{\sv
+{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0
+\picw1806\pich1806\picwgoal1024\pichgoal1024\pngblip\bliptag26676260 
47494638396110001000d5ff00000000ffffffc0c0c0555f00ffffaafcfcfcf6f6f6eaeaeae6e6e6e4e4e4e3e3e3c2c2c2c1c1c1bcbcbcb5b5b5b3b3b3b0b0b0adadada5a5a5a2a2a2a1a1a19f9f9f9494948a8a8a8888888686867b7b7b6c6c6c5c5c5c4e4e4e4b4b4b4747474646463d3d3d3c3c3c2e2e2e2525251b1b1b18181810101009090906060603030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f90401000002002c0000000010001000000684408170482c0a06c8a4728924389f506833b281302a8e6b164b18103024c52111504cca67332102e0042e9a40d9319f8300a343c1200f54e47f7e2a00001e0b0a7d0d728a010d838400261a7c0d94947784252700127e9d159f6c8411140019080ea7a9a85f842122281612b1b3b25d6b1f29291d0fbbbdbc5d5e51c34e4cc64a46c94341003b}
+}
+}
+}
+}
+foo
+\lbr3\line
+bar
+\par
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport4.cxx 
b/sw/qa/extras/rtfexport/rtfexport4.cxx
index 55ae121a695b..e487c2c7213d 100644
--- a/sw/qa/extras/rtfexport/rtfexport4.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport4.cxx
@@ -25,6 +25,7 @@
 #include <pam.hxx>
 #include <fmtanchr.hxx>
 #include <frameformats.hxx>
+#include <formatlinebreak.hxx>
 
 using namespace css;
 
@@ -467,6 +468,38 @@ DECLARE_RTFEXPORT_TEST(testTdf111851, "tdf111851.rtf")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xCell6, 
"BackColor"));
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testClearingBreak)
+{
+    auto verify = [this]() {
+        uno::Reference<container::XEnumerationAccess> 
xParagraph(getParagraph(1), uno::UNO_QUERY);
+        uno::Reference<container::XEnumeration> xPortions = 
xParagraph->createEnumeration();
+        xPortions->nextElement();
+        xPortions->nextElement();
+        // Without the accompanying fix in place, this test would have failed 
with:
+        // An uncaught exception of type 
com.sun.star.container.NoSuchElementException
+        // i.e. the first para was just a fly + text portion, the clearing 
break was lost.
+        uno::Reference<beans::XPropertySet> xPortion(xPortions->nextElement(), 
uno::UNO_QUERY);
+        OUString aPortionType;
+        xPortion->getPropertyValue("TextPortionType") >>= aPortionType;
+        CPPUNIT_ASSERT_EQUAL(OUString("LineBreak"), aPortionType);
+        uno::Reference<text::XTextContent> xLineBreak;
+        xPortion->getPropertyValue("LineBreak") >>= xLineBreak;
+        sal_Int16 eClear{};
+        uno::Reference<beans::XPropertySet> xLineBreakProps(xLineBreak, 
uno::UNO_QUERY);
+        xLineBreakProps->getPropertyValue("Clear") >>= eClear;
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(SwLineBreakClear::ALL), 
eClear);
+    };
+
+    // Given a document with a clearing break:
+    // When loading that file:
+    load(mpTestDocumentPath, "clearing-break.rtf");
+    // Then make sure that the clear property of the break is not ignored:
+    verify();
+    reload(mpFilter, "clearing-break.rtf");
+    // Make sure that that the clear property of the break is not ignored 
during export:
+    verify();
+}
+
 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 ac45ba2b7c2c..d7c8bef9b41a 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -4399,6 +4399,14 @@ void RtfAttributeOutput::SectionRtlGutter(const 
SfxBoolItem& rRtlGutter)
     m_rExport.Strm().WriteCharPtr(LO_STRING_SVTOOLS_RTF_RTLGUTTER);
 }
 
-void RtfAttributeOutput::TextLineBreak(const SwFormatLineBreak& 
/*rLineBreak*/) {}
+void RtfAttributeOutput::TextLineBreak(const SwFormatLineBreak& rLineBreak)
+{
+    // Text wrapping break of type:
+    m_aStyles.append(LO_STRING_SVTOOLS_RTF_LBR);
+    m_aStyles.append(static_cast<sal_Int32>(rLineBreak.GetEnumValue()));
+
+    // Write the linebreak itself.
+    RunText("\x0b");
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx 
b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
index df02f36fc18a..9167c5479317 100644
--- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
@@ -35,7 +35,7 @@ RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
     if (RTFKeyword::LINE == nKeyword)
     {
         // very special handling since text() will eat lone '\n'
-        singleChar('\n');
+        singleChar('\n', /*bRunProps=*/true);
         return RTFError::OK;
     }
     // Trivial symbols
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx 
b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index d78f087d76e3..b3c04bb0f1f1 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -1769,6 +1769,29 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword 
nKeyword, int nParam)
             }
         }
         break;
+        case RTFKeyword::LBR:
+        {
+            Id nId = 0;
+            switch (nParam)
+            {
+                case 1:
+                    nId = NS_ooxml::LN_Value_ST_BrClear_left;
+                    break;
+                case 2:
+                    nId = NS_ooxml::LN_Value_ST_BrClear_right;
+                    break;
+                case 3:
+                    nId = NS_ooxml::LN_Value_ST_BrClear_all;
+                    break;
+            }
+
+            if (nId > 0)
+            {
+                
m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_Br_clear,
+                                                             new 
RTFValue(nId));
+            }
+        }
+        break;
         default:
         {
             SAL_INFO("writerfilter", "TODO handle value '" << 
keywordToString(nKeyword) << "'");

Reply via email to