summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorsten Behrens <tbehrens@suse.com>2013-04-26 13:25:11 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-04-26 14:03:49 +0000
commite8c37ce329345ba47e721036d51a851af0332e47 (patch)
treea94659f5af5c4e4d50be6c9efae910126ccb3703
parentfe437463e3a3fb4cc0e388b45930742bac8c9162 (diff)
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. Conflicts: oox/source/ppt/animationspersist.cxx Change-Id: Iac2b8bc16255611d7ab165b72fb251cd2a65073a Reviewed-on: https://gerrit.libreoffice.org/3622 Reviewed-by: Miklos Vajna <vmiklos@suse.cz> Tested-by: Miklos Vajna <vmiklos@suse.cz>
-rw-r--r--oox/inc/oox/ppt/pptshape.hxx2
-rw-r--r--oox/source/ppt/animationspersist.cxx10
-rw-r--r--oox/source/ppt/pptshape.cxx13
-rw-r--r--oox/source/ppt/pptshapegroupcontext.cxx3
-rw-r--r--oox/source/ppt/timetargetelementcontext.cxx6
5 files changed, 29 insertions, 5 deletions
diff --git a/oox/inc/oox/ppt/pptshape.hxx b/oox/inc/oox/ppt/pptshape.hxx
index aa485adf9347..2a15dcdc17ca 100644
--- a/oox/inc/oox/ppt/pptshape.hxx
+++ b/oox/inc/oox/ppt/pptshape.hxx
@@ -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 );
diff --git a/oox/source/ppt/animationspersist.cxx b/oox/source/ppt/animationspersist.cxx
index bf2a53a2293b..d2d79ab9f1c4 100644
--- a/oox/source/ppt/animationspersist.cxx
+++ b/oox/source/ppt/animationspersist.cxx
@@ -98,9 +98,15 @@ 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);
- OSL_ENSURE( pShape, "failed to locate Shape");
+ ::oox::drawingml::ShapePtr pShape = pSlide->getShape(sShapeName);
+ SAL_WARN_IF( !pShape, "oox.ppt", "failed to locate Shape");
if( pShape )
{
Reference< XShape > xShape( pShape->getXShape() );
diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx
index c0764e50ba90..de0cdae04ccc 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -351,9 +351,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
diff --git a/oox/source/ppt/pptshapegroupcontext.cxx b/oox/source/ppt/pptshapegroupcontext.cxx
index 9ade8fa74a33..5a4e166c1709 100644
--- a/oox/source/ppt/pptshapegroupcontext.cxx
+++ b/oox/source/ppt/pptshapegroupcontext.cxx
@@ -102,7 +102,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();
@@ -111,6 +111,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;
diff --git a/oox/source/ppt/timetargetelementcontext.cxx b/oox/source/ppt/timetargetelementcontext.cxx
index ed6fbabda7ce..506830476cd4 100644
--- a/oox/source/ppt/timetargetelementcontext.cxx
+++ b/oox/source/ppt/timetargetelementcontext.cxx
@@ -67,6 +67,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