diff options
author | Nikhil Walvekar <nikhil.walvekar@synerzip.com> | 2014-01-10 20:21:45 +0530 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-01-13 18:17:42 +0100 |
commit | 3cf58da99ef152db31fa8378045d4bff041f7ff4 (patch) | |
tree | 8cd1366664e98e93692071e529e248f8d7ddabb7 | |
parent | 8313f68355a7f1f51e930c74f215d823ff086457 (diff) |
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
-rw-r--r-- | include/oox/drawingml/customshapeproperties.hxx | 3 | ||||
-rw-r--r-- | oox/source/drawingml/customshapeproperties.cxx | 1 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 12 | ||||
-rw-r--r-- | oox/source/shape/WpsContext.cxx | 1 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/fdo70942.docx | bin | 0 -> 15520 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 9 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 23 |
7 files changed, 45 insertions, 4 deletions
diff --git a/include/oox/drawingml/customshapeproperties.hxx b/include/oox/drawingml/customshapeproperties.hxx index e6df846c7fa2..fdf8d49196eb 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 247e8cf9880e..cdc69741ec05 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 9437f0252499..eff9ad408424 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 e2bbb0eda362..04e8a232332c 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 Binary files differnew file mode 100644 index 000000000000..a04a78437c14 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/fdo70942.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index d4f5e3fb471b..95b2cb248ce9 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 e498c096b4ad..841655439594 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(); |