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;
}