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
This commit is contained in:
Nikhil Walvekar 2014-01-10 20:21:45 +05:30 committed by Miklos Vajna
parent 8313f68355
commit 3cf58da99e
7 changed files with 45 additions and 4 deletions

View File

@ -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;

View File

@ -44,6 +44,7 @@ namespace oox { namespace drawingml {
CustomShapeProperties::CustomShapeProperties()
: mnShapePresetType ( -1 )
, mbShapeTypeOverride(sal_False)
, mbMirroredX ( sal_False )
, mbMirroredY ( sal_False )
, mnTextRotateAngle ( 0 )

View File

@ -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))
{

View File

@ -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:

Binary file not shown.

View File

@ -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();

View File

@ -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();