summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Co <rattles2013@gmail.com>2013-06-26 11:08:56 +0300
committerMiklos Vajna <vmiklos@suse.cz>2013-06-28 11:43:48 +0200
commit74c5ed19f430327988194cdcd6bdff09591a93fa (patch)
tree3c13fe12ac592a1d0acb6caf273f12a1d0e15433
parent7f4a622f9fbf27774efa908348e682df7280713b (diff)
DOCX import fix for table with auto size
Change-Id: Ic86f4f142e579bdef3e954492e1c1e382a545739 Reviewed-on: https://gerrit.libreoffice.org/4496
-rw-r--r--sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docxbin0 -> 17672 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx12
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.cxx44
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.hxx1
4 files changed, 55 insertions, 2 deletions
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 000000000000..557edcb3cb0b
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/table-auto-column-fixed-size.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 4f23d926686c..985bd66b80cd 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -121,6 +121,7 @@ public:
void testN820788();
void testN820504();
void testFdo43641();
+ void testTableAutoColumnFixedSize();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -208,6 +209,7 @@ void Test::run()
{"n820788.docx", &Test::testN820788},
{"n820504.docx", &Test::testN820504},
{"fdo43641.docx", &Test::testFdo43641},
+ {"table-auto-column-fixed-size.docx", &Test::testTableAutoColumnFixedSize},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1462,6 +1464,16 @@ void Test::testFdo43641()
CPPUNIT_ASSERT_EQUAL(sal_Int32(EMU_TO_MM100(928694)), xLine->getSize().Width);
}
+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 48d1e3132690..6aabf59418cd 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
@@ -57,6 +57,7 @@ DomainMapperTableManager::DomainMapperTableManager(bool bOOXML) :
m_bRowSizeTypeInserted(false),
m_bTableSizeTypeInserted(false),
m_nLayoutType(0),
+ m_nMaxFixedWidth(0),
m_pTablePropsHandler( new TablePropertiesHandler( bOOXML ) )
{
m_pTablePropsHandler->SetTableManager( this );
@@ -132,8 +133,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 );
+ }
}
m_bTableSizeTypeInserted = true;
}
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
index 1384197a585f..6243b619c0e1 100644
--- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
@@ -62,6 +62,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t
bool m_bTableSizeTypeInserted;
/// 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;