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