tdf#77760 sw floattable: add support for footnotes, DOCX import

This was originally added in commit
2fe248f2b36d541c0d243a620c217058a50a9d5d (tdf#87460 DOCX import: fix
missing endnote in floattable, 2015-06-23), because Writer core only
allows footnotes in floating tables since commit
56da1d30afe48cc4acd79567052a575e81f8c7a0 (tdf#77760 sw floattable: add
support for footnotes, doc model, 2023-08-22).

The DOCX export works already.

The ODT filter also works: there is a mechanism to try to not insert
footnotes in text frames, but the way XMLTextImportHelper::IsInFrame()
is implemented means that it only rejects footnotes directly in text
frames, not in tables-in-textframes, which is the interesting case for
us.

Change-Id: I90a5f0228385b2e3db8d994c6c76064fe595f439
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156024
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx
index 69a3fc1..961bbdf 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx
@@ -286,6 +286,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf87460, "tdf87460.docx")
    uno::Reference<container::XIndexAccess> xEndnotes = xEndnotesSupplier->getEndnotes();
    // This was 0: endnote was lost on import.
    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xEndnotes->getCount());

    // Also make sure that <w:tblpPr> is mapped to a text frame (hosting the table):
    uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
    uno::Reference<container::XNameAccess> xTextFrames = xTextFramesSupplier->getTextFrames();
    // Without the fix in place, this test would have failed, the table was inline.
    CPPUNIT_ASSERT(xTextFrames->hasByName("Frame1"));
}

DECLARE_OOXMLEXPORT_TEST(testTdf90611, "tdf90611.docx")
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 5b0971e..a942e30 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -88,8 +88,7 @@ DomainMapperTableHandler::DomainMapperTableHandler(
            css::uno::Reference<css::text::XTextAppendAndConvert> xText,
            DomainMapper_Impl& rDMapper_Impl)
    : m_xText(std::move(xText)),
        m_rDMapper_Impl( rDMapper_Impl ),
        m_bHadFootOrEndnote(false)
        m_rDMapper_Impl( rDMapper_Impl )
{
}

@@ -1546,8 +1545,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
        }

        // If we have a table with a start and an end position, we should make it a floating one.
        // Unless the table had a foot or endnote, as Writer doesn't support those in TextFrames.
        if (xTable.is() && xStart.is() && xEnd.is() && !m_bHadFootOrEndnote)
        if (xTable.is() && xStart.is() && xEnd.is())
        {
            uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY);
            bool bIsRelative = false;
@@ -1675,7 +1673,6 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
    m_aTableProperties.clear();
    m_aCellProperties.clear();
    m_aRowProperties.clear();
    m_bHadFootOrEndnote = false;

#ifdef DBG_UTIL
    TagLogger::getInstance().endElement();
@@ -1752,11 +1749,6 @@ void DomainMapperTableHandler::endCell(const css::uno::Reference< css::text::XTe
    m_aRowRanges.push_back(comphelper::containerToSequence(m_aCellRange));
}

void DomainMapperTableHandler::setHadFootOrEndnote(bool bHadFootOrEndnote)
{
    m_bHadFootOrEndnote = bHadFootOrEndnote;
}

DomainMapper_Impl& DomainMapperTableHandler::getDomainMapperImpl()
{
    return m_rDMapper_Impl;
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
index f05fc1e..d67c4d2 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
@@ -67,9 +67,6 @@ class DomainMapperTableHandler final : public virtual SvRefBase
    PropertyMapVector1      m_aRowProperties;
    TablePropertyMapPtr     m_aTableProperties;

    /// Did we have a foot or endnote in this table?
    bool m_bHadFootOrEndnote;

    TableStyleSheetEntry * endTableGetTableStyle(TableInfo & rInfo,
                    std::vector<css::beans::PropertyValue>& rFrameProperties,
                    bool bConvertToFloating);
@@ -116,8 +113,6 @@ public:
    */
    void endCell(const css::uno::Reference< css::text::XTextRange > & end);

    void setHadFootOrEndnote(bool bHadFootOrEndnote);

    DomainMapper_Impl& getDomainMapperImpl();
};

diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index d9faf0c..4b7e919 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -9355,7 +9355,6 @@ void DomainMapper_Impl::substream(Id rName,
    {
    case NS_ooxml::LN_footnote:
    case NS_ooxml::LN_endnote:
        m_pTableHandler->setHadFootOrEndnote(true);
        m_bHasFtn = true;
        break;
    }