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