summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikhil Walvekar <nikhil.walvekar@synerzip.com>2014-01-10 20:21:45 +0530
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-01-13 18:17:42 +0100
commit3cf58da99ef152db31fa8378045d4bff041f7ff4 (patch)
tree8cd1366664e98e93692071e529e248f8d7ddabb7
parent8313f68355a7f1f51e930c74f215d823ff086457 (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.hxx3
-rw-r--r--oox/source/drawingml/customshapeproperties.cxx1
-rw-r--r--oox/source/drawingml/shape.cxx12
-rw-r--r--oox/source/shape/WpsContext.cxx1
-rw-r--r--sw/qa/extras/ooxmlexport/data/fdo70942.docxbin0 -> 15520 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport.cxx9
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx23
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
new file mode 100644
index 000000000000..a04a78437c14
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/fdo70942.docx
Binary files differ
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();