LCOV - code coverage report
Current view: top level - avmedia/source/viewer - mediawindow_impl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 17 366 4.6 %
Date: 2014-11-03 Functions: 4 59 6.8 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10