tdf#128959 DOCX import: fix missing text lines in tables

Orphan/widow line break settings aren't always ignored
by Writer table layout code, in this case, in vertically
merged cells, resulting missing paragraph lines.

As a workaround for interoperability, disable orphan/widow
control in cell paragraphs during the DOCX import to get
correct layout in Writer, too.

Change-Id: I48fdb0a3bb421fd4df2c729e307a7ef483e3e772
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87637
Reviewed-by: László Németh <nemeth@numbertext.org>
Tested-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/qa/extras/layout/data/tdf128959.docx b/sw/qa/extras/layout/data/tdf128959.docx
new file mode 100644
index 0000000..f22f665
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf128959.docx
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 567fdea..746b8a0 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -3608,6 +3608,27 @@
    //the source document.
}

CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf128959)
{
    // no orphan/widow control in table cells
    SwDoc* pDocument = createDoc("tdf128959.docx");
    CPPUNIT_ASSERT(pDocument);
    discardDumpedLayout();
    xmlDocPtr pXmlDoc = parseLayoutDump();

    // first two lines of the paragraph in the split table cell on the first page
    // (these lines were completely lost)
    assertXPath(
        pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/LineBreak[1]", "Line",
        "a)Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue ");
    assertXPath(
        pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/LineBreak[2]", "Line",
        "massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit ");
    // last line of the paragraph in the split table cell on the second page
    assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt[1]/LineBreak[1]", "Line",
                "amet commodo magna eros quis urna.");
}

CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf121658)
{
    uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index ee9e1fb..03c77ed 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1790,17 +1790,23 @@
                    }
                }

                // tdf#90069 in tables, apply paragraph level character style also on
                // paragraph level to support its copy during insertion of new table rows
                // fix table paragraph properties
                if ( xParaProps && m_nTableDepth > 0 )
                {
                    uno::Sequence< beans::PropertyValue > aValues = pParaContext->GetPropertyValues(false);

                    // tdf#90069 in tables, apply paragraph level character style also on
                    // paragraph level to support its copy during insertion of new table rows
                    for( const auto& rProp : std::as_const(aValues) )
                    {
                        if ( rProp.Name.startsWith("Char") && rProp.Name != "CharStyleName" && rProp.Name != "CharInteropGrabBag" )
                            xParaProps->setPropertyValue( rProp.Name, rProp.Value );
                    }

                    // tdf#128959 table paragraphs haven't got window and orphan controls
                    uno::Any aAny = uno::makeAny(static_cast<sal_Int8>(0));
                    xParaProps->setPropertyValue("ParaOrphans", aAny);
                    xParaProps->setPropertyValue("ParaWidows", aAny);
                }
            }
            if( !bKeepLastParagraphProperties )