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