summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/ww8export/ww8export3.cxx5
-rw-r--r--sw/source/filter/ww8/wrtww8.cxx64
2 files changed, 64 insertions, 5 deletions
diff --git a/sw/qa/extras/ww8export/ww8export3.cxx b/sw/qa/extras/ww8export/ww8export3.cxx
index b447c7fd3225..f021491a164e 100644
--- a/sw/qa/extras/ww8export/ww8export3.cxx
+++ b/sw/qa/extras/ww8export/ww8export3.cxx
@@ -188,9 +188,8 @@ DECLARE_WW8EXPORT_TEST(testTdf73056_cellMargins, "tdf73056_cellMargins.doc")
// only the first cell with specific margins was processed, leaving the rest at table defaults. Was 0.
uno::Reference< beans::XPropertySet > xPropSet( xCell, uno::UNO_QUERY_THROW );
- if ( !mbExported )
- CPPUNIT_ASSERT_EQUAL_MESSAGE( "bottom cell spacing to contents",
- sal_Int32(101), getProperty<sal_Int32>(xPropSet, "BottomBorderDistance" ) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "bottom cell spacing to contents",
+ sal_Int32(101), getProperty<sal_Int32>(xPropSet, "BottomBorderDistance" ) );
}
DECLARE_WW8EXPORT_TEST(testTdf79435_legacyInputFields, "tdf79435_legacyInputFields.docx")
{
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index 6982cd7a8fcc..91d049a42e11 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -2043,8 +2043,9 @@ void WW8AttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTa
m_rWW8Export.pO->push_back( sal_uInt8(0x1) );
}
- // Most of these are per-row definitions, not per-table,
- // so likely some the per-table functions are unnecessarily re-defined...
+ // Most of these are per-row definitions, not per-table.
+ // WW8 has no explicit table start/end markup,
+ // simply rows with the same table properties that are grouped together as a table.
TableBidi( pTableTextNodeInfoInner );
TableOrientation( pTableTextNodeInfoInner );
TableSpacing( pTableTextNodeInfoInner );
@@ -2566,6 +2567,21 @@ void WW8AttributeOutput::TableCellBorders(
const SvxBoxItem * pLastBox = nullptr;
sal_uInt8 nSeqStart = 0; // start of sequence of cells with same borders
+ static const SvxBoxItemLine aBorders[] =
+ {
+ SvxBoxItemLine::TOP, SvxBoxItemLine::LEFT,
+ SvxBoxItemLine::BOTTOM, SvxBoxItemLine::RIGHT
+ };
+
+ sal_uInt16 nDefaultMargin[4] = {31681, 31681, 31681, 31681}; // outside of documented valid range
+ // last column in each row defines the row default in TableRowDefaultBorders()
+ if ( nBoxes && rTabBoxes.size() == nBoxes )
+ {
+ const SvxBoxItem& rBox = rTabBoxes[ nBoxes-1 ]->GetFrameFormat()->GetBox();
+ for ( int i = 0; i < 4; ++i )
+ nDefaultMargin[i] = rBox.GetDistance( aBorders[i] );
+ }
+
// Detect sequences of cells which have the same borders, and output
// a border description for each such cell range.
for ( unsigned n = 0; n <= nBoxes; ++n )
@@ -2576,9 +2592,53 @@ void WW8AttributeOutput::TableCellBorders(
pLastBox = pBox;
else if( !pBox || *pLastBox != *pBox )
{
+ if ( !pLastBox )
+ break;
+
// This cell has different borders than the previous cell,
// so output the borders for the preceding cell range.
m_rWW8Export.Out_CellRangeBorders(pLastBox, nSeqStart, n);
+
+ // The last column is used as the row default for margins, so we can ignore these matching ones
+ if ( n == nBoxes )
+ break;
+
+ // Output cell margins.
+ // One CSSA can define up to all four margins if they are the same size value.
+ sal_uInt16 nMargin[4];
+ sal_uInt8 nSideBits[4] = {0, 0, 0, 0}; // 0001:top, 0010:left, 0100:bottom, 1000:right
+ for ( int i = 0; i < 4; ++i ) // sides: top, left, bottom, right
+ {
+ nMargin[i] = std::min(sal_uInt16(31680), pLastBox->GetDistance( aBorders[i] ));
+ if ( nMargin[i] == nDefaultMargin[i] )
+ continue;
+
+ // join a previous side's definition if it shares the same value
+ for ( int p = 0; p < 4; ++p )
+ {
+ if ( nMargin[i] == nMargin[p] )
+ {
+ nSideBits[p] |= 1 << i;
+ break;
+ }
+ }
+ }
+
+ // write out the cell margins definitions that were used
+ for ( int i = 0; i < 4; ++i )
+ {
+ if ( nSideBits[i] )
+ {
+ SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::sprmTCellPadding );
+ m_rWW8Export.pO->push_back( sal_uInt8(6) ); // 6 bytes
+ m_rWW8Export.pO->push_back( sal_uInt8(nSeqStart) ); // first cell: apply margin
+ m_rWW8Export.pO->push_back( sal_uInt8(n) ); // end cell: do not apply margin
+ m_rWW8Export.pO->push_back( sal_uInt8(nSideBits[i]) );
+ m_rWW8Export.pO->push_back( sal_uInt8(3) ); // FtsDxa: size in twips
+ SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nMargin[i] );
+ }
+ }
+
nSeqStart = n;
pLastBox = pBox;
}