diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/ww8export/ww8export3.cxx | 5 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtww8.cxx | 64 |
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; } |