xref: /AOO41X/main/xmloff/source/draw/ximpshap.cxx (revision f3b8b5095ca27138d26caadd2c6fcd6d54dff076)
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 
ImpIsEmptyURL(const::rtl::OUString & rURL)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 
SdXMLShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)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 
~SdXMLShapeContext()172 SdXMLShapeContext::~SdXMLShapeContext()
173 {
174 }
175 
176 //////////////////////////////////////////////////////////////////////////////
177 
CreateChildContext(sal_uInt16 p_nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)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 
addGluePoint(const uno::Reference<xml::sax::XAttributeList> & xAttrList)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 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)343 void SdXMLShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
344 {
345     GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
346 }
347 
EndElement()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 
AddShape(uno::Reference<drawing::XShape> & xShape)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 
AddShape(const char * pServiceName)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 
SetTransformation()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 
SetStyle(bool bSupportsStyle)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 
SetLayer()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 
SetThumbnail()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
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)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 
isPresentationShape() const910 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 
onDemandRescueUsefulDataFromTemporary(const SvXMLImportContext & rCandidate)929 void SdXMLShapeContext::onDemandRescueUsefulDataFromTemporary( const SvXMLImportContext& rCandidate )
930 {
931     const SdXMLShapeContext* pCandidate = dynamic_cast< const SdXMLShapeContext* >(&rCandidate);
932 
933     if(!mxGluePoints.is() && pCandidate)
934     {
935         // try to rescue GluePoints from rCandidate to local if we not yet have GluePoints by copying them
936         uno::Reference< drawing::XGluePointsSupplier > xSourceSupplier( pCandidate->getShape(), uno::UNO_QUERY );
937         if( !xSourceSupplier.is() )
938             return;
939 
940         uno::Reference< container::XIdentifierAccess > xSourceGluePoints( xSourceSupplier->getGluePoints(), uno::UNO_QUERY );
941         if( !xSourceGluePoints.is() )
942             return;
943 
944         uno::Sequence< sal_Int32 > aSourceIdSequence( xSourceGluePoints->getIdentifiers() );
945         const sal_Int32 nSourceCount(aSourceIdSequence.getLength());
946         UniReference< XMLShapeImportHelper > xSourceShapeImportHelper(const_cast< SdXMLShapeContext* >(pCandidate)->GetImport().GetShapeImport());
947 
948         if(nSourceCount)
949         {
950             // rCandidate has GluePoints; prepare the GluePoint container for the local shape
951             uno::Reference< drawing::XGluePointsSupplier > xSupplier( mxShape, uno::UNO_QUERY );
952             if( !xSupplier.is() )
953                 return;
954 
955             mxGluePoints = uno::Reference< container::XIdentifierContainer >::query( xSupplier->getGluePoints() );
956 
957             if( !mxGluePoints.is() )
958                 return;
959 
960             drawing::GluePoint2 aSourceGluePoint;
961 
962             for( sal_Int32 nSourceIndex(0); nSourceIndex < nSourceCount; nSourceIndex++ )
963             {
964                 const sal_Int32 nSourceIdentifier = aSourceIdSequence[nSourceIndex];
965 
966                 // loop over GluePoints which are UserDefined (avoid the auto mapped ones)
967                 if((xSourceGluePoints->getByIdentifier( nSourceIdentifier ) >>= aSourceGluePoint)
968                     && aSourceGluePoint.IsUserDefined)
969                 {
970                     // get original mappingID back, this is the draw:id imported with a draw:glue-point
971                     const sal_Int32 nDestinnationId = xSourceShapeImportHelper->findGluePointMapping(
972                         pCandidate->getShape(),
973                         nSourceIdentifier );
974 
975                     if(-1 != nSourceIdentifier)
976                     {
977                         // if we got that we are able to add a copy of that GluePoint to the local
978                         // context and xShape since we have all information that the source shape
979                         // and context had at import time
980                         try
981                         {
982                             const sal_Int32 nInternalId = mxGluePoints->insert( uno::makeAny( aSourceGluePoint ) );
983                             GetImport().GetShapeImport()->addGluePointMapping( mxShape, nDestinnationId, nInternalId );
984                         }
985                         catch( uno::Exception& )
986                         {
987                             DBG_ERROR( "exception during setting of glue points!");
988                         }
989                     }
990                 }
991             }
992         }
993     }
994 }
995 
996 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
997 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
998 
999 TYPEINIT1( SdXMLRectShapeContext, SdXMLShapeContext );
1000 
SdXMLRectShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1001 SdXMLRectShapeContext::SdXMLRectShapeContext(
1002     SvXMLImport& rImport,
1003     sal_uInt16 nPrfx,
1004     const OUString& rLocalName,
1005     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1006     uno::Reference< drawing::XShapes >& rShapes,
1007     sal_Bool bTemporaryShape)
1008 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1009     mnRadius( 0L )
1010 {
1011 }
1012 
1013 //////////////////////////////////////////////////////////////////////////////
1014 
~SdXMLRectShapeContext()1015 SdXMLRectShapeContext::~SdXMLRectShapeContext()
1016 {
1017 }
1018 
1019 //////////////////////////////////////////////////////////////////////////////
1020 
1021 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1022 void SdXMLRectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1023 {
1024     if( XML_NAMESPACE_DRAW == nPrefix )
1025     {
1026         if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1027         {
1028             GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
1029             return;
1030         }
1031     }
1032 
1033     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1034 }
1035 
1036 //////////////////////////////////////////////////////////////////////////////
1037 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1038 void SdXMLRectShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1039 {
1040     // create rectangle shape
1041     AddShape("com.sun.star.drawing.RectangleShape");
1042     if(mxShape.is())
1043     {
1044         // Add, set Style and properties from base shape
1045         SetStyle();
1046         SetLayer();
1047 
1048         // set pos, size, shear and rotate
1049         SetTransformation();
1050 
1051         if(mnRadius)
1052         {
1053             uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1054             if(xPropSet.is())
1055             {
1056                 try
1057                 {
1058                     xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
1059                 }
1060                 catch( uno::Exception& )
1061                 {
1062                     DBG_ERROR( "exception during setting of corner radius!");
1063                 }
1064             }
1065         }
1066         SdXMLShapeContext::StartElement(xAttrList);
1067     }
1068 }
1069 
1070 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1071 ////////////////////////////////////////3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1072 
1073 TYPEINIT1( SdXMLLineShapeContext, SdXMLShapeContext );
1074 
SdXMLLineShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1075 SdXMLLineShapeContext::SdXMLLineShapeContext(
1076     SvXMLImport& rImport,
1077     sal_uInt16 nPrfx,
1078     const OUString& rLocalName,
1079     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1080     uno::Reference< drawing::XShapes >& rShapes,
1081     sal_Bool bTemporaryShape)
1082 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1083     mnX1( 0L ),
1084     mnY1( 0L ),
1085     mnX2( 1L ),
1086     mnY2( 1L )
1087 {
1088 }
1089 
1090 //////////////////////////////////////////////////////////////////////////////
1091 
~SdXMLLineShapeContext()1092 SdXMLLineShapeContext::~SdXMLLineShapeContext()
1093 {
1094 }
1095 
1096 //////////////////////////////////////////////////////////////////////////////
1097 
1098 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1099 void SdXMLLineShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1100 {
1101     if( XML_NAMESPACE_SVG == nPrefix )
1102     {
1103         if( IsXMLToken( rLocalName, XML_X1 ) )
1104         {
1105             GetImport().GetMM100UnitConverter().convertMeasure(mnX1, rValue);
1106             return;
1107         }
1108         if( IsXMLToken( rLocalName, XML_Y1 ) )
1109         {
1110             GetImport().GetMM100UnitConverter().convertMeasure(mnY1, rValue);
1111             return;
1112         }
1113         if( IsXMLToken( rLocalName, XML_X2 ) )
1114         {
1115             GetImport().GetMM100UnitConverter().convertMeasure(mnX2, rValue);
1116             return;
1117         }
1118         if( IsXMLToken( rLocalName, XML_Y2 ) )
1119         {
1120             GetImport().GetMM100UnitConverter().convertMeasure(mnY2, rValue);
1121             return;
1122         }
1123     }
1124 
1125     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1126 }
1127 
1128 //////////////////////////////////////////////////////////////////////////////
1129 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1130 void SdXMLLineShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1131 {
1132     // #85920# use SetTransformation() to handle import of simple lines.
1133     // This is necessary to kake into account all anchor positions and
1134     // other things. All shape imports use the same import schemata now.
1135     // create necessary shape (Line Shape)
1136     AddShape("com.sun.star.drawing.PolyLineShape");
1137 
1138     if(mxShape.is())
1139     {
1140         // Add, set Style and properties from base shape
1141         SetStyle();
1142         SetLayer();
1143 
1144         // get sizes and offsets
1145         awt::Point aTopLeft(mnX1, mnY1);
1146         awt::Point aBottomRight(mnX2, mnY2);
1147 
1148         if(mnX1 > mnX2)
1149         {
1150             aTopLeft.X = mnX2;
1151             aBottomRight.X = mnX1;
1152         }
1153 
1154         if(mnY1 > mnY2)
1155         {
1156             aTopLeft.Y = mnY2;
1157             aBottomRight.Y = mnY1;
1158         }
1159 
1160         // set local parameters on shape
1161         uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1162         if(xPropSet.is())
1163         {
1164             drawing::PointSequenceSequence aPolyPoly(1L);
1165             drawing::PointSequence* pOuterSequence = aPolyPoly.getArray();
1166             pOuterSequence->realloc(2L);
1167             awt::Point* pInnerSequence = pOuterSequence->getArray();
1168             uno::Any aAny;
1169 
1170             *pInnerSequence = awt::Point( mnX1 - aTopLeft.X, mnY1 - aTopLeft.Y);
1171             pInnerSequence++;
1172             *pInnerSequence = awt::Point( mnX2 - aTopLeft.X, mnY2 - aTopLeft.Y);
1173 
1174             aAny <<= aPolyPoly;
1175             xPropSet->setPropertyValue(
1176                 OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1177         }
1178 
1179         // set sizes for transformation
1180         maSize.Width = aBottomRight.X - aTopLeft.X;
1181         maSize.Height = aBottomRight.Y - aTopLeft.Y;
1182         maPosition.X = aTopLeft.X;
1183         maPosition.Y = aTopLeft.Y;
1184 
1185         // set pos, size, shear and rotate and get copy of matrix
1186         SetTransformation();
1187 
1188         SdXMLShapeContext::StartElement(xAttrList);
1189     }
1190 }
1191 
1192 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1193 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1194 
1195 TYPEINIT1( SdXMLEllipseShapeContext, SdXMLShapeContext );
1196 
SdXMLEllipseShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1197 SdXMLEllipseShapeContext::SdXMLEllipseShapeContext(
1198     SvXMLImport& rImport,
1199     sal_uInt16 nPrfx,
1200     const OUString& rLocalName,
1201     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1202     uno::Reference< drawing::XShapes >& rShapes,
1203     sal_Bool bTemporaryShape)
1204 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1205     mnCX( 0L ),
1206     mnCY( 0L ),
1207     mnRX( 1L ),
1208     mnRY( 1L ),
1209     meKind( drawing::CircleKind_FULL ),
1210     mnStartAngle( 0 ),
1211     mnEndAngle( 0 )
1212 {
1213 }
1214 
1215 //////////////////////////////////////////////////////////////////////////////
1216 
~SdXMLEllipseShapeContext()1217 SdXMLEllipseShapeContext::~SdXMLEllipseShapeContext()
1218 {
1219 }
1220 
1221 //////////////////////////////////////////////////////////////////////////////
1222 
1223 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1224 void SdXMLEllipseShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1225 {
1226     if( XML_NAMESPACE_SVG == nPrefix )
1227     {
1228         if( IsXMLToken( rLocalName, XML_RX ) )
1229         {
1230             GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1231             return;
1232         }
1233         if( IsXMLToken( rLocalName, XML_RY ) )
1234         {
1235             GetImport().GetMM100UnitConverter().convertMeasure(mnRY, rValue);
1236             return;
1237         }
1238         if( IsXMLToken( rLocalName, XML_CX ) )
1239         {
1240             GetImport().GetMM100UnitConverter().convertMeasure(mnCX, rValue);
1241             return;
1242         }
1243         if( IsXMLToken( rLocalName, XML_CY ) )
1244         {
1245             GetImport().GetMM100UnitConverter().convertMeasure(mnCY, rValue);
1246             return;
1247         }
1248         if( IsXMLToken( rLocalName, XML_R ) )
1249         {
1250             // single radius, it's a circle and both radii are the same
1251             GetImport().GetMM100UnitConverter().convertMeasure(mnRX, rValue);
1252             mnRY = mnRX;
1253             return;
1254         }
1255     }
1256     else if( XML_NAMESPACE_DRAW == nPrefix )
1257     {
1258         if( IsXMLToken( rLocalName, XML_KIND ) )
1259         {
1260             sal_uInt16 eKind;
1261             if( SvXMLUnitConverter::convertEnum( eKind, rValue, aXML_CircleKind_EnumMap ) )
1262             {
1263                 meKind = eKind;
1264             }
1265             return;
1266         }
1267         if( IsXMLToken( rLocalName, XML_START_ANGLE ) )
1268         {
1269             double dStartAngle;
1270             if( SvXMLUnitConverter::convertDouble( dStartAngle, rValue ) )
1271                 mnStartAngle = (sal_Int32)(dStartAngle * 100.0);
1272             return;
1273         }
1274         if( IsXMLToken( rLocalName, XML_END_ANGLE ) )
1275         {
1276             double dEndAngle;
1277             if( SvXMLUnitConverter::convertDouble( dEndAngle, rValue ) )
1278                 mnEndAngle = (sal_Int32)(dEndAngle * 100.0);
1279             return;
1280         }
1281     }
1282 
1283     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1284 }
1285 
1286 //////////////////////////////////////////////////////////////////////////////
1287 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1288 void SdXMLEllipseShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1289 {
1290     // create rectangle shape
1291     AddShape("com.sun.star.drawing.EllipseShape");
1292     if(mxShape.is())
1293     {
1294         // Add, set Style and properties from base shape
1295         SetStyle();
1296         SetLayer();
1297 
1298         if(mnCX != 0 || mnCY != 0 || mnRX != 1 || mnRY != 1)
1299         {
1300             // #121972# center/radius is used, put to pos and size
1301             maSize.Width = 2 * mnRX;
1302             maSize.Height = 2 * mnRY;
1303             maPosition.X = mnCX - mnRX;
1304             maPosition.Y = mnCY - mnRY;
1305         }
1306 
1307         // set pos, size, shear and rotate
1308         SetTransformation();
1309 
1310         if( meKind != drawing::CircleKind_FULL )
1311         {
1312             uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
1313             if( xPropSet.is() )
1314             {
1315                 uno::Any aAny;
1316                 aAny <<= (drawing::CircleKind)meKind;
1317                 xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleKind")), aAny );
1318 
1319                 aAny <<= mnStartAngle;
1320                 xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleStartAngle")), aAny );
1321 
1322                 aAny <<= mnEndAngle;
1323                 xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CircleEndAngle")), aAny );
1324             }
1325         }
1326 
1327         SdXMLShapeContext::StartElement(xAttrList);
1328     }
1329 }
1330 
1331 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1332 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1333 
1334 TYPEINIT1( SdXMLPolygonShapeContext, SdXMLShapeContext );
1335 
SdXMLPolygonShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bClosed,sal_Bool bTemporaryShape)1336 SdXMLPolygonShapeContext::SdXMLPolygonShapeContext(
1337     SvXMLImport& rImport,
1338     sal_uInt16 nPrfx,
1339     const OUString& rLocalName,
1340     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1341     uno::Reference< drawing::XShapes >& rShapes, sal_Bool bClosed, sal_Bool bTemporaryShape)
1342 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1343     mbClosed( bClosed )
1344 {
1345 }
1346 
1347 //////////////////////////////////////////////////////////////////////////////
1348 
1349 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1350 void SdXMLPolygonShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1351 {
1352     if( XML_NAMESPACE_SVG == nPrefix )
1353     {
1354         if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1355         {
1356             maViewBox = rValue;
1357             return;
1358         }
1359     }
1360     else if( XML_NAMESPACE_DRAW == nPrefix )
1361     {
1362         if( IsXMLToken( rLocalName, XML_POINTS ) )
1363         {
1364             maPoints = rValue;
1365             return;
1366         }
1367     }
1368 
1369     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1370 }
1371 
1372 //////////////////////////////////////////////////////////////////////////////
1373 
~SdXMLPolygonShapeContext()1374 SdXMLPolygonShapeContext::~SdXMLPolygonShapeContext()
1375 {
1376 }
1377 
1378 //////////////////////////////////////////////////////////////////////////////
1379 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1380 void SdXMLPolygonShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1381 {
1382     // Add, set Style and properties from base shape
1383     if(mbClosed)
1384         AddShape("com.sun.star.drawing.PolyPolygonShape");
1385     else
1386         AddShape("com.sun.star.drawing.PolyLineShape");
1387 
1388     if( mxShape.is() )
1389     {
1390         SetStyle();
1391         SetLayer();
1392 
1393         // set local parameters on shape
1394         uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1395         if(xPropSet.is())
1396         {
1397             // set polygon
1398             if(maPoints.getLength() && maViewBox.getLength())
1399             {
1400                 const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1401                 basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1402 
1403                 // Is this correct? It overrides ViewBox stuff; OTOH it makes no
1404                 // sense to have the geometry content size different from object size
1405                 if(maSize.Width != 0 && maSize.Height != 0)
1406                 {
1407                     aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
1408                 }
1409 
1410                 basegfx::B2DPolygon aPolygon;
1411 
1412                 if(basegfx::tools::importFromSvgPoints(aPolygon, maPoints))
1413                 {
1414                     if(aPolygon.count())
1415                     {
1416                         const basegfx::B2DRange aSourceRange(
1417                             aViewBox.GetX(), aViewBox.GetY(),
1418                             aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
1419                         const basegfx::B2DRange aTargetRange(
1420                             aViewBox.GetX(), aViewBox.GetY(),
1421                             aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
1422 
1423                         if(!aSourceRange.equal(aTargetRange))
1424                         {
1425                             aPolygon.transform(
1426                                 basegfx::tools::createSourceRangeTargetRangeTransform(
1427                                     aSourceRange,
1428                                     aTargetRange));
1429                         }
1430 
1431                         com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence;
1432                         uno::Any aAny;
1433 
1434                         basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(basegfx::B2DPolyPolygon(aPolygon), aPointSequenceSequence);
1435                         aAny <<= aPointSequenceSequence;
1436                         xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1437                     }
1438                 }
1439             }
1440         }
1441 
1442         // set pos, size, shear and rotate and get copy of matrix
1443         SetTransformation();
1444 
1445         SdXMLShapeContext::StartElement(xAttrList);
1446     }
1447 }
1448 
1449 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1450 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1451 
1452 TYPEINIT1( SdXMLPathShapeContext, SdXMLShapeContext );
1453 
SdXMLPathShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1454 SdXMLPathShapeContext::SdXMLPathShapeContext(
1455     SvXMLImport& rImport,
1456     sal_uInt16 nPrfx,
1457     const OUString& rLocalName,
1458     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1459     uno::Reference< drawing::XShapes >& rShapes,
1460     sal_Bool bTemporaryShape)
1461 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1462     mbClosed( sal_True )
1463 {
1464 }
1465 
1466 //////////////////////////////////////////////////////////////////////////////
1467 
~SdXMLPathShapeContext()1468 SdXMLPathShapeContext::~SdXMLPathShapeContext()
1469 {
1470 }
1471 
1472 //////////////////////////////////////////////////////////////////////////////
1473 
1474 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1475 void SdXMLPathShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1476 {
1477     if( XML_NAMESPACE_SVG == nPrefix )
1478     {
1479         if( IsXMLToken( rLocalName, XML_VIEWBOX ) )
1480         {
1481             maViewBox = rValue;
1482             return;
1483         }
1484         else if( IsXMLToken( rLocalName, XML_D ) )
1485         {
1486             maD = rValue;
1487             return;
1488         }
1489     }
1490 
1491     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1492 }
1493 
1494 //////////////////////////////////////////////////////////////////////////////
1495 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1496 void SdXMLPathShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1497 {
1498     // create polygon shape
1499     if(maD.getLength())
1500     {
1501         const SdXMLImExViewBox aViewBox(maViewBox, GetImport().GetMM100UnitConverter());
1502         basegfx::B2DVector aSize(aViewBox.GetWidth(), aViewBox.GetHeight());
1503 
1504         // Is this correct? It overrides ViewBox stuff; OTOH it makes no
1505         // sense to have the geometry content size different from object size
1506         if(maSize.Width != 0 && maSize.Height != 0)
1507         {
1508             aSize = basegfx::B2DVector(maSize.Width, maSize.Height);
1509         }
1510 
1511         basegfx::B2DPolyPolygon aPolyPolygon;
1512 
1513         if(basegfx::tools::importFromSvgD(aPolyPolygon, maD, true, 0))
1514         {
1515             if(aPolyPolygon.count())
1516             {
1517                 const basegfx::B2DRange aSourceRange(
1518                     aViewBox.GetX(), aViewBox.GetY(),
1519                     aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
1520                 const basegfx::B2DRange aTargetRange(
1521                     aViewBox.GetX(), aViewBox.GetY(),
1522                     aViewBox.GetX() + aSize.getX(), aViewBox.GetY() + aSize.getY());
1523 
1524                 if(!aSourceRange.equal(aTargetRange))
1525                 {
1526                     aPolyPolygon.transform(
1527                         basegfx::tools::createSourceRangeTargetRangeTransform(
1528                             aSourceRange,
1529                             aTargetRange));
1530                 }
1531 
1532                 // create shape
1533                 const char* pService;
1534 
1535                 if(aPolyPolygon.areControlPointsUsed())
1536                 {
1537                     if(aPolyPolygon.isClosed())
1538                     {
1539                         pService = "com.sun.star.drawing.ClosedBezierShape";
1540                     }
1541                     else
1542                     {
1543                         pService = "com.sun.star.drawing.OpenBezierShape";
1544                     }
1545                 }
1546                 else
1547                 {
1548                     if(aPolyPolygon.isClosed())
1549                     {
1550                         pService = "com.sun.star.drawing.PolyPolygonShape";
1551                     }
1552                     else
1553                     {
1554                         pService = "com.sun.star.drawing.PolyLineShape";
1555                     }
1556                 }
1557 
1558                 // Add, set Style and properties from base shape
1559                 AddShape(pService);
1560 
1561                 // #89344# test for mxShape.is() and not for mxShapes.is() to support
1562                 // shape import helper classes WITHOUT XShapes (member mxShapes). This
1563                 // is used by the writer.
1564                 if( mxShape.is() )
1565                 {
1566                     SetStyle();
1567                     SetLayer();
1568 
1569                     // set local parameters on shape
1570                     uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1571 
1572                     if(xPropSet.is())
1573                     {
1574                         uno::Any aAny;
1575 
1576                         // set polygon data
1577                         if(aPolyPolygon.areControlPointsUsed())
1578                         {
1579                             drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
1580 
1581                             basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
1582                                 aPolyPolygon,
1583                                 aSourcePolyPolygon);
1584                             aAny <<= aSourcePolyPolygon;
1585                         }
1586                         else
1587                         {
1588                             drawing::PointSequenceSequence aSourcePolyPolygon;
1589 
1590                             basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
1591                                 aPolyPolygon,
1592                                 aSourcePolyPolygon);
1593                             aAny <<= aSourcePolyPolygon;
1594                         }
1595 
1596                         xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("Geometry")), aAny);
1597                     }
1598 
1599                     // set pos, size, shear and rotate
1600                     SetTransformation();
1601 
1602                     SdXMLShapeContext::StartElement(xAttrList);
1603                 }
1604             }
1605         }
1606     }
1607 }
1608 
1609 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1610 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1611 
1612 TYPEINIT1( SdXMLTextBoxShapeContext, SdXMLShapeContext );
1613 
SdXMLTextBoxShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1614 SdXMLTextBoxShapeContext::SdXMLTextBoxShapeContext(
1615     SvXMLImport& rImport,
1616     sal_uInt16 nPrfx,
1617     const OUString& rLocalName,
1618     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1619     uno::Reference< drawing::XShapes >& rShapes,
1620     sal_Bool bTemporaryShape)
1621 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1622     mnRadius(0)
1623 {
1624 }
1625 
1626 //////////////////////////////////////////////////////////////////////////////
1627 
~SdXMLTextBoxShapeContext()1628 SdXMLTextBoxShapeContext::~SdXMLTextBoxShapeContext()
1629 {
1630 }
1631 
1632 //////////////////////////////////////////////////////////////////////////////
1633 
1634 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1635 void SdXMLTextBoxShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1636 {
1637     if( XML_NAMESPACE_DRAW == nPrefix )
1638     {
1639         if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
1640         {
1641             GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
1642             return;
1643         }
1644     }
1645 
1646     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1647 }
1648 
1649 //////////////////////////////////////////////////////////////////////////////
1650 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)1651 void SdXMLTextBoxShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
1652 {
1653     // create textbox shape
1654     sal_Bool bIsPresShape = sal_False;
1655     bool bClearText = false;
1656 
1657     const char *pService = NULL;
1658 
1659     if( isPresentationShape() )
1660     {
1661         // check if the current document supports presentation shapes
1662         if( GetImport().GetShapeImport()->IsPresentationShapesSupported() )
1663         {
1664             if( IsXMLToken( maPresentationClass, XML_PRESENTATION_SUBTITLE ))
1665             {
1666                 // XmlShapeTypePresSubtitleShape
1667                 pService = "com.sun.star.presentation.SubtitleShape";
1668             }
1669             else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OUTLINE ) )
1670             {
1671                 // XmlShapeTypePresOutlinerShape
1672                 pService = "com.sun.star.presentation.OutlinerShape";
1673             }
1674             else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_NOTES ) )
1675             {
1676                 // XmlShapeTypePresNotesShape
1677                 pService = "com.sun.star.presentation.NotesShape";
1678             }
1679             else if( IsXMLToken( maPresentationClass, XML_HEADER ) )
1680             {
1681                 // XmlShapeTypePresHeaderShape
1682                 pService = "com.sun.star.presentation.HeaderShape";
1683                 bClearText = true;
1684             }
1685             else if( IsXMLToken( maPresentationClass, XML_FOOTER ) )
1686             {
1687                 // XmlShapeTypePresFooterShape
1688                 pService = "com.sun.star.presentation.FooterShape";
1689                 bClearText = true;
1690             }
1691             else if( IsXMLToken( maPresentationClass, XML_PAGE_NUMBER ) )
1692             {
1693                 // XmlShapeTypePresSlideNumberShape
1694                 pService = "com.sun.star.presentation.SlideNumberShape";
1695                 bClearText = true;
1696             }
1697             else if( IsXMLToken( maPresentationClass, XML_DATE_TIME ) )
1698             {
1699                 // XmlShapeTypePresDateTimeShape
1700                 pService = "com.sun.star.presentation.DateTimeShape";
1701                 bClearText = true;
1702             }
1703             else //  IsXMLToken( maPresentationClass, XML_PRESENTATION_TITLE ) )
1704             {
1705                 // XmlShapeTypePresTitleTextShape
1706                 pService = "com.sun.star.presentation.TitleTextShape";
1707             }
1708             bIsPresShape = sal_True;
1709         }
1710     }
1711 
1712     if( NULL == pService )
1713     {
1714         // normal text shape
1715         pService = "com.sun.star.drawing.TextShape";
1716     }
1717 
1718     // Add, set Style and properties from base shape
1719     AddShape(pService);
1720 
1721     if( mxShape.is() )
1722     {
1723         SetStyle();
1724         SetLayer();
1725 
1726         if(bIsPresShape)
1727         {
1728             uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
1729             if(xProps.is())
1730             {
1731                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
1732                 if( xPropsInfo.is() )
1733                 {
1734                     if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
1735                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
1736 
1737                     if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
1738                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
1739                 }
1740             }
1741         }
1742 
1743         if( bClearText )
1744         {
1745             uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
1746             OUString aEmpty;
1747             xText->setString( aEmpty );
1748         }
1749 
1750         // set parameters on shape
1751 //A AW->CL: Eventually You need to strip scale and translate from the transformation
1752 //A to reach the same goal again.
1753 //A     if(!bIsPresShape || mbIsUserTransformed)
1754 //A     {
1755 //A         // set pos and size on shape, this should remove binding
1756 //A         // to pres object on masterpage
1757 //A         SetSizeAndPosition();
1758 //A     }
1759 
1760         // set pos, size, shear and rotate
1761         SetTransformation();
1762 
1763         if(mnRadius)
1764         {
1765             uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
1766             if(xPropSet.is())
1767             {
1768                 try
1769                 {
1770                     xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
1771                 }
1772                 catch( uno::Exception& )
1773                 {
1774                     DBG_ERROR( "exception during setting of corner radius!");
1775                 }
1776             }
1777         }
1778 
1779         SdXMLShapeContext::StartElement(mxAttrList);
1780     }
1781 }
1782 
1783 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1784 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1785 
1786 TYPEINIT1( SdXMLControlShapeContext, SdXMLShapeContext );
1787 
SdXMLControlShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1788 SdXMLControlShapeContext::SdXMLControlShapeContext(
1789     SvXMLImport& rImport,
1790     sal_uInt16 nPrfx,
1791     const OUString& rLocalName,
1792     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1793     uno::Reference< drawing::XShapes >& rShapes,
1794     sal_Bool bTemporaryShape)
1795 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
1796 {
1797 }
1798 
1799 //////////////////////////////////////////////////////////////////////////////
1800 
~SdXMLControlShapeContext()1801 SdXMLControlShapeContext::~SdXMLControlShapeContext()
1802 {
1803 }
1804 
1805 //////////////////////////////////////////////////////////////////////////////
1806 
1807 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1808 void SdXMLControlShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1809 {
1810     if( XML_NAMESPACE_DRAW == nPrefix )
1811     {
1812         if( IsXMLToken( rLocalName, XML_CONTROL ) )
1813         {
1814             maFormId = rValue;
1815             return;
1816         }
1817     }
1818 
1819     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
1820 }
1821 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)1822 void SdXMLControlShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
1823 {
1824     // create Control shape
1825     // add, set style and properties from base shape
1826     AddShape("com.sun.star.drawing.ControlShape");
1827     if( mxShape.is() )
1828     {
1829         DBG_ASSERT( maFormId.getLength(), "draw:control without a form:id attribute!" );
1830         if( maFormId.getLength() )
1831         {
1832 #ifndef SVX_LIGHT
1833             if( GetImport().IsFormsSupported() )
1834             {
1835                 uno::Reference< awt::XControlModel > xControlModel( GetImport().GetFormImport()->lookupControl( maFormId ), uno::UNO_QUERY );
1836                 if( xControlModel.is() )
1837                 {
1838                     uno::Reference< drawing::XControlShape > xControl( mxShape, uno::UNO_QUERY );
1839                     if( xControl.is() )
1840                         xControl->setControl(  xControlModel );
1841 
1842                 }
1843             }
1844 #endif // #ifndef SVX_LIGHT
1845         }
1846 
1847         SetStyle();
1848         SetLayer();
1849 
1850         // set pos, size, shear and rotate
1851         SetTransformation();
1852 
1853         SdXMLShapeContext::StartElement(xAttrList);
1854     }
1855 }
1856 
1857 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1858 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1859 
1860 TYPEINIT1( SdXMLConnectorShapeContext, SdXMLShapeContext );
1861 
SdXMLConnectorShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)1862 SdXMLConnectorShapeContext::SdXMLConnectorShapeContext(
1863     SvXMLImport& rImport,
1864     sal_uInt16 nPrfx,
1865     const OUString& rLocalName,
1866     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
1867     uno::Reference< drawing::XShapes >& rShapes,
1868     sal_Bool bTemporaryShape)
1869 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
1870     maStart(0,0),
1871     maEnd(1,1),
1872     mnType( (sal_uInt16)drawing::ConnectorType_STANDARD ),
1873     mnStartGlueId(-1),
1874     mnEndGlueId(-1),
1875     mnDelta1(0),
1876     mnDelta2(0),
1877     mnDelta3(0)
1878 {
1879 }
1880 
1881 //////////////////////////////////////////////////////////////////////////////
1882 
~SdXMLConnectorShapeContext()1883 SdXMLConnectorShapeContext::~SdXMLConnectorShapeContext()
1884 {
1885 }
1886 
1887 //////////////////////////////////////////////////////////////////////////////
1888 
1889 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)1890 void SdXMLConnectorShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
1891 {
1892     switch( nPrefix )
1893     {
1894     case XML_NAMESPACE_DRAW:
1895     {
1896         if( IsXMLToken( rLocalName, XML_START_SHAPE ) )
1897         {
1898             maStartShapeId = rValue;
1899             return;
1900         }
1901         if( IsXMLToken( rLocalName, XML_START_GLUE_POINT ) )
1902         {
1903             mnStartGlueId = rValue.toInt32();
1904             return;
1905         }
1906         if( IsXMLToken( rLocalName, XML_END_SHAPE ) )
1907         {
1908             maEndShapeId = rValue;
1909             return;
1910         }
1911         if( IsXMLToken( rLocalName, XML_END_GLUE_POINT ) )
1912         {
1913             mnEndGlueId = rValue.toInt32();
1914             return;
1915         }
1916         if( IsXMLToken( rLocalName, XML_LINE_SKEW ) )
1917         {
1918             SvXMLTokenEnumerator aTokenEnum( rValue );
1919             OUString aToken;
1920             if( aTokenEnum.getNextToken( aToken ) )
1921             {
1922                 GetImport().GetMM100UnitConverter().convertMeasure(mnDelta1, aToken);
1923                 if( aTokenEnum.getNextToken( aToken ) )
1924                 {
1925                     GetImport().GetMM100UnitConverter().convertMeasure(mnDelta2, aToken);
1926                     if( aTokenEnum.getNextToken( aToken ) )
1927                     {
1928                         GetImport().GetMM100UnitConverter().convertMeasure(mnDelta3, aToken);
1929                     }
1930                 }
1931             }
1932             return;
1933         }
1934         if( IsXMLToken( rLocalName, XML_TYPE ) )
1935         {
1936             SvXMLUnitConverter::convertEnum( mnType, rValue, aXML_ConnectionKind_EnumMap );
1937             return;
1938         }
1939         // #121965# draw:transform may be used in ODF1.2, e.g. exports from MS seem to use these
1940         else if( IsXMLToken( rLocalName, XML_TRANSFORM ) )
1941         {
1942             mnTransform.SetString(rValue, GetImport().GetMM100UnitConverter());
1943         }
1944     }
1945     case XML_NAMESPACE_SVG:
1946     {
1947         if( IsXMLToken( rLocalName, XML_X1 ) )
1948         {
1949             GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
1950             return;
1951         }
1952         if( IsXMLToken( rLocalName, XML_Y1 ) )
1953         {
1954             GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
1955             return;
1956         }
1957         if( IsXMLToken( rLocalName, XML_X2 ) )
1958         {
1959             GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
1960             return;
1961         }
1962         if( IsXMLToken( rLocalName, XML_Y2 ) )
1963         {
1964             GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
1965             return;
1966         }
1967         if( IsXMLToken( rLocalName, XML_D ) )
1968         {
1969             basegfx::B2DPolyPolygon aPolyPolygon;
1970 
1971             if(basegfx::tools::importFromSvgD(aPolyPolygon, rValue, true, 0))
1972             {
1973                 if(aPolyPolygon.count())
1974                 {
1975                     // set polygon data
1976                     if(aPolyPolygon.areControlPointsUsed())
1977                     {
1978                         drawing::PolyPolygonBezierCoords aSourcePolyPolygon;
1979 
1980                         basegfx::tools::B2DPolyPolygonToUnoPolyPolygonBezierCoords(
1981                             aPolyPolygon,
1982                             aSourcePolyPolygon);
1983                         maPath <<= aSourcePolyPolygon;
1984                     }
1985                     else
1986                     {
1987                         drawing::PointSequenceSequence aSourcePolyPolygon;
1988 
1989                         basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(
1990                             aPolyPolygon,
1991                             aSourcePolyPolygon);
1992                         maPath <<= aSourcePolyPolygon;
1993                     }
1994                 }
1995             }
1996         }
1997     }
1998     }
1999 
2000     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2001 }
2002 
2003 //////////////////////////////////////////////////////////////////////////////
2004 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2005 void SdXMLConnectorShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2006 {
2007     // #107928#
2008     // For security reasons, do not add empty connectors. There may have been an error in EA2
2009     // that created empty, far set off connectors (e.g. 63 meters below top of document). This
2010     // is not guaranteed, but it's definitely safe to not add empty connectors.
2011     sal_Bool bDoAdd(sal_True);
2012 
2013     if(    0 == maStartShapeId.getLength()
2014         && 0 == maEndShapeId.getLength()
2015         && maStart.X == maEnd.X
2016         && maStart.Y == maEnd.Y
2017         && 0 == mnDelta1
2018         && 0 == mnDelta2
2019         && 0 == mnDelta3
2020         )
2021     {
2022         bDoAdd = sal_False;
2023     }
2024 
2025     if(bDoAdd)
2026     {
2027         // create Connector shape
2028         // add, set style and properties from base shape
2029         AddShape("com.sun.star.drawing.ConnectorShape");
2030         if(mxShape.is())
2031         {
2032             // #121965# if draw:transform is used, apply directly to the start
2033             // and end positions before using these
2034             if(mnTransform.NeedsAction())
2035             {
2036                 // transformation is used, apply to object.
2037                 ::basegfx::B2DHomMatrix aMat;
2038                 mnTransform.GetFullTransform(aMat);
2039 
2040                 if(!aMat.isIdentity())
2041                 {
2042                     basegfx::B2DPoint aStart(maStart.X, maStart.Y);
2043                     basegfx::B2DPoint aEnd(maEnd.X, maEnd.Y);
2044 
2045                     aStart = aMat * aStart;
2046                     aEnd = aMat * aEnd;
2047 
2048                     maStart.X = basegfx::fround(aStart.getX());
2049                     maStart.Y = basegfx::fround(aStart.getY());
2050                     maEnd.X = basegfx::fround(aEnd.getX());
2051                     maEnd.Y = basegfx::fround(aEnd.getY());
2052                 }
2053             }
2054 
2055             // add connection ids
2056             if( maStartShapeId.getLength() )
2057                 GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_True, maStartShapeId, mnStartGlueId );
2058             if( maEndShapeId.getLength() )
2059                 GetImport().GetShapeImport()->addShapeConnection( mxShape, sal_False, maEndShapeId, mnEndGlueId );
2060 
2061             uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2062             if( xProps.is() )
2063             {
2064                 uno::Any aAny;
2065                 aAny <<= maStart;
2066                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
2067 
2068                 aAny <<= maEnd;
2069                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
2070 
2071                 aAny <<= (drawing::ConnectorType)mnType;
2072                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeKind")), aAny );
2073 
2074                 aAny <<= mnDelta1;
2075                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine1Delta")), aAny );
2076 
2077                 aAny <<= mnDelta2;
2078                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine2Delta")), aAny );
2079 
2080                 aAny <<= mnDelta3;
2081                 xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EdgeLine3Delta")), aAny );
2082             }
2083             SetStyle();
2084             SetLayer();
2085 
2086             if ( maPath.hasValue() )
2087             {
2088                 // --> OD #i115492#
2089                 // Ignore svg:d attribute for text documents created by OpenOffice.org
2090                 // versions before OOo 3.3, because these OOo versions are storing
2091                 // svg:d values not using the correct unit.
2092                 bool bApplySVGD( true );
2093                 if ( uno::Reference< text::XTextDocument >(GetImport().GetModel(), uno::UNO_QUERY).is() )
2094                 {
2095                     sal_Int32 nUPD( 0 );
2096                     sal_Int32 nBuild( 0 );
2097                     const bool bBuildIdFound = GetImport().getBuildIds( nUPD, nBuild );
2098                     if ( GetImport().IsTextDocInOOoFileFormat() ||
2099                          ( bBuildIdFound &&
2100                            ( ( nUPD == 641 ) || ( nUPD == 645 ) ||  // prior OOo 2.0
2101                              ( nUPD == 680 ) ||                     // OOo 2.x
2102                              ( nUPD == 300 ) ||                     // OOo 3.0 - OOo 3.0.1
2103                              ( nUPD == 310 ) ||                     // OOo 3.1 - OOo 3.1.1
2104                              ( nUPD == 320 ) ) ) )                  // OOo 3.2 - OOo 3.2.1
2105                     {
2106                         bApplySVGD = false;
2107                     }
2108                 }
2109 
2110                 if ( bApplySVGD )
2111                 {
2112                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("PolyPolygonBezier") ), maPath );
2113                 }
2114                 // <--
2115             }
2116 
2117             SdXMLShapeContext::StartElement(xAttrList);
2118         }
2119     }
2120 }
2121 
2122 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2123 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2124 
2125 TYPEINIT1( SdXMLMeasureShapeContext, SdXMLShapeContext );
2126 
SdXMLMeasureShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2127 SdXMLMeasureShapeContext::SdXMLMeasureShapeContext(
2128     SvXMLImport& rImport,
2129     sal_uInt16 nPrfx,
2130     const OUString& rLocalName,
2131     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2132     uno::Reference< drawing::XShapes >& rShapes,
2133     sal_Bool bTemporaryShape)
2134 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2135     maStart(0,0),
2136     maEnd(1,1)
2137 {
2138 }
2139 
2140 //////////////////////////////////////////////////////////////////////////////
2141 
~SdXMLMeasureShapeContext()2142 SdXMLMeasureShapeContext::~SdXMLMeasureShapeContext()
2143 {
2144 }
2145 
2146 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2147 void SdXMLMeasureShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2148 {
2149     switch( nPrefix )
2150     {
2151     case XML_NAMESPACE_SVG:
2152     {
2153         if( IsXMLToken( rLocalName, XML_X1 ) )
2154         {
2155             GetImport().GetMM100UnitConverter().convertMeasure(maStart.X, rValue);
2156             return;
2157         }
2158         if( IsXMLToken( rLocalName, XML_Y1 ) )
2159         {
2160             GetImport().GetMM100UnitConverter().convertMeasure(maStart.Y, rValue);
2161             return;
2162         }
2163         if( IsXMLToken( rLocalName, XML_X2 ) )
2164         {
2165             GetImport().GetMM100UnitConverter().convertMeasure(maEnd.X, rValue);
2166             return;
2167         }
2168         if( IsXMLToken( rLocalName, XML_Y2 ) )
2169         {
2170             GetImport().GetMM100UnitConverter().convertMeasure(maEnd.Y, rValue);
2171             return;
2172         }
2173     }
2174     }
2175 
2176     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2177 }
2178 
2179 //////////////////////////////////////////////////////////////////////////////
2180 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2181 void SdXMLMeasureShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2182 {
2183     // create Measure shape
2184     // add, set style and properties from base shape
2185     AddShape("com.sun.star.drawing.MeasureShape");
2186     if(mxShape.is())
2187     {
2188         SetStyle();
2189         SetLayer();
2190 
2191         uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2192         if( xProps.is() )
2193         {
2194             uno::Any aAny;
2195             aAny <<= maStart;
2196             xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("StartPosition")), aAny);
2197 
2198             aAny <<= maEnd;
2199             xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("EndPosition")), aAny );
2200         }
2201 
2202         // delete pre created fields
2203         uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2204         if( xText.is() )
2205         {
2206             const OUString aEmpty( RTL_CONSTASCII_USTRINGPARAM( " " ) );
2207             xText->setString( aEmpty );
2208         }
2209 
2210         SdXMLShapeContext::StartElement(xAttrList);
2211     }
2212 }
2213 
EndElement()2214 void SdXMLMeasureShapeContext::EndElement()
2215 {
2216     do
2217     {
2218         // delete pre created fields
2219         uno::Reference< text::XText > xText( mxShape, uno::UNO_QUERY );
2220         if( !xText.is() )
2221             break;
2222 
2223         uno::Reference< text::XTextCursor > xCursor( xText->createTextCursor() );
2224         if( !xCursor.is() )
2225             break;
2226 
2227         const OUString aEmpty;
2228         xCursor->collapseToStart();
2229         xCursor->goRight( 1, sal_True );
2230         xCursor->setString( aEmpty );
2231     }
2232     while(0);
2233 
2234     SdXMLShapeContext::EndElement();
2235 }
2236 
2237 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2238 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2239 
2240 TYPEINIT1( SdXMLPageShapeContext, SdXMLShapeContext );
2241 
SdXMLPageShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2242 SdXMLPageShapeContext::SdXMLPageShapeContext(
2243     SvXMLImport& rImport,
2244     sal_uInt16 nPrfx,
2245     const OUString& rLocalName,
2246     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2247     uno::Reference< drawing::XShapes >& rShapes,
2248     sal_Bool bTemporaryShape)
2249 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ), mnPageNumber(0)
2250 {
2251     mbClearDefaultAttributes = false;
2252 }
2253 
2254 //////////////////////////////////////////////////////////////////////////////
2255 
~SdXMLPageShapeContext()2256 SdXMLPageShapeContext::~SdXMLPageShapeContext()
2257 {
2258 }
2259 
2260 //////////////////////////////////////////////////////////////////////////////
2261 
2262 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2263 void SdXMLPageShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2264 {
2265     if( XML_NAMESPACE_DRAW == nPrefix )
2266     {
2267         if( IsXMLToken( rLocalName, XML_PAGE_NUMBER ) )
2268         {
2269             mnPageNumber = rValue.toInt32();
2270             return;
2271         }
2272     }
2273 
2274     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2275 }
2276 
2277 //////////////////////////////////////////////////////////////////////////////
2278 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2279 void SdXMLPageShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2280 {
2281     // create Page shape
2282     // add, set style and properties from base shape
2283 
2284     // #86163# take into account which type of PageShape needs to
2285     // be constructed. It's an pres shape if presentation:XML_CLASS == XML_PRESENTATION_PAGE.
2286     sal_Bool bIsPresentation = maPresentationClass.getLength() &&
2287            GetImport().GetShapeImport()->IsPresentationShapesSupported();
2288 
2289     uno::Reference< lang::XServiceInfo > xInfo( mxShapes, uno::UNO_QUERY );
2290     const sal_Bool bIsOnHandoutPage = xInfo.is() && xInfo->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.HandoutMasterPage")) );
2291 
2292     if( bIsOnHandoutPage )
2293     {
2294         AddShape("com.sun.star.presentation.HandoutShape");
2295     }
2296     else
2297     {
2298         if(bIsPresentation && !IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
2299         {
2300             bIsPresentation = sal_False;
2301         }
2302 
2303         if(bIsPresentation)
2304         {
2305             AddShape("com.sun.star.presentation.PageShape");
2306         }
2307         else
2308         {
2309             AddShape("com.sun.star.drawing.PageShape");
2310         }
2311     }
2312 
2313     if(mxShape.is())
2314     {
2315         SetStyle();
2316         SetLayer();
2317 
2318         // set pos, size, shear and rotate
2319         SetTransformation();
2320 
2321         uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2322         if(xPropSet.is())
2323         {
2324             uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
2325             const OUString aPageNumberStr(RTL_CONSTASCII_USTRINGPARAM("PageNumber"));
2326             if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(aPageNumberStr))
2327                 xPropSet->setPropertyValue(aPageNumberStr, uno::makeAny( mnPageNumber ));
2328         }
2329 
2330         SdXMLShapeContext::StartElement(xAttrList);
2331     }
2332 }
2333 
2334 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2335 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2336 
2337 TYPEINIT1( SdXMLCaptionShapeContext, SdXMLShapeContext );
2338 
SdXMLCaptionShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2339 SdXMLCaptionShapeContext::SdXMLCaptionShapeContext(
2340     SvXMLImport& rImport,
2341     sal_uInt16 nPrfx,
2342     const OUString& rLocalName,
2343     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2344     uno::Reference< drawing::XShapes >& rShapes,
2345     sal_Bool bTemporaryShape)
2346 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2347     // #86616# for correct edge rounding import mnRadius needs to be initialized
2348     mnRadius( 0L )
2349 {
2350 }
2351 
2352 //////////////////////////////////////////////////////////////////////////////
2353 
~SdXMLCaptionShapeContext()2354 SdXMLCaptionShapeContext::~SdXMLCaptionShapeContext()
2355 {
2356 }
2357 
2358 //////////////////////////////////////////////////////////////////////////////
2359 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2360 void SdXMLCaptionShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2361 {
2362     // create Caption shape
2363     // add, set style and properties from base shape
2364     AddShape("com.sun.star.drawing.CaptionShape");
2365     if( mxShape.is() )
2366     {
2367         SetStyle();
2368         SetLayer();
2369 
2370         uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2371 
2372         // SJ: If AutoGrowWidthItem is set, SetTransformation will lead to the wrong SnapRect
2373         // because NbcAdjustTextFrameWidthAndHeight() is called (text is set later and center alignment
2374         // is the default setting, so the top left reference point that is used by the caption point is
2375         // no longer correct) There are two ways to solve this problem, temporarily disabling the
2376         // autogrowwith as we are doing here or to apply the CaptionPoint after setting text
2377         sal_Bool bIsAutoGrowWidth = sal_False;
2378         if ( xProps.is() )
2379         {
2380             uno::Any aAny( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth") ) ) );
2381             aAny >>= bIsAutoGrowWidth;
2382 
2383             if ( bIsAutoGrowWidth )
2384                 xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_False ) );
2385         }
2386 
2387         // set pos, size, shear and rotate
2388         SetTransformation();
2389         if( xProps.is() )
2390             xProps->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CaptionPoint")), uno::makeAny( maCaptionPoint ) );
2391 
2392         if ( bIsAutoGrowWidth )
2393             xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("TextAutoGrowWidth")), uno::makeAny( sal_True ) );
2394 
2395         if(mnRadius)
2396         {
2397             uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2398             if(xPropSet.is())
2399             {
2400                 try
2401                 {
2402                     xPropSet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("CornerRadius")), uno::makeAny( mnRadius ) );
2403                 }
2404                 catch( uno::Exception& )
2405                 {
2406                     DBG_ERROR( "exception during setting of corner radius!");
2407                 }
2408             }
2409         }
2410 
2411         SdXMLShapeContext::StartElement(xAttrList);
2412     }
2413 }
2414 
2415 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2416 void SdXMLCaptionShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2417 {
2418     if( XML_NAMESPACE_DRAW == nPrefix )
2419     {
2420         if( IsXMLToken( rLocalName, XML_CAPTION_POINT_X ) )
2421         {
2422             GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.X, rValue);
2423             return;
2424         }
2425         if( IsXMLToken( rLocalName, XML_CAPTION_POINT_Y ) )
2426         {
2427             GetImport().GetMM100UnitConverter().convertMeasure(maCaptionPoint.Y, rValue);
2428             return;
2429         }
2430         if( IsXMLToken( rLocalName, XML_CORNER_RADIUS ) )
2431         {
2432             GetImport().GetMM100UnitConverter().convertMeasure(mnRadius, rValue);
2433             return;
2434         }
2435     }
2436     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2437 }
2438 
2439 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2440 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2441 
2442 TYPEINIT1( SdXMLGraphicObjectShapeContext, SdXMLShapeContext );
2443 
SdXMLGraphicObjectShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2444 SdXMLGraphicObjectShapeContext::SdXMLGraphicObjectShapeContext(
2445     SvXMLImport& rImport,
2446     sal_uInt16 nPrfx,
2447     const OUString& rLocalName,
2448     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2449     uno::Reference< drawing::XShapes >& rShapes,
2450     sal_Bool bTemporaryShape)
2451 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2452     maURL(),
2453     mbLateAddToIdentifierMapper(false)
2454 {
2455 }
2456 
2457 //////////////////////////////////////////////////////////////////////////////
2458 
2459 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2460 void SdXMLGraphicObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2461 {
2462     if( XML_NAMESPACE_XLINK == nPrefix )
2463     {
2464         if( IsXMLToken( rLocalName, XML_HREF ) )
2465         {
2466             maURL = rValue;
2467             return;
2468         }
2469     }
2470 
2471     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2472 }
2473 
2474 //////////////////////////////////////////////////////////////////////////////
2475 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2476 void SdXMLGraphicObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2477 {
2478     // create graphic object shape
2479     const char *pService;
2480 
2481     if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) && GetImport().GetShapeImport()->IsPresentationShapesSupported() )
2482     {
2483         pService = "com.sun.star.presentation.GraphicObjectShape";
2484     }
2485     else
2486     {
2487         pService = "com.sun.star.drawing.GraphicObjectShape";
2488     }
2489 
2490     AddShape( pService );
2491 
2492     if(mxShape.is())
2493     {
2494         SetStyle();
2495         SetLayer();
2496 
2497         uno::Reference< beans::XPropertySet > xPropset(mxShape, uno::UNO_QUERY);
2498         if(xPropset.is())
2499         {
2500             // since OOo 1.x had no line or fill style for graphics, but may create
2501             // documents with them, we have to override them here
2502             sal_Int32 nUPD, nBuildId;
2503             if( GetImport().getBuildIds( nUPD, nBuildId ) && (nUPD == 645) ) try
2504             {
2505                 xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), Any( FillStyle_NONE ) );
2506                 xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("LineStyle")), Any( LineStyle_NONE ) );
2507             }
2508             catch( Exception& )
2509             {
2510             }
2511 
2512             uno::Reference< beans::XPropertySetInfo > xPropsInfo( xPropset->getPropertySetInfo() );
2513             if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2514                 xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( mbIsPlaceholder ) );
2515 
2516             if( !mbIsPlaceholder )
2517             {
2518                 if( maURL.getLength() )
2519                 {
2520                     uno::Any aAny;
2521                     aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() );
2522                     try
2523                     {
2524                         xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2525                         xPropset->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2526                     }
2527                     catch (lang::IllegalArgumentException const &)
2528                     {
2529                     }
2530                 }
2531             }
2532         }
2533 
2534         if(mbIsUserTransformed)
2535         {
2536             uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2537             if(xProps.is())
2538             {
2539                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2540                 if( xPropsInfo.is() )
2541                 {
2542                     if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2543                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2544                 }
2545             }
2546         }
2547 
2548         // set pos, size, shear and rotate
2549         SetTransformation();
2550 
2551         SdXMLShapeContext::StartElement(mxAttrList);
2552     }
2553 }
2554 
EndElement()2555 void SdXMLGraphicObjectShapeContext::EndElement()
2556 {
2557     if( mxBase64Stream.is() )
2558     {
2559         OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) );
2560         if( sURL.getLength() )
2561         {
2562             try
2563             {
2564                 uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2565                 if(xProps.is())
2566                 {
2567                     const uno::Any aAny( uno::makeAny( sURL ) );
2568                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL") ), aAny );
2569                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL") ), aAny );
2570                 }
2571             }
2572             catch (lang::IllegalArgumentException const &)
2573             {
2574             }
2575         }
2576     }
2577 
2578     SdXMLShapeContext::EndElement();
2579 }
2580 
2581 
2582 //////////////////////////////////////////////////////////////////////////////
2583 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)2584 SvXMLImportContext* SdXMLGraphicObjectShapeContext::CreateChildContext(
2585     sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2586     const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2587 {
2588     SvXMLImportContext* pContext = NULL;
2589 
2590     if( (XML_NAMESPACE_OFFICE == nPrefix) &&
2591              xmloff::token::IsXMLToken( rLocalName, xmloff::token::XML_BINARY_DATA ) )
2592     {
2593         if( !maURL.getLength() && !mxBase64Stream.is() )
2594         {
2595             mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64();
2596             if( mxBase64Stream.is() )
2597                 pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2598                                                     rLocalName, xAttrList,
2599                                                     mxBase64Stream );
2600         }
2601     }
2602 
2603     // delegate to parent class if no context could be created
2604     if ( NULL == pContext )
2605         pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName,
2606                                                          xAttrList);
2607 
2608     return pContext;
2609 }
2610 
2611 //////////////////////////////////////////////////////////////////////////////
2612 
~SdXMLGraphicObjectShapeContext()2613 SdXMLGraphicObjectShapeContext::~SdXMLGraphicObjectShapeContext()
2614 {
2615 
2616 }
2617 
2618 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2619 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2620 
2621 TYPEINIT1( SdXMLChartShapeContext, SdXMLShapeContext );
2622 
SdXMLChartShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)2623 SdXMLChartShapeContext::SdXMLChartShapeContext(
2624     SvXMLImport& rImport,
2625     sal_uInt16 nPrfx,
2626     const OUString& rLocalName,
2627     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2628     uno::Reference< drawing::XShapes >& rShapes,
2629     sal_Bool bTemporaryShape)
2630 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2631     mpChartContext( NULL )
2632 {
2633 }
2634 
2635 //////////////////////////////////////////////////////////////////////////////
2636 
~SdXMLChartShapeContext()2637 SdXMLChartShapeContext::~SdXMLChartShapeContext()
2638 {
2639     if( mpChartContext )
2640         delete mpChartContext;
2641 }
2642 
2643 //////////////////////////////////////////////////////////////////////////////
2644 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)2645 void SdXMLChartShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>& xAttrList)
2646 {
2647     const sal_Bool bIsPresentation = isPresentationShape();
2648 
2649     AddShape( bIsPresentation ? "com.sun.star.presentation.ChartShape" : "com.sun.star.drawing.OLE2Shape" );
2650 
2651     if(mxShape.is())
2652     {
2653         SetStyle();
2654         SetLayer();
2655 
2656         if( !mbIsPlaceholder )
2657         {
2658             uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2659             if(xProps.is())
2660             {
2661                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2662                 if( xPropsInfo.is() && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2663                     xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2664 
2665                 uno::Any aAny;
2666 
2667                 const OUString aCLSID( RTL_CONSTASCII_USTRINGPARAM("12DCAE26-281F-416F-a234-c3086127382e"));
2668 
2669                 aAny <<= aCLSID;
2670                 xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), aAny );
2671 
2672 #ifndef SVX_LIGHT
2673                 aAny = xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) );
2674                 uno::Reference< frame::XModel > xChartModel;
2675                 if( aAny >>= xChartModel )
2676                 {
2677                     mpChartContext = GetImport().GetChartImport()->CreateChartContext( GetImport(), XML_NAMESPACE_SVG, GetXMLToken(XML_CHART), xChartModel, xAttrList );
2678                 }
2679 #endif
2680             }
2681         }
2682 
2683         if(mbIsUserTransformed)
2684         {
2685             uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2686             if(xProps.is())
2687             {
2688                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2689                 if( xPropsInfo.is() )
2690                 {
2691                     if( xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2692                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2693                 }
2694             }
2695         }
2696 
2697 
2698         // set pos, size, shear and rotate
2699         SetTransformation();
2700 
2701         SdXMLShapeContext::StartElement(xAttrList);
2702 
2703         if( mpChartContext )
2704             mpChartContext->StartElement( xAttrList );
2705     }
2706 }
2707 
EndElement()2708 void SdXMLChartShapeContext::EndElement()
2709 {
2710     if( mpChartContext )
2711         mpChartContext->EndElement();
2712 
2713     SdXMLShapeContext::EndElement();
2714 }
2715 
Characters(const::rtl::OUString & rChars)2716 void SdXMLChartShapeContext::Characters( const ::rtl::OUString& rChars )
2717 {
2718     if( mpChartContext )
2719         mpChartContext->Characters( rChars );
2720 }
2721 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)2722 SvXMLImportContext * SdXMLChartShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2723         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
2724 {
2725     if( mpChartContext )
2726         return mpChartContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
2727 
2728     return NULL;
2729 }
2730 
2731 //////////////////////////////////////////////////////////////////////////////
2732 
2733 TYPEINIT1( SdXMLObjectShapeContext, SdXMLShapeContext );
2734 
SdXMLObjectShapeContext(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,sal_Bool bTemporaryShape)2735 SdXMLObjectShapeContext::SdXMLObjectShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2736         const rtl::OUString& rLocalName,
2737         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2738         com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2739         sal_Bool bTemporaryShape)
2740 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
2741 {
2742 }
2743 
~SdXMLObjectShapeContext()2744 SdXMLObjectShapeContext::~SdXMLObjectShapeContext()
2745 {
2746 }
2747 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2748 void SdXMLObjectShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2749 {
2750     // #96717# in theorie, if we don't have a url we shouldn't even
2751     // export this ole shape. But practical its to risky right now
2752     // to change this so we better dispose this on load
2753     //if( !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2754     //  return;
2755 
2756     // #100592# this BugFix prevents that a shape is created. CL
2757     // is thinking about an alternative.
2758     // #i13140# Check for more than empty string in maHref, there are
2759     // other possibilities that maHref results in empty container
2760     // storage names
2761     if( !(GetImport().getImportFlags() & IMPORT_EMBEDDED) && !mbIsPlaceholder && ImpIsEmptyURL(maHref) )
2762         return;
2763 
2764     const char* pService = "com.sun.star.drawing.OLE2Shape";
2765 
2766     sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
2767 
2768     if( bIsPresShape )
2769     {
2770         if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) )
2771         {
2772             pService = "com.sun.star.presentation.ChartShape";
2773         }
2774         else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
2775         {
2776             pService = "com.sun.star.presentation.CalcShape";
2777         }
2778         else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
2779         {
2780             pService = "com.sun.star.presentation.OLE2Shape";
2781         }
2782     }
2783 
2784     AddShape( pService );
2785 
2786     if( mxShape.is() )
2787     {
2788         SetLayer();
2789 
2790         if(bIsPresShape)
2791         {
2792             uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2793             if(xProps.is())
2794             {
2795                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
2796                 if( xPropsInfo.is() )
2797                 {
2798                     if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
2799                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
2800 
2801                     if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
2802                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
2803                 }
2804             }
2805         }
2806 
2807         if( !mbIsPlaceholder && maHref.getLength() )
2808         {
2809             uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
2810 
2811             if( xProps.is() )
2812             {
2813                 OUString aPersistName = GetImport().ResolveEmbeddedObjectURL( maHref, maCLSID );
2814 
2815                 if ( GetImport().IsPackageURL( maHref ) )
2816                 {
2817                     const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2818 
2819                     if ( aPersistName.compareTo( sURL, sURL.getLength() ) == 0 )
2820                         aPersistName = aPersistName.copy( sURL.getLength() );
2821 
2822                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ),
2823                                               uno::makeAny( aPersistName ) );
2824                 }
2825                 else
2826                 {
2827                     // this is OOo link object
2828                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "LinkURL" ) ),
2829                                               uno::makeAny( aPersistName ) );
2830                 }
2831             }
2832         }
2833 
2834         // set pos, size, shear and rotate
2835         SetTransformation();
2836 
2837         SetStyle();
2838 
2839         GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2840     }
2841 }
2842 
EndElement()2843 void SdXMLObjectShapeContext::EndElement()
2844 {
2845     // #i67705#
2846     const sal_uInt16 nGeneratorVersion(GetImport().getGeneratorVersion());
2847 
2848     if(nGeneratorVersion < SvXMLImport::OOo_34x)
2849     {
2850         // #i118485#
2851         // If it's an old file from us written before OOo3.4, we need to correct
2852         // FillStyle and LineStyle for OLE2 objects. The error was that the old paint
2853         // implementations just ignored added fill/linestyles completely, thus
2854         // those objects need to be corrected to not show blue and hairline which
2855         // always was the default, but would be shown now
2856         uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2857 
2858         if( xProps.is() )
2859         {
2860             xProps->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), uno::makeAny(drawing::FillStyle_NONE));
2861             xProps->setPropertyValue(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LineStyle")), uno::makeAny(drawing::LineStyle_NONE));
2862         }
2863     }
2864 
2865     // #100592#
2866     if( mxBase64Stream.is() )
2867     {
2868         OUString aPersistName( GetImport().ResolveEmbeddedObjectURLFromBase64() );
2869         const OUString  sURL(RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ));
2870 
2871         aPersistName = aPersistName.copy( sURL.getLength() );
2872 
2873         uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
2874         if( xProps.is() )
2875             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PersistName" ) ), uno::makeAny( aPersistName ) );
2876     }
2877 
2878     SdXMLShapeContext::EndElement();
2879 }
2880 
2881 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2882 void SdXMLObjectShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2883 {
2884     switch( nPrefix )
2885     {
2886     case XML_NAMESPACE_DRAW:
2887         if( IsXMLToken( rLocalName, XML_CLASS_ID ) )
2888         {
2889             maCLSID = rValue;
2890             return;
2891         }
2892         break;
2893     case XML_NAMESPACE_XLINK:
2894         if( IsXMLToken( rLocalName, XML_HREF ) )
2895         {
2896             maHref = rValue;
2897             return;
2898         }
2899         break;
2900     }
2901 
2902     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
2903 }
2904 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)2905 SvXMLImportContext* SdXMLObjectShapeContext::CreateChildContext(
2906     sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
2907     const uno::Reference<xml::sax::XAttributeList>& xAttrList )
2908 {
2909     // #100592#
2910     SvXMLImportContext* pContext = NULL;
2911 
2912     if((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_BINARY_DATA))
2913     {
2914         mxBase64Stream = GetImport().GetStreamForEmbeddedObjectURLFromBase64();
2915         if( mxBase64Stream.is() )
2916             pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
2917                                                 rLocalName, xAttrList,
2918                                                 mxBase64Stream );
2919     }
2920     else if( ((XML_NAMESPACE_OFFICE == nPrefix) && IsXMLToken(rLocalName, XML_DOCUMENT)) ||
2921                 ((XML_NAMESPACE_MATH == nPrefix) && IsXMLToken(rLocalName, XML_MATH)) )
2922     {
2923         XMLEmbeddedObjectImportContext *pEContext =
2924             new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
2925                                                 rLocalName, xAttrList );
2926         maCLSID = pEContext->GetFilterCLSID();
2927         if( maCLSID.getLength() != 0 )
2928         {
2929             uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
2930             if( xPropSet.is() )
2931             {
2932                 xPropSet->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("CLSID") ), uno::makeAny( maCLSID ) );
2933 
2934                 uno::Reference< lang::XComponent > xComp;
2935                 xPropSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ) >>= xComp;
2936                 DBG_ASSERT( xComp.is(), "no xModel for own OLE format" );
2937                 pEContext->SetComponent( xComp );
2938             }
2939         }
2940         pContext = pEContext;
2941     }
2942 
2943     // delegate to parent class if no context could be created
2944     if(!pContext)
2945         pContext = SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
2946 
2947     return pContext;
2948 }
2949 
2950 //////////////////////////////////////////////////////////////////////////////
2951 
2952 TYPEINIT1( SdXMLAppletShapeContext, SdXMLShapeContext );
2953 
SdXMLAppletShapeContext(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,sal_Bool bTemporaryShape)2954 SdXMLAppletShapeContext::SdXMLAppletShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
2955         const rtl::OUString& rLocalName,
2956         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
2957         com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
2958         sal_Bool bTemporaryShape)
2959 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
2960   mbIsScript( sal_False )
2961 {
2962 }
2963 
~SdXMLAppletShapeContext()2964 SdXMLAppletShapeContext::~SdXMLAppletShapeContext()
2965 {
2966 }
2967 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)2968 void SdXMLAppletShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
2969 {
2970     const char* pService = "com.sun.star.drawing.AppletShape";
2971     AddShape( pService );
2972 
2973     if( mxShape.is() )
2974     {
2975         SetLayer();
2976 
2977         // set pos, size, shear and rotate
2978         SetTransformation();
2979         GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
2980     }
2981 }
2982 
2983 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)2984 void SdXMLAppletShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
2985 {
2986     switch( nPrefix )
2987     {
2988     case XML_NAMESPACE_DRAW:
2989         if( IsXMLToken( rLocalName, XML_APPLET_NAME ) )
2990         {
2991             maAppletName = rValue;
2992             return;
2993         }
2994         if( IsXMLToken( rLocalName, XML_CODE ) )
2995         {
2996             maAppletCode = rValue;
2997             return;
2998         }
2999         if( IsXMLToken( rLocalName, XML_MAY_SCRIPT ) )
3000         {
3001             mbIsScript = IsXMLToken( rValue, XML_TRUE );
3002             return;
3003         }
3004         break;
3005     case XML_NAMESPACE_XLINK:
3006         if( IsXMLToken( rLocalName, XML_HREF ) )
3007         {
3008             maHref = GetImport().GetAbsoluteReference(rValue);
3009             return;
3010         }
3011         break;
3012     }
3013 
3014     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3015 }
3016 
EndElement()3017 void SdXMLAppletShapeContext::EndElement()
3018 {
3019     uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3020     if( xProps.is() )
3021     {
3022         uno::Any aAny;
3023 
3024         if ( maSize.Width && maSize.Height )
3025         {
3026             // the visual area for applet must be set on loading
3027             awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3028             aAny <<= aRect;
3029             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
3030         }
3031 
3032         if( maParams.getLength() )
3033         {
3034             aAny <<= maParams;
3035             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCommands" ) ), aAny );
3036         }
3037 
3038         if( maHref.getLength() )
3039         {
3040             aAny <<= maHref;
3041             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCodeBase" ) ), aAny );
3042         }
3043 
3044         if( maAppletName.getLength() )
3045         {
3046             aAny <<= maAppletName;
3047             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletName" ) ), aAny );
3048         }
3049 
3050         if( mbIsScript )
3051         {
3052             aAny <<= mbIsScript;
3053             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletIsScript" ) ), aAny );
3054 
3055         }
3056 
3057         if( maAppletCode.getLength() )
3058         {
3059             aAny <<= maAppletCode;
3060             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletCode" ) ), aAny );
3061         }
3062 
3063         aAny <<= ::rtl::OUString( GetImport().GetDocumentBase() );
3064         xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "AppletDocBase" ) ), aAny );
3065 
3066         SetThumbnail();
3067     }
3068 
3069     SdXMLShapeContext::EndElement();
3070 }
3071 
CreateChildContext(sal_uInt16 p_nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)3072 SvXMLImportContext * SdXMLAppletShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3073 {
3074     if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3075     {
3076         OUString aParamName, aParamValue;
3077         const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3078         // now parse the attribute list and look for draw:name and draw:value
3079         for(sal_Int16 a(0); a < nAttrCount; a++)
3080         {
3081             const OUString& rAttrName = xAttrList->getNameByIndex(a);
3082             OUString aLocalName;
3083             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3084             const OUString aValue( xAttrList->getValueByIndex(a) );
3085 
3086             if( nPrefix == XML_NAMESPACE_DRAW )
3087             {
3088                 if( IsXMLToken( aLocalName, XML_NAME ) )
3089                 {
3090                     aParamName = aValue;
3091                 }
3092                 else if( IsXMLToken( aLocalName, XML_VALUE ) )
3093                 {
3094                     aParamValue = aValue;
3095                 }
3096             }
3097         }
3098 
3099         if( aParamName.getLength() )
3100         {
3101             sal_Int32 nIndex = maParams.getLength();
3102             maParams.realloc( nIndex + 1 );
3103             maParams[nIndex].Name = aParamName;
3104             maParams[nIndex].Handle = -1;
3105             maParams[nIndex].Value <<= aParamValue;
3106             maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3107         }
3108 
3109         return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3110     }
3111 
3112     return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3113 }
3114 
3115 //////////////////////////////////////////////////////////////////////////////
3116 
3117 TYPEINIT1( SdXMLPluginShapeContext, SdXMLShapeContext );
3118 
SdXMLPluginShapeContext(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,sal_Bool bTemporaryShape)3119 SdXMLPluginShapeContext::SdXMLPluginShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3120         const rtl::OUString& rLocalName,
3121         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3122         com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3123         sal_Bool bTemporaryShape) :
3124 SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3125 mbMedia( false )
3126 {
3127 }
3128 
~SdXMLPluginShapeContext()3129 SdXMLPluginShapeContext::~SdXMLPluginShapeContext()
3130 {
3131 }
3132 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)3133 void SdXMLPluginShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList)
3134 {
3135     // watch for MimeType attribute to see if we have a media object
3136     for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
3137     {
3138         OUString    aLocalName;
3139         sal_uInt16  nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
3140 
3141         if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
3142         {
3143             if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) )
3144                 mbMedia = true;
3145 
3146             // leave this loop
3147             n = nAttrCount - 1;
3148         }
3149     }
3150 
3151     const char* pService;
3152 
3153     sal_Bool bIsPresShape = sal_False;
3154 
3155     if( mbMedia )
3156     {
3157         pService = "com.sun.star.drawing.MediaShape";
3158 
3159         bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3160         if( bIsPresShape )
3161         {
3162             if( IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3163             {
3164                 pService = "com.sun.star.presentation.MediaShape";
3165             }
3166         }
3167     }
3168     else
3169         pService = "com.sun.star.drawing.PluginShape";
3170 
3171     AddShape( pService );
3172 
3173     if( mxShape.is() )
3174     {
3175         SetLayer();
3176 
3177         if(bIsPresShape)
3178         {
3179             uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3180             if(xProps.is())
3181             {
3182                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3183                 if( xPropsInfo.is() )
3184                 {
3185                     if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3186                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3187 
3188                     if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3189                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3190                 }
3191             }
3192         }
3193 
3194         // set pos, size, shear and rotate
3195         SetTransformation();
3196         GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3197     }
3198 }
3199 
3200 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3201 void SdXMLPluginShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3202 {
3203     switch( nPrefix )
3204     {
3205     case XML_NAMESPACE_DRAW:
3206         if( IsXMLToken( rLocalName, XML_MIME_TYPE ) )
3207         {
3208             maMimeType = rValue;
3209             return;
3210         }
3211         break;
3212     case XML_NAMESPACE_XLINK:
3213         if( IsXMLToken( rLocalName, XML_HREF ) )
3214         {
3215             maHref = GetImport().GetAbsoluteReference(rValue);
3216             return;
3217         }
3218         break;
3219     }
3220 
3221     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3222 }
3223 
EndElement()3224 void SdXMLPluginShapeContext::EndElement()
3225 {
3226     uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3227 
3228     if( xProps.is() )
3229     {
3230         uno::Any aAny;
3231 
3232         if ( maSize.Width && maSize.Height )
3233         {
3234             const rtl::OUString sVisibleArea( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) );
3235             uno::Reference< beans::XPropertySetInfo > aXPropSetInfo( xProps->getPropertySetInfo() );
3236             if ( !aXPropSetInfo.is() || aXPropSetInfo->hasPropertyByName( sVisibleArea ) )
3237             {
3238                 // the visual area for a plugin must be set on loading
3239                 awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3240                 aAny <<= aRect;
3241                 xProps->setPropertyValue( sVisibleArea, aAny );
3242             }
3243         }
3244 
3245         if( !mbMedia )
3246         {
3247             // in case we have a plugin object
3248             if( maParams.getLength() )
3249             {
3250                 aAny <<= maParams;
3251                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginCommands" ) ), aAny );
3252             }
3253 
3254             if( maMimeType.getLength() )
3255             {
3256                 aAny <<= maMimeType;
3257                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginMimeType" ) ), aAny );
3258             }
3259 
3260             if( maHref.getLength() )
3261             {
3262                 aAny <<= maHref;
3263                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "PluginURL" ) ), aAny );
3264             }
3265         }
3266         else
3267         {
3268             // in case we have a media object
3269 
3270             OUString sTempRef;
3271 
3272             // check for package URL
3273             if( GetImport().IsPackageURL( maHref ) )
3274             {
3275                 sTempRef = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
3276             }
3277 
3278             sTempRef += maHref;
3279 
3280             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ), uno::makeAny( sTempRef ) );
3281 
3282             for( sal_Int32 nParam = 0; nParam < maParams.getLength(); ++nParam )
3283             {
3284                 const OUString& rName = maParams[ nParam ].Name;
3285 
3286                 if( 0 == rName.compareToAscii( "Loop" ) )
3287                 {
3288                     OUString aValueStr;
3289                     maParams[ nParam ].Value >>= aValueStr;
3290                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" ) ),
3291                         uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3292                 }
3293                 else if( 0 == rName.compareToAscii( "Mute" ) )
3294                 {
3295                     OUString aValueStr;
3296                     maParams[ nParam ].Value >>= aValueStr;
3297                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" ) ),
3298                         uno::makeAny( static_cast< sal_Bool >( 0 == aValueStr.compareToAscii( "true" ) ) ) );
3299                 }
3300                 else if( 0 == rName.compareToAscii( "VolumeDB" ) )
3301                 {
3302                     OUString aValueStr;
3303                     maParams[ nParam ].Value >>= aValueStr;
3304                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ) ),
3305                                                 uno::makeAny( static_cast< sal_Int16 >( aValueStr.toInt32() ) ) );
3306                 }
3307                 else if( 0 == rName.compareToAscii( "Zoom" ) )
3308                 {
3309                     OUString            aZoomStr;
3310                     media::ZoomLevel    eZoomLevel;
3311 
3312                     maParams[ nParam ].Value >>= aZoomStr;
3313 
3314                     if( 0 == aZoomStr.compareToAscii( "25%" ) )
3315                         eZoomLevel = media::ZoomLevel_ZOOM_1_TO_4;
3316                     else if( 0 == aZoomStr.compareToAscii( "50%" ) )
3317                         eZoomLevel = media::ZoomLevel_ZOOM_1_TO_2;
3318                     else if( 0 == aZoomStr.compareToAscii( "100%" ) )
3319                         eZoomLevel = media::ZoomLevel_ORIGINAL;
3320                     else if( 0 == aZoomStr.compareToAscii( "200%" ) )
3321                         eZoomLevel = media::ZoomLevel_ZOOM_2_TO_1;
3322                     else if( 0 == aZoomStr.compareToAscii( "400%" ) )
3323                         eZoomLevel = media::ZoomLevel_ZOOM_4_TO_1;
3324                     else if( 0 == aZoomStr.compareToAscii( "fit" ) )
3325                         eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW;
3326                     else if( 0 == aZoomStr.compareToAscii( "fixedfit" ) )
3327                         eZoomLevel = media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT;
3328                     else if( 0 == aZoomStr.compareToAscii( "fullscreen" ) )
3329                         eZoomLevel = media::ZoomLevel_FULLSCREEN;
3330                     else
3331                         eZoomLevel = media::ZoomLevel_NOT_AVAILABLE;
3332 
3333                     xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ) ), uno::makeAny( eZoomLevel ) );
3334                 }
3335             }
3336         }
3337 
3338         SetThumbnail();
3339     }
3340 
3341     SdXMLShapeContext::EndElement();
3342 }
3343 
CreateChildContext(sal_uInt16 p_nPrefix,const::rtl::OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList)3344 SvXMLImportContext * SdXMLPluginShapeContext::CreateChildContext( sal_uInt16 p_nPrefix, const ::rtl::OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
3345 {
3346     if( p_nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( rLocalName, XML_PARAM ) )
3347     {
3348         OUString aParamName, aParamValue;
3349         const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
3350         // now parse the attribute list and look for draw:name and draw:value
3351         for(sal_Int16 a(0); a < nAttrCount; a++)
3352         {
3353             const OUString& rAttrName = xAttrList->getNameByIndex(a);
3354             OUString aLocalName;
3355             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(rAttrName, &aLocalName);
3356             const OUString aValue( xAttrList->getValueByIndex(a) );
3357 
3358             if( nPrefix == XML_NAMESPACE_DRAW )
3359             {
3360                 if( IsXMLToken( aLocalName, XML_NAME ) )
3361                 {
3362                     aParamName = aValue;
3363                 }
3364                 else if( IsXMLToken( aLocalName, XML_VALUE ) )
3365                 {
3366                     aParamValue = aValue;
3367                 }
3368             }
3369 
3370             if( aParamName.getLength() )
3371             {
3372                 sal_Int32 nIndex = maParams.getLength();
3373                 maParams.realloc( nIndex + 1 );
3374                 maParams[nIndex].Name = aParamName;
3375                 maParams[nIndex].Handle = -1;
3376                 maParams[nIndex].Value <<= aParamValue;
3377                 maParams[nIndex].State = beans::PropertyState_DIRECT_VALUE;
3378             }
3379         }
3380 
3381         return new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
3382     }
3383 
3384     return SdXMLShapeContext::CreateChildContext( p_nPrefix, rLocalName, xAttrList );
3385 }
3386 
3387 //////////////////////////////////////////////////////////////////////////////
3388 
3389 TYPEINIT1( SdXMLFloatingFrameShapeContext, SdXMLShapeContext );
3390 
SdXMLFloatingFrameShapeContext(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,sal_Bool bTemporaryShape)3391 SdXMLFloatingFrameShapeContext::SdXMLFloatingFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3392         const rtl::OUString& rLocalName,
3393         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3394         com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3395         sal_Bool bTemporaryShape)
3396 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3397 {
3398 }
3399 
~SdXMLFloatingFrameShapeContext()3400 SdXMLFloatingFrameShapeContext::~SdXMLFloatingFrameShapeContext()
3401 {
3402 }
3403 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)3404 void SdXMLFloatingFrameShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& )
3405 {
3406     const char* pService = "com.sun.star.drawing.FrameShape";
3407     AddShape( pService );
3408 
3409     if( mxShape.is() )
3410     {
3411         SetLayer();
3412 
3413         // set pos, size, shear and rotate
3414         SetTransformation();
3415 
3416         uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3417         if( xProps.is() )
3418         {
3419             uno::Any aAny;
3420 
3421             if( maFrameName.getLength() )
3422             {
3423                 aAny <<= maFrameName;
3424                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameName" ) ), aAny );
3425             }
3426 
3427             if( maHref.getLength() )
3428             {
3429                 aAny <<= maHref;
3430                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "FrameURL" ) ), aAny );
3431             }
3432         }
3433 
3434         SetStyle();
3435 
3436         GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
3437     }
3438 }
3439 
3440 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3441 void SdXMLFloatingFrameShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3442 {
3443     switch( nPrefix )
3444     {
3445     case XML_NAMESPACE_DRAW:
3446         if( IsXMLToken( rLocalName, XML_FRAME_NAME ) )
3447         {
3448             maFrameName = rValue;
3449             return;
3450         }
3451         break;
3452     case XML_NAMESPACE_XLINK:
3453         if( IsXMLToken( rLocalName, XML_HREF ) )
3454         {
3455             maHref = GetImport().GetAbsoluteReference(rValue);
3456             return;
3457         }
3458         break;
3459     }
3460 
3461     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3462 }
3463 
EndElement()3464 void SdXMLFloatingFrameShapeContext::EndElement()
3465 {
3466     uno::Reference< beans::XPropertySet > xProps( mxShape, uno::UNO_QUERY );
3467 
3468     if( xProps.is() )
3469     {
3470         if ( maSize.Width && maSize.Height )
3471         {
3472             // the visual area for a floating frame must be set on loading
3473             awt::Rectangle aRect( 0, 0, maSize.Width, maSize.Height );
3474             uno::Any aAny;
3475             aAny <<= aRect;
3476             xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ), aAny );
3477         }
3478     }
3479 
3480     SetThumbnail();
3481     SdXMLShapeContext::EndElement();
3482 }
3483 
3484 //////////////////////////////////////////////////////////////////////////////
3485 
3486 TYPEINIT1( SdXMLFrameShapeContext, SdXMLShapeContext );
3487 
SdXMLFrameShapeContext(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,sal_Bool bTemporaryShape)3488 SdXMLFrameShapeContext::SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
3489         const rtl::OUString& rLocalName,
3490         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3491         com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& rShapes,
3492         sal_Bool bTemporaryShape)
3493 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape ),
3494     multiImageImportHelper(),
3495     mbSupportsReplacement( sal_False ),
3496     mxImplContext(),
3497     mxReplImplContext()
3498 {
3499     uno::Reference < util::XCloneable > xClone( xAttrList, uno::UNO_QUERY );
3500     if( xClone.is() )
3501         mxAttrList.set( xClone->createClone(), uno::UNO_QUERY );
3502     else
3503         mxAttrList = new SvXMLAttributeList( xAttrList );
3504 
3505 }
3506 
~SdXMLFrameShapeContext()3507 SdXMLFrameShapeContext::~SdXMLFrameShapeContext()
3508 {
3509 }
3510 
removeGraphicFromImportContext(const SvXMLImportContext & rContext) const3511 void SdXMLFrameShapeContext::removeGraphicFromImportContext(const SvXMLImportContext& rContext) const
3512 {
3513     const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3514 
3515     if(pSdXMLGraphicObjectShapeContext)
3516     {
3517         try
3518         {
3519             uno::Reference< container::XChild > xChild(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3520 
3521             if(xChild.is())
3522             {
3523                 uno::Reference< drawing::XShapes > xParent(xChild->getParent(), uno::UNO_QUERY_THROW);
3524 
3525                 if(xParent.is())
3526                 {
3527                     // remove from parent
3528                     xParent->remove(pSdXMLGraphicObjectShapeContext->getShape());
3529 
3530                     // dispose
3531                     uno::Reference< lang::XComponent > xComp(pSdXMLGraphicObjectShapeContext->getShape(), UNO_QUERY);
3532 
3533                     if(xComp.is())
3534                     {
3535                         xComp->dispose();
3536                     }
3537                 }
3538             }
3539         }
3540         catch( uno::Exception& )
3541         {
3542             DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" );
3543         }
3544     }
3545 }
3546 
getGraphicURLFromImportContext(const SvXMLImportContext & rContext) const3547 rtl::OUString SdXMLFrameShapeContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const
3548 {
3549     rtl::OUString aRetval;
3550     const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(&rContext);
3551 
3552     if(pSdXMLGraphicObjectShapeContext)
3553     {
3554         try
3555         {
3556             const uno::Reference< beans::XPropertySet > xPropSet(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY_THROW);
3557 
3558             if(xPropSet.is())
3559             {
3560                 xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicStreamURL"))) >>= aRetval;
3561 
3562                 if(!aRetval.getLength())
3563                 {
3564                     // it maybe a link, try GraphicURL
3565                     xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))) >>= aRetval;
3566                 }
3567             }
3568         }
3569         catch( uno::Exception& )
3570         {
3571             DBG_ERROR( "Error in cleanup of multiple graphic object import (!)" );
3572         }
3573     }
3574 
3575     return aRetval;
3576 }
3577 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)3578 SvXMLImportContext *SdXMLFrameShapeContext::CreateChildContext( sal_uInt16 nPrefix,
3579     const OUString& rLocalName,
3580     const uno::Reference< xml::sax::XAttributeList>& xAttrList )
3581 {
3582     SvXMLImportContext * pContext = 0;
3583 
3584     if( !mxImplContext.Is() )
3585     {
3586         pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3587             GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
3588 
3589         mxImplContext = pContext;
3590         mbSupportsReplacement = IsXMLToken(rLocalName, XML_OBJECT ) || IsXMLToken(rLocalName, XML_OBJECT_OLE);
3591         setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE));
3592 
3593         if(getSupportsMultipleContents())
3594         {
3595             SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
3596 
3597             if(pGSC)
3598             {
3599                 // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
3600                 pGSC->setLateAddToIdentifierMapper(true);
3601                 addContent(*mxImplContext);
3602             }
3603         }
3604     }
3605     else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == nPrefix && IsXMLToken(rLocalName, XML_IMAGE))
3606     {
3607         // read another image
3608         pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3609             GetImport(), nPrefix, rLocalName, xAttrList, mxShapes, mxAttrList);
3610         mxImplContext = pContext;
3611 
3612         SdXMLGraphicObjectShapeContext* pGSC = dynamic_cast< SdXMLGraphicObjectShapeContext* >(pContext);
3613 
3614         if(pGSC)
3615         {
3616             // mark context as LateAdd to avoid conflicts with multiple objects registering with the same ID
3617             pGSC->setLateAddToIdentifierMapper(true);
3618             addContent(*mxImplContext);
3619         }
3620     }
3621     else if( mbSupportsReplacement && !mxReplImplContext &&
3622              XML_NAMESPACE_DRAW == nPrefix &&
3623              IsXMLToken( rLocalName, XML_IMAGE ) )
3624     {
3625         // read replacement image
3626         SvXMLImportContext *pImplContext = &mxImplContext;
3627         SdXMLShapeContext *pSContext =
3628             PTR_CAST( SdXMLShapeContext, pImplContext );
3629         if( pSContext )
3630         {
3631             uno::Reference < beans::XPropertySet > xPropSet(
3632                     pSContext->getShape(), uno::UNO_QUERY );
3633             if( xPropSet.is() )
3634             {
3635                 pContext = new XMLReplacementImageContext( GetImport(),
3636                                     nPrefix, rLocalName, xAttrList, xPropSet );
3637                 mxReplImplContext = pContext;
3638             }
3639         }
3640     }
3641     else if(
3642             ( nPrefix == XML_NAMESPACE_SVG &&   // #i68101#
3643                 (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) ) ||
3644              (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) ||
3645              (nPrefix == XML_NAMESPACE_DRAW && (IsXMLToken( rLocalName, XML_GLUE_POINT ) ||
3646                                                 IsXMLToken( rLocalName, XML_THUMBNAIL ) ) ) )
3647     {
3648         SvXMLImportContext *pImplContext = &mxImplContext;
3649         pContext = PTR_CAST( SdXMLShapeContext, pImplContext )->CreateChildContext( nPrefix,
3650                                                                         rLocalName, xAttrList );
3651     }
3652     else if ( (XML_NAMESPACE_DRAW == nPrefix) && IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
3653     {
3654         SdXMLShapeContext *pSContext = dynamic_cast< SdXMLShapeContext* >( &mxImplContext );
3655         if( pSContext )
3656         {
3657             uno::Reference < beans::XPropertySet > xPropSet( pSContext->getShape(), uno::UNO_QUERY );
3658             if (xPropSet.is())
3659             {
3660                 pContext = new XMLImageMapContext(GetImport(), nPrefix, rLocalName, xPropSet);
3661             }
3662         }
3663     }
3664 
3665     // call parent for content
3666     if(!pContext)
3667         pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
3668 
3669     return pContext;
3670 }
3671 
StartElement(const uno::Reference<xml::sax::XAttributeList> &)3672 void SdXMLFrameShapeContext::StartElement(const uno::Reference< xml::sax::XAttributeList>&)
3673 {
3674     // ignore
3675 }
3676 
EndElement()3677 void SdXMLFrameShapeContext::EndElement()
3678 {
3679     /// solve if multiple image child contexts were imported
3680     const SvXMLImportContext* pWinner = solveMultipleImages();
3681     const SdXMLGraphicObjectShapeContext* pGSCWinner = dynamic_cast< const SdXMLGraphicObjectShapeContext* >(pWinner);
3682 
3683     /// if we have a winner and it's on LateAdd, add it now
3684     if(pGSCWinner && pGSCWinner->getLateAddToIdentifierMapper() && pGSCWinner->getShapeId().getLength())
3685     {
3686         uno::Reference< uno::XInterface > xRef( pGSCWinner->getShape(), uno::UNO_QUERY );
3687         GetImport().getInterfaceToIdentifierMapper().registerReference( pGSCWinner->getShapeId(), xRef );
3688     }
3689 
3690     if( !mxImplContext.Is() )
3691     {
3692         // now check if this is an empty presentation object
3693         sal_Int16 nAttrCount = mxAttrList.is() ? mxAttrList->getLength() : 0;
3694         for(sal_Int16 a(0); a < nAttrCount; a++)
3695         {
3696             OUString aLocalName;
3697             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(mxAttrList->getNameByIndex(a), &aLocalName);
3698 
3699             if( nPrefix == XML_NAMESPACE_PRESENTATION )
3700             {
3701                 if( IsXMLToken( aLocalName, XML_PLACEHOLDER ) )
3702                 {
3703                     mbIsPlaceholder = IsXMLToken( mxAttrList->getValueByIndex(a), XML_TRUE );
3704                 }
3705                 else if( IsXMLToken( aLocalName, XML_CLASS ) )
3706                 {
3707                     maPresentationClass = mxAttrList->getValueByIndex(a);
3708                 }
3709             }
3710         }
3711 
3712         if( (maPresentationClass.getLength() != 0) && mbIsPlaceholder )
3713         {
3714             uno::Reference< xml::sax::XAttributeList> xEmpty;
3715 
3716             enum XMLTokenEnum eToken = XML_TEXT_BOX;
3717 
3718             if( IsXMLToken( maPresentationClass, XML_GRAPHIC ) )
3719             {
3720                 eToken = XML_IMAGE;
3721 
3722             }
3723             else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_PAGE ) )
3724             {
3725                 eToken = XML_PAGE_THUMBNAIL;
3726             }
3727             else if( IsXMLToken( maPresentationClass, XML_PRESENTATION_CHART ) ||
3728                      IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) ||
3729                      IsXMLToken( maPresentationClass, XML_PRESENTATION_OBJECT ) )
3730             {
3731                 eToken = XML_OBJECT;
3732             }
3733 
3734             mxImplContext = GetImport().GetShapeImport()->CreateFrameChildContext(
3735                     GetImport(), XML_NAMESPACE_DRAW, GetXMLToken( eToken ), mxAttrList, mxShapes, xEmpty );
3736 
3737             if( mxImplContext.Is() )
3738             {
3739                 mxImplContext->StartElement( mxAttrList );
3740                 mxImplContext->EndElement();
3741             }
3742         }
3743     }
3744 
3745     mxImplContext = 0;
3746     SdXMLShapeContext::EndElement();
3747 }
3748 
processAttribute(sal_uInt16,const::rtl::OUString &,const::rtl::OUString &)3749 void SdXMLFrameShapeContext::processAttribute( sal_uInt16,
3750         const ::rtl::OUString&, const ::rtl::OUString& )
3751 {
3752     // ignore
3753 }
3754 
3755 TYPEINIT1( SdXMLCustomShapeContext, SdXMLShapeContext );
3756 
SdXMLCustomShapeContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const com::sun::star::uno::Reference<com::sun::star::xml::sax::XAttributeList> & xAttrList,uno::Reference<drawing::XShapes> & rShapes,sal_Bool bTemporaryShape)3757 SdXMLCustomShapeContext::SdXMLCustomShapeContext(
3758     SvXMLImport& rImport,
3759     sal_uInt16 nPrfx,
3760     const OUString& rLocalName,
3761     const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
3762     uno::Reference< drawing::XShapes >& rShapes,
3763     sal_Bool bTemporaryShape)
3764 :   SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, bTemporaryShape )
3765 {
3766 }
3767 
3768 //////////////////////////////////////////////////////////////////////////////
3769 
~SdXMLCustomShapeContext()3770 SdXMLCustomShapeContext::~SdXMLCustomShapeContext()
3771 {
3772 }
3773 
3774 //////////////////////////////////////////////////////////////////////////////
3775 
3776 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)3777 void SdXMLCustomShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
3778 {
3779     if( XML_NAMESPACE_DRAW == nPrefix )
3780     {
3781         if( IsXMLToken( rLocalName, XML_ENGINE ) )
3782         {
3783             maCustomShapeEngine = rValue;
3784             return;
3785         }
3786         if ( IsXMLToken( rLocalName, XML_DATA ) )
3787         {
3788             maCustomShapeData = rValue;
3789             return;
3790         }
3791     }
3792     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
3793 }
3794 
3795 //////////////////////////////////////////////////////////////////////////////
3796 
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)3797 void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
3798 {
3799     // create rectangle shape
3800     AddShape("com.sun.star.drawing.CustomShape");
3801     if ( mxShape.is() )
3802     {
3803         // Add, set Style and properties from base shape
3804         SetStyle();
3805         SetLayer();
3806 
3807         // set pos, size, shear and rotate
3808         SetTransformation();
3809 
3810         try
3811         {
3812             uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3813             if( xPropSet.is() )
3814             {
3815                 if ( maCustomShapeEngine.getLength() )
3816                 {
3817                     uno::Any aAny;
3818                     aAny <<= maCustomShapeEngine;
3819                     xPropSet->setPropertyValue( EASGet( EAS_CustomShapeEngine ), aAny );
3820                 }
3821                 if ( maCustomShapeData.getLength() )
3822                 {
3823                     uno::Any aAny;
3824                     aAny <<= maCustomShapeData;
3825                     xPropSet->setPropertyValue( EASGet( EAS_CustomShapeData ), aAny );
3826                 }
3827             }
3828         }
3829         catch( uno::Exception& )
3830         {
3831             DBG_ERROR( "could not set enhanced customshape geometry" );
3832         }
3833         SdXMLShapeContext::StartElement(xAttrList);
3834     }
3835 }
3836 
EndElement()3837 void SdXMLCustomShapeContext::EndElement()
3838 {
3839     // for backward compatibility, the above SetTransformation() may alraedy have
3840     // applied a call to SetMirroredX/SetMirroredY. This is not yet added to the
3841     // beans::PropertyValues in maCustomShapeGeometry. When applying these now, this
3842     // would be lost again.
3843     // TTTT: Remove again after aw080
3844     if(!maUsedTransformation.isIdentity())
3845     {
3846         basegfx::B2DVector aScale, aTranslate;
3847         double fRotate, fShearX;
3848 
3849         maUsedTransformation.decompose(aScale, aTranslate, fRotate, fShearX);
3850 
3851         bool bFlippedX(aScale.getX() < 0.0);
3852         bool bFlippedY(aScale.getY() < 0.0);
3853 
3854         if(bFlippedX && bFlippedY)
3855         {
3856             // when both are used it is the same as 180 degree rotation; reset
3857             bFlippedX = bFlippedY = false;
3858         }
3859 
3860         if(bFlippedX || bFlippedY)
3861         {
3862             beans::PropertyValue aNewPoroperty;
3863 
3864             if(bFlippedX)
3865             {
3866                 aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredX"));
3867             }
3868             else
3869             {
3870                 aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredY"));
3871             }
3872 
3873             aNewPoroperty.Handle = -1;
3874             aNewPoroperty.Value <<= sal_True;
3875             aNewPoroperty.State = beans::PropertyState_DIRECT_VALUE;
3876 
3877             maCustomShapeGeometry.push_back(aNewPoroperty);
3878         }
3879     }
3880 
3881     if ( !maCustomShapeGeometry.empty() )
3882     {
3883         const rtl::OUString sCustomShapeGeometry    ( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeGeometry" ) );
3884 
3885         // converting the vector to a sequence
3886         uno::Sequence< beans::PropertyValue > aSeq( maCustomShapeGeometry.size() );
3887         beans::PropertyValue* pValues = aSeq.getArray();
3888         std::vector< beans::PropertyValue >::const_iterator aIter( maCustomShapeGeometry.begin() );
3889         std::vector< beans::PropertyValue >::const_iterator aEnd( maCustomShapeGeometry.end() );
3890         while ( aIter != aEnd )
3891             *pValues++ = *aIter++;
3892 
3893         try
3894         {
3895             uno::Reference< beans::XPropertySet > xPropSet( mxShape, uno::UNO_QUERY );
3896             if( xPropSet.is() )
3897             {
3898                 uno::Any aAny;
3899                 aAny <<= aSeq;
3900                 xPropSet->setPropertyValue( sCustomShapeGeometry, aAny );
3901             }
3902         }
3903         catch( uno::Exception& )
3904         {
3905             DBG_ERROR( "could not set enhanced customshape geometry" );
3906         }
3907 
3908         sal_Int32 nUPD( 0 );
3909         sal_Int32 nBuild( 0 );
3910         GetImport().getBuildIds( nUPD, nBuild );
3911         if( ((nUPD >= 640 && nUPD <= 645) || (nUPD == 680)) && (nBuild <= 9221) )
3912         {
3913             Reference< drawing::XEnhancedCustomShapeDefaulter > xDefaulter( mxShape, UNO_QUERY );
3914             if( xDefaulter.is() )
3915             {
3916                 rtl::OUString aEmptyType;
3917                 xDefaulter->createCustomShapeDefaults( aEmptyType );
3918             }
3919         }
3920     }
3921 
3922     SdXMLShapeContext::EndElement();
3923 }
3924 
3925 //////////////////////////////////////////////////////////////////////////////
3926 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)3927 SvXMLImportContext* SdXMLCustomShapeContext::CreateChildContext(
3928     sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
3929     const uno::Reference<xml::sax::XAttributeList>& xAttrList )
3930 {
3931     SvXMLImportContext* pContext = NULL;
3932     if ( XML_NAMESPACE_DRAW == nPrefix )
3933     {
3934         if ( IsXMLToken( rLocalName, XML_ENHANCED_GEOMETRY ) )
3935         {
3936             uno::Reference< beans::XPropertySet > xPropSet( mxShape,uno::UNO_QUERY );
3937             if ( xPropSet.is() )
3938                 pContext = new XMLEnhancedCustomShapeContext( GetImport(), mxShape, nPrefix, rLocalName, maCustomShapeGeometry );
3939         }
3940     }
3941     // delegate to parent class if no context could be created
3942     if ( NULL == pContext )
3943         pContext = SdXMLShapeContext::CreateChildContext( nPrefix, rLocalName,
3944                                                          xAttrList);
3945     return pContext;
3946 }
3947 
3948 ///////////////////////////////////////////////////////////////////////
3949 
3950 //////////////////////////////////////////////////////////////////////////////
3951 
3952 TYPEINIT1( SdXMLTableShapeContext, SdXMLShapeContext );
3953 
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)3954 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 )
3955 : SdXMLShapeContext( rImport, nPrfx, rLocalName, xAttrList, rShapes, sal_False )
3956 {
3957     memset( &maTemplateStylesUsed, 0, sizeof( maTemplateStylesUsed ) );
3958 }
3959 
~SdXMLTableShapeContext()3960 SdXMLTableShapeContext::~SdXMLTableShapeContext()
3961 {
3962 }
3963 
StartElement(const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)3964 void SdXMLTableShapeContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
3965 {
3966     const char* pService = "com.sun.star.drawing.TableShape";
3967 
3968     sal_Bool bIsPresShape = maPresentationClass.getLength() && GetImport().GetShapeImport()->IsPresentationShapesSupported();
3969     if( bIsPresShape )
3970     {
3971         if( IsXMLToken( maPresentationClass, XML_PRESENTATION_TABLE ) )
3972         {
3973             pService = "com.sun.star.presentation.TableShape";
3974         }
3975     }
3976 
3977     AddShape( pService );
3978 
3979     if( mxShape.is() )
3980     {
3981         SetLayer();
3982 
3983         uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
3984 
3985         if(bIsPresShape)
3986         {
3987             if(xProps.is())
3988             {
3989                 uno::Reference< beans::XPropertySetInfo > xPropsInfo( xProps->getPropertySetInfo() );
3990                 if( xPropsInfo.is() )
3991                 {
3992                     if( !mbIsPlaceholder && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") )))
3993                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsEmptyPresentationObject") ), ::cppu::bool2any( sal_False ) );
3994 
3995                     if( mbIsUserTransformed && xPropsInfo->hasPropertyByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") )))
3996                         xProps->setPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("IsPlaceholderDependent") ), ::cppu::bool2any( sal_False ) );
3997                 }
3998             }
3999         }
4000 
4001         SetStyle();
4002 
4003         if( xProps.is() )
4004         {
4005             if( msTemplateStyleName.getLength() ) try
4006             {
4007                 Reference< XStyleFamiliesSupplier > xFamiliesSupp( GetImport().GetModel(), UNO_QUERY_THROW );
4008                 Reference< XNameAccess > xFamilies( xFamiliesSupp->getStyleFamilies() );
4009                 const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM("table" ) );
4010                 Reference< XNameAccess > xTableFamily( xFamilies->getByName( sFamilyName ), UNO_QUERY_THROW );
4011                 Reference< XStyle > xTableStyle( xTableFamily->getByName( msTemplateStyleName ), UNO_QUERY_THROW );
4012                 xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TableTemplate" ) ), Any( xTableStyle ) );
4013             }
4014             catch( Exception& )
4015             {
4016                 DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
4017             }
4018 
4019             const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
4020             for( int i = 0; pEntry->msApiName && (i < 6); i++, pEntry++ )
4021             {
4022                 try
4023                 {
4024                     const OUString sAPIPropertyName( OUString(pEntry->msApiName, pEntry->nApiNameLength, RTL_TEXTENCODING_ASCII_US ) );
4025                     xProps->setPropertyValue( sAPIPropertyName, Any( maTemplateStylesUsed[i] ) );
4026                 }
4027                 catch( Exception& )
4028                 {
4029                     DBG_ERROR("SdXMLTableShapeContext::StartElement(), exception caught!");
4030                 }
4031             }
4032         }
4033 
4034         GetImport().GetShapeImport()->finishShape( mxShape, mxAttrList, mxShapes );
4035 
4036         const rtl::Reference< XMLTableImport >& xTableImport( GetImport().GetShapeImport()->GetShapeTableImport() );
4037         if( xTableImport.is() && xProps.is() )
4038         {
4039             uno::Reference< table::XColumnRowRange > xColumnRowRange(
4040                 xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("Model") ) ), uno::UNO_QUERY );
4041 
4042             if( xColumnRowRange.is() )
4043                 mxTableImportContext = xTableImport->CreateTableContext( GetPrefix(), GetLocalName(), xColumnRowRange );
4044 
4045             if( mxTableImportContext.Is() )
4046                 mxTableImportContext->StartElement( xAttrList );
4047         }
4048     }
4049 }
4050 
EndElement()4051 void SdXMLTableShapeContext::EndElement()
4052 {
4053     if( mxTableImportContext.Is() )
4054         mxTableImportContext->EndElement();
4055 
4056     SdXMLShapeContext::EndElement();
4057 
4058     if( mxShape.is() )
4059     {
4060         // set pos, size, shear and rotate
4061         SetTransformation();
4062     }
4063 }
4064 
4065 // this is called from the parent group for each unparsed attribute in the attribute list
processAttribute(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const::rtl::OUString & rValue)4066 void SdXMLTableShapeContext::processAttribute( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const ::rtl::OUString& rValue )
4067 {
4068     if( nPrefix == XML_NAMESPACE_TABLE )
4069     {
4070         if( IsXMLToken( rLocalName, XML_TEMPLATE_NAME ) )
4071         {
4072             msTemplateStyleName = rValue;
4073         }
4074         else
4075         {
4076             int i = 0;
4077             const XMLPropertyMapEntry* pEntry = &aXMLTableShapeAttributes[0];
4078             while( pEntry->msApiName && (i < 6) )
4079             {
4080                 if( IsXMLToken( rLocalName, pEntry->meXMLName ) )
4081                 {
4082                     if( IsXMLToken( rValue, XML_TRUE ) )
4083                         maTemplateStylesUsed[i] = sal_True;
4084                     break;
4085                 }
4086                 pEntry++;
4087                 i++;
4088             }
4089         }
4090     }
4091     SdXMLShapeContext::processAttribute( nPrefix, rLocalName, rValue );
4092 }
4093 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)4094 SvXMLImportContext* SdXMLTableShapeContext::CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, const uno::Reference<xml::sax::XAttributeList>& xAttrList )
4095 {
4096     if( mxTableImportContext.Is() && (nPrefix == XML_NAMESPACE_TABLE) )
4097         return mxTableImportContext->CreateChildContext(nPrefix, rLocalName, xAttrList);
4098     else
4099         return SdXMLShapeContext::CreateChildContext(nPrefix, rLocalName, xAttrList);
4100 }
4101 
4102