]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/interface.cpp
Beginning of an improved streaming wizard. Do not use at the moment
[vlc] / modules / gui / wxwindows / interface.cpp
1 /*****************************************************************************
2  * interface.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2004, 2003 VideoLAN
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <vlc/vlc.h>
28 #include <vlc/aout.h>
29 #include <vlc/vout.h>
30 #include <vlc/intf.h>
31 #include "stream_control.h"
32
33 #include "wxwindows.h"
34
35 /* include the toolbar graphics */
36 #include "bitmaps/play.xpm"
37 #include "bitmaps/pause.xpm"
38 #include "bitmaps/stop.xpm"
39 #include "bitmaps/prev.xpm"
40 #include "bitmaps/next.xpm"
41 #include "bitmaps/eject.xpm"
42 #include "bitmaps/slow.xpm"
43 #include "bitmaps/fast.xpm"
44 #include "bitmaps/speaker.xpm"
45
46 #define TOOLBAR_BMP_WIDTH 16
47 #define TOOLBAR_BMP_HEIGHT 16
48
49 /* include the icon graphic */
50 #include "../../../share/vlc32x32.xpm"
51
52 /*****************************************************************************
53  * Local class declarations.
54  *****************************************************************************/
55 class wxMenuExt: public wxMenu
56 {
57 public:
58     /* Constructor */
59     wxMenuExt( wxMenu* parentMenu, int id, const wxString& text,
60                    const wxString& helpString, wxItemKind kind,
61                    char *_psz_var, int _i_object_id, vlc_value_t _val,
62                    int _i_val_type );
63
64     virtual ~wxMenuExt() {};
65
66     char *psz_var;
67     int  i_val_type;
68     int  i_object_id;
69     vlc_value_t val;
70
71 private:
72
73 };
74
75 class wxVolCtrl: public wxGauge
76 {
77 public:
78     /* Constructor */
79     wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id,
80                wxPoint = wxDefaultPosition, wxSize = wxSize( 20, -1 ) );
81     virtual ~wxVolCtrl() {};
82
83     void Change( int i_volume );
84
85     void OnChange( wxMouseEvent& event );
86
87 private:
88     intf_thread_t *p_intf;
89
90     DECLARE_EVENT_TABLE();
91 };
92
93 BEGIN_EVENT_TABLE(wxVolCtrl, wxWindow)
94     /* Mouse events */
95     EVT_LEFT_DOWN(wxVolCtrl::OnChange)
96     EVT_MOTION(wxVolCtrl::OnChange)
97 END_EVENT_TABLE()
98
99 /*****************************************************************************
100  * Event Table.
101  *****************************************************************************/
102
103 DEFINE_LOCAL_EVENT_TYPE( wxEVT_INTF );
104
105 /* IDs for the controls and the menu commands */
106 enum
107 {
108     /* menu items */
109     MenuDummy_Event = wxID_HIGHEST + 1000,
110     Exit_Event = wxID_HIGHEST,
111     OpenFileSimple_Event,
112     OpenAdv_Event,
113     OpenFile_Event,
114     OpenDisc_Event,
115     OpenNet_Event,
116     OpenSat_Event,
117     OpenOther_Event,
118     EjectDisc_Event,
119
120     StreamWizard_Event,
121     Wizard_Event,
122
123     Playlist_Event,
124     Logs_Event,
125     FileInfo_Event,
126
127     Prefs_Event,
128     Extended_Event,
129     Bookmarks_Event,
130     Skins_Event,
131
132     SliderScroll_Event,
133     StopStream_Event,
134     PlayStream_Event,
135     PrevStream_Event,
136     NextStream_Event,
137     SlowStream_Event,
138     FastStream_Event,
139
140     Adjust_Event,
141     Hue_Event,
142     Contrast_Event,
143     Brightness_Event,
144     Saturation_Event,
145     Gamma_Event,
146
147     Ratio_Event,
148     Visual_Event,
149
150     /* it is important for the id corresponding to the "About" command to have
151      * this standard value as otherwise it won't be handled properly under Mac
152      * (where it is special and put into the "Apple" menu) */
153     About_Event = wxID_ABOUT
154 };
155
156 BEGIN_EVENT_TABLE(Interface, wxFrame)
157     /* Menu events */
158     EVT_MENU(Exit_Event, Interface::OnExit)
159     EVT_MENU(About_Event, Interface::OnAbout)
160
161     EVT_MENU(Playlist_Event, Interface::OnShowDialog)
162     EVT_MENU(Logs_Event, Interface::OnShowDialog)
163     EVT_MENU(FileInfo_Event, Interface::OnShowDialog)
164     EVT_MENU(Prefs_Event, Interface::OnShowDialog)
165
166     EVT_MENU_OPEN(Interface::OnMenuOpen)
167
168     EVT_MENU( Extended_Event, Interface::OnExtended)
169     EVT_MENU( Bookmarks_Event, Interface::OnShowDialog)
170
171     EVT_CHECKBOX( Adjust_Event, Interface::OnEnableAdjust)
172     EVT_TEXT( Ratio_Event, Interface::OnRatio)
173     EVT_CHECKBOX( Visual_Event, Interface::OnEnableVisual)
174
175 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
176     EVT_CONTEXT_MENU(Interface::OnContextMenu2)
177 #endif
178     EVT_RIGHT_UP(Interface::OnContextMenu)
179
180     /* Toolbar events */
181     EVT_MENU(OpenFileSimple_Event, Interface::OnShowDialog)
182     EVT_MENU(OpenAdv_Event, Interface::OnShowDialog)
183     EVT_MENU(OpenFile_Event, Interface::OnShowDialog)
184     EVT_MENU(OpenDisc_Event, Interface::OnShowDialog)
185     EVT_MENU(OpenNet_Event, Interface::OnShowDialog)
186     EVT_MENU(OpenSat_Event, Interface::OnShowDialog)
187     EVT_MENU(StreamWizard_Event, Interface::OnShowDialog)
188     EVT_MENU(Wizard_Event, Interface::OnShowDialog)
189     EVT_MENU(StopStream_Event, Interface::OnStopStream)
190     EVT_MENU(PlayStream_Event, Interface::OnPlayStream)
191     EVT_MENU(PrevStream_Event, Interface::OnPrevStream)
192     EVT_MENU(NextStream_Event, Interface::OnNextStream)
193     EVT_MENU(SlowStream_Event, Interface::OnSlowStream)
194     EVT_MENU(FastStream_Event, Interface::OnFastStream)
195
196     /* Slider events */
197     EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate)
198
199     EVT_COMMAND_SCROLL(Hue_Event, Interface::OnHueUpdate)
200     EVT_COMMAND_SCROLL(Contrast_Event, Interface::OnContrastUpdate)
201     EVT_COMMAND_SCROLL(Brightness_Event, Interface::OnBrightnessUpdate)
202     EVT_COMMAND_SCROLL(Saturation_Event, Interface::OnSaturationUpdate)
203     EVT_COMMAND_SCROLL(Gamma_Event, Interface::OnGammaUpdate)
204
205     /* Custom events */
206     EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent)
207     EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent)
208
209 END_EVENT_TABLE()
210
211 /*****************************************************************************
212  * Constructor.
213  *****************************************************************************/
214 Interface::Interface( intf_thread_t *_p_intf ):
215     wxFrame( NULL, -1, wxT("VLC media player"),
216              wxDefaultPosition, wxSize(700,100), wxDEFAULT_FRAME_STYLE )
217 {
218     /* Initializations */
219     p_intf = _p_intf;
220     i_old_playing_status = PAUSE_S;
221     b_extra = VLC_FALSE;
222
223     /* Give our interface a nice little icon */
224     SetIcon( wxIcon( vlc_xpm ) );
225
226     /* Create a sizer for the main frame */
227     frame_sizer = new wxBoxSizer( wxVERTICAL );
228     SetSizer( frame_sizer );
229
230     /* Create a dummy widget that can get the keyboard focus */
231     wxWindow *p_dummy = new wxWindow( this, 0, wxDefaultPosition,
232                                       wxSize(0,0) );
233     p_dummy->SetFocus();
234     frame_sizer->Add( p_dummy, 0, wxEXPAND );
235
236     /* Creation of the menu bar */
237     CreateOurMenuBar();
238
239     /* Creation of the tool bar */
240     CreateOurToolBar();
241
242     /* Create the extra panel */
243     CreateOurExtendedPanel();
244     frame_sizer->Add( extra_frame, 0, wxEXPAND , 0 );
245     frame_sizer->Hide( extra_frame );
246
247     /* Creation of the status bar
248      * Helptext for menu items and toolbar tools will automatically get
249      * displayed here. */
250     int i_status_width[3] = {-6, -2, -9};
251     statusbar = CreateStatusBar( 3 );                            /* 2 fields */
252     statusbar->SetStatusWidths( 3, i_status_width );
253     statusbar->SetStatusText( wxString::Format(wxT("x%.2f"), 1.0), 1 );
254
255     /* Video window */
256     if( config_GetInt( p_intf, "wxwin-embed" ) )
257     {
258         VideoWindow( p_intf, this );
259         frame_sizer->Add( p_intf->p_sys->p_video_sizer, 1, wxEXPAND , 0 );
260     }
261
262     /* Creation of the slider sub-window */
263     CreateOurSlider();
264     frame_sizer->Add( slider_frame, 0, wxEXPAND , 0 );
265     frame_sizer->Hide( slider_frame );
266
267     /* Make sure we've got the right background colour */
268     SetBackgroundColour( slider_frame->GetBackgroundColour() );
269
270     /* Layout everything */
271     frame_sizer->Layout();
272     frame_sizer->Fit(this);
273
274 #if !defined(__WXX11__)
275     /* Associate drop targets with the main interface */
276     SetDropTarget( new DragAndDrop( p_intf ) );
277 #endif
278
279     UpdateAcceleratorTable();
280
281     /* Start timer */
282     timer = new Timer( p_intf, this );
283 }
284
285 Interface::~Interface()
286 {
287     if( p_intf->p_sys->p_wxwindow )
288     {
289         delete p_intf->p_sys->p_wxwindow;
290     }
291
292     /* Clean up */
293     delete timer;
294 }
295
296 void Interface::OnControlEvent( wxCommandEvent& event )
297 {
298     switch( event.GetId() )
299     {
300     case 0:
301         frame_sizer->Layout();
302         frame_sizer->Fit(this);
303         break;
304
305     case 1:
306         long i_style = GetWindowStyle();
307         if( event.GetInt() ) i_style |= wxSTAY_ON_TOP;
308         else i_style &= ~wxSTAY_ON_TOP;
309         SetWindowStyle( i_style );
310         break;
311     }
312 }
313
314 /*****************************************************************************
315  * Private methods.
316  *****************************************************************************/
317 void Interface::CreateOurMenuBar()
318 {
319 #define HELP_SIMPLE N_("Quick file open")
320 #define HELP_ADV   N_("Advanced open")
321 #define HELP_FILE  N_("Open a file")
322 #define HELP_DISC  N_("Open Disc Media")
323 #define HELP_NET   N_("Open a network stream")
324 #define HELP_SAT   N_("Open a satellite stream")
325 #define HELP_EJECT N_("Eject the DVD/CD")
326 #define HELP_EXIT  N_("Exit this program")
327
328 #define HELP_STREAMWIZARD N_("Open the streaming wizard")
329
330 #define HELP_PLAYLIST   N_("Open the playlist")
331 #define HELP_LOGS       N_("Show the program logs")
332 #define HELP_FILEINFO   N_("Show information about the file being played")
333
334 #define HELP_PREFS     N_("Go to the preferences menu")
335 #define HELP_EXTENDED  N_("Shows the extended GUI")
336 #define HELP_BOOKMARKS N_("Shows the bookmarks window")
337
338 #define HELP_ABOUT N_("About this program")
339
340     /* Create the "File" menu */
341     wxMenu *file_menu = new wxMenu;
342     file_menu->Append( OpenFileSimple_Event,
343                        wxU(_("Quick &Open File...\tCtrl-O")),
344                        wxU(_(HELP_SIMPLE)) );
345
346     file_menu->AppendSeparator();
347     file_menu->Append( OpenFile_Event, wxU(_("Open &File...\tCtrl-F")),
348                        wxU(_(HELP_FILE)));
349     file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...\tCtrl-D")),
350                        wxU(_(HELP_DISC)));
351     file_menu->Append( OpenNet_Event,
352                        wxU(_("Open &Network Stream...\tCtrl-N")),
353                        wxU(_(HELP_NET)));
354
355     file_menu->AppendSeparator();
356     file_menu->Append( StreamWizard_Event,
357                        wxU(_("Streaming &Wizard...\tCtrl-W")),
358                        wxU(_(HELP_STREAMWIZARD)) );
359     file_menu->Append( Wizard_Event, wxU(_("New Wizard...")),
360                        wxU(_(HELP_STREAMWIZARD)) );
361     file_menu->AppendSeparator();
362     file_menu->Append( Exit_Event, wxU(_("E&xit\tCtrl-X")),
363                        wxU(_(HELP_EXIT)) );
364
365     /* Create the "View" menu */
366     wxMenu *view_menu = new wxMenu;
367     view_menu->Append( Playlist_Event, wxU(_("&Playlist...\tCtrl-P")),
368                        wxU(_(HELP_PLAYLIST)) );
369     view_menu->Append( Logs_Event, wxU(_("&Messages...\tCtrl-M")),
370                        wxU(_(HELP_LOGS)) );
371     view_menu->Append( FileInfo_Event,
372                        wxU(_("Stream and Media &info...\tCtrl-I")),
373                        wxU(_(HELP_FILEINFO)) );
374
375     /* Create the "Auto-generated" menus */
376     p_settings_menu = SettingsMenu( p_intf, this );
377     p_audio_menu = AudioMenu( p_intf, this );
378     p_video_menu = VideoMenu( p_intf, this );
379     p_navig_menu = NavigMenu( p_intf, this );
380
381     /* Create the "Help" menu */
382     wxMenu *help_menu = new wxMenu;
383     help_menu->Append( About_Event, wxU(_("About VLC media player")),
384                        wxU(_(HELP_ABOUT)) );
385
386     /* Append the freshly created menus to the menu bar... */
387     wxMenuBar *menubar = new wxMenuBar( wxMB_DOCKABLE );
388     menubar->Append( file_menu, wxU(_("&File")) );
389     menubar->Append( view_menu, wxU(_("&View")) );
390     menubar->Append( p_settings_menu, wxU(_("&Settings")) );
391     menubar->Append( p_audio_menu, wxU(_("&Audio")) );
392     menubar->Append( p_video_menu, wxU(_("&Video")) );
393     menubar->Append( p_navig_menu, wxU(_("&Navigation")) );
394     menubar->Append( help_menu, wxU(_("&Help")) );
395
396     /* Attach the menu bar to the frame */
397     SetMenuBar( menubar );
398
399     /* Intercept all menu events in our custom event handler */
400     PushEventHandler( new MenuEvtHandler( p_intf, this ) );
401
402 #if !defined(__WXX11__)
403     /* Associate drop targets with the menubar */
404     menubar->SetDropTarget( new DragAndDrop( p_intf ) );
405 #endif
406 }
407
408 class VLCVolCtrl : public wxControl
409 {
410 public:
411     VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent, wxGauge ** );
412     virtual ~VLCVolCtrl() {};
413
414     virtual void OnPaint( wxPaintEvent &event );
415
416   private:
417     DECLARE_EVENT_TABLE()
418 };
419
420 BEGIN_EVENT_TABLE(VLCVolCtrl, wxControl)
421    EVT_PAINT(VLCVolCtrl::OnPaint)
422 END_EVENT_TABLE()
423
424 VLCVolCtrl::VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent,
425                         wxGauge **pp_volctrl )
426   :wxControl( p_parent, -1, wxDefaultPosition, wxSize(64, 16 ), wxBORDER_NONE )
427 {
428     *pp_volctrl = new wxVolCtrl( p_intf, this, -1, wxPoint(18,0),
429                                   wxSize(44,16) );
430 }
431
432 void VLCVolCtrl::OnPaint( wxPaintEvent &evt )
433 {
434     wxPaintDC dc( this );
435     wxBitmap mPlayBitmap( speaker_xpm );
436     dc.DrawBitmap( mPlayBitmap, 1, 0, TRUE );
437 }
438
439 void Interface::CreateOurToolBar()
440 {
441 #define HELP_STOP N_("Stop")
442
443 #define HELP_PLAY N_("Play")
444 #define HELP_PAUSE N_("Pause")
445 #define HELP_PLO N_("Playlist")
446 #define HELP_PLP N_("Previous playlist item")
447 #define HELP_PLN N_("Next playlist item")
448 #define HELP_SLOW N_("Play slower")
449 #define HELP_FAST N_("Play faster")
450
451     wxLogNull LogDummy; /* Hack to suppress annoying log message on the win32
452                          * version because we don't include wx.rc */
453
454     wxToolBar *toolbar =
455         CreateToolBar( wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE );
456
457     toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) );
458
459     toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( play_xpm ),
460                       wxU(_(HELP_PLAY)) );
461 #if 0
462     toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( pause_xpm ),
463                       wxU(_(HELP_PAUSE)) );
464 #endif
465     toolbar->AddTool( StopStream_Event, wxT(""), wxBitmap( stop_xpm ),
466                       wxU(_(HELP_STOP)) );
467     toolbar->AddSeparator();
468     toolbar->AddTool( PrevStream_Event, wxT(""),
469                       wxBitmap( prev_xpm ), wxU(_(HELP_PLP)) );
470     toolbar->AddTool( SlowStream_Event, wxT(""),
471                       wxBitmap( slow_xpm ), wxU(_(HELP_SLOW)) );
472     toolbar->AddTool( FastStream_Event, wxT(""),
473                       wxBitmap( fast_xpm ), wxU(_(HELP_FAST)) );
474     toolbar->AddTool( NextStream_Event, wxT(""), wxBitmap( next_xpm ),
475                       wxU(_(HELP_PLN)) );
476     toolbar->AddSeparator();
477     toolbar->AddTool( Playlist_Event, wxT(""), wxBitmap( eject_xpm ),
478                       wxU(_(HELP_PLO)) );
479
480     wxControl *p_dummy_ctrl =
481         new wxControl( toolbar, -1, wxDefaultPosition,
482                        wxSize(64, 16 ), wxBORDER_NONE );
483
484     toolbar->AddControl( p_dummy_ctrl );
485
486     VLCVolCtrl *sound_control = new VLCVolCtrl( p_intf, toolbar, &volctrl );
487     toolbar->AddControl( sound_control );
488
489     toolbar->Realize();
490
491     // '7' is the number of buttons on the toolbar, '3' is arbitrary :)
492     frame_sizer->SetMinSize( TOOLBAR_BMP_WIDTH * 7 * 3, -1 );
493
494 #if !defined(__WXX11__)
495     /* Associate drop targets with the toolbar */
496     toolbar->SetDropTarget( new DragAndDrop( p_intf ) );
497 #endif
498 }
499
500 void Interface::CreateOurSlider()
501 {
502     /* Create a new frame and sizer containing the slider */
503     slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
504     slider_frame->SetAutoLayout( TRUE );
505     wxBoxSizer *frame_sizer = new wxBoxSizer( wxHORIZONTAL );
506     //frame_sizer->SetMinSize( -1, 50 );
507
508     /* Create slider */
509     slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0,
510                            SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize );
511
512     /* Add everything to the frame */
513     frame_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 );
514     slider_frame->SetSizer( frame_sizer );
515     frame_sizer->Layout();
516     frame_sizer->SetSizeHints(slider_frame);
517
518     /* Hide the slider by default */
519     slider_frame->Hide();
520 }
521
522
523 void Interface::CreateOurExtendedPanel()
524 {
525     char *psz_filters;
526
527     extra_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
528     extra_frame->SetAutoLayout( TRUE );
529     wxBoxSizer *extra_sizer = new wxBoxSizer( wxHORIZONTAL );
530
531     /* Create static box to surround the adjust controls */
532     wxStaticBox *adjust_box =
533            new wxStaticBox( extra_frame, -1, wxU(_("Adjust Image")) );
534
535     /* Create the size for the frame */
536     wxStaticBoxSizer *adjust_sizer =
537         new wxStaticBoxSizer( adjust_box, wxVERTICAL );
538     adjust_sizer->SetMinSize( -1, 50 );
539
540     /* Create every controls */
541
542     /* Create the adjust button */
543     wxCheckBox * adjust_check = new wxCheckBox( extra_frame, Adjust_Event,
544                                                  wxU(_("Enable")));
545
546
547     wxBoxSizer *hue_sizer = new wxBoxSizer( wxHORIZONTAL );
548     wxStaticText *hue_text = new wxStaticText( extra_frame, -1,
549                                        wxU(_("Hue")) );
550     hue_slider = new wxSlider ( extra_frame, Hue_Event, 0, 0,
551                                 360, wxDefaultPosition, wxDefaultSize );
552
553     hue_sizer->Add(hue_text,1, 0 ,0);
554     hue_sizer->Add(hue_slider,1, 0 ,0);
555     hue_sizer->Layout();
556
557     wxBoxSizer *contrast_sizer = new wxBoxSizer( wxHORIZONTAL );
558     wxStaticText *contrast_text = new wxStaticText( extra_frame, -1,
559                                        wxU(_("Contrast")) );
560     contrast_slider = new wxSlider ( extra_frame, Contrast_Event, 0, 0,
561                                 200, wxDefaultPosition, wxDefaultSize);
562     contrast_sizer->Add(contrast_text,1, 0 ,0);
563     contrast_sizer->Add(contrast_slider,1, 0 ,0);
564     contrast_sizer->Layout();
565
566     wxBoxSizer *brightness_sizer = new wxBoxSizer( wxHORIZONTAL );
567     wxStaticText *brightness_text = new wxStaticText( extra_frame, -1,
568                                        wxU(_("Brightness")) );
569     brightness_slider = new wxSlider ( extra_frame, Brightness_Event, 0, 0,
570                            200, wxDefaultPosition, wxDefaultSize) ;
571     brightness_sizer->Add(brightness_text,1,0,0);
572     brightness_sizer->Add(brightness_slider,1,0,0);
573     brightness_sizer->Layout();
574
575     wxBoxSizer *saturation_sizer = new wxBoxSizer( wxHORIZONTAL );
576     wxStaticText *saturation_text = new wxStaticText( extra_frame, -1,
577                                           wxU(_("Saturation")) );
578     saturation_slider = new wxSlider ( extra_frame, Saturation_Event, 0, 0,
579                            300, wxDefaultPosition, wxDefaultSize );
580     saturation_sizer->Add(saturation_text,1,0,0);
581     saturation_sizer->Add(saturation_slider,1,0,0);
582     saturation_sizer->Layout();
583
584     wxBoxSizer *gamma_sizer = new wxBoxSizer( wxHORIZONTAL );
585     wxStaticText *gamma_text = new wxStaticText( extra_frame, -1,
586                                           wxU(_("Gamma")) );
587     gamma_slider = new wxSlider ( extra_frame, Gamma_Event, 0, 0,
588                            100, wxDefaultPosition, wxDefaultSize );
589     gamma_sizer->Add(gamma_text,1,0,0);
590     gamma_sizer->Add(gamma_slider,1,0,0);
591     gamma_sizer->Layout();
592
593     adjust_sizer->Add(adjust_check, 1, wxEXPAND, 0);
594     adjust_sizer->Add(hue_sizer, 1, wxEXPAND, 0);
595     adjust_sizer->Add(contrast_sizer, 1, wxEXPAND, 0);
596     adjust_sizer->Add(brightness_sizer, 1, wxEXPAND, 0);
597     adjust_sizer->Add(saturation_sizer, 1, wxEXPAND, 0);
598     adjust_sizer->Add(gamma_sizer, 1, wxEXPAND, 0);
599
600     extra_sizer->Add(adjust_sizer,1,wxBOTTOM,5);
601
602     /* Create sizer to surround the other controls */
603     wxBoxSizer *other_sizer = new wxBoxSizer( wxVERTICAL );
604
605
606     wxStaticBox *video_box =
607             new wxStaticBox( extra_frame, -1, wxU(_("Video Options")) );
608     /* Create the sizer for the frame */
609     wxStaticBoxSizer *video_sizer =
610        new wxStaticBoxSizer( video_box, wxVERTICAL );
611     video_sizer->SetMinSize( -1, 50 );
612
613     static const wxString ratio_array[] =
614     {
615         wxT("4:3"),
616         wxT("16:9"),
617     };
618
619     wxBoxSizer *ratio_sizer = new wxBoxSizer( wxHORIZONTAL );
620     wxStaticText *ratio_text = new wxStaticText( extra_frame, -1,
621                                           wxU(_("Aspect Ratio")) );
622
623     ratio_combo = new wxComboBox( extra_frame, Ratio_Event, wxT(""),
624                                   wxDefaultPosition, wxSize(120,-1),
625                                   WXSIZEOF(ratio_array), ratio_array,
626                                   0 );
627
628     ratio_sizer->Add( ratio_text, 0, wxALL, 2 );
629     ratio_sizer->Add( ratio_combo, 0, wxALL, 2 );
630     ratio_sizer->Layout();
631
632     video_sizer->Add( ratio_sizer  , 0 , wxALL , 0 );
633     video_sizer->Layout();
634
635 #if 0
636     wxBoxSizer *visual_sizer = new wxBoxSizer( wxHORIZONTAL );
637
638     wxCheckBox *visual_checkbox = new wxCheckBox( extra_frame, Visual_Event,
639                                             wxU(_("Visualisations")) );
640
641     visual_sizer->Add( visual_checkbox, 0, wxEXPAND, 0);
642     visual_sizer->Layout();
643
644     wxStaticBox *audio_box =
645               new wxStaticBox( extra_frame, -1, wxU(_("Audio Options")) );
646     /* Create the sizer for the frame */
647     wxStaticBoxSizer *audio_sizer =
648         new wxStaticBoxSizer( audio_box, wxVERTICAL );
649     audio_sizer->SetMinSize( -1, 50 );
650
651     audio_sizer->Add( visual_sizer, 0, wxALL, 0);
652     audio_sizer->Layout();
653
654     other_sizer->Add( audio_sizer , 0 , wxALL | wxEXPAND , 0 );
655 #endif
656     other_sizer->Add( video_sizer, 0, wxALL | wxEXPAND , 0);
657     other_sizer->Layout();
658
659     extra_sizer->Add(other_sizer,0,wxBOTTOM,5);
660
661     extra_frame->SetSizer( extra_sizer );
662
663     /* Layout the whole panel */
664     extra_sizer->Layout();
665
666     extra_sizer->SetSizeHints(extra_frame);
667
668     /* Write down initial values */
669 #if 0
670     psz_filters = config_GetPsz( p_intf, "audio-filter" );
671     if( psz_filters && strstr( psz_filters, "visual" ) )
672     {
673         visual_checkbox->SetValue(1);
674     }
675     if( psz_filters ) free( psz_filters );
676 #endif
677     psz_filters = config_GetPsz( p_intf, "filter" );
678     if( psz_filters && strstr( psz_filters, "adjust" ) )
679     {
680         adjust_check->SetValue( 1 );
681         saturation_slider->Enable();
682         contrast_slider->Enable();
683         brightness_slider->Enable();
684         hue_slider->Enable();
685         gamma_slider->Enable();
686     }
687     else
688     {
689         adjust_check->SetValue( 0 );
690         saturation_slider->Disable();
691         contrast_slider->Disable();
692         brightness_slider->Disable();
693         hue_slider->Disable();
694         gamma_slider->Disable();
695     }
696     if( psz_filters ) free( psz_filters );
697
698     int i_value = config_GetInt( p_intf, "hue" );
699     if( i_value > 0 && i_value < 360 )
700         hue_slider->SetValue( i_value );
701
702     float f_value;
703     f_value = config_GetFloat( p_intf, "saturation" );
704     if( f_value > 0 && f_value < 5 )
705         saturation_slider->SetValue( (int)(100 * f_value) );
706     f_value = config_GetFloat( p_intf, "contrast" );
707     if( f_value > 0 && f_value < 4 )
708         contrast_slider->SetValue( (int)(100 * f_value) );
709     f_value = config_GetFloat( p_intf, "brightness" );
710     if( f_value > 0 && f_value < 2 )
711         brightness_slider->SetValue( (int)(100 * f_value) );
712     f_value = config_GetFloat( p_intf, "gamma" );
713     if( f_value > 0 && f_value < 10 )
714         gamma_slider->SetValue( (int)(10 * f_value) );
715
716     extra_frame->Hide();
717 }
718
719 void Interface::UpdateAcceleratorTable()
720 {
721     /* Set some hotkeys */
722     wxAcceleratorEntry entries[7];
723     vlc_value_t val;
724     int i = 0;
725
726     var_Get( p_intf->p_vlc, "key-quit", &val );
727     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
728                       ConvertHotkey( val.i_int ), Exit_Event );
729     var_Get( p_intf->p_vlc, "key-stop", &val );
730     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
731                       ConvertHotkey( val.i_int ), StopStream_Event );
732     var_Get( p_intf->p_vlc, "key-play-pause", &val );
733     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
734                       ConvertHotkey( val.i_int ), PlayStream_Event );
735     var_Get( p_intf->p_vlc, "key-next", &val );
736     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
737                       ConvertHotkey( val.i_int ), NextStream_Event );
738     var_Get( p_intf->p_vlc, "key-prev", &val );
739     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
740                       ConvertHotkey( val.i_int ), PrevStream_Event );
741     var_Get( p_intf->p_vlc, "key-faster", &val );
742     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
743                       ConvertHotkey( val.i_int ), FastStream_Event );
744     var_Get( p_intf->p_vlc, "key-slower", &val );
745     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
746                       ConvertHotkey( val.i_int ), SlowStream_Event );
747
748     wxAcceleratorTable accel( 7, entries );
749
750     if( !accel.Ok() )
751         msg_Err( p_intf, "invalid accelerator table" );
752
753     SetAcceleratorTable( accel );
754     msg_Dbg( p_intf, "accelerator table loaded" );
755
756 }
757
758 /*****************************************************************************
759  * Event Handlers.
760  *****************************************************************************/
761
762 void Interface::OnMenuOpen(wxMenuEvent& event)
763 {
764 #if defined( __WXMSW__ )
765 #   define GetEventObject GetMenu
766 #endif
767
768     if( event.GetEventObject() == p_settings_menu )
769     {
770         p_settings_menu = SettingsMenu( p_intf, this, p_settings_menu );
771
772         /* Add static items */
773         p_settings_menu->AppendCheckItem( Extended_Event,
774             wxU(_("&Extended GUI") ), wxU(_(HELP_EXTENDED)) );
775         p_settings_menu->AppendCheckItem( Bookmarks_Event,
776             wxU(_("&Bookmarks...") ), wxU(_(HELP_BOOKMARKS)) );
777         p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
778             wxU(_(HELP_PREFS)) );
779     }
780
781     else if( event.GetEventObject() == p_audio_menu )
782     {
783         p_audio_menu = AudioMenu( p_intf, this, p_audio_menu );
784     }
785
786     else if( event.GetEventObject() == p_video_menu )
787     {
788         p_video_menu = VideoMenu( p_intf, this, p_video_menu );
789     }
790
791     else if( event.GetEventObject() == p_navig_menu )
792     {
793         p_navig_menu = NavigMenu( p_intf, this, p_navig_menu );
794     }
795
796 #if defined( __WXMSW__ )
797 #   undef GetEventObject
798 #endif
799 }
800
801 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
802 void Interface::OnContextMenu2(wxContextMenuEvent& event)
803 {
804     /* Only show the context menu for the main interface */
805     if( GetId() != event.GetId() )
806     {
807         event.Skip();
808         return;
809     }
810
811     if( p_intf->p_sys->pf_show_dialog )
812         p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
813 }
814 #endif
815 void Interface::OnContextMenu(wxMouseEvent& event)
816 {
817     if( p_intf->p_sys->pf_show_dialog )
818         p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
819 }
820
821 void Interface::OnExit( wxCommandEvent& WXUNUSED(event) )
822 {
823     /* TRUE is to force the frame to close. */
824     Close(TRUE);
825 }
826
827 void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) )
828 {
829     wxString msg;
830     msg.Printf( wxString(wxT("VLC media player " VERSION)) +
831         wxU(_(" (wxWindows interface)\n\n")) +
832         wxU(_("(c) 1996-2004 - the VideoLAN Team\n\n")) +
833         wxU( vlc_wraptext(INTF_ABOUT_MSG,WRAPCOUNT,ISUTF8) ) + wxT("\n\n") +
834         wxU(_("The VideoLAN team <videolan@videolan.org>\n"
835               "http://www.videolan.org/\n\n")) );
836
837     wxMessageBox( msg, wxString::Format(wxU(_("About %s")),
838                   wxT("VLC media player")), wxOK | wxICON_INFORMATION, this );
839 }
840
841 void Interface::OnShowDialog( wxCommandEvent& event )
842 {
843     if( p_intf->p_sys->pf_show_dialog )
844     {
845         int i_id;
846
847         switch( event.GetId() )
848         {
849         case OpenFileSimple_Event:
850             i_id = INTF_DIALOG_FILE_SIMPLE;
851             break;
852         case OpenAdv_Event:
853             i_id = INTF_DIALOG_FILE;
854         case OpenFile_Event:
855             i_id = INTF_DIALOG_FILE;
856             break;
857         case OpenDisc_Event:
858             i_id = INTF_DIALOG_DISC;
859             break;
860         case OpenNet_Event:
861             i_id = INTF_DIALOG_NET;
862             break;
863         case OpenSat_Event:
864             i_id = INTF_DIALOG_SAT;
865             break;
866         case Playlist_Event:
867             i_id = INTF_DIALOG_PLAYLIST;
868             break;
869         case Logs_Event:
870             i_id = INTF_DIALOG_MESSAGES;
871             break;
872         case FileInfo_Event:
873             i_id = INTF_DIALOG_FILEINFO;
874             break;
875         case Prefs_Event:
876             i_id = INTF_DIALOG_PREFS;
877             break;
878         case StreamWizard_Event:
879             i_id = INTF_DIALOG_STREAMWIZARD;
880             break;
881         case Wizard_Event:
882             i_id = INTF_DIALOG_WIZARD;
883             break;
884         case Bookmarks_Event:
885             i_id = INTF_DIALOG_BOOKMARKS;
886             break;
887         default:
888             i_id = INTF_DIALOG_FILE;
889             break;
890         }
891
892         p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
893     }
894 }
895
896 void Interface::OnExtended(wxCommandEvent& event)
897 {
898     if( b_extra == VLC_FALSE)
899     {
900         extra_frame->Show();
901         frame_sizer->Show( extra_frame );
902         b_extra = VLC_TRUE;
903     }
904     else
905     {
906         extra_frame->Hide();
907         frame_sizer->Hide( extra_frame );
908         b_extra = VLC_FALSE;
909     }
910     frame_sizer->Layout();
911     frame_sizer->Fit(this);
912 }
913
914 void Interface::OnEnableAdjust(wxCommandEvent& event)
915 {
916     char *psz_filters=config_GetPsz( p_intf, "filter");
917     char *psz_new = NULL;
918     if( event.IsChecked() )
919     {
920         if(psz_filters == NULL)
921         {
922             psz_new = strdup( "adjust" );
923         }
924         else
925         {
926             psz_new= (char *) malloc(strlen(psz_filters) + 8 );
927             sprintf( psz_new, "%s:adjust", psz_filters);
928         }
929         config_PutPsz( p_intf, "filter", psz_new );
930         vlc_value_t val;
931         vout_thread_t *p_vout =
932            (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
933                                        FIND_ANYWHERE );
934         if( p_vout != NULL )
935         {
936             val.psz_string = strdup( psz_new );
937             var_Set( p_vout, "filter", val);
938             vlc_object_release( p_vout );
939         }
940         if( val.psz_string ) free( val.psz_string );
941         brightness_slider->Enable();
942         saturation_slider->Enable();
943         contrast_slider->Enable();
944         hue_slider->Enable();
945         gamma_slider->Enable();
946     }
947     else
948     {
949         if( psz_filters != NULL )
950         {
951
952             char *psz_current;
953             unsigned int i=0;
954             for( i = 0; i< strlen(psz_filters ); i++)
955             {
956                 if ( !strncasecmp( &psz_filters[i],"adjust",6 ))
957                 {
958                     if(i > 0)
959                         if( psz_filters[i-1] == ':' ) i--;
960                     psz_current = strchr( &psz_filters[i+1] , ':' );
961                     if( !psz_current )
962                         psz_filters[i] = '\0';
963                     else
964                     {
965                        memmove( &psz_filters[i] , psz_current,
966                                 &psz_filters[strlen(psz_filters)]-psz_current
967                                 +1);
968                     }
969                 }
970             }
971             config_PutPsz( p_intf, "filter", psz_filters);
972             vlc_value_t val;
973             val.psz_string = strdup( psz_filters );
974             vout_thread_t *p_vout =
975                (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
976                                        FIND_ANYWHERE );
977             if( p_vout != NULL )
978             {
979                 var_Set( p_vout, "filter", val);
980                 vlc_object_release( p_vout );
981             }
982             if( val.psz_string ) free( val.psz_string );
983         }
984         brightness_slider->Disable();
985         saturation_slider->Disable();
986         contrast_slider->Disable();
987         hue_slider->Disable();
988         gamma_slider->Disable();
989     }
990     if(psz_filters) free(psz_filters);
991     if(psz_new) free(psz_new);
992 }
993
994 void Interface::OnHueUpdate( wxScrollEvent& event)
995 {
996     config_PutInt( p_intf , "hue" , event.GetPosition() );
997 }
998
999 void Interface::OnSaturationUpdate( wxScrollEvent& event)
1000 {
1001     config_PutFloat( p_intf , "saturation" , (float)event.GetPosition()/100 );
1002 }
1003
1004 void Interface::OnBrightnessUpdate( wxScrollEvent& event)
1005 {
1006     config_PutFloat( p_intf , "brightness", (float)event.GetPosition()/100 );
1007 }
1008
1009 void Interface::OnContrastUpdate(wxScrollEvent& event)
1010 {
1011     config_PutFloat( p_intf , "contrast" , (float)event.GetPosition()/100 );
1012 }
1013
1014 void Interface::OnGammaUpdate(wxScrollEvent& event)
1015 {
1016     config_PutFloat( p_intf , "gamma" , (float)event.GetPosition()/10 );
1017 }
1018
1019 void Interface::OnRatio( wxCommandEvent& event )
1020 {
1021    config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
1022 }
1023
1024 void Interface::OnEnableVisual(wxCommandEvent& event)
1025 {
1026     if( event.IsChecked() )
1027     {
1028         config_PutPsz( p_intf, "audio-filter", "visual" );
1029     }
1030     else
1031     {
1032         config_PutPsz( p_intf, "audio-filter", "" );
1033     }
1034 }
1035
1036 void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) )
1037 {
1038     wxCommandEvent dummy;
1039     playlist_t *p_playlist =
1040         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1041                                        FIND_ANYWHERE );
1042     if( p_playlist == NULL ) return;
1043
1044     if( p_playlist->i_size && p_playlist->i_enabled )
1045     {
1046         vlc_value_t state;
1047
1048         input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf,
1049                                                        VLC_OBJECT_INPUT,
1050                                                        FIND_ANYWHERE );
1051         if( p_input == NULL )
1052         {
1053             /* No stream was playing, start one */
1054             playlist_Play( p_playlist );
1055             TogglePlayButton( PLAYING_S );
1056             vlc_object_release( p_playlist );
1057             return;
1058         }
1059
1060         var_Get( p_input, "state", &state );
1061
1062         if( state.i_int != PAUSE_S )
1063         {
1064             /* A stream is being played, pause it */
1065             state.i_int = PAUSE_S;
1066         }
1067         else
1068         {
1069             /* Stream is paused, resume it */
1070             state.i_int = PLAYING_S;
1071         }
1072         var_Set( p_input, "state", state );
1073
1074         TogglePlayButton( state.i_int );
1075         vlc_object_release( p_input );
1076         vlc_object_release( p_playlist );
1077     }
1078     else
1079     {
1080         /* If the playlist is empty, open a file requester instead */
1081         vlc_object_release( p_playlist );
1082         OnShowDialog( dummy );
1083     }
1084 }
1085
1086 void Interface::OnStopStream( wxCommandEvent& WXUNUSED(event) )
1087 {
1088     playlist_t * p_playlist =
1089         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1090                                        FIND_ANYWHERE );
1091     if( p_playlist == NULL )
1092     {
1093         return;
1094     }
1095
1096     playlist_Stop( p_playlist );
1097     TogglePlayButton( PAUSE_S );
1098     vlc_object_release( p_playlist );
1099 }
1100
1101 void Interface::OnSliderUpdate( wxScrollEvent& event )
1102 {
1103     vlc_mutex_lock( &p_intf->change_lock );
1104
1105 #ifdef WIN32
1106     if( event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
1107         || event.GetEventType() == wxEVT_SCROLL_ENDSCROLL )
1108     {
1109 #endif
1110         if( p_intf->p_sys->i_slider_pos != event.GetPosition()
1111             && p_intf->p_sys->p_input )
1112         {
1113             vlc_value_t pos;
1114             pos.f_float = (float)event.GetPosition() / (float)SLIDER_MAX_POS;
1115
1116             var_Set( p_intf->p_sys->p_input, "position", pos );
1117         }
1118
1119 #ifdef WIN32
1120         p_intf->p_sys->b_slider_free = VLC_TRUE;
1121     }
1122     else
1123     {
1124         p_intf->p_sys->b_slider_free = VLC_FALSE;
1125
1126         if( p_intf->p_sys->p_input )
1127         {
1128             /* Update stream date */
1129 #define p_area p_intf->p_sys->p_input->stream.p_selected_area
1130             char psz_time[ MSTRTIME_MAX_SIZE ], psz_total[ MSTRTIME_MAX_SIZE ];
1131             mtime_t i_seconds;
1132             vlc_value_t val;
1133
1134             var_Get( p_intf->p_sys->p_input, "length",  &val );
1135             i_seconds = val.i_time / 1000000;
1136             secstotimestr ( psz_total, i_seconds );
1137
1138             statusbar->SetStatusText(
1139                 wxU(input_OffsetToTime( p_intf->p_sys->p_input,
1140                     psz_time, p_area->i_size * event.GetPosition()
1141                         / SLIDER_MAX_POS )) + wxString(wxT(" / ")) +
1142                         wxU(psz_total), 0 );
1143 #undef p_area
1144         }
1145     }
1146 #endif
1147
1148 #undef WIN32
1149     vlc_mutex_unlock( &p_intf->change_lock );
1150 }
1151
1152 void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) )
1153 {
1154     playlist_t * p_playlist =
1155         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1156                                        FIND_ANYWHERE );
1157     if( p_playlist == NULL )
1158     {
1159         return;
1160     }
1161
1162     vlc_mutex_lock( &p_playlist->object_lock );
1163     if( p_playlist->p_input != NULL )
1164     {
1165         vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1166         if( p_playlist->p_input->stream.p_selected_area->i_id > 1 )
1167         {
1168             vlc_value_t val; val.b_bool = VLC_TRUE;
1169             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1170             var_Set( p_playlist->p_input, "prev-title", val );
1171         } else
1172             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1173     }
1174     vlc_mutex_unlock( &p_playlist->object_lock );
1175
1176     playlist_Prev( p_playlist );
1177     vlc_object_release( p_playlist );
1178 }
1179
1180 void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) )
1181 {
1182     playlist_t * p_playlist =
1183         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1184                                        FIND_ANYWHERE );
1185     if( p_playlist == NULL )
1186     {
1187         return;
1188     }
1189
1190     vlc_mutex_lock( &p_playlist->object_lock );
1191     if( p_playlist->p_input != NULL )
1192     {
1193         vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1194         if( p_playlist->p_input->stream.i_area_nb > 1 &&
1195             p_playlist->p_input->stream.p_selected_area->i_id <
1196               p_playlist->p_input->stream.i_area_nb - 1 )
1197         {
1198             vlc_value_t val; val.b_bool = VLC_TRUE;
1199             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1200             var_Set( p_playlist->p_input, "next-title", val );
1201         } else
1202             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1203     }
1204     vlc_mutex_unlock( &p_playlist->object_lock );
1205
1206     playlist_Next( p_playlist );
1207     vlc_object_release( p_playlist );
1208 }
1209
1210 void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) )
1211 {
1212     input_thread_t *p_input =
1213         (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1214                                            FIND_ANYWHERE );
1215     if( p_input )
1216     {
1217         vlc_value_t val; val.b_bool = VLC_TRUE;
1218
1219         var_Set( p_input, "rate-slower", val );
1220         vlc_object_release( p_input );
1221     }
1222 }
1223
1224 void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) )
1225 {
1226     input_thread_t *p_input =
1227         (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1228                                            FIND_ANYWHERE );
1229     if( p_input )
1230     {
1231         vlc_value_t val; val.b_bool = VLC_TRUE;
1232
1233         var_Set( p_input, "rate-faster", val );
1234         vlc_object_release( p_input );
1235     }
1236 }
1237
1238 void Interface::TogglePlayButton( int i_playing_status )
1239 {
1240     if( i_playing_status == i_old_playing_status )
1241         return;
1242
1243     GetToolBar()->DeleteTool( PlayStream_Event );
1244
1245     if( i_playing_status == PLAYING_S )
1246     {
1247         GetToolBar()->InsertTool( 0, PlayStream_Event, wxU(_("Pause")),
1248                                   wxBitmap( pause_xpm ), wxNullBitmap,
1249                                   wxITEM_NORMAL, wxU(_(HELP_PAUSE)) );
1250     }
1251     else
1252     {
1253         GetToolBar()->InsertTool( 0, PlayStream_Event, wxU(_("Play")),
1254                                   wxBitmap( play_xpm ), wxNullBitmap,
1255                                   wxITEM_NORMAL, wxU(_(HELP_PLAY)) );
1256     }
1257
1258     GetToolBar()->Realize();
1259
1260     i_old_playing_status = i_playing_status;
1261 }
1262
1263 #if !defined(__WXX11__)
1264 /*****************************************************************************
1265  * Definition of DragAndDrop class.
1266  *****************************************************************************/
1267 DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, vlc_bool_t _b_enqueue )
1268 {
1269     p_intf = _p_intf;
1270     b_enqueue = _b_enqueue;
1271 }
1272
1273 bool DragAndDrop::OnDropFiles( wxCoord, wxCoord,
1274                                const wxArrayString& filenames )
1275 {
1276     /* Add dropped files to the playlist */
1277
1278     playlist_t *p_playlist =
1279         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1280                                        FIND_ANYWHERE );
1281     if( p_playlist == NULL )
1282     {
1283         return FALSE;
1284     }
1285
1286     for( size_t i = 0; i < filenames.GetCount(); i++ )
1287         playlist_Add( p_playlist, (const char *)filenames[i].mb_str(),
1288                       (const char *)filenames[i].mb_str(),
1289                       PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO),
1290                       PLAYLIST_END );
1291
1292     vlc_object_release( p_playlist );
1293
1294     return TRUE;
1295 }
1296 #endif
1297
1298 /*****************************************************************************
1299  * Definition of wxVolCtrl class.
1300  *****************************************************************************/
1301 wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id,
1302                       wxPoint point, wxSize size )
1303   : wxGauge( parent, id, 200, point, size, wxGA_HORIZONTAL | wxGA_SMOOTH )
1304 {
1305     p_intf = _p_intf;
1306
1307     audio_volume_t i_volume;
1308     aout_VolumeGet( p_intf, &i_volume );
1309     i_volume = i_volume * 200 * 2 / AOUT_VOLUME_MAX;
1310     SetValue( i_volume );
1311     SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
1312                 i_volume ) );
1313 }
1314
1315 void wxVolCtrl::OnChange( wxMouseEvent& event )
1316 {
1317     if( !event.LeftDown() && !event.LeftIsDown() ) return;
1318
1319     int i_volume = event.GetX() * 200 / GetClientSize().GetWidth();
1320     Change( i_volume );
1321 }
1322
1323 void wxVolCtrl::Change( int i_volume )
1324 {
1325     aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
1326     SetValue( i_volume );
1327     SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
1328                 i_volume ) );
1329 }