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