oox/source/export/vmlexport.cxx             |   14 +++++++-
 sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx |   42 ++++++++++++++++++++++---
 sw/source/filter/ww8/docxsdrexport.cxx      |   47 +++++++++++++++++-----------
 3 files changed, 80 insertions(+), 23 deletions(-)

New commits:
commit e1386e32a85eb5c6b4294a8ca3e4461b92707fc3
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Wed Jun 18 01:20:41 2014 +0200

    DocxSdrExport::writeDMLAndVMLDrawing: fix handling of inline VML shapes
    
    In general Writer supports having objects inside a TextFrame, Word does
    not. It turns out that Word allows having certain shapes inside other
    shapes, as long as they are VML-only. So do that for now: if we receive
    a shape when we're already inside a shape, then just export it as VML,
    not the usual drawingml+VML pair.
    
    Also, blacklist one more VML shape type, where the shape text is already
    exported inside <v:textpath>, so no dedicated <v:textbox> is needed.
    
    Change-Id: I5786bd6827eae9756e7c179bb2ef5a5741a91878

diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx
index ad24db2..490bc7b 100644
--- a/oox/source/export/vmlexport.cxx
+++ b/oox/source/export/vmlexport.cxx
@@ -971,6 +971,18 @@ bool lcl_isTextBox(const SdrObject* pSdrObject)
     return false;
 }
 
+bool lcl_hasTextBoxContent(sal_uInt32 nShapeType)
+{
+    switch (nShapeType)
+    {
+    case ESCHER_ShpInst_TextPlainText:
+    case ESCHER_ShpInst_TextSlantUp:
+        return false;
+    default:
+        return true;
+    }
+}
+
 OUString lcl_getAnchorIdFromGrabBag(const SdrObject* pSdrObject)
 {
     OUString aResult;
@@ -1126,7 +1138,7 @@ sal_Int32 VMLExport::StartShape()
 
     // now check if we have some editeng text (not associated textbox) and we 
have a text exporter registered
     const SdrTextObj* pTxtObj = PTR_CAST(SdrTextObj, m_pSdrObject);
-    if (pTxtObj && m_pTextExport && m_nShapeType != 
ESCHER_ShpInst_TextPlainText && !IsWaterMarkShape(m_pSdrObject->GetName()) && 
!lcl_isTextBox(m_pSdrObject))
+    if (pTxtObj && m_pTextExport && lcl_hasTextBoxContent(m_nShapeType) && 
!IsWaterMarkShape(m_pSdrObject->GetName()) && !lcl_isTextBox(m_pSdrObject))
     {
         const OutlinerParaObject* pParaObj = 0;
         bool bOwnParaObj = false;
diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 2fbf4a9..0d9e0ea 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -1685,9 +1685,23 @@ DECLARE_OOXMLEXPORT_TEST(testWordArtWithinDraingtool, 
"testWordArtWithinDraingto
     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
     if (!pXmlDoc)
        return;
-    
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
-    
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Fallback[1]/w:pict[1]/v:rect[1]/v:textbox[1]/w:txbxContent[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
-    
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[3]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+    uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
+    if (xIndexAccess->getCount())
+    {
+        // TODO TextBox: remove this when TextBox is enabled by default
+        // This second run is a bug, should be the first ideally
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Fallback[1]/w:pict[1]/v:rect[1]/v:textbox[1]/w:txbxContent[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[3]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+    }
+    else
+    {
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Fallback[1]/w:pict[1]/v:rect[1]/v:textbox[1]/w:txbxContent[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]",1);
+        // Make sure that the shape inside a shape is exported as VML-only, no 
embedded mc:AlternateContent before w:pict.
+        
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]/w:p/w:r/w:pict",1);
+    }
 }
 
 DECLARE_OOXMLEXPORT_TEST(testFdo78957, "fdo78957.docx")
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx 
b/sw/source/filter/ww8/docxsdrexport.cxx
index e0da18c..6323ec9 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -690,6 +690,27 @@ void DocxSdrExport::writeVMLDrawing(const SdrObject* 
sdrObj, const SwFrmFmt& rFr
         const_cast< SdrObject* >(sdrObj)->SetPage(0);
 }
 
+bool lcl_isLockedCanvas(uno::Reference<drawing::XShape> xShape)
+{
+    bool bRet = false;
+    uno::Sequence< beans::PropertyValue > propList =
+        lclGetProperty(xShape, "InteropGrabBag");
+    for (sal_Int32 nProp=0; nProp < propList.getLength(); ++nProp)
+    {
+        OUString propName = propList[nProp].Name;
+        if (propName == "LockedCanvas")
+        {
+            /*
+             * Export as Locked Canvas only if the property
+             * is in the PropertySet
+             */
+            bRet = true;
+            break;
+        }
+    }
+    return bRet;
+}
+
 void DocxSdrExport::writeDMLDrawing(const SdrObject* pSdrObject, const 
SwFrmFmt* pFrmFmt, int nAnchorId)
 {
     uno::Reference<drawing::XShape> 
xShape(const_cast<SdrObject*>(pSdrObject)->getUnoShape(), uno::UNO_QUERY_THROW);
@@ -723,22 +744,7 @@ void DocxSdrExport::writeDMLDrawing(const SdrObject* 
pSdrObject, const SwFrmFmt*
                         XML_uri, pNamespace,
                         FSEND);
 
-    bool bLockedCanvas = false;
-    uno::Sequence< beans::PropertyValue > propList =
-        lclGetProperty(xShape, "InteropGrabBag");
-    for (sal_Int32 nProp=0; nProp < propList.getLength(); ++nProp)
-    {
-        OUString propName = propList[nProp].Name;
-        if (propName == "LockedCanvas")
-        {
-            /*
-             * Export as Locked Canvas only if the property
-             * is in the PropertySet
-             */
-            bLockedCanvas = true;
-            break;
-        }
-    }
+    bool bLockedCanvas = lcl_isLockedCanvas(xShape);
     if (bLockedCanvas)
         pFS->startElementNS(XML_lc, XML_lockedCanvas,
                             FSNS(XML_xmlns, XML_lc), 
"http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas";,
@@ -827,15 +833,22 @@ bool 
DocxSdrExport::Impl::isSupportedDMLShape(uno::Reference<drawing::XShape> xS
 
 void DocxSdrExport::writeDMLAndVMLDrawing(const SdrObject* sdrObj, const 
SwFrmFmt& rFrmFmt,const Point& rNdTopLeft, int nAnchorId)
 {
+    bool bDMLAndVMLDrawingOpen = m_pImpl->m_bDMLAndVMLDrawingOpen;
     m_pImpl->m_bDMLAndVMLDrawingOpen = true;
 
     // Depending on the shape type, we actually don't write the shape as DML.
     OUString sShapeType;
     sal_uInt32 nMirrorFlags = 0;
     uno::Reference<drawing::XShape> 
xShape(const_cast<SdrObject*>(sdrObj)->getUnoShape(), uno::UNO_QUERY_THROW);
+
+    // Locked canvas is OK inside DML.
+    if (lcl_isLockedCanvas(xShape))
+        bDMLAndVMLDrawingOpen = false;
+
     MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType(xShape, 
nMirrorFlags, sShapeType);
 
-    if (eShapeType != ESCHER_ShpInst_TextPlainText && 
m_pImpl->isSupportedDMLShape(xShape))
+    // In case we are already inside a DML block, then write the shape only as 
VML, turn out that's allowed to do.
+    if (eShapeType != ESCHER_ShpInst_TextPlainText && 
m_pImpl->isSupportedDMLShape(xShape) && !bDMLAndVMLDrawingOpen)
     {
         m_pImpl->m_pSerializer->startElementNS(XML_mc, XML_AlternateContent, 
FSEND);
 
commit b779dc1364af3082fa92070222a1946cb0c6e9b0
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Wed Jun 18 00:19:36 2014 +0200

    CppunitTest_sw_ooxmlsdrexport: port fdo78474 to textboxes
    
    Change-Id: Icadf4b44377684e40334c52887883320805a8e89

diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 9256f1b..2fbf4a9 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -1617,7 +1617,16 @@ DECLARE_OOXMLEXPORT_TEST(fdo78474, "fdo78474.docx")
     xmlDocPtr pXmlDoc1 = parseExport("word/document.xml");
     if (!pXmlDoc1) return;
     //docx file after RT is getting corrupted.
-    assertXPath(pXmlDoc1, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]/w:p[1]/w:r[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/pic:pic[1]/pic:blipFill[1]/a:blip[1]",
 "embed", "rId2");
+    uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
+    if (xIndexAccess->getCount())
+    {
+        // TODO TextBox: remove this when TextBox is enabled by default
+        // This second run is a bug, should be the first ideally
+        assertXPath(pXmlDoc1, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]/w:p[1]/w:r[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/pic:pic[1]/pic:blipFill[1]/a:blip[1]",
 "embed", "rId2");
+    }
+    else
+        assertXPath(pXmlDoc1, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]/w:txbxContent[1]/w:p[1]/w:r[1]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/pic:pic[1]/pic:blipFill[1]/a:blip[1]",
 "embed", "rId2");
 
     xmlDocPtr pXmlDoc2 = parseExport("word/_rels/document.xml.rels");
     if (!pXmlDoc2) return;
commit 059ad394a8cfba191a2662953eea30f034f0e572
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Wed Jun 18 00:17:34 2014 +0200

    CppunitTest_sw_ooxmlsdrexport: port fdo77719 to textboxes
    
    Change-Id: I987f727ec1cd3927239a9339144274f2eea63e36

diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 9fdf8c9..9256f1b 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -1499,7 +1499,16 @@ DECLARE_OOXMLEXPORT_TEST(fdo77719, "fdo77719.docx")
     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
     if (!pXmlDoc)
         return;
-    assertXPath(pXmlDoc, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:spPr[1]/a:prstGeom[1]",
 "prst", "rect");
+    uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> 
xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
+    if (xIndexAccess->getCount())
+    {
+        // TODO TextBox: remove this when TextBox is enabled by default
+        // This second run is a bug, should be the first ideally
+        assertXPath(pXmlDoc, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[2]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:spPr[1]/a:prstGeom[1]",
 "prst", "rect");
+    }
+    else
+        assertXPath(pXmlDoc, 
"/w:document[1]/w:body[1]/w:p[1]/w:r[1]/mc:AlternateContent[1]/mc:Choice[1]/w:drawing[1]/wp:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:spPr[1]/a:custGeom[1]",
 1);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testNestedAlternateContent, 
"nestedAlternateContent.docx")
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to