summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-03-26 11:15:59 +0100
committerMiklos Vajna <vmiklos@suse.cz>2013-03-26 15:21:11 +0100
commit7329df74df134a77d078f47d5c8b70d54c5d1edb (patch)
tree0cb134f80a3cf10e472be78247ef6514d5b8eef8
parent4821d894f849a4939bbe6fb0a9a5ddd9e10b0467 (diff)
fdo#59273 import w:tblLayout of DOCX tables
Change-Id: I9af50a4c176168e2794eaa9b0e8eaeb6b9d06b13
-rw-r--r--sw/qa/extras/ooxmlimport/data/fdo59273.docxbin0 -> 4358 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx12
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.cxx10
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.hxx7
-rw-r--r--writerfilter/source/dmapper/TablePropertiesHandler.cxx7
-rw-r--r--writerfilter/source/ooxml/model.xml19
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
new file mode 100644
index 000000000000..fcdfd7734411
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/fdo59273.docx
Binary files differ
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>