1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include "mediacontrol.hxx"
29 #include "mediacontrol.hrc"
30 #include "mediamisc.hxx"
31 #include <avmedia/mediawindow.hxx>
32 #include <avmedia/mediaplayer.hxx>
33 #include "helpids.hrc"
34 #include <tools/time.hxx>
35 #include <vcl/svapp.hxx>
36 #include <vcl/lstbox.hxx>
37 #include <unotools/syslocale.hxx>
38 #include <sfx2/viewfrm.hxx>
39 #include <math.h>
40 #include <algorithm>
41 
42 #define AVMEDIA_TIMEOUT				100
43 #define AVMEDIA_TIME_RANGE 			2048
44 #define AVMEDIA_DB_RANGE 			-40
45 #define AVMEDIA_LINEINCREMENT		1.0
46 #define AVMEDIA_PAGEINCREMENT		10.0
47 
48 #define AVMEDIA_TOOLBOXITEM_PLAY 	0x0001
49 #define AVMEDIA_TOOLBOXITEM_PLAYFFW 0x0002
50 #define AVMEDIA_TOOLBOXITEM_PAUSE 	0x0004
51 #define AVMEDIA_TOOLBOXITEM_STOP 	0x0008
52 #define AVMEDIA_TOOLBOXITEM_MUTE	0x0010
53 #define AVMEDIA_TOOLBOXITEM_LOOP	0x0011
54 #define AVMEDIA_TOOLBOXITEM_ZOOM	0x0012
55 #define AVMEDIA_TOOLBOXITEM_OPEN 	0x0014
56 #define AVMEDIA_TOOLBOXITEM_INSERT 	0x0018
57 
58 #define AVMEDIA_ZOOMLEVEL_50		0
59 #define AVMEDIA_ZOOMLEVEL_100		1
60 #define AVMEDIA_ZOOMLEVEL_200		2
61 #define AVMEDIA_ZOOMLEVEL_FIT		3
62 #define AVMEDIA_ZOOMLEVEL_SCALED	4
63 #define AVMEDIA_ZOOMLEVEL_INVALID	65535
64 
65 namespace avmedia
66 {
67 
68 // ----------------
69 // - MediaControl -
70 // ---------------
71 
72 MediaControl::MediaControl( Window* pParent, MediaControlStyle eControlStyle ) :
73     Control( pParent ),
74 	maImageList( AVMEDIA_RESID( AVMEDIA_IMGLST ) ),
75 	maItem( 0, AVMEDIA_SETMASK_ALL ),
76     maPlayToolBox( this, WB_3DLOOK ),
77 	maTimeSlider( this, WB_HORZ | WB_DRAG | WB_3DLOOK | WB_SLIDERSET ),
78     maMuteToolBox( this, WB_3DLOOK ),
79 	maVolumeSlider( this, WB_HORZ | WB_DRAG | WB_SLIDERSET ),
80 	maZoomToolBox( this, WB_3DLOOK ),
81 	mpZoomListBox( new ListBox( &maZoomToolBox, WB_BORDER | WB_DROPDOWN | WB_AUTOHSCROLL | WB_3DLOOK ) ),
82     maTimeEdit( this, WB_CENTER | WB_READONLY | WB_BORDER | WB_3DLOOK | WB_READONLY ),
83 	meControlStyle( eControlStyle ),
84 	mbLocked( false )
85 {
86     const String aTimeText( RTL_CONSTASCII_USTRINGPARAM( " 00:00:00/00:00:00 " ) );
87 
88 	SetBackground();
89     SetPaintTransparent( sal_True );
90     SetParentClipMode( PARENTCLIPMODE_NOCLIP );
91 
92     if( MEDIACONTROLSTYLE_SINGLELINE != meControlStyle )
93 	{
94     	maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_OPEN, implGetImage( AVMEDIA_IMG_OPEN ), String( AVMEDIA_RESID( AVMEDIA_STR_OPEN ) ) );
95     	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_OPEN, HID_AVMEDIA_TOOLBOXITEM_OPEN );
96 
97     	maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_INSERT, implGetImage( AVMEDIA_IMG_INSERT ), String( AVMEDIA_RESID( AVMEDIA_STR_INSERT ) ) );
98     	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_INSERT, HID_AVMEDIA_TOOLBOXITEM_INSERT );
99 
100 		maPlayToolBox.InsertSeparator();
101 	}
102 	else
103 	{
104 		mpZoomListBox->SetBackground();
105 
106 		maZoomToolBox.SetBackground();
107 		maZoomToolBox.SetPaintTransparent( sal_True );
108 		maPlayToolBox.SetBackground();
109 		maPlayToolBox.SetPaintTransparent( sal_True );
110 		maMuteToolBox.SetBackground();
111 		maMuteToolBox.SetPaintTransparent( sal_True );
112 
113 	}
114 
115     maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_PLAY, implGetImage( AVMEDIA_IMG_PLAY ), String( AVMEDIA_RESID( AVMEDIA_STR_PLAY ) ), TIB_CHECKABLE );
116    	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_PLAY, HID_AVMEDIA_TOOLBOXITEM_PLAY );
117 
118 	maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_PAUSE, implGetImage( AVMEDIA_IMG_PAUSE ), String( AVMEDIA_RESID( AVMEDIA_STR_PAUSE ) ), TIB_CHECKABLE );
119    	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_PAUSE, HID_AVMEDIA_TOOLBOXITEM_PAUSE );
120 
121 	maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_STOP, implGetImage( AVMEDIA_IMG_STOP ), String( AVMEDIA_RESID( AVMEDIA_STR_STOP ) ), TIB_CHECKABLE );
122    	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_STOP, HID_AVMEDIA_TOOLBOXITEM_STOP );
123 
124 	maPlayToolBox.InsertSeparator();
125 
126     maPlayToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_LOOP, implGetImage( AVMEDIA_IMG_ENDLESS ), String( AVMEDIA_RESID( AVMEDIA_STR_ENDLESS ) ) );
127    	maPlayToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_LOOP, HID_AVMEDIA_TOOLBOXITEM_LOOP );
128 
129 	if( MEDIACONTROLSTYLE_SINGLELINE == meControlStyle )
130 		maPlayToolBox.InsertSeparator();
131 
132     maPlayToolBox.SetSelectHdl( LINK( this, MediaControl, implSelectHdl ) );
133     maPlayToolBox.SetSizePixel( maPlayToolBox.CalcWindowSizePixel() );
134     maPlayToolBox.Show();
135 	maMinSize = maPlayToolBox.GetSizePixel();
136 
137     maTimeSlider.SetSlideHdl( LINK( this, MediaControl, implTimeHdl ) );
138     maTimeSlider.SetEndSlideHdl( LINK( this, MediaControl, implTimeEndHdl ) );
139     maTimeSlider.SetRange( Range( 0, AVMEDIA_TIME_RANGE ) );
140 	maTimeSlider.SetHelpId( HID_AVMEDIA_TIMESLIDER );
141     maTimeSlider.SetUpdateMode( true );
142     maTimeSlider.SetSizePixel( Size( 128, maPlayToolBox.GetSizePixel().Height() ) );
143     maTimeSlider.Show();
144 	maMinSize.Width() += maTimeSlider.GetSizePixel().Width();
145 
146     maTimeEdit.SetText( aTimeText );
147     maTimeEdit.SetUpdateMode( true );
148     maTimeEdit.SetSizePixel( Size( maTimeEdit.GetTextWidth( aTimeText ) + 8, maPlayToolBox.GetSizePixel().Height() ) );
149 	maTimeEdit.SetControlBackground( Application::GetSettings().GetStyleSettings().GetWindowColor() );
150 	maTimeEdit.SetHelpId( HID_AVMEDIA_TIMEEDIT );
151 	maTimeEdit.Disable();
152     maTimeEdit.Show();
153 	maMinSize.Width() += maTimeEdit.GetSizePixel().Width();
154 
155 	if( MEDIACONTROLSTYLE_SINGLELINE == meControlStyle )
156 		maMuteToolBox.InsertSeparator();
157 
158     maMuteToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_MUTE, implGetImage( AVMEDIA_IMG_MUTE ), String( AVMEDIA_RESID( AVMEDIA_STR_MUTE ) ) );
159    	maMuteToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_MUTE, HID_AVMEDIA_TOOLBOXITEM_MUTE );
160 
161 	maMuteToolBox.SetSelectHdl( LINK( this, MediaControl, implSelectHdl ) );
162     maMuteToolBox.SetSizePixel( maMuteToolBox.CalcWindowSizePixel() );
163     maMuteToolBox.Show();
164 	maMinSize.Width() += maMuteToolBox.GetSizePixel().Width();
165 
166     maVolumeSlider.SetSlideHdl( LINK( this, MediaControl, implVolumeHdl ) );
167     maVolumeSlider.SetEndSlideHdl( LINK( this, MediaControl, implVolumeEndHdl ) );
168     maVolumeSlider.SetRange( Range( AVMEDIA_DB_RANGE, 0 ) );
169     maVolumeSlider.SetUpdateMode( true );
170     maVolumeSlider.SetHelpId( HID_AVMEDIA_VOLUMESLIDER );
171     maVolumeSlider.SetSizePixel( Size( 48, maPlayToolBox.GetSizePixel().Height() ) );
172 	maVolumeSlider.Show();
173 	maMinSize.Width() += maVolumeSlider.GetSizePixel().Width();
174 
175 	mpZoomListBox->SetSizePixel( Size( maTimeEdit.GetSizePixel().Width(), 260 ) );
176 	mpZoomListBox->InsertEntry( String( AVMEDIA_RESID( AVMEDIA_STR_ZOOM_50 ) ), AVMEDIA_ZOOMLEVEL_50 );
177 	mpZoomListBox->InsertEntry( String( AVMEDIA_RESID( AVMEDIA_STR_ZOOM_100 ) ), AVMEDIA_ZOOMLEVEL_100 );
178 	mpZoomListBox->InsertEntry( String( AVMEDIA_RESID( AVMEDIA_STR_ZOOM_200 ) ), AVMEDIA_ZOOMLEVEL_200 );
179 	mpZoomListBox->InsertEntry( String( AVMEDIA_RESID( AVMEDIA_STR_ZOOM_FIT ) ), AVMEDIA_ZOOMLEVEL_FIT );
180     mpZoomListBox->SetSelectHdl( LINK( this, MediaControl, implZoomSelectHdl ) );
181     mpZoomListBox->SetHelpId( HID_AVMEDIA_ZOOMLISTBOX );
182 
183     maZoomToolBox.InsertItem( AVMEDIA_TOOLBOXITEM_ZOOM, String( AVMEDIA_RESID( AVMEDIA_STR_ZOOM ) ) );
184     maZoomToolBox.SetHelpId( AVMEDIA_TOOLBOXITEM_ZOOM, HID_AVMEDIA_ZOOMLISTBOX );
185 
186     maZoomToolBox.SetItemWindow( AVMEDIA_TOOLBOXITEM_ZOOM, mpZoomListBox );
187 	maZoomToolBox.SetSelectHdl( LINK( this, MediaControl, implSelectHdl ) );
188     maZoomToolBox.SetSizePixel( maZoomToolBox.CalcWindowSizePixel() );
189     maZoomToolBox.Show();
190 	maMinSize.Width() += maZoomToolBox.GetSizePixel().Width();
191 
192 	if( MEDIACONTROLSTYLE_MULTILINE == meControlStyle )
193 	{
194 		maMinSize.Width() = 256;
195 		maMinSize.Height() = ( maMinSize.Height() << 1 ) + AVMEDIA_CONTROLOFFSET;
196 	}
197 
198 	maTimer.SetTimeout( AVMEDIA_TIMEOUT );
199     maTimer.SetTimeoutHdl( LINK( this, MediaControl, implTimeoutHdl ) );
200 	maTimer.Start();
201 }
202 
203 // ------------------------------------------------------------------------------
204 
205 MediaControl::~MediaControl()
206 {
207     maZoomToolBox.SetItemWindow( AVMEDIA_TOOLBOXITEM_ZOOM, NULL );
208 	delete mpZoomListBox;
209 }
210 
211 // ------------------------------------------------------------------------------
212 
213 const Size&	MediaControl::getMinSizePixel() const
214 {
215 	return maMinSize;
216 }
217 
218 // ------------------------------------------------------------------------------
219 
220 void MediaControl::Resize()
221 {
222 	Point 			aPos( 0, 0 );
223 	const sal_Int32	nPlayToolBoxWidth = maPlayToolBox.GetSizePixel().Width();
224 	const sal_Int32	nMuteToolBoxWidth = maMuteToolBox.GetSizePixel().Width();
225 	const sal_Int32	nVolumeSliderWidth = maVolumeSlider.GetSizePixel().Width();
226 	const sal_Int32 nZoomToolBoxWidth = maZoomToolBox.GetSizePixel().Width();
227 	const sal_Int32	nTimeEditWidth = maTimeEdit.GetSizePixel().Width();
228 	const sal_Int32	nTimeSliderHeight = maTimeSlider.GetSizePixel().Height();
229 
230 	if( MEDIACONTROLSTYLE_SINGLELINE == meControlStyle )
231 	{
232 		const sal_Int32	nTimeSliderWidth = GetSizePixel().Width() - ( AVMEDIA_CONTROLOFFSET * 3 ) -
233 										   nPlayToolBoxWidth - nMuteToolBoxWidth - nVolumeSliderWidth - nTimeEditWidth - nZoomToolBoxWidth;
234 
235 		maPlayToolBox.SetPosSizePixel( aPos, maPlayToolBox.GetSizePixel() );
236 
237 		aPos.X() += nPlayToolBoxWidth;
238 		maTimeSlider.SetPosSizePixel( aPos, Size( nTimeSliderWidth, nTimeSliderHeight ) );
239 
240 		aPos.X() += nTimeSliderWidth + AVMEDIA_CONTROLOFFSET;
241 		maTimeEdit.SetPosSizePixel( aPos, maTimeEdit.GetSizePixel() );
242 
243 		aPos.X() += nTimeEditWidth + AVMEDIA_CONTROLOFFSET;
244 		maMuteToolBox.SetPosSizePixel( aPos, maMuteToolBox.GetSizePixel() );
245 
246 		aPos.X() += nMuteToolBoxWidth;
247 		maVolumeSlider.SetPosSizePixel( aPos, maVolumeSlider.GetSizePixel() );
248 
249 		aPos.X() += nVolumeSliderWidth + AVMEDIA_CONTROLOFFSET;
250 		maZoomToolBox.SetPosSizePixel( aPos, maZoomToolBox.GetSizePixel() );
251 	}
252 	else
253 	{
254 		const sal_Int32	nTimeSliderWidth = GetSizePixel().Width() - AVMEDIA_CONTROLOFFSET - nTimeEditWidth;
255 
256 		maTimeSlider.SetPosSizePixel( aPos, Size( nTimeSliderWidth, nTimeSliderHeight ) );
257 
258 		aPos.X() += nTimeSliderWidth + AVMEDIA_CONTROLOFFSET;
259 		maTimeEdit.SetPosSizePixel( aPos, maTimeEdit.GetSizePixel() );
260 
261 		aPos.X() = 0;
262 		aPos.Y() += nTimeSliderHeight + AVMEDIA_CONTROLOFFSET;
263 		maPlayToolBox.SetPosSizePixel( aPos, maPlayToolBox.GetSizePixel() );
264 
265 		aPos.X() = GetSizePixel().Width() - nVolumeSliderWidth - nMuteToolBoxWidth - nZoomToolBoxWidth - AVMEDIA_CONTROLOFFSET;
266 		maMuteToolBox.SetPosSizePixel( aPos, maMuteToolBox.GetSizePixel() );
267 
268 		aPos.X() += nMuteToolBoxWidth;
269 		maVolumeSlider.SetPosSizePixel( aPos, maVolumeSlider.GetSizePixel() );
270 
271 		aPos.X() = GetSizePixel().Width() - nZoomToolBoxWidth;
272 		maZoomToolBox.SetPosSizePixel( aPos, maZoomToolBox.GetSizePixel() );
273 	}
274 }
275 
276 // ------------------------------------------------------------------------------
277 
278 void MediaControl::setState( const MediaItem& rItem )
279 {
280     if( !mbLocked )
281     {
282 	    maItem.merge( rItem );
283 
284 	    implUpdateToolboxes();
285 	    implUpdateTimeSlider();
286 	    implUpdateVolumeSlider();
287 	    implUpdateTimeField( maItem.getTime() );
288 	}
289 }
290 
291 // ------------------------------------------------------------------------------
292 
293 void MediaControl::getState( MediaItem& rItem ) const
294 {
295 	rItem.merge( maItem );
296 }
297 
298 // ------------------------------------------------------------------------------
299 
300 void MediaControl::update()
301 {
302 }
303 
304 // ------------------------------------------------------------------------------
305 
306 void MediaControl::execute( const MediaItem& )
307 {
308 }
309 
310 // ------------------------------------------------------------------------------
311 
312 void MediaControl::implUpdateToolboxes()
313 {
314 	const bool bValidURL = ( maItem.getURL().getLength() > 0 );
315 
316 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_INSERT, bValidURL );
317 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_PLAY, bValidURL );
318 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_PLAYFFW, bValidURL );
319 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_PAUSE, bValidURL );
320 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_STOP, bValidURL );
321 	maPlayToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_LOOP, bValidURL );
322 	maMuteToolBox.EnableItem( AVMEDIA_TOOLBOXITEM_MUTE, bValidURL );
323 
324 	if( !bValidURL || !IsEnabled() )
325 	{
326 		mpZoomListBox->Disable();
327 
328         if( MEDIACONTROLSTYLE_SINGLELINE == meControlStyle )
329     	    maPlayToolBox.Disable();
330 
331         maMuteToolBox.Disable();
332 	}
333 	else
334 	{
335 	    maPlayToolBox.Enable();
336 	    maMuteToolBox.Enable();
337 
338 		if( MEDIASTATE_PLAY == maItem.getState() || MEDIASTATE_PLAYFFW == maItem.getState() )
339 		{
340 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAY, true );
341 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAYFFW, MEDIASTATE_PLAYFFW == maItem.getState() );
342 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PAUSE, false );
343 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_STOP, false );
344 		}
345 		else if( maItem.getTime() > 0.0 && ( maItem.getTime() < maItem.getDuration() ) )
346 		{
347 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAY, false );
348 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAYFFW, false );
349 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PAUSE, true );
350 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_STOP, false );
351 		}
352 		else
353 		{
354 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAY, false );
355 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PLAYFFW, false );
356 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_PAUSE, false );
357 			maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_STOP, true );
358 		}
359 
360 		maPlayToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_LOOP, maItem.isLoop() );
361 		maMuteToolBox.CheckItem( AVMEDIA_TOOLBOXITEM_MUTE, maItem.isMute() );
362 
363 		if( !mpZoomListBox->IsTravelSelect() && !mpZoomListBox->IsInDropDown() )
364 		{
365 			sal_uInt16 nSelectEntryPos ;
366 
367 			switch( maItem.getZoom() )
368 			{
369 				case( ::com::sun::star::media::ZoomLevel_ZOOM_1_TO_2 ): nSelectEntryPos = AVMEDIA_ZOOMLEVEL_50; break;
370 				case( ::com::sun::star::media::ZoomLevel_ORIGINAL ): nSelectEntryPos = AVMEDIA_ZOOMLEVEL_100; break;
371 				case( ::com::sun::star::media::ZoomLevel_ZOOM_2_TO_1 ): nSelectEntryPos = AVMEDIA_ZOOMLEVEL_200; break;
372 				case( ::com::sun::star::media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT ): nSelectEntryPos = AVMEDIA_ZOOMLEVEL_FIT; break;
373 				case( ::com::sun::star::media::ZoomLevel_FIT_TO_WINDOW ): nSelectEntryPos = AVMEDIA_ZOOMLEVEL_SCALED; break;
374 
375 				default: nSelectEntryPos = AVMEDIA_ZOOMLEVEL_INVALID; break;
376 			}
377 
378 			if( nSelectEntryPos != AVMEDIA_ZOOMLEVEL_INVALID )
379 			{
380 				mpZoomListBox->Enable();
381 				mpZoomListBox->SelectEntryPos( nSelectEntryPos );
382 			}
383 			else
384 				mpZoomListBox->Disable();
385 		}
386 	}
387 }
388 
389 // ------------------------------------------------------------------------------
390 
391 void MediaControl::implUpdateTimeSlider()
392 {
393 	if( !maItem.getURL().getLength() || !IsEnabled() )
394 		maTimeSlider.Disable();
395 	else
396 	{
397 		maTimeSlider.Enable();
398 
399 		const double fDuration = maItem.getDuration();
400 
401 		if( fDuration > 0.0 )
402 		{
403 			const double fTime = ::std::min( maItem.getTime(), fDuration );
404 
405 			if( !maTimeSlider.GetLineSize() )
406 				maTimeSlider.SetLineSize( static_cast< sal_uInt32 >( AVMEDIA_TIME_RANGE * AVMEDIA_LINEINCREMENT / fDuration ) );
407 
408 			if( !maTimeSlider.GetPageSize() )
409 				maTimeSlider.SetPageSize( static_cast< sal_uInt32 >( AVMEDIA_TIME_RANGE * AVMEDIA_PAGEINCREMENT / fDuration ) );
410 
411 			maTimeSlider.SetThumbPos( static_cast< sal_Int32 >( fTime / fDuration * AVMEDIA_TIME_RANGE ) );
412 		}
413 	}
414 }
415 
416 // ------------------------------------------------------------------------------
417 
418 void MediaControl::implUpdateVolumeSlider()
419 {
420 	if( !maItem.getURL().getLength() || !IsEnabled() )
421 		maVolumeSlider.Disable();
422 	else
423 	{
424 		maVolumeSlider.Enable();
425 
426 		const sal_Int32 nVolumeDB = maItem.getVolumeDB();
427 
428 		maVolumeSlider.SetThumbPos( ::std::min( ::std::max( nVolumeDB, static_cast< sal_Int32 >( AVMEDIA_DB_RANGE ) ),
429 												static_cast< sal_Int32 >( 0 ) ) );
430 	}
431 }
432 
433 // ------------------------------------------------------------------------------
434 
435 void MediaControl::implUpdateTimeField( double fCurTime )
436 {
437     if( maItem.getURL().getLength() > 0 )
438 	{
439 		String				aTimeString;
440 
441         SvtSysLocale aSysLocale;
442         const LocaleDataWrapper& rLocaleData = aSysLocale.GetLocaleData();
443 
444         aTimeString += rLocaleData.getDuration( Time( 0, 0, static_cast< sal_uInt32 >( floor( fCurTime ) ) ) );
445 		aTimeString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
446         aTimeString += rLocaleData.getDuration( Time( 0, 0, static_cast< sal_uInt32 >( floor( maItem.getDuration() ) )) );
447 
448 		if( maTimeEdit.GetText() != aTimeString )
449 		    maTimeEdit.SetText( aTimeString );
450 	}
451 }
452 
453 // ------------------------------------------------------------------------------
454 
455 Image MediaControl::implGetImage( sal_Int32 nImageId ) const
456 {
457 	return maImageList.GetImage( static_cast< sal_uInt16 >( nImageId ) );
458 }
459 
460 // ------------------------------------------------------------------------------
461 
462 IMPL_LINK( MediaControl, implTimeHdl, Slider*, p )
463 {
464     mbLocked = true;
465 	maTimer.Stop();
466 	implUpdateTimeField( p->GetThumbPos() * maItem.getDuration() / AVMEDIA_TIME_RANGE );
467 
468 	return 0;
469 }
470 
471 // ------------------------------------------------------------------------------
472 
473 IMPL_LINK( MediaControl, implTimeEndHdl, Slider*, p )
474 {
475 	MediaItem aExecItem;
476 
477 	aExecItem.setTime( p->GetThumbPos() * maItem.getDuration() / AVMEDIA_TIME_RANGE );
478 	execute( aExecItem );
479 	update();
480 	maTimer.Start();
481 	mbLocked = false;
482 
483 	return 0;
484 }
485 
486 // ------------------------------------------------------------------------------
487 
488 IMPL_LINK( MediaControl, implVolumeHdl, Slider*, p )
489 {
490 	MediaItem aExecItem;
491 
492 	aExecItem.setVolumeDB( static_cast< sal_Int16 >( p->GetThumbPos() ) );
493 	execute( aExecItem );
494 	update();
495 
496 	return 0;
497 }
498 
499 // ------------------------------------------------------------------------------
500 
501 IMPL_LINK( MediaControl, implVolumeEndHdl, Slider*, EMPTYARG )
502 {
503 	return 0;
504 }
505 
506 // ------------------------------------------------------------------------------
507 
508 IMPL_LINK( MediaControl, implSelectHdl, ToolBox*, p )
509 {
510     if( p )
511     {
512 		MediaItem aExecItem;
513 
514 		switch( p->GetCurItemId() )
515         {
516 			case( AVMEDIA_TOOLBOXITEM_OPEN ):
517 			{
518 				::rtl::OUString aURL;
519 
520 				 if( ::avmedia::MediaWindow::executeMediaURLDialog( GetParent(), aURL, false ) )
521 				 {
522 				 	if( !::avmedia::MediaWindow::isMediaURL( aURL, true ) )
523 						::avmedia::MediaWindow::executeFormatErrorBox( this );
524 					else
525 					{
526 						aExecItem.setURL( aURL );
527 						aExecItem.setState( MEDIASTATE_PLAY );
528 					}
529 				}
530 			}
531 			break;
532 
533 			case( AVMEDIA_TOOLBOXITEM_INSERT ):
534 			{
535 				MediaFloater* pFloater = AVMEDIA_MEDIAWINDOW();
536 
537 				if( pFloater )
538 					pFloater->dispatchCurrentURL();
539 			}
540 			break;
541 
542 			case( AVMEDIA_TOOLBOXITEM_PLAY ):
543 			case( AVMEDIA_TOOLBOXITEM_PLAYFFW ):
544             {
545 				aExecItem.setState( ( AVMEDIA_TOOLBOXITEM_PLAYFFW == p->GetCurItemId() ) ? MEDIASTATE_PLAYFFW : MEDIASTATE_PLAY );
546 
547                 if( maItem.getTime() == maItem.getDuration() )
548 					aExecItem.setTime( 0.0 );
549 				else
550 					aExecItem.setTime( maItem.getTime() );
551             }
552             break;
553 
554             case( AVMEDIA_TOOLBOXITEM_PAUSE ):
555 			{
556 				aExecItem.setState( MEDIASTATE_PAUSE );
557 			}
558             break;
559 
560 			case( AVMEDIA_TOOLBOXITEM_STOP ):
561             {
562 				aExecItem.setState( MEDIASTATE_STOP );
563 				aExecItem.setTime( 0.0 );
564             }
565             break;
566 
567             case( AVMEDIA_TOOLBOXITEM_MUTE ):
568 			{
569                 aExecItem.setMute( !maMuteToolBox.IsItemChecked( AVMEDIA_TOOLBOXITEM_MUTE ) );
570 			}
571             break;
572 
573             case( AVMEDIA_TOOLBOXITEM_LOOP ):
574 			{
575                 aExecItem.setLoop( !maPlayToolBox.IsItemChecked( AVMEDIA_TOOLBOXITEM_LOOP ) );
576 			}
577             break;
578 
579             default:
580             break;
581         }
582 
583 		if( aExecItem.getMaskSet() != AVMEDIA_SETMASK_NONE )
584 			execute( aExecItem );
585     }
586 
587 	update();
588 	p->Invalidate( INVALIDATE_UPDATE );
589 
590     return 0;
591 }
592 
593 // ------------------------------------------------------------------------------
594 
595 IMPL_LINK( MediaControl, implZoomSelectHdl, ListBox*, p )
596 {
597     if( p )
598     {
599 		MediaItem aExecItem;
600 		::com::sun::star::media::ZoomLevel eLevel;
601 
602 		switch( p->GetSelectEntryPos() )
603 		{
604 			case( AVMEDIA_ZOOMLEVEL_50 ): eLevel = ::com::sun::star::media::ZoomLevel_ZOOM_1_TO_2; break;
605 			case( AVMEDIA_ZOOMLEVEL_100 ): eLevel = ::com::sun::star::media::ZoomLevel_ORIGINAL; break;
606 			case( AVMEDIA_ZOOMLEVEL_200 ): eLevel = ::com::sun::star::media::ZoomLevel_ZOOM_2_TO_1; break;
607 			case( AVMEDIA_ZOOMLEVEL_FIT ): eLevel = ::com::sun::star::media::ZoomLevel_FIT_TO_WINDOW_FIXED_ASPECT; break;
608 			case( AVMEDIA_ZOOMLEVEL_SCALED ): eLevel = ::com::sun::star::media::ZoomLevel_FIT_TO_WINDOW; break;
609 
610 			default: eLevel = ::com::sun::star::media::ZoomLevel_NOT_AVAILABLE; break;
611 		}
612 
613 		aExecItem.setZoom( eLevel );
614 		execute( aExecItem );
615 		update();
616 	}
617 
618 	return 0;
619 }
620 
621 // ------------------------------------------------------------------------------
622 
623 IMPL_LINK( MediaControl, implTimeoutHdl, Timer*, EMPTYARG )
624 {
625 	update();
626 	maTimer.Start();
627 
628 	return 0;
629 }
630 
631 }
632