tdf#77796 DOCX: import table style based cell padding
Change-Id: Ib86ed45fe816d7e273539798cdebdbb95d575518
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86295
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
Tested-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/qa/extras/ooxmlexport/data/tdf77796.docx b/sw/qa/extras/ooxmlexport/data/tdf77796.docx
new file mode 100644
index 0000000..e42c37d
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf77796.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index 216cdec..9e27792 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -259,6 +259,18 @@
aIndexString);
}
DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf77796, "tdf77796.docx")
{
xmlDocPtr pXml = parseExport("word/document.xml");
CPPUNIT_ASSERT(pXml);
// cell paddings from table style
assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:start", "w", "5");
assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:top", "w", "240");
assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:bottom", "w", "480");
// not modified
assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:end", "w", "108");
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 77bf9e3..9f376b3 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -464,6 +464,32 @@
m_aTableProperties->Erase( aTblLook->first );
}
// apply cell margin settings of the table style
const o3tl::optional<PropertyMap::Property> oLeftMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_LEFT);
if (oLeftMargin)
{
oLeftMargin->second >>= rInfo.nLeftBorderDistance;
m_aTableProperties->Erase(oLeftMargin->first);
}
const o3tl::optional<PropertyMap::Property> oRightMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_RIGHT);
if (oRightMargin)
{
oRightMargin->second >>= rInfo.nRightBorderDistance;
m_aTableProperties->Erase(oRightMargin->first);
}
const o3tl::optional<PropertyMap::Property> oTopMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_TOP);
if (oTopMargin)
{
oTopMargin->second >>= rInfo.nTopBorderDistance;
m_aTableProperties->Erase(oTopMargin->first);
}
const o3tl::optional<PropertyMap::Property> oBottomMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_BOTTOM);
if (oBottomMargin)
{
oBottomMargin->second >>= rInfo.nBottomBorderDistance;
m_aTableProperties->Erase(oBottomMargin->first);
}
// Set the table default attributes for the cells
rInfo.pTableDefaults->InsertProps(m_aTableProperties.get());
diff --git a/writerfilter/source/dmapper/TblStylePrHandler.cxx b/writerfilter/source/dmapper/TblStylePrHandler.cxx
index 674bb5b..beff017 100644
--- a/writerfilter/source/dmapper/TblStylePrHandler.cxx
+++ b/writerfilter/source/dmapper/TblStylePrHandler.cxx
@@ -18,6 +18,7 @@
*/
#include "TblStylePrHandler.hxx"
#include "CellMarginHandler.hxx"
#include "PropertyMap.hxx"
#include <ooxml/resourceids.hxx>
#include <comphelper/sequence.hxx>
@@ -168,6 +169,27 @@
aValue.Value <<= true;
m_aInteropGrabBag.push_back(aValue);
}
break;
case NS_ooxml::LN_CT_TblPrBase_tblCellMar:
{
writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
if ( pProperties.get() )
{
std::shared_ptr<CellMarginHandler> pCellMarginHandler(new CellMarginHandler);
pCellMarginHandler->enableInteropGrabBag("tblCellMar");
pProperties->resolve( *pCellMarginHandler );
m_aInteropGrabBag.push_back(pCellMarginHandler->getInteropGrabBag());
if( pCellMarginHandler->m_bTopMarginValid )
m_pProperties->Insert( META_PROP_CELL_MAR_TOP, uno::makeAny(pCellMarginHandler->m_nTopMargin) );
if( pCellMarginHandler->m_bBottomMarginValid )
m_pProperties->Insert( META_PROP_CELL_MAR_BOTTOM, uno::makeAny(pCellMarginHandler->m_nBottomMargin) );
if( pCellMarginHandler->m_bLeftMarginValid )
m_pProperties->Insert( META_PROP_CELL_MAR_LEFT, uno::makeAny(pCellMarginHandler->m_nLeftMargin) );
if( pCellMarginHandler->m_bRightMarginValid )
m_pProperties->Insert( META_PROP_CELL_MAR_RIGHT, uno::makeAny(pCellMarginHandler->m_nRightMargin) );
}
}
break;
default:
// Tables specific properties have to handled here