sw/source/filter/ww8/docxattributeoutput.cxx | 131 +++++++++++++-------------- sw/source/filter/ww8/docxattributeoutput.hxx | 3 2 files changed, 68 insertions(+), 66 deletions(-)
New commits: commit 21467c1c0fea676a33c7b7e75648947efea18fcb Author: Markus Mohrhard <markus.mohrh...@googlemail.com> AuthorDate: Sun Nov 18 22:00:23 2018 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Nov 19 16:00:53 2018 +0100 tdf#108022, don't overwrite chart export information Change-Id: I47d8a817022829c8cada614469303e440f377299 Reviewed-on: https://gerrit.libreoffice.org/63536 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> (cherry picked from commit 9ccdf4d8abf6ec6612c88ab65be25eb6be89b455) Reviewed-on: https://gerrit.libreoffice.org/63540 Tested-by: Xisco Faulí <xiscofa...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 689bbbf8c712..a73f90de5153 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4796,8 +4796,7 @@ bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& r if (!SotExchange::IsChart(aClassID)) return false; - m_postponedChart = pSdrObj; - m_postponedChartSize = rSize; + m_aPostponedCharts.push_back(std::pair<const SdrObject*, Size>(pSdrObj, rSize)); return true; } @@ -4806,81 +4805,86 @@ bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& r */ void DocxAttributeOutput::WritePostponedChart() { - if(m_postponedChart == nullptr) + if (m_aPostponedCharts.empty()) return; - uno::Reference< chart2::XChartDocument > xChartDoc; - uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(m_postponedChart)->getUnoShape(), uno::UNO_QUERY ); - if( xShape.is() ) - { - uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY ); - if( xPropSet.is() ) - xChartDoc.set( xPropSet->getPropertyValue( "Model" ), uno::UNO_QUERY ); - } - if( xChartDoc.is() ) + for (const auto& itr : m_aPostponedCharts) { - SAL_INFO("sw.ww8", "DocxAttributeOutput::WriteOLE2Obj: export chart "); - m_pSerializer->startElementNS( XML_w, XML_drawing, - FSEND ); - m_pSerializer->startElementNS( XML_wp, XML_inline, - XML_distT, "0", XML_distB, "0", XML_distL, "0", XML_distR, "0", - FSEND ); + uno::Reference< chart2::XChartDocument > xChartDoc; + uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(itr.first)->getUnoShape(), uno::UNO_QUERY ); + if( xShape.is() ) + { + uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY ); + if( xPropSet.is() ) + xChartDoc.set( xPropSet->getPropertyValue( "Model" ), uno::UNO_QUERY ); + } - OString aWidth( OString::number( TwipsToEMU( m_postponedChartSize.Width() ) ) ); - OString aHeight( OString::number( TwipsToEMU( m_postponedChartSize.Height() ) ) ); - m_pSerializer->singleElementNS( XML_wp, XML_extent, - XML_cx, aWidth.getStr(), - XML_cy, aHeight.getStr(), - FSEND ); - // TODO - the right effectExtent, extent including the effect - m_pSerializer->singleElementNS( XML_wp, XML_effectExtent, - XML_l, "0", XML_t, "0", XML_r, "0", XML_b, "0", - FSEND ); + if( xChartDoc.is() ) + { + SAL_INFO("sw.ww8", "DocxAttributeOutput::WriteOLE2Obj: export chart "); + m_pSerializer->startElementNS( XML_w, XML_drawing, + FSEND ); + m_pSerializer->startElementNS( XML_wp, XML_inline, + XML_distT, "0", XML_distB, "0", XML_distL, "0", XML_distR, "0", + FSEND ); - OUString sName("Object 1"); - uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY ); - if( xNamed.is() ) - sName = xNamed->getName(); + OString aWidth( OString::number( TwipsToEMU( itr.second.Width() ) ) ); + OString aHeight( OString::number( TwipsToEMU( itr.second.Height() ) ) ); + m_pSerializer->singleElementNS( XML_wp, XML_extent, + XML_cx, aWidth.getStr(), + XML_cy, aHeight.getStr(), + FSEND ); + // TODO - the right effectExtent, extent including the effect + m_pSerializer->singleElementNS( XML_wp, XML_effectExtent, + XML_l, "0", XML_t, "0", XML_r, "0", XML_b, "0", + FSEND ); - /* If there is a scenario where a chart is followed by a shape - which is being exported as an alternate content then, the - docPr Id is being repeated, ECMA 20.4.2.5 says that the - docPr Id should be unique, ensuring the same here. - */ - m_pSerializer->singleElementNS( XML_wp, XML_docPr, - XML_id, I32S( m_anchorId++ ), - XML_name, USS( sName ), - FSEND ); + OUString sName("Object 1"); + uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY ); + if( xNamed.is() ) + sName = xNamed->getName(); + + /* If there is a scenario where a chart is followed by a shape + which is being exported as an alternate content then, the + docPr Id is being repeated, ECMA 20.4.2.5 says that the + docPr Id should be unique, ensuring the same here. + */ + m_pSerializer->singleElementNS( XML_wp, XML_docPr, + XML_id, I32S( m_anchorId++ ), + XML_name, USS( sName ), + FSEND ); - m_pSerializer->singleElementNS( XML_wp, XML_cNvGraphicFramePr, - FSEND ); + m_pSerializer->singleElementNS( XML_wp, XML_cNvGraphicFramePr, + FSEND ); - m_pSerializer->startElementNS( XML_a, XML_graphic, - FSNS( XML_xmlns, XML_a ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(dml)), RTL_TEXTENCODING_UTF8).getStr(), - FSEND ); + m_pSerializer->startElementNS( XML_a, XML_graphic, + FSNS( XML_xmlns, XML_a ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(dml)), RTL_TEXTENCODING_UTF8).getStr(), + FSEND ); - m_pSerializer->startElementNS( XML_a, XML_graphicData, - XML_uri, "http://schemas.openxmlformats.org/drawingml/2006/chart", - FSEND ); + m_pSerializer->startElementNS( XML_a, XML_graphicData, + XML_uri, "http://schemas.openxmlformats.org/drawingml/2006/chart", + FSEND ); - OString aRelId; - m_nChartCount++; - uno::Reference< frame::XModel > xModel( xChartDoc, uno::UNO_QUERY ); - aRelId = m_rExport.OutputChart( xModel, m_nChartCount, m_pSerializer ); + OString aRelId; + m_nChartCount++; + uno::Reference< frame::XModel > xModel( xChartDoc, uno::UNO_QUERY ); + aRelId = m_rExport.OutputChart( xModel, m_nChartCount, m_pSerializer ); - m_pSerializer->singleElementNS( XML_c, XML_chart, - FSNS( XML_xmlns, XML_c ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(dmlChart)), RTL_TEXTENCODING_UTF8).getStr(), - FSNS( XML_xmlns, XML_r ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(officeRel)), RTL_TEXTENCODING_UTF8).getStr(), - FSNS( XML_r, XML_id ), aRelId.getStr(), - FSEND ); + m_pSerializer->singleElementNS( XML_c, XML_chart, + FSNS( XML_xmlns, XML_c ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(dmlChart)), RTL_TEXTENCODING_UTF8).getStr(), + FSNS( XML_xmlns, XML_r ), OUStringToOString(GetExport().GetFilter().getNamespaceURL(OOX_NS(officeRel)), RTL_TEXTENCODING_UTF8).getStr(), + FSNS( XML_r, XML_id ), aRelId.getStr(), + FSEND ); - m_pSerializer->endElementNS( XML_a, XML_graphicData ); - m_pSerializer->endElementNS( XML_a, XML_graphic ); - m_pSerializer->endElementNS( XML_wp, XML_inline ); - m_pSerializer->endElementNS( XML_w, XML_drawing ); + m_pSerializer->endElementNS( XML_a, XML_graphicData ); + m_pSerializer->endElementNS( XML_a, XML_graphic ); + m_pSerializer->endElementNS( XML_wp, XML_inline ); + m_pSerializer->endElementNS( XML_w, XML_drawing ); + } } - m_postponedChart = nullptr; + + m_aPostponedCharts.clear(); } bool DocxAttributeOutput::WriteOLEMath( const SwOLENode& rOLENode ) @@ -9107,7 +9111,6 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport &rExport, const FSHelperPtr m_nFieldsInHyperlink( 0 ), m_bExportingOutline(false), m_nChartCount(0), - m_postponedChart( nullptr ), pendingPlaceholder( nullptr ), m_postitFieldsMaxId( 0 ), m_anchorId( 1 ), diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 4d380bf6e656..212ba962c3b0 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -880,8 +880,7 @@ private: std::vector<const SwOLENode*> m_aPostponedMaths; /// count charts consistently for unit tests unsigned int m_nChartCount; - const SdrObject* m_postponedChart; - Size m_postponedChartSize; + std::vector<std::pair<const SdrObject*, Size>> m_aPostponedCharts; std::vector<const SdrObject*> m_aPostponedFormControls; std::vector<PostponedDrawing> m_aPostponedActiveXControls; const SwField* pendingPlaceholder; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits