[Libreoffice-commits] core.git: include/oox oox/source sw/qa sw/source

Nikhil Walvekar nikhil.walvekar at synerzip.com
Mon Jan 13 09:18:05 PST 2014


 include/oox/drawingml/customshapeproperties.hxx |    3 +++
 oox/source/drawingml/customshapeproperties.cxx  |    1 +
 oox/source/drawingml/shape.cxx                  |   12 ++++++++++++
 oox/source/shape/WpsContext.cxx                 |    1 +
 sw/qa/extras/ooxmlexport/data/fdo70942.docx     |binary
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx        |    9 +++++++++
 sw/source/filter/ww8/docxattributeoutput.cxx    |   23 +++++++++++++++++++----
 7 files changed, 45 insertions(+), 4 deletions(-)

New commits:
commit 3cf58da99ef152db31fa8378045d4bff041f7ff4
Author: Nikhil Walvekar <nikhil.walvekar at synerzip.com>
Date:   Fri Jan 10 20:21:45 2014 +0530

    fdo#70942 Preserve original shape type, if shape contains text.
    
    Currently we change shape type to textframe if a shape contains
    text. Due to this shape information is not preserved when file
    is saved.
    
    Conflicts:
    	sw/qa/extras/ooxmlexport/ooxmlexport.cxx
    Reviewed on:
    	https://gerrit.libreoffice.org/7372
    
    Change-Id: I7af3ce29f857d6fa2ceab0350937d91638361e7c

diff --git a/include/oox/drawingml/customshapeproperties.hxx b/include/oox/drawingml/customshapeproperties.hxx
index e6df846..fdf8d49 100644
--- a/include/oox/drawingml/customshapeproperties.hxx
+++ b/include/oox/drawingml/customshapeproperties.hxx
@@ -135,6 +135,8 @@ public:
     sal_Int32 getShapePresetType() const { return mnShapePresetType; }
     OUString getShapePresetTypeName() const;
     void setShapePresetType( sal_Int32 nShapePresetType ){ mnShapePresetType = nShapePresetType; };
+    sal_Bool                            getShapeTypeOverride(){ return mbShapeTypeOverride; };
+    void                                setShapeTypeOverride( sal_Bool bShapeTypeOverride ) { mbShapeTypeOverride = bShapeTypeOverride; };
 
     std::vector< CustomShapeGuide >&    getAdjustmentGuideList(){ return maAdjustmentGuideList; };
     std::vector< CustomShapeGuide >&    getGuideList(){ return maGuideList; };
@@ -155,6 +157,7 @@ public:
 private:
 
     sal_Int32                       mnShapePresetType;
+    sal_Bool                        mbShapeTypeOverride;
     std::vector< CustomShapeGuide > maAdjustmentGuideList;
     std::vector< CustomShapeGuide > maGuideList;
     std::vector< AdjustHandle >     maAdjustHandleList;
diff --git a/oox/source/drawingml/customshapeproperties.cxx b/oox/source/drawingml/customshapeproperties.cxx
index 247e8cf..cdc6974 100644
--- a/oox/source/drawingml/customshapeproperties.cxx
+++ b/oox/source/drawingml/customshapeproperties.cxx
@@ -44,6 +44,7 @@ namespace oox { namespace drawingml {
 
 CustomShapeProperties::CustomShapeProperties()
 : mnShapePresetType ( -1 )
+, mbShapeTypeOverride(sal_False)
 , mbMirroredX   ( sal_False )
 , mbMirroredY   ( sal_False )
 , mnTextRotateAngle ( 0 )
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 9437f02..eff9ad4 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -621,6 +621,18 @@ Reference< XShape > Shape::createAndInsert(
         {
             if (aServiceName == "com.sun.star.text.TextFrame")
             {
+                if (mpCustomShapePropertiesPtr != NULL && mpCustomShapePropertiesPtr->getShapeTypeOverride())
+                {
+                    uno::Reference<beans::XPropertySet> propertySet (mxShape, uno::UNO_QUERY);
+                    uno::Sequence<beans::PropertyValue> aGrabBag;
+                    propertySet->getPropertyValue("FrameInteropGrabBag") >>= aGrabBag;
+                    sal_Int32 length = aGrabBag.getLength();
+                    aGrabBag.realloc( length+1);
+                    aGrabBag[length].Name = "mso-orig-shape-type";
+                    aGrabBag[length].Value = uno::makeAny(mpCustomShapePropertiesPtr->getShapePresetTypeName());
+                    propertySet->setPropertyValue("FrameInteropGrabBag",uno::makeAny(aGrabBag));
+                }
+
                 // TextFrames have BackColor, not FillColor
                 if (aShapeProps.hasProperty(PROP_FillColor))
                 {
diff --git a/oox/source/shape/WpsContext.cxx b/oox/source/shape/WpsContext.cxx
index e2bbb0e..04e8a23 100644
--- a/oox/source/shape/WpsContext.cxx
+++ b/oox/source/shape/WpsContext.cxx
@@ -101,6 +101,7 @@ oox::core::ContextHandlerRef WpsContext::onCreateContext(sal_Int32 nElementToken
     }
     break;
     case XML_txbx:
+        mpShape->getCustomShapeProperties()->setShapeTypeOverride(true);
         mpShape->setServiceName("com.sun.star.text.TextFrame");
         break;
     default:
diff --git a/sw/qa/extras/ooxmlexport/data/fdo70942.docx b/sw/qa/extras/ooxmlexport/data/fdo70942.docx
new file mode 100644
index 0000000..a04a784
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo70942.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index d4f5e3f..95b2cb2 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -2413,6 +2413,15 @@ DECLARE_OOXMLEXPORT_TEST(testFdo73247, "fdo73247.docx")
         "rot", "1969698");
 }
 
+DECLARE_OOXMLEXPORT_TEST(testFdo70942, "fdo70942.docx")
+{
+     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
+    if (!pXmlDoc)
+        return;
+    assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[2]/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:prstGeom",
+                "prst", "ellipse");
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index e498c09..8416554 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -309,13 +309,12 @@ void DocxAttributeOutput::WriteDMLTextFrame(sw::Frame* pParentFrame)
     uno::Reference< drawing::XShape > xShape( ((SdrObject*)pSdrObj)->getUnoShape(), uno::UNO_QUERY );
     uno::Reference< beans::XPropertySet > xPropertySet( xShape, uno::UNO_QUERY );
     uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xPropertySet->getPropertySetInfo();
-    OUString pName = "FrameInteropGrabBag";
     sal_Int32 nRotation = 0;
 
-    if ( xPropSetInfo->hasPropertyByName( pName ) )
+    if ( xPropSetInfo->hasPropertyByName( "FrameInteropGrabBag" ) )
     {
         uno::Sequence< beans::PropertyValue > propList;
-        xPropertySet->getPropertyValue( pName ) >>= propList;
+        xPropertySet->getPropertyValue( "FrameInteropGrabBag" ) >>= propList;
         for ( sal_Int32 nProp=0; nProp < propList.getLength(); ++nProp )
         {
             OUString propName = propList[nProp].Name;
@@ -352,8 +351,24 @@ void DocxAttributeOutput::WriteDMLTextFrame(sw::Frame* pParentFrame)
             XML_cy, aHeight.getStr(),
             FSEND);
     m_pSerializer->endElementNS(XML_a, XML_xfrm);
+    OUString shapeType = "rect";
+    if ( xPropSetInfo->hasPropertyByName( "FrameInteropGrabBag" ) )
+    {
+        uno::Sequence< beans::PropertyValue > propList;
+        xPropertySet->getPropertyValue( "FrameInteropGrabBag" ) >>= propList;
+        for ( sal_Int32 nProp=0; nProp < propList.getLength(); ++nProp )
+        {
+            OUString propName = propList[nProp].Name;
+            if ( propName == "mso-orig-shape-type")
+            {
+                propList[nProp].Value >>= shapeType;
+                break;
+            }
+        }
+    }
+
     m_pSerializer->singleElementNS(XML_a, XML_prstGeom,
-            XML_prst, "rect",
+            XML_prst, OUStringToOString( shapeType, RTL_TEXTENCODING_UTF8 ).getStr(),
             FSEND);
     m_bDMLTextFrameSyntax = true;
     m_pBodyPrAttrList = m_pSerializer->createAttrList();


More information about the Libreoffice-commits mailing list