DOCX import fix for table with auto size
Change-Id: Ic86f4f142e579bdef3e954492e1c1e382a545739 Reviewed-on: https://gerrit.libreoffice.org/4496
This commit is contained in:
Binary file not shown.
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user