xref: /trunk/main/sd/source/ui/unoidl/unoobj.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #include <com/sun/star/style/XStyle.hpp>
32 #include <com/sun/star/presentation/ClickAction.hpp>
33 #include <com/sun/star/beans/PropertyAttribute.hpp>
34 #include <com/sun/star/text/XText.hpp>
35 #include <com/sun/star/beans/PropertyState.hpp>
36 #include <com/sun/star/beans/PropertyValues.hpp>
37 #include <rtl/ustrbuf.hxx>
38 #include <comphelper/stl_types.hxx>
39 #include <vos/mutex.hxx>
40 #include <svl/itemprop.hxx>
41 #include <svl/style.hxx>
42 #include <svx/svdpool.hxx>
43 #include <sfx2/viewfrm.hxx>
44 #include <sfx2/app.hxx>
45 #include <svtools/unoimap.hxx>
46 #include <svtools/unoevent.hxx>
47 #include <sfx2/bindings.hxx>
48 #include <sfx2/sfxsids.hrc>
49 #include <comphelper/extract.hxx>
50 #include <svx/unoprov.hxx>
51 #include <svx/unoshape.hxx>
52 #include <svx/svditer.hxx>
53 #include <svx/svdotext.hxx>
54 #include <svx/unoapi.hxx>
55 #include <svx/svdopath.hxx>
56 #include <svx/svdoole2.hxx>
57 #include <svx/svdograf.hxx>
58 #include <editeng/outlobj.hxx>
59 #include "CustomAnimationPreset.hxx"
60 #include "Outliner.hxx"
61 #include "sdresid.hxx"
62 #include <comphelper/serviceinfohelper.hxx>
63 
64 #include "anminfo.hxx"
65 #include "unohelp.hxx"
66 #include "unoobj.hxx"
67 #include "unoprnms.hxx"
68 #include "unomodel.hxx"
69 #include "drawdoc.hxx"
70 #include "sdpage.hxx"
71 #include "ViewShell.hxx"
72 #include "unokywds.hxx"
73 #include "unopage.hxx"
74 #ifndef SVX_LIGHT
75 #ifndef SD_DRAW_DOC_SHELL_HXX
76 #include "DrawDocShell.hxx"
77 #endif
78 #endif
79 #include "helpids.h"
80 #include "glob.hxx"
81 #include "glob.hrc"
82 #include "unolayer.hxx"
83 #include "imapinfo.hxx"
84 #include "EffectMigration.hxx"
85 
86 #ifndef SEQTYPE
87  #if defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500)
88   #define SEQTYPE(x) (new ::com::sun::star::uno::Type( x ))
89  #else
90   #define SEQTYPE(x) &(x)
91  #endif
92 #endif
93 
94 using ::rtl::OUString;
95 using ::rtl::OUStringBuffer;
96 using namespace ::vos;
97 using namespace ::sd;
98 using namespace ::com::sun::star;
99 using namespace ::com::sun::star::presentation;
100 using namespace ::com::sun::star::animations;
101 
102 using ::com::sun::star::uno::makeAny;
103 using ::com::sun::star::uno::Any;
104 using ::com::sun::star::uno::Reference;
105 using ::com::sun::star::drawing::XShape;
106 
107 extern OUString getPageApiNameFromUiName( const String& rUIName );
108 extern String getUiNameFromPageApiNameImpl( const ::rtl::OUString& rApiName );
109 
110 ///////////////////////////////////////////////////////////////////////
111 
112 DECLARE_STL_STDKEY_MAP(sal_uIntPtr, SfxExtItemPropertySetInfo*, SdExtPropertySetInfoCache);
113 static SdExtPropertySetInfoCache gImplImpressPropertySetInfoCache;
114 static SdExtPropertySetInfoCache gImplDrawPropertySetInfoCache;
115 
116 DECLARE_STL_STDKEY_MAP(sal_uInt32, uno::Sequence< uno::Type >*, SdTypesCache);
117 static SdTypesCache gImplTypesCache;
118 
119 ///////////////////////////////////////////////////////////////////////
120 
121 
122 #define WID_EFFECT          1
123 #define WID_SPEED           2
124 #define WID_TEXTEFFECT      3
125 #define WID_BOOKMARK        4
126 #define WID_CLICKACTION     5
127 #define WID_PLAYFULL        6
128 #define WID_SOUNDFILE       7
129 #define WID_SOUNDON         8
130 #define WID_BLUESCREEN      9
131 #define WID_VERB            10
132 #define WID_DIMCOLOR        11
133 #define WID_DIMHIDE         12
134 #define WID_DIMPREV         13
135 #define WID_PRESORDER       14
136 #define WID_STYLE           15
137 #define WID_ANIMPATH        16
138 #define WID_IMAGEMAP        17
139 #define WID_ISANIMATION     18
140 
141 #define WID_ISEMPTYPRESOBJ  20
142 #define WID_ISPRESOBJ       21
143 #define WID_MASTERDEPEND    22
144 
145 #define WID_NAVORDER        23
146 
147 #define WID_THAT_NEED_ANIMINFO 19
148 
149 
150 
151         #define IMPRESS_MAP_ENTRIES \
152         { MAP_CHAR_LEN(UNO_NAME_OBJ_ANIMATIONPATH), WID_ANIMPATH,        &ITYPE(drawing::XShape),                                   0, 0},\
153         { MAP_CHAR_LEN(UNO_NAME_OBJ_BOOKMARK),      WID_BOOKMARK,        &::getCppuType((const OUString*)0),                        0, 0},\
154         { MAP_CHAR_LEN(UNO_NAME_OBJ_DIMCOLOR),      WID_DIMCOLOR,        &::getCppuType((const sal_Int32*)0),                       0, 0},\
155         { MAP_CHAR_LEN(UNO_NAME_OBJ_DIMHIDE),       WID_DIMHIDE,         &::getBooleanCppuType(),                                   0, 0},\
156         { MAP_CHAR_LEN(UNO_NAME_OBJ_DIMPREV),       WID_DIMPREV,         &::getBooleanCppuType(),                                   0, 0},\
157         { MAP_CHAR_LEN(UNO_NAME_OBJ_EFFECT),        WID_EFFECT,          &::getCppuType((const presentation::AnimationEffect*)0),   0, 0},\
158         { MAP_CHAR_LEN(UNO_NAME_OBJ_ISEMPTYPRESOBJ),WID_ISEMPTYPRESOBJ,  &::getBooleanCppuType(),                                   0, 0},\
159         { MAP_CHAR_LEN(UNO_NAME_OBJ_ISPRESOBJ),     WID_ISPRESOBJ,       &::getBooleanCppuType(),                                   ::com::sun::star::beans::PropertyAttribute::READONLY, 0},\
160         { MAP_CHAR_LEN(UNO_NAME_OBJ_MASTERDEPENDENT),WID_MASTERDEPEND,   &::getBooleanCppuType(),                                   0, 0},\
161         { MAP_CHAR_LEN(UNO_NAME_OBJ_CLICKACTION),   WID_CLICKACTION,     &::getCppuType((const presentation::ClickAction*)0),       0, 0},\
162         { MAP_CHAR_LEN(UNO_NAME_OBJ_PLAYFULL),      WID_PLAYFULL,        &::getBooleanCppuType(),                                   0, 0},\
163         { MAP_CHAR_LEN(UNO_NAME_OBJ_PRESORDER),     WID_PRESORDER,       &::getCppuType((const sal_Int32*)0),                       0, 0},\
164         { MAP_CHAR_LEN(UNO_NAME_OBJ_STYLE),         WID_STYLE,           &ITYPE( style::XStyle),                                    ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0},\
165         { MAP_CHAR_LEN(UNO_NAME_OBJ_SOUNDFILE),     WID_SOUNDFILE,       &::getCppuType((const OUString*)0),                        0, 0},\
166         { MAP_CHAR_LEN(UNO_NAME_OBJ_SOUNDON),       WID_SOUNDON,         &::getBooleanCppuType(),                                   0, 0},\
167         { MAP_CHAR_LEN(UNO_NAME_OBJ_SPEED),         WID_SPEED,           &::getCppuType((const presentation::AnimationSpeed*)0),    0, 0},\
168         { MAP_CHAR_LEN(UNO_NAME_OBJ_TEXTEFFECT),    WID_TEXTEFFECT,      &::getCppuType((const presentation::AnimationEffect*)0),   0, 0},\
169         { MAP_CHAR_LEN(UNO_NAME_OBJ_BLUESCREEN),    WID_BLUESCREEN,      &::getCppuType((const sal_Int32*)0),                       0, 0},\
170         { MAP_CHAR_LEN(UNO_NAME_OBJ_VERB),          WID_VERB,            &::getCppuType((const sal_Int32*)0),                       0, 0},\
171         { MAP_CHAR_LEN("IsAnimation"),              WID_ISANIMATION,     &::getBooleanCppuType(),                                   0, 0},\
172         { MAP_CHAR_LEN("NavigationOrder"),          WID_NAVORDER,        &::getCppuType((const sal_Int32*)0),                       0, 0},\
173         { 0,0,0,0,0,0}
174 
175 
176     const SfxItemPropertyMapEntry* lcl_GetImpress_SdXShapePropertyGraphicMap_Impl()
177     {
178 
179         static const SfxItemPropertyMapEntry aImpress_SdXShapePropertyGraphicMap_Impl[] =
180         {
181             { MAP_CHAR_LEN("ImageMap"),             WID_IMAGEMAP,        &::getCppuType((const uno::Reference< container::XIndexContainer >*)0),    0, 0 },
182             IMPRESS_MAP_ENTRIES
183         };
184         return aImpress_SdXShapePropertyGraphicMap_Impl;
185     }
186 
187     const SfxItemPropertyMapEntry* lcl_GetImpress_SdXShapePropertySimpleMap_Impl()
188     {
189 
190         static const SfxItemPropertyMapEntry aImpress_SdXShapePropertySimpleMap_Impl[] =
191         {
192             IMPRESS_MAP_ENTRIES
193         };
194         return aImpress_SdXShapePropertySimpleMap_Impl;
195     }
196 
197     #define DRAW_MAP_ENTRIES\
198         { MAP_CHAR_LEN(UNO_NAME_OBJ_BOOKMARK),      WID_BOOKMARK,       &::getCppuType((const OUString*)0),                 0, 0},\
199         { MAP_CHAR_LEN(UNO_NAME_OBJ_CLICKACTION),   WID_CLICKACTION,    &::getCppuType((const presentation::ClickAction*)0),0, 0},\
200         { MAP_CHAR_LEN(UNO_NAME_OBJ_STYLE),         WID_STYLE,          &ITYPE(style::XStyle),                              ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0},\
201         { MAP_CHAR_LEN("NavigationOrder"),          WID_NAVORDER,        &::getCppuType((const sal_Int32*)0),                       0, 0},\
202         { 0,0,0,0,0,0}
203 
204     const SfxItemPropertyMapEntry* lcl_GetDraw_SdXShapePropertySimpleMap_Impl()
205     {
206         static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyMap_Impl[] =
207         {
208             DRAW_MAP_ENTRIES
209         };
210         return aDraw_SdXShapePropertyMap_Impl;
211     }
212     const SfxItemPropertyMapEntry* lcl_GetDraw_SdXShapePropertyGraphicMap_Impl()
213     {
214         static const SfxItemPropertyMapEntry aDraw_SdXShapePropertyGraphicMap_Impl[] =
215         {
216             { MAP_CHAR_LEN("ImageMap"),             WID_IMAGEMAP,        &::getCppuType((const uno::Reference< container::XIndexContainer >*)0),    0, 0 },
217             DRAW_MAP_ENTRIES
218         };
219         return aDraw_SdXShapePropertyGraphicMap_Impl;
220     }
221     const SfxItemPropertyMapEntry* lcl_ImplGetShapePropertyMap( sal_Bool bImpress, sal_Bool bGraphicObj )
222     {
223         const SfxItemPropertyMapEntry* pRet = 0;
224         if( bImpress )
225         {
226             if( bGraphicObj )
227                 pRet = lcl_GetImpress_SdXShapePropertyGraphicMap_Impl();
228             else
229                 pRet = lcl_GetImpress_SdXShapePropertySimpleMap_Impl();
230         }
231         else
232         {
233             if( bGraphicObj )
234                 pRet = lcl_GetDraw_SdXShapePropertyGraphicMap_Impl();
235             else
236                 pRet = lcl_GetDraw_SdXShapePropertySimpleMap_Impl();
237         }
238         return pRet;
239 
240     }
241     const SvxItemPropertySet* lcl_ImplGetShapePropertySet( sal_Bool bImpress, sal_Bool bGraphicObj )
242     {
243         const SvxItemPropertySet* pRet = 0;
244         if( bImpress )
245         {
246             if( bGraphicObj )
247             {
248                 static SvxItemPropertySet aImpress_SdXShapePropertyGraphicSet_Impl( lcl_GetImpress_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
249                 pRet = &aImpress_SdXShapePropertyGraphicSet_Impl;
250             }
251             else
252             {
253                 static SvxItemPropertySet aImpress_SdXShapePropertySet_Impl(lcl_GetImpress_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
254                 pRet = &aImpress_SdXShapePropertySet_Impl;
255             }
256         }
257         else
258         {
259             if( bGraphicObj )
260             {
261                 static SvxItemPropertySet aDraw_SdXShapePropertyGraphicSet_Impl(lcl_GetDraw_SdXShapePropertyGraphicMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
262                 pRet = &aDraw_SdXShapePropertyGraphicSet_Impl;
263             }
264             else
265             {
266                 static SvxItemPropertySet aDraw_SdXShapePropertySet_Impl( lcl_GetDraw_SdXShapePropertySimpleMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool());
267                 pRet = &aDraw_SdXShapePropertySet_Impl;
268             }
269         }
270         return pRet;
271     }
272     const SfxItemPropertyMapEntry* lcl_GetEmpty_SdXShapePropertyMap_Impl()
273     {
274         static SfxItemPropertyMapEntry aEmpty_SdXShapePropertyMap_Impl[] =
275         {
276             { 0,0,0,0,0,0}
277         };
278         return aEmpty_SdXShapePropertyMap_Impl;
279     }
280 
281     static const SvxItemPropertySet* lcl_GetEmpty_SdXShapePropertySet_Impl()
282     {
283         static SvxItemPropertySet aEmptyPropSet( lcl_GetEmpty_SdXShapePropertyMap_Impl(), SdrObject::GetGlobalDrawObjectItemPool() );
284         return &aEmptyPropSet;
285     }
286 const SvEventDescription* ImplGetSupportedMacroItems()
287 {
288     static const SvEventDescription aMacroDescriptionsImpl[] =
289     {
290         { SFX_EVENT_MOUSEOVER_OBJECT, "OnMouseOver" },
291         { SFX_EVENT_MOUSEOUT_OBJECT, "OnMouseOut" },
292         { 0, NULL }
293     };
294 
295     return aMacroDescriptionsImpl;
296 }
297 
298 /*************************************************************************
299 |*
300 |*    Vergleichsfkt. fuer QSort
301 |*
302 \************************************************************************/
303 struct SortStruct
304 {
305     SdrObject*  pObj;
306     sal_uInt32      nOrder;
307 };
308 
309 typedef SortStruct  SORT;
310 typedef SORT*       PSORT;
311 
312 extern "C" int __LOADONCALLAPI SortFunc( const void* p1, const void* p2 );
313 
314 SdXShape::SdXShape( SvxShape* pShape, SdXImpressDocument* pModel) throw()
315 :   mpShape( pShape ),
316     mpPropSet( pModel?
317                     lcl_ImplGetShapePropertySet(pModel->IsImpressDocument(), pShape->getShapeKind() == OBJ_GRAF )
318                 :   lcl_GetEmpty_SdXShapePropertySet_Impl() ),
319     mpMap( pModel?
320                     lcl_ImplGetShapePropertyMap(pModel->IsImpressDocument(), pShape->getShapeKind() == OBJ_GRAF )
321                 :   lcl_GetEmpty_SdXShapePropertyMap_Impl() ),
322     mpModel(pModel),
323     mpImplementationId( NULL )
324 
325 {
326 
327     pShape->setMaster( this );
328 }
329 
330 SdXShape::~SdXShape() throw()
331 {
332 }
333 
334 void SdXShape::dispose()
335 {
336     mpShape->setMaster( NULL );
337     delete this;
338 }
339 
340 // XInterface
341 uno::Any SAL_CALL SdXShape::queryAggregation( const uno::Type & rType )
342     throw(uno::RuntimeException)
343 {
344     return mpShape->queryAggregation( rType );
345 }
346 
347 uno::Any SAL_CALL SdXShape::queryInterface( const uno::Type & rType )
348     throw(uno::RuntimeException)
349 {
350     return mpShape->queryInterface( rType );
351 }
352 
353 void SAL_CALL SdXShape::acquire() throw()
354 {
355     mpShape->acquire();
356 }
357 
358 void SAL_CALL SdXShape::release() throw()
359 {
360     mpShape->release();
361 }
362 
363 sal_Bool SdXShape::queryAggregation( const com::sun::star::uno::Type & rType, com::sun::star::uno::Any& aAny )
364 {
365     if( mpModel && mpModel ->IsImpressDocument() )
366     {
367         if( rType == ::getCppuType(( const uno::Reference< document::XEventsSupplier >*)0) )
368         {
369             aAny <<= uno::Reference< document::XEventsSupplier >(this);
370             return sal_True;
371         }
372     }
373 
374     return sal_False;
375 }
376 
377 uno::Sequence< uno::Type > SAL_CALL SdXShape::getTypes()
378     throw (uno::RuntimeException)
379 {
380     if( mpModel && !mpModel->IsImpressDocument() )
381     {
382         return mpShape->_getTypes();
383     }
384     else
385     {
386         const sal_uInt32 nObjId = mpShape->getShapeKind();
387         uno::Sequence< uno::Type >* pTypes;
388         SdTypesCache::iterator aIter( gImplTypesCache.find( nObjId ) );
389         if( aIter == gImplTypesCache.end() )
390         {
391             pTypes = new uno::Sequence< uno::Type >( mpShape->_getTypes() );
392             sal_uInt32 nCount = pTypes->getLength();
393             pTypes->realloc( nCount+1 );
394             (*pTypes)[nCount] = ::getCppuType((const uno::Reference< lang::XTypeProvider>*)0);
395 
396             gImplTypesCache[ nObjId ] = pTypes;
397         }
398         else
399         {
400             // use the already computed implementation id
401             pTypes = (*aIter).second;
402         }
403         return *pTypes;
404     }
405 }
406 
407 // XPropertyState
408 beans::PropertyState SAL_CALL SdXShape::getPropertyState( const OUString& PropertyName ) throw( beans::UnknownPropertyException, uno::RuntimeException)
409 {
410     OGuard aGuard( Application::GetSolarMutex() );
411 
412     if( mpPropSet->getPropertyMapEntry(PropertyName) )
413     {
414         return beans::PropertyState_DIRECT_VALUE;
415     }
416     else
417     {
418         SdrObject* pObj = mpShape->GetSdrObject();
419         if( pObj == NULL || ( pObj->GetPage()->IsMasterPage() && pObj->IsEmptyPresObj() ) )
420             return beans::PropertyState_DEFAULT_VALUE;
421 
422         return mpShape->_getPropertyState( PropertyName );
423     }
424 }
425 
426 void SAL_CALL SdXShape::setPropertyToDefault( const OUString& PropertyName ) throw( beans::UnknownPropertyException, uno::RuntimeException)
427 {
428     OGuard aGuard( Application::GetSolarMutex() );
429 
430     if( mpPropSet->getPropertyMapEntry(PropertyName) )
431     {
432         return;
433     }
434     else
435     {
436         mpShape->_setPropertyToDefault(PropertyName);
437     }
438 }
439 
440 uno::Any SAL_CALL SdXShape::getPropertyDefault( const OUString& aPropertyName ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
441 {
442     OGuard aGuard( Application::GetSolarMutex() );
443 
444     if( mpPropSet->getPropertyMapEntry(aPropertyName) )
445     {
446         return getPropertyValue( aPropertyName );
447     }
448     else
449     {
450         uno::Any aRet( mpShape->_getPropertyDefault(aPropertyName) );
451 
452         if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_shape_layername ) ) )
453         {
454             OUString aName;
455             if( aRet >>= aName )
456             {
457                 aName = SdLayer::convertToExternalName( aName );
458                 aRet <<= aName;
459             }
460         }
461         return aRet;
462     }
463 }
464 
465 //XPropertySet
466 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL SdXShape::getPropertySetInfo()
467     throw(::com::sun::star::uno::RuntimeException)
468 {
469     sal_uIntPtr nObjId = (sal_uIntPtr)mpShape->getPropertyMapEntries();
470     SfxExtItemPropertySetInfo* pInfo = NULL;
471 
472     SdExtPropertySetInfoCache* pCache = (mpModel && mpModel->IsImpressDocument()) ?
473         &gImplImpressPropertySetInfoCache : &gImplDrawPropertySetInfoCache;
474 
475     SdExtPropertySetInfoCache::iterator aIter( pCache->find( nObjId ) );
476     if( aIter == pCache->end() )
477     {
478         uno::Reference< beans::XPropertySetInfo > xInfo( mpShape->_getPropertySetInfo() );
479         pInfo = new SfxExtItemPropertySetInfo( mpMap, xInfo->getProperties() );
480         pInfo->acquire();
481 
482         (*pCache)[ nObjId ] = pInfo;
483     }
484     else
485     {
486         // use the already computed implementation id
487         pInfo = (*aIter).second;
488     }
489 
490     uno::Reference< beans::XPropertySetInfo > xInfo( pInfo );
491     return pInfo;
492 }
493 
494 void SAL_CALL SdXShape::setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue )
495     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
496 {
497     OGuard aGuard( Application::GetSolarMutex() );
498 
499     const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
500 
501     if( pEntry )
502     {
503         SdrObject* pObj = mpShape->GetSdrObject();
504         if( pObj )
505         {
506             SdAnimationInfo* pInfo = GetAnimationInfo((pEntry->nWID <= WID_THAT_NEED_ANIMINFO)?sal_True:sal_False);
507 
508             switch(pEntry->nWID)
509             {
510                 case WID_NAVORDER:
511                 {
512                     sal_Int32 nNavOrder = 0;
513                     if(!(aValue >>= nNavOrder))
514                         throw lang::IllegalArgumentException();
515 
516                     SdrObjList* pObjList = pObj->GetObjList();
517                     if( pObjList )
518                         pObjList->SetObjectNavigationPosition( *pObj, (nNavOrder < 0) ? SAL_MAX_UINT32 : static_cast< sal_uInt32 >( nNavOrder ) );
519                     break;
520                 }
521 
522                 case WID_EFFECT:
523                 {
524                     AnimationEffect eEffect;
525                     if(!(aValue >>= eEffect))
526                         throw lang::IllegalArgumentException();
527 
528                     EffectMigration::SetAnimationEffect( mpShape, eEffect );
529                     break;
530                 }
531                 case WID_TEXTEFFECT:
532                 {
533                     AnimationEffect eEffect;
534                     if(!(aValue >>= eEffect))
535                         throw lang::IllegalArgumentException();
536 
537                     EffectMigration::SetTextAnimationEffect( mpShape, eEffect );
538                     break;
539                 }
540                 case WID_SPEED:
541                 {
542                     AnimationSpeed eSpeed;
543                     if(!(aValue>>=eSpeed))
544                         throw lang::IllegalArgumentException();
545 
546                     EffectMigration::SetAnimationSpeed( mpShape, eSpeed );
547                     break;
548                 }
549 /* TODO??       case WID_ISANIMATION:
550                 {
551 
552                     sal_Bool bIsAnimation;
553                     if(!(aValue >>= bIsAnimation))
554                         throw lang::IllegalArgumentException();
555 
556                     pInfo->mbIsMovie = bIsAnimation;
557                     break;
558                 }
559 */
560                 case WID_BOOKMARK:
561                 {
562                     OUString aString;
563                     if(!(aValue >>= aString))
564                         throw lang::IllegalArgumentException();
565 
566                     pInfo->SetBookmark( SdDrawPage::getUiNameFromPageApiName( aString ) );
567                     break;
568                 }
569                 case WID_CLICKACTION:
570                     ::cppu::any2enum< presentation::ClickAction >( pInfo->meClickAction, aValue);
571                     break;
572 
573 /* todo?
574                 case WID_PLAYFULL:
575                     pInfo->mbPlayFull = ::cppu::any2bool(aValue);
576                     break;
577 */
578                 case WID_SOUNDFILE:
579                 {
580                     OUString aString;
581                     if(!(aValue >>= aString))
582                         throw lang::IllegalArgumentException();
583                     pInfo->maSoundFile = aString;
584                     EffectMigration::UpdateSoundEffect( mpShape, pInfo );
585                     break;
586                 }
587 
588                 case WID_SOUNDON:
589                 {
590                     if( !(aValue >>= pInfo->mbSoundOn) )
591                         throw lang::IllegalArgumentException();
592                     EffectMigration::UpdateSoundEffect( mpShape, pInfo );
593                     break;
594                 }
595 /*
596                 case WID_BLUESCREEN:
597                 {
598                     sal_Int32 nColor;
599                     if(!(aValue >>= nColor))
600                         throw lang::IllegalArgumentException();
601 
602                     pInfo->maBlueScreen.SetColor( nColor );
603                     break;
604                 }
605 */
606                 case WID_VERB:
607                 {
608                     sal_Int32 nVerb = 0;
609                     if(!(aValue >>= nVerb))
610                         throw lang::IllegalArgumentException();
611 
612                     pInfo->mnVerb = (sal_uInt16)nVerb;
613                     break;
614                 }
615                 case WID_DIMCOLOR:
616                 {
617                     sal_Int32 nColor = 0;
618 
619                     if( !(aValue >>= nColor) )
620                         throw lang::IllegalArgumentException();
621 
622                     EffectMigration::SetDimColor( mpShape, nColor );
623                     break;
624                 }
625                 case WID_DIMHIDE:
626                 {
627                     sal_Bool bDimHide = sal_False;
628                     if( !(aValue >>= bDimHide) )
629                         lang::IllegalArgumentException();
630 
631                     EffectMigration::SetDimHide( mpShape, bDimHide );
632                     break;
633                 }
634                 case WID_DIMPREV:
635                 {
636                     sal_Bool bDimPrevious = sal_False;
637                     if( !(aValue >>= bDimPrevious) )
638                         lang::IllegalArgumentException();
639 
640                     EffectMigration::SetDimPrevious( mpShape, bDimPrevious );
641                     break;
642                 }
643                 case WID_PRESORDER:
644                 {
645                     sal_Int32 nNewPos = 0;
646                     if( !(aValue >>= nNewPos) )
647                         lang::IllegalArgumentException();
648 
649                     EffectMigration::SetPresentationOrder( mpShape, nNewPos );
650                     break;
651                 }
652                 case WID_STYLE:
653                     SetStyleSheet( aValue );
654                     break;
655                 case WID_ISEMPTYPRESOBJ:
656                     SetEmptyPresObj( ::cppu::any2bool(aValue) );
657                     break;
658                 case WID_MASTERDEPEND:
659                     SetMasterDepend( ::cppu::any2bool(aValue) );
660                     break;
661                 case WID_ANIMPATH:
662                 {
663                     uno::Reference< drawing::XShape > xShape( aValue, uno::UNO_QUERY );
664                     SdrPathObj* pObj2 = xShape.is() ? dynamic_cast< SdrPathObj* >( GetSdrObjectFromXShape( xShape ) ) : NULL;
665 
666                     if( pObj2 == NULL )
667                         throw lang::IllegalArgumentException();
668 
669                     EffectMigration::SetAnimationPath( mpShape, pObj2 );
670                     break;
671                 }
672                 case WID_IMAGEMAP:
673                 {
674                     SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():NULL;
675                     if( pDoc )
676                     {
677                         ImageMap aImageMap;
678                         uno::Reference< uno::XInterface > xImageMap;
679                         aValue >>= xImageMap;
680 
681                         if( !xImageMap.is() || !SvUnoImageMap_fillImageMap( xImageMap, aImageMap ) )
682                             throw lang::IllegalArgumentException();
683 
684                         SdIMapInfo* pIMapInfo = pDoc->GetIMapInfo(pObj);
685                         if( pIMapInfo )
686                         {
687                             // replace existing image map
688                             pIMapInfo->SetImageMap( aImageMap );
689                         }
690                         else
691                         {
692                             // insert new user data with image map
693                             pObj->InsertUserData(new SdIMapInfo(aImageMap) );
694                         }
695                     }
696                 }
697             }
698         }
699     }
700     else
701     {
702         uno::Any aAny( aValue );
703 
704         if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_shape_layername ) ) )
705         {
706             OUString aName;
707             if( aAny >>= aName )
708             {
709                 aName = SdLayer::convertToInternalName( aName );
710                 aAny <<= aName;
711             }
712         }
713 
714         mpShape->_setPropertyValue(aPropertyName, aAny);
715     }
716 
717     if( mpModel )
718         mpModel->SetModified();
719 }
720 
721 ::com::sun::star::uno::Any SAL_CALL SdXShape::getPropertyValue( const ::rtl::OUString& PropertyName )
722     throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException)
723 {
724     OGuard aGuard( Application::GetSolarMutex() );
725 
726     uno::Any aRet;
727 
728     const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
729 
730     if( pEntry && mpShape->GetSdrObject() )
731     {
732         SdAnimationInfo* pInfo = GetAnimationInfo(sal_False);
733 
734         switch(pEntry->nWID)
735         {
736         case WID_NAVORDER:
737             {
738                 const sal_uInt32 nNavOrder = mpShape->GetSdrObject()->GetNavigationPosition();
739                 aRet <<= nNavOrder == SAL_MAX_UINT32 ? static_cast<sal_Int32>(-1) : static_cast< sal_Int32 >(nNavOrder);
740             }
741             break;
742         case WID_EFFECT:
743             aRet <<= EffectMigration::GetAnimationEffect( mpShape );
744             break;
745         case WID_TEXTEFFECT:
746             aRet <<= EffectMigration::GetTextAnimationEffect( mpShape );
747             break;
748         case WID_ISPRESOBJ:
749             aRet <<= (sal_Bool)IsPresObj();
750             break;
751         case WID_ISEMPTYPRESOBJ:
752             aRet <<= (sal_Bool)IsEmptyPresObj();
753             break;
754         case WID_MASTERDEPEND:
755             aRet <<= (sal_Bool)IsMasterDepend();
756             break;
757         case WID_SPEED:
758             aRet <<= EffectMigration::GetAnimationSpeed( mpShape );
759             break;
760         case WID_ISANIMATION:
761             aRet <<= (sal_Bool)( pInfo && pInfo->mbIsMovie);
762             break;
763         case WID_BOOKMARK:
764         {
765             OUString aString;
766             if( pInfo )
767             {
768                 SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():NULL;
769                 // is the bookmark a page?
770                 sal_Bool bIsMasterPage;
771                 if(pDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage ) != SDRPAGE_NOTFOUND)
772                 {
773                     aString = SdDrawPage::getPageApiNameFromUiName( pInfo->GetBookmark() );
774                 }
775                 else
776                 {
777                     aString = pInfo->GetBookmark() ;
778                     sal_Int32 nPos = aString.lastIndexOf( sal_Unicode('#') );
779                     if( nPos >= 0 )
780                     {
781                         OUString aURL( aString.copy( 0, nPos+1 ) );
782                         OUString aName( aString.copy( nPos+1 ) );
783                         if(pDoc->GetPageByName( aName, bIsMasterPage ) != SDRPAGE_NOTFOUND)
784                         {
785                             aURL += SdDrawPage::getPageApiNameFromUiName( aName );
786                             aString = aURL;
787                         }
788                     }
789                 }
790             }
791 
792             aRet <<= aString;
793             break;
794         }
795         case WID_CLICKACTION:
796             aRet = ::cppu::enum2any< presentation::ClickAction >( pInfo?pInfo->meClickAction:presentation::ClickAction_NONE );
797             break;
798         case WID_PLAYFULL:
799             aRet <<= (sal_Bool)( pInfo && pInfo->mbPlayFull );
800             break;
801         case WID_SOUNDFILE:
802             aRet <<= EffectMigration::GetSoundFile( mpShape );
803             break;
804         case WID_SOUNDON:
805             aRet <<= EffectMigration::GetSoundOn( mpShape );
806             break;
807         case WID_BLUESCREEN:
808             aRet <<= (sal_Int32)( pInfo?pInfo->maBlueScreen.GetColor():0x00ffffff );
809             break;
810         case WID_VERB:
811             aRet <<= (sal_Int32)( pInfo?pInfo->mnVerb:0 );
812             break;
813         case WID_DIMCOLOR:
814             aRet <<= EffectMigration::GetDimColor( mpShape );
815             break;
816         case WID_DIMHIDE:
817             aRet <<= EffectMigration::GetDimHide( mpShape );
818             break;
819         case WID_DIMPREV:
820             aRet <<= EffectMigration::GetDimPrevious( mpShape );
821             break;
822         case WID_PRESORDER:
823             aRet <<= EffectMigration::GetPresentationOrder( mpShape );
824             break;
825         case WID_STYLE:
826             aRet = GetStyleSheet();
827             break;
828         case WID_ANIMPATH:
829             if( pInfo && pInfo->mpPathObj )
830                 aRet <<= pInfo->mpPathObj->getUnoShape();
831             break;
832         case WID_IMAGEMAP:
833             {
834                 uno::Reference< uno::XInterface > xImageMap;
835 
836                 SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():NULL;
837                 if( pDoc )
838                 {
839 
840                     SdIMapInfo* pIMapInfo = pDoc->GetIMapInfo(mpShape->GetSdrObject());
841                     if( pIMapInfo )
842                     {
843                         const ImageMap& rIMap = pIMapInfo->GetImageMap();
844                         xImageMap = SvUnoImageMap_createInstance( rIMap, ImplGetSupportedMacroItems() );
845                     }
846                     else
847                     {
848                         xImageMap = SvUnoImageMap_createInstance(ImplGetSupportedMacroItems() );
849                     }
850                 }
851 
852                 aRet <<= uno::Reference< container::XIndexContainer >::query( xImageMap );
853                 break;
854             }
855         }
856     }
857     else
858     {
859         aRet = mpShape->_getPropertyValue(PropertyName);
860 
861         if( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_shape_layername ) ) )
862         {
863             OUString aName;
864             if( aRet >>= aName )
865             {
866                 aName = SdLayer::convertToExternalName( aName );
867                 aRet <<= aName;
868             }
869         }
870     }
871 
872     return aRet;
873 }
874 
875 /** */
876 SdAnimationInfo* SdXShape::GetAnimationInfo( sal_Bool bCreate ) const throw()
877 {
878     SdAnimationInfo* pInfo = NULL;
879 
880     SdrObject* pObj = mpShape->GetSdrObject();
881     if(pObj)
882         pInfo = SdDrawDocument::GetShapeUserData(*pObj, bCreate ? true : false);
883 
884     return pInfo;
885 }
886 
887 uno::Sequence< ::rtl::OUString > SAL_CALL SdXShape::getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)
888 {
889     uno::Sequence< OUString > aSeq( mpShape->_getSupportedServiceNames() );
890 
891     comphelper::ServiceInfoHelper::addToSequence( aSeq, 2, "com.sun.star.presentation.Shape",
892                                                   "com.sun.star.document.LinkTarget" );
893 
894     SdrObject* pObj = mpShape->GetSdrObject();
895     if(pObj && pObj->GetObjInventor() == SdrInventor )
896     {
897         sal_uInt32 nInventor = pObj->GetObjIdentifier();
898         switch( nInventor )
899         {
900         case OBJ_TITLETEXT:
901             comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.presentation.TitleTextShape" );
902             break;
903         case OBJ_OUTLINETEXT:
904             comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.presentation.OutlinerShape" );
905             break;
906         }
907     }
908     return aSeq;
909 }
910 
911 /** checks if this is a presentation object
912  */
913 sal_Bool SdXShape::IsPresObj() const throw()
914 {
915     SdrObject* pObj = mpShape->GetSdrObject();
916     if(pObj)
917     {
918         SdPage* pPage = PTR_CAST(SdPage,pObj->GetPage());
919         if(pPage)
920             return pPage->GetPresObjKind(pObj) != PRESOBJ_NONE;
921     }
922     return sal_False;
923 }
924 
925 /** checks if this presentation object is empty
926  */
927 sal_Bool SdXShape::IsEmptyPresObj() const throw()
928 {
929     SdrObject* pObj = mpShape->GetSdrObject();
930     if( (pObj != NULL) && pObj->IsEmptyPresObj() )
931     {
932         // check if the object is in edit, than its temporarely not empty
933         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
934         if( pTextObj == 0 )
935             return sal_True;
936 
937         OutlinerParaObject* pParaObj = pTextObj->GetEditOutlinerParaObject();
938         if( pParaObj )
939         {
940             delete pParaObj;
941         }
942         else
943         {
944             return sal_True;
945         }
946     }
947 
948     return sal_False;
949 }
950 
951 /** sets/reset the empty status of a presentation object
952 */
953 void SdXShape::SetEmptyPresObj( sal_Bool bEmpty ) throw()
954 {
955     // only possible if this actually *is* a presentation object
956     if( !IsPresObj() )
957         return;
958 
959     SdrObject* pObj = mpShape->GetSdrObject();
960     if( pObj == NULL )
961         return;
962 
963     if( pObj->IsEmptyPresObj() != bEmpty )
964     {
965         if(!bEmpty)
966         {
967             OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject();
968             const sal_Bool bVertical = pOutlinerParaObject ? pOutlinerParaObject->IsVertical() : sal_False;
969 
970             // really delete SdrOutlinerObj at pObj
971             pObj->NbcSetOutlinerParaObject(0L);
972             if( bVertical && PTR_CAST( SdrTextObj, pObj ) )
973                 ((SdrTextObj*)pObj)->SetVerticalWriting( sal_True );
974 
975             SdrGrafObj* pGraphicObj = PTR_CAST( SdrGrafObj, pObj );
976             if( pGraphicObj )
977             {
978                 Graphic aEmpty;
979                 pGraphicObj->SetGraphic(aEmpty);
980             }
981             else
982             {
983                 SdrOle2Obj* pOleObj = PTR_CAST( SdrOle2Obj, pObj );
984                 if( pOleObj )
985                 {
986                     pOleObj->SetGraphic( NULL );
987                 }
988             }
989         }
990         else
991         {
992             // now set an empty OutlinerParaObject at pObj without
993             // any content but with the style of the old OutlinerParaObjects
994             // first paragraph
995             do
996             {
997                 SdDrawDocument* pDoc = mpModel?mpModel->GetDoc():NULL;
998                 DBG_ASSERT( pDoc, "no document?" );
999                 if( pDoc == NULL)
1000                     break;
1001 
1002                 ::sd::Outliner* pOutliner = pDoc->GetInternalOutliner();
1003                 DBG_ASSERT( pOutliner, "no outliner?" );
1004                 if( pOutliner == NULL )
1005                     break;
1006 
1007                 SdPage* pPage = PTR_CAST(SdPage,pObj->GetPage());
1008                 DBG_ASSERT( pPage, "no page?" );
1009                 if( pPage == NULL )
1010                     break;
1011 
1012                 OutlinerParaObject* pOutlinerParaObject = pObj->GetOutlinerParaObject();
1013                 pOutliner->SetText( *pOutlinerParaObject );
1014                 const sal_Bool bVertical = pOutliner->IsVertical();
1015 
1016                 pOutliner->Clear();
1017                 pOutliner->SetVertical( bVertical );
1018                 pOutliner->SetStyleSheetPool( (SfxStyleSheetPool*)pDoc->GetStyleSheetPool() );
1019                 pOutliner->SetStyleSheet( 0, pPage->GetTextStyleSheetForObject( pObj ) );
1020                 pOutliner->Insert( pPage->GetPresObjText( pPage->GetPresObjKind(pObj) ) );
1021                 pObj->SetOutlinerParaObject( pOutliner->CreateParaObject() );
1022                 pOutliner->Clear();
1023             }
1024             while(0);
1025         }
1026 
1027         pObj->SetEmptyPresObj(bEmpty);
1028     }
1029 }
1030 
1031 sal_Bool SdXShape::IsMasterDepend() const throw()
1032 {
1033     SdrObject* pObj = mpShape->GetSdrObject();
1034     return pObj && pObj->GetUserCall() != NULL;
1035 }
1036 
1037 void SdXShape::SetMasterDepend( sal_Bool bDepend ) throw()
1038 {
1039     if( IsMasterDepend() != bDepend )
1040     {
1041         SdrObject* pObj = mpShape->GetSdrObject();
1042         if( pObj )
1043         {
1044             if( bDepend )
1045             {
1046                 SdPage* pPage = PTR_CAST(SdPage,pObj->GetPage());
1047                 pObj->SetUserCall( pPage );
1048             }
1049             else
1050             {
1051                 pObj->SetUserCall( NULL );
1052             }
1053         }
1054     }
1055 }
1056 
1057 void SdXShape::SetStyleSheet( const uno::Any& rAny ) throw( lang::IllegalArgumentException )
1058 {
1059     SdrObject* pObj = mpShape->GetSdrObject();
1060     if( pObj == NULL )
1061         throw beans::UnknownPropertyException();
1062 
1063     uno::Reference< style::XStyle > xStyle( rAny, uno::UNO_QUERY );
1064     SfxStyleSheet* pStyleSheet = SfxUnoStyleSheet::getUnoStyleSheet( xStyle );
1065 
1066     const SfxStyleSheet* pOldStyleSheet = pObj->GetStyleSheet();
1067     if( pOldStyleSheet != pStyleSheet )
1068     {
1069         if( pStyleSheet == 0 || (pStyleSheet->GetFamily() != SD_STYLE_FAMILY_GRAPHICS && pStyleSheet->GetFamily() != SD_STYLE_FAMILY_MASTERPAGE) )
1070             throw lang::IllegalArgumentException();
1071 
1072         pObj->SetStyleSheet( pStyleSheet, sal_False );
1073 
1074         SdDrawDocument* pDoc = mpModel? mpModel->GetDoc() : NULL;
1075         if( pDoc )
1076         {
1077             ::sd::DrawDocShell* pDocSh = pDoc->GetDocSh();
1078             ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : NULL;
1079 
1080             if( pViewSh )
1081                 pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
1082         }
1083     }
1084 }
1085 
1086 uno::Any SdXShape::GetStyleSheet() const throw( beans::UnknownPropertyException  )
1087 {
1088     SdrObject* pObj = mpShape->GetSdrObject();
1089     if( pObj == NULL )
1090         throw beans::UnknownPropertyException();
1091 
1092     SfxStyleSheet* pStyleSheet = pObj->GetStyleSheet();
1093     // it is possible for shapes inside a draw to have a presentation style
1094     // but we don't want this for the api
1095     if( (pStyleSheet == NULL) || ((pStyleSheet->GetFamily() != SD_STYLE_FAMILY_GRAPHICS) && !mpModel->IsImpressDocument()) )
1096         return Any();
1097 
1098     return Any( uno::Reference< style::XStyle >( dynamic_cast< SfxUnoStyleSheet* >( pStyleSheet ) ) );
1099 }
1100 
1101 class SdUnoEventsAccess : public cppu::WeakImplHelper2< com::sun::star::container::XNameReplace, com::sun::star::lang::XServiceInfo >
1102 {
1103 private:
1104     const OUString      maStrOnClick;
1105     const OUString      maStrServiceName;
1106     const OUString      maStrEventType;
1107     const OUString      maStrPresentation;
1108     const OUString      maStrLibrary;
1109     const OUString      maStrMacroName;
1110     const OUString      maStrClickAction;
1111     const OUString      maStrBookmark;
1112     const OUString      maStrEffect;
1113     const OUString      maStrPlayFull;
1114     const OUString      maStrVerb;
1115     const OUString      maStrSoundURL;
1116     const OUString      maStrSpeed;
1117     const OUString      maStrStarBasic;
1118     const OUString      maStrScript;
1119 
1120     SdXShape*   mpShape;
1121     uno::Reference< document::XEventsSupplier > mxShape;
1122 
1123 public:
1124     SdUnoEventsAccess( SdXShape* pShape ) throw();
1125 
1126     // XNameReplace
1127     virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
1128 
1129     // XNameAccess
1130     virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
1131     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  ) throw(::com::sun::star::uno::RuntimeException);
1132     virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException);
1133 
1134     // XElementAccess
1135     virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw(::com::sun::star::uno::RuntimeException);
1136     virtual sal_Bool SAL_CALL hasElements(  ) throw(::com::sun::star::uno::RuntimeException);
1137 
1138     // XServiceInfo
1139     virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw(::com::sun::star::uno::RuntimeException);
1140     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);
1141     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException);
1142 };
1143 
1144 // XEventsSupplier
1145 uno::Reference< container::XNameReplace > SAL_CALL SdXShape::getEvents(  ) throw(::com::sun::star::uno::RuntimeException)
1146 {
1147     return new SdUnoEventsAccess( this );
1148 }
1149 
1150 SdUnoEventsAccess::SdUnoEventsAccess( SdXShape* pShape ) throw()
1151 : maStrOnClick( RTL_CONSTASCII_USTRINGPARAM("OnClick") ),
1152   maStrServiceName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.documents.Events") ),
1153   maStrEventType( RTL_CONSTASCII_USTRINGPARAM("EventType") ),
1154   maStrPresentation( RTL_CONSTASCII_USTRINGPARAM("Presentation") ),
1155   maStrLibrary(RTL_CONSTASCII_USTRINGPARAM("Library")),
1156   maStrMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName")),
1157   maStrClickAction( RTL_CONSTASCII_USTRINGPARAM("ClickAction") ),
1158   maStrBookmark( RTL_CONSTASCII_USTRINGPARAM("Bookmark") ),
1159   maStrEffect( RTL_CONSTASCII_USTRINGPARAM("Effect") ),
1160   maStrPlayFull( RTL_CONSTASCII_USTRINGPARAM("PlayFull") ),
1161   maStrVerb( RTL_CONSTASCII_USTRINGPARAM("Verb") ),
1162   maStrSoundURL( RTL_CONSTASCII_USTRINGPARAM("SoundURL") ),
1163   maStrSpeed( RTL_CONSTASCII_USTRINGPARAM("Speed") ),
1164   maStrStarBasic( RTL_CONSTASCII_USTRINGPARAM("StarBasic") ),
1165   maStrScript( RTL_CONSTASCII_USTRINGPARAM("Script") ),
1166   mpShape( pShape ), mxShape( pShape )
1167 {
1168 }
1169 
1170 #define FOUND_CLICKACTION   0x0001
1171 #define FOUND_BOOKMARK      0x0002
1172 #define FOUND_EFFECT        0x0004
1173 #define FOUND_PLAYFULL      0x0008
1174 #define FOUND_VERB          0x0010
1175 #define FOUND_SOUNDURL      0x0020
1176 #define FOUND_SPEED         0x0040
1177 #define FOUND_EVENTTYPE     0x0080
1178 #define FOUND_MACRO         0x0100
1179 #define FOUND_LIBRARY       0x0200
1180 
1181 static void clearEventsInAnimationInfo( SdAnimationInfo* pInfo )
1182 {
1183     const String aEmpty;
1184     pInfo->SetBookmark( aEmpty );
1185     pInfo->mbSecondSoundOn = sal_False;
1186     pInfo->mbSecondPlayFull = sal_False;
1187     pInfo->meClickAction = presentation::ClickAction_NONE;
1188     pInfo->meSecondEffect = presentation::AnimationEffect_NONE;
1189     pInfo->meSecondSpeed = presentation::AnimationSpeed_MEDIUM;
1190     pInfo->mnVerb = 0;
1191 }
1192 
1193 // XNameReplace
1194 void SAL_CALL SdUnoEventsAccess::replaceByName( const OUString& aName, const uno::Any& aElement )
1195     throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
1196 {
1197     if( mpShape == NULL || aName != maStrOnClick )
1198         throw container::NoSuchElementException();
1199 
1200     uno::Sequence< beans::PropertyValue > aProperties;
1201     if( !aElement.hasValue() || aElement.getValueType() != getElementType() || !(aElement >>= aProperties) )
1202         throw lang::IllegalArgumentException();
1203 
1204     sal_Int32 nFound = 0;
1205     const beans::PropertyValue* pProperties = aProperties.getConstArray();
1206 
1207     OUString aStrEventType;
1208     presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
1209     presentation::AnimationEffect eEffect = presentation::AnimationEffect_NONE;
1210     presentation::AnimationSpeed eSpeed = presentation::AnimationSpeed_MEDIUM;
1211     OUString aStrSoundURL;
1212     sal_Bool bPlayFull = sal_False;
1213     sal_Int32 nVerb = 0;
1214     OUString aStrMacro;
1215     OUString aStrLibrary;
1216     OUString aStrBookmark;
1217 
1218     const sal_Int32 nCount = aProperties.getLength();
1219     sal_Int32 nIndex;
1220     for( nIndex = 0; nIndex < nCount; nIndex++, pProperties++ )
1221     {
1222         if( ( ( nFound & FOUND_EVENTTYPE ) == 0 ) && pProperties->Name == maStrEventType )
1223         {
1224             if( pProperties->Value >>= aStrEventType )
1225             {
1226                 nFound |= FOUND_EVENTTYPE;
1227                 continue;
1228             }
1229         }
1230         else if( ( ( nFound & FOUND_CLICKACTION ) == 0 ) && pProperties->Name == maStrClickAction )
1231         {
1232             if( pProperties->Value >>= eClickAction )
1233             {
1234                 nFound |= FOUND_CLICKACTION;
1235                 continue;
1236             }
1237         }
1238         else if( ( ( nFound & FOUND_MACRO ) == 0 ) && ( pProperties->Name == maStrMacroName || pProperties->Name == maStrScript ) )
1239         {
1240             if( pProperties->Value >>= aStrMacro )
1241             {
1242                 nFound |= FOUND_MACRO;
1243                 continue;
1244             }
1245         }
1246         else if( ( ( nFound & FOUND_LIBRARY ) == 0 ) && pProperties->Name == maStrLibrary )
1247         {
1248             if( pProperties->Value >>= aStrLibrary )
1249             {
1250                 nFound |= FOUND_LIBRARY;
1251                 continue;
1252             }
1253         }
1254         else if( ( ( nFound & FOUND_EFFECT ) == 0 ) && pProperties->Name == maStrEffect )
1255         {
1256             if( pProperties->Value >>= eEffect )
1257             {
1258                 nFound |= FOUND_EFFECT;
1259                 continue;
1260             }
1261         }
1262         else if( ( ( nFound & FOUND_BOOKMARK ) == 0 ) && pProperties->Name == maStrBookmark )
1263         {
1264             if( pProperties->Value >>= aStrBookmark )
1265             {
1266                 nFound |= FOUND_BOOKMARK;
1267                 continue;
1268             }
1269         }
1270         else if( ( ( nFound & FOUND_SPEED ) == 0 ) && pProperties->Name == maStrSpeed )
1271         {
1272             if( pProperties->Value >>= eSpeed )
1273             {
1274                 nFound |= FOUND_SPEED;
1275                 continue;
1276             }
1277         }
1278         else if( ( ( nFound & FOUND_SOUNDURL ) == 0 ) && pProperties->Name == maStrSoundURL )
1279         {
1280             if( pProperties->Value >>= aStrSoundURL )
1281             {
1282                 nFound |= FOUND_SOUNDURL;
1283                 continue;
1284             }
1285         }
1286         else if( ( ( nFound & FOUND_PLAYFULL ) == 0 ) && pProperties->Name == maStrPlayFull )
1287         {
1288             if( pProperties->Value >>= bPlayFull )
1289             {
1290                 nFound |= FOUND_PLAYFULL;
1291                 continue;
1292             }
1293         }
1294         else if( ( ( nFound & FOUND_VERB ) == 0 ) && pProperties->Name == maStrVerb )
1295         {
1296             if( pProperties->Value >>= nVerb )
1297             {
1298                 nFound |= FOUND_VERB;
1299                 continue;
1300             }
1301         }
1302 
1303         throw lang::IllegalArgumentException();
1304     }
1305 
1306     sal_Bool bOk = sal_False;
1307     do
1308     {
1309         if( ( nFound & FOUND_EVENTTYPE ) == 0 )
1310             break;
1311 
1312         if( aStrEventType == maStrPresentation )
1313         {
1314             if( ( nFound & FOUND_CLICKACTION ) == 0 )
1315                 break;
1316 
1317             SdAnimationInfo* pInfo = mpShape->GetAnimationInfo( sal_False );
1318             if( presentation::ClickAction_NONE == eClickAction && NULL == pInfo )
1319             {
1320                 bOk = sal_True;
1321                 break;
1322             }
1323 
1324             if( NULL == pInfo )
1325                 pInfo = mpShape->GetAnimationInfo( sal_True );
1326 
1327             DBG_ASSERT( pInfo, "shape animation info could not be created!" );
1328             if( NULL == pInfo )
1329                 break;
1330 
1331             clearEventsInAnimationInfo( pInfo );
1332             pInfo->meClickAction = eClickAction;
1333 
1334             switch( eClickAction )
1335             {
1336             case presentation::ClickAction_NONE:
1337             case presentation::ClickAction_PREVPAGE:
1338             case presentation::ClickAction_NEXTPAGE:
1339             case presentation::ClickAction_FIRSTPAGE:
1340             case presentation::ClickAction_LASTPAGE:
1341             case presentation::ClickAction_INVISIBLE:
1342             case presentation::ClickAction_STOPPRESENTATION:
1343                 {
1344                     bOk = sal_True;
1345                 }
1346                 break;
1347 
1348             case presentation::ClickAction_PROGRAM:
1349             case presentation::ClickAction_BOOKMARK:
1350             case presentation::ClickAction_DOCUMENT:
1351                 if( nFound & FOUND_BOOKMARK )
1352                 {
1353                     if( eClickAction == presentation::ClickAction_BOOKMARK )
1354                     {
1355                         aStrBookmark = getUiNameFromPageApiNameImpl( aStrBookmark );
1356                     }
1357                     else if( eClickAction == presentation::ClickAction_DOCUMENT )
1358                     {
1359                         sal_Int32 nPos = aStrBookmark.lastIndexOf( sal_Unicode('#') );
1360                         if( nPos >= 0 )
1361                         {
1362                             OUString aURL( aStrBookmark.copy( 0, nPos+1 ) );
1363                             aURL += getUiNameFromPageApiNameImpl( aStrBookmark.copy( nPos+1 ) );
1364                             aStrBookmark = aURL;
1365                         }
1366                     }
1367 
1368                     pInfo->SetBookmark( aStrBookmark );
1369                     bOk = sal_True;
1370                 }
1371                 break;
1372 
1373             case presentation::ClickAction_MACRO:
1374                 if( nFound & FOUND_MACRO )
1375                 {
1376                     pInfo->SetBookmark( aStrMacro );
1377                     bOk = sal_True;
1378                 }
1379                 break;
1380 
1381             case presentation::ClickAction_VERB:
1382                 if( nFound & FOUND_VERB )
1383                 {
1384                     pInfo->mnVerb = (sal_uInt16)nVerb;
1385                     bOk = sal_True;
1386                 }
1387                 break;
1388 
1389             case presentation::ClickAction_VANISH:
1390                 if( ( nFound & FOUND_EFFECT ) == 0 )
1391                     break;
1392 
1393                 pInfo->meSecondEffect = eEffect;
1394                 pInfo->meSecondSpeed = nFound & FOUND_SPEED ? eSpeed : presentation::AnimationSpeed_MEDIUM;
1395 
1396                 bOk = sal_True;
1397 
1398                 // NOTE: No break here!!!
1399 
1400             case presentation::ClickAction_SOUND:
1401                 if( nFound & FOUND_SOUNDURL )
1402                 {
1403                     pInfo->SetBookmark( aStrSoundURL );
1404                     if( eClickAction != presentation::ClickAction_SOUND )
1405                         pInfo->mbSecondSoundOn = aStrSoundURL.getLength() != 0;
1406                     pInfo->mbSecondPlayFull = nFound & FOUND_PLAYFULL ? bPlayFull : sal_False;
1407 
1408                     bOk = sal_True;
1409                 }
1410                 break;
1411             case presentation::ClickAction_MAKE_FIXED_SIZE:
1412                 break;
1413             }
1414         }
1415         else
1416         {
1417             SdAnimationInfo* pInfo = mpShape->GetAnimationInfo( sal_True );
1418 
1419             DBG_ASSERT( pInfo, "shape animation info could not be created!" );
1420             if( NULL == pInfo )
1421                 break;
1422 
1423             clearEventsInAnimationInfo( pInfo );
1424             pInfo->meClickAction = presentation::ClickAction_MACRO;
1425 
1426             if ( SfxApplication::IsXScriptURL( aStrMacro ) )
1427             {
1428                 pInfo->SetBookmark( aStrMacro );
1429             }
1430             else
1431             {
1432                 String aMacro = aStrMacro;
1433 
1434                 String aLibName   = aMacro.GetToken(0, sal_Unicode('.'));
1435                 String aModulName = aMacro.GetToken(1, sal_Unicode('.'));
1436                 String aMacroName = aMacro.GetToken(2, sal_Unicode('.'));
1437 
1438                 OUStringBuffer sBuffer;
1439                 sBuffer.append( aMacroName );
1440                 sBuffer.append( sal_Unicode('.') );
1441                 sBuffer.append( aModulName );
1442                 sBuffer.append( sal_Unicode('.') );
1443                 sBuffer.append( aLibName );
1444                 sBuffer.append( sal_Unicode('.') );
1445 
1446                 if( aStrLibrary.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StarOffice" ) ) )
1447                 {
1448                     sBuffer.append( OUString( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ) );
1449                 }
1450                 else
1451                 {
1452                     sBuffer.append( aStrLibrary );
1453                 }
1454 
1455                 pInfo->SetBookmark( sBuffer.makeStringAndClear() );
1456             }
1457             bOk = sal_True;
1458         }
1459     }
1460     while(0);
1461 
1462     if( !bOk )
1463         throw lang::IllegalArgumentException();
1464 }
1465 
1466 // XNameAccess
1467 uno::Any SAL_CALL SdUnoEventsAccess::getByName( const OUString& aName )
1468     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
1469 {
1470     if( mpShape == NULL || aName != maStrOnClick )
1471         throw container::NoSuchElementException();
1472 
1473     SdAnimationInfo* pInfo = mpShape->GetAnimationInfo( sal_False );
1474 
1475     presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
1476     if( pInfo )
1477         eClickAction = pInfo->meClickAction;
1478 
1479     sal_Int32 nPropertyCount = 2;
1480     switch( eClickAction )
1481     {
1482     case presentation::ClickAction_NONE:
1483     case presentation::ClickAction_PREVPAGE:
1484     case presentation::ClickAction_NEXTPAGE:
1485     case presentation::ClickAction_FIRSTPAGE:
1486     case presentation::ClickAction_LASTPAGE:
1487     case presentation::ClickAction_INVISIBLE:
1488     case presentation::ClickAction_STOPPRESENTATION:
1489         break;
1490     case presentation::ClickAction_PROGRAM:
1491     case presentation::ClickAction_VERB:
1492     case presentation::ClickAction_BOOKMARK:
1493     case presentation::ClickAction_DOCUMENT:
1494     case presentation::ClickAction_MACRO:
1495         if ( !SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) )
1496             nPropertyCount += 1;
1497         break;
1498 
1499     case presentation::ClickAction_SOUND:
1500         nPropertyCount += 2;
1501         break;
1502 
1503     case presentation::ClickAction_VANISH:
1504         nPropertyCount += 4;
1505         break;
1506     default:
1507         break;
1508     }
1509 
1510     uno::Sequence< beans::PropertyValue > aProperties( nPropertyCount );
1511     beans::PropertyValue* pProperties = aProperties.getArray();
1512 
1513     uno::Any aAny;
1514 
1515     if( eClickAction == presentation::ClickAction_MACRO )
1516     {
1517         if ( SfxApplication::IsXScriptURL( pInfo->GetBookmark() ) )
1518         {
1519             // Scripting Framework URL
1520             aAny <<= maStrScript;;
1521             pProperties->Name = maStrEventType;
1522             pProperties->Handle = -1;
1523             pProperties->Value = aAny;
1524             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1525             pProperties++;
1526 
1527             aAny <<= OUString( pInfo->GetBookmark() );
1528             pProperties->Name = maStrScript;
1529             pProperties->Handle = -1;
1530             pProperties->Value = aAny;
1531             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1532             pProperties++;
1533         }
1534         else
1535         {
1536             // Old Basic macro URL
1537             aAny <<= maStrStarBasic;;
1538             pProperties->Name = maStrEventType;
1539             pProperties->Handle = -1;
1540             pProperties->Value = aAny;
1541             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1542             pProperties++;
1543 
1544             String aMacro = pInfo->GetBookmark();
1545 
1546             // aMacro has got following format:
1547             // "Macroname.Modulname.Libname.Documentname" or
1548             // "Macroname.Modulname.Libname.Applicationsname"
1549             String aMacroName = aMacro.GetToken(0, sal_Unicode('.'));
1550             String aModulName = aMacro.GetToken(1, sal_Unicode('.'));
1551             String aLibName   = aMacro.GetToken(2, sal_Unicode('.'));
1552             String aDocName   = aMacro.GetToken(3, sal_Unicode('.'));
1553 
1554             OUStringBuffer sBuffer;
1555             sBuffer.append( aLibName );
1556             sBuffer.append( sal_Unicode('.') );
1557             sBuffer.append( aModulName );
1558             sBuffer.append( sal_Unicode('.') );
1559             sBuffer.append( aMacroName );
1560 
1561             aAny <<= OUString( sBuffer.makeStringAndClear() );
1562             pProperties->Name = maStrMacroName;
1563             pProperties->Handle = -1;
1564             pProperties->Value = aAny;
1565             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1566             pProperties++;
1567 
1568             aAny <<= OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice" ) );
1569             pProperties->Name = maStrLibrary;
1570             pProperties->Handle = -1;
1571             pProperties->Value = aAny;
1572             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1573         }
1574     }
1575     else
1576     {
1577         aAny <<= maStrPresentation;
1578         pProperties->Name = maStrEventType;
1579         pProperties->Handle = -1;
1580         pProperties->Value = aAny;
1581         pProperties->State = beans::PropertyState_DIRECT_VALUE;
1582         pProperties++;
1583 
1584         aAny <<= eClickAction;
1585         pProperties->Name = maStrClickAction;
1586         pProperties->Handle = -1;
1587         pProperties->Value = aAny;
1588         pProperties->State = beans::PropertyState_DIRECT_VALUE;
1589         pProperties++;
1590 
1591         switch( eClickAction )
1592         {
1593         case presentation::ClickAction_NONE:
1594         case presentation::ClickAction_PREVPAGE:
1595         case presentation::ClickAction_NEXTPAGE:
1596         case presentation::ClickAction_FIRSTPAGE:
1597         case presentation::ClickAction_LASTPAGE:
1598         case presentation::ClickAction_INVISIBLE:
1599         case presentation::ClickAction_STOPPRESENTATION:
1600             break;
1601         case presentation::ClickAction_BOOKMARK:
1602             {
1603                 const OUString aStrBookmark( getPageApiNameFromUiName( pInfo->GetBookmark()) );
1604                 pProperties->Name = maStrBookmark;
1605                 pProperties->Handle = -1;
1606                 pProperties->Value <<= aStrBookmark;
1607                 pProperties->State = beans::PropertyState_DIRECT_VALUE;
1608             }
1609             break;
1610 
1611         case presentation::ClickAction_DOCUMENT:
1612         case presentation::ClickAction_PROGRAM:
1613             {
1614                 OUString aString( pInfo->GetBookmark());
1615                 sal_Int32 nPos = aString.lastIndexOf( sal_Unicode('#') );
1616                 if( nPos >= 0 )
1617                 {
1618                     OUString aURL( aString.copy( 0, nPos+1 ) );
1619                     aURL += getPageApiNameFromUiName( aString.copy( nPos+1 ) );
1620                     aString = aURL;
1621                 }
1622                 pProperties->Name = maStrBookmark;
1623                 pProperties->Handle = -1;
1624                 pProperties->Value <<= aString;
1625                 pProperties->State = beans::PropertyState_DIRECT_VALUE;
1626             }
1627             break;
1628 
1629         case presentation::ClickAction_VANISH:
1630             aAny <<= pInfo->meSecondEffect;
1631             pProperties->Name = maStrEffect;
1632             pProperties->Handle = -1;
1633             pProperties->Value = aAny;
1634             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1635             pProperties++;
1636 
1637             aAny <<= pInfo->meSecondSpeed;
1638             pProperties->Name = maStrSpeed;
1639             pProperties->Handle = -1;
1640             pProperties->Value = aAny;
1641             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1642             pProperties++;
1643 
1644             // NOTE: no break here!!!
1645 
1646         case presentation::ClickAction_SOUND:
1647             if( eClickAction == presentation::ClickAction_SOUND || pInfo->mbSecondSoundOn )
1648             {
1649                 aAny <<= OUString( pInfo->GetBookmark());
1650                 pProperties->Name = maStrSoundURL;
1651                 pProperties->Handle = -1;
1652                 pProperties->Value = aAny;
1653                 pProperties->State = beans::PropertyState_DIRECT_VALUE;
1654                 pProperties++;
1655 
1656                 pProperties->Name = maStrPlayFull;
1657                 pProperties->Handle = -1;
1658                 pProperties->Value = ::cppu::bool2any(pInfo->mbSecondPlayFull);
1659                 pProperties->State = beans::PropertyState_DIRECT_VALUE;
1660             }
1661             break;
1662 
1663         case presentation::ClickAction_VERB:
1664             aAny <<= (sal_Int32)pInfo->mnVerb;
1665             pProperties->Name = maStrVerb;
1666             pProperties->Handle = -1;
1667             pProperties->Value = aAny;
1668             pProperties->State = beans::PropertyState_DIRECT_VALUE;
1669             break;
1670         default:
1671             break;
1672         }
1673     }
1674 
1675     aAny <<= aProperties;
1676     return aAny;
1677 }
1678 
1679 uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getElementNames(  )
1680     throw(uno::RuntimeException)
1681 {
1682     uno::Sequence< OUString > aStr( &maStrOnClick, 1 );
1683     return aStr;
1684 }
1685 
1686 sal_Bool SAL_CALL SdUnoEventsAccess::hasByName( const OUString& aName )
1687     throw(uno::RuntimeException)
1688 {
1689     return aName == maStrOnClick;
1690 }
1691 
1692 // XElementAccess
1693 uno::Type SAL_CALL SdUnoEventsAccess::getElementType(  )
1694     throw(uno::RuntimeException)
1695 {
1696     return *SEQTYPE(::getCppuType((const uno::Sequence< beans::PropertyValue >*)0));
1697 }
1698 
1699 sal_Bool SAL_CALL SdUnoEventsAccess::hasElements(  ) throw(uno::RuntimeException)
1700 {
1701     return sal_True;
1702 }
1703 
1704 // XServiceInfo
1705 OUString SAL_CALL SdUnoEventsAccess::getImplementationName(  )
1706     throw(uno::RuntimeException)
1707 {
1708     return OUString( RTL_CONSTASCII_USTRINGPARAM( "SdUnoEventsAccess" ) );
1709 }
1710 
1711 sal_Bool SAL_CALL SdUnoEventsAccess::supportsService( const OUString& ServiceName )
1712     throw(uno::RuntimeException)
1713 {
1714     return ServiceName == maStrServiceName;
1715 }
1716 
1717 uno::Sequence< OUString > SAL_CALL SdUnoEventsAccess::getSupportedServiceNames(  )
1718     throw(uno::RuntimeException)
1719 {
1720     uno::Sequence< OUString > aStr( &maStrServiceName, 1 );
1721     return aStr;
1722 }
1723 
1724 void SdXShape::modelChanged( SdrModel* pNewModel )
1725 {
1726     if( pNewModel )
1727     {
1728         uno::Reference< uno::XInterface > xModel( pNewModel->getUnoModel() );
1729         mpModel = SdXImpressDocument::getImplementation( xModel );
1730     }
1731     else
1732     {
1733         mpModel = 0;
1734     }
1735 }
1736 
1737 void SdXShape::pageChanged( SdrPage*  )
1738 {
1739 }
1740 
1741 void SdXShape::objectChanged( SdrObject*  )
1742 {
1743 }
1744 
1745