diff options
-rw-r--r-- | sw/qa/extras/ooxmlimport/data/fdo59273.docx | bin | 0 -> 4358 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 12 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableManager.cxx | 10 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableManager.hxx | 7 | ||||
-rw-r--r-- | writerfilter/source/dmapper/TablePropertiesHandler.cxx | 7 | ||||
-rw-r--r-- | writerfilter/source/ooxml/model.xml | 19 |
6 files changed, 44 insertions, 11 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/fdo59273.docx b/sw/qa/extras/ooxmlimport/data/fdo59273.docx Binary files differnew file mode 100644 index 000000000000..fcdfd7734411 --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/fdo59273.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index a5b41e3a564e..e3f161838a5f 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -122,6 +122,7 @@ public: void testFdo61343(); void testToolsLineNumbering(); void testFdo60922(); + void testFdo59273(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -195,6 +196,7 @@ void Test::run() {"fdo61343.docx", &Test::testFdo61343}, {"tools-line-numbering.docx", &Test::testToolsLineNumbering}, {"fdo60922.docx", &Test::testFdo60922}, + {"fdo59273.docx", &Test::testFdo59273}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1288,6 +1290,16 @@ void Test::testFdo60922() CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty<sal_Int32>(getRun(getParagraph(1), 1), "CharEscapementHeight")); } +void Test::testFdo59273() +{ + 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); + uno::Reference<table::XTableRows> xTableRows(xTextTable->getRows(), uno::UNO_QUERY); + // Was 9997, so the 4th column had ~zero width + CPPUNIT_ASSERT_EQUAL(sal_Int16(7498), getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), "TableColumnSeparators")[2].Position); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index be4e05fc5ae9..11197099ed4f 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -53,6 +53,7 @@ DomainMapperTableManager::DomainMapperTableManager(bool bOOXML) : m_bOOXML( bOOXML ), m_bPushCurrentWidth(false), m_bRowSizeTypeInserted(false), + m_nLayoutType(0), m_pTablePropsHandler( new TablePropertiesHandler( bOOXML ) ) { m_pTablePropsHandler->SetTableManager( this ); @@ -403,6 +404,7 @@ void DomainMapperTableManager::startLevel( ) m_aTablePositions.push_back( pNewPositionHandler ); m_nCell.push_back( 0 ); m_nTableWidth = 0; + m_nLayoutType = 0; // And push it back to the right level. if (oCurrentWidth) @@ -416,6 +418,7 @@ void DomainMapperTableManager::endLevel( ) m_aCellWidths.pop_back( ); m_nCell.pop_back( ); m_nTableWidth = 0; + m_nLayoutType = 0; DomainMapperTableManager_Base_t::endLevel( ); @@ -556,12 +559,13 @@ void DomainMapperTableManager::endOfRowAction() #endif insertRowProps(pPropMap); } - else if (pCellWidths->size() > 0) + else if (pCellWidths->size() > 0 && m_nLayoutType == NS_ooxml::LN_Value_wordprocessingml_ST_TblLayout_fixed) { // If we're here, then the number of cells does not equal to the amount // defined by the grid, even after taking care of // gridSpan/gridBefore/gridAfter. Handle this by ignoring the grid and - // providing the separators based on the provided cell widths. + // providing the separators based on the provided cell widths, as long + // as we have a fixed layout. uno::Sequence< text::TableColumnSeparator > aSeparators(pCellWidths->size() - 1); text::TableColumnSeparator* pSeparators = aSeparators.getArray(); sal_Int16 nSum = 0; @@ -602,7 +606,7 @@ void DomainMapperTableManager::endOfRowAction() void DomainMapperTableManager::clearData() { - m_nRow = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = 0; + m_nRow = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = m_nLayoutType = 0; m_sTableStyleName = OUString(); m_pTableStyleTextProperies.reset(); } diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index 6ae6b1caad07..e2fb5f66ac32 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -56,6 +56,8 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t ::std::vector< IntVectorPtr > m_aCellWidths; /// Remember if a cell already set this, then it should not be set at a row level. bool m_bRowSizeTypeInserted; + /// Table layout algorithm, IOW if we should consider fixed column width or not. + sal_uInt32 m_nLayoutType; TablePropertiesHandler *m_pTablePropsHandler; PropertyMapPtr m_pStyleProps; @@ -126,6 +128,11 @@ public: return m_bRowSizeTypeInserted; } + void SetLayoutType(sal_uInt32 nLayoutType) + { + m_nLayoutType = nLayoutType; + } + }; }} diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx index a1621f18c11c..4023a2134abb 100644 --- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx +++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx @@ -161,6 +161,13 @@ namespace dmapper { } } break; + case NS_ooxml::LN_CT_TblPrBase_tblLayout: + { + DomainMapperTableManager* pManager = dynamic_cast<DomainMapperTableManager*>(m_pTableManager); + if (pManager) + pManager->SetLayoutType(static_cast<sal_uInt32>(nIntValue)); + } + break; case NS_ooxml::LN_CT_TcPrBase_tcBorders ://cell borders //contains CT_TcBorders_left, right, top, bottom { diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 2dc9c6b0a173..60c4c5739399 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -17882,7 +17882,7 @@ <xs:documentation>Revision Identifier for Table Row Properties</xs:documentation> </attribute> </define> - <define name="ST_TblLayoutType"> + <define name="ST_TblLayout"> <list> <xs:documentation>Table Layout Type</xs:documentation> <choice> @@ -17893,9 +17893,9 @@ </choice> </list> </define> - <define name="CT_TblLayoutType"> + <define name="CT_TblLayout"> <attribute name="type"> - <text/> + <ref name="ST_TblLayout"/> <xs:documentation>Table Layout Setting</xs:documentation> </attribute> </define> @@ -18095,7 +18095,7 @@ </optional> <optional> <element name="tblLayout"> - <ref name="CT_TblLayoutType"/> + <ref name="CT_TblLayout"/> </element> </optional> <optional> @@ -18150,7 +18150,7 @@ </optional> <optional> <element name="tblLayout"> - <ref name="CT_TblLayoutType"/> + <ref name="CT_TblLayout"/> </element> </optional> <optional> @@ -22938,9 +22938,12 @@ <action name="end" action="sendTableProperties"/> <action name="end" action="endRow"/> </resource> - <resource name="ST_TblLayoutType" resource="List" generated="yes"> - <value name="fixed" tokenid="ooxml:Value_wordprocessingml_ST_TblLayoutType_fixed">fixed</value> - <value name="autofit" tokenid="ooxml:Value_wordprocessingml_ST_TblLayoutType_autofit">autofit</value> + <resource name="ST_TblLayout" resource="List"> + <value tokenid="ooxml:Value_wordprocessingml_ST_TblLayout_fixed">fixed</value> + <value tokenid="ooxml:Value_wordprocessingml_ST_TblLayout_autofit">autofit</value> + </resource> + <resource name="CT_TblLayout" resource="Value" tag="table"> + <attribute name="type" tokenid="ooxml:CT_TblLayout_type" action="setValue"/> </resource> <resource name="ST_TblOverlap" resource="List"> <value tokenid="ooxml:Value_ST_TblOverlap_never">never</value> |