Date: prev next · Thread: first prev next last
2010 Archives by date, by thread · List index


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


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.