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