[Libreoffice-commits] .: oox/inc oox/source

Muthu Subramanian sumuthu at kemper.freedesktop.org
Thu Apr 26 06:34:03 PDT 2012


 oox/inc/oox/drawingml/shape.hxx           |    6 +--
 oox/inc/oox/helper/helper.hxx             |    4 ++
 oox/source/drawingml/shape.cxx            |    3 -
 oox/source/ppt/pptgraphicshapecontext.cxx |   48 ++----------------------------
 oox/source/ppt/pptshape.cxx               |   13 +++-----
 oox/source/ppt/pptshapecontext.cxx        |   23 +++++++++-----
 6 files changed, 32 insertions(+), 65 deletions(-)

New commits:
commit eb5f2df4d6f6c215429130b4c27d076f6777e5da
Author: Muthu Subramanian <sumuthu at suse.com>
Date:   Thu Apr 26 19:19:03 2012 +0530

    n758565: Wrong master slide shape being used.
    
    * Changed <ph> idx to OptValue.
    * Duplicate code removal.

diff --git a/oox/inc/oox/drawingml/shape.hxx b/oox/inc/oox/drawingml/shape.hxx
index b360098..6989ede 100644
--- a/oox/inc/oox/drawingml/shape.hxx
+++ b/oox/inc/oox/drawingml/shape.hxx
@@ -130,8 +130,8 @@ public:
     void                            setHiddenMasterShape( sal_Bool bHiddenMasterShape ) { mbHiddenMasterShape = bHiddenMasterShape; }
     void                            setSubType( sal_Int32 nSubType ) { mnSubType = nSubType; }
     sal_Int32                       getSubType() const { return mnSubType; }
-    void                            setSubTypeIndex( sal_uInt32 nSubTypeIndex ) { mnSubTypeIndex = nSubTypeIndex; }
-    sal_Int32                       getSubTypeIndex() const { return mnSubTypeIndex; }
+    void                            setSubTypeIndex( sal_Int32 nSubTypeIndex ) { moSubTypeIndex = nSubTypeIndex; }
+    const OptValue< sal_Int32 >&    getSubTypeIndex() const { return moSubTypeIndex; }
 
     // setDefaults has to be called if styles are imported (OfficeXML is not storing properties having the default value)
     void                            setDefaults();
@@ -232,7 +232,7 @@ protected:
     rtl::OUString       msName;
     rtl::OUString       msId;
     sal_Int32           mnSubType;      // if this type is not zero, then the shape is a placeholder
-    sal_Int32           mnSubTypeIndex;
+    OptValue< sal_Int32 >   moSubTypeIndex;
 
     ShapeStyleRefMap   maShapeStyleRefs;
 
diff --git a/oox/inc/oox/helper/helper.hxx b/oox/inc/oox/helper/helper.hxx
index 9af1008..2ef7ce6 100644
--- a/oox/inc/oox/helper/helper.hxx
+++ b/oox/inc/oox/helper/helper.hxx
@@ -219,6 +219,10 @@ public:
     inline Type&        use() { mbHasValue = true; return maValue; }
 
     inline OptValue&    operator=( const Type& rValue ) { set( rValue ); return *this; }
+    inline bool         operator==( const OptValue& rValue ) const {
+                                    return ( ( mbHasValue == false && rValue.mbHasValue == false ) ||
+                                        ( mbHasValue == rValue.mbHasValue && maValue == rValue.maValue ) );
+                        }
     inline void         assignIfUsed( const OptValue& rValue ) { if( rValue.mbHasValue ) set( rValue.maValue ); }
 
 private:
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index ad5dd59..0019195 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -84,7 +84,6 @@ Shape::Shape( const sal_Char* pServiceName )
 , mpCustomShapePropertiesPtr( new CustomShapeProperties )
 , mpMasterTextListStyle( new TextListStyle )
 , mnSubType( 0 )
-, mnSubTypeIndex( -1 )
 , meFrameType( FRAMETYPE_GENERIC )
 , mnRotation( 0 )
 , mbFlipH( false )
@@ -114,7 +113,7 @@ Shape::Shape( const ShapePtr& pSourceShape )
 , msName( pSourceShape->msName )
 , msId( pSourceShape->msId )
 , mnSubType( pSourceShape->mnSubType )
-, mnSubTypeIndex( pSourceShape->mnSubTypeIndex )
+, moSubTypeIndex( pSourceShape->moSubTypeIndex )
 , maShapeStyleRefs( pSourceShape->maShapeStyleRefs )
 , maSize( pSourceShape->maSize )
 , maPosition( pSourceShape->maPosition )
diff --git a/oox/source/ppt/pptgraphicshapecontext.cxx b/oox/source/ppt/pptgraphicshapecontext.cxx
index 11a9a27..70fa5dd 100644
--- a/oox/source/ppt/pptgraphicshapecontext.cxx
+++ b/oox/source/ppt/pptgraphicshapecontext.cxx
@@ -63,51 +63,11 @@ PPTGraphicShapeContext::PPTGraphicShapeContext( ContextHandler& rParent, const S
 {
 }
 
-static oox::drawingml::ShapePtr findPlaceholder( const sal_Int32 nMasterPlaceholder, std::vector< oox::drawingml::ShapePtr >& rShapes )
-{
-    oox::drawingml::ShapePtr aShapePtr;
-    std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() );
-    while( aRevIter != rShapes.rend() )
-    {
-        if ( (*aRevIter)->getSubType() == nMasterPlaceholder )
-        {
-            aShapePtr = *aRevIter;
-            break;
-        }
-        std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren();
-        aShapePtr = findPlaceholder( nMasterPlaceholder, rChildren );
-        if ( aShapePtr.get() )
-            break;
-        ++aRevIter;
-    }
-    return aShapePtr;
-}
-
-static oox::drawingml::ShapePtr findPlaceholderByIndex( const sal_Int32 nIdx, std::vector< oox::drawingml::ShapePtr >& rShapes )
-{
-    oox::drawingml::ShapePtr aShapePtr;
-    std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() );
-    while( aRevIter != rShapes.rend() )
-    {
-        if ( (*aRevIter)->getSubTypeIndex() == nIdx )
-        {
-            aShapePtr = *aRevIter;
-            break;
-        }
-        std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren();
-        aShapePtr = findPlaceholderByIndex( nIdx, rChildren );
-        if ( aShapePtr.get() )
-            break;
-        ++aRevIter;
-    }
-    return aShapePtr;
-}
-
 // if nFirstPlaceholder can't be found, it will be searched for nSecondPlaceholder
 static oox::drawingml::ShapePtr findPlaceholder( sal_Int32 nFirstPlaceholder, sal_Int32 nSecondPlaceholder, std::vector< oox::drawingml::ShapePtr >& rShapes )
 {
-    oox::drawingml::ShapePtr pPlaceholder = findPlaceholder( nFirstPlaceholder, rShapes );
-    return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : findPlaceholder( nSecondPlaceholder, rShapes );
+    oox::drawingml::ShapePtr pPlaceholder = PPTShape::findPlaceholder( nFirstPlaceholder, rShapes );
+    return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : PPTShape::findPlaceholder( nSecondPlaceholder, rShapes );
 }
 
 Reference< XFastContextHandler > PPTGraphicShapeContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException)
@@ -145,8 +105,8 @@ Reference< XFastContextHandler > PPTGraphicShapeContext::createFastChildContext(
                 {
                     // TODO: use id to shape map
                     SlidePersistPtr pMasterPersist( mpSlidePersistPtr->getMasterPersist() );
-                    if ( pMasterPersist.get() )
-                    pPlaceholder = findPlaceholderByIndex( nIdx, pMasterPersist->getShapes()->getChildren() );
+                    if ( pMasterPersist.get() && xAttribs->hasAttribute( XML_idx ) )
+                        pPlaceholder = PPTShape::findPlaceholderByIndex( nIdx, pMasterPersist->getShapes()->getChildren() );
                 }
                 if ( !pPlaceholder.get() && ( ( eShapeLocation == Slide ) || ( eShapeLocation == Layout ) ) )
                 {
diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx
index 2b017f0..2e2f4f4 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -262,10 +262,10 @@ void PPTShape::addShape(
             OSL_TRACE("shape service: %s", rtl::OUStringToOString(sServiceName, RTL_TEXTENCODING_UTF8 ).getStr());
 
             // use placeholder index if possible
-            if( mnSubType && getSubTypeIndex() && getSubTypeIndex() != -1 && rSlidePersist.getMasterPersist().get() ) {
-                oox::drawingml::ShapePtr pPlaceholder = PPTShape::findPlaceholderByIndex( getSubTypeIndex(), rSlidePersist.getMasterPersist()->getShapes()->getChildren() );
+            if( mnSubType && getSubTypeIndex().has() && rSlidePersist.getMasterPersist().get() ) {
+                oox::drawingml::ShapePtr pPlaceholder = PPTShape::findPlaceholderByIndex( getSubTypeIndex().get(), rSlidePersist.getMasterPersist()->getShapes()->getChildren() );
                 if( pPlaceholder.get()) {
-                    OSL_TRACE("found placeholder with index: %d and type: %s", getSubTypeIndex(), lclDebugSubType( mnSubType ));
+                    OSL_TRACE("found placeholder with index: %d and type: %s", getSubTypeIndex().get(), lclDebugSubType( mnSubType ));
                 }
                 if( pPlaceholder.get() ) {
                     PPTShape* pPPTPlaceholder = dynamic_cast< PPTShape* >( pPlaceholder.get() );
@@ -290,7 +290,7 @@ void PPTShape::addShape(
                         OSL_TRACE("placeholder has parent placeholder: %s type: %s index: %d",
                                   rtl::OUStringToOString( pPPTPlaceholder->mpPlaceholder->getId(), RTL_TEXTENCODING_UTF8 ).getStr(),
                                   lclDebugSubType( pPPTPlaceholder->mpPlaceholder->getSubType() ),
-                                  pPPTPlaceholder->mpPlaceholder->getSubTypeIndex() );
+                                  pPPTPlaceholder->mpPlaceholder->getSubTypeIndex().get() );
                         OSL_TRACE("has textbody %d", pPPTPlaceholder->mpPlaceholder->getTextBody() != NULL );
                         TextListStylePtr pPlaceholderStyle = getSubTypeTextListStyle( rSlidePersist, pPPTPlaceholder->mpPlaceholder->getSubType() );
                         if( pPPTPlaceholder->mpPlaceholder->getTextBody() )
@@ -403,13 +403,10 @@ oox::drawingml::ShapePtr PPTShape::findPlaceholderByIndex( const sal_Int32 nIdx,
 {
     oox::drawingml::ShapePtr aShapePtr;
 
-    if( nIdx == -1)
-        return aShapePtr;
-
     std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() );
     while( aRevIter != rShapes.rend() )
     {
-        if ( (*aRevIter)->getSubTypeIndex() == nIdx )
+        if ( (*aRevIter)->getSubTypeIndex().has() && (*aRevIter)->getSubTypeIndex().get() == nIdx )
         {
             aShapePtr = *aRevIter;
             break;
diff --git a/oox/source/ppt/pptshapecontext.cxx b/oox/source/ppt/pptshapecontext.cxx
index cc62b82..0333f5a 100644
--- a/oox/source/ppt/pptshapecontext.cxx
+++ b/oox/source/ppt/pptshapecontext.cxx
@@ -62,35 +62,40 @@ PPTShapeContext::PPTShapeContext( ContextHandler& rParent, const SlidePersistPtr
 {
 }
 
-oox::drawingml::ShapePtr findPlaceholder( const sal_Int32 nMasterPlaceholder, sal_Int32 nSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes )
+oox::drawingml::ShapePtr findPlaceholder( const sal_Int32 nMasterPlaceholder, const OptValue< sal_Int32 >& oSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes )
 {
     oox::drawingml::ShapePtr aShapePtr;
+    oox::drawingml::ShapePtr aTmpShapePtr;
     std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() );
     while( aRevIter != rShapes.rend() )
     {
         if ( (*aRevIter)->getSubType() == nMasterPlaceholder )
         {
-            if ( ( nSubTypeIndex == -1 ) || ( nSubTypeIndex == (*aRevIter)->getSubTypeIndex() ) )
+            if( !oSubTypeIndex.has() && aTmpShapePtr == NULL )
+                aTmpShapePtr = *aRevIter;
+            if( (*aRevIter)->getSubTypeIndex() == oSubTypeIndex )
             {
                 aShapePtr = *aRevIter;
                 break;
             }
         }
         std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren();
-        aShapePtr = findPlaceholder( nMasterPlaceholder, nSubTypeIndex, rChildren );
+        aShapePtr = findPlaceholder( nMasterPlaceholder, oSubTypeIndex, rChildren );
         if ( aShapePtr.get() )
             break;
         ++aRevIter;
     }
+    if( aShapePtr == NULL )
+        return aTmpShapePtr;
     return aShapePtr;
 }
 
 // if nFirstPlaceholder can't be found, it will be searched for nSecondPlaceholder
 oox::drawingml::ShapePtr findPlaceholder( sal_Int32 nFirstPlaceholder, sal_Int32 nSecondPlaceholder,
-    sal_Int32 nSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes )
+    const OptValue< sal_Int32 >& oSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes )
 {
-    oox::drawingml::ShapePtr pPlaceholder = findPlaceholder( nFirstPlaceholder, nSubTypeIndex, rShapes );
-    return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : findPlaceholder( nSecondPlaceholder, nSubTypeIndex, rShapes );
+    oox::drawingml::ShapePtr pPlaceholder = findPlaceholder( nFirstPlaceholder, oSubTypeIndex, rShapes );
+    return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : findPlaceholder( nSecondPlaceholder, oSubTypeIndex, rShapes );
 }
 
 Reference< XFastContextHandler > PPTShapeContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException)
@@ -168,7 +173,8 @@ Reference< XFastContextHandler > PPTShapeContext::createFastChildContext( sal_In
                               oox::drawingml::ShapePtr pPlaceholder;
                               if ( eShapeLocation == Layout )       // for layout objects the referenced object can be found within the same shape tree
                               {
-                                  pPlaceholder = PPTShape::findPlaceholderByIndex( pPPTShapePtr->getSubTypeIndex(), mpSlidePersistPtr->getShapes()->getChildren() );
+                                  if( pPPTShapePtr->getSubTypeIndex().has() )
+                                      pPlaceholder = PPTShape::findPlaceholderByIndex( pPPTShapePtr->getSubTypeIndex().get(), mpSlidePersistPtr->getShapes()->getChildren() );
                                   if ( !pPlaceholder.get() )
                                       pPlaceholder = findPlaceholder( nFirstPlaceholder, nSecondPlaceholder, pPPTShapePtr->getSubTypeIndex(),
                                                                       mpSlidePersistPtr->getShapes()->getChildren() );
@@ -177,7 +183,8 @@ Reference< XFastContextHandler > PPTShapeContext::createFastChildContext( sal_In
                               {
                                   SlidePersistPtr pMasterPersist( mpSlidePersistPtr->getMasterPersist() );
                                   if ( pMasterPersist.get() ) {
-                                      pPlaceholder = PPTShape::findPlaceholderByIndex( pPPTShapePtr->getSubTypeIndex(), pMasterPersist->getShapes()->getChildren() );
+                                      if( pPPTShapePtr->getSubTypeIndex().has() )
+                                          pPlaceholder = PPTShape::findPlaceholderByIndex( pPPTShapePtr->getSubTypeIndex().get(), pMasterPersist->getShapes()->getChildren() );
                                       if ( !pPlaceholder.get() )
                                           pPlaceholder = findPlaceholder( nFirstPlaceholder, nSecondPlaceholder,
                                                                           pPPTShapePtr->getSubTypeIndex(), pMasterPersist->getShapes()->getChildren() );


More information about the Libreoffice-commits mailing list