1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sd.hxx" 30 #include <com/sun/star/lang/DisposedException.hpp> 31 32 #include "unolayer.hxx" 33 #include <osl/mutex.hxx> 34 #include <vos/mutex.hxx> 35 36 #include <svx/svdpagv.hxx> 37 #include <svx/unoshape.hxx> 38 #include <svx/svdobj.hxx> 39 #include <comphelper/serviceinfohelper.hxx> 40 41 // folgende fuer InsertSdPage() 42 #include <svx/svdlayer.hxx> 43 44 #ifndef SVX_LIGHT 45 #ifndef SD_DRAW_DOC_SHELL_HXX 46 #include "DrawDocShell.hxx" 47 #endif 48 #endif 49 #include <drawdoc.hxx> 50 #include <unomodel.hxx> 51 #include "unoprnms.hxx" 52 #include <com/sun/star/lang/NoSupportException.hpp> 53 #include <svx/svdpool.hxx> 54 #include "unohelp.hxx" 55 #include "FrameView.hxx" 56 #include "DrawViewShell.hxx" 57 #include "View.hxx" 58 #include "ViewShell.hxx" 59 #include "app.hrc" 60 #include "strings.hrc" 61 #include "sdresid.hxx" 62 #include "glob.hrc" 63 64 #include "unokywds.hxx" 65 #include "unowcntr.hxx" 66 #include <vcl/svapp.hxx> 67 68 using namespace ::rtl; 69 using namespace ::vos; 70 using namespace ::com::sun::star; 71 72 //============================================================================= 73 // class SdLayer 74 //============================================================================= 75 76 #define WID_LAYER_LOCKED 1 77 #define WID_LAYER_PRINTABLE 2 78 #define WID_LAYER_VISIBLE 3 79 #define WID_LAYER_NAME 4 80 #define WID_LAYER_TITLE 5 81 #define WID_LAYER_DESC 6 82 83 const SvxItemPropertySet* ImplGetSdLayerPropertySet() 84 { 85 static const SfxItemPropertyMapEntry aSdLayerPropertyMap_Impl[] = 86 { 87 { MAP_CHAR_LEN(UNO_NAME_LAYER_LOCKED), WID_LAYER_LOCKED, &::getBooleanCppuType(), 0, 0 }, 88 { MAP_CHAR_LEN(UNO_NAME_LAYER_PRINTABLE), WID_LAYER_PRINTABLE,&::getBooleanCppuType(), 0, 0 }, 89 { MAP_CHAR_LEN(UNO_NAME_LAYER_VISIBLE), WID_LAYER_VISIBLE, &::getBooleanCppuType(), 0, 0 }, 90 { MAP_CHAR_LEN(UNO_NAME_LAYER_NAME), WID_LAYER_NAME, &::getCppuType((const OUString*)0), 0, 0 }, 91 { MAP_CHAR_LEN("Title"), WID_LAYER_TITLE, &::getCppuType((const OUString*)0), 0, 0 }, 92 { MAP_CHAR_LEN("Description"), WID_LAYER_DESC, &::getCppuType((const OUString*)0), 0, 0 }, 93 { 0,0,0,0,0,0} 94 }; 95 static SvxItemPropertySet aSDLayerPropertySet_Impl( aSdLayerPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); 96 return &aSDLayerPropertySet_Impl; 97 } 98 99 String SdLayer::convertToInternalName( const OUString& rName ) 100 { 101 if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_background) ) ) 102 { 103 return String( SdResId( STR_LAYER_BCKGRND ) ); 104 } 105 else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_background_objects) ) ) 106 { 107 return String( SdResId( STR_LAYER_BCKGRNDOBJ ) ); 108 } 109 else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_layout) ) ) 110 { 111 return String( SdResId( STR_LAYER_LAYOUT ) ); 112 } 113 else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_controls) ) ) 114 { 115 return String( SdResId( STR_LAYER_CONTROLS ) ); 116 } 117 else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_measurelines) ) ) 118 { 119 return String( SdResId( STR_LAYER_MEASURELINES ) ); 120 } 121 else 122 { 123 return String( rName ); 124 } 125 } 126 127 OUString SdLayer::convertToExternalName( const String& rName ) 128 { 129 const String aCompare( rName ); 130 if( rName == String( SdResId( STR_LAYER_BCKGRND ) ) ) 131 { 132 return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_background) ); 133 } 134 else if( rName == String( SdResId( STR_LAYER_BCKGRNDOBJ ) ) ) 135 { 136 return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_background_objects) ); 137 } 138 else if( rName == String( SdResId( STR_LAYER_LAYOUT ) ) ) 139 { 140 return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_layout) ); 141 } 142 else if( rName == String( SdResId( STR_LAYER_CONTROLS ) ) ) 143 { 144 return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_controls) ); 145 } 146 else if( rName == String( SdResId( STR_LAYER_MEASURELINES ) ) ) 147 { 148 return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_measurelines) ); 149 } 150 else 151 { 152 return OUString( rName ); 153 } 154 } 155 156 /** */ 157 SdLayer::SdLayer( SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_ ) throw() 158 : pLayerManager(pLayerManager_) 159 , mxLayerManager(pLayerManager_) 160 , pLayer(pSdrLayer_) 161 , pPropSet(ImplGetSdLayerPropertySet()) 162 { 163 } 164 165 /** */ 166 SdLayer::~SdLayer() throw() 167 { 168 } 169 170 // uno helper 171 UNO3_GETIMPLEMENTATION_IMPL( SdLayer ); 172 173 // XServiceInfo 174 OUString SAL_CALL SdLayer::getImplementationName() 175 throw(uno::RuntimeException) 176 { 177 return OUString( OUString::createFromAscii(sUNO_SdLayer) ); 178 } 179 180 sal_Bool SAL_CALL SdLayer::supportsService( const OUString& ServiceName ) 181 throw(uno::RuntimeException) 182 { 183 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 184 } 185 186 uno::Sequence< OUString > SAL_CALL SdLayer::getSupportedServiceNames() 187 throw(uno::RuntimeException) 188 { 189 OUString aServiceName( OUString::createFromAscii(sUNO_Service_DrawingLayer) ); 190 uno::Sequence< OUString > aSeq( &aServiceName, 1 ); 191 return aSeq; 192 } 193 194 // beans::XPropertySet 195 uno::Reference< beans::XPropertySetInfo > SAL_CALL SdLayer::getPropertySetInfo( ) 196 throw(uno::RuntimeException) 197 { 198 OGuard aGuard( Application::GetSolarMutex() ); 199 return pPropSet->getPropertySetInfo(); 200 } 201 202 void SAL_CALL SdLayer::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue ) 203 throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 204 { 205 OGuard aGuard( Application::GetSolarMutex() ); 206 207 if(pLayer == NULL || pLayerManager == NULL) 208 throw lang::DisposedException(); 209 210 const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMapEntry(aPropertyName); 211 212 switch( pEntry ? pEntry->nWID : -1 ) 213 { 214 case WID_LAYER_LOCKED: 215 { 216 sal_Bool bValue = sal_False; 217 if(!sd::any2bool( aValue, bValue )) 218 throw lang::IllegalArgumentException(); 219 set( LOCKED, bValue ); 220 break; 221 } 222 case WID_LAYER_PRINTABLE: 223 { 224 sal_Bool bValue = sal_False; 225 if(!sd::any2bool( aValue, bValue )) 226 throw lang::IllegalArgumentException(); 227 set( PRINTABLE, bValue ); 228 break; 229 } 230 case WID_LAYER_VISIBLE: 231 { 232 sal_Bool bValue = sal_False; 233 if(!sd::any2bool( aValue, bValue )) 234 throw lang::IllegalArgumentException(); 235 set( VISIBLE, bValue ); 236 break; 237 } 238 case WID_LAYER_NAME: 239 { 240 OUString aName; 241 if(!(aValue >>= aName)) 242 throw lang::IllegalArgumentException(); 243 244 pLayer->SetName(SdLayer::convertToInternalName( aName ) ); 245 pLayerManager->UpdateLayerView(); 246 break; 247 } 248 249 case WID_LAYER_TITLE: 250 { 251 OUString sTitle; 252 if(!(aValue >>= sTitle)) 253 throw lang::IllegalArgumentException(); 254 255 pLayer->SetTitle(sTitle); 256 break; 257 } 258 259 case WID_LAYER_DESC: 260 { 261 OUString sDescription; 262 if(!(aValue >>= sDescription)) 263 throw lang::IllegalArgumentException(); 264 265 pLayer->SetDescription(sDescription); 266 break; 267 } 268 269 default: 270 throw beans::UnknownPropertyException(); 271 } 272 273 #ifndef SVX_LIGHT 274 if( pLayerManager->GetDocShell() ) 275 pLayerManager->GetDocShell()->SetModified(); 276 #endif 277 } 278 279 uno::Any SAL_CALL SdLayer::getPropertyValue( const OUString& PropertyName ) 280 throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 281 { 282 OGuard aGuard( Application::GetSolarMutex() ); 283 284 if(pLayer == NULL || pLayerManager == NULL) 285 throw lang::DisposedException(); 286 287 const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMapEntry(PropertyName); 288 289 uno::Any aValue; 290 291 switch( pEntry ? pEntry->nWID : -1 ) 292 { 293 case WID_LAYER_LOCKED: 294 sd::bool2any( get( LOCKED ), aValue ); 295 break; 296 case WID_LAYER_PRINTABLE: 297 sd::bool2any( get( PRINTABLE ), aValue ); 298 break; 299 case WID_LAYER_VISIBLE: 300 sd::bool2any( get( VISIBLE ), aValue ); 301 break; 302 case WID_LAYER_NAME: 303 { 304 OUString aRet( SdLayer::convertToExternalName( pLayer->GetName() ) ); 305 aValue <<= aRet; 306 break; 307 } 308 case WID_LAYER_TITLE: 309 aValue <<= OUString( pLayer->GetTitle() ); 310 break; 311 case WID_LAYER_DESC: 312 aValue <<= OUString( pLayer->GetDescription() ); 313 break; 314 default: 315 throw beans::UnknownPropertyException(); 316 } 317 318 return aValue; 319 } 320 321 void SAL_CALL SdLayer::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 322 void SAL_CALL SdLayer::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 323 void SAL_CALL SdLayer::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 324 void SAL_CALL SdLayer::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {} 325 326 /** */ 327 sal_Bool SdLayer::get( LayerAttribute what ) throw() 328 { 329 if(pLayer&&pLayerManager) 330 { 331 // Versuch 1. ist eine beliebige Seite geoeffnet? 332 ::sd::View *pView = pLayerManager->GetView(); 333 SdrPageView* pSdrPageView = NULL; 334 if(pView) 335 pSdrPageView = pView->GetSdrPageView(); 336 337 if(pSdrPageView) 338 { 339 String aLayerName = pLayer->GetName(); 340 switch(what) 341 { 342 case VISIBLE: return pSdrPageView->IsLayerVisible(aLayerName); 343 case PRINTABLE: return pSdrPageView->IsLayerPrintable(aLayerName); 344 case LOCKED: return pSdrPageView->IsLayerLocked(aLayerName); 345 } 346 } 347 348 #ifndef SVX_LIGHT 349 // Versuch 2. Info von der FrameView besorgen 350 if(pLayerManager->GetDocShell()) 351 { 352 ::sd::FrameView *pFrameView = pLayerManager->GetDocShell()->GetFrameView(); 353 if(pFrameView) 354 switch(what) 355 { 356 case VISIBLE: return pFrameView->GetVisibleLayers().IsSet(pLayer->GetID()); 357 case PRINTABLE: return pFrameView->GetPrintableLayers().IsSet(pLayer->GetID()); 358 case LOCKED: return pFrameView->GetLockedLayers().IsSet(pLayer->GetID()); 359 } 360 } 361 #endif 362 } 363 return sal_False; //TODO: uno::Exception? 364 } 365 366 void SdLayer::set( LayerAttribute what, sal_Bool flag ) throw() 367 { 368 if(pLayer&&pLayerManager) 369 { 370 // Versuch 1. ist eine beliebige Seite geoeffnet? 371 ::sd::View *pView = pLayerManager->GetView(); 372 SdrPageView* pSdrPageView = NULL; 373 if(pView) 374 pSdrPageView = pView->GetSdrPageView(); 375 376 if(pSdrPageView) 377 { 378 String aLayerName(pLayer->GetName()); 379 switch(what) 380 { 381 case VISIBLE: pSdrPageView->SetLayerVisible(aLayerName,flag); 382 break; 383 case PRINTABLE: pSdrPageView->SetLayerPrintable(aLayerName,flag); 384 break; 385 case LOCKED: pSdrPageView->SetLayerLocked(aLayerName,flag); 386 break; 387 } 388 } 389 390 #ifndef SVX_LIGHT 391 // Versuch 2. Info von der FrameView besorgen 392 if(pLayerManager->GetDocShell()) 393 { 394 ::sd::FrameView *pFrameView = pLayerManager->GetDocShell()->GetFrameView(); 395 396 if(pFrameView) 397 { 398 SetOfByte aNewLayers; 399 switch(what) 400 { 401 case VISIBLE: aNewLayers = pFrameView->GetVisibleLayers(); 402 break; 403 case PRINTABLE: aNewLayers = pFrameView->GetPrintableLayers(); 404 break; 405 case LOCKED: aNewLayers = pFrameView->GetLockedLayers(); 406 break; 407 } 408 409 aNewLayers.Set(pLayer->GetID(),flag); 410 411 switch(what) 412 { 413 case VISIBLE: pFrameView->SetVisibleLayers(aNewLayers); 414 break; 415 case PRINTABLE: pFrameView->SetPrintableLayers(aNewLayers); 416 break; 417 case LOCKED: pFrameView->SetLockedLayers(aNewLayers); 418 break; 419 } 420 return; 421 } 422 } 423 #endif 424 } 425 //TODO: uno::Exception? 426 } 427 428 429 430 431 //===== ::com::sun::star::container::XChild ================================= 432 433 uno::Reference<uno::XInterface> SAL_CALL SdLayer::getParent (void) 434 throw (::com::sun::star::uno::RuntimeException) 435 { 436 OGuard aGuard( Application::GetSolarMutex() ); 437 438 if( pLayerManager == NULL ) 439 throw lang::DisposedException(); 440 441 return uno::Reference<uno::XInterface> (mxLayerManager, uno::UNO_QUERY); 442 } 443 444 445 void SAL_CALL SdLayer::setParent (const uno::Reference<uno::XInterface >& ) 446 throw (::com::sun::star::lang::NoSupportException, 447 ::com::sun::star::uno::RuntimeException) 448 { 449 throw lang::NoSupportException (); 450 } 451 452 // XComponent 453 void SAL_CALL SdLayer::dispose( ) throw (uno::RuntimeException) 454 { 455 pLayerManager = 0; 456 mxLayerManager = 0; 457 pLayer = 0; 458 } 459 460 void SAL_CALL SdLayer::addEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException) 461 { 462 DBG_ERROR("not implemented!"); 463 } 464 465 void SAL_CALL SdLayer::removeEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException) 466 { 467 DBG_ERROR("not implemented!"); 468 } 469 470 471 //============================================================================= 472 // class SdLayerManager 473 //============================================================================= 474 475 /** */ 476 SdLayerManager::SdLayerManager( SdXImpressDocument& rMyModel ) throw() 477 :mpModel( &rMyModel) 478 { 479 mpLayers = new SvUnoWeakContainer; 480 } 481 482 /** */ 483 SdLayerManager::~SdLayerManager() throw() 484 { 485 dispose(); 486 } 487 488 // uno helper 489 UNO3_GETIMPLEMENTATION_IMPL( SdLayerManager ); 490 491 // XComponent 492 void SAL_CALL SdLayerManager::dispose( ) throw (uno::RuntimeException) 493 { 494 mpModel = 0; 495 if( mpLayers ) 496 { 497 mpLayers->dispose(); 498 499 delete mpLayers; 500 mpLayers = 0; 501 } 502 } 503 504 void SAL_CALL SdLayerManager::addEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException) 505 { 506 DBG_ERROR("not implemented!"); 507 } 508 509 void SAL_CALL SdLayerManager::removeEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException) 510 { 511 DBG_ERROR("not implemented!"); 512 } 513 514 // XServiceInfo 515 OUString SAL_CALL SdLayerManager::getImplementationName() 516 throw(uno::RuntimeException) 517 { 518 return OUString( OUString::createFromAscii(sUNO_SdLayerManager) ); 519 } 520 521 sal_Bool SAL_CALL SdLayerManager::supportsService( const OUString& ServiceName ) 522 throw(uno::RuntimeException) 523 { 524 return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() ); 525 } 526 527 uno::Sequence< OUString > SAL_CALL SdLayerManager::getSupportedServiceNames() 528 throw(uno::RuntimeException) 529 { 530 OUString aServiceName( OUString::createFromAscii(sUNO_Service_DrawingLayerManager) ); 531 uno::Sequence< OUString > aSeq( &aServiceName, 1 ); 532 return aSeq; 533 } 534 535 // XLayerManager 536 uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::insertNewByIndex( sal_Int32 nIndex ) 537 throw(uno::RuntimeException) 538 { 539 OGuard aGuard( Application::GetSolarMutex() ); 540 541 if( mpModel == 0 ) 542 throw lang::DisposedException(); 543 544 uno::Reference< drawing::XLayer > xLayer; 545 546 if( mpModel->mpDoc ) 547 { 548 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 549 sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount(); 550 sal_uInt16 nLayer = nLayerCnt - 2 + 1; 551 String aLayerName; 552 553 // Ueberpruefung auf schon vorhandene Namen 554 while( aLayerName.Len()==0 || rLayerAdmin.GetLayer( aLayerName, sal_False) ) 555 { 556 aLayerName = String(SdResId(STR_LAYER)); 557 aLayerName += String::CreateFromInt32( (sal_Int32)nLayer ); 558 nLayer++; 559 } 560 561 SdrLayerAdmin& rLA=mpModel->mpDoc->GetLayerAdmin(); 562 const sal_Int32 nMax=rLA.GetLayerCount(); 563 if (nIndex>nMax) nIndex=nMax; 564 xLayer = GetLayer (rLA.NewLayer(aLayerName,(sal_uInt16)nIndex)); 565 mpModel->SetModified(); 566 } 567 return xLayer; 568 } 569 570 void SAL_CALL SdLayerManager::remove( const uno::Reference< drawing::XLayer >& xLayer ) 571 throw(container::NoSuchElementException, uno::RuntimeException) 572 { 573 OGuard aGuard( Application::GetSolarMutex() ); 574 575 if( mpModel == 0 ) 576 throw lang::DisposedException(); 577 578 SdLayer* pSdLayer = SdLayer::getImplementation(xLayer); 579 580 if(pSdLayer && GetView()) 581 { 582 const SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer(); 583 GetView()->DeleteLayer( pSdrLayer->GetName() ); 584 585 UpdateLayerView(); 586 } 587 588 mpModel->SetModified(); 589 } 590 591 void SAL_CALL SdLayerManager::attachShapeToLayer( const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XLayer >& xLayer ) 592 throw(uno::RuntimeException) 593 { 594 OGuard aGuard( Application::GetSolarMutex() ); 595 596 if( mpModel == 0 ) 597 throw lang::DisposedException(); 598 599 SdLayer* pSdLayer = SdLayer::getImplementation(xLayer); 600 SdrLayer* pSdrLayer = pSdLayer?pSdLayer->GetSdrLayer():NULL; 601 if(pSdrLayer==NULL) 602 return; 603 604 SvxShape* pShape = SvxShape::getImplementation( xShape ); 605 SdrObject* pSdrObject = pShape?pShape->GetSdrObject():NULL; 606 607 if(pSdrObject && pSdrLayer ) 608 pSdrObject->SetLayer(pSdrLayer->GetID()); 609 610 mpModel->SetModified(); 611 } 612 613 uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::getLayerForShape( const uno::Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException) 614 { 615 OGuard aGuard( Application::GetSolarMutex() ); 616 617 if( mpModel == 0 ) 618 throw lang::DisposedException(); 619 620 uno::Reference< drawing::XLayer > xLayer; 621 622 if(mpModel->mpDoc) 623 { 624 SvxShape* pShape = SvxShape::getImplementation( xShape ); 625 SdrObject* pObj = pShape?pShape->GetSdrObject():NULL; 626 if(pObj) 627 { 628 SdrLayerID aId = pObj->GetLayer(); 629 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 630 xLayer = GetLayer (rLayerAdmin.GetLayerPerID(aId)); 631 } 632 } 633 return xLayer; 634 } 635 636 // XIndexAccess 637 sal_Int32 SAL_CALL SdLayerManager::getCount() 638 throw(uno::RuntimeException) 639 { 640 OGuard aGuard( Application::GetSolarMutex() ); 641 642 if( mpModel == 0 ) 643 throw lang::DisposedException(); 644 645 if( mpModel->mpDoc ) 646 { 647 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 648 return rLayerAdmin.GetLayerCount(); 649 } 650 651 return 0; 652 } 653 654 uno::Any SAL_CALL SdLayerManager::getByIndex( sal_Int32 nLayer ) 655 throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException) 656 { 657 OGuard aGuard( Application::GetSolarMutex() ); 658 659 if( mpModel == 0 ) 660 throw lang::DisposedException(); 661 662 if( nLayer >= getCount() || nLayer < 0 ) 663 throw lang::IndexOutOfBoundsException(); 664 665 uno::Any aAny; 666 667 if( mpModel->mpDoc ) 668 { 669 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 670 uno::Reference<drawing::XLayer> xLayer (GetLayer (rLayerAdmin.GetLayer((sal_uInt16)nLayer))); 671 aAny <<= xLayer; 672 } 673 return aAny; 674 } 675 676 677 // XNameAccess 678 uno::Any SAL_CALL SdLayerManager::getByName( const OUString& aName ) 679 throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) 680 { 681 OGuard aGuard( Application::GetSolarMutex() ); 682 683 if( (mpModel == 0) || (mpModel->mpDoc == 0 ) ) 684 throw lang::DisposedException(); 685 686 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 687 SdrLayer* pLayer = rLayerAdmin.GetLayer( SdLayer::convertToInternalName( aName ), sal_False ); 688 if( pLayer == NULL ) 689 throw container::NoSuchElementException(); 690 691 return uno::Any( GetLayer (pLayer) ); 692 } 693 694 uno::Sequence< OUString > SAL_CALL SdLayerManager::getElementNames() 695 throw(uno::RuntimeException) 696 { 697 OGuard aGuard( Application::GetSolarMutex() ); 698 699 if( mpModel == 0 ) 700 throw lang::DisposedException(); 701 702 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 703 const sal_uInt16 nLayerCount = rLayerAdmin.GetLayerCount(); 704 705 uno::Sequence< OUString > aSeq( nLayerCount ); 706 707 OUString* pStrings = aSeq.getArray(); 708 SdrLayer* pLayer; 709 710 for( sal_uInt16 nLayer = 0; nLayer < nLayerCount; nLayer++ ) 711 { 712 pLayer = rLayerAdmin.GetLayer( nLayer ); 713 if( pLayer ) 714 *pStrings++ = SdLayer::convertToExternalName( pLayer->GetName() ); 715 } 716 717 return aSeq; 718 } 719 720 sal_Bool SAL_CALL SdLayerManager::hasByName( const OUString& aName ) throw(uno::RuntimeException) 721 { 722 OGuard aGuard( Application::GetSolarMutex() ); 723 724 if( mpModel == 0 ) 725 throw lang::DisposedException(); 726 727 SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin(); 728 729 return NULL != rLayerAdmin.GetLayer( SdLayer::convertToInternalName( aName ), sal_False ); 730 } 731 732 // XElementAccess 733 uno::Type SAL_CALL SdLayerManager::getElementType() 734 throw(uno::RuntimeException) 735 { 736 return ITYPE( drawing::XLayer ); 737 } 738 739 sal_Bool SAL_CALL SdLayerManager::hasElements() throw(uno::RuntimeException) 740 { 741 return getCount() > 0; 742 } 743 744 /** Falls an den Layern was geaendert wurde sorgt diese Methode dafuer, das 745 die Aenderungen auch in der sdbcx::View sichtbar gemacht werden */ 746 void SdLayerManager::UpdateLayerView( sal_Bool modify ) const throw() 747 { 748 if(mpModel->mpDocShell) 749 { 750 ::sd::DrawViewShell* pDrViewSh = 751 PTR_CAST(::sd::DrawViewShell, mpModel->mpDocShell->GetViewShell()); 752 753 if(pDrViewSh) 754 { 755 sal_Bool bLayerMode = pDrViewSh->IsLayerModeActive(); 756 pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), !bLayerMode); 757 pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), bLayerMode); 758 } 759 760 if(modify) 761 mpModel->mpDoc->SetChanged(sal_True); 762 } 763 } 764 765 /** */ 766 ::sd::View* SdLayerManager::GetView() const throw() 767 { 768 if( mpModel->mpDocShell ) 769 { 770 ::sd::ViewShell* pViewSh = mpModel->mpDocShell->GetViewShell(); 771 if(pViewSh) 772 return pViewSh->GetView(); 773 } 774 return NULL; 775 } 776 777 778 779 namespace 780 { 781 /** Compare two pointers to <type>SdrLayer</type> objects. 782 @param xRef 783 The implementing SdLayer class provides the first pointer by the 784 <member>SdLayer::GetSdrLayer</member> method. 785 @param pSearchData 786 This void pointer is the second pointer to an <type>SdrLayer</type> 787 object. 788 @return 789 Return </True> if both pointers point to the same object. 790 */ 791 sal_Bool compare_layers (uno::WeakReference<uno::XInterface> xRef, void* pSearchData) 792 { 793 uno::Reference<uno::XInterface> xLayer (xRef); 794 if (xLayer.is()) 795 { 796 SdLayer* pSdLayer = SdLayer::getImplementation (xRef); 797 if (pSdLayer != NULL) 798 { 799 SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer (); 800 if (pSdrLayer == static_cast<SdrLayer*>(pSearchData)) 801 return sal_True; 802 } 803 } 804 return sal_False; 805 } 806 } 807 808 /** Use the <member>mpLayers</member> container of weak references to either 809 retrieve and return a previously created <type>XLayer</type> object for 810 the given <type>SdrLayer</type> object or create and remember a new one. 811 */ 812 uno::Reference<drawing::XLayer> SdLayerManager::GetLayer (SdrLayer* pLayer) 813 { 814 uno::WeakReference<uno::XInterface> xRef; 815 uno::Reference<drawing::XLayer> xLayer; 816 817 // Search existing xLayer for the given pLayer. 818 if (mpLayers->findRef (xRef, (void*)pLayer, compare_layers)) 819 xLayer = uno::Reference<drawing::XLayer> (xRef, uno::UNO_QUERY); 820 821 // Create the xLayer if necessary. 822 if ( ! xLayer.is()) 823 { 824 xLayer = new SdLayer (this, pLayer); 825 826 // Remember the new xLayer for future calls. 827 uno::WeakReference<uno::XInterface> wRef(xLayer); 828 mpLayers->insert(wRef); 829 } 830 831 return xLayer; 832 } 833