summaryrefslogtreecommitdiff
path: root/xmloff/source
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source')
-rw-r--r--xmloff/source/core/xmlictxt.cxx3
-rw-r--r--xmloff/source/core/xmlmultiimagehelper.cxx11
-rw-r--r--xmloff/source/draw/shapeimport.cxx31
-rw-r--r--xmloff/source/draw/ximpshap.cxx67
-rw-r--r--xmloff/source/draw/ximpshap.hxx4
5 files changed, 114 insertions, 2 deletions
diff --git a/xmloff/source/core/xmlictxt.cxx b/xmloff/source/core/xmlictxt.cxx
index f748d04fbbca..e1303fe24847 100644
--- a/xmloff/source/core/xmlictxt.cxx
+++ b/xmloff/source/core/xmlictxt.cxx
@@ -69,5 +69,8 @@ void SvXMLImportContext::Characters( const OUString& )
{
}
+void SvXMLImportContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& )
+{
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/core/xmlmultiimagehelper.cxx b/xmloff/source/core/xmlmultiimagehelper.cxx
index 5445b6f8f199..8ada292e9545 100644
--- a/xmloff/source/core/xmlmultiimagehelper.cxx
+++ b/xmloff/source/core/xmlmultiimagehelper.cxx
@@ -120,7 +120,16 @@ SvXMLImportContextRef MultiImageImportHelper::solveMultipleImages()
// remove the rest from parent
for(a = 0; a < maImplContextVector.size(); a++)
{
- removeGraphicFromImportContext(**maImplContextVector[a]);
+ SvXMLImportContext& rCandidate = **maImplContextVector[a];
+
+ if(pContext)
+ {
+ // #i124143# evtl. copy imported GluePoints before deprecating
+ // this graphic and context
+ pContext->onDemandRescueUsefulDataFromTemporary(rCandidate);
+ }
+
+ removeGraphicFromImportContext(rCandidate);
}
}
else if (maImplContextVector.size() == 1)
diff --git a/xmloff/source/draw/shapeimport.cxx b/xmloff/source/draw/shapeimport.cxx
index 33fcbb37b127..4dbb85f09748 100644
--- a/xmloff/source/draw/shapeimport.cxx
+++ b/xmloff/source/draw/shapeimport.cxx
@@ -1031,6 +1031,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 )
{
@@ -1053,7 +1082,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 3e51b1287a3d..80e2df91c122 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -917,6 +917,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 (const uno::Exception& e)
+ {
+ SAL_WARN("xmloff", "exception during setting of glue points: " << e.Message);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext );
SdXMLRectShapeContext::SdXMLRectShapeContext(
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index b07a20717a59..a4b8786840b8 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -115,6 +115,10 @@ public:
// this is called from the parent group for each unparsed attribute in the attribute list
virtual void processAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue );
+
+ // allow to copy evtl. useful data from another temporary import context, e.g. used to
+ // support multiple images
+ virtual void onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate );
};
// draw:rect context