diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-06-23 09:03:10 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-06-23 09:04:11 +0200 |
commit | 2fe248f2b36d541c0d243a620c217058a50a9d5d (patch) | |
tree | ab04e6537619b7060d1a7f8ed7437a7723817283 | |
parent | 187445b2d2885ced92be37ffb11cd2a9bb11f8d6 (diff) |
tdf#87460 DOCX import: fix missing endnote in floattable
Writer doesn't support foot or endnotes in TextFrames, so they are not
supported in OOXML floattables, either. In the past, floattables were
imported as normal tables, that's how this worked. Restore the old
situation till the core limitation is there, so we at least don't
regress.
Change-Id: I4eb62617e3131176f7371e9ca69f11bc9e948a0b
-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 f98e0238f2d4..41daf91124de 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 8394c954d2ee..42b57154e4b0 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]; |