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 //____________________________________________________________________________________________________________ 25 // my own include 26 //____________________________________________________________________________________________________________ 27 28 #include "basecontrol.hxx" 29 30 //____________________________________________________________________________________________________________ 31 // includes of other projects 32 //____________________________________________________________________________________________________________ 33 #include <com/sun/star/awt/XDevice.hpp> 34 #include <com/sun/star/awt/XDisplayBitmap.hpp> 35 #include <com/sun/star/awt/DeviceInfo.hpp> 36 #include <com/sun/star/awt/WindowAttribute.hpp> 37 #include <com/sun/star/awt/PosSize.hpp> 38 #include <cppuhelper/typeprovider.hxx> 39 40 //____________________________________________________________________________________________________________ 41 // includes of my own project 42 //____________________________________________________________________________________________________________ 43 44 //____________________________________________________________________________________________________________ 45 // namespaces 46 //____________________________________________________________________________________________________________ 47 48 using namespace ::cppu ; 49 using namespace ::osl ; 50 using namespace ::rtl ; 51 using namespace ::com::sun::star::uno ; 52 using namespace ::com::sun::star::lang ; 53 using namespace ::com::sun::star::awt ; 54 55 namespace unocontrols{ 56 57 //____________________________________________________________________________________________________________ 58 // defines 59 //____________________________________________________________________________________________________________ 60 61 #define DEFAULT_PMULTIPLEXER NULL 62 #define DEFAULT_X 0 63 #define DEFAULT_Y 0 64 #define DEFAULT_WIDTH 100 65 #define DEFAULT_HEIGHT 100 66 #define DEFAULT_VISIBLE sal_False 67 #define DEFAULT_INDESIGNMODE sal_False 68 #define DEFAULT_ENABLE sal_True 69 #define SERVICE_VCLTOOLKIT "com.sun.star.awt.Toolkit" 70 71 //____________________________________________________________________________________________________________ 72 // construct/destruct 73 //____________________________________________________________________________________________________________ 74 75 BaseControl::BaseControl( const Reference< XMultiServiceFactory >& xFactory ) 76 : IMPL_MutexContainer ( ) 77 , OComponentHelper ( m_aMutex ) 78 , m_xFactory ( xFactory ) 79 , m_pMultiplexer ( DEFAULT_PMULTIPLEXER ) 80 , m_nX ( DEFAULT_X ) 81 , m_nY ( DEFAULT_Y ) 82 , m_nWidth ( DEFAULT_WIDTH ) 83 , m_nHeight ( DEFAULT_HEIGHT ) 84 , m_bVisible ( DEFAULT_VISIBLE ) 85 , m_bInDesignMode ( DEFAULT_INDESIGNMODE ) 86 , m_bEnable ( DEFAULT_ENABLE ) 87 { 88 } 89 90 BaseControl::~BaseControl() 91 { 92 } 93 94 //____________________________________________________________________________________________________________ 95 // XInterface 96 //____________________________________________________________________________________________________________ 97 98 Any SAL_CALL BaseControl::queryInterface( const Type& rType ) throw( RuntimeException ) 99 { 100 Any aReturn ; 101 if ( m_xDelegator.is() == sal_True ) 102 { 103 // If an delegator exist, forward question to his queryInterface. 104 // Delegator will ask his own queryAggregation! 105 aReturn = m_xDelegator->queryInterface( rType ); 106 } 107 else 108 { 109 // If an delegator unknown, forward question to own queryAggregation. 110 aReturn = queryAggregation( rType ); 111 } 112 113 return aReturn ; 114 } 115 116 //____________________________________________________________________________________________________________ 117 // XInterface 118 //____________________________________________________________________________________________________________ 119 120 void SAL_CALL BaseControl::acquire() throw() 121 { 122 // Attention: 123 // Don't use mutex or guard in this method!!! Is a method of XInterface. 124 125 // Forward to baseclass 126 OComponentHelper::acquire(); 127 } 128 129 //____________________________________________________________________________________________________________ 130 // XInterface 131 //____________________________________________________________________________________________________________ 132 133 void SAL_CALL BaseControl::release() throw() 134 { 135 // Attention: 136 // Don't use mutex or guard in this method!!! Is a method of XInterface. 137 138 // Forward to baseclass 139 OComponentHelper::release(); 140 } 141 142 //____________________________________________________________________________________________________________ 143 // XTypeProvider 144 //____________________________________________________________________________________________________________ 145 146 Sequence< Type > SAL_CALL BaseControl::getTypes() throw( RuntimeException ) 147 { 148 // Optimize this method ! 149 // We initialize a static variable only one time. And we don't must use a mutex at every call! 150 // For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL! 151 static OTypeCollection* pTypeCollection = NULL ; 152 153 if ( pTypeCollection == NULL ) 154 { 155 // Ready for multithreading; get global mutex for first call of this method only! see before 156 MutexGuard aGuard( Mutex::getGlobalMutex() ); 157 158 // Control these pointer again ... it can be, that another instance will be faster then these! 159 if ( pTypeCollection == NULL ) 160 { 161 // Create a static typecollection ... 162 static OTypeCollection aTypeCollection ( ::getCppuType(( const Reference< XPaintListener >*)NULL ) , 163 ::getCppuType(( const Reference< XWindowListener>*)NULL ) , 164 ::getCppuType(( const Reference< XView >*)NULL ) , 165 ::getCppuType(( const Reference< XWindow >*)NULL ) , 166 ::getCppuType(( const Reference< XServiceInfo >*)NULL ) , 167 ::getCppuType(( const Reference< XControl >*)NULL ) , 168 OComponentHelper::getTypes() 169 ); 170 171 // ... and set his address to static pointer! 172 pTypeCollection = &aTypeCollection ; 173 } 174 } 175 176 return pTypeCollection->getTypes(); 177 } 178 179 //____________________________________________________________________________________________________________ 180 // XTypeProvider 181 //____________________________________________________________________________________________________________ 182 183 Sequence< sal_Int8 > SAL_CALL BaseControl::getImplementationId() throw( RuntimeException ) 184 { 185 // Create one Id for all instances of this class. 186 // Use ethernet address to do this! (sal_True) 187 188 // Optimize this method 189 // We initialize a static variable only one time. And we don't must use a mutex at every call! 190 // For the first call; pID is NULL - for the second call pID is different from NULL! 191 static OImplementationId* pID = NULL ; 192 193 if ( pID == NULL ) 194 { 195 // Ready for multithreading; get global mutex for first call of this method only! see before 196 MutexGuard aGuard( Mutex::getGlobalMutex() ); 197 198 // Control these pointer again ... it can be, that another instance will be faster then these! 199 if ( pID == NULL ) 200 { 201 // Create a new static ID ... 202 static OImplementationId aID( sal_False ); 203 // ... and set his address to static pointer! 204 pID = &aID ; 205 } 206 } 207 208 return pID->getImplementationId(); 209 } 210 211 //____________________________________________________________________________________________________________ 212 // XAggregation 213 //____________________________________________________________________________________________________________ 214 215 void SAL_CALL BaseControl::setDelegator( const Reference< XInterface >& xDel ) throw( RuntimeException ) 216 { 217 // Ready for multithreading 218 MutexGuard aGuard( m_aMutex ); 219 m_xDelegator = xDel; 220 } 221 222 //____________________________________________________________________________________________________________ 223 // XAggregation 224 //____________________________________________________________________________________________________________ 225 226 Any SAL_CALL BaseControl::queryAggregation( const Type& aType ) throw( RuntimeException ) 227 { 228 // Ask for my own supported interfaces ... 229 // Attention: XTypeProvider and XInterface are supported by OComponentHelper! 230 Any aReturn ( ::cppu::queryInterface( aType , 231 static_cast< XPaintListener*> ( this ) , 232 static_cast< XWindowListener*> ( this ) , 233 static_cast< XView* > ( this ) , 234 static_cast< XWindow* > ( this ) , 235 static_cast< XServiceInfo* > ( this ) , 236 static_cast< XControl* > ( this ) 237 ) 238 ); 239 240 // If searched interface supported by this class ... 241 if ( aReturn.hasValue() == sal_True ) 242 { 243 // ... return this information. 244 return aReturn ; 245 } 246 else 247 { 248 // Else; ... ask baseclass for interfaces! 249 return OComponentHelper::queryAggregation( aType ); 250 } 251 } 252 253 //____________________________________________________________________________________________________________ 254 // XServiceInfo 255 //____________________________________________________________________________________________________________ 256 257 OUString SAL_CALL BaseControl::getImplementationName() throw( RuntimeException ) 258 { 259 return impl_getStaticImplementationName(); 260 } 261 262 //____________________________________________________________________________________________________________ 263 // XServiceInfo 264 //____________________________________________________________________________________________________________ 265 266 sal_Bool SAL_CALL BaseControl::supportsService( const OUString& sServiceName ) throw( RuntimeException ) 267 { 268 Sequence< OUString > seqServiceNames = getSupportedServiceNames(); 269 const OUString* pArray = seqServiceNames.getConstArray(); 270 for ( sal_Int32 nCounter=0; nCounter<seqServiceNames.getLength(); nCounter++ ) 271 { 272 if ( pArray[nCounter] == sServiceName ) 273 { 274 return sal_True ; 275 } 276 } 277 return sal_False ; 278 } 279 280 //____________________________________________________________________________________________________________ 281 // XServiceInfo 282 //____________________________________________________________________________________________________________ 283 284 Sequence< OUString > SAL_CALL BaseControl::getSupportedServiceNames() throw( RuntimeException ) 285 { 286 return impl_getStaticSupportedServiceNames(); 287 } 288 289 //____________________________________________________________________________________________________________ 290 // XComponent 291 //____________________________________________________________________________________________________________ 292 293 void SAL_CALL BaseControl::dispose() throw( RuntimeException ) 294 { 295 // Ready for multithreading 296 MutexGuard aGuard( m_aMutex ); 297 298 if ( m_pMultiplexer != NULL ) 299 { 300 // to all other paint, focus, etc. 301 m_pMultiplexer->disposeAndClear(); 302 } 303 304 // set the service manager to disposed 305 OComponentHelper::dispose(); 306 307 // release context and peer 308 m_xContext = Reference< XInterface >(); 309 impl_releasePeer(); 310 311 // release view 312 if ( m_xGraphicsView.is() == sal_True ) 313 { 314 m_xGraphicsView = Reference< XGraphics >(); 315 } 316 } 317 318 //____________________________________________________________________________________________________________ 319 // XComponent 320 //____________________________________________________________________________________________________________ 321 322 void SAL_CALL BaseControl::addEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException ) 323 { 324 // Ready for multithreading 325 MutexGuard aGuard( m_aMutex ); 326 OComponentHelper::addEventListener( xListener ); 327 } 328 329 //____________________________________________________________________________________________________________ 330 // XComponent 331 //____________________________________________________________________________________________________________ 332 333 void SAL_CALL BaseControl::removeEventListener( const Reference< XEventListener >& xListener ) throw( RuntimeException ) 334 { 335 // Ready for multithreading 336 MutexGuard aGuard( m_aMutex ); 337 OComponentHelper::removeEventListener( xListener ); 338 } 339 340 //____________________________________________________________________________________________________________ 341 // XControl 342 //____________________________________________________________________________________________________________ 343 344 void SAL_CALL BaseControl::createPeer( const Reference< XToolkit >& xToolkit , 345 const Reference< XWindowPeer >& xParentPeer ) throw( RuntimeException ) 346 { 347 // Ready for multithreading 348 MutexGuard aGuard( m_aMutex ); 349 350 if ( m_xPeer.is() == sal_False ) 351 { 352 // use method "BaseControl::getWindowDescriptor()" fot change window attributes !!! 353 WindowDescriptor* pDescriptor = impl_getWindowDescriptor( xParentPeer ); 354 355 if ( m_bVisible == sal_True ) 356 { 357 pDescriptor->WindowAttributes |= WindowAttribute::SHOW ; 358 } 359 360 // very slow under remote conditions! 361 // create the window on the server 362 Reference< XToolkit > xLocalToolkit = xToolkit ; 363 if ( xLocalToolkit.is() == sal_False ) 364 { 365 // but first create wellknown toolkit, if it not exist 366 xLocalToolkit = Reference< XToolkit > ( m_xFactory->createInstance( OUString::createFromAscii( SERVICE_VCLTOOLKIT ) ), UNO_QUERY ); 367 } 368 m_xPeer = xLocalToolkit->createWindow( *pDescriptor ); 369 m_xPeerWindow = Reference< XWindow >( m_xPeer, UNO_QUERY ); 370 371 // don't forget to release the memory! 372 delete pDescriptor ; 373 374 if ( m_xPeerWindow.is() == sal_True ) 375 { 376 if ( m_pMultiplexer != NULL ) 377 { 378 m_pMultiplexer->setPeer( m_xPeerWindow ); 379 } 380 381 // create new referenz to xgraphics for painting on a peer 382 // and add a paint listener 383 Reference< XDevice > xDevice( m_xPeerWindow, UNO_QUERY ); 384 385 if ( xDevice.is() == sal_True ) 386 { 387 m_xGraphicsPeer = xDevice->createGraphics(); 388 } 389 390 if ( m_xGraphicsPeer.is() == sal_True ) 391 { 392 addPaintListener( this ); 393 addWindowListener( this ); 394 } 395 396 // PosSize_POSSIZE defined in <stardiv/uno/awt/window.hxx> 397 m_xPeerWindow->setPosSize( m_nX, m_nY, m_nWidth, m_nHeight, PosSize::POSSIZE ); 398 m_xPeerWindow->setEnable( m_bEnable ); 399 m_xPeerWindow->setVisible( m_bVisible && !m_bInDesignMode ); 400 } 401 } 402 } 403 404 //____________________________________________________________________________________________________________ 405 // XControl 406 //____________________________________________________________________________________________________________ 407 408 void SAL_CALL BaseControl::setContext( const Reference< XInterface >& xContext ) throw( RuntimeException ) 409 { 410 // Ready for multithreading 411 MutexGuard aGuard( m_aMutex ); 412 m_xContext = xContext ; 413 } 414 415 //____________________________________________________________________________________________________________ 416 // XControl 417 //____________________________________________________________________________________________________________ 418 419 void SAL_CALL BaseControl::setDesignMode( sal_Bool bOn ) throw( RuntimeException ) 420 { 421 // Ready for multithreading 422 MutexGuard aGuard( m_aMutex ); 423 m_bInDesignMode = bOn ; 424 } 425 426 //____________________________________________________________________________________________________________ 427 // XControl 428 //____________________________________________________________________________________________________________ 429 430 Reference< XInterface > SAL_CALL BaseControl::getContext() throw( RuntimeException ) 431 { 432 // Ready for multithreading 433 MutexGuard aGuard( m_aMutex ); 434 return m_xContext ; 435 } 436 437 //____________________________________________________________________________________________________________ 438 // XControl 439 //____________________________________________________________________________________________________________ 440 441 Reference< XWindowPeer > SAL_CALL BaseControl::getPeer() throw( RuntimeException ) 442 { 443 // Ready for multithreading 444 MutexGuard aGuard( m_aMutex ); 445 return m_xPeer ; 446 } 447 448 //____________________________________________________________________________________________________________ 449 // XControl 450 //____________________________________________________________________________________________________________ 451 452 Reference< XView > SAL_CALL BaseControl::getView() throw( RuntimeException ) 453 { 454 // Ready for multithreading 455 MutexGuard aGuard( m_aMutex ); 456 return Reference< XView >( (OWeakObject*)this, UNO_QUERY ); 457 } 458 459 //____________________________________________________________________________________________________________ 460 // XControl 461 //____________________________________________________________________________________________________________ 462 463 sal_Bool SAL_CALL BaseControl::isDesignMode() throw( RuntimeException ) 464 { 465 // Ready for multithreading 466 MutexGuard aGuard( m_aMutex ); 467 return m_bInDesignMode ; 468 } 469 470 //____________________________________________________________________________________________________________ 471 // XControl 472 //____________________________________________________________________________________________________________ 473 474 sal_Bool SAL_CALL BaseControl::isTransparent() throw( RuntimeException ) 475 { 476 return sal_False ; 477 } 478 479 //____________________________________________________________________________________________________________ 480 // XWindow 481 //____________________________________________________________________________________________________________ 482 483 void SAL_CALL BaseControl::setPosSize( sal_Int32 nX , 484 sal_Int32 nY , 485 sal_Int32 nWidth , 486 sal_Int32 nHeight , 487 sal_Int16 nFlags ) throw( RuntimeException ) 488 { 489 // - change size and position of window and save the values 490 // - "nFlags" declared in <stardiv/uno/awt/window.hxx> ("#define PosSize_X .....") 491 492 // Ready for multithreading 493 MutexGuard aGuard( m_aMutex ); 494 495 sal_Bool bChanged = sal_False ; 496 497 if ( nFlags & PosSize::X ) 498 { 499 bChanged |= m_nX != nX, m_nX = nX ; 500 } 501 502 if ( nFlags & PosSize::Y ) 503 { 504 bChanged |= m_nY != nY, m_nY = nY ; 505 } 506 507 if ( nFlags & PosSize::WIDTH ) 508 { 509 bChanged |= m_nWidth != nWidth, m_nWidth = nWidth ; 510 } 511 512 if ( nFlags & PosSize::HEIGHT ) 513 { 514 bChanged |= m_nHeight != nHeight, m_nHeight = nHeight ; 515 } 516 517 if ( bChanged && m_xPeerWindow.is() ) 518 { 519 m_xPeerWindow->setPosSize( m_nX, m_nY, m_nWidth, m_nHeight, nFlags ); 520 } 521 } 522 523 //____________________________________________________________________________________________________________ 524 // XWindow 525 //____________________________________________________________________________________________________________ 526 527 void SAL_CALL BaseControl::setVisible( sal_Bool bVisible ) throw( RuntimeException ) 528 { 529 // Ready for multithreading 530 MutexGuard aGuard( m_aMutex ); 531 532 // Set new state of flag 533 m_bVisible = bVisible ; 534 535 if ( m_xPeerWindow.is() == sal_True ) 536 { 537 // Set it also on peerwindow 538 m_xPeerWindow->setVisible( m_bVisible ); 539 } 540 } 541 542 //____________________________________________________________________________________________________________ 543 // XWindow 544 //____________________________________________________________________________________________________________ 545 546 void SAL_CALL BaseControl::setEnable( sal_Bool bEnable ) throw( RuntimeException ) 547 { 548 // Ready for multithreading 549 MutexGuard aGuard( m_aMutex ); 550 551 // Set new state of flag 552 m_bEnable = bEnable ; 553 554 if ( m_xPeerWindow.is() == sal_True ) 555 { 556 // Set it also on peerwindow 557 m_xPeerWindow->setEnable( m_bEnable ); 558 } 559 } 560 561 //____________________________________________________________________________________________________________ 562 // XWindow 563 //____________________________________________________________________________________________________________ 564 565 void SAL_CALL BaseControl::setFocus() throw( RuntimeException ) 566 { 567 // Ready for multithreading 568 MutexGuard aGuard( m_aMutex ); 569 570 if ( m_xPeerWindow.is() == sal_True ) 571 { 572 m_xPeerWindow->setFocus(); 573 } 574 } 575 576 //____________________________________________________________________________________________________________ 577 // XWindow 578 //____________________________________________________________________________________________________________ 579 580 Rectangle SAL_CALL BaseControl::getPosSize() throw( RuntimeException ) 581 { 582 // Ready for multithreading 583 MutexGuard aGuard( m_aMutex ); 584 return Rectangle( m_nX, m_nY , m_nWidth, m_nHeight ); 585 } 586 587 //____________________________________________________________________________________________________________ 588 // XWindow 589 //____________________________________________________________________________________________________________ 590 591 void SAL_CALL BaseControl::addWindowListener( const Reference< XWindowListener >& xListener ) throw( RuntimeException ) 592 { 593 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XWindowListener >*)0), xListener ); 594 } 595 596 //____________________________________________________________________________________________________________ 597 // XWindow 598 //____________________________________________________________________________________________________________ 599 600 void SAL_CALL BaseControl::addFocusListener( const Reference< XFocusListener >& xListener ) throw( RuntimeException ) 601 { 602 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XFocusListener >*)0), xListener ); 603 } 604 605 //____________________________________________________________________________________________________________ 606 // XWindow 607 //____________________________________________________________________________________________________________ 608 609 void SAL_CALL BaseControl::addKeyListener( const Reference< XKeyListener >& xListener ) throw( RuntimeException ) 610 { 611 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XKeyListener >*)0), xListener ); 612 } 613 614 //____________________________________________________________________________________________________________ 615 // XWindow 616 //____________________________________________________________________________________________________________ 617 618 void SAL_CALL BaseControl::addMouseListener( const Reference< XMouseListener >& xListener ) throw( RuntimeException ) 619 { 620 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XMouseListener >*)0), xListener ); 621 } 622 623 //____________________________________________________________________________________________________________ 624 // XWindow 625 //____________________________________________________________________________________________________________ 626 627 void SAL_CALL BaseControl::addMouseMotionListener( const Reference< XMouseMotionListener >& xListener ) throw( RuntimeException ) 628 { 629 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XMouseMotionListener >*)0), xListener ); 630 } 631 632 //____________________________________________________________________________________________________________ 633 // XWindow 634 //____________________________________________________________________________________________________________ 635 636 void SAL_CALL BaseControl::addPaintListener( const Reference< XPaintListener >& xListener ) throw( RuntimeException ) 637 { 638 impl_getMultiplexer()->advise( ::getCppuType(( const Reference< XPaintListener >*)0), xListener ); 639 } 640 641 //____________________________________________________________________________________________________________ 642 // XWindow 643 //____________________________________________________________________________________________________________ 644 645 void SAL_CALL BaseControl::removeWindowListener( const Reference< XWindowListener >& xListener ) throw( RuntimeException ) 646 { 647 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XWindowListener >*)0), xListener ); 648 } 649 650 //____________________________________________________________________________________________________________ 651 // XWindow 652 //____________________________________________________________________________________________________________ 653 654 void SAL_CALL BaseControl::removeFocusListener( const Reference< XFocusListener >& xListener ) throw( RuntimeException ) 655 { 656 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XFocusListener >*)0), xListener ); 657 } 658 659 //____________________________________________________________________________________________________________ 660 // XWindow 661 //____________________________________________________________________________________________________________ 662 663 void SAL_CALL BaseControl::removeKeyListener( const Reference< XKeyListener >& xListener ) throw( RuntimeException ) 664 { 665 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XKeyListener >*)0), xListener ); 666 } 667 668 //____________________________________________________________________________________________________________ 669 // XWindow 670 //____________________________________________________________________________________________________________ 671 672 void SAL_CALL BaseControl::removeMouseListener( const Reference< XMouseListener >& xListener ) throw( RuntimeException ) 673 { 674 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XMouseListener >*)0), xListener ); 675 } 676 677 //____________________________________________________________________________________________________________ 678 // XWindow 679 //____________________________________________________________________________________________________________ 680 681 void SAL_CALL BaseControl::removeMouseMotionListener( const Reference< XMouseMotionListener >& xListener ) throw( RuntimeException ) 682 { 683 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XMouseMotionListener >*)0), xListener ); 684 } 685 686 //____________________________________________________________________________________________________________ 687 // XWindow 688 //____________________________________________________________________________________________________________ 689 690 void SAL_CALL BaseControl::removePaintListener( const Reference< XPaintListener >& xListener ) throw( RuntimeException ) 691 { 692 impl_getMultiplexer()->unadvise( ::getCppuType(( const Reference< XPaintListener >*)0), xListener ); 693 } 694 695 //____________________________________________________________________________________________________________ 696 // XView 697 //____________________________________________________________________________________________________________ 698 699 void SAL_CALL BaseControl::draw( sal_Int32 nX , 700 sal_Int32 nY ) throw( RuntimeException ) 701 { 702 // Ready for multithreading 703 MutexGuard aGuard( m_aMutex ); 704 705 // - paint to an view 706 // - use the method "paint()" 707 // - see also "windowPaint()" 708 impl_paint( nX, nY, m_xGraphicsView ); 709 } 710 711 //____________________________________________________________________________________________________________ 712 // XView 713 //____________________________________________________________________________________________________________ 714 715 sal_Bool SAL_CALL BaseControl::setGraphics( const Reference< XGraphics >& xDevice ) throw( RuntimeException ) 716 { 717 // - set the graphics for an view 718 // - in this class exist 2 graphics-member ... one for peer[_xGraphicsPeer] and one for view[_xGraphicsView] 719 // - they are used by "windowPaint() and draw()", forwarded to "paint ()" 720 sal_Bool bReturn = sal_False ; 721 if ( xDevice.is() == sal_True ) 722 { 723 // Ready for multithreading 724 MutexGuard aGuard( m_aMutex ); 725 726 m_xGraphicsView = xDevice ; 727 bReturn = sal_True ; 728 } 729 730 return bReturn ; 731 } 732 733 //____________________________________________________________________________________________________________ 734 // XView 735 //____________________________________________________________________________________________________________ 736 737 void SAL_CALL BaseControl::setZoom( float /*fZoomX*/ , 738 float /*fZoomY*/ ) throw( RuntimeException ) 739 { 740 // Not implemented yet 741 } 742 743 //____________________________________________________________________________________________________________ 744 // XView 745 //____________________________________________________________________________________________________________ 746 747 Reference< XGraphics > SAL_CALL BaseControl::getGraphics() throw( RuntimeException ) 748 { 749 // Ready for multithreading 750 MutexGuard aGuard( m_aMutex ); 751 return m_xGraphicsView ; 752 } 753 754 //____________________________________________________________________________________________________________ 755 // XView 756 //____________________________________________________________________________________________________________ 757 758 Size SAL_CALL BaseControl::getSize() throw( RuntimeException ) 759 { 760 // Ready for multithreading 761 MutexGuard aGuard( m_aMutex ); 762 return Size( m_nWidth, m_nHeight ); 763 } 764 765 //____________________________________________________________________________________________________________ 766 // XEventListener 767 //____________________________________________________________________________________________________________ 768 769 void SAL_CALL BaseControl::disposing( const EventObject& /*aSource*/ ) throw( RuntimeException ) 770 { 771 // Ready for multithreading 772 MutexGuard aGuard( m_aMutex ); 773 774 // - release ALL references 775 // - it must be !!! 776 if ( m_xGraphicsPeer.is() == sal_True ) 777 { 778 removePaintListener( this ); 779 removeWindowListener( this ); 780 m_xGraphicsPeer = Reference< XGraphics >(); 781 } 782 783 if ( m_xGraphicsView.is() == sal_True ) 784 { 785 m_xGraphicsView = Reference< XGraphics >(); 786 } 787 } 788 789 //____________________________________________________________________________________________________________ 790 // XPaintListener 791 //____________________________________________________________________________________________________________ 792 793 void SAL_CALL BaseControl::windowPaint( const PaintEvent& /*aEvent*/ ) throw( RuntimeException ) 794 { 795 // Ready for multithreading 796 MutexGuard aGuard( m_aMutex ); 797 798 // - repaint the peer 799 // - use the method "paint ()" for painting on a peer and a print device !!! 800 // - see also "draw ()" 801 impl_paint( 0, 0, m_xGraphicsPeer ); 802 } 803 804 //____________________________________________________________________________________________________________ 805 // XWindowListener 806 //____________________________________________________________________________________________________________ 807 808 void SAL_CALL BaseControl::windowResized( const WindowEvent& aEvent ) throw( RuntimeException ) 809 { 810 // Ready for multithreading 811 MutexGuard aGuard( m_aMutex ); 812 813 m_nWidth = aEvent.Width ; 814 m_nHeight = aEvent.Height ; 815 WindowEvent aMappedEvent = aEvent; 816 aMappedEvent.X = 0; 817 aMappedEvent.Y = 0; 818 impl_recalcLayout( aMappedEvent ); 819 } 820 821 //____________________________________________________________________________________________________________ 822 // XWindowListener 823 //____________________________________________________________________________________________________________ 824 825 void SAL_CALL BaseControl::windowMoved( const WindowEvent& aEvent ) throw( RuntimeException ) 826 { 827 // Ready for multithreading 828 MutexGuard aGuard( m_aMutex ); 829 830 m_nWidth = aEvent.Width ; 831 m_nHeight = aEvent.Height ; 832 WindowEvent aMappedEvent = aEvent; 833 aMappedEvent.X = 0; 834 aMappedEvent.Y = 0; 835 impl_recalcLayout( aMappedEvent ); 836 } 837 838 //____________________________________________________________________________________________________________ 839 // XWindowListener 840 //____________________________________________________________________________________________________________ 841 842 void SAL_CALL BaseControl::windowShown( const EventObject& /*aEvent*/ ) throw( RuntimeException ) 843 { 844 } 845 846 //____________________________________________________________________________________________________________ 847 // XWindowListener 848 //____________________________________________________________________________________________________________ 849 850 void SAL_CALL BaseControl::windowHidden( const EventObject& /*aEvent*/ ) throw( RuntimeException ) 851 { 852 } 853 854 //____________________________________________________________________________________________________________ 855 // impl but public method to register service in DLL 856 // (In this BASE-implementation not implemented! Overwrite it in derived classes.) 857 //____________________________________________________________________________________________________________ 858 859 const Sequence< OUString > BaseControl::impl_getStaticSupportedServiceNames() 860 { 861 return Sequence< OUString >(); 862 } 863 864 //____________________________________________________________________________________________________________ 865 // impl but public method to register service in DLL 866 // (In this BASE-implementation not implemented! Overwrite it in derived classes.) 867 //____________________________________________________________________________________________________________ 868 869 const OUString BaseControl::impl_getStaticImplementationName() 870 { 871 return OUString(); 872 } 873 874 //____________________________________________________________________________________________________________ 875 // protected method 876 //____________________________________________________________________________________________________________ 877 878 const Reference< XMultiServiceFactory > BaseControl::impl_getMultiServiceFactory() 879 { 880 return m_xFactory ; 881 } 882 883 //____________________________________________________________________________________________________________ 884 // protected method 885 //____________________________________________________________________________________________________________ 886 887 const Reference< XWindow > BaseControl::impl_getPeerWindow() 888 { 889 return m_xPeerWindow ; 890 } 891 892 //____________________________________________________________________________________________________________ 893 // protected method 894 //____________________________________________________________________________________________________________ 895 896 const Reference< XGraphics > BaseControl::impl_getGraphicsPeer() 897 { 898 return m_xGraphicsPeer ; 899 } 900 901 //____________________________________________________________________________________________________________ 902 // protected method 903 //____________________________________________________________________________________________________________ 904 905 const sal_Int32& BaseControl::impl_getWidth() 906 { 907 return m_nWidth ; 908 } 909 910 //____________________________________________________________________________________________________________ 911 // protected method 912 //____________________________________________________________________________________________________________ 913 914 const sal_Int32& BaseControl::impl_getHeight() 915 { 916 return m_nHeight ; 917 } 918 919 //____________________________________________________________________________________________________________ 920 // protected method 921 //____________________________________________________________________________________________________________ 922 923 WindowDescriptor* BaseControl::impl_getWindowDescriptor( const Reference< XWindowPeer >& xParentPeer ) 924 { 925 // - used from "createPeer()" to set the values of an ::com::sun::star::awt::WindowDescriptor !!! 926 // - if you will change the descriptor-values, you must override this virtuell function 927 // - the caller must release the memory for this dynamical descriptor !!! 928 929 WindowDescriptor* pDescriptor = new WindowDescriptor ; 930 931 pDescriptor->Type = WindowClass_SIMPLE ; 932 pDescriptor->WindowServiceName = OUString::createFromAscii( "window" ) ; 933 pDescriptor->ParentIndex = -1 ; 934 pDescriptor->Parent = xParentPeer ; 935 pDescriptor->Bounds = getPosSize () ; 936 pDescriptor->WindowAttributes = 0 ; 937 938 return pDescriptor ; 939 } 940 941 //____________________________________________________________________________________________________________ 942 // protected method 943 //____________________________________________________________________________________________________________ 944 945 void BaseControl::impl_paint( sal_Int32 /*nX*/ , 946 sal_Int32 /*nY*/ , 947 const Reference< XGraphics >& /*xGraphics*/ ) 948 { 949 // - one paint method for peer AND view !!! 950 // (see also => "windowPaint()" and "draw()") 951 // - not used in this implementation, but its not necessary to make it pure virtual !!! 952 } 953 954 //____________________________________________________________________________________________________________ 955 // protected method 956 //____________________________________________________________________________________________________________ 957 958 void BaseControl::impl_recalcLayout( const WindowEvent& /*aEvent*/ ) 959 { 960 // We need as virtual function to support automaticly resizing of derived controls! 961 // But we make it not pure virtual because it's not neccessary for all derived classes! 962 } 963 964 //____________________________________________________________________________________________________________ 965 // protected method 966 //____________________________________________________________________________________________________________ 967 968 Reference< XInterface > BaseControl::impl_getDelegator() 969 { 970 return m_xDelegator ; 971 } 972 973 //____________________________________________________________________________________________________________ 974 // private method 975 //____________________________________________________________________________________________________________ 976 977 void BaseControl::impl_releasePeer() 978 { 979 if ( m_xPeer.is() == sal_True ) 980 { 981 if ( m_xGraphicsPeer.is() == sal_True ) 982 { 983 removePaintListener( this ); 984 removeWindowListener( this ); 985 m_xGraphicsPeer = Reference< XGraphics >(); 986 } 987 988 m_xPeer->dispose(); 989 m_xPeerWindow = Reference< XWindow >(); 990 m_xPeer = Reference< XWindowPeer >(); 991 992 if ( m_pMultiplexer != NULL ) 993 { 994 // take changes on multiplexer 995 m_pMultiplexer->setPeer( Reference< XWindow >() ); 996 } 997 } 998 } 999 1000 //____________________________________________________________________________________________________________ 1001 // private method 1002 //____________________________________________________________________________________________________________ 1003 1004 OMRCListenerMultiplexerHelper* BaseControl::impl_getMultiplexer() 1005 { 1006 if ( m_pMultiplexer == NULL ) 1007 { 1008 m_pMultiplexer = new OMRCListenerMultiplexerHelper( (XWindow*)this, m_xPeerWindow ); 1009 m_xMultiplexer = Reference< XInterface >( (OWeakObject*)m_pMultiplexer, UNO_QUERY ); 1010 } 1011 1012 return m_pMultiplexer ; 1013 } 1014 1015 } // namespace unocontrols 1016