You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2012/11/21 11:46:39 UTC
svn commit: r1412051 - in /incubator/ooo/trunk/main/xmloff:
inc/xmloff/xmlmultiimagehelper.hxx source/core/xmlmultiimagehelper.cxx
source/draw/ximpshap.cxx source/draw/ximpshap.hxx
source/text/XMLTextFrameContext.cxx
Author: alg
Date: Wed Nov 21 10:46:38 2012
New Revision: 1412051
URL: http://svn.apache.org/viewvc?rev=1412051&view=rev
Log:
#121379# When loading MultiImage, avoid registering xShape with ID until the winner is decided to not have multiple shapes registering with the same ID
Modified:
incubator/ooo/trunk/main/xmloff/inc/xmloff/xmlmultiimagehelper.hxx
incubator/ooo/trunk/main/xmloff/source/core/xmlmultiimagehelper.cxx
incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.cxx
incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.hxx
incubator/ooo/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx
Modified: incubator/ooo/trunk/main/xmloff/inc/xmloff/xmlmultiimagehelper.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/inc/xmloff/xmlmultiimagehelper.hxx?rev=1412051&r1=1412050&r2=1412051&view=diff
==============================================================================
--- incubator/ooo/trunk/main/xmloff/inc/xmloff/xmlmultiimagehelper.hxx (original)
+++ incubator/ooo/trunk/main/xmloff/inc/xmloff/xmlmultiimagehelper.hxx Wed Nov 21 10:46:38 2012
@@ -43,8 +43,9 @@ public:
~multiImageImportHelper();
/// solve multiple imported images. The most valuable one is choosen,
- /// see imlementation for evtl. changing weights and/or adding filetypes
- void solveMultipleImages();
+ /// see imlementation for evtl. changing weights and/or adding filetypes.
+ /// returns the winner of the contest (which can be 0 when no candidates)
+ const SvXMLImportContext* solveMultipleImages();
/// add a content to the remembered image import contexts
void addContent(const SvXMLImportContext& rSvXMLImportContext);
Modified: incubator/ooo/trunk/main/xmloff/source/core/xmlmultiimagehelper.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/core/xmlmultiimagehelper.cxx?rev=1412051&r1=1412050&r2=1412051&view=diff
==============================================================================
--- incubator/ooo/trunk/main/xmloff/source/core/xmlmultiimagehelper.cxx (original)
+++ incubator/ooo/trunk/main/xmloff/source/core/xmlmultiimagehelper.cxx Wed Nov 21 10:46:38 2012
@@ -94,44 +94,57 @@ multiImageImportHelper::~multiImageImpor
}
}
-void multiImageImportHelper::solveMultipleImages()
+const SvXMLImportContext* multiImageImportHelper::solveMultipleImages()
{
- if(maImplContextVector.size() > 1)
- {
- // multiple child contexts were imported, decide which is the most valuable one
- // and remove the rest
- sal_uInt32 nIndexOfPreferred(maImplContextVector.size());
- sal_uInt32 nBestQuality(0), a(0);
+ const SvXMLImportContext* pRetval = 0;
- for(a = 0; a < maImplContextVector.size(); a++)
+ if(maImplContextVector.size())
+ {
+ if(maImplContextVector.size() > 1)
{
- const rtl::OUString aStreamURL(getGraphicURLFromImportContext(**maImplContextVector[a]));
- const sal_uInt32 nNewQuality(getQualityIndex(aStreamURL));
+ // multiple child contexts were imported, decide which is the most valuable one
+ // and remove the rest
+ sal_uInt32 nIndexOfPreferred(maImplContextVector.size());
+ sal_uInt32 nBestQuality(0), a(0);
- if(nNewQuality > nBestQuality)
+ for(a = 0; a < maImplContextVector.size(); a++)
{
- nBestQuality = nNewQuality;
- nIndexOfPreferred = a;
+ const rtl::OUString aStreamURL(getGraphicURLFromImportContext(**maImplContextVector[a]));
+ const sal_uInt32 nNewQuality(getQualityIndex(aStreamURL));
+
+ if(nNewQuality > nBestQuality)
+ {
+ nBestQuality = nNewQuality;
+ nIndexOfPreferred = a;
+ }
}
- }
- // correct if needed, default is to use the last entry
- if(nIndexOfPreferred >= maImplContextVector.size())
- {
- nIndexOfPreferred = maImplContextVector.size() - 1;
- }
+ // correct if needed, default is to use the last entry
+ if(nIndexOfPreferred >= maImplContextVector.size())
+ {
+ nIndexOfPreferred = maImplContextVector.size() - 1;
+ }
- // Take out the most valuable one
- const std::vector< SvXMLImportContextRef* >::iterator aRemove(maImplContextVector.begin() + nIndexOfPreferred);
- delete *aRemove;
- maImplContextVector.erase(aRemove);
+ // get the winner
+ pRetval = *maImplContextVector[nIndexOfPreferred];
- // remove the rest from parent
- for(a = 0; a < maImplContextVector.size(); a++)
+ // remove the rest from parent
+ for(a = 0; a < maImplContextVector.size(); a++)
+ {
+ if(a != nIndexOfPreferred)
+ {
+ removeGraphicFromImportContext(**maImplContextVector[a]);
+ }
+ }
+ }
+ else
{
- removeGraphicFromImportContext(**maImplContextVector[a]);
+ // only one, winner is implicit
+ pRetval = *maImplContextVector[0];
}
}
+
+ return pRetval;
}
void multiImageImportHelper::addContent(const SvXMLImportContext& rSvXMLImportContext)
Modified: incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.cxx?rev=1412051&r1=1412050&r2=1412051&view=diff
==============================================================================
--- incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.cxx (original)
+++ incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.cxx Wed Nov 21 10:46:38 2012
@@ -466,8 +466,16 @@ void SdXMLShapeContext::AddShape(uno::Re
if( maShapeId.getLength() )
{
- uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
- GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef );
+ const SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(this);
+
+ /* avoid registering when LateRegister is needed. E.g. MultiImage support where in-between multiple
+ xShapes with the same ID would be registered. Registration is done after deciding which image
+ to keep, see calls to solveMultipleImages */
+ if(!pGSC || !pGSC->getLateAddToIdentifierMapper())
+ {
+ uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
+ GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef );
+ }
}
// #91065# count only if counting for shape import is enabled
@@ -2288,7 +2296,8 @@ SdXMLGraphicObjectShapeContext::SdXMLGra
uno::Reference< drawing::XShapes >& rShapes,
sal_Bool bTemporaryShape)
: SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
- maURL()
+ maURL(),
+ mbLateAddToIdentifierMapper(false)
{
}
@@ -3428,9 +3437,16 @@ SvXMLImportContext *SdXMLFrameShapeConte
mbSupportsReplacement = IsXMLToken(rLocalName, XML_OBJECT ) || IsXMLToken(rLocalName, XML_OBJECT_OLE);
setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE));
- if(getSupportsMultipleContents() && dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext))
+ if(getSupportsMultipleContents())
{
- addContent(*mxImplContext);
+ SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
+
+ if(pGSC)
+ {
+ // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
+ pGSC->setLateAddToIdentifierMapper(true);
+ addContent(*mxImplContext);
+ }
}
}
else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == nPrefix && IsXMLToken(rLocalName, XML_IMAGE))
@@ -3440,8 +3456,12 @@ SvXMLImportContext *SdXMLFrameShapeConte
GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
mxImplContext = pContext;
- if(dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext))
+ SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
+
+ if(pGSC)
{
+ // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
+ pGSC->setLateAddToIdentifierMapper(true);
addContent(*mxImplContext);
}
}
@@ -3504,7 +3524,15 @@ void SdXMLFrameShapeContext::StartElemen
void SdXMLFrameShapeContext::EndElement()
{
/// solve if multiple image child contexts were imported
- solveMultipleImages();
+ const SvXMLImportContext* pWinner = solveMultipleImages();
+ const SdXMLGraphicObjectShapeContext* pGSCWinner = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(pWinner);
+
+ /// if we have a winner and it's on LateAdd, add it now
+ if(pGSCWinner && pGSCWinner->getLateAddToIdentifierMapper() && pGSCWinner->getShapeId().getLength())
+ {
+ uno::Reference< uno::XInterface > xRef( pGSCWinner->getShape(), uno::UNO_QUERY );
+ GetImport().getInterfaceToIdentifierMapper().registerReference( pGSCWinner->getShapeId(), xRef );
+ }
if( !mxImplContext.Is() )
{
Modified: incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.hxx?rev=1412051&r1=1412050&r2=1412051&view=diff
==============================================================================
--- incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.hxx (original)
+++ incubator/ooo/trunk/main/xmloff/source/draw/ximpshap.hxx Wed Nov 21 10:46:38 2012
@@ -118,6 +118,9 @@ public:
// this is called from the parent group for each unparsed attribute in the attribute list
virtual void processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue );
+
+ /// access to ShapeId for evtl. late adding
+ const rtl::OUString& getShapeId() const { return maShapeId; }
};
//////////////////////////////////////////////////////////////////////////////
@@ -404,6 +407,9 @@ private:
::rtl::OUString maURL;
::com::sun::star::uno::Reference < ::com::sun::star::io::XOutputStream > mxBase64Stream;
+ /// bitfield
+ bool mbLateAddToIdentifierMapper : 1;
+
public:
TYPEINFO();
@@ -421,6 +427,10 @@ public:
// this is called from the parent group for each unparsed attribute in the attribute list
virtual void processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue );
+
+ /// support for LateAddToIdentifierMapper
+ bool getLateAddToIdentifierMapper() const { return mbLateAddToIdentifierMapper; }
+ void setLateAddToIdentifierMapper(bool bNew) { mbLateAddToIdentifierMapper = bNew; }
};
//////////////////////////////////////////////////////////////////////////////
Modified: incubator/ooo/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx?rev=1412051&r1=1412050&r2=1412051&view=diff
==============================================================================
--- incubator/ooo/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx (original)
+++ incubator/ooo/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx Wed Nov 21 10:46:38 2012
@@ -1440,7 +1440,8 @@ XMLTextFrameContext::~XMLTextFrameContex
void XMLTextFrameContext::EndElement()
{
/// solve if multiple image child contexts were imported
- solveMultipleImages();
+ /// the winner is returned, if something has yet to be done with it
+ /*const SvXMLImportContext* pWinner =*/ solveMultipleImages();
SvXMLImportContext *pContext = &m_xImplContext;
XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );