diff options
-rw-r--r-- | sw/qa/extras/ooxmlimport/data/tdf87460.docx | bin | 0 -> 17343 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 9 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 12 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.hxx | 4 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 8 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 |
6 files changed, 33 insertions, 3 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/tdf87460.docx b/sw/qa/extras/ooxmlimport/data/tdf87460.docx Binary files differnew file mode 100644 index 000000000000..c443dbe4563e --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/tdf87460.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index b16877dae49d..59950273ee18 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -2716,6 +2716,15 @@ DECLARE_OOXMLIMPORT_TEST(testTdf8255, "tdf8255.docx") CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), xDrawPage->getCount()); } +DECLARE_OOXMLIMPORT_TEST(testTdf87460, "tdf87460.docx") +{ + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XEndnotesSupplier> xEndnotesSupplier(xTextDocument, uno::UNO_QUERY); + 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()); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index b08e52a3c90f..5dcae2b81843 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -56,7 +56,8 @@ DomainMapperTableHandler::DomainMapperTableHandler(TextReference_t const& xText, : m_xText(xText), m_rDMapper_Impl( rDMapper_Impl ), m_nCellIndex(0), - m_nRowIndex(0) + m_nRowIndex(0), + m_bHadFootOrEndnote(false) { } @@ -1080,7 +1081,8 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) } // If we have a table with a start and an end position, we should make it a floating one. - if (xTable.is() && xStart.is() && xEnd.is()) + // 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) { uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY); bool bIsRelative = false; @@ -1132,6 +1134,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) m_aTableProperties.reset(); m_aCellProperties.clear(); m_aRowProperties.clear(); + m_bHadFootOrEndnote = false; #ifdef DEBUG_WRITERFILTER TagLogger::getInstance().endElement(); @@ -1212,6 +1215,11 @@ void DomainMapperTableHandler::endCell(const Handle_t & end) ++m_nCellIndex; } +void DomainMapperTableHandler::setHadFootOrEndnote(bool bHadFootOrEndnote) +{ + m_bHadFootOrEndnote = bHadFootOrEndnote; +} + }} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index 818f20fa1547..d91b140b770d 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -83,6 +83,9 @@ class DomainMapperTableHandler : public TableDataHandler sal_Int32 m_nCellIndex; sal_Int32 m_nRowIndex; + /// Did we have a foot or endnote in this table? + bool m_bHadFootOrEndnote; + TableStyleSheetEntry * endTableGetTableStyle(TableInfo & rInfo, std::vector<css::beans::PropertyValue>& rFrameProperties); CellPropertyValuesSeq_t endTableGetCellProperties(TableInfo & rInfo, std::vector<HorizontallyMergedCell>& rMerges); RowPropertyValuesSeq_t endTableGetRowProperties(); @@ -103,6 +106,7 @@ public: virtual void endCell(const Handle_t & end) SAL_OVERRIDE; Handle_t& getTable() { return m_xTableRange; }; + void setHadFootOrEndnote(bool bHadFootOrEndnote); }; }} diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index d106b4a883c8..41a4f23861b9 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -5205,6 +5205,14 @@ void DomainMapper_Impl::substream(Id rName, getTableManager().endLevel(); popTableManager(); + switch(rName) + { + case NS_ooxml::LN_footnote: + case NS_ooxml::LN_endnote: + m_pTableHandler->setHadFootOrEndnote(true); + break; + } + // check that stacks are the same as before substream assert(m_aContextStack.size() == contextSize); for (int i = 0; i < NUMBER_OF_CONTEXTS; ++i) { diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 78844729cc98..7d1aaf7447ed 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -38,6 +38,7 @@ #include <DomainMapper.hxx> #include "DomainMapperTableManager.hxx" +#include "DomainMapperTableHandler.hxx" #include "PropertyMap.hxx" #include "FontTable.hxx" #include "NumberingManager.hxx" @@ -366,7 +367,7 @@ private: // TableManagers are stacked: one for each stream to avoid any confusion std::stack< std::shared_ptr< DomainMapperTableManager > > m_aTableManagers; - TableDataHandler::Pointer_t m_pTableHandler; + std::shared_ptr<DomainMapperTableHandler> m_pTableHandler; //each context needs a stack of currently used attributes PropertyStack m_aPropertyStacks[NUMBER_OF_CONTEXTS]; |