Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <config_features.h>
21 :
22 : #include <iostream>
23 : #include "mediawindow_impl.hxx"
24 : #include "mediaevent_impl.hxx"
25 : #include "mediamisc.hxx"
26 : #include "mediawindow.hrc"
27 : #include "helpids.hrc"
28 :
29 : #include <algorithm>
30 : #include <cmath>
31 :
32 : #include <comphelper/processfactory.hxx>
33 : #include <osl/mutex.hxx>
34 : #include <tools/urlobj.hxx>
35 : #include <unotools/securityoptions.hxx>
36 : #include <vcl/svapp.hxx>
37 :
38 : #include <com/sun/star/awt/SystemPointer.hpp>
39 : #include <com/sun/star/lang/XComponent.hpp>
40 : #include <com/sun/star/media/XManager.hpp>
41 : #include <vcl/sysdata.hxx>
42 : #include <vcl/opengl/OpenGLContext.hxx>
43 :
44 : using namespace ::com::sun::star;
45 :
46 : namespace avmedia { namespace priv {
47 :
48 :
49 : // - MediaWindowControl -
50 :
51 :
52 0 : MediaWindowControl::MediaWindowControl( vcl::Window* pParent ) :
53 0 : MediaControl( pParent, MEDIACONTROLSTYLE_MULTILINE )
54 : {
55 0 : }
56 :
57 :
58 :
59 0 : MediaWindowControl::~MediaWindowControl()
60 : {
61 0 : }
62 :
63 :
64 :
65 0 : void MediaWindowControl::update()
66 : {
67 0 : MediaItem aItem;
68 :
69 0 : static_cast< MediaWindowImpl* >( GetParent() )->updateMediaItem( aItem );
70 0 : setState( aItem );
71 0 : }
72 :
73 :
74 :
75 0 : void MediaWindowControl::execute( const MediaItem& rItem )
76 : {
77 0 : static_cast< MediaWindowImpl* >( GetParent() )->executeMediaItem( rItem );
78 0 : }
79 :
80 :
81 : // - MediaChildWindow -
82 :
83 :
84 0 : MediaChildWindow::MediaChildWindow( vcl::Window* pParent ) :
85 0 : SystemChildWindow( pParent, WB_CLIPCHILDREN )
86 : {
87 0 : }
88 :
89 : #if HAVE_FEATURE_GLTF
90 0 : MediaChildWindow::MediaChildWindow( vcl::Window* pParent, SystemWindowData* pData ) :
91 0 : SystemChildWindow( pParent, WB_CLIPCHILDREN, pData )
92 : {
93 0 : }
94 : #endif
95 :
96 0 : MediaChildWindow::~MediaChildWindow()
97 : {
98 0 : }
99 :
100 :
101 :
102 0 : void MediaChildWindow::MouseMove( const MouseEvent& rMEvt )
103 : {
104 0 : const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
105 0 : rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
106 :
107 0 : SystemChildWindow::MouseMove( rMEvt );
108 0 : GetParent()->MouseMove( aTransformedEvent );
109 0 : }
110 :
111 :
112 :
113 0 : void MediaChildWindow::MouseButtonDown( const MouseEvent& rMEvt )
114 : {
115 0 : const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
116 0 : rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
117 :
118 0 : SystemChildWindow::MouseButtonDown( rMEvt );
119 0 : GetParent()->MouseButtonDown( aTransformedEvent );
120 0 : }
121 :
122 :
123 :
124 0 : void MediaChildWindow::MouseButtonUp( const MouseEvent& rMEvt )
125 : {
126 0 : const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
127 0 : rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
128 :
129 0 : SystemChildWindow::MouseButtonUp( rMEvt );
130 0 : GetParent()->MouseButtonUp( aTransformedEvent );
131 0 : }
132 :
133 :
134 :
135 0 : void MediaChildWindow::KeyInput( const KeyEvent& rKEvt )
136 : {
137 0 : SystemChildWindow::KeyInput( rKEvt );
138 0 : GetParent()->KeyInput( rKEvt );
139 0 : }
140 :
141 :
142 :
143 0 : void MediaChildWindow::KeyUp( const KeyEvent& rKEvt )
144 : {
145 0 : SystemChildWindow::KeyUp( rKEvt );
146 0 : GetParent()->KeyUp( rKEvt );
147 0 : }
148 :
149 :
150 :
151 0 : void MediaChildWindow::Command( const CommandEvent& rCEvt )
152 : {
153 0 : const CommandEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rCEvt.GetMousePosPixel() ) ),
154 0 : rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() );
155 :
156 0 : SystemChildWindow::Command( rCEvt );
157 0 : GetParent()->Command( aTransformedEvent );
158 0 : }
159 :
160 :
161 : // - MediaWindowImpl -
162 :
163 :
164 0 : MediaWindowImpl::MediaWindowImpl( vcl::Window* pParent, MediaWindow* pMediaWindow, bool bInternalMediaControl ) :
165 : Control( pParent ),
166 : DropTargetHelper( this ),
167 : DragSourceHelper( this ),
168 : mpMediaWindow( pMediaWindow ),
169 : mpEvents( NULL ),
170 : mbEventTransparent(true),
171 0 : mpMediaWindowControl( bInternalMediaControl ? new MediaWindowControl( this ) : NULL ),
172 : mpEmptyBmpEx( NULL ),
173 0 : mpAudioBmpEx( NULL )
174 : {
175 0 : if( mpMediaWindowControl )
176 : {
177 0 : mpMediaWindowControl->SetSizePixel( mpMediaWindowControl->getMinSizePixel() );
178 0 : mpMediaWindowControl->Show();
179 : }
180 0 : }
181 :
182 :
183 :
184 0 : MediaWindowImpl::~MediaWindowImpl()
185 : {
186 0 : if( mpEvents )
187 0 : mpEvents->cleanUp();
188 :
189 0 : if( mxPlayerWindow.is() )
190 : {
191 0 : mxPlayerWindow->removeKeyListener( uno::Reference< awt::XKeyListener >( mxEventsIf, uno::UNO_QUERY ) );
192 0 : mxPlayerWindow->removeMouseListener( uno::Reference< awt::XMouseListener >( mxEventsIf, uno::UNO_QUERY ) );
193 0 : mxPlayerWindow->removeMouseMotionListener( uno::Reference< awt::XMouseMotionListener >( mxEventsIf, uno::UNO_QUERY ) );
194 :
195 0 : uno::Reference< lang::XComponent > xComponent( mxPlayerWindow, uno::UNO_QUERY );
196 0 : if( xComponent.is() )
197 0 : xComponent->dispose();
198 :
199 0 : mxPlayerWindow.clear();
200 : }
201 :
202 0 : uno::Reference< lang::XComponent > xComponent( mxPlayer, uno::UNO_QUERY );
203 0 : if( xComponent.is() ) // this stops the player
204 0 : xComponent->dispose();
205 :
206 0 : mxPlayer.clear();
207 :
208 0 : mpMediaWindow = NULL;
209 :
210 0 : delete mpEmptyBmpEx;
211 0 : delete mpAudioBmpEx;
212 0 : delete mpMediaWindowControl;
213 0 : }
214 :
215 2 : uno::Reference< media::XPlayer > MediaWindowImpl::createPlayer( const OUString& rURL, const OUString& rReferer, const OUString* pMimeType )
216 : {
217 :
218 2 : uno::Reference< media::XPlayer > xPlayer;
219 :
220 2 : if( rURL.isEmpty() )
221 0 : return xPlayer;
222 :
223 2 : if (SvtSecurityOptions().isUntrustedReferer(rReferer)) {
224 0 : return xPlayer;
225 : }
226 4 : uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
227 :
228 2 : if ( !pMimeType || *pMimeType == AVMEDIA_MIMETYPE_COMMON )
229 : {
230 :
231 : static const char * aServiceManagers[] = {
232 : AVMEDIA_MANAGER_SERVICE_PREFERRED,
233 : AVMEDIA_MANAGER_SERVICE_NAME,
234 : // a fallback path just for gstreamer which has
235 : // two significant versions deployed at once ...
236 : #ifdef AVMEDIA_MANAGER_SERVICE_NAME_OLD
237 : AVMEDIA_MANAGER_SERVICE_NAME_OLD
238 : #endif
239 : // fallback to AVMedia framework on OS X
240 : #ifdef AVMEDIA_MANAGER_SERVICE_NAME_FALLBACK1
241 : AVMEDIA_MANAGER_SERVICE_NAME_FALLBACK1
242 : #endif
243 : };
244 :
245 0 : for( sal_uInt32 i = 0; !xPlayer.is() && i < SAL_N_ELEMENTS( aServiceManagers ); ++i )
246 : {
247 : const OUString aServiceName( aServiceManagers[ i ],
248 0 : strlen( aServiceManagers[ i ] ),
249 0 : RTL_TEXTENCODING_ASCII_US );
250 :
251 0 : xPlayer = createPlayer(rURL, aServiceName, xContext);
252 0 : }
253 : }
254 : #if HAVE_FEATURE_GLTF
255 2 : else if ( *pMimeType == AVMEDIA_MIMETYPE_JSON )
256 : {
257 2 : xPlayer = createPlayer(rURL, AVMEDIA_OPENGL_MANAGER_SERVICE_NAME, xContext);
258 : }
259 : #endif
260 :
261 2 : return xPlayer;
262 : }
263 :
264 2 : uno::Reference< media::XPlayer > MediaWindowImpl::createPlayer(
265 : const OUString& rURL, const OUString& rManagerServName,
266 : uno::Reference< uno::XComponentContext > xContext)
267 : {
268 2 : uno::Reference< media::XPlayer > xPlayer;
269 : try
270 : {
271 : uno::Reference< media::XManager > xManager (
272 4 : xContext->getServiceManager()->createInstanceWithContext(rManagerServName, xContext),
273 2 : uno::UNO_QUERY );
274 2 : if( xManager.is() )
275 0 : xPlayer = uno::Reference< media::XPlayer >( xManager->createPlayer( rURL ), uno::UNO_QUERY );
276 : else
277 2 : SAL_WARN( "avmedia", "failed to create media player service " << rManagerServName );
278 0 : } catch ( const uno::Exception &e )
279 : {
280 : SAL_WARN( "avmedia", "couldn't create media player " << rManagerServName
281 : << ", exception '" << e.Message << '\'');
282 : }
283 2 : return xPlayer;
284 : }
285 :
286 0 : void MediaWindowImpl::setURL( const OUString& rURL,
287 : OUString const& rTempURL, OUString const& rReferer)
288 : {
289 0 : maReferer = rReferer;
290 0 : if( rURL != getURL() )
291 : {
292 0 : if( mxPlayer.is() )
293 0 : mxPlayer->stop();
294 :
295 0 : if( mxPlayerWindow.is() )
296 : {
297 0 : mxPlayerWindow->setVisible( false );
298 0 : mxPlayerWindow.clear();
299 : }
300 :
301 0 : mxPlayer.clear();
302 0 : mTempFileURL = OUString();
303 :
304 0 : if (!rTempURL.isEmpty())
305 : {
306 0 : maFileURL = rURL;
307 0 : mTempFileURL = rTempURL;
308 : }
309 : else
310 : {
311 0 : INetURLObject aURL( rURL );
312 :
313 0 : if (aURL.GetProtocol() != INET_PROT_NOT_VALID)
314 0 : maFileURL = aURL.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS);
315 : else
316 0 : maFileURL = rURL;
317 : }
318 :
319 0 : mxPlayer = createPlayer((!mTempFileURL.isEmpty()) ? mTempFileURL : maFileURL, rReferer, &m_sMimeType );
320 0 : onURLChanged();
321 : }
322 0 : }
323 :
324 0 : const OUString& MediaWindowImpl::getURL() const
325 : {
326 0 : return maFileURL;
327 : }
328 :
329 0 : bool MediaWindowImpl::isValid() const
330 : {
331 0 : return( mxPlayer.is() );
332 : }
333 :
334 0 : Size MediaWindowImpl::getPreferredSize() const
335 : {
336 0 : Size aRet;
337 :
338 0 : if( mxPlayer.is() )
339 : {
340 0 : awt::Size aPrefSize( mxPlayer->getPreferredPlayerWindowSize() );
341 :
342 0 : aRet.Width() = aPrefSize.Width;
343 0 : aRet.Height() = aPrefSize.Height;
344 : }
345 :
346 0 : return aRet;
347 : }
348 :
349 0 : bool MediaWindowImpl::start()
350 : {
351 0 : return mxPlayer.is() && ( mxPlayer->start(), true );
352 : }
353 :
354 0 : void MediaWindowImpl::updateMediaItem( MediaItem& rItem ) const
355 : {
356 0 : if( isPlaying() )
357 0 : rItem.setState( MEDIASTATE_PLAY );
358 : else
359 0 : rItem.setState( ( 0.0 == getMediaTime() ) ? MEDIASTATE_STOP : MEDIASTATE_PAUSE );
360 :
361 0 : rItem.setDuration( getDuration() );
362 0 : rItem.setTime( getMediaTime() );
363 0 : rItem.setLoop( isPlaybackLoop() );
364 0 : rItem.setMute( isMute() );
365 0 : rItem.setVolumeDB( getVolumeDB() );
366 0 : rItem.setZoom( getZoom() );
367 0 : rItem.setURL( getURL(), mTempFileURL, maReferer );
368 0 : }
369 :
370 0 : void MediaWindowImpl::executeMediaItem( const MediaItem& rItem )
371 : {
372 0 : const sal_uInt32 nMaskSet = rItem.getMaskSet();
373 :
374 : // set URL first
375 0 : if( nMaskSet & AVMEDIA_SETMASK_URL )
376 : {
377 0 : m_sMimeType = rItem.getMimeType();
378 0 : setURL( rItem.getURL(), rItem.getTempURL(), rItem.getReferer() );
379 : }
380 :
381 : // set different states next
382 0 : if( nMaskSet & AVMEDIA_SETMASK_TIME )
383 0 : setMediaTime( ::std::min( rItem.getTime(), getDuration() ) );
384 :
385 0 : if( nMaskSet & AVMEDIA_SETMASK_LOOP )
386 0 : setPlaybackLoop( rItem.isLoop() );
387 :
388 0 : if( nMaskSet & AVMEDIA_SETMASK_MUTE )
389 0 : setMute( rItem.isMute() );
390 :
391 0 : if( nMaskSet & AVMEDIA_SETMASK_VOLUMEDB )
392 0 : setVolumeDB( rItem.getVolumeDB() );
393 :
394 0 : if( nMaskSet & AVMEDIA_SETMASK_ZOOM )
395 0 : setZoom( rItem.getZoom() );
396 :
397 : // set play state at last
398 0 : if( nMaskSet & AVMEDIA_SETMASK_STATE )
399 : {
400 0 : switch( rItem.getState() )
401 : {
402 : case( MEDIASTATE_PLAY ):
403 : {
404 :
405 0 : if( !isPlaying() )
406 0 : start();
407 : }
408 0 : break;
409 :
410 : case( MEDIASTATE_PAUSE ):
411 : {
412 0 : if( isPlaying() )
413 0 : stop();
414 : }
415 0 : break;
416 :
417 : case( MEDIASTATE_STOP ):
418 : {
419 0 : if( isPlaying() )
420 : {
421 0 : setMediaTime( 0.0 );
422 0 : stop();
423 0 : setMediaTime( 0.0 );
424 : }
425 : }
426 0 : break;
427 : }
428 : }
429 0 : }
430 :
431 0 : bool MediaWindowImpl::setZoom( ::com::sun::star::media::ZoomLevel eLevel )
432 : {
433 0 : return mxPlayerWindow.is() && mxPlayerWindow->setZoomLevel( eLevel );
434 : }
435 :
436 0 : ::com::sun::star::media::ZoomLevel MediaWindowImpl::getZoom() const
437 : {
438 0 : return( mxPlayerWindow.is() ? mxPlayerWindow->getZoomLevel() : media::ZoomLevel_NOT_AVAILABLE );
439 : }
440 :
441 0 : void MediaWindowImpl::stop()
442 : {
443 0 : if( mxPlayer.is() )
444 0 : mxPlayer->stop();
445 0 : }
446 :
447 0 : bool MediaWindowImpl::isPlaying() const
448 : {
449 0 : return( mxPlayer.is() && mxPlayer->isPlaying() );
450 : }
451 :
452 0 : double MediaWindowImpl::getDuration() const
453 : {
454 0 : return( mxPlayer.is() ? mxPlayer->getDuration() : 0.0 );
455 : }
456 :
457 0 : void MediaWindowImpl::setMediaTime( double fTime )
458 : {
459 0 : if( mxPlayer.is() )
460 0 : mxPlayer->setMediaTime( fTime );
461 0 : }
462 :
463 0 : double MediaWindowImpl::getMediaTime() const
464 : {
465 0 : return( mxPlayer.is() ? mxPlayer->getMediaTime() : 0.0 );
466 : }
467 :
468 0 : void MediaWindowImpl::setPlaybackLoop( bool bSet )
469 : {
470 0 : if( mxPlayer.is() )
471 0 : mxPlayer->setPlaybackLoop( bSet );
472 0 : }
473 :
474 0 : bool MediaWindowImpl::isPlaybackLoop() const
475 : {
476 0 : return mxPlayer.is() && mxPlayer->isPlaybackLoop();
477 : }
478 :
479 0 : void MediaWindowImpl::setMute( bool bSet )
480 : {
481 0 : if( mxPlayer.is() )
482 0 : mxPlayer->setMute( bSet );
483 0 : }
484 :
485 0 : bool MediaWindowImpl::isMute() const
486 : {
487 0 : return mxPlayer.is() && mxPlayer->isMute();
488 : }
489 :
490 0 : void MediaWindowImpl::setVolumeDB( sal_Int16 nVolumeDB )
491 : {
492 0 : if( mxPlayer.is() )
493 0 : mxPlayer->setVolumeDB( nVolumeDB );
494 0 : }
495 :
496 0 : sal_Int16 MediaWindowImpl::getVolumeDB() const
497 : {
498 0 : return( mxPlayer.is() ? mxPlayer->getVolumeDB() : 0 );
499 : }
500 :
501 0 : void MediaWindowImpl::stopPlayingInternal( bool bStop )
502 : {
503 0 : if( isPlaying() )
504 : {
505 0 : bStop ? mxPlayer->stop() : mxPlayer->start();
506 : }
507 0 : }
508 :
509 0 : void MediaWindowImpl::onURLChanged()
510 : {
511 0 : if( m_sMimeType == AVMEDIA_MIMETYPE_COMMON )
512 : {
513 0 : mpChildWindow.reset(new MediaChildWindow(this) );
514 : }
515 : #if HAVE_FEATURE_GLTF
516 0 : else if ( m_sMimeType == AVMEDIA_MIMETYPE_JSON )
517 : {
518 0 : SystemWindowData aWinData = OpenGLContext::generateWinData(this, false);
519 0 : mpChildWindow.reset(new MediaChildWindow(this,&aWinData));
520 0 : mbEventTransparent = false;
521 : }
522 : #endif
523 0 : if( !mpChildWindow )
524 0 : return;
525 0 : mpChildWindow->SetHelpId( HID_AVMEDIA_PLAYERWINDOW );
526 0 : mxEventsIf.set( static_cast< ::cppu::OWeakObject* >( mpEvents = new MediaEventListenersImpl( *mpChildWindow.get() ) ) );
527 :
528 0 : if( mxPlayer.is() )
529 : {
530 0 : Resize();
531 0 : uno::Sequence< uno::Any > aArgs( 3 );
532 0 : uno::Reference< media::XPlayerWindow > xPlayerWindow;
533 0 : const Point aPoint;
534 0 : const Size aSize( mpChildWindow->GetSizePixel() );
535 :
536 0 : aArgs[ 0 ] = uno::makeAny( mpChildWindow->GetParentWindowHandle() );
537 0 : aArgs[ 1 ] = uno::makeAny( awt::Rectangle( aPoint.X(), aPoint.Y(), aSize.Width(), aSize.Height() ) );
538 0 : aArgs[ 2 ] = uno::makeAny( reinterpret_cast< sal_IntPtr >( mpChildWindow.get() ) );
539 :
540 : try
541 : {
542 0 : xPlayerWindow = mxPlayer->createPlayerWindow( aArgs );
543 : }
544 0 : catch( uno::RuntimeException )
545 : {
546 : // happens eg, on MacOSX where Java frames cannot be created from X11 window handles
547 : }
548 :
549 0 : mxPlayerWindow = xPlayerWindow;
550 :
551 0 : if( xPlayerWindow.is() )
552 : {
553 0 : xPlayerWindow->addKeyListener( uno::Reference< awt::XKeyListener >( mxEventsIf, uno::UNO_QUERY ) );
554 0 : xPlayerWindow->addMouseListener( uno::Reference< awt::XMouseListener >( mxEventsIf, uno::UNO_QUERY ) );
555 0 : xPlayerWindow->addMouseMotionListener( uno::Reference< awt::XMouseMotionListener >( mxEventsIf, uno::UNO_QUERY ) );
556 0 : xPlayerWindow->addFocusListener( uno::Reference< awt::XFocusListener >( mxEventsIf, uno::UNO_QUERY ) );
557 0 : }
558 : }
559 : else
560 0 : mxPlayerWindow.clear();
561 :
562 0 : if( mxPlayerWindow.is() )
563 0 : mpChildWindow->Show();
564 : else
565 0 : mpChildWindow->Hide();
566 :
567 0 : if( mpMediaWindowControl )
568 : {
569 0 : MediaItem aItem;
570 :
571 0 : updateMediaItem( aItem );
572 0 : mpMediaWindowControl->setState( aItem );
573 : }
574 : }
575 :
576 :
577 :
578 0 : void MediaWindowImpl::setPosSize( const Rectangle& rRect )
579 : {
580 0 : SetPosSizePixel( rRect.TopLeft(), rRect.GetSize() );
581 0 : }
582 :
583 :
584 :
585 0 : void MediaWindowImpl::setPointer( const Pointer& rPointer )
586 : {
587 0 : SetPointer( rPointer );
588 0 : if( mpChildWindow )
589 0 : mpChildWindow->SetPointer( rPointer );
590 :
591 0 : if( mxPlayerWindow.is() )
592 : {
593 : long nPointer;
594 :
595 0 : switch( rPointer.GetStyle() )
596 : {
597 0 : case( POINTER_CROSS ): nPointer = awt::SystemPointer::CROSS; break;
598 0 : case( POINTER_HAND ): nPointer = awt::SystemPointer::HAND; break;
599 0 : case( POINTER_MOVE ): nPointer = awt::SystemPointer::MOVE; break;
600 0 : case( POINTER_WAIT ): nPointer = awt::SystemPointer::WAIT; break;
601 :
602 0 : default: nPointer = awt::SystemPointer::ARROW; break;
603 : }
604 :
605 0 : mxPlayerWindow->setPointerType( nPointer );
606 : }
607 0 : }
608 :
609 :
610 :
611 0 : void MediaWindowImpl::Resize()
612 : {
613 0 : const Size aCurSize( GetOutputSizePixel() );
614 0 : const sal_Int32 nOffset( mpMediaWindowControl ? AVMEDIA_CONTROLOFFSET : 0 );
615 0 : Size aPlayerWindowSize( aCurSize.Width() - ( nOffset << 1 ),
616 0 : aCurSize.Height() - ( nOffset << 1 ) );
617 :
618 0 : if( mpMediaWindowControl )
619 : {
620 0 : const sal_Int32 nControlHeight = mpMediaWindowControl->GetSizePixel().Height();
621 0 : const sal_Int32 nControlY = ::std::max( aCurSize.Height() - nControlHeight - nOffset, 0L );
622 :
623 0 : aPlayerWindowSize.Height() = ( nControlY - ( nOffset << 1 ) );
624 0 : mpMediaWindowControl->SetPosSizePixel( Point( nOffset, nControlY ), Size( aCurSize.Width() - ( nOffset << 1 ), nControlHeight ) );
625 : }
626 0 : if( mpChildWindow )
627 0 : mpChildWindow->SetPosSizePixel( Point( 0, 0 ), aPlayerWindowSize );
628 :
629 0 : if( mxPlayerWindow.is() )
630 0 : mxPlayerWindow->setPosSize( 0, 0, aPlayerWindowSize.Width(), aPlayerWindowSize.Height(), 0 );
631 0 : }
632 :
633 :
634 :
635 0 : void MediaWindowImpl::StateChanged( StateChangedType eType )
636 : {
637 0 : if( mxPlayerWindow.is() )
638 : {
639 : // stop playing when going disabled or hidden
640 0 : switch( eType )
641 : {
642 : case StateChangedType::VISIBLE:
643 : {
644 0 : stopPlayingInternal( !IsVisible() );
645 0 : mxPlayerWindow->setVisible( IsVisible() );
646 : }
647 0 : break;
648 :
649 : case StateChangedType::ENABLE:
650 : {
651 0 : stopPlayingInternal( !IsEnabled() );
652 0 : mxPlayerWindow->setEnable( IsEnabled() );
653 : }
654 0 : break;
655 :
656 : default:
657 0 : break;
658 : }
659 : }
660 0 : }
661 :
662 :
663 :
664 0 : void MediaWindowImpl::Paint( const Rectangle& )
665 : {
666 0 : if( mxPlayerWindow.is() )
667 0 : mxPlayerWindow->update();
668 :
669 0 : BitmapEx* pLogo = NULL;
670 :
671 0 : if( !mxPlayer.is() )
672 : {
673 0 : if( !mpEmptyBmpEx )
674 0 : mpEmptyBmpEx = new BitmapEx( AVMEDIA_RESID( AVMEDIA_BMP_EMPTYLOGO ) );
675 :
676 0 : pLogo = mpEmptyBmpEx;
677 : }
678 0 : else if( !mxPlayerWindow.is() )
679 : {
680 0 : if( !mpAudioBmpEx )
681 0 : mpAudioBmpEx = new BitmapEx( AVMEDIA_RESID( AVMEDIA_BMP_AUDIOLOGO ) );
682 :
683 0 : pLogo = mpAudioBmpEx;
684 : }
685 :
686 0 : if( !mpChildWindow )
687 0 : return;
688 0 : const Point aBasePos( mpChildWindow->GetPosPixel() );
689 0 : const Rectangle aVideoRect( aBasePos, mpChildWindow->GetSizePixel() );
690 :
691 0 : if( pLogo && !pLogo->IsEmpty() && ( aVideoRect.GetWidth() > 0 ) && ( aVideoRect.GetHeight() > 0 ) )
692 : {
693 0 : Size aLogoSize( pLogo->GetSizePixel() );
694 0 : const Color aBackgroundColor( 67, 67, 67 );
695 :
696 0 : SetLineColor( aBackgroundColor );
697 0 : SetFillColor( aBackgroundColor );
698 0 : DrawRect( aVideoRect );
699 :
700 0 : if( ( aLogoSize.Width() > aVideoRect.GetWidth() || aLogoSize.Height() > aVideoRect.GetHeight() ) &&
701 0 : ( aLogoSize.Height() > 0 ) )
702 : {
703 0 : const double fLogoWH = (double) aLogoSize.Width() / aLogoSize.Height();
704 :
705 0 : if( fLogoWH < ( (double) aVideoRect.GetWidth() / aVideoRect.GetHeight() ) )
706 : {
707 0 : aLogoSize.Width() = (long) ( aVideoRect.GetHeight() * fLogoWH );
708 0 : aLogoSize.Height()= aVideoRect.GetHeight();
709 : }
710 : else
711 : {
712 0 : aLogoSize.Width() = aVideoRect.GetWidth();
713 0 : aLogoSize.Height()= (long) ( aVideoRect.GetWidth() / fLogoWH );
714 : }
715 : }
716 :
717 0 : DrawBitmapEx( Point( aBasePos.X() + ( ( aVideoRect.GetWidth() - aLogoSize.Width() ) >> 1 ),
718 0 : aBasePos.Y() + ( ( aVideoRect.GetHeight() - aLogoSize.Height() ) >> 1 ) ),
719 0 : aLogoSize, *pLogo );
720 : }
721 : }
722 :
723 :
724 :
725 0 : void MediaWindowImpl::GetFocus()
726 : {
727 0 : }
728 :
729 :
730 :
731 0 : void MediaWindowImpl::MouseMove( const MouseEvent& rMEvt )
732 : {
733 0 : if( mpMediaWindow && mbEventTransparent )
734 0 : mpMediaWindow->MouseMove( rMEvt );
735 0 : }
736 :
737 :
738 :
739 0 : void MediaWindowImpl::MouseButtonDown( const MouseEvent& rMEvt )
740 : {
741 0 : if( mpMediaWindow && mbEventTransparent )
742 0 : mpMediaWindow->MouseButtonDown( rMEvt );
743 0 : }
744 :
745 :
746 :
747 0 : void MediaWindowImpl::MouseButtonUp( const MouseEvent& rMEvt )
748 : {
749 0 : if( mpMediaWindow && mbEventTransparent )
750 0 : mpMediaWindow->MouseButtonUp( rMEvt );
751 0 : }
752 :
753 :
754 :
755 0 : void MediaWindowImpl::KeyInput( const KeyEvent& rKEvt )
756 : {
757 0 : if( mpMediaWindow && mbEventTransparent )
758 0 : mpMediaWindow->KeyInput( rKEvt );
759 0 : }
760 :
761 :
762 :
763 0 : void MediaWindowImpl::KeyUp( const KeyEvent& rKEvt )
764 : {
765 0 : if( mpMediaWindow && mbEventTransparent )
766 0 : mpMediaWindow->KeyUp( rKEvt );
767 0 : }
768 :
769 :
770 :
771 0 : void MediaWindowImpl::Command( const CommandEvent& rCEvt )
772 : {
773 0 : if( mpMediaWindow && mbEventTransparent )
774 0 : mpMediaWindow->Command( rCEvt );
775 0 : }
776 :
777 :
778 :
779 0 : sal_Int8 MediaWindowImpl::AcceptDrop( const AcceptDropEvent& rEvt )
780 : {
781 0 : return( mpMediaWindow && mbEventTransparent ? mpMediaWindow->AcceptDrop( rEvt ) : 0 );
782 : }
783 :
784 :
785 :
786 0 : sal_Int8 MediaWindowImpl::ExecuteDrop( const ExecuteDropEvent& rEvt )
787 : {
788 0 : return( mpMediaWindow && mbEventTransparent ? mpMediaWindow->ExecuteDrop( rEvt ) : 0 );
789 : }
790 :
791 :
792 :
793 0 : void MediaWindowImpl::StartDrag( sal_Int8 nAction, const Point& rPosPixel )
794 : {
795 0 : if( mpMediaWindow && mbEventTransparent )
796 0 : mpMediaWindow->StartDrag( nAction, rPosPixel );
797 0 : }
798 :
799 : } // namespace priv
800 651 : } // namespace avmedia
801 :
802 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|