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