xref: /aoo42x/main/xmloff/source/draw/ximpshap.cxx (revision a5258243)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 
31 
32 
33 #include <tools/debug.hxx>
34 #include <com/sun/star/document/XEventsSupplier.hpp>
35 #include <com/sun/star/container/XNameReplace.hpp>
36 #include <com/sun/star/presentation/ClickAction.hpp>
37 #include <com/sun/star/drawing/FillStyle.hpp>
38 #include <com/sun/star/drawing/LineStyle.hpp>
39 #include "unointerfacetouniqueidentifiermapper.hxx"
40 #include <com/sun/star/drawing/XGluePointsSupplier.hpp>
41 #include <com/sun/star/container/XIdentifierAccess.hpp>
42 #include <com/sun/star/drawing/GluePoint2.hpp>
43 #include <com/sun/star/drawing/Alignment.hpp>
44 #include <com/sun/star/drawing/EscapeDirection.hpp>
45 #include <com/sun/star/media/ZoomLevel.hpp>
46 #include <com/sun/star/awt/Rectangle.hpp>
47 
48 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
49 #include <com/sun/star/container/XNameAccess.hpp>
50 #include <comphelper/extract.hxx>
51 #include "ximpshap.hxx"
52 #include <xmloff/XMLBase64ImportContext.hxx>
53 #include <xmloff/XMLShapeStyleContext.hxx>
54 #include <xmloff/xmluconv.hxx>
55 #include <com/sun/star/container/XNamed.hpp>
56 #include <com/sun/star/drawing/CircleKind.hpp>
57 #include <com/sun/star/beans/XPropertySet.hpp>
58 #include <com/sun/star/awt/XControlModel.hpp>
59 #include <com/sun/star/drawing/XControlShape.hpp>
60 #include <com/sun/star/drawing/PointSequenceSequence.hpp>
61 #include <com/sun/star/drawing/PointSequence.hpp>
62 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
63 #include <com/sun/star/lang/XServiceInfo.hpp>
64 #include <com/sun/star/util/XCloneable.hpp>
65 #include <com/sun/star/beans/XMultiPropertyStates.hpp>
66 #include "xexptran.hxx"
67 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
68 #include <com/sun/star/beans/XPropertySetInfo.hpp>
69 #include <com/sun/star/drawing/ConnectorType.hpp>
70 #include <com/sun/star/drawing/HomogenMatrix3.hpp>
71 #include "PropertySetMerger.hxx"
72 #include <xmloff/families.hxx>
73 #include "ximpstyl.hxx"
74 #include"xmloff/xmlnmspe.hxx"
75 #include <xmloff/xmltoken.hxx>
76 #include "EnhancedCustomShapeToken.hxx"
77 #include "XMLReplacementImageContext.hxx"
78 #include "XMLImageMapContext.hxx"
79 #include "sdpropls.hxx"
80 #include "eventimp.hxx"
81 
82 #include "descriptionimp.hxx"
83 #include "ximpcustomshape.hxx"
84 #include "XMLEmbeddedObjectImportContext.hxx"
85 #include "xmloff/xmlerror.hxx"
86 #include <basegfx/matrix/b2dhommatrix.hxx>
87 #include <tools/string.hxx>
88 #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
89 
90 // --> OD 2006-02-22 #b6382898#
91 #include <com/sun/star/text/XTextDocument.hpp>
92 // <--
93 
94 using ::rtl::OUString;
95 using ::rtl::OUStringBuffer;
96 
97 using namespace ::com::sun::star;
98 using namespace ::com::sun::star::uno;
99 using namespace ::com::sun::star::drawing;
100 using namespace ::com::sun::star::style;
101 using namespace ::com::sun::star::container;
102 using namespace ::com::sun::star::document;
103 using namespace ::xmloff::token;
104 using namespace ::xmloff::EnhancedCustomShapeToken;
105 
106 SvXMLEnumMapEntry aXML_GlueAlignment_EnumMap[] =
107 {
108 	{ XML_TOP_LEFT, 	drawing::Alignment_TOP_LEFT },
109 	{ XML_TOP,			drawing::Alignment_TOP },
110 	{ XML_TOP_RIGHT,	drawing::Alignment_TOP_RIGHT },
111 	{ XML_LEFT,		    drawing::Alignment_LEFT },
112 	{ XML_CENTER,		drawing::Alignment_CENTER },
113 	{ XML_RIGHT,		drawing::Alignment_RIGHT },
114 	{ XML_BOTTOM_LEFT,	drawing::Alignment_BOTTOM_LEFT },
115 	{ XML_BOTTOM,		drawing::Alignment_BOTTOM },
116 	{ XML_BOTTOM_RIGHT, drawing::Alignment_BOTTOM_RIGHT },
117 	{ XML_TOKEN_INVALID, 0 }
118 };
119 
120 SvXMLEnumMapEntry aXML_GlueEscapeDirection_EnumMap[] =
121 {
122 	{ XML_AUTO, 		drawing::EscapeDirection_SMART },
123 	{ XML_LEFT,	    	drawing::EscapeDirection_LEFT },
124     { XML_RIGHT,		drawing::EscapeDirection_RIGHT },
125     { XML_UP,			drawing::EscapeDirection_UP },
126     { XML_DOWN,		    drawing::EscapeDirection_DOWN },
127     { XML_HORIZONTAL,	drawing::EscapeDirection_HORIZONTAL },
128     { XML_VERTICAL,	    drawing::EscapeDirection_VERTICAL },
129 	{ XML_TOKEN_INVALID, 0 }
130 };
131 
132 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
133 
134 static bool ImpIsEmptyURL( const ::rtl::OUString& rURL )
135 {
136     if( rURL.getLength() == 0 )
137         return true;
138 
139     // #i13140# Also compare against 'toplevel' URLs. which also
140     // result in empty filename strings.
141     if( 0 == rURL.compareToAscii( "#./" ) )
142         return true;
143 
144     return false;
145 }
146 
147 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
148 
149 TYPEINIT1( SvXMLShapeContext, SvXMLImportContext );
150 TYPEINIT1( SdXMLShapeContext, SvXMLShapeContext );
151 
152 SdXMLShapeContext::SdXMLShapeContext(
153 	SvXMLImport& rImport,
154 	sal_uInt16 nPrfx,
155 	const OUString& rLocalName,
156 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
157 	uno::Reference< drawing::XShapes >& rShapes,
158     sal_Bool bTemporaryShape)
159 :	SvXMLShapeContext( rImport, nPrfx, rLocalName, bTemporaryShape )
160 ,	mxShapes( rShapes )
161 ,	mxAttrList(xAttrList)
162 ,	mbListContextPushed( false )
163 ,	mnStyleFamily(XML_STYLE_FAMILY_SD_GRAPHICS_ID)
164 ,	mbIsPlaceholder(sal_False)
165 ,	mbClearDefaultAttributes( true )
166 ,	mbIsUserTransformed(sal_False)
167 ,	mnZOrder(-1)
168 ,	maSize(1, 1)
169 ,	maPosition(0, 0)
170 ,	mbVisible(true)
171 ,	mbPrintable(true)
172 {
173 }
174 
175 //////////////////////////////////////////////////////////////////////////////
176 
177 SdXMLShapeContext::~SdXMLShapeContext()
178 {
179 }
180 
181 //////////////////////////////////////////////////////////////////////////////
182 
183 SvXMLImportContext *SdXMLShapeContext::CreateChildContext( sal_uInt16 p_nPrefix,
184 	const OUString& rLocalName,
185 	const uno::Reference< xml::sax::XAttributeList>& xAttrList )
186 {
187 	SvXMLImportContext * pContext = NULL;
188 
189 	// #i68101#
190 	if( p_nPrefix == XML_NAMESPACE_SVG &&
191 		(IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) )
192 	{
193 		pContext = new SdXMLDescriptionContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
194 	}
195 	else if( p_nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) )
196 	{
197 		pContext = new SdXMLEventsContext( GetImport(), p_nPrefix, rLocalName, xAttrList, mxShape );
198 	}
199 	else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_GLUE_POINT ) )
200 	{
201 		addGluePoint( xAttrList );
202 	}
203 	else if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_THUMBNAIL ) )
204 	{
205 		// search attributes for xlink:href
206 		sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
207 		for(sal_Int16 i=0; i < nAttrCount; i++)
208 		{
209 			OUString sAttrName = xAttrList->getNameByIndex( i );
210 			OUString aLocalName;
211 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
212 
213 			if( nPrefix == XML_NAMESPACE_XLINK )
214 			{
215 				if( IsXMLToken( aLocalName, XML_HREF ) )
216 				{
217 					maThumbnailURL = xAttrList->getValueByIndex( i );
218 					break;
219 				}
220 			}
221 		}
222 	}
223 	else
224 	{
225 		// create text cursor on demand
226 		if( !mxCursor.is() )
227 		{
228 			uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
229 			if( xText.is() )
230 			{
231 				UniReference < XMLTextImportHelper > xTxtImport =
232 					GetImport().GetTextImport();
233 				mxOldCursor = xTxtImport->GetCursor();
234 				mxCursor = xText->createTextCursor();
235 				if( mxCursor.is() )
236 				{
237 					xTxtImport->SetCursor( mxCursor );
238 				}
239 
240 				// remember old list item and block (#91964#) and reset them
241 				// for the text frame
242                 xTxtImport->PushListContext();
243                 mbListContextPushed = true;
244 			}
245 		}
246 
247 		// if we have a text cursor, lets  try to import some text
248 		if( mxCursor.is() )
249 		{
250 			pContext = GetImport().GetTextImport()->CreateTextChildContext(
251 				GetImport(), p_nPrefix, rLocalName, xAttrList );
252 		}
253 	}
254 
255 	// call parent for content
256 	if(!pContext)
257 		pContext = SvXMLImportContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
258 
259 	return pContext;
260 }
261 
262 void SdXMLShapeContext::addGluePoint( const uno::Reference< xml::sax::XAttributeList>& xAttrList )
263 {
264 	// get the glue points container for this shape if its not already there
265 	if( !mxGluePoints.is() )
266 	{
267 		uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
268 		if( !xSupplier.is() )
269 			return;
270 
271 		mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
272 
273 		if( !mxGluePoints.is() )
274 			return;
275 	}
276 
277 	drawing::GluePoint2 aGluePoint;
278 	aGluePoint.IsUserDefined = sal_True;
279 	aGluePoint.Position.X = 0;
280 	aGluePoint.Position.Y = 0;
281 	aGluePoint.Escape = drawing::EscapeDirection_SMART;
282 	aGluePoint.PositionAlignment = drawing::Alignment_CENTER;
283 	aGluePoint.IsRelative = sal_True;
284 
285 	sal_Int32 nId = -1;
286 
287 	// read attributes for the 3DScene
288 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
289 	for(sal_Int16 i=0; i < nAttrCount; i++)
290 	{
291 		OUString sAttrName = xAttrList->getNameByIndex( i );
292 		OUString aLocalName;
293 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
294 		const OUString sValue( xAttrList->getValueByIndex( i ) );
295 
296 		if( nPrefix == XML_NAMESPACE_SVG )
297 		{
298 			if( IsXMLToken( aLocalName, XML_X ) )
299 			{
300 				GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.X, sValue);
301 			}
302 			else if( IsXMLToken( aLocalName, XML_Y ) )
303 			{
304 				GetImport().GetMM100UnitConverter().convertMeasure(aGluePoint.Position.Y, sValue);
305 			}
306 		}
307 		else if( nPrefix == XML_NAMESPACE_DRAW )
308 		{
309 			if( IsXMLToken( aLocalName, XML_ID ) )
310 			{
311 				nId = sValue.toInt32();
312 			}
313 			else if( IsXMLToken( aLocalName, XML_ALIGN ) )
314 			{
315 				sal_uInt16 eKind;
316 				if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueAlignment_EnumMap ) )
317 				{
318 					aGluePoint.PositionAlignment = (drawing::Alignment)eKind;
319 					aGluePoint.IsRelative = sal_False;
320 				}
321 			}
322 			else if( IsXMLToken( aLocalName, XML_ESCAPE_DIRECTION ) )
323 			{
324 				sal_uInt16 eKind;
325 				if( SvXMLUnitConverter::convertEnum( eKind, sValue, aXML_GlueEscapeDirection_EnumMap ) )
326 				{
327 					aGluePoint.Escape = (drawing::EscapeDirection)eKind;
328 				}
329 			}
330 		}
331 	}
332 
333 	if( nId != -1 )
334 	{
335 		try
336 		{
337 			sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aGluePoint ) );
338 			GetImport().GetShapeImport()->addGluePointMapping( mxShape, nId, nInternalId );
339 		}
340 		catch( uno::Exception& )
341 		{
342 			DBG_ERROR( "exception during setting of glue points!");
343 		}
344 	}
345 }
346 //////////////////////////////////////////////////////////////////////////////
347 
348 void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
349 {
350     GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
351 }
352 
353 void SdXMLShapeContext::EndElement()
354 {
355 	if(mxCursor.is())
356 	{
357 		// delete addition newline
358 		const OUString aEmpty;
359 		mxCursor->gotoEnd( sal_False );
360 		mxCursor->goLeft( 1, sal_True );
361 		mxCursor->setString( aEmpty );
362 
363 		// reset cursor
364 		GetImport().GetTextImport()->ResetCursor();
365 	}
366 
367 	if(mxOldCursor.is())
368 		GetImport().GetTextImport()->SetCursor( mxOldCursor );
369 
370     // reinstall old list item (if necessary) #91964#
371     if (mbListContextPushed) {
372         GetImport().GetTextImport()->PopListContext();
373     }
374 
375 	if( msHyperlink.getLength() != 0 ) try
376 	{
377 		const OUString sBookmark( RTL_CONSTASCII_USTRINGPARAM( "Bookmark" ) );
378 
379         Reference< XEventsSupplier > xEventsSupplier( mxShape, UNO_QUERY );
380 		if( xEventsSupplier.is() )
381 		{
382 			const OUString sEventType( RTL_CONSTASCII_USTRINGPARAM( "EventType" ) );
383 			const OUString sClickAction( RTL_CONSTASCII_USTRINGPARAM( "ClickAction" ) );
384 
385 			Reference< XNameReplace > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW );
386 
387 			uno::Sequence< beans::PropertyValue > aProperties( 3 );
388 			aProperties[0].Name = sEventType;
389 			aProperties[0].Handle = -1;
390 			aProperties[0].Value <<= OUString( RTL_CONSTASCII_USTRINGPARAM("Presentation") );
391 			aProperties[0].State = beans::PropertyState_DIRECT_VALUE;
392 
393 			aProperties[1].Name = sClickAction;
394 			aProperties[1].Handle = -1;
395 			aProperties[1].Value <<= ::com::sun::star::presentation::ClickAction_DOCUMENT;
396 			aProperties[1].State = beans::PropertyState_DIRECT_VALUE;
397 
398 			aProperties[2].Name = sBookmark;
399 			aProperties[2].Handle = -1;
400 			aProperties[2].Value <<= msHyperlink;
401 			aProperties[2].State = beans::PropertyState_DIRECT_VALUE;
402 
403 			const OUString sAPIEventName( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) );
404 			xEvents->replaceByName( sAPIEventName, Any( aProperties ) );
405 		}
406 		else
407 		{
408 			// in draw use the Bookmark property
409 			Reference< beans::XPropertySet > xSet( mxShape, UNO_QUERY_THROW );
410 			xSet->setPropertyValue( sBookmark, Any( msHyperlink ) );
411 			xSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ), Any( ::com::sun::star::presentation::ClickAction_DOCUMENT ) );
412 		}
413 	}
414 	catch( Exception& )
415 	{
416 		DBG_ERROR("xmloff::SdXMLShapeContext::EndElement(), exception caught while setting hyperlink!");
417 	}
418 
419 	if( mxLockable.is() )
420 		mxLockable->removeActionLock();
421 }
422 
423 //////////////////////////////////////////////////////////////////////////////
424 
425 void SdXMLShapeContext::AddShape(uno::Reference< drawing::XShape >& xShape)
426 {
427 	if(xShape.is())
428 	{
429 		// set shape local
430 		mxShape = xShape;
431 
432 		if(maShapeName.getLength())
433 		{
434 			uno::Reference< container::XNamed > xNamed( mxShape, uno::UNO_QUERY );
435 			if( xNamed.is() )
436 				xNamed->setName( maShapeName );
437 		}
438 
439 		UniReference< XMLShapeImportHelper > xImp( GetImport().GetShapeImport() );
440 		xImp->addShape( xShape, mxAttrList, mxShapes );
441 
442 		if( mbClearDefaultAttributes )
443 		{
444 	        uno::Reference<beans::XMultiPropertyStates> xMultiPropertyStates(xShape, uno::UNO_QUERY );
445 		    if (xMultiPropertyStates.is())
446 			    xMultiPropertyStates->setAllPropertiesToDefault();
447 		}
448 
449 		if( !mbVisible || !mbPrintable ) try
450 		{
451 			uno::Reference< beans::XPropertySet > xSet( xShape, uno::UNO_QUERY_THROW );
452 			if( !mbVisible )
453 				xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ), uno::Any( sal_False ) );
454 
455 			if( !mbPrintable )
456 				xSet->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Printable" ) ), uno::Any( sal_False ) );
457 		}
458 		catch( Exception& )
459 		{
460 			DBG_ERROR( "SdXMLShapeContext::AddShape(), exception caught!" );
461 		}
462 
463 		// #107848#
464 		if(!mbTemporaryShape && (!GetImport().HasTextImport()
465 			|| !GetImport().GetTextImport()->IsInsideDeleteContext()))
466 		{
467 			xImp->shapeWithZIndexAdded( xShape, mnZOrder );
468 		}
469 
470 		if( maShapeId.getLength() )
471 		{
472 			uno::Reference< uno::XInterface > xRef( xShape, uno::UNO_QUERY );
473 			GetImport().getInterfaceToIdentifierMapper().registerReference( maShapeId, xRef );
474 		}
475 
476 		// #91065# count only if counting for shape import is enabled
477 		if(GetImport().GetShapeImport()->IsHandleProgressBarEnabled())
478 		{
479 			// #80365# increment progress bar at load once for each draw object
480 			GetImport().GetProgressBarHelper()->Increment();
481 		}
482 	}
483 
484 	mxLockable = uno::Reference< document::XActionLockable >::query( xShape );
485 
486 	if( mxLockable.is() )
487 		mxLockable->addActionLock();
488 
489 }
490 
491 //////////////////////////////////////////////////////////////////////////////
492 
493 void SdXMLShapeContext::AddShape(const char* pServiceName )
494 {
495 	uno::Reference< lang::XMultiServiceFactory > xServiceFact(GetImport().GetModel(), uno::UNO_QUERY);
496 	if(xServiceFact.is())
497 	{
498         try
499         {
500             // --> OD 2006-02-22 #b6382898#
501             // Since fix for issue i33294 the Writer model doesn't support
502             // com.sun.star.drawing.OLE2Shape anymore.
503             // To handle Draw OLE objects it's decided to import these
504             // objects as com.sun.star.drawing.OLE2Shape and convert these
505             // objects after the import into com.sun.star.drawing.GraphicObjectShape.
506             uno::Reference< drawing::XShape > xShape;
507             if ( OUString::createFromAscii(pServiceName).compareToAscii( "com.sun.star.drawing.OLE2Shape" ) == 0 &&
508                  uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
509             {
510                 xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii("com.sun.star.drawing.temporaryForXMLImportOLE2Shape")), uno::UNO_QUERY);
511             }
512             else
513             {
514                 xShape = uno::Reference< drawing::XShape >(xServiceFact->createInstance(OUString::createFromAscii(pServiceName)), uno::UNO_QUERY);
515             }
516             // <--
517             if( xShape.is() )
518                 AddShape( xShape );
519         }
520         catch( const uno::Exception& e )
521         {
522             uno::Sequence<rtl::OUString> aSeq( 1 );
523             aSeq[0] = OUString::createFromAscii(pServiceName);
524             GetImport().SetError( XMLERROR_FLAG_ERROR | XMLERROR_API,
525                                   aSeq, e.Message, NULL );
526         }
527 	}
528 }
529 
530 //////////////////////////////////////////////////////////////////////////////
531 
532 void SdXMLShapeContext::SetTransformation()
533 {
534 	if(mxShape.is())
535 	{
536 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
537 		if(xPropSet.is())
538 		{
539 			::basegfx::B2DHomMatrix aTransformation;
540 
541 			if(maSize.Width != 1 || maSize.Height != 1)
542 			{
543 				// take care there are no zeros used by error
544 				if(0 == maSize.Width)
545 					maSize.Width = 1;
546 				if(0 == maSize.Height)
547 					maSize.Height = 1;
548 
549 				// set global size. This should always be used.
550 				aTransformation.scale(maSize.Width, maSize.Height);
551 			}
552 
553 			if(maPosition.X != 0 || maPosition.Y != 0)
554 			{
555 				// if global position is used, add it to transformation
556 				aTransformation.translate(maPosition.X, maPosition.Y);
557 			}
558 
559 			if(mnTransform.NeedsAction())
560 			{
561 				// transformation is used, apply to object.
562 				// NOTICE: The transformation is applied AFTER evtl. used
563 				// global positioning and scaling is used, so any shear or
564 				// rotate used herein is applied around the (0,0) position
565 				// of the PAGE object !!!
566 				::basegfx::B2DHomMatrix aMat;
567 				mnTransform.GetFullTransform(aMat);
568 
569 				// now add to transformation
570 				aTransformation *= aMat;
571 			}
572 
573 			// now set transformation for this object
574 			uno::Any aAny;
575 			drawing::HomogenMatrix3 aMatrix;
576 
577 			aMatrix.Line1.Column1 = aTransformation.get(0, 0);
578 			aMatrix.Line1.Column2 = aTransformation.get(0, 1);
579 			aMatrix.Line1.Column3 = aTransformation.get(0, 2);
580 
581 			aMatrix.Line2.Column1 = aTransformation.get(1, 0);
582 			aMatrix.Line2.Column2 = aTransformation.get(1, 1);
583 			aMatrix.Line2.Column3 = aTransformation.get(1, 2);
584 
585 			aMatrix.Line3.Column1 = aTransformation.get(2, 0);
586 			aMatrix.Line3.Column2 = aTransformation.get(2, 1);
587 			aMatrix.Line3.Column3 = aTransformation.get(2, 2);
588 
589 			aAny <<= aMatrix;
590 
591 			xPropSet->setPropertyValue(
592 				OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation")), aAny);
593         }
594 	}
595 }
596 
597 //////////////////////////////////////////////////////////////////////////////
598 
599 void SdXMLShapeContext::SetStyle( bool bSupportsStyle /* = true */)
600 {
601 	try
602 	{
603 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
604 		if( !xPropSet.is() )
605 			return;
606 
607 		do
608 		{
609 			XMLPropStyleContext* pDocStyle = NULL;
610 
611 			// set style on shape
612 			if(maDrawStyleName.getLength() == 0)
613 				break;
614 
615 			const SvXMLStyleContext* pStyle = 0L;
616 			sal_Bool bAutoStyle(sal_False);
617 
618 			if(GetImport().GetShapeImport()->GetAutoStylesContext())
619 				pStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
620 
621 			if(pStyle)
622 				bAutoStyle = sal_True;
623 
624 			if(!pStyle && GetImport().GetShapeImport()->GetStylesContext())
625 				pStyle = GetImport().GetShapeImport()->GetStylesContext()->FindStyleChildContext(mnStyleFamily, maDrawStyleName);
626 
627 			OUString aStyleName = maDrawStyleName;
628 			uno::Reference< style::XStyle > xStyle;
629 
630 			if( pStyle && pStyle->ISA(XMLShapeStyleContext) )
631 			{
632 				pDocStyle = PTR_CAST( XMLShapeStyleContext, pStyle );
633 
634 				if( pDocStyle->GetStyle().is() )
635 				{
636 					xStyle = pDocStyle->GetStyle();
637 				}
638 				else
639 				{
640                     aStyleName = pDocStyle->GetParentName();
641 				}
642 			}
643 
644 			if( !xStyle.is() && aStyleName.getLength() )
645 			{
646 				try
647 				{
648 
649 					uno::Reference< style::XStyleFamiliesSupplier > xFamiliesSupplier( GetImport().GetModel(), uno::UNO_QUERY );
650 
651 					if( xFamiliesSupplier.is() )
652 					{
653 						uno::Reference< container::XNameAccess > xFamilies( xFamiliesSupplier->getStyleFamilies() );
654 						if( xFamilies.is() )
655 						{
656 
657 							uno::Reference< container::XNameAccess > xFamily;
658 
659 							if( XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily )
660 							{
661 								aStyleName = GetImport().GetStyleDisplayName(
662 									XML_STYLE_FAMILY_SD_PRESENTATION_ID,
663 									aStyleName );
664 								sal_Int32 nPos = aStyleName.lastIndexOf( sal_Unicode('-') );
665 								if( -1 != nPos )
666 								{
667 									OUString aFamily( aStyleName.copy( 0, nPos ) );
668 
669 									xFamilies->getByName( aFamily ) >>= xFamily;
670 									aStyleName = aStyleName.copy( nPos + 1 );
671 								}
672 							}
673 							else
674 							{
675 								// get graphics familie
676 								xFamilies->getByName( OUString( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) ) ) >>= xFamily;
677 								aStyleName = GetImport().GetStyleDisplayName(
678 									XML_STYLE_FAMILY_SD_GRAPHICS_ID,
679 									aStyleName );
680 							}
681 
682 							if( xFamily.is() )
683 								xFamily->getByName( aStyleName ) >>= xStyle;
684 						}
685 					}
686 				}
687 				catch( uno::Exception& )
688 				{
689 					DBG_ERROR( "could not find style for shape!" );
690 				}
691 			}
692 
693 			if( bSupportsStyle && xStyle.is() )
694 			{
695 				try
696 				{
697 					// set style on object
698 					uno::Any aAny;
699 					aAny <<= xStyle;
700 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Style")), aAny);
701 				}
702 				catch( uno::Exception& )
703 				{
704 					DBG_ERROR( "could not find style for shape!" );
705 				}
706 			}
707 
708 			// if this is an auto style, set its properties
709 			if(bAutoStyle && pDocStyle)
710 			{
711 				// set PropertySet on object
712 				pDocStyle->FillPropertySet(xPropSet);
713 			}
714 
715 		} while(0);
716 
717 		// try to set text auto style
718 		do
719 		{
720 			// set style on shape
721 			if( 0 == maTextStyleName.getLength() )
722 				break;
723 
724 			if( NULL == GetImport().GetShapeImport()->GetAutoStylesContext())
725 				break;
726 
727             const SvXMLStyleContext* pTempStyle = GetImport().GetShapeImport()->GetAutoStylesContext()->FindStyleChildContext(XML_STYLE_FAMILY_TEXT_PARAGRAPH, maTextStyleName);
728 			XMLPropStyleContext* pStyle = PTR_CAST( XMLPropStyleContext, pTempStyle ); // use temp var, PTR_CAST is a bad macro, FindStyleChildContext will be called twice
729 			if( pStyle == NULL )
730 				break;
731 
732 			// set PropertySet on object
733 			pStyle->FillPropertySet(xPropSet);
734 
735 		} while(0);
736 	}
737 	catch( uno::Exception& )
738 	{
739 	}
740 }
741 
742 void SdXMLShapeContext::SetLayer()
743 {
744 	if( maLayerName.getLength() )
745 	{
746 		try
747 		{
748 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
749 			if(xPropSet.is() )
750 			{
751 				uno::Any aAny;
752 				aAny <<= maLayerName;
753 
754 				xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("LayerName")), aAny);
755 				return;
756 			}
757 		}
758 		catch( uno::Exception e )
759 		{
760 		}
761 	}
762 }
763 
764 void SdXMLShapeContext::SetThumbnail()
765 {
766 	if( 0 == maThumbnailURL.getLength() )
767 		return;
768 
769 	try
770 	{
771 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
772 		if( !xPropSet.is() )
773 			return;
774 
775 		const OUString sProperty(RTL_CONSTASCII_USTRINGPARAM("ThumbnailGraphicURL"));
776 
777 		uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
778 		if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( sProperty ) )
779 		{
780 			// load the thumbnail graphic and export it to a wmf stream so we can set
781 			// it at the api
782 
783 			const OUString aInternalURL( GetImport().ResolveGraphicObjectURL( maThumbnailURL, sal_False ) );
784 			xPropSet->setPropertyValue( sProperty, uno::makeAny( aInternalURL ) );
785 		}
786 	}
787 	catch( uno::Exception e )
788 	{
789 	}
790 }
791 
792 // this is called from the parent group for each unparsed attribute in the attribute list
793 void SdXMLShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
794 {
795     bool bHaveXmlId( false );
796 	if( (XML_NAMESPACE_DRAW == nPrefix) || (XML_NAMESPACE_DRAW_EXT == nPrefix) )
797 	{
798 		if( IsXMLToken( rLocalName, XML_ZINDEX ) )
799 		{
800 			mnZOrder = rValue.toInt32();
801 		}
802 		else if( IsXMLToken( rLocalName, XML_ID ) )
803         {
804             if (!bHaveXmlId) { maShapeId = rValue; };
805         }
806 		else if( IsXMLToken( rLocalName, XML_NAME ) )
807 		{
808 			maShapeName = rValue;
809 		}
810 		else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
811 		{
812 			maDrawStyleName = rValue;
813 		}
814 		else if( IsXMLToken( rLocalName, XML_TEXT_STYLE_NAME ) )
815 		{
816 			maTextStyleName = rValue;
817 		}
818 		else if( IsXMLToken( rLocalName, XML_LAYER ) )
819 		{
820 			maLayerName = rValue;
821 		}
822 		else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
823 		{
824 			mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
825 		}
826 		else if( IsXMLToken( rLocalName, XML_DISPLAY ) )
827 		{
828 			mbVisible = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_SCREEN );
829 			mbPrintable = IsXMLToken( rValue, XML_ALWAYS ) || IsXMLToken( rValue, XML_PRINTER );
830 		}
831 	}
832 	else if( XML_NAMESPACE_PRESENTATION == nPrefix )
833 	{
834 		if( IsXMLToken( rLocalName, XML_USER_TRANSFORMED ) )
835 		{
836 			mbIsUserTransformed = IsXMLToken( rValue, XML_TRUE );
837 		}
838 		else if( IsXMLToken( rLocalName, XML_PLACEHOLDER ) )
839 		{
840 			mbIsPlaceholder = IsXMLToken( rValue, XML_TRUE );
841 			if( mbIsPlaceholder )
842 				mbClearDefaultAttributes = false;
843 		}
844 		else if( IsXMLToken( rLocalName, XML_CLASS ) )
845 		{
846 			maPresentationClass = rValue;
847 		}
848 		else if( IsXMLToken( rLocalName, XML_STYLE_NAME ) )
849 		{
850 			maDrawStyleName = rValue;
851 			mnStyleFamily = XML_STYLE_FAMILY_SD_PRESENTATION_ID;
852 		}
853 	}
854 	else if( XML_NAMESPACE_SVG == nPrefix )
855 	{
856 		if( IsXMLToken( rLocalName, XML_X ) )
857 		{
858 			GetImport().GetMM100UnitConverter().convertMeasure(maPosition.X, rValue);
859 		}
860 		else if( IsXMLToken( rLocalName, XML_Y ) )
861 		{
862 			GetImport().GetMM100UnitConverter().convertMeasure(maPosition.Y, rValue);
863 		}
864 		else if( IsXMLToken( rLocalName, XML_WIDTH ) )
865 		{
866 			GetImport().GetMM100UnitConverter().convertMeasure(maSize.Width, rValue);
867 			if( maSize.Width > 0 )
868 				maSize.Width += 1;
869 			else if( maSize.Width < 0 )
870 				maSize.Width -= 1;
871 		}
872 		else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
873 		{
874 			GetImport().GetMM100UnitConverter().convertMeasure(maSize.Height, rValue);
875 			if( maSize.Height > 0 )
876 				maSize.Height += 1;
877 			else if( maSize.Height < 0 )
878 				maSize.Height -= 1;
879 		}
880 		else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
881 		{
882 			// because of #85127# take svg:transform into account and hanle like
883 			// draw:transform for compatibility
884 			mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
885 		}
886 
887 		// #i68101#
888 		else if( IsXMLToken( rLocalName, XML_TITLE ) )
889 		{
890 			maShapeTitle = rValue;
891 		}
892 		else if( IsXMLToken( rLocalName, XML_DESC ) )
893 		{
894 			maShapeDescription = rValue;
895 		}
896 	}
897 	else if( (XML_NAMESPACE_NONE == nPrefix) || (XML_NAMESPACE_XML == nPrefix) )
898 	{
899 		if( IsXMLToken( rLocalName, XML_ID ) )
900 		{
901 			maShapeId = rValue;
902             bHaveXmlId = true;
903         }
904     }
905 }
906 
907 sal_Bool SdXMLShapeContext::isPresentationShape() const
908 {
909 	if( maPresentationClass.getLength() && (const_cast<SdXMLShapeContext*>(this))->GetImport().GetShapeImport()->IsPresentationShapesSupported() )
910 	{
911 		if(XML_STYLE_FAMILY_SD_PRESENTATION_ID == mnStyleFamily)
912 		{
913 			return sal_True;
914 		}
915 
916 		if( IsXMLToken( maPresentationClass, XML_HEADER ) || IsXMLToken( maPresentationClass, XML_FOOTER ) ||
917 			IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) || IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
918 		{
919 			return sal_True;
920 		}
921 	}
922 
923 	return sal_False;
924 }
925 
926 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
927 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
928 
929 TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext );
930 
931 SdXMLRectShapeContext::SdXMLRectShapeContext(
932 	SvXMLImport& rImport,
933 	sal_uInt16 nPrfx,
934 	const OUString& rLocalName,
935 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
936 	uno::Reference< drawing::XShapes >& rShapes,
937     sal_Bool bTemporaryShape)
938 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
939 	mnRadius( 0L )
940 {
941 }
942 
943 //////////////////////////////////////////////////////////////////////////////
944 
945 SdXMLRectShapeContext::~SdXMLRectShapeContext()
946 {
947 }
948 
949 //////////////////////////////////////////////////////////////////////////////
950 
951 // this is called from the parent group for each unparsed attribute in the attribute list
952 void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
953 {
954 	if( XML_NAMESPACE_DRAW == nPrefix )
955 	{
956 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
957 		{
958 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
959 			return;
960 		}
961 	}
962 
963 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
964 }
965 
966 //////////////////////////////////////////////////////////////////////////////
967 
968 void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
969 {
970 	// create rectangle shape
971 	AddShape("com.sun.star.drawing.RectangleShape");
972 	if(mxShape.is())
973 	{
974 		// Add, set Style and properties from base shape
975 		SetStyle();
976 		SetLayer();
977 
978 		// set pos, size, shear and rotate
979 		SetTransformation();
980 
981 		if(mnRadius)
982 		{
983 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
984 			if(xPropSet.is())
985 			{
986 				try
987 				{
988 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
989 				}
990 				catch( uno::Exception& )
991 				{
992 					DBG_ERROR( "exception during setting of corner radius!");
993 				}
994 			}
995 		}
996 		SdXMLShapeContext::StartElement(xAttrList);
997 	}
998 }
999 
1000 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1001 ////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1002 
1003 TYPEINIT1( SdXMLLineShapeContext, SdXMLShapeContext );
1004 
1005 SdXMLLineShapeContext::SdXMLLineShapeContext(
1006 	SvXMLImport& rImport,
1007 	sal_uInt16 nPrfx,
1008 	const OUString& rLocalName,
1009 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1010 	uno::Reference< drawing::XShapes >& rShapes,
1011     sal_Bool bTemporaryShape)
1012 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1013 	mnX1( 0L ),
1014 	mnY1( 0L ),
1015 	mnX2( 1L ),
1016 	mnY2( 1L )
1017 {
1018 }
1019 
1020 //////////////////////////////////////////////////////////////////////////////
1021 
1022 SdXMLLineShapeContext::~SdXMLLineShapeContext()
1023 {
1024 }
1025 
1026 //////////////////////////////////////////////////////////////////////////////
1027 
1028 // this is called from the parent group for each unparsed attribute in the attribute list
1029 void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1030 {
1031 	if( XML_NAMESPACE_SVG == nPrefix )
1032 	{
1033 		if( IsXMLToken( rLocalName, XML_X1 ) )
1034 		{
1035 			GetImport().GetMM100UnitConverter().convertMeasure(mnX1, rValue);
1036 			return;
1037 		}
1038 		if( IsXMLToken( rLocalName, XML_Y1 ) )
1039 		{
1040 			GetImport().GetMM100UnitConverter().convertMeasure(mnY1, rValue);
1041 			return;
1042 		}
1043 		if( IsXMLToken( rLocalName, XML_X2 ) )
1044 		{
1045 			GetImport().GetMM100UnitConverter().convertMeasure(mnX2, rValue);
1046 			return;
1047 		}
1048 		if( IsXMLToken( rLocalName, XML_Y2 ) )
1049 		{
1050 			GetImport().GetMM100UnitConverter().convertMeasure(mnY2, rValue);
1051 			return;
1052 		}
1053 	}
1054 
1055 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1056 }
1057 
1058 //////////////////////////////////////////////////////////////////////////////
1059 
1060 void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1061 {
1062 	// #85920# use SetTransformation() to handle import of simple lines.
1063 	// This is necessary to kake into account all anchor positions and
1064 	// other things. All shape imports use the same import schemata now.
1065 	// create necessary shape (Line Shape)
1066 	AddShape("com.sun.star.drawing.PolyLineShape");
1067 
1068 	if(mxShape.is())
1069 	{
1070 		// Add, set Style and properties from base shape
1071 		SetStyle();
1072 		SetLayer();
1073 
1074 		// get sizes and offsets
1075 		awt::Point aTopLeft(mnX1, mnY1);
1076 		awt::Point aBottomRight(mnX2, mnY2);
1077 
1078 		if(mnX1 > mnX2)
1079 		{
1080 			aTopLeft.X = mnX2;
1081 			aBottomRight.X = mnX1;
1082 		}
1083 
1084 		if(mnY1 > mnY2)
1085 		{
1086 			aTopLeft.Y = mnY2;
1087 			aBottomRight.Y = mnY1;
1088 		}
1089 
1090 		// set local parameters on shape
1091 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1092 		if(xPropSet.is())
1093 		{
1094 			drawing::PointSequenceSequence aPolyPoly(1L);
1095 			drawing::PointSequence* pOuterSequence = aPolyPoly.getArray();
1096 			pOuterSequence->realloc(2L);
1097 			awt::Point* pInnerSequence = pOuterSequence->getArray();
1098 			uno::Any aAny;
1099 
1100 			*pInnerSequence = awt::Point( mnX1 - aTopLeft.X, mnY1 - aTopLeft.Y);
1101 			pInnerSequence++;
1102 			*pInnerSequence = awt::Point( mnX2 - aTopLeft.X, mnY2 - aTopLeft.Y);
1103 
1104 			aAny <<= aPolyPoly;
1105 			xPropSet->setPropertyValue(
1106 				OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1107 		}
1108 
1109 		// set sizes for transformation
1110 		maSize.Width = aBottomRight.X - aTopLeft.X;
1111 		maSize.Height = aBottomRight.Y - aTopLeft.Y;
1112 		maPosition.X = aTopLeft.X;
1113 		maPosition.Y = aTopLeft.Y;
1114 
1115 		// set pos, size, shear and rotate and get copy of matrix
1116 		SetTransformation();
1117 
1118 		SdXMLShapeContext::StartElement(xAttrList);
1119 	}
1120 }
1121 
1122 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1123 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1124 
1125 TYPEINIT1( SdXMLEllipseShapeContext, SdXMLShapeContext );
1126 
1127 SdXMLEllipseShapeContext::SdXMLEllipseShapeContext(
1128 	SvXMLImport& rImport,
1129 	sal_uInt16 nPrfx,
1130 	const OUString& rLocalName,
1131 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1132 	uno::Reference< drawing::XShapes >& rShapes,
1133     sal_Bool bTemporaryShape)
1134 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1135 	mnCX( 0L ),
1136 	mnCY( 0L ),
1137 	mnRX( 1L ),
1138 	mnRY( 1L ),
1139 	meKind( drawing::CircleKind_FULL ),
1140 	mnStartAngle( 0 ),
1141 	mnEndAngle( 0 )
1142 {
1143 }
1144 
1145 //////////////////////////////////////////////////////////////////////////////
1146 
1147 SdXMLEllipseShapeContext::~SdXMLEllipseShapeContext()
1148 {
1149 }
1150 
1151 //////////////////////////////////////////////////////////////////////////////
1152 
1153 // this is called from the parent group for each unparsed attribute in the attribute list
1154 void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1155 {
1156 	if( XML_NAMESPACE_SVG == nPrefix )
1157 	{
1158 		if( IsXMLToken( rLocalName, XML_RX ) )
1159 		{
1160 			GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1161 			return;
1162 		}
1163 		if( IsXMLToken( rLocalName, XML_RY ) )
1164 		{
1165 			GetImport().GetMM100UnitConverter().convertMeasure(mnRY, rValue);
1166 			return;
1167 		}
1168 		if( IsXMLToken( rLocalName, XML_CX ) )
1169 		{
1170 			GetImport().GetMM100UnitConverter().convertMeasure(mnCX, rValue);
1171 			return;
1172 		}
1173 		if( IsXMLToken( rLocalName, XML_CY ) )
1174 		{
1175 			GetImport().GetMM100UnitConverter().convertMeasure(mnCY, rValue);
1176 			return;
1177 		}
1178 		if( IsXMLToken( rLocalName, XML_R ) )
1179 		{
1180 			// single radius, it's a circle and both radii are the same
1181 			GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1182 			mnRY = mnRX;
1183 			return;
1184 		}
1185 	}
1186 	else if( XML_NAMESPACE_DRAW == nPrefix )
1187 	{
1188 		if( IsXMLToken( rLocalName, XML_KIND ) )
1189 		{
1190 			sal_uInt16 eKind;
1191 			if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_CircleKind_EnumMap ) )
1192 			{
1193 				meKind = eKind;
1194 			}
1195 			return;
1196 		}
1197 		if( IsXMLToken( rLocalName, XML_START_ANGLE ) )
1198 		{
1199 			double dStartAngle;
1200 			if( SvXMLUnitConverter::convertDouble( dStartAngle, rValue ) )
1201 				mnStartAngle = (sal_Int32)(dStartAngle * 100.0);
1202 			return;
1203 		}
1204 		if( IsXMLToken( rLocalName, XML_END_ANGLE ) )
1205 		{
1206 			double dEndAngle;
1207 			if( SvXMLUnitConverter::convertDouble( dEndAngle, rValue ) )
1208 				mnEndAngle = (sal_Int32)(dEndAngle * 100.0);
1209 			return;
1210 		}
1211 	}
1212 
1213 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1214 }
1215 
1216 //////////////////////////////////////////////////////////////////////////////
1217 
1218 void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1219 {
1220 	// create rectangle shape
1221 	AddShape("com.sun.star.drawing.EllipseShape");
1222 	if(mxShape.is())
1223 	{
1224 		// Add, set Style and properties from base shape
1225 		SetStyle();
1226 		SetLayer();
1227 
1228 		// set pos, size, shear and rotate
1229 		SetTransformation();
1230 
1231 		if( meKind != drawing::CircleKind_FULL )
1232 		{
1233 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
1234 			if( xPropSet.is() )
1235 			{
1236 				uno::Any aAny;
1237 				aAny <<= (drawing::CircleKind)meKind;
1238 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")), aAny );
1239 
1240 				aAny <<= mnStartAngle;
1241 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")), aAny );
1242 
1243 				aAny <<= mnEndAngle;
1244 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")), aAny );
1245 			}
1246 		}
1247 
1248 		SdXMLShapeContext::StartElement(xAttrList);
1249 	}
1250 }
1251 
1252 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1253 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1254 
1255 TYPEINIT1( SdXMLPolygonShapeContext, SdXMLShapeContext );
1256 
1257 SdXMLPolygonShapeContext::SdXMLPolygonShapeContext(
1258 	SvXMLImport& rImport,
1259 	sal_uInt16 nPrfx,
1260 	const OUString& rLocalName,
1261 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1262 	uno::Reference< drawing::XShapes >& rShapes, sal_Bool bClosed, sal_Bool bTemporaryShape)
1263 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1264 	mbClosed( bClosed )
1265 {
1266 }
1267 
1268 //////////////////////////////////////////////////////////////////////////////
1269 
1270 // this is called from the parent group for each unparsed attribute in the attribute list
1271 void SdXMLPolygonShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1272 {
1273 	if( XML_NAMESPACE_SVG == nPrefix )
1274 	{
1275 		if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1276 		{
1277 			maViewBox = rValue;
1278 			return;
1279 		}
1280 	}
1281 	else if( XML_NAMESPACE_DRAW == nPrefix )
1282 	{
1283 		if( IsXMLToken( rLocalName, XML_POINTS ) )
1284 		{
1285 			maPoints = rValue;
1286 			return;
1287 		}
1288 	}
1289 
1290 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1291 }
1292 
1293 //////////////////////////////////////////////////////////////////////////////
1294 
1295 SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext()
1296 {
1297 }
1298 
1299 //////////////////////////////////////////////////////////////////////////////
1300 
1301 void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1302 {
1303 	// Add, set Style and properties from base shape
1304 	if(mbClosed)
1305 		AddShape("com.sun.star.drawing.PolyPolygonShape");
1306 	else
1307 		AddShape("com.sun.star.drawing.PolyLineShape");
1308 
1309 	if( mxShape.is() )
1310 	{
1311 		SetStyle();
1312 		SetLayer();
1313 
1314 		// set local parameters on shape
1315 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1316 		if(xPropSet.is())
1317 		{
1318 			// set polygon
1319 			if(maPoints.getLength() && maViewBox.getLength())
1320 			{
1321 				SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1322 				awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1323 				if (maSize.Width != 0 && maSize.Height !=0)
1324 				{
1325 					aSize = maSize;
1326 				}
1327 				awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
1328 				SdXMLImExPointsElement aPoints(maPoints, aViewBox,
1329 					aPosition, aSize, GetImport().GetMM100UnitConverter());
1330 
1331 				uno::Any aAny;
1332 				aAny <<= aPoints.GetPointSequenceSequence();
1333 				xPropSet->setPropertyValue(
1334 					OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1335 			}
1336 		}
1337 
1338 		// set pos, size, shear and rotate and get copy of matrix
1339 		SetTransformation();
1340 
1341 		SdXMLShapeContext::StartElement(xAttrList);
1342 	}
1343 }
1344 
1345 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1346 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1347 
1348 TYPEINIT1( SdXMLPathShapeContext, SdXMLShapeContext );
1349 
1350 SdXMLPathShapeContext::SdXMLPathShapeContext(
1351 	SvXMLImport& rImport,
1352 	sal_uInt16 nPrfx,
1353 	const OUString& rLocalName,
1354 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1355 	uno::Reference< drawing::XShapes >& rShapes,
1356     sal_Bool bTemporaryShape)
1357 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1358 	mbClosed( sal_True )
1359 {
1360 }
1361 
1362 //////////////////////////////////////////////////////////////////////////////
1363 
1364 SdXMLPathShapeContext::~SdXMLPathShapeContext()
1365 {
1366 }
1367 
1368 //////////////////////////////////////////////////////////////////////////////
1369 
1370 // this is called from the parent group for each unparsed attribute in the attribute list
1371 void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1372 {
1373 	if( XML_NAMESPACE_SVG == nPrefix )
1374 	{
1375 		if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1376 		{
1377 			maViewBox = rValue;
1378 			return;
1379 		}
1380 		else if( IsXMLToken( rLocalName, XML_D ) )
1381 		{
1382 			maD = rValue;
1383 			return;
1384 		}
1385 	}
1386 
1387 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1388 }
1389 
1390 //////////////////////////////////////////////////////////////////////////////
1391 
1392 void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1393 {
1394 	// create polygon shape
1395 	if(maD.getLength())
1396 	{
1397 		// prepare some of the parameters
1398 		SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1399 		awt::Size aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1400 		awt::Point aPosition(aViewBox.GetX(), aViewBox.GetY());
1401 		if (maSize.Width != 0 && maSize.Height !=0)
1402 		{
1403 			aSize = maSize;
1404 		}
1405 		SdXMLImExSvgDElement aPoints(maD, aViewBox,
1406 			aPosition, aSize, GetImport().GetMM100UnitConverter());
1407 
1408 		const char* pService;
1409 		// now create shape
1410 		if(aPoints.IsCurve())
1411 		{
1412 			if(aPoints.IsClosed())
1413 			{
1414 				pService = "com.sun.star.drawing.ClosedBezierShape";
1415 			}
1416 			else
1417 			{
1418 				pService = "com.sun.star.drawing.OpenBezierShape";
1419 			}
1420 		}
1421 		else
1422 		{
1423 			if(aPoints.IsClosed())
1424 			{
1425 				pService = "com.sun.star.drawing.PolyPolygonShape";
1426 			}
1427 			else
1428 			{
1429 				pService = "com.sun.star.drawing.PolyLineShape";
1430 			}
1431 		}
1432 
1433 		// Add, set Style and properties from base shape
1434 		AddShape(pService);
1435 
1436 		// #89344# test for mxShape.is() and not for mxShapes.is() to support
1437 		// shape import helper classes WITHOUT XShapes (member mxShapes). This
1438 		// is used by the writer.
1439 		if( mxShape.is() )
1440 		{
1441 			SetStyle();
1442 			SetLayer();
1443 
1444 			// set local parameters on shape
1445 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1446 			if(xPropSet.is())
1447 			{
1448 				uno::Any aAny;
1449 
1450 				// set svg:d
1451 				if(maD.getLength())
1452 				{
1453 					if(aPoints.IsCurve())
1454 					{
1455 						drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1456 							aPoints.GetPointSequenceSequence(),
1457 							aPoints.GetFlagSequenceSequence());
1458 
1459 						aAny <<= aSourcePolyPolygon;
1460 						xPropSet->setPropertyValue(
1461 							OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1462 					}
1463 					else
1464 					{
1465 						aAny <<= aPoints.GetPointSequenceSequence();
1466 						xPropSet->setPropertyValue(
1467 							OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1468 					}
1469 				}
1470 			}
1471 
1472 			// set pos, size, shear and rotate
1473 			SetTransformation();
1474 
1475 			SdXMLShapeContext::StartElement(xAttrList);
1476 		}
1477 	}
1478 }
1479 
1480 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1481 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1482 
1483 TYPEINIT1( SdXMLTextBoxShapeContext, SdXMLShapeContext );
1484 
1485 SdXMLTextBoxShapeContext::SdXMLTextBoxShapeContext(
1486 	SvXMLImport& rImport,
1487 	sal_uInt16 nPrfx,
1488 	const OUString& rLocalName,
1489 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1490 	uno::Reference< drawing::XShapes >& rShapes,
1491     sal_Bool bTemporaryShape)
1492 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1493 	mnRadius(0)
1494 {
1495 }
1496 
1497 //////////////////////////////////////////////////////////////////////////////
1498 
1499 SdXMLTextBoxShapeContext::~SdXMLTextBoxShapeContext()
1500 {
1501 }
1502 
1503 //////////////////////////////////////////////////////////////////////////////
1504 
1505 // this is called from the parent group for each unparsed attribute in the attribute list
1506 void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1507 {
1508 	if( XML_NAMESPACE_DRAW == nPrefix )
1509 	{
1510 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1511 		{
1512 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
1513 			return;
1514 		}
1515 	}
1516 
1517 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1518 }
1519 
1520 //////////////////////////////////////////////////////////////////////////////
1521 
1522 void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
1523 {
1524 	// create textbox shape
1525 	sal_Bool bIsPresShape = sal_False;
1526 	bool bClearText = false;
1527 
1528 	const char *pService = NULL;
1529 
1530 	if( isPresentationShape() )
1531 	{
1532 		// check if the current document supports presentation shapes
1533 		if( GetImport().GetShapeImport()->IsPresentationShapesSupported() )
1534 		{
1535 			if( IsXMLToken( maPresentationClass, XML_PRESENTATION_SUBTITLE ))
1536 			{
1537 				// XmlShapeTypePresSubtitleShape
1538 				pService = "com.sun.star.presentation.SubtitleShape";
1539 			}
1540 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OUTLINE ) )
1541 			{
1542 				// XmlShapeTypePresOutlinerShape
1543 				pService = "com.sun.star.presentation.OutlinerShape";
1544 			}
1545 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_NOTES ) )
1546 			{
1547 				// XmlShapeTypePresNotesShape
1548 				pService = "com.sun.star.presentation.NotesShape";
1549 			}
1550 			else if( IsXMLToken( maPresentationClass, XML_HEADER ) )
1551 			{
1552 				// XmlShapeTypePresHeaderShape
1553 				pService = "com.sun.star.presentation.HeaderShape";
1554 				bClearText = true;
1555 			}
1556 			else if( IsXMLToken( maPresentationClass, XML_FOOTER ) )
1557 			{
1558 				// XmlShapeTypePresFooterShape
1559 				pService = "com.sun.star.presentation.FooterShape";
1560 				bClearText = true;
1561 			}
1562 			else if( IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) )
1563 			{
1564 				// XmlShapeTypePresSlideNumberShape
1565 				pService = "com.sun.star.presentation.SlideNumberShape";
1566 				bClearText = true;
1567 			}
1568 			else if( IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
1569 			{
1570 				// XmlShapeTypePresDateTimeShape
1571 				pService = "com.sun.star.presentation.DateTimeShape";
1572 				bClearText = true;
1573 			}
1574 			else //  IsXMLToken( maPresentationClass, XML_PRESENTATION_TITLE ) )
1575 			{
1576 				// XmlShapeTypePresTitleTextShape
1577 				pService = "com.sun.star.presentation.TitleTextShape";
1578 			}
1579 			bIsPresShape = sal_True;
1580 		}
1581 	}
1582 
1583 	if( NULL == pService )
1584 	{
1585 		// normal text shape
1586 		pService = "com.sun.star.drawing.TextShape";
1587 	}
1588 
1589 	// Add, set Style and properties from base shape
1590 	AddShape(pService);
1591 
1592 	if( mxShape.is() )
1593 	{
1594 		SetStyle();
1595 		SetLayer();
1596 
1597 		if(bIsPresShape)
1598 		{
1599 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
1600 			if(xProps.is())
1601 			{
1602 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
1603 				if( xPropsInfo.is() )
1604 				{
1605 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
1606 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
1607 
1608 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
1609 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
1610 				}
1611 			}
1612 		}
1613 
1614 		if( bClearText )
1615 		{
1616 			uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
1617 			OUString aEmpty;
1618 			xText->setString( aEmpty );
1619 		}
1620 
1621 		// set parameters on shape
1622 //A AW->CL: Eventually You need to strip scale and translate from the transformation
1623 //A to reach the same goal again.
1624 //A		if(!bIsPresShape || mbIsUserTransformed)
1625 //A		{
1626 //A			// set pos and size on shape, this should remove binding
1627 //A			// to pres object on masterpage
1628 //A			SetSizeAndPosition();
1629 //A		}
1630 
1631 		// set pos, size, shear and rotate
1632 		SetTransformation();
1633 
1634 		if(mnRadius)
1635 		{
1636 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1637 			if(xPropSet.is())
1638 			{
1639 				try
1640 				{
1641 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
1642 				}
1643 				catch( uno::Exception& )
1644 				{
1645 					DBG_ERROR( "exception during setting of corner radius!");
1646 				}
1647 			}
1648 		}
1649 
1650 		SdXMLShapeContext::StartElement(mxAttrList);
1651 	}
1652 }
1653 
1654 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1655 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1656 
1657 TYPEINIT1( SdXMLControlShapeContext, SdXMLShapeContext );
1658 
1659 SdXMLControlShapeContext::SdXMLControlShapeContext(
1660 	SvXMLImport& rImport,
1661 	sal_uInt16 nPrfx,
1662 	const OUString& rLocalName,
1663 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1664 	uno::Reference< drawing::XShapes >& rShapes,
1665     sal_Bool bTemporaryShape)
1666 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
1667 {
1668 }
1669 
1670 //////////////////////////////////////////////////////////////////////////////
1671 
1672 SdXMLControlShapeContext::~SdXMLControlShapeContext()
1673 {
1674 }
1675 
1676 //////////////////////////////////////////////////////////////////////////////
1677 
1678 // this is called from the parent group for each unparsed attribute in the attribute list
1679 void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1680 {
1681 	if( XML_NAMESPACE_DRAW == nPrefix )
1682 	{
1683 		if( IsXMLToken( rLocalName, XML_CONTROL ) )
1684 		{
1685 			maFormId = rValue;
1686 			return;
1687 		}
1688 	}
1689 
1690 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1691 }
1692 
1693 void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1694 {
1695 	// create Control shape
1696 	// add, set style and properties from base shape
1697 	AddShape("com.sun.star.drawing.ControlShape");
1698 	if( mxShape.is() )
1699 	{
1700 		DBG_ASSERT( maFormId.getLength(), "draw:control without a form:id attribute!" );
1701 		if( maFormId.getLength() )
1702 		{
1703 #ifndef SVX_LIGHT
1704 			if( GetImport().IsFormsSupported() )
1705 			{
1706 				uno::Reference< awt::XControlModel > xControlModel( GetImport().GetFormImport()->lookupControl( maFormId ), uno::UNO_QUERY );
1707 				if( xControlModel.is() )
1708 				{
1709 					uno::Reference< drawing::XControlShape > xControl( mxShape, uno::UNO_QUERY );
1710 					if( xControl.is() )
1711 						xControl->setControl(  xControlModel );
1712 
1713 				}
1714 			}
1715 #endif // #ifndef SVX_LIGHT
1716 		}
1717 
1718 		SetStyle();
1719 		SetLayer();
1720 
1721 		// set pos, size, shear and rotate
1722 		SetTransformation();
1723 
1724 		SdXMLShapeContext::StartElement(xAttrList);
1725 	}
1726 }
1727 
1728 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1729 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1730 
1731 TYPEINIT1( SdXMLConnectorShapeContext, SdXMLShapeContext );
1732 
1733 SdXMLConnectorShapeContext::SdXMLConnectorShapeContext(
1734 	SvXMLImport& rImport,
1735 	sal_uInt16 nPrfx,
1736 	const OUString& rLocalName,
1737 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1738 	uno::Reference< drawing::XShapes >& rShapes,
1739     sal_Bool bTemporaryShape)
1740 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1741 	maStart(0,0),
1742 	maEnd(1,1),
1743 	mnType( (sal_uInt16)drawing::ConnectorType_STANDARD ),
1744 	mnStartGlueId(-1),
1745 	mnEndGlueId(-1),
1746 	mnDelta1(0),
1747 	mnDelta2(0),
1748 	mnDelta3(0)
1749 {
1750 }
1751 
1752 //////////////////////////////////////////////////////////////////////////////
1753 
1754 SdXMLConnectorShapeContext::~SdXMLConnectorShapeContext()
1755 {
1756 }
1757 
1758 //////////////////////////////////////////////////////////////////////////////
1759 
1760 // this is called from the parent group for each unparsed attribute in the attribute list
1761 void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1762 {
1763 	switch( nPrefix )
1764 	{
1765 	case XML_NAMESPACE_DRAW:
1766 	{
1767 		if( IsXMLToken( rLocalName, XML_START_SHAPE ) )
1768 		{
1769 			maStartShapeId = rValue;
1770 			return;
1771 		}
1772 		if( IsXMLToken( rLocalName, XML_START_GLUE_POINT ) )
1773 		{
1774 			mnStartGlueId = rValue.toInt32();
1775 			return;
1776 		}
1777 		if( IsXMLToken( rLocalName, XML_END_SHAPE ) )
1778 		{
1779 			maEndShapeId = rValue;
1780 			return;
1781 		}
1782 		if( IsXMLToken( rLocalName, XML_END_GLUE_POINT ) )
1783 		{
1784 			mnEndGlueId = rValue.toInt32();
1785 			return;
1786 		}
1787 		if( IsXMLToken( rLocalName, XML_LINE_SKEW ) )
1788 		{
1789 			SvXMLTokenEnumerator aTokenEnum( rValue );
1790 			OUString aToken;
1791 			if( aTokenEnum.getNextToken( aToken ) )
1792 			{
1793 				GetImport().GetMM100UnitConverter().convertMeasure(mnDelta1, aToken);
1794 				if( aTokenEnum.getNextToken( aToken ) )
1795 				{
1796 					GetImport().GetMM100UnitConverter().convertMeasure(mnDelta2, aToken);
1797 					if( aTokenEnum.getNextToken( aToken ) )
1798 					{
1799 						GetImport().GetMM100UnitConverter().convertMeasure(mnDelta3, aToken);
1800 					}
1801 				}
1802 			}
1803 			return;
1804 		}
1805 		if( IsXMLToken( rLocalName, XML_TYPE ) )
1806 		{
1807 			SvXMLUnitConverter::convertEnum( mnType, rValue, aXML_ConnectionKind_EnumMap );
1808 			return;
1809 		}
1810 	}
1811 	case XML_NAMESPACE_SVG:
1812 	{
1813 		if( IsXMLToken( rLocalName, XML_X1 ) )
1814 		{
1815 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
1816 			return;
1817 		}
1818 		if( IsXMLToken( rLocalName, XML_Y1 ) )
1819 		{
1820 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
1821 			return;
1822 		}
1823 		if( IsXMLToken( rLocalName, XML_X2 ) )
1824 		{
1825 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
1826 			return;
1827 		}
1828 		if( IsXMLToken( rLocalName, XML_Y2 ) )
1829 		{
1830 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
1831 			return;
1832 		}
1833 		if( IsXMLToken( rLocalName, XML_D ) )
1834 		{
1835 			SdXMLImExViewBox aViewBox( 0, 0, 1, 1 );
1836 			awt::Point aPoint( 0, 0 );
1837 			awt::Size aSize( 1, 1 );
1838 
1839 			SdXMLImExSvgDElement aPoints( rValue, aViewBox,
1840 				aPoint, aSize, GetImport().GetMM100UnitConverter() );
1841 
1842 			if ( aPoints.IsCurve() )
1843 			{
1844 				drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1845 					aPoints.GetPointSequenceSequence(),
1846 					aPoints.GetFlagSequenceSequence());
1847 				maPath <<= aSourcePolyPolygon;
1848 			}
1849 			else
1850 			{
1851 				const drawing::PointSequenceSequence& rOuterSeq = aPoints.GetPointSequenceSequence();
1852 				drawing::FlagSequenceSequence aFlagSeqSeq( rOuterSeq.getLength() );
1853 				for ( int a = 0; a < rOuterSeq.getLength(); a++ )
1854 					aFlagSeqSeq[ a ] = drawing::FlagSequence( rOuterSeq[ a ].getLength() );
1855 
1856 				drawing::PolyPolygonBezierCoords aSourcePolyPolygon(
1857 					aPoints.GetPointSequenceSequence(),
1858 					aFlagSeqSeq );
1859 				maPath <<= aSourcePolyPolygon;
1860 			}
1861 		}
1862 	}
1863 	}
1864 
1865 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1866 }
1867 
1868 //////////////////////////////////////////////////////////////////////////////
1869 
1870 void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1871 {
1872 	// #107928#
1873 	// For security reasons, do not add empty connectors. There may have been an error in EA2
1874 	// that created empty, far set off connectors (e.g. 63 meters below top of document). This
1875 	// is not guaranteed, but it's definitely safe to not add empty connectors.
1876 	sal_Bool bDoAdd(sal_True);
1877 
1878 	if(    0 == maStartShapeId.getLength()
1879 		&& 0 == maEndShapeId.getLength()
1880 		&& maStart.X == maEnd.X
1881 		&& maStart.Y == maEnd.Y
1882 		&& 0 == mnDelta1
1883 		&& 0 == mnDelta2
1884 		&& 0 == mnDelta3
1885 		)
1886 	{
1887 		bDoAdd = sal_False;
1888 	}
1889 
1890 	if(bDoAdd)
1891 	{
1892 		// create Connector shape
1893 		// add, set style and properties from base shape
1894 		AddShape("com.sun.star.drawing.ConnectorShape");
1895 		if(mxShape.is())
1896 		{
1897 			// add connection ids
1898 			if( maStartShapeId.getLength() )
1899 				GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_True, maStartShapeId, mnStartGlueId );
1900 			if( maEndShapeId.getLength() )
1901 				GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_False, maEndShapeId, mnEndGlueId );
1902 
1903 			uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
1904 			if( xProps.is() )
1905 			{
1906 				uno::Any aAny;
1907 				aAny <<= maStart;
1908 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
1909 
1910 				aAny <<= maEnd;
1911 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
1912 
1913 				aAny <<= (drawing::ConnectorType)mnType;
1914 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind")), aAny );
1915 
1916 				aAny <<= mnDelta1;
1917 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta")), aAny );
1918 
1919 				aAny <<= mnDelta2;
1920 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta")), aAny );
1921 
1922 				aAny <<= mnDelta3;
1923 				xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta")), aAny );
1924 			}
1925 			SetStyle();
1926 			SetLayer();
1927 
1928 			if ( maPath.hasValue() )
1929             {
1930                 // --> OD #i115492#
1931                 // Ignore svg:d attribute for text documents created by OpenOffice.org
1932                 // versions before OOo 3.3, because these OOo versions are storing
1933                 // svg:d values not using the correct unit.
1934                 bool bApplySVGD( true );
1935                 if ( uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
1936                 {
1937                     sal_Int32 nUPD( 0 );
1938                     sal_Int32 nBuild( 0 );
1939                     const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild );
1940                     if ( GetImport().IsTextDocInOOoFileFormat() ||
1941                          ( bBuildIdFound &&
1942                            ( ( nUPD == 641 ) || ( nUPD == 645 ) ||  // prior OOo 2.0
1943                              ( nUPD == 680 ) ||                     // OOo 2.x
1944                              ( nUPD == 300 ) ||                     // OOo 3.0 - OOo 3.0.1
1945                              ( nUPD == 310 ) ||                     // OOo 3.1 - OOo 3.1.1
1946                              ( nUPD == 320 ) ) ) )                  // OOo 3.2 - OOo 3.2.1
1947                     {
1948                         bApplySVGD = false;
1949                     }
1950                 }
1951 
1952                 if ( bApplySVGD )
1953                 {
1954                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ), maPath );
1955                 }
1956                 // <--
1957             }
1958 
1959 			SdXMLShapeContext::StartElement(xAttrList);
1960 		}
1961 	}
1962 }
1963 
1964 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1965 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1966 
1967 TYPEINIT1( SdXMLMeasureShapeContext, SdXMLShapeContext );
1968 
1969 SdXMLMeasureShapeContext::SdXMLMeasureShapeContext(
1970 	SvXMLImport& rImport,
1971 	sal_uInt16 nPrfx,
1972 	const OUString& rLocalName,
1973 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1974 	uno::Reference< drawing::XShapes >& rShapes,
1975     sal_Bool bTemporaryShape)
1976 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1977 	maStart(0,0),
1978 	maEnd(1,1)
1979 {
1980 }
1981 
1982 //////////////////////////////////////////////////////////////////////////////
1983 
1984 SdXMLMeasureShapeContext::~SdXMLMeasureShapeContext()
1985 {
1986 }
1987 
1988 // this is called from the parent group for each unparsed attribute in the attribute list
1989 void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1990 {
1991 	switch( nPrefix )
1992 	{
1993 	case XML_NAMESPACE_SVG:
1994 	{
1995 		if( IsXMLToken( rLocalName, XML_X1 ) )
1996 		{
1997 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
1998 			return;
1999 		}
2000 		if( IsXMLToken( rLocalName, XML_Y1 ) )
2001 		{
2002 			GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
2003 			return;
2004 		}
2005 		if( IsXMLToken( rLocalName, XML_X2 ) )
2006 		{
2007 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
2008 			return;
2009 		}
2010 		if( IsXMLToken( rLocalName, XML_Y2 ) )
2011 		{
2012 			GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
2013 			return;
2014 		}
2015 	}
2016 	}
2017 
2018 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2019 }
2020 
2021 //////////////////////////////////////////////////////////////////////////////
2022 
2023 void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2024 {
2025 	// create Measure shape
2026 	// add, set style and properties from base shape
2027 	AddShape("com.sun.star.drawing.MeasureShape");
2028 	if(mxShape.is())
2029 	{
2030 		SetStyle();
2031 		SetLayer();
2032 
2033 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2034 		if( xProps.is() )
2035 		{
2036 			uno::Any aAny;
2037 			aAny <<= maStart;
2038 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
2039 
2040 			aAny <<= maEnd;
2041 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
2042 		}
2043 
2044 		// delete pre created fields
2045 		uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2046 		if( xText.is() )
2047 		{
2048 			const OUString aEmpty( RTL_CONSTASCII_USTRINGPARAM( " " ) );
2049 			xText->setString( aEmpty );
2050 		}
2051 
2052 		SdXMLShapeContext::StartElement(xAttrList);
2053 	}
2054 }
2055 
2056 void SdXMLMeasureShapeContext::EndElement()
2057 {
2058 	do
2059 	{
2060 		// delete pre created fields
2061 		uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2062 		if( !xText.is() )
2063 			break;
2064 
2065 		uno::Reference< text::XTextCursor > xCursor( xText->createTextCursor() );
2066 		if( !xCursor.is() )
2067 			break;
2068 
2069 		const OUString aEmpty;
2070 		xCursor->collapseToStart();
2071 		xCursor->goRight( 1, sal_True );
2072 		xCursor->setString( aEmpty );
2073 	}
2074 	while(0);
2075 
2076 	SdXMLShapeContext::EndElement();
2077 }
2078 
2079 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2080 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2081 
2082 TYPEINIT1( SdXMLPageShapeContext, SdXMLShapeContext );
2083 
2084 SdXMLPageShapeContext::SdXMLPageShapeContext(
2085 	SvXMLImport& rImport,
2086 	sal_uInt16 nPrfx,
2087 	const OUString& rLocalName,
2088 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2089 	uno::Reference< drawing::XShapes >& rShapes,
2090     sal_Bool bTemporaryShape)
2091 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), mnPageNumber(0)
2092 {
2093 	mbClearDefaultAttributes = false;
2094 }
2095 
2096 //////////////////////////////////////////////////////////////////////////////
2097 
2098 SdXMLPageShapeContext::~SdXMLPageShapeContext()
2099 {
2100 }
2101 
2102 //////////////////////////////////////////////////////////////////////////////
2103 
2104 // this is called from the parent group for each unparsed attribute in the attribute list
2105 void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2106 {
2107 	if( XML_NAMESPACE_DRAW == nPrefix )
2108 	{
2109 		if( IsXMLToken( rLocalName, XML_PAGE_NUMBER ) )
2110 		{
2111 			mnPageNumber = rValue.toInt32();
2112 			return;
2113 		}
2114 	}
2115 
2116 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2117 }
2118 
2119 //////////////////////////////////////////////////////////////////////////////
2120 
2121 void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2122 {
2123 	// create Page shape
2124 	// add, set style and properties from base shape
2125 
2126 	// #86163# take into account which type of PageShape needs to
2127 	// be constructed. It's an pres shape if presentation:XML_CLASS == XML_PRESENTATION_PAGE.
2128 	sal_Bool bIsPresentation = maPresentationClass.getLength() &&
2129 		   GetImport().GetShapeImport()->IsPresentationShapesSupported();
2130 
2131 	uno::Reference< lang::XServiceInfo > xInfo( mxShapes, uno::UNO_QUERY );
2132 	const sal_Bool bIsOnHandoutPage = xInfo.is() && xInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutMasterPage")) );
2133 
2134 	if( bIsOnHandoutPage )
2135 	{
2136 		AddShape("com.sun.star.presentation.HandoutShape");
2137 	}
2138 	else
2139 	{
2140 		if(bIsPresentation && !IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
2141 		{
2142 			bIsPresentation = sal_False;
2143 		}
2144 
2145 		if(bIsPresentation)
2146 		{
2147 			AddShape("com.sun.star.presentation.PageShape");
2148 		}
2149 		else
2150 		{
2151 			AddShape("com.sun.star.drawing.PageShape");
2152 		}
2153 	}
2154 
2155 	if(mxShape.is())
2156 	{
2157 		SetStyle();
2158 		SetLayer();
2159 
2160 		// set pos, size, shear and rotate
2161 		SetTransformation();
2162 
2163 		uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2164 		if(xPropSet.is())
2165 		{
2166 			uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
2167 			const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber"));
2168 			if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr))
2169 				xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber ));
2170 		}
2171 
2172 		SdXMLShapeContext::StartElement(xAttrList);
2173 	}
2174 }
2175 
2176 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2177 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2178 
2179 TYPEINIT1( SdXMLCaptionShapeContext, SdXMLShapeContext );
2180 
2181 SdXMLCaptionShapeContext::SdXMLCaptionShapeContext(
2182 	SvXMLImport& rImport,
2183 	sal_uInt16 nPrfx,
2184 	const OUString& rLocalName,
2185 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2186 	uno::Reference< drawing::XShapes >& rShapes,
2187     sal_Bool bTemporaryShape)
2188 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2189 	// #86616# for correct edge rounding import mnRadius needs to be initialized
2190 	mnRadius( 0L )
2191 {
2192 }
2193 
2194 //////////////////////////////////////////////////////////////////////////////
2195 
2196 SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext()
2197 {
2198 }
2199 
2200 //////////////////////////////////////////////////////////////////////////////
2201 
2202 void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2203 {
2204 	// create Caption shape
2205 	// add, set style and properties from base shape
2206 	AddShape("com.sun.star.drawing.CaptionShape");
2207 	if( mxShape.is() )
2208 	{
2209 		SetStyle();
2210 		SetLayer();
2211 
2212 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2213 
2214 		// SJ: If AutoGrowWidthItem is set, SetTransformation will lead to the wrong SnapRect
2215 		// because NbcAdjustTextFrameWidthAndHeight() is called (text is set later and center alignment
2216 		// is the default setting, so the top left reference point that is used by the caption point is
2217 		// no longer correct) There are two ways to solve this problem, temporarily disabling the
2218 		// autogrowwith as we are doing here or to apply the CaptionPoint after setting text
2219 		sal_Bool bIsAutoGrowWidth = sal_False;
2220 		if ( xProps.is() )
2221 		{
2222 			uno::Any aAny( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth") ) ) );
2223 			aAny >>= bIsAutoGrowWidth;
2224 
2225 			if ( bIsAutoGrowWidth )
2226 				xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_False ) );
2227 		}
2228 
2229 		// set pos, size, shear and rotate
2230 		SetTransformation();
2231 		if( xProps.is() )
2232 			xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint")), uno::makeAny( maCaptionPoint ) );
2233 
2234 		if ( bIsAutoGrowWidth )
2235 			xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_True ) );
2236 
2237 		if(mnRadius)
2238 		{
2239 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2240 			if(xPropSet.is())
2241 			{
2242 				try
2243 				{
2244 					xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
2245 				}
2246 				catch( uno::Exception& )
2247 				{
2248 					DBG_ERROR( "exception during setting of corner radius!");
2249 				}
2250 			}
2251 		}
2252 
2253 		SdXMLShapeContext::StartElement(xAttrList);
2254 	}
2255 }
2256 
2257 // this is called from the parent group for each unparsed attribute in the attribute list
2258 void SdXMLCaptionShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2259 {
2260 	if( XML_NAMESPACE_DRAW == nPrefix )
2261 	{
2262 		if( IsXMLToken( rLocalName, XML_CAPTION_POINT_X ) )
2263 		{
2264 			GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.X, rValue);
2265 			return;
2266 		}
2267 		if( IsXMLToken( rLocalName, XML_CAPTION_POINT_Y ) )
2268 		{
2269 			GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.Y, rValue);
2270 			return;
2271 		}
2272 		if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
2273 		{
2274 			GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
2275 			return;
2276 		}
2277 	}
2278 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2279 }
2280 
2281 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2282 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2283 
2284 TYPEINIT1( SdXMLGraphicObjectShapeContext, SdXMLShapeContext );
2285 
2286 SdXMLGraphicObjectShapeContext::SdXMLGraphicObjectShapeContext(
2287 	SvXMLImport& rImport,
2288 	sal_uInt16 nPrfx,
2289 	const OUString& rLocalName,
2290 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2291 	uno::Reference< drawing::XShapes >& rShapes,
2292     sal_Bool bTemporaryShape)
2293 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2294 	maURL()
2295 {
2296 }
2297 
2298 //////////////////////////////////////////////////////////////////////////////
2299 
2300 // this is called from the parent group for each unparsed attribute in the attribute list
2301 void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2302 {
2303 	if( XML_NAMESPACE_XLINK == nPrefix )
2304 	{
2305 		if( IsXMLToken( rLocalName, XML_HREF ) )
2306 		{
2307 			maURL = rValue;
2308 			return;
2309 		}
2310 	}
2311 
2312 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2313 }
2314 
2315 //////////////////////////////////////////////////////////////////////////////
2316 
2317 void SdXMLGraphicObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2318 {
2319 	// create graphic object shape
2320 	const char *pService;
2321 
2322 	if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) && GetImport().GetShapeImport()->IsPresentationShapesSupported() )
2323 	{
2324 		pService = "com.sun.star.presentation.GraphicObjectShape";
2325 	}
2326 	else
2327 	{
2328 		pService = "com.sun.star.drawing.GraphicObjectShape";
2329 	}
2330 
2331 	AddShape( pService );
2332 
2333 	if(mxShape.is())
2334 	{
2335 		SetStyle();
2336 		SetLayer();
2337 
2338 		uno::Reference< beans::XPropertySet > xPropset(mxShape, uno::UNO_QUERY);
2339 		if(xPropset.is())
2340 		{
2341 			// since OOo 1.x had no line or fill style for graphics, but may create
2342 			// documents with them, we have to override them here
2343 			sal_Int32 nUPD, nBuildId;
2344 			if( GetImport().getBuildIds( nUPD, nBuildId ) && (nUPD == 645) ) try
2345 			{
2346 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), Any( FillStyle_NONE ) );
2347 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("LineStyle")), Any( LineStyle_NONE ) );
2348 			}
2349 			catch( Exception& )
2350 			{
2351 			}
2352 
2353 			uno::Reference< beans::XPropertySetInfo > xPropsInfo( xPropset->getPropertySetInfo() );
2354 			if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2355 				xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( mbIsPlaceholder ) );
2356 
2357 			if( !mbIsPlaceholder )
2358 			{
2359 				if( maURL.getLength() )
2360 				{
2361 					uno::Any aAny;
2362 					aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() );
2363 					try
2364 					{
2365 						xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2366 						xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2367 					}
2368 					catch (lang::IllegalArgumentException const &)
2369 					{
2370 					}
2371 				}
2372 			}
2373 		}
2374 
2375 		if(mbIsUserTransformed)
2376 		{
2377 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2378 			if(xProps.is())
2379 			{
2380 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2381 				if( xPropsInfo.is() )
2382 				{
2383 					if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2384 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2385 				}
2386 			}
2387 		}
2388 
2389 		// set pos, size, shear and rotate
2390 		SetTransformation();
2391 
2392 		SdXMLShapeContext::StartElement(mxAttrList);
2393 	}
2394 }
2395 
2396 void SdXMLGraphicObjectShapeContext::EndElement()
2397 {
2398 	if( mxBase64Stream.is() )
2399 	{
2400 		OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) );
2401 		if( sURL.getLength() )
2402 		{
2403 			try
2404 			{
2405 				uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2406 				if(xProps.is())
2407 				{
2408 					const uno::Any aAny( uno::makeAny( sURL ) );
2409 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2410 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2411 				}
2412 			}
2413 			catch (lang::IllegalArgumentException const &)
2414 			{
2415 			}
2416 		}
2417 	}
2418 
2419 	SdXMLShapeContext::EndElement();
2420 }
2421 
2422 
2423 //////////////////////////////////////////////////////////////////////////////
2424 
2425 SvXMLImportContext* SdXMLGraphicObjectShapeContext::CreateChildContext(
2426 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2427 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2428 {
2429 	SvXMLImportContext* pContext = NULL;
2430 
2431 	if( (XML_NAMESPACE_OFFICE == nPrefix) &&
2432 			 xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) )
2433 	{
2434 		if( !maURL.getLength() && !mxBase64Stream.is() )
2435 		{
2436 			mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
2437 			if( mxBase64Stream.is() )
2438 				pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2439 													rLocalName, xAttrList,
2440 													mxBase64Stream );
2441 		}
2442 	}
2443 
2444 	// delegate to parent class if no context could be created
2445 	if ( NULL == pContext )
2446 		pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName,
2447 														 xAttrList);
2448 
2449 	return pContext;
2450 }
2451 
2452 //////////////////////////////////////////////////////////////////////////////
2453 
2454 SdXMLGraphicObjectShapeContext::~SdXMLGraphicObjectShapeContext()
2455 {
2456 
2457 }
2458 
2459 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2460 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2461 
2462 TYPEINIT1( SdXMLChartShapeContext, SdXMLShapeContext );
2463 
2464 SdXMLChartShapeContext::SdXMLChartShapeContext(
2465 	SvXMLImport& rImport,
2466 	sal_uInt16 nPrfx,
2467 	const OUString& rLocalName,
2468 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2469 	uno::Reference< drawing::XShapes >& rShapes,
2470     sal_Bool bTemporaryShape)
2471 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2472 	mpChartContext( NULL )
2473 {
2474 }
2475 
2476 //////////////////////////////////////////////////////////////////////////////
2477 
2478 SdXMLChartShapeContext::~SdXMLChartShapeContext()
2479 {
2480 	if( mpChartContext )
2481 		delete mpChartContext;
2482 }
2483 
2484 //////////////////////////////////////////////////////////////////////////////
2485 
2486 void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2487 {
2488 	const sal_Bool bIsPresentation = isPresentationShape();
2489 
2490 	AddShape( bIsPresentation ? "com.sun.star.presentation.ChartShape" : "com.sun.star.drawing.OLE2Shape" );
2491 
2492 	if(mxShape.is())
2493 	{
2494 		SetStyle();
2495 		SetLayer();
2496 
2497 		if( !mbIsPlaceholder )
2498 		{
2499 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2500 			if(xProps.is())
2501 			{
2502 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2503 				if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2504 					xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2505 
2506 				uno::Any aAny;
2507 
2508 				const OUString aCLSID( RTL_CONSTASCII_USTRINGPARAM("12DCAE26-281F-416F-a234-c3086127382e"));
2509 
2510 				aAny <<= aCLSID;
2511 				xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), aAny );
2512 
2513 #ifndef SVX_LIGHT
2514 				aAny = xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) );
2515 				uno::Reference< frame::XModel > xChartModel;
2516 				if( aAny >>= xChartModel )
2517 				{
2518 					mpChartContext = GetImport().GetChartImport()->CreateChartContext( GetImport(), XML_NAMESPACE_SVG, GetXMLToken(XML_CHART), xChartModel, xAttrList );
2519 				}
2520 #endif
2521 			}
2522 		}
2523 
2524 		if(mbIsUserTransformed)
2525 		{
2526 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2527 			if(xProps.is())
2528 			{
2529 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2530 				if( xPropsInfo.is() )
2531 				{
2532 					if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2533 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2534 				}
2535 			}
2536 		}
2537 
2538 
2539 		// set pos, size, shear and rotate
2540 		SetTransformation();
2541 
2542 		SdXMLShapeContext::StartElement(xAttrList);
2543 
2544 		if( mpChartContext )
2545 			mpChartContext->StartElement( xAttrList );
2546 	}
2547 }
2548 
2549 void SdXMLChartShapeContext::EndElement()
2550 {
2551 	if( mpChartContext )
2552 		mpChartContext->EndElement();
2553 
2554 	SdXMLShapeContext::EndElement();
2555 }
2556 
2557 void SdXMLChartShapeContext::Characters( const ::rtl::OUString& rChars )
2558 {
2559 	if( mpChartContext )
2560 		mpChartContext->Characters( rChars );
2561 }
2562 
2563 SvXMLImportContext * SdXMLChartShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2564 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2565 {
2566 	if( mpChartContext )
2567 		return mpChartContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
2568 
2569 	return NULL;
2570 }
2571 
2572 //////////////////////////////////////////////////////////////////////////////
2573 
2574 TYPEINIT1( SdXMLObjectShapeContext, SdXMLShapeContext );
2575 
2576 SdXMLObjectShapeContext::SdXMLObjectShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2577 		const rtl::OUString& rLocalName,
2578 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2579 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2580         sal_Bool bTemporaryShape)
2581 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
2582 {
2583 }
2584 
2585 SdXMLObjectShapeContext::~SdXMLObjectShapeContext()
2586 {
2587 }
2588 
2589 void SdXMLObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2590 {
2591 	// #96717# in theorie, if we don't have a url we shouldn't even
2592 	// export this ole shape. But practical its to risky right now
2593 	// to change this so we better dispose this on load
2594 	//if( !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2595 	//	return;
2596 
2597 	// #100592# this BugFix prevents that a shape is created. CL
2598 	// is thinking about an alternative.
2599     // #i13140# Check for more than empty string in maHref, there are
2600     // other possibilities that maHref results in empty container
2601     // storage names
2602 	if( !(GetImport().getImportFlags() & IMPORT_EMBEDDED) && !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2603 		return;
2604 
2605 	const char* pService = "com.sun.star.drawing.OLE2Shape";
2606 
2607 	sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
2608 
2609 	if( bIsPresShape )
2610 	{
2611 		if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) )
2612 		{
2613 			pService = "com.sun.star.presentation.ChartShape";
2614 		}
2615 		else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
2616 		{
2617 			pService = "com.sun.star.presentation.CalcShape";
2618 		}
2619 		else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
2620 		{
2621 			pService = "com.sun.star.presentation.OLE2Shape";
2622 		}
2623 	}
2624 
2625 	AddShape( pService );
2626 
2627 	if( mxShape.is() )
2628 	{
2629 		SetLayer();
2630 
2631 		if(bIsPresShape)
2632 		{
2633 			uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2634 			if(xProps.is())
2635 			{
2636 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2637 				if( xPropsInfo.is() )
2638 				{
2639 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2640 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2641 
2642 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2643 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2644 				}
2645 			}
2646 		}
2647 
2648 		if( !mbIsPlaceholder && maHref.getLength() )
2649 		{
2650         	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2651 
2652             if( xProps.is() )
2653         	{
2654 				OUString aPersistName = GetImport().ResolveEmbeddedObjectURL( maHref, maCLSID );
2655 
2656 				if ( GetImport().IsPackageURL( maHref ) )
2657 				{
2658 					const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2659 
2660 					if ( aPersistName.compareTo( sURL, sURL.getLength() ) == 0 )
2661 						aPersistName = aPersistName.copy( sURL.getLength() );
2662 
2663         			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ),
2664 											  uno::makeAny( aPersistName ) );
2665 				}
2666 				else
2667 				{
2668 					// this is OOo link object
2669 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LinkURL" ) ),
2670 											  uno::makeAny( aPersistName ) );
2671 				}
2672 			}
2673 		}
2674 
2675 		// set pos, size, shear and rotate
2676 		SetTransformation();
2677 
2678 		SetStyle();
2679 
2680 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2681 	}
2682 }
2683 
2684 void SdXMLObjectShapeContext::EndElement()
2685 {
2686     // #i67705#
2687     const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion());
2688 
2689     if(nGeneratorVersion < SvXMLImport::OOo_34x)
2690     {
2691         // #i118485#
2692         // If it's an old file from us written before OOo3.4, we need to correct
2693         // FillStyle and LineStyle for OLE2 objects. The error was that the old paint
2694         // implementations just ignored added fill/linestyles completely, thus
2695         // those objects need to be corrected to not show blue and hairline which
2696         // always was the default, but would be shown now
2697 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2698 
2699         if( xProps.is() )
2700         {
2701             xProps->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), uno::makeAny(drawing::FillStyle_NONE));
2702             xProps->setPropertyValue(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineStyle")), uno::makeAny(drawing::LineStyle_NONE));
2703         }
2704     }
2705 
2706     // #100592#
2707 	if( mxBase64Stream.is() )
2708 	{
2709 		OUString aPersistName( GetImport().ResolveEmbeddedObjectURLFromBase64() );
2710 		const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2711 
2712         aPersistName = aPersistName.copy( sURL.getLength() );
2713 
2714 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2715 		if( xProps.is() )
2716 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ), uno::makeAny( aPersistName ) );
2717 	}
2718 
2719 	SdXMLShapeContext::EndElement();
2720 }
2721 
2722 // this is called from the parent group for each unparsed attribute in the attribute list
2723 void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2724 {
2725 	switch( nPrefix )
2726 	{
2727 	case XML_NAMESPACE_DRAW:
2728 		if( IsXMLToken( rLocalName, XML_CLASS_ID ) )
2729 		{
2730 			maCLSID = rValue;
2731 			return;
2732 		}
2733 		break;
2734 	case XML_NAMESPACE_XLINK:
2735 		if( IsXMLToken( rLocalName, XML_HREF ) )
2736 		{
2737 			maHref = rValue;
2738 			return;
2739 		}
2740 		break;
2741 	}
2742 
2743 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2744 }
2745 
2746 SvXMLImportContext* SdXMLObjectShapeContext::CreateChildContext(
2747 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2748 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2749 {
2750 	// #100592#
2751 	SvXMLImportContext* pContext = NULL;
2752 
2753 	if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA))
2754 	{
2755 		mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64();
2756 		if( mxBase64Stream.is() )
2757 			pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2758 												rLocalName, xAttrList,
2759 												mxBase64Stream );
2760 	}
2761 	else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) ||
2762 				((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) )
2763 	{
2764 		XMLEmbeddedObjectImportContext *pEContext =
2765 			new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
2766 												rLocalName, xAttrList );
2767 		maCLSID = pEContext->GetFilterCLSID();
2768 		if( maCLSID.getLength() != 0 )
2769 		{
2770 			uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2771 			if( xPropSet.is() )
2772 			{
2773 				xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), uno::makeAny( maCLSID ) );
2774 
2775 				uno::Reference< lang::XComponent > xComp;
2776 				xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp;
2777 				DBG_ASSERT( xComp.is(), "no xModel for own OLE format" );
2778 				pEContext->SetComponent( xComp );
2779 			}
2780 		}
2781 		pContext = pEContext;
2782 	}
2783 
2784 	// delegate to parent class if no context could be created
2785 	if(!pContext)
2786 		pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
2787 
2788 	return pContext;
2789 }
2790 
2791 //////////////////////////////////////////////////////////////////////////////
2792 
2793 TYPEINIT1( SdXMLAppletShapeContext, SdXMLShapeContext );
2794 
2795 SdXMLAppletShapeContext::SdXMLAppletShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2796 		const rtl::OUString& rLocalName,
2797 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2798 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2799         sal_Bool bTemporaryShape)
2800 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2801   mbIsScript( sal_False )
2802 {
2803 }
2804 
2805 SdXMLAppletShapeContext::~SdXMLAppletShapeContext()
2806 {
2807 }
2808 
2809 void SdXMLAppletShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2810 {
2811 	const char* pService = "com.sun.star.drawing.AppletShape";
2812 	AddShape( pService );
2813 
2814 	if( mxShape.is() )
2815 	{
2816 		SetLayer();
2817 
2818 		// set pos, size, shear and rotate
2819 		SetTransformation();
2820 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2821 	}
2822 }
2823 
2824 // this is called from the parent group for each unparsed attribute in the attribute list
2825 void SdXMLAppletShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2826 {
2827 	switch( nPrefix )
2828 	{
2829 	case XML_NAMESPACE_DRAW:
2830 		if( IsXMLToken( rLocalName, XML_APPLET_NAME ) )
2831 		{
2832 			maAppletName = rValue;
2833 			return;
2834 		}
2835 		if( IsXMLToken( rLocalName, XML_CODE ) )
2836 		{
2837 			maAppletCode = rValue;
2838 			return;
2839 		}
2840 		if( IsXMLToken( rLocalName, XML_MAY_SCRIPT ) )
2841 		{
2842 			mbIsScript = IsXMLToken( rValue, XML_TRUE );
2843 			return;
2844 		}
2845 		break;
2846 	case XML_NAMESPACE_XLINK:
2847 		if( IsXMLToken( rLocalName, XML_HREF ) )
2848 		{
2849 			maHref = GetImport().GetAbsoluteReference(rValue);
2850 			return;
2851 		}
2852 		break;
2853 	}
2854 
2855 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2856 }
2857 
2858 void SdXMLAppletShapeContext::EndElement()
2859 {
2860 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2861 	if( xProps.is() )
2862 	{
2863 		uno::Any aAny;
2864 
2865 		if ( maSize.Width && maSize.Height )
2866 		{
2867 			// the visual area for applet must be set on loading
2868 			awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
2869 			aAny <<= aRect;
2870 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
2871 		}
2872 
2873 		if( maParams.getLength() )
2874 		{
2875 			aAny <<= maParams;
2876 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ), aAny );
2877 		}
2878 
2879 		if( maHref.getLength() )
2880 		{
2881 			aAny <<= maHref;
2882 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ), aAny );
2883 		}
2884 
2885 		if( maAppletName.getLength() )
2886 		{
2887 			aAny <<= maAppletName;
2888 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ), aAny );
2889 		}
2890 
2891 		if( mbIsScript )
2892 		{
2893 			aAny <<= mbIsScript;
2894 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ), aAny );
2895 
2896 		}
2897 
2898 		if( maAppletCode.getLength() )
2899 		{
2900 			aAny <<= maAppletCode;
2901 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ), aAny );
2902 		}
2903 
2904         aAny <<= ::rtl::OUString( GetImport().GetDocumentBase() );
2905         xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletDocBase" ) ), aAny );
2906 
2907 		SetThumbnail();
2908 	}
2909 
2910 	SdXMLShapeContext::EndElement();
2911 }
2912 
2913 SvXMLImportContext * SdXMLAppletShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2914 {
2915 	if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
2916 	{
2917 		OUString aParamName, aParamValue;
2918 		const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
2919 		// now parse the attribute list and look for draw:name and draw:value
2920 		for(sal_Int16 a(0); a < nAttrCount; a++)
2921 		{
2922 			const OUString& rAttrName = xAttrList->getNameByIndex(a);
2923 			OUString aLocalName;
2924 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
2925 			const OUString aValue( xAttrList->getValueByIndex(a) );
2926 
2927 			if( nPrefix == XML_NAMESPACE_DRAW )
2928 			{
2929 				if( IsXMLToken( aLocalName, XML_NAME ) )
2930 				{
2931 					aParamName = aValue;
2932 				}
2933 				else if( IsXMLToken( aLocalName, XML_VALUE ) )
2934 				{
2935 					aParamValue = aValue;
2936 				}
2937 			}
2938 		}
2939 
2940 		if( aParamName.getLength() )
2941 		{
2942 			sal_Int32 nIndex = maParams.getLength();
2943 			maParams.realloc( nIndex + 1 );
2944 			maParams[nIndex].Name = aParamName;
2945 			maParams[nIndex].Handle = -1;
2946 			maParams[nIndex].Value <<= aParamValue;
2947 			maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
2948 		}
2949 
2950 		return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
2951 	}
2952 
2953 	return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
2954 }
2955 
2956 //////////////////////////////////////////////////////////////////////////////
2957 
2958 TYPEINIT1( SdXMLPluginShapeContext, SdXMLShapeContext );
2959 
2960 SdXMLPluginShapeContext::SdXMLPluginShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2961 		const rtl::OUString& rLocalName,
2962 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2963 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2964         sal_Bool bTemporaryShape) :
2965 SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2966 mbMedia( false )
2967 {
2968 }
2969 
2970 SdXMLPluginShapeContext::~SdXMLPluginShapeContext()
2971 {
2972 }
2973 
2974 void SdXMLPluginShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList)
2975 {
2976 	// watch for MimeType attribute to see if we have a media object
2977 	for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
2978 	{
2979 		OUString 	aLocalName;
2980 		sal_uInt16 	nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
2981 
2982 		if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
2983 		{
2984 			if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) )
2985 				mbMedia = true;
2986 
2987 			// leave this loop
2988 			n = nAttrCount - 1;
2989 		}
2990 	}
2991 
2992 	const char* pService;
2993 
2994 	sal_Bool bIsPresShape = sal_False;
2995 
2996 	if( mbMedia )
2997 	{
2998 		pService = "com.sun.star.drawing.MediaShape";
2999 
3000 		bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3001 		if( bIsPresShape )
3002 		{
3003 			if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3004 			{
3005 				pService = "com.sun.star.presentation.MediaShape";
3006 			}
3007 		}
3008 	}
3009 	else
3010 		pService = "com.sun.star.drawing.PluginShape";
3011 
3012 	AddShape( pService );
3013 
3014 	if( mxShape.is() )
3015 	{
3016 		SetLayer();
3017 
3018 		if(bIsPresShape)
3019 		{
3020 			uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3021 			if(xProps.is())
3022 			{
3023 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3024 				if( xPropsInfo.is() )
3025 				{
3026 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3027 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3028 
3029 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3030 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3031 				}
3032 			}
3033 		}
3034 
3035 		// set pos, size, shear and rotate
3036 		SetTransformation();
3037 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3038 	}
3039 }
3040 
3041 // this is called from the parent group for each unparsed attribute in the attribute list
3042 void SdXMLPluginShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3043 {
3044 	switch( nPrefix )
3045 	{
3046 	case XML_NAMESPACE_DRAW:
3047 		if( IsXMLToken( rLocalName, XML_MIME_TYPE ) )
3048 		{
3049 			maMimeType = rValue;
3050 			return;
3051 		}
3052 		break;
3053 	case XML_NAMESPACE_XLINK:
3054 		if( IsXMLToken( rLocalName, XML_HREF ) )
3055 		{
3056 			maHref = GetImport().GetAbsoluteReference(rValue);
3057 			return;
3058 		}
3059 		break;
3060 	}
3061 
3062 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3063 }
3064 
3065 void SdXMLPluginShapeContext::EndElement()
3066 {
3067 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3068 
3069 	if( xProps.is() )
3070 	{
3071 		uno::Any aAny;
3072 
3073 		if ( maSize.Width && maSize.Height )
3074 		{
3075 			const rtl::OUString sVisibleArea( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) );
3076 			uno::Reference< beans::XPropertySetInfo > aXPropSetInfo( xProps->getPropertySetInfo() );
3077             if ( !aXPropSetInfo.is() || aXPropSetInfo->hasPropertyByName( sVisibleArea ) )
3078 			{
3079 				// the visual area for a plugin must be set on loading
3080 				awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3081 				aAny <<= aRect;
3082 				xProps->setPropertyValue( sVisibleArea, aAny );
3083 			}
3084 		}
3085 
3086 		if( !mbMedia )
3087 		{
3088 			// in case we have a plugin object
3089 			if( maParams.getLength() )
3090 			{
3091 				aAny <<= maParams;
3092 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ), aAny );
3093 			}
3094 
3095 			if( maMimeType.getLength() )
3096 			{
3097 				aAny <<= maMimeType;
3098 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ), aAny );
3099 			}
3100 
3101 			if( maHref.getLength() )
3102 			{
3103 				aAny <<= maHref;
3104 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ), aAny );
3105 			}
3106 		}
3107 		else
3108 		{
3109 			// in case we have a media object
3110 
3111 			OUString sTempRef;
3112 
3113 			// check for package URL
3114 			if( GetImport().IsPackageURL( maHref ) )
3115 			{
3116 			    sTempRef = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
3117 			}
3118 
3119 			sTempRef += maHref;
3120 
3121 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ), uno::makeAny( sTempRef ) );
3122 
3123 			for( sal_Int32 nParam = 0; nParam < maParams.getLength(); ++nParam )
3124 			{
3125 				const OUString& rName = maParams[ nParam ].Name;
3126 
3127 				if( 0 == rName.compareToAscii( "Loop" ) )
3128 				{
3129 					OUString aValueStr;
3130 					maParams[ nParam ].Value >>= aValueStr;
3131 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) ),
3132 						uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3133 				}
3134 				else if( 0 == rName.compareToAscii( "Mute" ) )
3135 				{
3136 					OUString aValueStr;
3137 					maParams[ nParam ].Value >>= aValueStr;
3138 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) ),
3139 						uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3140 				}
3141 				else if( 0 == rName.compareToAscii( "VolumeDB" ) )
3142 				{
3143 					OUString aValueStr;
3144 					maParams[ nParam ].Value >>= aValueStr;
3145 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ),
3146 					                            uno::makeAny( static_cast< sal_Int16 >( aValueStr.toInt32() ) ) );
3147 				}
3148 				else if( 0 == rName.compareToAscii( "Zoom" ) )
3149 				{
3150 					OUString 			aZoomStr;
3151 					media::ZoomLevel	eZoomLevel;
3152 
3153 					maParams[ nParam ].Value >>= aZoomStr;
3154 
3155 					if( 0 == aZoomStr.compareToAscii( "25%" ) )
3156 						eZoomLevel = media::ZoomLevel_ZOOM_1_TO_4;
3157 					else if( 0 == aZoomStr.compareToAscii( "50%" ) )
3158 						eZoomLevel = media::ZoomLevel_ZOOM_1_TO_2;
3159 					else if( 0 == aZoomStr.compareToAscii( "100%" ) )
3160 						eZoomLevel = media::ZoomLevel_ORIGINAL;
3161 					else if( 0 == aZoomStr.compareToAscii( "200%" ) )
3162 						eZoomLevel = media::ZoomLevel_ZOOM_2_TO_1;
3163 					else if( 0 == aZoomStr.compareToAscii( "400%" ) )
3164 						eZoomLevel = media::ZoomLevel_ZOOM_4_TO_1;
3165 					else if( 0 == aZoomStr.compareToAscii( "fit" ) )
3166 						eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW;
3167 					else if( 0 == aZoomStr.compareToAscii( "fixedfit" ) )
3168 						eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT;
3169 					else if( 0 == aZoomStr.compareToAscii( "fullscreen" ) )
3170 						eZoomLevel = media::ZoomLevel_FULLSCREEN;
3171 					else
3172 						eZoomLevel = media::ZoomLevel_NOT_AVAILABLE;
3173 
3174 					xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ), uno::makeAny( eZoomLevel ) );
3175 				}
3176 			}
3177 		}
3178 
3179 		SetThumbnail();
3180 	}
3181 
3182 	SdXMLShapeContext::EndElement();
3183 }
3184 
3185 SvXMLImportContext * SdXMLPluginShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3186 {
3187 	if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3188 	{
3189 		OUString aParamName, aParamValue;
3190 		const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3191 		// now parse the attribute list and look for draw:name and draw:value
3192 		for(sal_Int16 a(0); a < nAttrCount; a++)
3193 		{
3194 			const OUString& rAttrName = xAttrList->getNameByIndex(a);
3195 			OUString aLocalName;
3196 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3197 			const OUString aValue( xAttrList->getValueByIndex(a) );
3198 
3199 			if( nPrefix == XML_NAMESPACE_DRAW )
3200 			{
3201 				if( IsXMLToken( aLocalName, XML_NAME ) )
3202 				{
3203 					aParamName = aValue;
3204 				}
3205 				else if( IsXMLToken( aLocalName, XML_VALUE ) )
3206 				{
3207 					aParamValue = aValue;
3208 				}
3209 			}
3210 
3211 			if( aParamName.getLength() )
3212 			{
3213 				sal_Int32 nIndex = maParams.getLength();
3214 				maParams.realloc( nIndex + 1 );
3215 				maParams[nIndex].Name = aParamName;
3216 				maParams[nIndex].Handle = -1;
3217 				maParams[nIndex].Value <<= aParamValue;
3218 				maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3219 			}
3220 		}
3221 
3222 		return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3223 	}
3224 
3225 	return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3226 }
3227 
3228 //////////////////////////////////////////////////////////////////////////////
3229 
3230 TYPEINIT1( SdXMLFloatingFrameShapeContext, SdXMLShapeContext );
3231 
3232 SdXMLFloatingFrameShapeContext::SdXMLFloatingFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3233 		const rtl::OUString& rLocalName,
3234 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3235 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3236         sal_Bool bTemporaryShape)
3237 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3238 {
3239 }
3240 
3241 SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
3242 {
3243 }
3244 
3245 void SdXMLFloatingFrameShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
3246 {
3247 	const char* pService = "com.sun.star.drawing.FrameShape";
3248 	AddShape( pService );
3249 
3250 	if( mxShape.is() )
3251 	{
3252 		SetLayer();
3253 
3254 		// set pos, size, shear and rotate
3255 		SetTransformation();
3256 
3257 		uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3258 		if( xProps.is() )
3259 		{
3260 			uno::Any aAny;
3261 
3262 			if( maFrameName.getLength() )
3263 			{
3264 				aAny <<= maFrameName;
3265 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ), aAny );
3266 			}
3267 
3268 			if( maHref.getLength() )
3269 			{
3270 				aAny <<= maHref;
3271 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ), aAny );
3272 			}
3273 		}
3274 
3275 		SetStyle();
3276 
3277 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3278 	}
3279 }
3280 
3281 // this is called from the parent group for each unparsed attribute in the attribute list
3282 void SdXMLFloatingFrameShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3283 {
3284 	switch( nPrefix )
3285 	{
3286 	case XML_NAMESPACE_DRAW:
3287 		if( IsXMLToken( rLocalName, XML_FRAME_NAME ) )
3288 		{
3289 			maFrameName = rValue;
3290 			return;
3291 		}
3292 		break;
3293 	case XML_NAMESPACE_XLINK:
3294 		if( IsXMLToken( rLocalName, XML_HREF ) )
3295 		{
3296 			maHref = GetImport().GetAbsoluteReference(rValue);
3297 			return;
3298 		}
3299 		break;
3300 	}
3301 
3302 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3303 }
3304 
3305 void SdXMLFloatingFrameShapeContext::EndElement()
3306 {
3307 	uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3308 
3309 	if( xProps.is() )
3310 	{
3311 		if ( maSize.Width && maSize.Height )
3312 		{
3313 			// the visual area for a floating frame must be set on loading
3314 			awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3315 			uno::Any aAny;
3316 			aAny <<= aRect;
3317 			xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
3318 		}
3319 	}
3320 
3321 	SetThumbnail();
3322 	SdXMLShapeContext::EndElement();
3323 }
3324 
3325 //////////////////////////////////////////////////////////////////////////////
3326 
3327 TYPEINIT1( SdXMLFrameShapeContext, SdXMLShapeContext );
3328 
3329 SdXMLFrameShapeContext::SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3330 		const rtl::OUString& rLocalName,
3331 		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3332 		com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3333         sal_Bool bTemporaryShape)
3334 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3335 	mbSupportsReplacement( sal_False )
3336 {
3337 	uno::Reference < util::XCloneable > xClone( xAttrList, uno::UNO_QUERY );
3338 	if( xClone.is() )
3339 		mxAttrList.set( xClone->createClone(), uno::UNO_QUERY );
3340 	else
3341 		mxAttrList = new SvXMLAttributeList( xAttrList );
3342 
3343 }
3344 
3345 SdXMLFrameShapeContext::~SdXMLFrameShapeContext()
3346 {
3347 }
3348 
3349 SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPrefix,
3350 	const OUString& rLocalName,
3351 	const uno::Reference< xml::sax::XAttributeList>& xAttrList )
3352 {
3353 	SvXMLImportContext * pContext = 0;
3354 
3355 	if( !mxImplContext.Is() )
3356 	{
3357 		pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3358 						GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList );
3359 
3360 		mxImplContext = pContext;
3361 		mbSupportsReplacement = IsXMLToken( rLocalName, XML_OBJECT ) ||
3362 								IsXMLToken( rLocalName, XML_OBJECT_OLE );
3363 	}
3364 	else if( mbSupportsReplacement && !mxReplImplContext &&
3365 			 XML_NAMESPACE_DRAW == nPrefix &&
3366 			 IsXMLToken( rLocalName, XML_IMAGE ) )
3367 	{
3368 		// read replacement image
3369 		SvXMLImportContext *pImplContext = &mxImplContext;
3370 		SdXMLShapeContext *pSContext =
3371 			PTR_CAST( SdXMLShapeContext, pImplContext );
3372 		if( pSContext )
3373 		{
3374 			uno::Reference < beans::XPropertySet > xPropSet(
3375 					pSContext->getShape(), uno::UNO_QUERY );
3376 			if( xPropSet.is() )
3377 			{
3378 				pContext = new XMLReplacementImageContext( GetImport(),
3379 									nPrefix, rLocalName, xAttrList, xPropSet );
3380 				mxReplImplContext = pContext;
3381 			}
3382 		}
3383 	}
3384 	else if(
3385 			( nPrefix == XML_NAMESPACE_SVG &&	// #i68101#
3386 				(IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) ||
3387 			 (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) ||
3388 			 (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) ||
3389 												IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) )
3390 	{
3391 		SvXMLImportContext *pImplContext = &mxImplContext;
3392 		pContext = PTR_CAST( SdXMLShapeContext, pImplContext )->CreateChildContext( nPrefix,
3393 																		rLocalName, xAttrList );
3394 	}
3395 	else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
3396 	{
3397 		SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( &mxImplContext );
3398 		if( pSContext )
3399 		{
3400 			uno::Reference < beans::XPropertySet > xPropSet( pSContext->getShape(), uno::UNO_QUERY );
3401 			if (xPropSet.is())
3402 			{
3403 				pContext = new XMLImageMapContext(GetImport(), nPrefix, rLocalName, xPropSet);
3404 			}
3405 		}
3406 	}
3407 
3408 	// call parent for content
3409 	if(!pContext)
3410 		pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
3411 
3412 	return pContext;
3413 }
3414 
3415 void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
3416 {
3417 	// ignore
3418 }
3419 
3420 void SdXMLFrameShapeContext::EndElement()
3421 {
3422 	if( !mxImplContext.Is() )
3423 	{
3424 		// now check if this is an empty presentation object
3425 		sal_Int16 nAttrCount = mxAttrList.is() ? mxAttrList->getLength() : 0;
3426 		for(sal_Int16 a(0); a < nAttrCount; a++)
3427 		{
3428 			OUString aLocalName;
3429 			sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(mxAttrList->getNameByIndex(a), &aLocalName);
3430 
3431 			if( nPrefix == XML_NAMESPACE_PRESENTATION )
3432 			{
3433 				if( IsXMLToken( aLocalName, XML_PLACEHOLDER ) )
3434 				{
3435 					mbIsPlaceholder = IsXMLToken( mxAttrList->getValueByIndex(a), XML_TRUE );
3436 				}
3437 				else if( IsXMLToken( aLocalName, XML_CLASS ) )
3438 				{
3439 					maPresentationClass = mxAttrList->getValueByIndex(a);
3440 				}
3441 			}
3442 		}
3443 
3444 		if( (maPresentationClass.getLength() != 0) && mbIsPlaceholder )
3445 		{
3446 			uno::Reference< xml::sax::XAttributeList> xEmpty;
3447 
3448 			enum XMLTokenEnum eToken = XML_TEXT_BOX;
3449 
3450 			if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) )
3451 			{
3452 				eToken = XML_IMAGE;
3453 
3454 			}
3455 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
3456 			{
3457 				eToken = XML_PAGE_THUMBNAIL;
3458 			}
3459 			else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) ||
3460 					 IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ||
3461 					 IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3462 			{
3463 				eToken = XML_OBJECT;
3464 			}
3465 
3466 			mxImplContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3467 					GetImport(), XML_NAMESPACE_DRAW, GetXMLToken( eToken ), mxAttrList, mxShapes, xEmpty );
3468 
3469 			if( mxImplContext.Is() )
3470 			{
3471 				mxImplContext->StartElement( mxAttrList );
3472 				mxImplContext->EndElement();
3473 			}
3474 		}
3475 	}
3476 
3477 	mxImplContext = 0;
3478 	SdXMLShapeContext::EndElement();
3479 }
3480 
3481 void SdXMLFrameShapeContext::processAttribute( sal_uInt16,
3482 		const ::rtl::OUString&, const ::rtl::OUString& )
3483 {
3484 	// ignore
3485 }
3486 
3487 TYPEINIT1( SdXMLCustomShapeContext, SdXMLShapeContext );
3488 
3489 SdXMLCustomShapeContext::SdXMLCustomShapeContext(
3490 	SvXMLImport& rImport,
3491 	sal_uInt16 nPrfx,
3492 	const OUString& rLocalName,
3493 	const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3494 	uno::Reference< drawing::XShapes >& rShapes,
3495     sal_Bool bTemporaryShape)
3496 :	SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3497 {
3498 }
3499 
3500 //////////////////////////////////////////////////////////////////////////////
3501 
3502 SdXMLCustomShapeContext::~SdXMLCustomShapeContext()
3503 {
3504 }
3505 
3506 //////////////////////////////////////////////////////////////////////////////
3507 
3508 // this is called from the parent group for each unparsed attribute in the attribute list
3509 void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3510 {
3511 	if( XML_NAMESPACE_DRAW == nPrefix )
3512 	{
3513 		if( IsXMLToken( rLocalName, XML_ENGINE ) )
3514 		{
3515 			maCustomShapeEngine = rValue;
3516 			return;
3517 		}
3518 		if ( IsXMLToken( rLocalName, XML_DATA ) )
3519 		{
3520 			maCustomShapeData = rValue;
3521 			return;
3522 		}
3523 	}
3524 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3525 }
3526 
3527 //////////////////////////////////////////////////////////////////////////////
3528 
3529 void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
3530 {
3531 	// create rectangle shape
3532 	AddShape("com.sun.star.drawing.CustomShape");
3533 	if ( mxShape.is() )
3534 	{
3535 		// Add, set Style and properties from base shape
3536 		SetStyle();
3537 		SetLayer();
3538 
3539 		// set pos, size, shear and rotate
3540 		SetTransformation();
3541 
3542 		try
3543 		{
3544 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3545 			if( xPropSet.is() )
3546 			{
3547 				if ( maCustomShapeEngine.getLength() )
3548 				{
3549 					uno::Any aAny;
3550 					aAny <<= maCustomShapeEngine;
3551 					xPropSet->setPropertyValue( EASGet( EAS_CustomShapeEngine ), aAny );
3552 				}
3553 				if ( maCustomShapeData.getLength() )
3554 				{
3555 					uno::Any aAny;
3556 					aAny <<= maCustomShapeData;
3557 					xPropSet->setPropertyValue( EASGet( EAS_CustomShapeData ), aAny );
3558 				}
3559 			}
3560 		}
3561 		catch( uno::Exception& )
3562 		{
3563 			DBG_ERROR( "could not set enhanced customshape geometry" );
3564 		}
3565 		SdXMLShapeContext::StartElement(xAttrList);
3566 	}
3567 }
3568 
3569 void SdXMLCustomShapeContext::EndElement()
3570 {
3571 	if ( !maCustomShapeGeometry.empty() )
3572 	{
3573 		const rtl::OUString	sCustomShapeGeometry	( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeGeometry" ) );
3574 
3575 		// converting the vector to a sequence
3576 		uno::Sequence< beans::PropertyValue > aSeq( maCustomShapeGeometry.size() );
3577 		beans::PropertyValue* pValues = aSeq.getArray();
3578 		std::vector< beans::PropertyValue >::const_iterator aIter( maCustomShapeGeometry.begin() );
3579 		std::vector< beans::PropertyValue >::const_iterator aEnd( maCustomShapeGeometry.end() );
3580 		while ( aIter != aEnd )
3581 			*pValues++ = *aIter++;
3582 
3583 		try
3584 		{
3585 			uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3586 			if( xPropSet.is() )
3587 			{
3588 				uno::Any aAny;
3589 				aAny <<= aSeq;
3590 				xPropSet->setPropertyValue( sCustomShapeGeometry, aAny );
3591 			}
3592 		}
3593 		catch( uno::Exception& )
3594 		{
3595 			DBG_ERROR( "could not set enhanced customshape geometry" );
3596 		}
3597 
3598         sal_Int32 nUPD( 0 );
3599         sal_Int32 nBuild( 0 );
3600         GetImport().getBuildIds( nUPD, nBuild );
3601         if( ((nUPD >= 640 && nUPD <= 645) || (nUPD == 680)) && (nBuild <= 9221) )
3602 		{
3603 			Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( mxShape, UNO_QUERY );
3604 			if( xDefaulter.is() )
3605 			{
3606 				rtl::OUString aEmptyType;
3607 				xDefaulter->createCustomShapeDefaults( aEmptyType );
3608 			}
3609 		}
3610 	}
3611 
3612 	SdXMLShapeContext::EndElement();
3613 }
3614 
3615 //////////////////////////////////////////////////////////////////////////////
3616 
3617 SvXMLImportContext* SdXMLCustomShapeContext::CreateChildContext(
3618 	sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
3619 	const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3620 {
3621 	SvXMLImportContext* pContext = NULL;
3622 	if ( XML_NAMESPACE_DRAW == nPrefix )
3623 	{
3624 		if ( IsXMLToken( rLocalName, XML_ENHANCED_GEOMETRY ) )
3625 		{
3626 			uno::Reference< beans::XPropertySet > xPropSet( mxShape,uno::UNO_QUERY );
3627 			if ( xPropSet.is() )
3628 				pContext = new XMLEnhancedCustomShapeContext( GetImport(), mxShape, nPrefix, rLocalName, maCustomShapeGeometry );
3629 		}
3630 	}
3631 	// delegate to parent class if no context could be created
3632 	if ( NULL == pContext )
3633 		pContext = SdXMLShapeContext::CreateChildContext( nPrefix, rLocalName,
3634 														 xAttrList);
3635 	return pContext;
3636 }
3637 
3638 ///////////////////////////////////////////////////////////////////////
3639 
3640 //////////////////////////////////////////////////////////////////////////////
3641 
3642 TYPEINIT1( SdXMLTableShapeContext, SdXMLShapeContext );
3643 
3644 SdXMLTableShapeContext::SdXMLTableShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes )
3645 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, sal_False )
3646 {
3647 	memset( &maTemplateStylesUsed, 0, sizeof( maTemplateStylesUsed ) );
3648 }
3649 
3650 SdXMLTableShapeContext::~SdXMLTableShapeContext()
3651 {
3652 }
3653 
3654 void SdXMLTableShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
3655 {
3656 	const char* pService = "com.sun.star.drawing.TableShape";
3657 
3658 	sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3659 	if( bIsPresShape )
3660 	{
3661 		if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
3662 		{
3663 			pService = "com.sun.star.presentation.TableShape";
3664 		}
3665 	}
3666 
3667 	AddShape( pService );
3668 
3669 	if( mxShape.is() )
3670 	{
3671 		SetLayer();
3672 
3673 		uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
3674 
3675 		if(bIsPresShape)
3676 		{
3677 			if(xProps.is())
3678 			{
3679 				uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3680 				if( xPropsInfo.is() )
3681 				{
3682 					if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3683 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3684 
3685 					if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3686 						xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3687 				}
3688 			}
3689 		}
3690 
3691 		SetStyle();
3692 
3693 		if( xProps.is() )
3694 		{
3695 			if( msTemplateStyleName.getLength() ) try
3696 			{
3697 				Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetImport().GetModel(), UNO_QUERY_THROW );
3698 				Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
3699 				const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM("table" ) );
3700 				Reference< XNameAccess > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW );
3701 				Reference< XStyle > xTableStyle( xTableFamily->getByName( msTemplateStyleName ), UNO_QUERY_THROW );
3702 				xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TableTemplate" ) ), Any( xTableStyle ) );
3703 			}
3704 			catch( Exception& )
3705 			{
3706 				DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
3707 			}
3708 
3709 			const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
3710 			for( int i = 0; pEntry->msApiName && (i < 6); i++, pEntry++ )
3711 			{
3712 			    try
3713 			    {
3714 				    const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) );
3715 				    xProps->setPropertyValue( sAPIPropertyName, Any( maTemplateStylesUsed[i] ) );
3716 			    }
3717 			    catch( Exception& )
3718 			    {
3719 				    DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
3720 			    }
3721             }
3722 		}
3723 
3724 		GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3725 
3726 		const rtl::Reference< XMLTableImport >& xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() );
3727 		if( xTableImport.is() && xProps.is() )
3728 		{
3729 			uno::Reference< table::XColumnRowRange > xColumnRowRange(
3730 				xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ), uno::UNO_QUERY );
3731 
3732 			if( xColumnRowRange.is() )
3733 				mxTableImportContext = xTableImport->CreateTableContext( GetPrefix(), GetLocalName(), xColumnRowRange );
3734 
3735 			if( mxTableImportContext.Is() )
3736 				mxTableImportContext->StartElement( xAttrList );
3737 		}
3738 	}
3739 }
3740 
3741 void SdXMLTableShapeContext::EndElement()
3742 {
3743 	if( mxTableImportContext.Is() )
3744 		mxTableImportContext->EndElement();
3745 
3746 	SdXMLShapeContext::EndElement();
3747 
3748 	if( mxShape.is() )
3749 	{
3750 		// set pos, size, shear and rotate
3751 		SetTransformation();
3752 	}
3753 }
3754 
3755 // this is called from the parent group for each unparsed attribute in the attribute list
3756 void SdXMLTableShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3757 {
3758 	if( nPrefix == XML_NAMESPACE_TABLE )
3759 	{
3760 		if( IsXMLToken( rLocalName, XML_TEMPLATE_NAME ) )
3761 		{
3762 			msTemplateStyleName = rValue;
3763 		}
3764 		else
3765 		{
3766 			int i = 0;
3767 			const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
3768 			while( pEntry->msApiName && (i < 6) )
3769 			{
3770 				if( IsXMLToken( rLocalName, pEntry->meXMLName ) )
3771 				{
3772 					if( IsXMLToken( rValue, XML_TRUE ) )
3773 						maTemplateStylesUsed[i] = sal_True;
3774 					break;
3775 				}
3776 				pEntry++;
3777 				i++;
3778 			}
3779 		}
3780 	}
3781 	SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3782 }
3783 
3784 SvXMLImportContext* SdXMLTableShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3785 {
3786 	if( mxTableImportContext.Is() && (nPrefix == XML_NAMESPACE_TABLE) )
3787 		return mxTableImportContext->CreateChildContext(nPrefix, rLocalName, xAttrList);
3788 	else
3789 		return SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
3790 }
3791 
3792