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 #include <com/sun/star/awt/SystemPointer.hdl>
25
26 #include "window.hxx"
27 #include "player.hxx"
28
29 using namespace ::com::sun::star;
30
31 namespace avmedia { namespace xine {
32
33 // -----------
34 // - statics -
35 // -----------
36
ImplGetOwnStaticMutex()37 static ::osl::Mutex& ImplGetOwnStaticMutex()
38 {
39 static ::osl::Mutex* pMutex = NULL;
40
41 if( pMutex == NULL )
42 {
43 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
44
45 if( pMutex == NULL )
46 {
47 static ::osl::Mutex aMutex;
48 pMutex = &aMutex;
49 }
50 }
51
52 return *pMutex;
53 }
54
55 // -----------
56 // - WndProc -
57 // -----------
58
59 /*
60 LRESULT CALLBACK MediaPlayerWndProc( HWND hWnd,UINT nMsg, WPARAM nPar1, LPARAM nPar2 )
61 {
62 Window* pWindow = (Window*) ::GetWindowLong( hWnd, 0 );
63 bool bProcessed = true;
64
65 if( pWindow )
66 {
67 switch( nMsg )
68 {
69 case( WM_SETCURSOR ):
70 pWindow->updatePointer();
71 break;
72
73 case( WM_GRAPHNOTIFY ):
74 pWindow->processGraphEvent();
75 break;
76
77 case( WM_MOUSEMOVE ):
78 case( WM_LBUTTONDOWN ):
79 case( WM_MBUTTONDOWN ):
80 case( WM_RBUTTONDOWN ):
81 case( WM_LBUTTONUP ):
82 case( WM_MBUTTONUP ):
83 case( WM_RBUTTONUP ):
84 {
85 awt::MouseEvent aUNOEvt;
86 POINT aWinPoint;
87
88 if( !::GetCursorPos( &aWinPoint ) || !::ScreenToClient( hWnd, &aWinPoint ) )
89 {
90 aWinPoint.x = GET_X_LPARAM( nPar2 );
91 aWinPoint.y = GET_Y_LPARAM( nPar2 );
92 }
93 aUNOEvt.Modifiers = 0;
94 aUNOEvt.Buttons = 0;
95 aUNOEvt.X = aWinPoint.x;
96 aUNOEvt.Y = aWinPoint.y;
97 aUNOEvt.PopupTrigger = false;
98
99 // Modifiers
100 if( nPar1 & MK_SHIFT )
101 aUNOEvt.Modifiers |= awt::KeyModifier::SHIFT;
102
103 if( nPar1 & MK_CONTROL )
104 aUNOEvt.Modifiers |= awt::KeyModifier::MOD1;
105
106 // Buttons
107 if( WM_LBUTTONDOWN == nMsg || WM_LBUTTONUP == nMsg )
108 aUNOEvt.Buttons |= awt::MouseButton::LEFT;
109
110 if( WM_MBUTTONDOWN == nMsg || WM_MBUTTONUP == nMsg )
111 aUNOEvt.Buttons |= awt::MouseButton::MIDDLE;
112
113 if( WM_RBUTTONDOWN == nMsg || WM_RBUTTONUP == nMsg )
114 aUNOEvt.Buttons |= awt::MouseButton::RIGHT;
115
116 // event type
117 if( WM_LBUTTONDOWN == nMsg ||
118 WM_MBUTTONDOWN == nMsg ||
119 WM_RBUTTONDOWN == nMsg )
120 {
121 aUNOEvt.ClickCount = 1;
122 pWindow->fireMousePressedEvent( aUNOEvt );
123 }
124 else if( WM_LBUTTONUP == nMsg ||
125 WM_MBUTTONUP == nMsg ||
126 WM_RBUTTONUP == nMsg )
127 {
128 aUNOEvt.ClickCount = 1;
129 pWindow->fireMouseReleasedEvent( aUNOEvt );
130 }
131 else if( WM_MOUSEMOVE == nMsg )
132 {
133 aUNOEvt.ClickCount = 0;
134 pWindow->fireMouseMovedEvent( aUNOEvt );
135 pWindow->updatePointer();
136 }
137 }
138 break;
139
140 case( WM_SETFOCUS ):
141 {
142 const awt::FocusEvent aUNOEvt;
143 pWindow->fireSetFocusEvent( aUNOEvt );
144 }
145 break;
146
147 default:
148 bProcessed = false;
149 break;
150 }
151 }
152 else
153 bProcessed = false;
154
155 return( bProcessed ? 0 : DefWindowProc( hWnd, nMsg, nPar1, nPar2 ) );
156 }
157 */
158
159 // ---------------
160 // - Window -
161 // ---------------
162
Window(Player & rPlayer)163 Window::Window( Player& rPlayer ) :
164 mrPlayer( rPlayer ),
165 maListeners( maMutex ),
166 meZoomLevel( media::ZoomLevel_NOT_AVAILABLE ),
167 mnPointerType( awt::SystemPointer::ARROW )
168 {
169 ::osl::MutexGuard aGuard( ImplGetOwnStaticMutex() );
170 }
171
172 // ------------------------------------------------------------------------------
173
~Window()174 Window::~Window()
175 {
176 }
177
178 // ------------------------------------------------------------------------------
179
implLayoutVideoWindow()180 void Window::implLayoutVideoWindow()
181 {
182 if( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel )
183 {
184 awt::Size aPrefSize( mrPlayer.getPreferredPlayerWindowSize() );
185 awt::Rectangle aRect = getPosSize();
186 int nW = aRect.Width, nH = aRect.Height;
187 int nVideoW = nW, nVideoH = nH;
188 int nX = 0, nY = 0, nWidth = 0, nHeight = 0;
189 bool bDone = false, bZoom = false;
190
191 if( media::ZoomLevel_ORIGINAL == meZoomLevel )
192 {
193 bZoom = true;
194 }
195 else if( media::ZoomLevel_ZOOM_1_TO_4 == meZoomLevel )
196 {
197 aPrefSize.Width >>= 2;
198 aPrefSize.Height >>= 2;
199 bZoom = true;
200 }
201 else if( media::ZoomLevel_ZOOM_1_TO_2 == meZoomLevel )
202 {
203 aPrefSize.Width >>= 1;
204 aPrefSize.Height >>= 1;
205 bZoom = true;
206 }
207 else if( media::ZoomLevel_ZOOM_2_TO_1 == meZoomLevel )
208 {
209 aPrefSize.Width <<= 1;
210 aPrefSize.Height <<= 1;
211 bZoom = true;
212 }
213 else if( media::ZoomLevel_ZOOM_4_TO_1 == meZoomLevel )
214 {
215 aPrefSize.Width <<= 2;
216 aPrefSize.Height <<= 2;
217 bZoom = true;
218 }
219 else if( media::ZoomLevel_FIT_TO_WINDOW == meZoomLevel )
220 {
221 nWidth = nVideoW;
222 nHeight = nVideoH;
223 bDone = true;
224 }
225
226 if( bZoom )
227 {
228 if( ( aPrefSize.Width <= nVideoW ) && ( aPrefSize.Height <= nVideoH ) )
229 {
230 nX = ( nVideoW - aPrefSize.Width ) >> 1;
231 nY = ( nVideoH - aPrefSize.Height ) >> 1;
232 nWidth = aPrefSize.Width;
233 nHeight = aPrefSize.Height;
234 bDone = true;
235 }
236 }
237
238 if( !bDone )
239 {
240 if( aPrefSize.Width > 0 && aPrefSize.Height > 0 && nVideoW > 0 && nVideoH > 0 )
241 {
242 double fPrefWH = (double) aPrefSize.Width / aPrefSize.Height;
243
244 if( fPrefWH < ( (double) nVideoW / nVideoH ) )
245 nVideoW = (int)( nVideoH * fPrefWH );
246 else
247 nVideoH = (int)( nVideoW / fPrefWH );
248
249 nX = ( nW - nVideoW ) >> 1;
250 nY = ( nH - nVideoH ) >> 1;
251 nWidth = nVideoW;
252 nHeight = nVideoH;
253 }
254 else
255 nX = nY = nWidth = nHeight = 0;
256 }
257
258 /*
259 IVideoWindow* pVideoWindow = const_cast< IVideoWindow* >( mrPlayer.getVideoWindow() );
260
261 if( pVideoWindow )
262 pVideoWindow->SetWindowPosition( nX, nY, nWidth, nHeight );
263 */
264 }
265 }
266
267 // ------------------------------------------------------------------------------
268
create(const uno::Sequence<uno::Any> &)269 bool Window::create( const uno::Sequence< uno::Any >& /*rArguments*/ )
270 {
271 bool bRet = false;
272
273 return bRet;
274 }
275
276 // ------------------------------------------------------------------------------
277
update()278 void SAL_CALL Window::update( )
279 throw (uno::RuntimeException)
280 {
281 }
282
283 // ------------------------------------------------------------------------------
284
setZoomLevel(media::ZoomLevel eZoomLevel)285 sal_Bool SAL_CALL Window::setZoomLevel( media::ZoomLevel eZoomLevel )
286 throw (uno::RuntimeException)
287 {
288 bool bRet = false;
289
290 if( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel &&
291 media::ZoomLevel_NOT_AVAILABLE != eZoomLevel )
292 {
293 if( eZoomLevel != meZoomLevel )
294 {
295 meZoomLevel = eZoomLevel;
296 implLayoutVideoWindow();
297 }
298
299 bRet = true;
300 }
301
302 return bRet;
303 }
304
305 // ------------------------------------------------------------------------------
306
getZoomLevel()307 media::ZoomLevel SAL_CALL Window::getZoomLevel( )
308 throw (uno::RuntimeException)
309 {
310 return meZoomLevel;
311 }
312
313 // ------------------------------------------------------------------------------
314
setPointerType(sal_Int32 nPointerType)315 void SAL_CALL Window::setPointerType( sal_Int32 nPointerType )
316 throw (uno::RuntimeException)
317 {
318 mnPointerType = nPointerType;
319 }
320
321 // ------------------------------------------------------------------------------
322
setPosSize(sal_Int32,sal_Int32,sal_Int32,sal_Int32,sal_Int16)323 void SAL_CALL Window::setPosSize( sal_Int32 /*X*/, sal_Int32 /*Y*/, sal_Int32 /*Width*/, sal_Int32 /*Height*/, sal_Int16 /*Flags*/ )
324 throw (uno::RuntimeException)
325 {
326 implLayoutVideoWindow();
327 }
328
329 // ------------------------------------------------------------------------------
330
getPosSize()331 awt::Rectangle SAL_CALL Window::getPosSize()
332 throw (uno::RuntimeException)
333 {
334 awt::Rectangle aRet;
335
336 return aRet;
337 }
338
339 // ------------------------------------------------------------------------------
340
setVisible(sal_Bool)341 void SAL_CALL Window::setVisible( sal_Bool /* bVisible */ )
342 throw (uno::RuntimeException)
343 {
344 }
345
346 // ------------------------------------------------------------------------------
347
setEnable(sal_Bool)348 void SAL_CALL Window::setEnable( sal_Bool /* bEnable */ )
349 throw (uno::RuntimeException)
350 {
351 }
352
353 // ------------------------------------------------------------------------------
354
setFocus()355 void SAL_CALL Window::setFocus( )
356 throw (uno::RuntimeException)
357 {
358 }
359
360 // ------------------------------------------------------------------------------
361
addWindowListener(const uno::Reference<awt::XWindowListener> & xListener)362 void SAL_CALL Window::addWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
363 throw (uno::RuntimeException)
364 {
365 maListeners.addInterface( getCppuType( &xListener ), xListener );
366 }
367
368 // ------------------------------------------------------------------------------
369
removeWindowListener(const uno::Reference<awt::XWindowListener> & xListener)370 void SAL_CALL Window::removeWindowListener( const uno::Reference< awt::XWindowListener >& xListener )
371 throw (uno::RuntimeException)
372 {
373 maListeners.removeInterface( getCppuType( &xListener ), xListener );
374 }
375
376 // ------------------------------------------------------------------------------
377
addFocusListener(const uno::Reference<awt::XFocusListener> & xListener)378 void SAL_CALL Window::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
379 throw (uno::RuntimeException)
380 {
381 maListeners.addInterface( getCppuType( &xListener ), xListener );
382 }
383
384 // ------------------------------------------------------------------------------
385
removeFocusListener(const uno::Reference<awt::XFocusListener> & xListener)386 void SAL_CALL Window::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener )
387 throw (uno::RuntimeException)
388 {
389 maListeners.removeInterface( getCppuType( &xListener ), xListener );
390 }
391
392 // ------------------------------------------------------------------------------
393
addKeyListener(const uno::Reference<awt::XKeyListener> & xListener)394 void SAL_CALL Window::addKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
395 throw (uno::RuntimeException)
396 {
397 maListeners.addInterface( getCppuType( &xListener ), xListener );
398 }
399
400 // ------------------------------------------------------------------------------
401
removeKeyListener(const uno::Reference<awt::XKeyListener> & xListener)402 void SAL_CALL Window::removeKeyListener( const uno::Reference< awt::XKeyListener >& xListener )
403 throw (uno::RuntimeException)
404 {
405 maListeners.removeInterface( getCppuType( &xListener ), xListener );
406 }
407
408 // ------------------------------------------------------------------------------
409
addMouseListener(const uno::Reference<awt::XMouseListener> & xListener)410 void SAL_CALL Window::addMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
411 throw (uno::RuntimeException)
412 {
413 maListeners.addInterface( getCppuType( &xListener ), xListener );
414 }
415
416 // ------------------------------------------------------------------------------
417
removeMouseListener(const uno::Reference<awt::XMouseListener> & xListener)418 void SAL_CALL Window::removeMouseListener( const uno::Reference< awt::XMouseListener >& xListener )
419 throw (uno::RuntimeException)
420 {
421 maListeners.removeInterface( getCppuType( &xListener ), xListener );
422 }
423
424 // ------------------------------------------------------------------------------
425
addMouseMotionListener(const uno::Reference<awt::XMouseMotionListener> & xListener)426 void SAL_CALL Window::addMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
427 throw (uno::RuntimeException)
428 {
429 maListeners.addInterface( getCppuType( &xListener ), xListener );
430 }
431
432 // ------------------------------------------------------------------------------
433
removeMouseMotionListener(const uno::Reference<awt::XMouseMotionListener> & xListener)434 void SAL_CALL Window::removeMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener )
435 throw (uno::RuntimeException)
436 {
437 maListeners.removeInterface( getCppuType( &xListener ), xListener );
438 }
439
440 // ------------------------------------------------------------------------------
441
addPaintListener(const uno::Reference<awt::XPaintListener> & xListener)442 void SAL_CALL Window::addPaintListener( const uno::Reference< awt::XPaintListener >& xListener )
443 throw (uno::RuntimeException)
444 {
445 maListeners.addInterface( getCppuType( &xListener ), xListener );
446 }
447
448 // ------------------------------------------------------------------------------
449
removePaintListener(const uno::Reference<awt::XPaintListener> & xListener)450 void SAL_CALL Window::removePaintListener( const uno::Reference< awt::XPaintListener >& xListener )
451 throw (uno::RuntimeException)
452 {
453 maListeners.removeInterface( getCppuType( &xListener ), xListener );
454 }
455
456 // ------------------------------------------------------------------------------
457
dispose()458 void SAL_CALL Window::dispose( )
459 throw (uno::RuntimeException)
460 {
461 }
462
463 // ------------------------------------------------------------------------------
464
addEventListener(const uno::Reference<lang::XEventListener> & xListener)465 void SAL_CALL Window::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
466 throw (uno::RuntimeException)
467 {
468 maListeners.addInterface( getCppuType( &xListener ), xListener );
469 }
470
471 // ------------------------------------------------------------------------------
472
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)473 void SAL_CALL Window::removeEventListener( const uno::Reference< lang::XEventListener >& xListener )
474 throw (uno::RuntimeException)
475 {
476 maListeners.removeInterface( getCppuType( &xListener ), xListener );
477 }
478
479 // ------------------------------------------------------------------------------
480
fireMousePressedEvent(const::com::sun::star::awt::MouseEvent & rEvt)481 void Window::fireMousePressedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
482 {
483 ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( (uno::Reference< awt::XMouseListener >*) 0 ) );
484
485 if( pContainer )
486 {
487 ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
488
489 while( aIter.hasMoreElements() )
490 uno::Reference< awt::XMouseListener >( aIter.next(), uno::UNO_QUERY )->mousePressed( rEvt );
491 }
492 }
493
494 // -----------------------------------------------------------------------------
495
fireMouseReleasedEvent(const::com::sun::star::awt::MouseEvent & rEvt)496 void Window::fireMouseReleasedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
497 {
498 ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( (uno::Reference< awt::XMouseListener >*) 0 ) );
499
500 if( pContainer )
501 {
502 ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
503
504 while( aIter.hasMoreElements() )
505 uno::Reference< awt::XMouseListener >( aIter.next(), uno::UNO_QUERY )->mouseReleased( rEvt );
506 }
507 }
508
509 // -----------------------------------------------------------------------------
510
fireMouseMovedEvent(const::com::sun::star::awt::MouseEvent & rEvt)511 void Window::fireMouseMovedEvent( const ::com::sun::star::awt::MouseEvent& rEvt )
512 {
513 ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( (uno::Reference< awt::XMouseMotionListener >*) 0 ) );
514
515 if( pContainer )
516 {
517 ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
518
519 while( aIter.hasMoreElements() )
520 uno::Reference< awt::XMouseMotionListener >( aIter.next(), uno::UNO_QUERY )->mouseMoved( rEvt );
521 }
522 }
523
524 // -----------------------------------------------------------------------------
525
fireSetFocusEvent(const::com::sun::star::awt::FocusEvent & rEvt)526 void Window::fireSetFocusEvent( const ::com::sun::star::awt::FocusEvent& rEvt )
527 {
528 ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( (uno::Reference< awt::XFocusListener >*) 0 ) );
529
530 if( pContainer )
531 {
532 ::cppu::OInterfaceIteratorHelper aIter( *pContainer );
533
534 while( aIter.hasMoreElements() )
535 uno::Reference< awt::XFocusListener >( aIter.next(), uno::UNO_QUERY )->focusGained( rEvt );
536 }
537 }
538
539 // ------------------------------------------------------------------------------
540
getImplementationName()541 ::rtl::OUString SAL_CALL Window::getImplementationName( )
542 throw (uno::RuntimeException)
543 {
544 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_XINE_WINDOW_IMPLEMENTATIONNAME ) );
545 }
546
547 // ------------------------------------------------------------------------------
548
supportsService(const::rtl::OUString & ServiceName)549 sal_Bool SAL_CALL Window::supportsService( const ::rtl::OUString& ServiceName )
550 throw (uno::RuntimeException)
551 {
552 return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_XINE_WINDOW_SERVICENAME ) );
553 }
554
555 // ------------------------------------------------------------------------------
556
getSupportedServiceNames()557 uno::Sequence< ::rtl::OUString > SAL_CALL Window::getSupportedServiceNames( )
558 throw (uno::RuntimeException)
559 {
560 uno::Sequence< ::rtl::OUString > aRet(1);
561 aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_XINE_WINDOW_SERVICENAME ) );
562
563 return aRet;
564 }
565
566 } // namespace xine
567 } // namespace avmedia
568