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