Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3622

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/22/3622/1

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
---
M oox/inc/oox/ppt/pptshape.hxx
M oox/source/ppt/animationspersist.cxx
M oox/source/ppt/pptshape.cxx
M oox/source/ppt/pptshapegroupcontext.cxx
M oox/source/ppt/timetargetelementcontext.cxx
5 files changed, 29 insertions(+), 5 deletions(-)



diff --git a/oox/inc/oox/ppt/pptshape.hxx b/oox/inc/oox/ppt/pptshape.hxx
index aa485ad..2a15dcd 100644
--- a/oox/inc/oox/ppt/pptshape.hxx
+++ b/oox/inc/oox/ppt/pptshape.hxx
@@ -27,6 +27,7 @@
 
 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 @@
     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 bf2a53a..d2d79ab 100644
--- a/oox/source/ppt/animationspersist.cxx
+++ b/oox/source/ppt/animationspersist.cxx
@@ -98,9 +98,15 @@
             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 c0764e5..de0cdae 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -351,9 +351,18 @@
 
                     }
                 }
-                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 9ade8fa..5a4e166 100644
--- a/oox/source/ppt/pptshapegroupcontext.cxx
+++ b/oox/source/ppt/pptshapegroupcontext.cxx
@@ -102,7 +102,7 @@
     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 @@
                 // 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 ed6fbab..5068304 100644
--- a/oox/source/ppt/timetargetelementcontext.cxx
+++ b/oox/source/ppt/timetargetelementcontext.cxx
@@ -67,6 +67,12 @@
                     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

-- 
To view, visit https://gerrit.libreoffice.org/3622
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iac2b8bc16255611d7ab165b72fb251cd2a65073a
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Thorsten Behrens <tbehrens@suse.com>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.