sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 12 ++ writerfilter/source/dmapper/DomainMapperTableManager.cxx | 44 +++++++++- writerfilter/source/dmapper/DomainMapperTableManager.hxx | 1 4 files changed, 55 insertions(+), 2 deletions(-)
New commits: commit 9390bbfd6e0dd1dc2d007bd391b186d7bf4c86ea Author: Adam Co <rattles2...@gmail.com> Date: Wed Jun 26 11:08:56 2013 +0300 DOCX import fix for table with auto size Reviewed-on: https://gerrit.libreoffice.org/4496 Conflicts: sw/qa/extras/ooxmlimport/ooxmlimport.cxx Change-Id: Ic86f4f142e579bdef3e954492e1c1e382a545739 diff --git a/sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docx b/sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docx new file mode 100644 index 0000000..557edcb Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docx differ diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 7eb556c..bc33ac9 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -126,6 +126,7 @@ public: void testPageBorderShadow(); void testN820509(); void testN820788(); + void testTableAutoColumnFixedSize(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -201,6 +202,7 @@ void Test::run() {"page-border-shadow.docx", &Test::testPageBorderShadow}, {"n820509.docx", &Test::testN820509}, {"n820788.docx", &Test::testN820788}, + {"table-auto-column-fixed-size.docx", &Test::testTableAutoColumnFixedSize}, }; for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) { @@ -1259,6 +1261,16 @@ void Test::testN820788() CPPUNIT_ASSERT_EQUAL(text::SizeType::MIN, getProperty<sal_Int16>(xFrame, "SizeType")); } +void Test::testTableAutoColumnFixedSize() +{ + uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // Width was not recognized during import when table size was 'auto' + CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(3996)), getProperty<sal_Int32>(xTextTable, "Width")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index 28135cc..e28c171 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -52,6 +52,7 @@ DomainMapperTableManager::DomainMapperTableManager(bool bOOXML) : m_bOOXML( bOOXML ), m_bPushCurrentWidth(false), m_nLayoutType(0), + m_nMaxFixedWidth(0), m_pTablePropsHandler( new TablePropertiesHandler( bOOXML ) ) { m_pTablePropsHandler->SetTableManager( this ); @@ -127,8 +128,47 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } else if( sal::static_int_cast<Id>(pMeasureHandler->getUnit()) == NS_ooxml::LN_Value_ST_TblWidth_auto ) { - pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::VARIABLE ); - pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, 100 ); + /* + This attribute specifies the width type of table. This is used as part of the table layout + algorithm specified by the tblLayout element.(See 17.4.64 and 17.4.65 of the ISO/IEC 29500-1:2011.) + If this valus is 'auto', the table layout has to uses the preferred widths on the table items to generate + the final sizing of the table, but then must use the contents of each cell to determine final column widths. + (See 17.18.87 of the ISO/IEC 29500-1:2011.) + */ + bool bFixed = false; + sal_Int32 nRowFixedWidth = 0; + if (!m_aCellWidths.empty()) + { + // Step 1. Check whether any cell has fixed width in the given row of table. + ::std::vector< IntVectorPtr >::iterator itr; + for (itr = m_aCellWidths.begin(); itr != m_aCellWidths.end(); itr ++) + { + IntVectorPtr itrVal = (*itr); + for (std::vector<sal_Int32>::const_iterator aValIter = itrVal->begin(); aValIter != itrVal->end(); ++aValIter) + { + // Sum the width of cells to find the total width of given row + nRowFixedWidth += (*aValIter); + bFixed = true; + } + } + } + + // Check whether the total width of given row is compared with the maximum value of rows (m_nMaxFixedWidth). + if (bFixed ) + { + // Check if total width + if (m_nMaxFixedWidth < nRowFixedWidth) + m_nMaxFixedWidth = nRowFixedWidth; + + pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::FIX ); + pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, m_nMaxFixedWidth ); + } + else + { + // Set the width type of table with 'Auto' and set the width value to 100(%) + pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::VARIABLE ); + pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, 100 ); + } } } #ifdef DEBUG_DOMAINMAPPER diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index 0488de4..c3ac115 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -56,6 +56,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t ::std::vector< IntVectorPtr > m_aCellWidths; /// Table layout algorithm, IOW if we should consider fixed column width or not. sal_uInt32 m_nLayoutType; + sal_Int32 m_nMaxFixedWidth; TablePropertiesHandler *m_pTablePropsHandler; PropertyMapPtr m_pStyleProps; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits