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
BaseControl(const Reference<XMultiServiceFactory> & xFactory)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
~BaseControl()90 BaseControl::~BaseControl()
91 {
92 }
93
94 //____________________________________________________________________________________________________________
95 // XInterface
96 //____________________________________________________________________________________________________________
97
queryInterface(const Type & rType)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
acquire()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
release()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
getTypes()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
getImplementationId()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
setDelegator(const Reference<XInterface> & xDel)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
queryAggregation(const Type & aType)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
getImplementationName()257 OUString SAL_CALL BaseControl::getImplementationName() throw( RuntimeException )
258 {
259 return impl_getStaticImplementationName();
260 }
261
262 //____________________________________________________________________________________________________________
263 // XServiceInfo
264 //____________________________________________________________________________________________________________
265
supportsService(const OUString & sServiceName)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
getSupportedServiceNames()284 Sequence< OUString > SAL_CALL BaseControl::getSupportedServiceNames() throw( RuntimeException )
285 {
286 return impl_getStaticSupportedServiceNames();
287 }
288
289 //____________________________________________________________________________________________________________
290 // XComponent
291 //____________________________________________________________________________________________________________
292
dispose()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
addEventListener(const Reference<XEventListener> & xListener)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
removeEventListener(const Reference<XEventListener> & xListener)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
createPeer(const Reference<XToolkit> & xToolkit,const Reference<XWindowPeer> & xParentPeer)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
setContext(const Reference<XInterface> & xContext)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
setDesignMode(sal_Bool bOn)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
getContext()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
getPeer()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
getView()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
isDesignMode()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
isTransparent()474 sal_Bool SAL_CALL BaseControl::isTransparent() throw( RuntimeException )
475 {
476 return sal_False ;
477 }
478
479 //____________________________________________________________________________________________________________
480 // XWindow
481 //____________________________________________________________________________________________________________
482
setPosSize(sal_Int32 nX,sal_Int32 nY,sal_Int32 nWidth,sal_Int32 nHeight,sal_Int16 nFlags)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
setVisible(sal_Bool bVisible)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
setEnable(sal_Bool bEnable)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
setFocus()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
getPosSize()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
addWindowListener(const Reference<XWindowListener> & xListener)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
addFocusListener(const Reference<XFocusListener> & xListener)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
addKeyListener(const Reference<XKeyListener> & xListener)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
addMouseListener(const Reference<XMouseListener> & xListener)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
addMouseMotionListener(const Reference<XMouseMotionListener> & xListener)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
addPaintListener(const Reference<XPaintListener> & xListener)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
removeWindowListener(const Reference<XWindowListener> & xListener)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
removeFocusListener(const Reference<XFocusListener> & xListener)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
removeKeyListener(const Reference<XKeyListener> & xListener)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
removeMouseListener(const Reference<XMouseListener> & xListener)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
removeMouseMotionListener(const Reference<XMouseMotionListener> & xListener)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
removePaintListener(const Reference<XPaintListener> & xListener)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
draw(sal_Int32 nX,sal_Int32 nY)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
setGraphics(const Reference<XGraphics> & xDevice)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
setZoom(float,float)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
getGraphics()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
getSize()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
disposing(const EventObject &)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
windowPaint(const PaintEvent &)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
windowResized(const WindowEvent & aEvent)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
windowMoved(const WindowEvent & aEvent)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
windowShown(const EventObject &)842 void SAL_CALL BaseControl::windowShown( const EventObject& /*aEvent*/ ) throw( RuntimeException )
843 {
844 }
845
846 //____________________________________________________________________________________________________________
847 // XWindowListener
848 //____________________________________________________________________________________________________________
849
windowHidden(const EventObject &)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
impl_getStaticSupportedServiceNames()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
impl_getStaticImplementationName()869 const OUString BaseControl::impl_getStaticImplementationName()
870 {
871 return OUString();
872 }
873
874 //____________________________________________________________________________________________________________
875 // protected method
876 //____________________________________________________________________________________________________________
877
impl_getMultiServiceFactory()878 const Reference< XMultiServiceFactory > BaseControl::impl_getMultiServiceFactory()
879 {
880 return m_xFactory ;
881 }
882
883 //____________________________________________________________________________________________________________
884 // protected method
885 //____________________________________________________________________________________________________________
886
impl_getPeerWindow()887 const Reference< XWindow > BaseControl::impl_getPeerWindow()
888 {
889 return m_xPeerWindow ;
890 }
891
892 //____________________________________________________________________________________________________________
893 // protected method
894 //____________________________________________________________________________________________________________
895
impl_getGraphicsPeer()896 const Reference< XGraphics > BaseControl::impl_getGraphicsPeer()
897 {
898 return m_xGraphicsPeer ;
899 }
900
901 //____________________________________________________________________________________________________________
902 // protected method
903 //____________________________________________________________________________________________________________
904
impl_getWidth()905 const sal_Int32& BaseControl::impl_getWidth()
906 {
907 return m_nWidth ;
908 }
909
910 //____________________________________________________________________________________________________________
911 // protected method
912 //____________________________________________________________________________________________________________
913
impl_getHeight()914 const sal_Int32& BaseControl::impl_getHeight()
915 {
916 return m_nHeight ;
917 }
918
919 //____________________________________________________________________________________________________________
920 // protected method
921 //____________________________________________________________________________________________________________
922
impl_getWindowDescriptor(const Reference<XWindowPeer> & xParentPeer)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
impl_paint(sal_Int32,sal_Int32,const Reference<XGraphics> &)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
impl_recalcLayout(const WindowEvent &)958 void BaseControl::impl_recalcLayout( const WindowEvent& /*aEvent*/ )
959 {
960 // We need as virtual function to support automatically resizing of derived controls!
961 // But we make it not pure virtual because it's not necessary for all derived classes!
962 }
963
964 //____________________________________________________________________________________________________________
965 // protected method
966 //____________________________________________________________________________________________________________
967
impl_getDelegator()968 Reference< XInterface > BaseControl::impl_getDelegator()
969 {
970 return m_xDelegator ;
971 }
972
973 //____________________________________________________________________________________________________________
974 // private method
975 //____________________________________________________________________________________________________________
976
impl_releasePeer()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
impl_getMultiplexer()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