sw/qa/extras/ooxmlexport/data/tdf125518.odt  |binary
 sw/qa/extras/ooxmlexport/ooxmlexport13.cxx   |   23 +++++++++++++++++++++++
 sw/source/filter/ww8/docxattributeoutput.cxx |   23 +++++++----------------
 sw/source/filter/ww8/docxattributeoutput.hxx |   11 +++++++++--
 4 files changed, 39 insertions(+), 18 deletions(-)

New commits:
commit 609f82ef8a2019473c801fd6f537195b472165bc
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Tue May 14 17:00:59 2019 +0300
Commit:     Thorsten Behrens <thorsten.behr...@cib.de>
CommitDate: Fri Jun 28 13:34:58 2019 +0200

    tdf#125518: docx export: save anchors for diagrams
    
    Previously all diagrams were saved as inline objects ignoring
    possible wrapping options and anchors.
    
    Change-Id: I0952fb33d4be4c288c919156af9549f8195b7ead
    Reviewed-on: https://gerrit.libreoffice.org/72291
    Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de>
    Tested-by: Thorsten Behrens <thorsten.behr...@cib.de>
    (cherry picked from commit ece4a0f78bb60ef079722e8fa029f0ec253d0452)
    Reviewed-on: https://gerrit.libreoffice.org/74737
    Tested-by: Jenkins

diff --git a/sw/qa/extras/ooxmlexport/data/tdf125518.odt 
b/sw/qa/extras/ooxmlexport/data/tdf125518.odt
new file mode 100644
index 000000000000..92df094a8962
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125518.odt differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index e392644f0de3..ce6871b45df5 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -355,6 +355,29 @@ DECLARE_OOXMLEXPORT_TEST(testTdf125324, "tdf125324.docx")
     assertXPath(pXmlDoc, 
"/root/page/body/txt[2]/anchored/fly/tab/infos/bounds", "top", "4193");
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf125518, "tdf125518.odt")
+{
+    xmlDocPtr pXmlDoc = parseExport("word/document.xml");
+    if (!pXmlDoc)
+        return;
+
+    // First diagram is anchored
+    OUString anchorName = getXPath(pXmlDoc, 
"/w:document/w:body/w:p[1]/w:r[2]/w:drawing/wp:anchor/wp:docPr", "name");
+    CPPUNIT_ASSERT_EQUAL(OUString("Object1"), anchorName);
+
+    // Second diagram has anchor
+    anchorName = getXPath(pXmlDoc, 
"/w:document/w:body/w:p[3]/w:r[1]/w:drawing/wp:anchor/wp:docPr", "name");
+    CPPUNIT_ASSERT_EQUAL(OUString("Objekt1"), anchorName);
+
+    // Third diagram has no anchor
+    anchorName = getXPath(pXmlDoc, 
"/w:document/w:body/w:p[12]/w:r[2]/w:drawing/wp:inline/wp:docPr", "name");
+    CPPUNIT_ASSERT_EQUAL(OUString("Object2"), anchorName);
+
+    // 4th diagram has anchor too
+    anchorName = getXPath(pXmlDoc, 
"/w:document/w:body/w:p[14]/w:r[3]/w:drawing/wp:anchor/wp:docPr", "name");
+    CPPUNIT_ASSERT_EQUAL(OUString("Object3"), anchorName);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index f2c30c2eb654..b7316b003745 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -4931,14 +4931,14 @@ void DocxAttributeOutput::FlyFrameGraphic( const 
SwGrfNode* pGrfNode, const Size
 
 void DocxAttributeOutput::WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& 
rOLENode, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat )
 {
-    if( WriteOLEChart( pSdrObj, rSize ))
+    if( WriteOLEChart( pSdrObj, rSize, pFlyFrameFormat ))
         return;
     if( WriteOLEMath( rOLENode ))
         return;
     PostponeOLE( rOLENode, rSize, pFlyFrameFormat );
 }
 
-bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& 
rSize )
+bool DocxAttributeOutput::WriteOLEChart( const SdrObject* pSdrObj, const Size& 
rSize, const SwFlyFrameFormat* pFlyFrameFormat )
 {
     uno::Reference< drawing::XShape > xShape( 
const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY );
     if (!xShape.is())
@@ -4958,7 +4958,7 @@ bool DocxAttributeOutput::WriteOLEChart( const SdrObject* 
pSdrObj, const Size& r
     if (!SotExchange::IsChart(aClassID))
         return false;
 
-    m_aPostponedCharts.push_back(std::pair<const SdrObject*, Size>(pSdrObj, 
rSize));
+    m_aPostponedCharts.push_back(PostponedChart(pSdrObj, rSize, 
pFlyFrameFormat));
     return true;
 }
 
@@ -4970,10 +4970,10 @@ void DocxAttributeOutput::WritePostponedChart()
     if (m_aPostponedCharts.empty())
         return;
 
-    for (const auto& itr : m_aPostponedCharts)
+    for (const PostponedChart& rChart : m_aPostponedCharts)
     {
         uno::Reference< chart2::XChartDocument > xChartDoc;
-        uno::Reference< drawing::XShape > xShape( 
const_cast<SdrObject*>(itr.first)->getUnoShape(), uno::UNO_QUERY );
+        uno::Reference< drawing::XShape > 
xShape(const_cast<SdrObject*>(rChart.object)->getUnoShape(), uno::UNO_QUERY );
         if( xShape.is() )
         {
             uno::Reference< beans::XPropertySet > xPropSet( xShape, 
uno::UNO_QUERY );
@@ -4984,16 +4984,8 @@ void DocxAttributeOutput::WritePostponedChart()
         if( xChartDoc.is() )
         {
             SAL_INFO("sw.ww8", "DocxAttributeOutput::WriteOLE2Obj: export 
chart ");
-            m_pSerializer->startElementNS(XML_w, XML_drawing);
-            m_pSerializer->startElementNS( XML_wp, XML_inline,
-                    XML_distT, "0", XML_distB, "0", XML_distL, "0", XML_distR, 
"0" );
 
-            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, 
XML_cy, aHeight);
-            // 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" );
+            m_rExport.SdrExporter().startDMLAnchorInline(rChart.frame, 
rChart.size);
 
             OUString sName("Object 1");
             uno::Reference< container::XNamed > xNamed( xShape, uno::UNO_QUERY 
);
@@ -5029,9 +5021,8 @@ void DocxAttributeOutput::WritePostponedChart()
 
             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_rExport.SdrExporter().endDMLAnchorInline(rChart.frame);
         }
     }
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index 647a73e315c5..46b3833ea49f 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -392,7 +392,7 @@ private:
     void FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size& rSize, const 
SwFlyFrameFormat* pOLEFrameFormat, SwOLENode* pOLENode, const SdrObject* 
pSdrObj = nullptr);
     void WriteSrcRect( const SdrObject* pSdrObj, const SwFrameFormat* 
pFrameFormat );
     void WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& rNode, const Size& 
rSize, const SwFlyFrameFormat* pFlyFrameFormat);
-    bool WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize );
+    bool WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize, const 
SwFlyFrameFormat* pFlyFrameFormat);
     bool WriteOLEMath( const SwOLENode& rNode );
     void PostponeOLE( SwOLENode& rNode, const Size& rSize, const 
SwFlyFrameFormat* pFlyFrameFormat );
     void WriteOLE( SwOLENode& rNode, const Size& rSize, const 
SwFlyFrameFormat* rFlyFrameFormat );
@@ -881,7 +881,14 @@ private:
     std::vector<const SwOLENode*> m_aPostponedMaths;
     /// count charts consistently for unit tests
     unsigned int m_nChartCount;
-    std::vector<std::pair<const SdrObject*, Size>> m_aPostponedCharts;
+    struct PostponedChart
+    {
+        PostponedChart( const SdrObject* sdrObject, const Size& rSize, const 
SwFlyFrameFormat* rFrame ) : object(sdrObject), size(rSize), frame(rFrame) {};
+        const SdrObject* object;
+        const Size size;
+        const SwFlyFrameFormat* frame;
+    };
+    std::vector<PostponedChart> 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

Reply via email to