sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx                       |   19 ++++
 sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx                    |    2 
 sw/source/filter/ww8/docxattributeoutput.cxx                   |   41 
++++++++++
 sw/source/filter/ww8/docxattributeoutput.hxx                   |    3 
 sw/source/filter/ww8/docxsdrexport.cxx                         |   10 --
 6 files changed, 67 insertions(+), 8 deletions(-)

New commits:
commit b349d2483e1fe64316d87b55d0b3b4c8f2293e2e
Author: Rajashri <rajashri.udh...@synerzip.com>
Date:   Sat May 17 18:53:52 2014 +0530

    fdo#78663 : Corrupt: 2007 WordArt whithin a Drawing tool
    
        A file contains a 2007 word art within a drawing tool.
        In Original file, the xml structure is as below:
        sample xml:
        <p> <r> <ac> <drawing> <txbx> <txbxContent> .. <pict> </pict> 
</txbxContent></txbx> </drawing> </ac> </r> </p>
        LO was preserving this as :
        <p> <r> <ac> <drawing> <txbx> <txbxContent> .. <drawing> <txbx> 
<txbxContent> ..
        </txbxContent></txbx> </drawing> .. </txbxContent></txbx> </drawing> 
</ac> </r> </p>
        Now after this fix, If there is a custom shape within a text box, then 
we should postpone it and write it in
        a separate run.
        This approach is followed on the fact that LO writes nested TextBoxes 
in separate run.
    
        NOTE1 :Due to this fix, xpath related to the below UT needs to be 
updated.
        testFdo76249 in ooxmlsdrexport.cxx
    
        NOTE2: In docxsdrexport.cxx : 'm_bIsInDMLTextFrame' is no more required.
        For adding LockedCanvas, we only need to check if the property exists 
in the property set.
        Therefoew removing the above bool variable.
    
    Reviewed on:
        https://gerrit.libreoffice.org/9392
    
    Change-Id: I00e94712e912ad1977fcb65a945fefb927795d77

diff --git a/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx 
b/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx
new file mode 100644
index 0000000..c860828
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 22b144e..7a69e67 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -3437,6 +3437,25 @@ DECLARE_OOXMLEXPORT_TEST(testFdo78651, "fdo78651.docx")
     // ensure that there are only two tables
     assertXPath(pXmlDoc, "//w:tbl", 2);
 }
+DECLARE_OOXMLEXPORT_TEST(testWordArtWithinDraingtool, 
"testWordArtWithinDraingtool.docx")
+{
+/*   * Within a file, there is a 2007 wordArt enclosed in a drawing tool
+     * LO was exporting it as below:
+     * Sample XML as in Original file:
+     * <p> <r> <ac> <drawing> <txbx> <txbxContent> ..  <pict> </pict> 
</txbxContent></txbx> </drawing> </ac> </r> </p>
+     *  After RT :
+     * <p> <r> <ac> <drawing> <txbx> <txbxContent> ..  <drawing> <txbx> 
<txbxContent> ..  </txbxContent></txbx> </drawing> .. </txbxContent></txbx> 
</drawing> </ac> </r> </p>
+     *  Expected : As there is nesting of a 2007 Word Art within a draing 
tool, then can be separated in two different runs.
+     * */
+
+    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:anchor[1]/a:graphic[1]/a:graphicData[1]/wps:wsp[1]/wps:txbx[1]",1);
+    
assertXPath(pXmlDoc,"/w:document[1]/w:body[1]/w:p[1]/w:r[4]/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);
+}
 
 #endif
 
diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 21eff8e..fc5c8d7 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -1017,7 +1017,7 @@ DECLARE_OOXMLEXPORT_TEST(testFdo76249, "fdo76249.docx")
     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
     if (!pXmlDoc)
        return;
-    assertXPath(pXmlDoc, 
"//mc:Choice/w:drawing//w:txbxContent//w:drawing//lc:lockedCanvas", 1);
+    assertXPath(pXmlDoc, 
"//mc:Choice[2]/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/lc:lockedCanvas[1]",1);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testFdo76979, "fdo76979.docx")
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 9e3bcd7..96602c3 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -297,8 +297,11 @@ void DocxAttributeOutput::EndParagraph( 
ww8::WW8TableNodeInfoInner::Pointer_t pT
     ++m_nTextFrameLevel;
     if( m_nTextFrameLevel == 1 )
     {
+        assert(!m_postponedCustomShape);
+        m_postponedCustomShape = new std::list< PostponedDrawing >;
         for (size_t nIndex = 0; nIndex < m_aFramesOfParagraph.size(); ++nIndex)
         {
+            m_bParagraphFrameOpen = true;
             sw::Frame aFrame = m_aFramesOfParagraph[nIndex];
             m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
 
@@ -352,7 +355,16 @@ void DocxAttributeOutput::EndParagraph( 
ww8::WW8TableNodeInfoInner::Pointer_t pT
             m_pSerializer->endElementNS(XML_mc, XML_AlternateContent);
 
             m_pSerializer->endElementNS( XML_w, XML_r );
+            m_bParagraphFrameOpen = false;
         }
+        if (m_postponedCustomShape)
+        {
+            m_pSerializer->startElementNS( XML_w, XML_r, FSEND );
+            WritePostponedCustomShape();
+            m_pSerializer->endElementNS( XML_w, XML_r );
+        }
+        delete m_postponedCustomShape;
+        m_postponedCustomShape = NULL;
 
         m_aFramesOfParagraph.clear();
     }
@@ -4207,6 +4219,24 @@ void DocxAttributeOutput::WritePostponedVMLDrawing()
     m_postponedVMLDrawing = NULL;
 }
 
+void DocxAttributeOutput::WritePostponedCustomShape()
+{
+    if(m_postponedCustomShape == NULL)
+        return;
+
+    for( std::list< PostponedDrawing >::iterator it = 
m_postponedCustomShape->begin();
+         it != m_postponedCustomShape->end();
+         ++it )
+    {
+        if ( IsAlternateContentChoiceOpen() )
+            m_rExport.SdrExporter().writeDMLDrawing(it->object, (it->frame), 
m_anchorId++);
+        else
+            m_rExport.SdrExporter().writeDMLAndVMLDrawing(it->object, 
*(it->frame), *(it->point), m_anchorId++);
+    }
+    delete m_postponedCustomShape;
+    m_postponedCustomShape = NULL;
+}
+
 void DocxAttributeOutput::WritePostponedDMLDrawing()
 {
     if(m_postponedDMLDrawing == NULL)
@@ -4264,6 +4294,8 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const 
sw::Frame &rFrame, const Po
                     }
                     else
                     {
+                        uno::Reference<drawing::XShape> 
xShape(const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY_THROW);
+                        OUString sShapeType = xShape->getShapeType();
                         if ( m_postponedDMLDrawing == NULL )
                         {
                             if ( IsAlternateContentChoiceOpen() )
@@ -4271,6 +4303,13 @@ void DocxAttributeOutput::OutputFlyFrame_Impl( const 
sw::Frame &rFrame, const Po
                             else
                                 m_rExport.SdrExporter().writeDMLAndVMLDrawing( 
pSdrObj, rFrame.GetFrmFmt(), rNdTopLeft, m_anchorId++);
                         }
+                        // IsAlternateContentChoiceOpen() : check is to ensure 
that only one object is getting added. Without this check, plus one obejct gets 
added
+                        // m_bParagraphFrameOpen : Check if the frame is open.
+                        // sShapeType : This check is to ensure that if the 
custom shape is within a text frame then only we should postpone it.
+                        else if (IsAlternateContentChoiceOpen() && 
m_bParagraphFrameOpen && sShapeType == "com.sun.star.drawing.CustomShape")
+                        {
+                            
m_postponedCustomShape->push_back(PostponedDrawing(pSdrObj, 
&(rFrame.GetFrmFmt()), &rNdTopLeft));
+                        }
                         else
                             // we are writing out attributes, but w:drawing 
should not be inside w:rPr, so write it out later
                             
m_postponedDMLDrawing->push_back(PostponedDrawing(pSdrObj, 
&(rFrame.GetFrmFmt()), &rNdTopLeft));
@@ -7398,6 +7437,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport 
&rExport, FSHelperPtr pSeri
       m_nNextAnnotationMarkId( 0 ),
       m_pTableWrt( NULL ),
       m_bParagraphOpened( false ),
+      m_bParagraphFrameOpen( false ),
       m_bIsFirstParagraph( true ),
       m_bAlternateContentChoiceOpen( false ),
       m_nColBreakStatus( COLBRK_NONE ),
@@ -7411,6 +7451,7 @@ DocxAttributeOutput::DocxAttributeOutput( DocxExport 
&rExport, FSHelperPtr pSeri
       m_postponedDiagram( NULL ),
       m_postponedVMLDrawing(NULL),
       m_postponedDMLDrawing(NULL),
+      m_postponedCustomShape(NULL),
       m_postponedOLE( NULL ),
       m_postponedMath( NULL ),
       m_postponedChart( NULL ),
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index 8095d2f..2c0472d 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -684,6 +684,7 @@ private:
     void WritePostponedOLE();
     void WritePostponedVMLDrawing();
     void WritePostponedDMLDrawing();
+    void WritePostponedCustomShape();
 
     void WriteSdtBlock( sal_Int32& nSdtPrToken, 
::sax_fastparser::FastAttributeList* &pSdtPrTokenChildren, 
::sax_fastparser::FastAttributeList* &pSdtPrDataBindingAttrs );
 
@@ -763,6 +764,7 @@ private:
     SwWriteTable *m_pTableWrt;
 
     bool m_bParagraphOpened;
+    bool m_bParagraphFrameOpen;
     bool m_bIsFirstParagraph;
     bool m_bAlternateContentChoiceOpen;
 
@@ -810,6 +812,7 @@ private:
     };
     std::list< PostponedDrawing >* m_postponedVMLDrawing;
     std::list< PostponedDrawing >* m_postponedDMLDrawing;
+    std::list< PostponedDrawing >* m_postponedCustomShape;
 
     struct PostponedOLE
     {
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx 
b/sw/source/filter/ww8/docxsdrexport.cxx
index 6f26ae7..29c1195 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -151,7 +151,6 @@ struct DocxSdrExport::Impl
     sax_fastparser::FastAttributeList* m_pFlyWrapAttrList;
     sax_fastparser::FastAttributeList* m_pBodyPrAttrList;
     sax_fastparser::FastAttributeList* m_pDashLineStyleAttr;
-    bool m_bIsInDMLTextFrame;
     sal_Int32 m_nId ;
     sal_Int32 m_nSeq ;
 
@@ -173,7 +172,6 @@ struct DocxSdrExport::Impl
           m_pFlyWrapAttrList(0),
           m_pBodyPrAttrList(0),
           m_pDashLineStyleAttr(0),
-          m_bIsInDMLTextFrame(false),
           m_nId(0),
           m_nSeq(0)
     {
@@ -657,10 +655,10 @@ void DocxSdrExport::writeDMLDrawing(const SdrObject* 
pSdrObject, const SwFrmFmt*
         if (propName == "LockedCanvas")
         {
             /*
-             * Export as Locked Canvas only if the drawing
-             * was originally a Locked Canvas and is now inside a Text Frame.
+             * Export as Locked Canvas only if the property
+             * is in the PropertySet
              */
-            bLockedCanvas = m_pImpl->m_bIsInDMLTextFrame;
+            bLockedCanvas = true;
             break;
         }
     }
@@ -1104,7 +1102,6 @@ void DocxSdrExport::writeDiagram(const SdrObject* 
sdrObject, const SwFrmFmt& rFr
 
 void DocxSdrExport::writeDMLTextFrame(sw::Frame* pParentFrame, int nAnchorId)
 {
-    m_pImpl->m_bIsInDMLTextFrame = true;
     sax_fastparser::FSHelperPtr pFS = m_pImpl->m_pSerializer;
     const SwFrmFmt& rFrmFmt = pParentFrame->GetFrmFmt();
     const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();
@@ -1320,7 +1317,6 @@ void DocxSdrExport::writeDMLTextFrame(sw::Frame* 
pParentFrame, int nAnchorId)
     }
 
     endDMLAnchorInline(&rFrmFmt);
-    m_pImpl->m_bIsInDMLTextFrame = false;
 }
 
 void DocxSdrExport::writeVMLTextFrame(sw::Frame* pParentFrame)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to