sw/qa/extras/ooxmlexport/data/tdf118701.docx      |binary
 sw/qa/extras/ooxmlexport/ooxmlexport15.cxx        |    5 +++++
 writerfilter/source/dmapper/DomainMapper.cxx      |    2 +-
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   16 ++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    1 +
 5 files changed, 23 insertions(+), 1 deletion(-)

New commits:
commit b216fc5b583050cfb1cdf9bd82ec3c1bd2e09d70
Author:     Bakos Attila <bakos.attilakar...@nisz.hu>
AuthorDate: Tue Jun 30 15:03:31 2020 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Fri Jul 10 14:44:50 2020 +0200

    tdf#118701 DOCX import: fix image position on page break
    
    If an image anchored to an empty paragraph only with
    section properties, don't remove that paragraph to keep
    the image on the page before the page break.
    
    IsLastParaEmpty() tries to move a text cursor over the
    empty paragraph marked for deletion. If it contains an
    image anchored as a character, the cursor won't reach
    the end of the previous paragraph by goLeft(2).
    
    Co-authored-by: Attila Bánhegyi (NISZ)
    
    Change-Id: Ic22c7553948eb06739232d7e35fc49ad14f96518
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97518
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf118701.docx 
b/sw/qa/extras/ooxmlexport/data/tdf118701.docx
new file mode 100644
index 000000000000..654a22709919
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118701.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
index 9c1fb2c02edf..67e9a9555b24 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
@@ -33,6 +33,11 @@ DECLARE_OOXMLEXPORT_TEST(testTdf133334_followPgStyle, 
"tdf133334_followPgStyle.o
     CPPUNIT_ASSERT_EQUAL(2, getPages());
 }
 
+DECLARE_OOXMLIMPORT_TEST(testTdf118701, "tdf118701.docx")
+{
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("At least one paragraph is missing from the 
file!", 3, getParagraphs());
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf133370_columnBreak, 
"tdf133370_columnBreak.odt")
 {
     // Since non-DOCX formats ignores column breaks in non-column situations, 
don't export to docx.
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index d07f045de806..5df7bb33b1ae 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3516,7 +3516,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, 
size_t len)
             }
             m_pImpl->SetParaSectpr(false);
             finishParagraph(bRemove);
-            if (bRemove)
+            if (bRemove && m_pImpl->IsLastParaEmpty())
                 m_pImpl->RemoveLastParagraph();
         }
         else
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 04e087fc4d30..16b56a6ecae8 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -474,6 +474,22 @@ void DomainMapper_Impl::AddDummyParaForTableInSection()
     }
 }
 
+bool DomainMapper_Impl::IsLastParaEmpty()
+{
+    bool bRet = true;
+    if (!m_aTextAppendStack.empty() && m_aTextAppendStack.top().xTextAppend)
+    {
+        //creating cursor for finding text content
+        uno::Reference<text::XTextCursor> xCursor = 
m_aTextAppendStack.top().xTextAppend->createTextCursor();
+        xCursor->gotoEnd(false);
+        //selecting the last 2 characters in the document
+        xCursor->goLeft(2, true);
+        //the last paragraph is empty, if they are newlines
+        bRet = 
xCursor->getString().match(OUString(SAL_NEWLINE_STRING).concat(SAL_NEWLINE_STRING));
+    }
+    return bRet;
+}
+
 void DomainMapper_Impl::RemoveLastParagraph( )
 {
     if (m_bDiscardHeaderFooter)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index db0a03fa7792..e145547f3ddd 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -626,6 +626,7 @@ public:
 
     void RemoveDummyParaForTableInSection();
     void AddDummyParaForTableInSection();
+    bool IsLastParaEmpty();
     void RemoveLastParagraph( );
     void SetIsLastParagraphInSection( bool bIsLast );
     bool GetIsLastParagraphInSection() const { return m_bIsLastParaInSection;}
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to