[Libreoffice-commits] core.git: Branch 'aoo/trunk' - xmloff/inc xmloff/source

Armin Le Grand alg at apache.org
Tue Feb 4 10:08:10 PST 2014


 xmloff/inc/xmloff/shapeimport.hxx          |    7 ++-
 xmloff/inc/xmloff/xmlictxt.hxx             |    5 ++
 xmloff/source/core/xmlictxt.cxx            |    3 +
 xmloff/source/core/xmlmultiimagehelper.cxx |   13 ++++-
 xmloff/source/draw/shapeimport.cxx         |   31 ++++++++++++-
 xmloff/source/draw/ximpshap.cxx            |   67 +++++++++++++++++++++++++++++
 xmloff/source/draw/ximpshap.hxx            |    4 +
 7 files changed, 126 insertions(+), 4 deletions(-)

New commits:
commit c011af1087411a9bacd29cd479c807e698b2e92c
Author: Armin Le Grand <alg at apache.org>
Date:   Tue Feb 4 17:42:05 2014 +0000

    i124143 for draw:frame containing multiple draw:image and draw:glue-point it is necessary to move the GluePoints from the last draw:image where they were automatically imported to the surviving one if these are different

diff --git a/xmloff/inc/xmloff/shapeimport.hxx b/xmloff/inc/xmloff/shapeimport.hxx
index 8ac1c04..a7d4412 100644
--- a/xmloff/inc/xmloff/shapeimport.hxx
+++ b/xmloff/inc/xmloff/shapeimport.hxx
@@ -394,12 +394,17 @@ public:
     void addGluePointMapping( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape,
                               sal_Int32 nSourceId, sal_Int32 nDestinnationId );
 
+    /** find mapping for given DestinationID. This allows to extract the original draw:id imported with a draw:glue-point */
+    sal_Int32 findGluePointMapping(
+        const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape,
+        sal_Int32 nDestinnationId ) const;
+
     /** moves all current DestinationId's for rXShape by n */
     void moveGluePointMapping( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, const sal_Int32 n );
 
     /** retrieves a mapping for a glue point identifier from the current xml file to the identifier created after
         inserting the new glue point into the core. The mapping must be initialized first with addGluePointMapping() */
-    sal_Int32 getGluePointId( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId );
+    sal_Int32 getGluePointId( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId );
 
     /** this method must be calling before the first shape is imported for the given page.
         Calls to this method can be nested */
diff --git a/xmloff/inc/xmloff/xmlictxt.hxx b/xmloff/inc/xmloff/xmlictxt.hxx
index 37a2a4e..137cbd6 100644
--- a/xmloff/inc/xmloff/xmlictxt.hxx
+++ b/xmloff/inc/xmloff/xmlictxt.hxx
@@ -94,6 +94,11 @@ public:
     // This method is called for all characters that are contained in the
     // current element. The default is to ignore them.
     virtual void Characters( const ::rtl::OUString& rChars );
+
+    // #124143# allow to copy evtl. useful data from another temporary import context, e.g. used to
+    // support multiple images and to rescue evtl. GluePoints imported with one of the
+    // to be deprecated contents
+    virtual void onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate );
 };
 
 SV_DECL_REF( SvXMLImportContext )
diff --git a/xmloff/source/core/xmlictxt.cxx b/xmloff/source/core/xmlictxt.cxx
index c35a134..c915aae 100644
--- a/xmloff/source/core/xmlictxt.cxx
+++ b/xmloff/source/core/xmlictxt.cxx
@@ -77,4 +77,7 @@ void SvXMLImportContext::Characters( const OUString& )
 {
 }
 
+void SvXMLImportContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& )
+{
+}
 
diff --git a/xmloff/source/core/xmlmultiimagehelper.cxx b/xmloff/source/core/xmlmultiimagehelper.cxx
index 9accd49..d841319 100644
--- a/xmloff/source/core/xmlmultiimagehelper.cxx
+++ b/xmloff/source/core/xmlmultiimagehelper.cxx
@@ -96,7 +96,7 @@ multiImageImportHelper::~multiImageImportHelper()
 
 const SvXMLImportContext* multiImageImportHelper::solveMultipleImages()
 {
-    const SvXMLImportContext* pRetval = 0;
+    SvXMLImportContext* pRetval = 0;
 
     if(maImplContextVector.size())
     {
@@ -133,7 +133,16 @@ const SvXMLImportContext* multiImageImportHelper::solveMultipleImages()
             {
                 if(a != nIndexOfPreferred)
                 {
-                    removeGraphicFromImportContext(**maImplContextVector[a]);
+                    SvXMLImportContext& rCandidate = **maImplContextVector[a];
+
+                    if(pRetval)
+                    {
+                        // #124143# evtl. copy imported GluePoints before deprecating
+                        // this graphic and context
+                        pRetval->onDemandRescueUsefulDataFromTemporary(rCandidate);
+                    }
+
+                    removeGraphicFromImportContext(rCandidate);
                 }
             }
         }
diff --git a/xmloff/source/draw/shapeimport.cxx b/xmloff/source/draw/shapeimport.cxx
index afdd704..935e59e 100644
--- a/xmloff/source/draw/shapeimport.cxx
+++ b/xmloff/source/draw/shapeimport.cxx
@@ -1355,6 +1355,35 @@ void XMLShapeImportHelper::addGluePointMapping( com::sun::star::uno::Reference<
         mpPageContext->maShapeGluePointsMap[xShape][nSourceId] = nDestinnationId;
 }
 
+/** find mapping for given DestinationID. This allows to extract the original draw:id imported with a draw:glue-point */
+sal_Int32 XMLShapeImportHelper::findGluePointMapping(
+    const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape,
+    sal_Int32 nDestinnationId ) const
+{
+    if( mpPageContext )
+    {
+        ShapeGluePointsMap::iterator aShapeIter( mpPageContext->maShapeGluePointsMap.find( xShape ) );
+
+        if( aShapeIter != mpPageContext->maShapeGluePointsMap.end() )
+        {
+            GluePointIdMap::iterator aShapeIdIter = (*aShapeIter).second.begin();
+            GluePointIdMap::iterator aShapeIdEnd  = (*aShapeIter).second.end();
+
+            while ( aShapeIdIter != aShapeIdEnd )
+            {
+                if ( (*aShapeIdIter).second == nDestinnationId )
+                {
+                    return (*aShapeIdIter).first;
+                }
+
+                aShapeIdIter++;
+            }
+        }
+    }
+
+    return -1;
+}
+
 /** moves all current DestinationId's by n */
 void XMLShapeImportHelper::moveGluePointMapping( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, const sal_Int32 n )
 {
@@ -1377,7 +1406,7 @@ void XMLShapeImportHelper::moveGluePointMapping( const com::sun::star::uno::Refe
 
 /** retrieves a mapping for a glue point identifier from the current xml file to the identifier created after
     inserting the new glue point into the core. The mapping must be initialized first with addGluePointMapping() */
-sal_Int32 XMLShapeImportHelper::getGluePointId( com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId )
+sal_Int32 XMLShapeImportHelper::getGluePointId( const com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& xShape, sal_Int32 nSourceId )
 {
     if( mpPageContext )
     {
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index 7927345..2aee525 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -926,6 +926,73 @@ sal_Bool SdXMLShapeContext::isPresentationShape() const
     return sal_False;
 }
 
+void SdXMLShapeContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate )
+{
+    const SdXMLShapeContext* pCandidate = dynamic_cast< const SdXMLShapeContext* >(&rCandidate);
+
+    if(!mxGluePoints.is() && pCandidate)
+    {
+        // try to rescue GluePoints from rCandidate to local if we not yet have GluePoints by copying them
+        uno::Reference< drawing::XGluePointsSupplier > xSourceSupplier( pCandidate->getShape(), uno::UNO_QUERY );
+        if( !xSourceSupplier.is() )
+            return;
+
+        uno::Reference< container::XIdentifierAccess > xSourceGluePoints( xSourceSupplier->getGluePoints(), uno::UNO_QUERY );
+        if( !xSourceGluePoints.is() )
+            return;
+
+        uno::Sequence< sal_Int32 > aSourceIdSequence( xSourceGluePoints->getIdentifiers() );
+        const sal_Int32 nSourceCount(aSourceIdSequence.getLength());
+        UniReference< XMLShapeImportHelper > xSourceShapeImportHelper(const_cast< SdXMLShapeContext* >(pCandidate)->GetImport().GetShapeImport());
+
+        if(nSourceCount)
+        {
+            // rCandidate has GluePoints; prepare the GluePoint container for the local shape
+            uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
+            if( !xSupplier.is() )
+                return;
+
+            mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
+
+            if( !mxGluePoints.is() )
+                return;
+
+            drawing::GluePoint2 aSourceGluePoint;
+
+            for( sal_Int32 nSourceIndex(0); nSourceIndex < nSourceCount; nSourceIndex++ )
+            {
+                const sal_Int32 nSourceIdentifier = aSourceIdSequence[nSourceIndex];
+
+                // loop over GluePoints which are UserDefined (avoid the auto mapped ones)
+                if((xSourceGluePoints->getByIdentifier( nSourceIdentifier ) >>= aSourceGluePoint)
+                    && aSourceGluePoint.IsUserDefined)
+                {
+                    // get original mappingID back, this is the draw:id imported with a draw:glue-point
+                    const sal_Int32 nDestinnationId = xSourceShapeImportHelper->findGluePointMapping(
+                        pCandidate->getShape(),
+                        nSourceIdentifier );
+
+                    if(-1 != nSourceIdentifier)
+                    {
+                        // if we got that we are able to add a copy of that GluePoint to the local
+                        // context and xShape since we have all information that the source shape
+                        // and context had at import time
+                        try
+                        {
+                            const sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aSourceGluePoint ) );
+                            GetImport().GetShapeImport()->addGluePointMapping( mxShape, nDestinnationId, nInternalId );
+                        }
+                        catch( uno::Exception& )
+                        {
+                            DBG_ERROR( "exception during setting of glue points!");
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index 9423902..7a62138 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -120,6 +120,10 @@ public:
 
     /// access to ShapeId for evtl. late adding
     const rtl::OUString& getShapeId() const { return maShapeId; }
+
+    // allow to copy evtl. useful data from another temporary import context, e.g. used to
+    // support multiple images
+    virtual void onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate );
 };
 
 //////////////////////////////////////////////////////////////////////////////


More information about the Libreoffice-commits mailing list