[Libreoffice-commits] core.git: sw/source

Caolán McNamara caolanm at redhat.com
Fri Apr 17 09:29:45 PDT 2015


 sw/source/filter/ww8/docxattributeoutput.cxx |   25 ++++++++++++++-----------
 sw/source/filter/ww8/docxattributeoutput.hxx |   25 ++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 12 deletions(-)

New commits:
commit 67ef5f22aa3c8f060ab5caf5b816e9806c610654
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Apr 17 12:36:30 2015 +0100

    SwTableLines::size is an unreliable way to count rows
    
    pathological old-school writer tables can have one line here for merged rows
    
    The table writer knows about these things, so use that, keep it up
    to date, and make that up to date cheaper to do
    
    Change-Id: I3433206a54c7cb096b699ac0b61653358e647115

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 09632bc..c5404f4 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -694,9 +694,10 @@ void DocxAttributeOutput::FinishTableRowCell( ww8::WW8TableNodeInfoInner::Pointe
         // Where are we in the table
         sal_uInt32 nRow = pInner->getRow( );
 
-        const SwTable *pTable = pInner->getTable( );
-        const SwTableLines& rLines = pTable->GetTabLines( );
-        sal_uInt16 nLinesCount = rLines.size( );
+        InitTableHelper( pInner );
+
+        const size_t nLinesCount = m_xTableWrt->GetRows().size();
+
         // HACK
         // msoffice seems to have an internal limitation of 63 columns for tables
         // and refuses to load .docx with more, even though the spec seems to allow that;
@@ -2824,7 +2825,7 @@ void DocxAttributeOutput::TableCellProperties( ww8::WW8TableNodeInfoInner::Point
            FSEND );
 
     // Horizontal spans
-    const SwWriteTableRows& aRows = m_pTableWrt->GetRows( );
+    const SwWriteTableRows& aRows = m_xTableWrt->GetRows( );
     SwWriteTableRow *pRow = aRows[ nRow ];
     const SwWriteTableCells *tableCells =  &pRow->GetCells();
     if (nCell < tableCells->size() )
@@ -2887,21 +2888,24 @@ void DocxAttributeOutput::TableCellProperties( ww8::WW8TableNodeInfoInner::Point
 
 void DocxAttributeOutput::InitTableHelper( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
 {
+    const SwTable* pTable = pTableTextNodeInfoInner->getTable();
+    if (m_xTableWrt && pTable == m_xTableWrt->getTable())
+        return;
+
     long nPageSize = 0;
     bool bRelBoxSize = false;
 
     // Create the SwWriteTable instance to use col spans (and maybe other infos)
     GetTablePageSize( pTableTextNodeInfoInner.get(), nPageSize, bRelBoxSize );
 
-    const SwTable* pTable = pTableTextNodeInfoInner->getTable( );
     const SwFrmFmt *pFmt = pTable->GetFrmFmt( );
     const sal_uInt32 nTblSz = static_cast<sal_uInt32>(pFmt->GetFrmSize( ).GetWidth( ));
 
     const SwHTMLTableLayout *pLayout = pTable->GetHTMLTableLayout();
     if( pLayout && pLayout->IsExportable() )
-        m_pTableWrt.reset(new SwWriteTable(pLayout));
+        m_xTableWrt.reset(new DocxWriteTable(pTable, pLayout));
     else
-        m_pTableWrt.reset(new SwWriteTable(pTable->GetTabLines(), nPageSize, nTblSz, false));
+        m_xTableWrt.reset(new DocxWriteTable(pTable, pTable->GetTabLines(), nPageSize, nTblSz, false));
 }
 
 void DocxAttributeOutput::StartTable( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
@@ -2933,7 +2937,7 @@ void DocxAttributeOutput::EndTable()
         m_tableReference->m_bTableCellOpen = true;
 
     // Cleans the table helper
-    m_pTableWrt.reset(0);
+    m_xTableWrt.reset(0);
 
     m_aTableStyleConf.clear();
 }
@@ -2980,8 +2984,7 @@ void DocxAttributeOutput::EndTableRow( )
 
 void DocxAttributeOutput::StartTableCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner, sal_uInt32 nCell, sal_uInt32 nRow )
 {
-    if ( !m_pTableWrt )
-        InitTableHelper( pTableTextNodeInfoInner );
+    InitTableHelper( pTableTextNodeInfoInner );
 
     m_pSerializer->startElementNS( XML_w, XML_tc, FSEND );
 
@@ -3566,7 +3569,7 @@ void DocxAttributeOutput::TableVerticalCell( ww8::WW8TableNodeInfoInner::Pointer
         }
     }
 
-    const SwWriteTableRows& aRows = m_pTableWrt->GetRows( );
+    const SwWriteTableRows& aRows = m_xTableWrt->GetRows( );
     SwWriteTableRow *pRow = aRows[ pTableTextNodeInfoInner->getRow( ) ];
     sal_uInt32 nCell = pTableTextNodeInfoInner->getCell();
     const SwWriteTableCells *tableCells =  &pRow->GetCells();
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 4da101b..2b253d2 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -138,6 +138,29 @@ struct TableReference
     }
 };
 
+class DocxWriteTable : public SwWriteTable
+{
+public:
+    DocxWriteTable(const SwTable* pTable, const SwTableLines& rLines, long nWidth, sal_uInt32 nBWidth,
+                 bool bRel, sal_uInt16 nMaxDepth = USHRT_MAX,
+                 sal_uInt16 nInLeftSub=0, sal_uInt16 nInRightSub=0, sal_uInt32 nNumOfRowsToRepeat=0)
+        : SwWriteTable(rLines, nWidth, nBWidth,
+                       bRel, nMaxDepth, nInLeftSub, nInRightSub, nNumOfRowsToRepeat)
+        , m_pTable(pTable)
+    {
+    }
+
+    DocxWriteTable(const SwTable* pTable, const SwHTMLTableLayout *pLayoutInfo )
+        : SwWriteTable(pLayoutInfo)
+        , m_pTable(pTable)
+    {
+    }
+
+    const SwTable* getTable() const { return m_pTable; }
+private:
+    const SwTable* m_pTable;
+};
+
 /// The class that has handlers for various resource types when exporting as DOCX.
 class DocxAttributeOutput : public AttributeOutputBase, public oox::vml::VMLTextExport, public oox::drawingml::DMLTextExport
 {
@@ -795,7 +818,7 @@ private:
     std::vector<css::beans::PropertyValue> m_aTextEffectsGrabBag;
 
     /// The current table helper
-    std::unique_ptr<SwWriteTable> m_pTableWrt;
+    std::unique_ptr<DocxWriteTable> m_xTableWrt;
 
     sw::Frame* m_pCurrentFrame;
 


More information about the Libreoffice-commits mailing list