DOCX import fix for table with auto size

Change-Id: Ic86f4f142e579bdef3e954492e1c1e382a545739
Reviewed-on: https://gerrit.libreoffice.org/4496
This commit is contained in:
Adam Co
2013-06-28 11:43:48 +02:00
committed by Miklos Vajna
parent 7f4a622f9f
commit 74c5ed19f4
4 changed files with 55 additions and 2 deletions
+12
View File
@@ -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();
@@ -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;
}
@@ -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;