diff options
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 12 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 7 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 3 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 4 | ||||
-rw-r--r-- | writerfilter/source/dmapper/TableManager.cxx | 10 | ||||
-rw-r--r-- | writerfilter/source/dmapper/TableManager.hxx | 3 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 16 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/ooxml/model.xml | 2 |
10 files changed, 55 insertions, 6 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index e3098709d3da..a46c6f67c63c 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2542,6 +2542,11 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) break; case NS_ooxml::LN_tblStart: + if (m_pImpl->hasTableManager()) + { + bool bTableStartsAtCellStart = m_pImpl->m_nTableDepth > 0 && m_pImpl->m_nTableCellDepth > m_pImpl->m_nLastTableCellParagraphDepth + 1; + m_pImpl->getTableManager().setTableStartsAtCellStart(bTableStartsAtCellStart); + } /* * Hack for Importing Section Properties * LO is not able to import section properties if first element in the @@ -2559,6 +2564,13 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) case NS_ooxml::LN_tblEnd: m_pImpl->m_nTableDepth--; break; + case NS_ooxml::LN_tcStart: + m_pImpl->m_nTableCellDepth++; + break; + case NS_ooxml::LN_tcEnd: + m_pImpl->m_nTableCellDepth--; + m_pImpl->m_nLastTableCellParagraphDepth = 0; + break; case NS_ooxml::LN_glow_glow: case NS_ooxml::LN_shadow_shadow: case NS_ooxml::LN_reflection_reflection: diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 176998295193..43ef3be6ed3e 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -969,7 +969,7 @@ static void lcl_ApplyCellParaProps(uno::Reference<table::XCell> const& xCell, } } -void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) +void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTableStartsAtCellStart) { #ifdef DEBUG_WRITERFILTER TagLogger::getInstance().startElement("tablehandler.endTable"); @@ -1114,7 +1114,10 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) { // m_xText points to the body text, get the current xText from m_rDMapper_Impl, in case e.g. we would be in a header. uno::Reference<text::XTextAppendAndConvert> xTextAppendAndConvert(m_rDMapper_Impl.GetTopTextAppend(), uno::UNO_QUERY); - if (xTextAppendAndConvert.is()) + // Only execute the conversion if the table is not anchored at + // the start of an outer table cell, that's not yet + // implemented. + if (xTextAppendAndConvert.is() && !bTableStartsAtCellStart) xTextAppendAndConvert->convertToTextFrame(xStart, xEnd, comphelper::containerToSequence(aFrameProperties)); } } diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index b1ac2f1df701..ed9cb0466640 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -94,7 +94,7 @@ public: */ void startTable(unsigned int nDepth, const TablePropertyMapPtr& pProps); /// Handle end of table. - void endTable(unsigned int nestedTableLevel); + void endTable(unsigned int nestedTableLevel, bool bTableStartsAtCellStart); /** Handle start of row. diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index dc054bc02fd0..08de96efd1f9 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -232,6 +232,8 @@ DomainMapper_Impl::DomainMapper_Impl( m_bIsNewDoc(!rMediaDesc.getUnpackedValueOrDefault("InsertMode", false)), m_bInTableStyleRunProps(false), m_nTableDepth(0), + m_nTableCellDepth(0), + m_nLastTableCellParagraphDepth(0), m_bHasFtnSep(false), m_bIgnoreNextPara(false), m_bIgnoreNextTab(false), @@ -1023,6 +1025,7 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap ) TagLogger::getInstance().startElement("finishParagraph"); #endif + m_nLastTableCellParagraphDepth = m_nTableCellDepth; ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* >( pPropertyMap.get() ); if (m_aTextAppendStack.empty()) return; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 5b33c391f297..5f2ce81d54e7 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -818,6 +818,10 @@ public: * inTbl SPRM or not). */ sal_Int32 m_nTableDepth; + /// Raw table cell depth. + sal_Int32 m_nTableCellDepth; + /// Table cell depth of the last finished paragraph. + sal_Int32 m_nLastTableCellParagraphDepth; /// If the document has a footnote separator. bool m_bHasFtnSep; diff --git a/writerfilter/source/dmapper/TableManager.cxx b/writerfilter/source/dmapper/TableManager.cxx index b574d83bd032..432abc941fc4 100644 --- a/writerfilter/source/dmapper/TableManager.cxx +++ b/writerfilter/source/dmapper/TableManager.cxx @@ -314,7 +314,7 @@ void TableManager::resolveCurrentTable() mpTableDataHandler->endRow(); } - mpTableDataHandler->endTable(mTableDataStack.size() - 1); + mpTableDataHandler->endTable(mTableDataStack.size() - 1, m_bTableStartsAtCellStart); } catch (css::uno::Exception const& e) { @@ -454,8 +454,14 @@ void TableManager::cellDepth(sal_uInt32 nDepth) mnTableDepthNew = nDepth; } +void TableManager::setTableStartsAtCellStart(bool bTableStartsAtCellStart) +{ + m_bTableStartsAtCellStart = bTableStartsAtCellStart; +} + TableManager::TableManager() - : mnTableDepthNew(0), mnTableDepth(0), mbKeepUnfinishedRow(false) + : mnTableDepthNew(0), mnTableDepth(0), mbKeepUnfinishedRow(false), + m_bTableStartsAtCellStart(false) { setRowEnd(false); setInCell(false); diff --git a/writerfilter/source/dmapper/TableManager.hxx b/writerfilter/source/dmapper/TableManager.hxx index 334634d8d335..f3d5f66d6f33 100644 --- a/writerfilter/source/dmapper/TableManager.hxx +++ b/writerfilter/source/dmapper/TableManager.hxx @@ -314,6 +314,8 @@ private: std::stack<TableData::Pointer_t> mTableDataStack; RowData::Pointer_t mpUnfinishedRow; bool mbKeepUnfinishedRow; + /// If this is a nested table, does it start at cell start? + bool m_bTableStartsAtCellStart; /** handler for resolveCurrentTable @@ -515,6 +517,7 @@ public: bool isIgnore() const; + void setTableStartsAtCellStart(bool bTableStartsAtCellStart); }; } diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index 645ade6f7b98..d804e1db567e 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -1284,6 +1284,17 @@ OOXMLFastContextHandlerTextTableCell::~OOXMLFastContextHandlerTextTableCell() void OOXMLFastContextHandlerTextTableCell::startCell() { + if (isForwardEvents()) + { + OOXMLPropertySet * pProps = new OOXMLPropertySet; + { + OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0); + OOXMLProperty::Pointer_t pProp(new OOXMLProperty(NS_ooxml::LN_tcStart, pVal, OOXMLProperty::SPRM)); + pProps->add(pProp); + } + + mpStream->props(writerfilter::Reference<Properties>::Pointer_t(pProps)); + } } void OOXMLFastContextHandlerTextTableCell::endCell() @@ -1306,6 +1317,11 @@ void OOXMLFastContextHandlerTextTableCell::endCell() OOXMLProperty::Pointer_t pProp(new OOXMLProperty(NS_ooxml::LN_tblCell, pVal, OOXMLProperty::SPRM)); pProps->add(pProp); } + { + OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0); + OOXMLProperty::Pointer_t pProp(new OOXMLProperty(NS_ooxml::LN_tcEnd, pVal, OOXMLProperty::SPRM)); + pProps->add(pProp); + } mpStream->props(writerfilter::Reference<Properties>::Pointer_t(pProps)); } diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index f713fcfe5414..60d423c53241 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -391,7 +391,7 @@ public: virtual std::string getType() const override { return "TextTableCell"; } - static void startCell(); + void startCell(); void endCell(); }; diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 61438c3d1f58..3b6a03eba231 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -40,6 +40,8 @@ <token tokenid="ooxml:object"/> <token tokenid="ooxml:tblStart"/> <token tokenid="ooxml:tblEnd"/> + <token tokenid="ooxml:tcStart"/> + <token tokenid="ooxml:tcEnd"/> <!-- These are not directly generated from OOXML XML elements / attributes, need to clean them up in the future. --> <token tokenid="ooxml:tblDepth"/> |