Kaydet (Commit) e24463c6 authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Michael Stahl

fdo#59393 fdo#44053 fix this again and this time add a testcase as well

This was about importing RTF tables where different rows had different
number of cells. In the meantime, a better implementation was added for
DOCX, just using that for RTF fixes the import of this bugdoc.

Also fixes a crasher while loading ooo43817-1.rtf.

(cherry picked from commit d276d3f3)

Change-Id: I0970275272eca7f33a442bd6acc97a4f8d9dabeb
Reviewed-on: https://gerrit.libreoffice.org/1947Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
Tested-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 94765a1b
{\rtf1
Title\par
\trowd \cellx550\cellx7000
0000000\cell
Name\cell
\pard
\trowd \cellx550\cellx7000\row
\trowd \cellx550\cellx1650\cellx5550\cellx7000
\cell
\pard \intbl
Cell1\cell\cell\cell
\pard
\trowd \cellx550\cellx1650\cellx5550\cellx7000\row
\pard\par
}
...@@ -136,6 +136,7 @@ public: ...@@ -136,6 +136,7 @@ public:
void testFdo45183(); void testFdo45183();
void testFdo54612(); void testFdo54612();
void testFdo58933(); void testFdo58933();
void testFdo44053();
CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT) #if !defined(MACOSX) && !defined(WNT)
...@@ -222,6 +223,7 @@ void Test::run() ...@@ -222,6 +223,7 @@ void Test::run()
{"fdo45183.rtf", &Test::testFdo45183}, {"fdo45183.rtf", &Test::testFdo45183},
{"fdo54612.rtf", &Test::testFdo54612}, {"fdo54612.rtf", &Test::testFdo54612},
{"fdo58933.rtf", &Test::testFdo58933}, {"fdo58933.rtf", &Test::testFdo58933},
{"fdo44053.rtf", &Test::testFdo44053},
}; };
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
{ {
...@@ -1052,6 +1054,17 @@ void Test::testFdo58933() ...@@ -1052,6 +1054,17 @@ void Test::testFdo58933()
CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getCellNames().getLength()); CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getCellNames().getLength());
} }
void Test::testFdo44053()
{
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);
// The with of the table's A1 and A2 cell should equal.
CPPUNIT_ASSERT_EQUAL(getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), "TableColumnSeparators")[0].Position,
getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(1), "TableColumnSeparators")[0].Position);
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
...@@ -41,7 +41,7 @@ using namespace ::com::sun::star; ...@@ -41,7 +41,7 @@ using namespace ::com::sun::star;
using namespace ::std; using namespace ::std;
DomainMapperTableManager::DomainMapperTableManager(bool bOOXML, bool bImplicitMerges) : DomainMapperTableManager::DomainMapperTableManager(bool bOOXML) :
m_nRow(0), m_nRow(0),
m_nCell(), m_nCell(),
m_nGridSpan(1), m_nGridSpan(1),
...@@ -51,7 +51,6 @@ DomainMapperTableManager::DomainMapperTableManager(bool bOOXML, bool bImplicitMe ...@@ -51,7 +51,6 @@ DomainMapperTableManager::DomainMapperTableManager(bool bOOXML, bool bImplicitMe
m_nHeaderRepeat(0), m_nHeaderRepeat(0),
m_nTableWidth(0), m_nTableWidth(0),
m_bOOXML( bOOXML ), m_bOOXML( bOOXML ),
m_bImplicitMerges(bImplicitMerges),
m_bPushCurrentWidth(false), m_bPushCurrentWidth(false),
m_pTablePropsHandler( new TablePropertiesHandler( bOOXML ) ) m_pTablePropsHandler( new TablePropertiesHandler( bOOXML ) )
{ {
...@@ -525,34 +524,6 @@ void DomainMapperTableManager::endOfRowAction() ...@@ -525,34 +524,6 @@ void DomainMapperTableManager::endOfRowAction()
TablePropertyMapPtr pPropMap( new TablePropertyMap ); TablePropertyMapPtr pPropMap( new TablePropertyMap );
pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, false, uno::makeAny( aSeparators ) ); pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, false, uno::makeAny( aSeparators ) );
#ifdef DEBUG_DOMAINMAPPER
dmapper_logger->startElement("rowProperties");
pPropMap->dumpXml( dmapper_logger );
dmapper_logger->endElement();
#endif
insertRowProps(pPropMap);
}
else if (m_bImplicitMerges && pTableGrid->size())
{
// More grid than cells definitions? Then take the last ones.
// This feature is used by the RTF implicit horizontal cell merges.
uno::Sequence< text::TableColumnSeparator > aSeparators(m_nCell.back( ) - 1);
text::TableColumnSeparator* pSeparators = aSeparators.getArray();
sal_Int16 nSum = 0;
sal_uInt32 nPos = 0;
sal_uInt32 nSizeTableGrid = pTableGrid->size();
// Ignoring the i=0 case means we assume that the width of the last cell matches the table width
for (sal_uInt32 i = m_nCell.back( ); i > 1 && nSizeTableGrid >= i; i--)
{
nSum += (*pTableGrid.get())[pTableGrid->size() - i]; // Size of the current cell
pSeparators[nPos].Position = nSum * nFullWidthRelative / nFullWidth; // Relative position
pSeparators[nPos].IsVisible = sal_True;
nPos++;
}
TablePropertyMapPtr pPropMap( new TablePropertyMap );
pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, false, uno::makeAny( aSeparators ) );
#ifdef DEBUG_DOMAINMAPPER #ifdef DEBUG_DOMAINMAPPER
dmapper_logger->startElement("rowProperties"); dmapper_logger->startElement("rowProperties");
pPropMap->dumpXml( dmapper_logger ); pPropMap->dumpXml( dmapper_logger );
......
...@@ -43,7 +43,6 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t ...@@ -43,7 +43,6 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t
sal_Int32 m_nHeaderRepeat; //counter of repeated headers - if == -1 then the repeating stops sal_Int32 m_nHeaderRepeat; //counter of repeated headers - if == -1 then the repeating stops
sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions
bool m_bOOXML; bool m_bOOXML;
bool m_bImplicitMerges;
OUString m_sTableStyleName; OUString m_sTableStyleName;
OUString m_sTableVertAnchor; OUString m_sTableVertAnchor;
PropertyMapPtr m_pTableStyleTextProperies; PropertyMapPtr m_pTableStyleTextProperies;
...@@ -62,7 +61,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t ...@@ -62,7 +61,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t
public: public:
DomainMapperTableManager(bool bOOXML, bool bImplicitMerges); DomainMapperTableManager(bool bOOXML);
virtual ~DomainMapperTableManager(); virtual ~DomainMapperTableManager();
// use this method to avoid adding the properties for the table // use this method to avoid adding the properties for the table
......
...@@ -588,7 +588,7 @@ public: ...@@ -588,7 +588,7 @@ public:
void appendTableManager( ) void appendTableManager( )
{ {
boost::shared_ptr< DomainMapperTableManager > pMngr( boost::shared_ptr< DomainMapperTableManager > pMngr(
new DomainMapperTableManager( m_eDocumentType == DOCUMENT_OOXML || m_eDocumentType == DOCUMENT_RTF, m_eDocumentType == DOCUMENT_RTF ) ); new DomainMapperTableManager( m_eDocumentType == DOCUMENT_OOXML || m_eDocumentType == DOCUMENT_RTF ) );
m_aTableManagers.push( pMngr ); m_aTableManagers.push( pMngr );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment