Kaydet (Commit) 9751056b authored tarafından Pierre-Eric Pelloux-Prayer's avatar Pierre-Eric Pelloux-Prayer Kaydeden (comit) Miklos Vajna

docx export: export default table cell margins, based on 1st cell

Change-Id: I1a697c2a60c7979774242fb6c9b0f66baa3bb72e
Reviewed-on: https://gerrit.libreoffice.org/716Reviewed-by: 's avatarMiklos Vajna <vmiklos@suse.cz>
Tested-by: 's avatarMiklos Vajna <vmiklos@suse.cz>
üst 3cba6723
...@@ -1460,7 +1460,7 @@ static void impl_borderLine( FSHelperPtr pSerializer, sal_Int32 elementToken, co ...@@ -1460,7 +1460,7 @@ static void impl_borderLine( FSHelperPtr pSerializer, sal_Int32 elementToken, co
pSerializer->singleElementNS( XML_w, elementToken, xAttrs ); pSerializer->singleElementNS( XML_w, elementToken, xAttrs );
} }
static void impl_pageBorders( FSHelperPtr pSerializer, const SvxBoxItem& rBox, bool bUseStartEnd = false ) static void impl_pageBorders( FSHelperPtr pSerializer, const SvxBoxItem& rBox, sal_Int32 tag, bool bUseStartEnd = false, bool bWriteTag = true, const SvxBoxItem* pDefaultBorders = 0)
{ {
static const sal_uInt16 aBorders[] = static const sal_uInt16 aBorders[] =
{ {
...@@ -1474,12 +1474,91 @@ static void impl_pageBorders( FSHelperPtr pSerializer, const SvxBoxItem& rBox, b ...@@ -1474,12 +1474,91 @@ static void impl_pageBorders( FSHelperPtr pSerializer, const SvxBoxItem& rBox, b
XML_bottom, XML_bottom,
bUseStartEnd ? XML_end : XML_right bUseStartEnd ? XML_end : XML_right
}; };
bool tagWritten = false;
const sal_uInt16* pBrd = aBorders; const sal_uInt16* pBrd = aBorders;
for( int i = 0; i < 4; ++i, ++pBrd ) for( int i = 0; i < 4; ++i, ++pBrd )
{ {
const SvxBorderLine* pLn = rBox.GetLine( *pBrd ); const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
if ( pLn ) if ( pLn )
{
if ( pDefaultBorders )
{
const SvxBorderLine* pRefLn = pDefaultBorders->GetLine( *pBrd );
// If border is equal to default border: do not output
if ( pRefLn && *pLn == *pRefLn) {
continue;
}
}
if (!tagWritten && bWriteTag) {
pSerializer->startElementNS( XML_w, tag, FSEND );
tagWritten = true;
}
impl_borderLine( pSerializer, aXmlElements[i], pLn, 0 ); impl_borderLine( pSerializer, aXmlElements[i], pLn, 0 );
// When exporting default borders, we need to export these 2 attr
if ( pDefaultBorders == 0 ) {
if ( i == 2 )
impl_borderLine( pSerializer, XML_insideH, pLn, 0 );
else if ( i == 3 )
impl_borderLine( pSerializer, XML_insideV, pLn, 0 );
}
}
}
if (tagWritten && bWriteTag) {
pSerializer->endElementNS( XML_w, tag );
}
}
static void impl_cellMargins( FSHelperPtr pSerializer, const SvxBoxItem& rBox, sal_Int32 tag, bool bUseStartEnd = false, const SvxBoxItem* pDefaultMargins = 0)
{
static const sal_uInt16 aBorders[] =
{
BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT
};
const sal_Int32 aXmlElements[] =
{
XML_top,
bUseStartEnd ? XML_start : XML_left,
XML_bottom,
bUseStartEnd ? XML_end : XML_right
};
bool tagWritten = false;
const sal_uInt16* pBrd = aBorders;
for( int i = 0; i < 4; ++i, ++pBrd )
{
sal_Int32 nDist = sal_Int32( rBox.GetDistance( *pBrd ) );
if ( aBorders[i] == BOX_LINE_LEFT ) {
// Office's cell margin is measured from the right of the border.
// While LO's cell spacing is measured from the center of the border.
// So we add half left-border width to tblIndent value
const SvxBorderLine* pLn = rBox.GetLine( *pBrd );
if (pLn)
nDist -= pLn->GetWidth() * 0.5;
}
if (pDefaultMargins)
{
// Skip output if cell margin == table default margin
if (sal_Int32( pDefaultMargins->GetDistance( *pBrd ) ) == nDist)
continue;
}
if (!tagWritten) {
pSerializer->startElementNS( XML_w, tag, FSEND );
tagWritten = true;
}
pSerializer->singleElementNS( XML_w, aXmlElements[i],
FSNS( XML_w, XML_w ), OString::valueOf( nDist ).getStr( ),
FSNS( XML_w, XML_type ), "dxa",
FSEND );
}
if (tagWritten) {
pSerializer->endElementNS( XML_w, tag );
} }
} }
...@@ -1526,41 +1605,20 @@ void DocxAttributeOutput::TableCellProperties( ww8::WW8TableNodeInfoInner::Point ...@@ -1526,41 +1605,20 @@ void DocxAttributeOutput::TableCellProperties( ww8::WW8TableNodeInfoInner::Point
FSEND ); FSEND );
} }
const SvxBoxItem& rBox = pTblBox->GetFrmFmt( )->GetBox( );
const SvxBoxItem& rDefaultBox = (*tableFirstCells.rbegin())->getTableBox( )->GetFrmFmt( )->GetBox( );
{
// The cell borders // The cell borders
m_pSerializer->startElementNS( XML_w, XML_tcBorders, FSEND ); impl_pageBorders( m_pSerializer, rBox, XML_tcBorders, !bEcma, true, &rDefaultBox );
SwFrmFmt *pFmt = pTblBox->GetFrmFmt( ); }
impl_pageBorders( m_pSerializer, pFmt->GetBox( ), !bEcma );
m_pSerializer->endElementNS( XML_w, XML_tcBorders );
TableBackgrounds( pTableTextNodeInfoInner ); TableBackgrounds( pTableTextNodeInfoInner );
// Cell margins
m_pSerializer->startElementNS( XML_w, XML_tcMar, FSEND );
const SvxBoxItem& rBox = pFmt->GetBox( );
static const sal_uInt16 aBorders[] =
{
BOX_LINE_TOP, BOX_LINE_LEFT, BOX_LINE_BOTTOM, BOX_LINE_RIGHT
};
const sal_Int32 aXmlElements[] =
{ {
XML_top, // Cell margins
bEcma ? XML_left : XML_start, impl_cellMargins( m_pSerializer, rBox, XML_tcMar, !bEcma, &rDefaultBox );
XML_bottom,
bEcma ? XML_right : XML_end
};
const sal_uInt16* pBrd = aBorders;
for( int i = 0; i < 4; ++i, ++pBrd )
{
sal_Int32 nDist = sal_Int32( rBox.GetDistance( *pBrd ) );
m_pSerializer->singleElementNS( XML_w, aXmlElements[i],
FSNS( XML_w, XML_w ), OString::valueOf( nDist ).getStr( ),
FSNS( XML_w, XML_type ), "dxa",
FSEND );
} }
m_pSerializer->endElementNS( XML_w, XML_tcMar );
TableVerticalCell( pTableTextNodeInfoInner ); TableVerticalCell( pTableTextNodeInfoInner );
m_pSerializer->endElementNS( XML_w, XML_tcPr ); m_pSerializer->endElementNS( XML_w, XML_tcPr );
...@@ -1590,6 +1648,8 @@ void DocxAttributeOutput::StartTable( ww8::WW8TableNodeInfoInner::Pointer_t pTab ...@@ -1590,6 +1648,8 @@ void DocxAttributeOutput::StartTable( ww8::WW8TableNodeInfoInner::Pointer_t pTab
{ {
m_pSerializer->startElementNS( XML_w, XML_tbl, FSEND ); m_pSerializer->startElementNS( XML_w, XML_tbl, FSEND );
tableFirstCells.push_back(pTableTextNodeInfoInner);
InitTableHelper( pTableTextNodeInfoInner ); InitTableHelper( pTableTextNodeInfoInner );
TableDefinition( pTableTextNodeInfoInner ); TableDefinition( pTableTextNodeInfoInner );
} }
...@@ -1601,6 +1661,8 @@ void DocxAttributeOutput::EndTable() ...@@ -1601,6 +1661,8 @@ void DocxAttributeOutput::EndTable()
if ( m_nTableDepth > 0 ) if ( m_nTableDepth > 0 )
--m_nTableDepth; --m_nTableDepth;
tableFirstCells.pop_back();
// We closed the table; if it is a nested table, the cell that contains it // We closed the table; if it is a nested table, the cell that contains it
// still continues // still continues
m_bTableCellOpen = true; m_bTableCellOpen = true;
...@@ -1745,6 +1807,10 @@ void DocxAttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t ...@@ -1745,6 +1807,10 @@ void DocxAttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t
// Output the table borders // Output the table borders
TableDefaultBorders( pTableTextNodeInfoInner ); TableDefaultBorders( pTableTextNodeInfoInner );
// Output the default cell margins
TableDefaultCellMargins( pTableTextNodeInfoInner, nIndent );
TableBidi( pTableTextNodeInfoInner ); TableBidi( pTableTextNodeInfoInner );
// Table indent // Table indent
...@@ -1783,9 +1849,20 @@ void DocxAttributeOutput::TableDefaultBorders( ww8::WW8TableNodeInfoInner::Point ...@@ -1783,9 +1849,20 @@ void DocxAttributeOutput::TableDefaultBorders( ww8::WW8TableNodeInfoInner::Point
bool bEcma = GetExport().GetFilter().getVersion( ) == oox::core::ECMA_DIALECT; bool bEcma = GetExport().GetFilter().getVersion( ) == oox::core::ECMA_DIALECT;
// the defaults of the table are taken from the top-left cell // the defaults of the table are taken from the top-left cell
m_pSerializer->startElementNS( XML_w, XML_tblBorders, FSEND ); impl_pageBorders( m_pSerializer, pFrmFmt->GetBox( ), XML_tblBorders, !bEcma, true );
impl_pageBorders( m_pSerializer, pFrmFmt->GetBox( ), !bEcma ); }
m_pSerializer->endElementNS( XML_w, XML_tblBorders );
void DocxAttributeOutput::TableDefaultCellMargins( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner, sal_Int32& tblIndent )
{
const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox();
const SwFrmFmt * pFrmFmt = pTabBox->GetFrmFmt();
const SvxBoxItem& rBox = pFrmFmt->GetBox( );
const bool bEcma = GetExport().GetFilter().getVersion( ) == oox::core::ECMA_DIALECT;
impl_cellMargins(m_pSerializer, rBox, XML_tblCellMar, !bEcma);
// add table cell left margin to tblIndent
tblIndent += sal_Int32( rBox.GetDistance( BOX_LINE_LEFT ) );
} }
void DocxAttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) void DocxAttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner )
...@@ -4350,7 +4427,7 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox ) ...@@ -4350,7 +4427,7 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& rBox )
m_pSerializer->startElementNS( XML_w, XML_pBdr, FSEND ); m_pSerializer->startElementNS( XML_w, XML_pBdr, FSEND );
} }
impl_pageBorders( m_pSerializer, rBox ); impl_pageBorders( m_pSerializer, rBox, false, false );
if ( m_bOpenedSectPr ) if ( m_bOpenedSectPr )
{ {
......
...@@ -148,6 +148,7 @@ public: ...@@ -148,6 +148,7 @@ public:
virtual void TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
virtual void TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
virtual void TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
virtual void TableDefaultCellMargins( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner, sal_Int32& tblIndent );
virtual void TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
virtual void TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
virtual void TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ); virtual void TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner );
...@@ -613,6 +614,9 @@ private: ...@@ -613,6 +614,9 @@ private:
int m_anchorId; int m_anchorId;
int m_nextFontId; int m_nextFontId;
// Remember first cell (used for for default borders/margins) of each table
std::vector<ww8::WW8TableNodeInfoInner::Pointer_t> tableFirstCells;
public: public:
DocxAttributeOutput( DocxExport &rExport, ::sax_fastparser::FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML ); DocxAttributeOutput( DocxExport &rExport, ::sax_fastparser::FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML );
......
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