Hi Cedric, See attached patch, it fixes exporting the http://cgit.freedesktop.org/~vmiklos/ooo-gsoc/tree/writer/hallenverzeichnis_2003.odt?h=ooo-test-files test file - before the fix, only the first column was visible in Word. OK to push? Thanks.
From c0e4c1a4c7949a756051a96bab19e5fb0e3b9fae Mon Sep 17 00:00:00 2001 From: Miklos Vajna <vmiklos@frugalware.org> Date: Thu, 14 Oct 2010 12:53:40 +0200 Subject: [PATCH] RTF: stacked fix for nested tables When the first cell of a table contains an other table, the definition of the outer table has to be written after the inner table. Introduce a stack to handle this. --- sw/source/filter/ww8/rtfattributeoutput.cxx | 36 +++++++++++++++++++++++--- sw/source/filter/ww8/rtfattributeoutput.hxx | 15 +++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index a2931fe..e7338cd 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -299,8 +299,7 @@ void RtfAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pTextN { ww8::WW8TableNodeInfoInner::Pointer_t pInner( pTextNodeInfo->getInnerForDepth( nDepth ) ); - delete m_pTableWrt, m_pTableWrt = NULL; - + m_bLastTable = (nDepth == pTextNodeInfo->getDepth()); StartTable( pInner ); StartTableRow( pInner ); StartTableCell( pInner ); @@ -565,6 +564,7 @@ void RtfAttributeOutput::TableInfoCell( ww8::WW8TableNodeInfoInner::Pointer_t /* m_aStyles.append(OOO_STRING_SVTOOLS_RTF_ITAP); m_aStyles.append((sal_Int32)m_nTableDepth); } + m_bWroteCellInfo = true; } void RtfAttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t /*pTableTextNodeInfo*/ ) @@ -904,7 +904,8 @@ void RtfAttributeOutput::StartTable( ww8::WW8TableNodeInfoInner::Pointer_t /*pTa { OSL_TRACE("%s", OSL_THIS_FUNC); - /* noop */ + // To trigger calling InitTableHelper() + delete m_pTableWrt, m_pTableWrt = NULL; } void RtfAttributeOutput::StartTableRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) @@ -914,6 +915,9 @@ void RtfAttributeOutput::StartTableRow( ww8::WW8TableNodeInfoInner::Pointer_t pT TableDefinition(pTableTextNodeInfoInner); + if (!m_bLastTable) + m_aTables.push_back(m_aRowDefs.makeStringAndClear()); + // We'll write the table definition for nested tables later if ( nCurrentDepth > 1 ) return; @@ -940,6 +944,12 @@ void RtfAttributeOutput::EndTableCell( ) { OSL_TRACE("%s, (depth is %d)", OSL_THIS_FUNC, (int)m_nTableDepth); + if (!m_bWroteCellInfo) + { + m_aAfterRuns.append(OOO_STRING_SVTOOLS_RTF_INTBL); + m_aAfterRuns.append(OOO_STRING_SVTOOLS_RTF_ITAP); + m_aAfterRuns.append((sal_Int32)m_nTableDepth); + } if ( m_nTableDepth > 1 ) m_aAfterRuns.append(OOO_STRING_SVTOOLS_RTF_NESTCELL); else @@ -947,6 +957,7 @@ void RtfAttributeOutput::EndTableCell( ) m_bTableCellOpen = false; m_bTblAfterCell = true; + m_bWroteCellInfo = false; } void RtfAttributeOutput::EndTableRow( ) @@ -956,11 +967,24 @@ void RtfAttributeOutput::EndTableRow( ) if ( m_nTableDepth > 1 ) { m_aAfterRuns.append("{" OOO_STRING_SVTOOLS_RTF_IGNORE OOO_STRING_SVTOOLS_RTF_NESTTABLEPROPRS); - m_aAfterRuns.append(m_aRowDefs.makeStringAndClear()); + if (m_aRowDefs.getLength() > 0) + m_aAfterRuns.append(m_aRowDefs.makeStringAndClear()); + else if (m_aTables.size() > 0) + { + m_aAfterRuns.append(m_aTables.back()); + m_aTables.pop_back(); + } m_aAfterRuns.append(OOO_STRING_SVTOOLS_RTF_NESTROW "}" "{" OOO_STRING_SVTOOLS_RTF_NONESTTABLES OOO_STRING_SVTOOLS_RTF_PAR "}"); } else + { + if (m_aTables.size() > 0) + { + m_aAfterRuns.append(m_aTables.back()); + m_aTables.pop_back(); + } m_aAfterRuns.append(OOO_STRING_SVTOOLS_RTF_ROW).append(OOO_STRING_SVTOOLS_RTF_PARD); + } } void RtfAttributeOutput::EndTable() @@ -2964,7 +2988,9 @@ RtfAttributeOutput::RtfAttributeOutput( RtfExport &rExport ) m_bTblAfterCell( false ), m_nColBreakNeeded( false ), m_bBufferSectionBreaks( false ), - m_bBufferSectionHeaders( false ) + m_bBufferSectionHeaders( false ), + m_bLastTable( true ), + m_bWroteCellInfo( false ) { OSL_TRACE("%s", OSL_THIS_FUNC); } diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx index cdbc6c6..c57b4d9 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.hxx +++ b/sw/source/filter/ww8/rtfattributeoutput.hxx @@ -539,6 +539,21 @@ private: bool m_bBufferSectionHeaders; rtl::OStringBuffer m_aSectionHeaders; + /* + * Support for starting multiple tables at the same cell. + * If the current table is the last started one. + */ + bool m_bLastTable; + /* + * List of already started but not yet defined tables (need to be defined + * after the nested tables). + */ + std::vector< rtl::OString > m_aTables; + /* + * If cell info is already output. + */ + bool m_bWroteCellInfo; + public: RtfAttributeOutput( RtfExport &rExport ); -- 1.7.2.1
Attachment:
pgpOPKGnyADdL.pgp
Description: PGP signature