Kaydet (Commit) d56ba7ee authored tarafından Thorsten Behrens's avatar Thorsten Behrens

Fix bnc#705982 - make animations inside SmartArt work.

With the fallback loading of extDrawing for SmartArt graphics,
slideshow animations into that drawingml fragment didn't work -
for it being modelId diagram references instead of plain shape IDs.

So use the modelId if present, and only then fallback to shape id.

Change-Id: Iac2b8bc16255611d7ab165b72fb251cd2a65073a
üst 35f86a72
......@@ -27,6 +27,7 @@ namespace oox { namespace ppt {
class PPTShape : public oox::drawingml::Shape
{
OUString msModelId; // fallback dgs smartart shape reference
ShapeLocation meShapeLocation; // placeholdershapes (mnSubType != 0) on Master are never displayed
sal_Bool mbReferenced; // placeholdershapes on Layout are displayed only, if they are not referenced
// placeholdershapes on Slide are displayed always
......@@ -55,6 +56,7 @@ public:
sal_Bool isReferenced() const { return mbReferenced; };
void setReferenced( sal_Bool bReferenced ){ mbReferenced = bReferenced; };
void setPlaceholder( oox::drawingml::ShapePtr pPlaceholder ) { mpPlaceholder = pPlaceholder; }
void setModelId( const OUString& rId ) { msModelId = rId; }
static oox::drawingml::ShapePtr findPlaceholder( const sal_Int32 nMasterPlaceholder, std::vector< oox::drawingml::ShapePtr >& rShapes, bool bMasterOnly = false );
static oox::drawingml::ShapePtr findPlaceholderByIndex( const sal_Int32 nIdx, std::vector< oox::drawingml::ShapePtr >& rShapes, bool bMasterOnly = false );
......
......@@ -97,8 +97,14 @@ namespace oox { namespace ppt {
break;
case XML_spTgt:
{
OUString sShapeName = msValue;
// bnc#705982 - catch referenced diagram fallback shapes
if( maShapeTarget.mnType == XML_dgm )
sShapeName = maShapeTarget.msSubShapeId;
Any rTarget;
::oox::drawingml::ShapePtr pShape = pSlide->getShape(msValue);
::oox::drawingml::ShapePtr pShape = pSlide->getShape(sShapeName);
SAL_WARN_IF( !pShape, "oox.ppt", "failed to locate Shape");
if( pShape )
{
......
......@@ -347,9 +347,18 @@ void PPTShape::addShape(
}
}
if( pShapeMap && !msId.isEmpty() )
if( pShapeMap )
{
(*pShapeMap)[ msId ] = shared_from_this();
// bnc#705982 - if optional model id reference is
// there, use that to obtain target shape
if( !msModelId.isEmpty() )
{
(*pShapeMap)[ msModelId ] = shared_from_this();
}
else if( !msId.isEmpty() )
{
(*pShapeMap)[ msId ] = shared_from_this();
}
}
// if this is a group shape, we have to add also each child shape
......
......@@ -101,7 +101,7 @@ Reference< XFastContextHandler > PPTShapeGroupContext::createFastChildContext( s
case PPT_TOKEN( sp ): // Shape
{
AttributeList aAttribs( xAttribs );
oox::drawingml::ShapePtr pShape = oox::drawingml::ShapePtr( new PPTShape( meShapeLocation, "com.sun.star.drawing.CustomShape" ) );
boost::shared_ptr<PPTShape> pShape( new PPTShape( meShapeLocation, "com.sun.star.drawing.CustomShape" ) );
if( aAttribs.getBool( XML_useBgFill, false ) )
{
::oox::drawingml::FillProperties &aFill = pShape->getFillProperties();
......@@ -110,6 +110,7 @@ Reference< XFastContextHandler > PPTShapeGroupContext::createFastChildContext( s
// TODO: We are using white here, because thats the closest we can assume (?)
aFill.maFillColor.setSrgbClr( API_RGB_WHITE );
}
pShape->setModelId(xAttribs->getOptionalValue( XML_modelId ));
xRet.set( new PPTShapeContext( *this, mpSlidePersistPtr, mpGroupShapePtr, pShape ) );
}
break;
......
......@@ -65,6 +65,12 @@ namespace oox { namespace ppt {
maShapeTarget.msSubShapeId = rAttribs.getString( XML_spid, OUString() );
return this;
case PPT_TOKEN( graphicEl ):
return this; // needs a:dgm for the target
case A_TOKEN( dgm ):
bTargetSet = true;
maShapeTarget.mnType = XML_dgm;
maShapeTarget.msSubShapeId = rAttribs.getString( XML_id, OUString() );
return this;
case PPT_TOKEN( oleChartEl ):
bTargetSet = true;
// TODO
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment