include/oox/export/drawingml.hxx | 9 ++-- oox/source/export/chartexport.cxx | 11 +++-- oox/source/export/drawingml.cxx | 75 ++++++++++++++++++++++++------------- sd/qa/unit/export-tests-ooxml1.cxx | 6 +- 4 files changed, 66 insertions(+), 35 deletions(-)
New commits: commit 31e6b78a196fbf73d61349ad3530cf49ee145186 Author: Tor Lillqvist <t...@collabora.com> Date: Wed Feb 15 19:21:06 2017 +0200 tdf#106304: Fix newline and empty paragraph font size issues in .pptx export Output <a:br> instead of for hard newlines. This fixes the problem that the line before the hard newline in the .pptx export is not centred. The fix for the sd_export_ooxml1 test is a bit hacky, but then so is the code in question. Don't unnecessarily use bogus default char size for a:endParaRPr. Instead use the size last used for an a:rPr below the same WriteText() call. I am not exactly sure about how this hangs together, but this has the desired effect on the exported .pptx. (cherry picked from commit 1154cda87d518156d1e52dfb81d5e23b32ab23d5) (cherry picked from commit 6f93eeb0ba8c4af5c96d1db36f184ffbc71c67ba) Change-Id: Ie23e0c33e6efb303b183d3b2efce6866d0dda4e8 Reviewed-on: https://gerrit.libreoffice.org/34887 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index e9dc0a3..97d8dff 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -194,12 +194,15 @@ public: sal_Int32 nXmlNamespace, bool bFlipH = false, bool bFlipV = false, sal_Int32 nRotation = 0 ); void WriteText( const css::uno::Reference< css::uno::XInterface >& rXIface, const OUString& presetWarp, bool bBodyPr = true, bool bText = true, sal_Int32 nXmlNamespace = 0); - void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph ); + void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ); void WriteParagraphProperties( const css::uno::Reference< css::text::XTextContent >& rParagraph ); void WriteParagraphNumbering( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, sal_Int16 nLevel ); - void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun ); - void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement = XML_rPr ,bool bCheckDirect = true); + void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ); + void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ); void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList ); void WritePresetShape( const char* pShape ); diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index ccfc244..41faeca 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -1102,13 +1102,16 @@ void ChartExport::exportTitle( const Reference< XShape >& xShape ) pFS->startElement( FSNS( XML_a, XML_pPr ), FSEND ); - WriteRunProperties(xPropSet, false, XML_defRPr); + bool bDummy = false; + sal_Int32 nDummy; + WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy ); pFS->endElement( FSNS( XML_a, XML_pPr ) ); pFS->startElement( FSNS( XML_a, XML_r ), FSEND ); - WriteRunProperties( xPropSet, false ); + bDummy = false; + WriteRunProperties( xPropSet, false, XML_rPr, true, bDummy, nDummy ); pFS->startElement( FSNS( XML_a, XML_t ), FSEND ); pFS->writeEscaped( sText ); @@ -2390,7 +2393,9 @@ void ChartExport::exportTextProps(const Reference<XPropertySet>& xPropSet) pFS->startElement(FSNS(XML_a, XML_p), FSEND); pFS->startElement(FSNS(XML_a, XML_pPr), FSEND); - WriteRunProperties(xPropSet, false, XML_defRPr); + bool bDummy = false; + sal_Int32 nDummy; + WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy); pFS->endElement(FSNS(XML_a, XML_pPr)); pFS->endElement(FSNS(XML_a, XML_p)); diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index bd4c0c1..d9bc62d 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -1205,7 +1205,8 @@ void DrawingML::WriteShapeTransformation( const Reference< XShape >& rXShape, sa WriteTransformation( Rectangle( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) ), nXmlNamespace, bFlipH, bFlipV, OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY(nRotation) ); } -void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement /*= XML_rPr*/, bool bCheckDirect/* = true */) +void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ) { Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY ); Reference< XPropertyState > rXPropState( rRun, UNO_QUERY ); @@ -1222,8 +1223,19 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool sal_Int32 nCharEscapement = 0; sal_Int32 nCharKerning = 0; - if( GETA( CharHeight ) ) + if ( nElement == XML_endParaRPr && rbOverridingCharHeight ) + { + nSize = rnCharHeight; + } + else if( GETA( CharHeight ) ) + { nSize = (sal_Int32) (100*(*o3tl::doAccess<float>(mAny))); + if ( nElement == XML_rPr ) + { + rbOverridingCharHeight = true; + rnCharHeight = nSize; + } + } if( GETA( CharKerning ) ) nCharKerning = (sal_Int32)(*o3tl::doAccess<sal_Int16>(mAny)); @@ -1580,7 +1592,8 @@ OString DrawingML::GetUUID() return OString(str, SAL_N_ELEMENTS(str)); } -void DrawingML::WriteRun( const Reference< XTextRange >& rRun ) +void DrawingML::WriteRun( const Reference< XTextRange >& rRun, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight) { Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY ); sal_Int16 nLevel = -1; @@ -1619,29 +1632,37 @@ void DrawingML::WriteRun( const Reference< XTextRange >& rRun ) } } - if( ( bWriteField ) ) + if (sText == "\n") { - OString sUUID(GetUUID()); - mpFS->startElementNS( XML_a, XML_fld, - XML_id, sUUID.getStr(), - XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(), - FSEND ); + mpFS->singleElementNS( XML_a, XML_br, + FSEND ); } else { - mpFS->startElementNS( XML_a, XML_r, FSEND ); - } + if( ( bWriteField ) ) + { + OString sUUID(GetUUID()); + mpFS->startElementNS( XML_a, XML_fld, + XML_id, sUUID.getStr(), + XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(), + FSEND ); + } + else + { + mpFS->startElementNS( XML_a, XML_r, FSEND ); + } - Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY ); - WriteRunProperties( xPropSet, bIsURLField ); - mpFS->startElementNS( XML_a, XML_t, FSEND ); - mpFS->writeEscaped( sText ); - mpFS->endElementNS( XML_a, XML_t ); + Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY ); + WriteRunProperties( xPropSet, bIsURLField, XML_rPr, true, rbOverridingCharHeight, rnCharHeight ); + mpFS->startElementNS( XML_a, XML_t, FSEND ); + mpFS->writeEscaped( sText ); + mpFS->endElementNS( XML_a, XML_t ); - if( bWriteField ) - mpFS->endElementNS( XML_a, XML_fld ); - else - mpFS->endElementNS( XML_a, XML_r ); + if( bWriteField ) + mpFS->endElementNS( XML_a, XML_fld ); + else + mpFS->endElementNS( XML_a, XML_r ); + } } OUString GetAutoNumType(sal_Int16 nNumberingType, bool bSDot, bool bPBehind, bool bPBoth) @@ -2014,7 +2035,8 @@ void DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rPara } } -void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph ) +void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph, + bool& rbOverridingCharHeight, sal_Int32& rnCharHeight ) { Reference< XEnumerationAccess > access( rParagraph, UNO_QUERY ); if( !access.is() ) @@ -2026,7 +2048,6 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph ) mpFS->startElementNS( XML_a, XML_p, FSEND ); - bool bPropertiesWritten = false; while( enumeration->hasMoreElements() ) { @@ -2040,11 +2061,11 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph ) WriteParagraphProperties( rParagraph ); bPropertiesWritten = true; } - WriteRun( run ); + WriteRun( run, rbOverridingCharHeight, rnCharHeight ); } } Reference< XPropertySet > rXPropSet( rParagraph, UNO_QUERY ); - WriteRunProperties( rXPropSet , false, XML_endParaRPr, false ); + WriteRunProperties( rXPropSet, false, XML_endParaRPr, false, rbOverridingCharHeight, rnCharHeight ); mpFS->endElementNS( XML_a, XML_p ); } @@ -2215,15 +2236,17 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin return; } + bool bOverridingCharHeight = false; + sal_Int32 nCharHeight; + while( enumeration->hasMoreElements() ) { Reference< XTextContent > paragraph; Any any ( enumeration->nextElement() ); if( any >>= paragraph) - WriteParagraph( paragraph ); + WriteParagraph( paragraph, bOverridingCharHeight, nCharHeight ); } - } void DrawingML::WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList ) diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx index 8f2ef49..2fc233b 100644 --- a/sd/qa/unit/export-tests-ooxml1.cxx +++ b/sd/qa/unit/export-tests-ooxml1.cxx @@ -254,11 +254,11 @@ void SdOOXMLExportTest1::testN828390_4() SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj ); CPPUNIT_ASSERT( pTxtObj ); const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject(); - aEdit.GetCharAttribs(1, rLst); + aEdit.GetCharAttribs(0, rLst); for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it) { const SvxFontHeightItem * pFontHeight = dynamic_cast<const SvxFontHeightItem *>((*it).pAttr); - if( pFontHeight ) + if( pFontHeight && (*it).nStart == 18 ) CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font height is wrong", static_cast<sal_uInt32>(1129), pFontHeight->GetHeight() ); const SvxFontItem *pFont = dynamic_cast<const SvxFontItem *>((*it).pAttr); if( pFont ) @@ -267,7 +267,7 @@ void SdOOXMLExportTest1::testN828390_4() bPassed = true; } const SvxWeightItem *pWeight = dynamic_cast<const SvxWeightItem *>((*it).pAttr); - if( pWeight ) + if( pWeight && (*it).nStart == 18 ) CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font Weight is wrong", WEIGHT_BOLD, pWeight->GetWeight() ); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits