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