1*cdf0e10cSrcweir /************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "mediawindow_impl.hxx"
29*cdf0e10cSrcweir #include "mediaevent_impl.hxx"
30*cdf0e10cSrcweir #include "mediamisc.hxx"
31*cdf0e10cSrcweir #include "mediawindow.hrc"
32*cdf0e10cSrcweir #include "helpids.hrc"
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <algorithm>
35*cdf0e10cSrcweir #include <cmath>
36*cdf0e10cSrcweir #include <osl/mutex.hxx>
37*cdf0e10cSrcweir #include <tools/time.hxx>
38*cdf0e10cSrcweir #include <vcl/svapp.hxx>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_AWT_SYSTEMPOINTER_HDL_
41*cdf0e10cSrcweir #include <com/sun/star/awt/SystemPointer.hdl>
42*cdf0e10cSrcweir #endif
43*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HDL_
44*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hdl>
45*cdf0e10cSrcweir #endif
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_PREV	0x0001
48*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_PLAY 	0x0002
49*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_PAUSE 	0x0004
50*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_STOP 	0x0008
51*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_NEXT 	0x0010
52*cdf0e10cSrcweir #define AVMEDIA_TOOLBOXITEM_MUTE	0x0100
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir #define AVMEDIA_FFW_PLAYRATE		4
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir using namespace ::com::sun::star;
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir namespace avmedia { namespace priv {
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir // ----------------------
61*cdf0e10cSrcweir // - MediaWindowControl -
62*cdf0e10cSrcweir // ----------------------
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir MediaWindowControl::MediaWindowControl( Window* pParent ) :
65*cdf0e10cSrcweir 	MediaControl( pParent, MEDIACONTROLSTYLE_MULTILINE )
66*cdf0e10cSrcweir {
67*cdf0e10cSrcweir }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir // ---------------------------------------------------------------------
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir MediaWindowControl::~MediaWindowControl()
72*cdf0e10cSrcweir {
73*cdf0e10cSrcweir }
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir // ---------------------------------------------------------------------
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir void MediaWindowControl::update()
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir 	MediaItem aItem;
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir 	static_cast< MediaWindowImpl* >( GetParent() )->updateMediaItem( aItem );
82*cdf0e10cSrcweir 	setState( aItem );
83*cdf0e10cSrcweir }
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir // ---------------------------------------------------------------------
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir void  MediaWindowControl::execute( const MediaItem& rItem )
88*cdf0e10cSrcweir {
89*cdf0e10cSrcweir 	static_cast< MediaWindowImpl* >( GetParent() )->executeMediaItem( rItem );
90*cdf0e10cSrcweir }
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir // --------------------
93*cdf0e10cSrcweir // - MediaChildWindow -
94*cdf0e10cSrcweir // --------------------
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir MediaChildWindow::MediaChildWindow( Window* pParent ) :
97*cdf0e10cSrcweir 	SystemChildWindow( pParent, WB_CLIPCHILDREN )
98*cdf0e10cSrcweir {
99*cdf0e10cSrcweir }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir // ---------------------------------------------------------------------
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir MediaChildWindow::~MediaChildWindow()
104*cdf0e10cSrcweir {
105*cdf0e10cSrcweir }
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir // ---------------------------------------------------------------------
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir void MediaChildWindow::MouseMove( const MouseEvent& rMEvt )
110*cdf0e10cSrcweir {
111*cdf0e10cSrcweir 	const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
112*cdf0e10cSrcweir 								  		rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir 	SystemChildWindow::MouseMove( rMEvt );
115*cdf0e10cSrcweir 	GetParent()->MouseMove( aTransformedEvent );
116*cdf0e10cSrcweir }
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir // ---------------------------------------------------------------------
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir void MediaChildWindow::MouseButtonDown( const MouseEvent& rMEvt )
121*cdf0e10cSrcweir {
122*cdf0e10cSrcweir 	const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
123*cdf0e10cSrcweir 								  		rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 	SystemChildWindow::MouseButtonDown( rMEvt );
126*cdf0e10cSrcweir 	GetParent()->MouseButtonDown( aTransformedEvent );
127*cdf0e10cSrcweir }
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir // ---------------------------------------------------------------------
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir void MediaChildWindow::MouseButtonUp( const MouseEvent& rMEvt )
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir 	const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ),
134*cdf0e10cSrcweir 								  		rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() );
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir 	SystemChildWindow::MouseButtonUp( rMEvt );
137*cdf0e10cSrcweir 	GetParent()->MouseButtonUp( aTransformedEvent );
138*cdf0e10cSrcweir }
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir // ---------------------------------------------------------------------
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir void MediaChildWindow::KeyInput( const KeyEvent& rKEvt )
143*cdf0e10cSrcweir {
144*cdf0e10cSrcweir 	SystemChildWindow::KeyInput( rKEvt );
145*cdf0e10cSrcweir 	GetParent()->KeyInput( rKEvt );
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir // ---------------------------------------------------------------------
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir void MediaChildWindow::KeyUp( const KeyEvent& rKEvt )
151*cdf0e10cSrcweir {
152*cdf0e10cSrcweir 	SystemChildWindow::KeyUp( rKEvt );
153*cdf0e10cSrcweir 	GetParent()->KeyUp( rKEvt );
154*cdf0e10cSrcweir }
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir // ---------------------------------------------------------------------
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir void MediaChildWindow::Command( const CommandEvent& rCEvt )
159*cdf0e10cSrcweir {
160*cdf0e10cSrcweir 	const CommandEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rCEvt.GetMousePosPixel() ) ),
161*cdf0e10cSrcweir 								  		  rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() );
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir 	SystemChildWindow::Command( rCEvt );
164*cdf0e10cSrcweir 	GetParent()->Command( aTransformedEvent );
165*cdf0e10cSrcweir }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir // ----------------------
168*cdf0e10cSrcweir // - MediaWindowImpl -
169*cdf0e10cSrcweir // ----------------------
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir MediaWindowImpl::MediaWindowImpl( Window* pParent, MediaWindow* pMediaWindow, bool bInternalMediaControl ) :
172*cdf0e10cSrcweir     Control( pParent ),
173*cdf0e10cSrcweir     MediaWindowBaseImpl( pMediaWindow ),
174*cdf0e10cSrcweir     DropTargetHelper( this ),
175*cdf0e10cSrcweir     DragSourceHelper( this ),
176*cdf0e10cSrcweir     mxEventsIf( static_cast< ::cppu::OWeakObject* >( mpEvents = new MediaEventListenersImpl( maChildWindow ) ) ),
177*cdf0e10cSrcweir 	maChildWindow( this ),
178*cdf0e10cSrcweir 	mpMediaWindowControl( bInternalMediaControl ? new MediaWindowControl( this ) : NULL ),
179*cdf0e10cSrcweir 	mpEmptyBmpEx( NULL ),
180*cdf0e10cSrcweir 	mpAudioBmpEx( NULL )
181*cdf0e10cSrcweir {
182*cdf0e10cSrcweir     maChildWindow.SetBackground( Color( COL_BLACK ) );
183*cdf0e10cSrcweir 	maChildWindow.SetHelpId( HID_AVMEDIA_PLAYERWINDOW );
184*cdf0e10cSrcweir 	maChildWindow.Hide();
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir 	if( mpMediaWindowControl )
187*cdf0e10cSrcweir 	{
188*cdf0e10cSrcweir 		mpMediaWindowControl->SetSizePixel( mpMediaWindowControl->getMinSizePixel() );
189*cdf0e10cSrcweir 		mpMediaWindowControl->Show();
190*cdf0e10cSrcweir 	}
191*cdf0e10cSrcweir }
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir // ---------------------------------------------------------------------
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir MediaWindowImpl::~MediaWindowImpl()
196*cdf0e10cSrcweir {
197*cdf0e10cSrcweir 	delete mpEmptyBmpEx;
198*cdf0e10cSrcweir 	delete mpAudioBmpEx;
199*cdf0e10cSrcweir 	delete mpMediaWindowControl;
200*cdf0e10cSrcweir }
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir // ---------------------------------------------------------------------
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir void MediaWindowImpl::cleanUp()
205*cdf0e10cSrcweir {
206*cdf0e10cSrcweir     uno::Reference< media::XPlayerWindow > xPlayerWindow( getPlayerWindow() );
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir     mpEvents->cleanUp();
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir     if( xPlayerWindow.is() )
211*cdf0e10cSrcweir     {
212*cdf0e10cSrcweir         xPlayerWindow->removeKeyListener( uno::Reference< awt::XKeyListener >( mxEventsIf, uno::UNO_QUERY ) );
213*cdf0e10cSrcweir         xPlayerWindow->removeMouseListener( uno::Reference< awt::XMouseListener >( mxEventsIf, uno::UNO_QUERY ) );
214*cdf0e10cSrcweir         xPlayerWindow->removeMouseMotionListener( uno::Reference< awt::XMouseMotionListener >( mxEventsIf, uno::UNO_QUERY ) );
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 		uno::Reference< lang::XComponent > xComponent( xPlayerWindow, uno::UNO_QUERY );
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir 		if( xComponent.is() )
219*cdf0e10cSrcweir 			xComponent->dispose();
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir 		setPlayerWindow( NULL );
222*cdf0e10cSrcweir     }
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir     MediaWindowBaseImpl::cleanUp();
225*cdf0e10cSrcweir }
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir // ---------------------------------------------------------------------
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir void MediaWindowImpl::onURLChanged()
230*cdf0e10cSrcweir {
231*cdf0e10cSrcweir     if( getPlayer().is() )
232*cdf0e10cSrcweir     {
233*cdf0e10cSrcweir         uno::Reference< media::XPlayerWindow > xPlayerWindow;
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir         const Point         aPoint;
236*cdf0e10cSrcweir 		const Size          aSize( maChildWindow.GetSizePixel() );
237*cdf0e10cSrcweir         const sal_IntPtr    nWndHandle = (sal_IntPtr) maChildWindow.GetParentWindowHandle( isMediaWindowJavaBased() );
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir         try
240*cdf0e10cSrcweir         {
241*cdf0e10cSrcweir             if( nWndHandle != 0 )
242*cdf0e10cSrcweir             {
243*cdf0e10cSrcweir                 uno::Sequence< uno::Any > aArgs( 3 );
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir                 aArgs[ 0 ] = uno::makeAny( nWndHandle );
246*cdf0e10cSrcweir                 aArgs[ 1 ] = uno::makeAny( awt::Rectangle( aPoint.X(), aPoint.Y(), aSize.Width(), aSize.Height() ) );
247*cdf0e10cSrcweir                 aArgs[ 2 ] = uno::makeAny( reinterpret_cast< sal_IntPtr >( &maChildWindow ) );
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir                 xPlayerWindow = getPlayer()->createPlayerWindow( aArgs );
250*cdf0e10cSrcweir             }
251*cdf0e10cSrcweir         }
252*cdf0e10cSrcweir         catch( uno::RuntimeException )
253*cdf0e10cSrcweir         {
254*cdf0e10cSrcweir             // happens eg, on MacOSX where Java frames cannot be created from X11 window handles
255*cdf0e10cSrcweir         }
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir         setPlayerWindow( xPlayerWindow );
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir         if( xPlayerWindow.is() )
260*cdf0e10cSrcweir         {
261*cdf0e10cSrcweir             xPlayerWindow->addKeyListener( uno::Reference< awt::XKeyListener >( mxEventsIf, uno::UNO_QUERY ) );
262*cdf0e10cSrcweir             xPlayerWindow->addMouseListener( uno::Reference< awt::XMouseListener >( mxEventsIf, uno::UNO_QUERY ) );
263*cdf0e10cSrcweir             xPlayerWindow->addMouseMotionListener( uno::Reference< awt::XMouseMotionListener >( mxEventsIf, uno::UNO_QUERY ) );
264*cdf0e10cSrcweir             xPlayerWindow->addFocusListener( uno::Reference< awt::XFocusListener >( mxEventsIf, uno::UNO_QUERY ) );
265*cdf0e10cSrcweir         }
266*cdf0e10cSrcweir 	}
267*cdf0e10cSrcweir 	else
268*cdf0e10cSrcweir         setPlayerWindow( NULL );
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 	if( getPlayerWindow().is() )
271*cdf0e10cSrcweir 		maChildWindow.Show();
272*cdf0e10cSrcweir 	else
273*cdf0e10cSrcweir 		maChildWindow.Hide();
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 	if( mpMediaWindowControl )
276*cdf0e10cSrcweir 	{
277*cdf0e10cSrcweir 		MediaItem aItem;
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 		updateMediaItem( aItem );
280*cdf0e10cSrcweir 		mpMediaWindowControl->setState( aItem );
281*cdf0e10cSrcweir 	}
282*cdf0e10cSrcweir }
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir // ---------------------------------------------------------------------
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir void MediaWindowImpl::update()
287*cdf0e10cSrcweir {
288*cdf0e10cSrcweir     uno::Reference< media::XPlayerWindow > xPlayerWindow( getPlayerWindow() );
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir 	if( xPlayerWindow.is() )
291*cdf0e10cSrcweir         xPlayerWindow->update();
292*cdf0e10cSrcweir }
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir // ---------------------------------------------------------------------
295*cdf0e10cSrcweir 
296*cdf0e10cSrcweir void MediaWindowImpl::setPosSize( const Rectangle& rRect )
297*cdf0e10cSrcweir {
298*cdf0e10cSrcweir     SetPosSizePixel( rRect.TopLeft(), rRect.GetSize() );
299*cdf0e10cSrcweir }
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir // ---------------------------------------------------------------------
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir void MediaWindowImpl::setPointer( const Pointer& rPointer )
304*cdf0e10cSrcweir {
305*cdf0e10cSrcweir     uno::Reference< media::XPlayerWindow >	xPlayerWindow( getPlayerWindow() );
306*cdf0e10cSrcweir 
307*cdf0e10cSrcweir 	SetPointer( rPointer );
308*cdf0e10cSrcweir 	maChildWindow.SetPointer( rPointer );
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir 	if( xPlayerWindow.is() )
311*cdf0e10cSrcweir 	{
312*cdf0e10cSrcweir     	long nPointer;
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir 		switch( rPointer.GetStyle() )
315*cdf0e10cSrcweir 		{
316*cdf0e10cSrcweir 			case( POINTER_CROSS ): nPointer = awt::SystemPointer::CROSS; break;
317*cdf0e10cSrcweir 			case( POINTER_HAND ): nPointer = awt::SystemPointer::HAND; break;
318*cdf0e10cSrcweir 			case( POINTER_MOVE ): nPointer = awt::SystemPointer::MOVE; break;
319*cdf0e10cSrcweir 			case( POINTER_WAIT ): nPointer = awt::SystemPointer::WAIT; break;
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir 			default: nPointer = awt::SystemPointer::ARROW; break;
322*cdf0e10cSrcweir 		}
323*cdf0e10cSrcweir 
324*cdf0e10cSrcweir 		xPlayerWindow->setPointerType( nPointer );
325*cdf0e10cSrcweir 	}
326*cdf0e10cSrcweir }
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir // ---------------------------------------------------------------------
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir const Pointer& MediaWindowImpl::getPointer() const
331*cdf0e10cSrcweir {
332*cdf0e10cSrcweir 	return GetPointer();
333*cdf0e10cSrcweir }
334*cdf0e10cSrcweir 
335*cdf0e10cSrcweir // ---------------------------------------------------------------------
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir bool MediaWindowImpl::hasInternalMediaControl() const
338*cdf0e10cSrcweir {
339*cdf0e10cSrcweir 	return( mpMediaWindowControl != NULL );
340*cdf0e10cSrcweir }
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir // ---------------------------------------------------------------------
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir void MediaWindowImpl::Resize()
345*cdf0e10cSrcweir {
346*cdf0e10cSrcweir     uno::Reference< media::XPlayerWindow >	xPlayerWindow( getPlayerWindow() );
347*cdf0e10cSrcweir     const Size								aCurSize( GetOutputSizePixel() );
348*cdf0e10cSrcweir 	const sal_Int32							nOffset( mpMediaWindowControl ? AVMEDIA_CONTROLOFFSET : 0 );
349*cdf0e10cSrcweir 	Size 									aPlayerWindowSize( aCurSize.Width() - ( nOffset << 1 ),
350*cdf0e10cSrcweir 															   aCurSize.Height() - ( nOffset << 1 ) );
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 	if( mpMediaWindowControl )
353*cdf0e10cSrcweir 	{
354*cdf0e10cSrcweir 		const sal_Int32	nControlHeight = mpMediaWindowControl->GetSizePixel().Height();
355*cdf0e10cSrcweir 		const sal_Int32	nControlY = ::std::max( aCurSize.Height() - nControlHeight - nOffset, 0L );
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir 		aPlayerWindowSize.Height() = ( nControlY - ( nOffset << 1 ) );
358*cdf0e10cSrcweir 		mpMediaWindowControl->SetPosSizePixel( Point( nOffset, nControlY ), Size( aCurSize.Width() - ( nOffset << 1 ), nControlHeight ) );
359*cdf0e10cSrcweir 	}
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir 	if( xPlayerWindow.is() )
362*cdf0e10cSrcweir 		xPlayerWindow->setPosSize( 0, 0, aPlayerWindowSize.Width(), aPlayerWindowSize.Height(), 0 );
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir 	maChildWindow.SetPosSizePixel( Point( nOffset, nOffset ), aPlayerWindowSize );
365*cdf0e10cSrcweir }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir // ---------------------------------------------------------------------
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir void MediaWindowImpl::StateChanged( StateChangedType eType )
370*cdf0e10cSrcweir {
371*cdf0e10cSrcweir     uno::Reference< media::XPlayerWindow > xPlayerWindow( getPlayerWindow() );
372*cdf0e10cSrcweir 
373*cdf0e10cSrcweir     if( xPlayerWindow.is() )
374*cdf0e10cSrcweir     {
375*cdf0e10cSrcweir         // stop playing when going disabled or hidden
376*cdf0e10cSrcweir         switch( eType )
377*cdf0e10cSrcweir         {
378*cdf0e10cSrcweir             case STATE_CHANGE_VISIBLE:
379*cdf0e10cSrcweir             {
380*cdf0e10cSrcweir                 stopPlayingInternal( !IsVisible() );
381*cdf0e10cSrcweir                 xPlayerWindow->setVisible( IsVisible() );
382*cdf0e10cSrcweir             }
383*cdf0e10cSrcweir             break;
384*cdf0e10cSrcweir 
385*cdf0e10cSrcweir             case STATE_CHANGE_ENABLE:
386*cdf0e10cSrcweir             {
387*cdf0e10cSrcweir                 stopPlayingInternal( !IsEnabled() );
388*cdf0e10cSrcweir                 xPlayerWindow->setEnable( IsEnabled() );
389*cdf0e10cSrcweir             }
390*cdf0e10cSrcweir             break;
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir             default:
393*cdf0e10cSrcweir             break;
394*cdf0e10cSrcweir         }
395*cdf0e10cSrcweir     }
396*cdf0e10cSrcweir }
397*cdf0e10cSrcweir 
398*cdf0e10cSrcweir // ---------------------------------------------------------------------
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir void MediaWindowImpl::Paint( const Rectangle& )
401*cdf0e10cSrcweir {
402*cdf0e10cSrcweir 	BitmapEx* pLogo = NULL;
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir 	if( !getPlayer().is() )
405*cdf0e10cSrcweir 	{
406*cdf0e10cSrcweir 		if( !mpEmptyBmpEx )
407*cdf0e10cSrcweir 			mpEmptyBmpEx = new BitmapEx( AVMEDIA_RESID( AVMEDIA_BMP_EMPTYLOGO ) );
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir 		pLogo = mpEmptyBmpEx;
410*cdf0e10cSrcweir 	}
411*cdf0e10cSrcweir 	else if( !getPlayerWindow().is() )
412*cdf0e10cSrcweir 	{
413*cdf0e10cSrcweir 		if( !mpAudioBmpEx )
414*cdf0e10cSrcweir 			mpAudioBmpEx = new BitmapEx( AVMEDIA_RESID( AVMEDIA_BMP_AUDIOLOGO ) );
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir 		pLogo = mpAudioBmpEx;
417*cdf0e10cSrcweir 	}
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir 	const Point     aBasePos( maChildWindow.GetPosPixel() );
420*cdf0e10cSrcweir 	const Rectangle aVideoRect( aBasePos, maChildWindow.GetSizePixel() );
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir 	if( pLogo && !pLogo->IsEmpty() && ( aVideoRect.GetWidth() > 0 ) && ( aVideoRect.GetHeight() > 0 ) )
423*cdf0e10cSrcweir 	{
424*cdf0e10cSrcweir 		Size	    aLogoSize( pLogo->GetSizePixel() );
425*cdf0e10cSrcweir 		const Color	aBackgroundColor( 67, 67, 67 );
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir 		SetLineColor( aBackgroundColor );
428*cdf0e10cSrcweir 		SetFillColor( aBackgroundColor );
429*cdf0e10cSrcweir 		DrawRect( aVideoRect );
430*cdf0e10cSrcweir 
431*cdf0e10cSrcweir 		if( ( aLogoSize.Width() > aVideoRect.GetWidth() || aLogoSize.Height() > aVideoRect.GetHeight() ) &&
432*cdf0e10cSrcweir 		    ( aLogoSize.Height() > 0 ) )
433*cdf0e10cSrcweir 		{
434*cdf0e10cSrcweir 		    const double fLogoWH = (double) aLogoSize.Width() / aLogoSize.Height();
435*cdf0e10cSrcweir 
436*cdf0e10cSrcweir 		    if( fLogoWH < ( (double) aVideoRect.GetWidth() / aVideoRect.GetHeight() ) )
437*cdf0e10cSrcweir 		    {
438*cdf0e10cSrcweir 			    aLogoSize.Width() = (long) ( aVideoRect.GetHeight() * fLogoWH );
439*cdf0e10cSrcweir 			    aLogoSize.Height()= aVideoRect.GetHeight();
440*cdf0e10cSrcweir 		    }
441*cdf0e10cSrcweir 		    else
442*cdf0e10cSrcweir 		    {
443*cdf0e10cSrcweir 			    aLogoSize.Width() = aVideoRect.GetWidth();
444*cdf0e10cSrcweir 			    aLogoSize.Height()= (long) ( aVideoRect.GetWidth() / fLogoWH );
445*cdf0e10cSrcweir 		    }
446*cdf0e10cSrcweir 		}
447*cdf0e10cSrcweir 
448*cdf0e10cSrcweir 		DrawBitmapEx( Point( aBasePos.X() + ( ( aVideoRect.GetWidth() - aLogoSize.Width() ) >> 1 ),
449*cdf0e10cSrcweir 							 aBasePos.Y() + ( ( aVideoRect.GetHeight() - aLogoSize.Height() ) >> 1 ) ),
450*cdf0e10cSrcweir 					  aLogoSize, *pLogo );
451*cdf0e10cSrcweir 	}
452*cdf0e10cSrcweir }
453*cdf0e10cSrcweir 
454*cdf0e10cSrcweir // ---------------------------------------------------------------------
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir void MediaWindowImpl::GetFocus()
457*cdf0e10cSrcweir {
458*cdf0e10cSrcweir }
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir // ---------------------------------------------------------------------
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir void MediaWindowImpl::MouseMove( const MouseEvent& rMEvt )
463*cdf0e10cSrcweir {
464*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir     if( pMediaWindow )
467*cdf0e10cSrcweir         pMediaWindow->MouseMove( rMEvt );
468*cdf0e10cSrcweir }
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir // ---------------------------------------------------------------------
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir void MediaWindowImpl::MouseButtonDown( const MouseEvent& rMEvt )
473*cdf0e10cSrcweir {
474*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir     if( pMediaWindow )
477*cdf0e10cSrcweir         pMediaWindow->MouseButtonDown( rMEvt );
478*cdf0e10cSrcweir }
479*cdf0e10cSrcweir 
480*cdf0e10cSrcweir // ---------------------------------------------------------------------
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir void MediaWindowImpl::MouseButtonUp( const MouseEvent& rMEvt )
483*cdf0e10cSrcweir {
484*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir     if( pMediaWindow )
487*cdf0e10cSrcweir         pMediaWindow->MouseButtonUp( rMEvt );
488*cdf0e10cSrcweir }
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir // ---------------------------------------------------------------------
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir void MediaWindowImpl::KeyInput( const KeyEvent& rKEvt )
493*cdf0e10cSrcweir {
494*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir     if( pMediaWindow )
497*cdf0e10cSrcweir         pMediaWindow->KeyInput( rKEvt );
498*cdf0e10cSrcweir }
499*cdf0e10cSrcweir 
500*cdf0e10cSrcweir // ---------------------------------------------------------------------
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir void MediaWindowImpl::KeyUp( const KeyEvent& rKEvt )
503*cdf0e10cSrcweir {
504*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir     if( pMediaWindow )
507*cdf0e10cSrcweir         pMediaWindow->KeyUp( rKEvt );
508*cdf0e10cSrcweir }
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir // ---------------------------------------------------------------------
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir void MediaWindowImpl::Command( const CommandEvent& rCEvt )
513*cdf0e10cSrcweir {
514*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir     if( pMediaWindow )
517*cdf0e10cSrcweir         pMediaWindow->Command( rCEvt );
518*cdf0e10cSrcweir }
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir // ---------------------------------------------------------------------
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir sal_Int8 MediaWindowImpl::AcceptDrop( const AcceptDropEvent& rEvt )
523*cdf0e10cSrcweir {
524*cdf0e10cSrcweir 	MediaWindow* pMediaWindow = getMediaWindow();
525*cdf0e10cSrcweir 	return( pMediaWindow ? pMediaWindow->AcceptDrop( rEvt ) : 0 );
526*cdf0e10cSrcweir }
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir // ---------------------------------------------------------------------
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir sal_Int8 MediaWindowImpl::ExecuteDrop( const ExecuteDropEvent& rEvt )
531*cdf0e10cSrcweir {
532*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
533*cdf0e10cSrcweir     return( pMediaWindow ? pMediaWindow->ExecuteDrop( rEvt ) : 0 );
534*cdf0e10cSrcweir }
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir // ---------------------------------------------------------------------
537*cdf0e10cSrcweir 
538*cdf0e10cSrcweir void MediaWindowImpl::StartDrag( sal_Int8 nAction, const Point& rPosPixel )
539*cdf0e10cSrcweir {
540*cdf0e10cSrcweir     MediaWindow* pMediaWindow = getMediaWindow();
541*cdf0e10cSrcweir 
542*cdf0e10cSrcweir     if( pMediaWindow )
543*cdf0e10cSrcweir         pMediaWindow->StartDrag( nAction, rPosPixel );
544*cdf0e10cSrcweir }
545*cdf0e10cSrcweir 
546*cdf0e10cSrcweir } // namespace priv
547*cdf0e10cSrcweir } // namespace avmedia
548