sw/qa/extras/rtfexport/data/tdf153178.rtf      |    7 +++++++
 sw/qa/extras/rtfexport/rtfexport7.cxx          |   10 ++++++++++
 writerfilter/source/rtftok/rtfdispatchflag.cxx |   20 ++++++++++++++++++++
 writerfilter/source/rtftok/rtfdocumentimpl.cxx |    6 +++---
 4 files changed, 40 insertions(+), 3 deletions(-)

New commits:
commit 4e2f2489c4c7436f8b3a21a530bc625cbef4e365
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Thu Nov 9 19:54:19 2023 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Fri Nov 10 10:33:54 2023 +0100

    tdf#153178 writerfilter: do not create text frame spuriously
    
    There are different RTF keywords that end up in RTFFrame, and some of
    them cause Word to create a frame, while others don't.
    
    Getting this right requires implementing support for all the missing
    wrapping keywords, as most of them create a frame in Word but
    \wrapdefault does not.
    
    Change-Id: I1e55d15180564f3d66a5ee7d98274ae18f032872
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159228
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sw/qa/extras/rtfexport/data/tdf153178.rtf 
b/sw/qa/extras/rtfexport/data/tdf153178.rtf
new file mode 100644
index 000000000000..e1d74f4010ea
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/tdf153178.rtf
@@ -0,0 +1,7 @@
+{\rtf1
+\tqr\tlul\tx2025\dxfrtext142\dfrmtxtx142\dfrmtxty142\wrapdefault\faauto\adjustright\rin0\lin57\itap0
 \rtlch\fcs1 \afs26\alang1025 \ltrch\fcs0 
\fs26\lang1031\langfe3079\cgrid\langnp1031\langfenp3079
+KKKKKKKK
+\par
+\pard
+\par
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport7.cxx 
b/sw/qa/extras/rtfexport/rtfexport7.cxx
index ad9249bedeb8..4d1550af4fdd 100644
--- a/sw/qa/extras/rtfexport/rtfexport7.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport7.cxx
@@ -22,6 +22,7 @@
 #include <com/sun/star/text/HoriOrientation.hpp>
 #include <com/sun/star/text/XTextTable.hpp>
 #include <com/sun/star/text/XTextFieldsSupplier.hpp>
+#include <com/sun/star/text/XTextFramesSupplier.hpp>
 #include <com/sun/star/text/XTextTablesSupplier.hpp>
 #include <com/sun/star/text/XBookmarksSupplier.hpp>
 
@@ -659,6 +660,15 @@ DECLARE_RTFEXPORT_TEST(testWatermark, "watermark.rtf")
     CPPUNIT_ASSERT_EQUAL(float(66), nFontSize);
 }
 
+DECLARE_RTFEXPORT_TEST(testTdf153178, "tdf153178.rtf")
+{
+    // the problem was that a frame was created
+    uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xIndexAccess(xTextFramesSupplier->getTextFrames(),
+                                                         uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount());
+}
+
 DECLARE_RTFEXPORT_TEST(testTdf109790, "tdf109790.rtf")
 {
     uno::Reference<text::XTextTable> xTable(getParagraphOrTable(2), 
uno::UNO_QUERY);
diff --git a/writerfilter/source/rtftok/rtfdispatchflag.cxx 
b/writerfilter/source/rtftok/rtfdispatchflag.cxx
index de7b91e26fae..699698aa8df8 100644
--- a/writerfilter/source/rtftok/rtfdispatchflag.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchflag.cxx
@@ -1242,6 +1242,26 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword 
nKeyword)
             m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
                                                
NS_ooxml::LN_Value_doc_ST_Wrap_notBeside);
             break;
+        case RTFKeyword::OVERLAY:
+            m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
+                                               
NS_ooxml::LN_Value_doc_ST_Wrap_none);
+            break;
+        case RTFKeyword::WRAPAROUND:
+            m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
+                                               
NS_ooxml::LN_Value_doc_ST_Wrap_around);
+            break;
+        case RTFKeyword::WRAPTHROUGH:
+            m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
+                                               
NS_ooxml::LN_Value_doc_ST_Wrap_through);
+            break;
+        case RTFKeyword::WRAPTIGHT:
+            m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
+                                               
NS_ooxml::LN_Value_doc_ST_Wrap_tight);
+            break;
+        case RTFKeyword::WRAPDEFAULT:
+            m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
+                                               
NS_ooxml::LN_Value_doc_ST_Wrap_auto);
+            break;
         case RTFKeyword::MNOR:
             m_bMathNor = true;
             break;
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx 
b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 568ad4a8f31f..11e251b0828a 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -3995,9 +3995,9 @@ RTFSprms RTFFrame::getSprms()
 
 bool RTFFrame::hasProperties() const
 {
-    return m_nX != 0 || m_nY != 0 || m_nW != 0 || m_nH != 0 || m_nHoriPadding 
!= 0
-           || m_nVertPadding != 0 || m_nHoriAlign != 0 || m_nHoriAnchor != 0 
|| m_nVertAlign != 0
-           || m_nVertAnchor != 0;
+    // tdf#153178 \dxfrtext \dfrmtxtx \dfrmtxty \wrapdefault do *not* create 
frame
+    return m_nX != 0 || m_nY != 0 || m_nW != 0 || m_nH != 0
+           || (m_oWrap && *m_oWrap != NS_ooxml::LN_Value_doc_ST_Wrap_auto);
 }
 
 } // namespace writerfilter

Reply via email to