]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/preferences_widgets.cpp
66f497ce9f3064fe593b1ce4844e4ada6ddab5a2
[vlc] / modules / gui / wxwindows / preferences_widgets.cpp
1 /*****************************************************************************
2  * preferences_widgets.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001 VideoLAN
5  * $Id: preferences_widgets.cpp,v 1.19 2003/12/30 18:29:26 zorglub Exp $
6  *
7  * Authors: Gildas Bazin <gbazin@netcourrier.com>
8  *          Sigmund Augdal <sigmunau@idi.ntnu.no>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <stdlib.h>                                      /* malloc(), free() */
29 #include <errno.h>                                                 /* ENOMEM */
30 #include <string.h>                                            /* strerror() */
31 #include <stdio.h>
32
33 #include <vlc/vlc.h>
34 #include <vlc/intf.h>
35
36 #include <vlc_help.h>
37
38 #include "wxwindows.h"
39 #include "preferences_widgets.h"
40
41 /*****************************************************************************
42  * CreateConfigControl wrapper
43  *****************************************************************************/
44 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
45                                     module_config_t *p_item, wxWindow *parent )
46 {
47     ConfigControl *p_control = NULL;
48
49     switch( p_item->i_type )
50     {
51     case CONFIG_ITEM_MODULE:
52         p_control = new ModuleConfigControl( p_this, p_item, parent );
53         break;
54
55     case CONFIG_ITEM_STRING:
56         if( !p_item->i_list )
57         {
58             p_control = new StringConfigControl( p_this, p_item, parent );
59         }
60         else
61         {
62             p_control = new StringListConfigControl( p_this, p_item, parent );
63         }
64         break;
65
66     case CONFIG_ITEM_FILE:
67     case CONFIG_ITEM_DIRECTORY:
68         p_control = new FileConfigControl( p_this, p_item, parent );
69         break;
70
71     case CONFIG_ITEM_INTEGER:
72         if( p_item->i_list )
73         {
74             p_control = new IntegerListConfigControl( p_this, p_item, parent );
75         }
76         else if( p_item->i_min != 0 || p_item->i_max != 0 )
77         {
78             p_control = new RangedIntConfigControl( p_this, p_item, parent );
79         }
80         else
81         {
82             p_control = new IntegerConfigControl( p_this, p_item, parent );
83         }
84         break;
85
86     case CONFIG_ITEM_KEY:
87         p_control = new KeyConfigControl( p_this, p_item, parent );
88         break;
89
90     case CONFIG_ITEM_FLOAT:
91         p_control = new FloatConfigControl( p_this, p_item, parent );
92         break;
93
94     case CONFIG_ITEM_BOOL:
95         p_control = new BoolConfigControl( p_this, p_item, parent );
96         break;
97
98     default:
99         break;
100     }
101
102     return p_control;
103 }
104
105 /*****************************************************************************
106  * ConfigControl implementation
107  *****************************************************************************/
108 ConfigControl::ConfigControl( vlc_object_t *_p_this,
109                               module_config_t *p_item, wxWindow *parent )
110   : wxPanel( parent ), p_this( _p_this ),
111     pf_update_callback( NULL ), p_update_data( NULL ),
112     name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
113     b_advanced( p_item->b_advanced )
114
115 {
116     sizer = new wxBoxSizer( wxHORIZONTAL );
117 }
118
119 ConfigControl::~ConfigControl()
120 {
121 }
122
123 wxSizer *ConfigControl::Sizer()
124 {
125     return sizer;
126 }
127
128 wxString ConfigControl::GetName()
129 {
130     return name;
131 }
132
133 int ConfigControl::GetType()
134 {
135     return i_type;
136 }
137
138 vlc_bool_t ConfigControl::IsAdvanced()
139 {
140     return b_advanced;
141 }
142
143 void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
144                                              void *p_data )
145 {
146     pf_update_callback = p_callback;
147     p_update_data = p_data;
148 }
149
150 void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
151 {
152     if( pf_update_callback )
153     {
154         pf_update_callback( p_update_data );
155     }
156 }
157
158 /*****************************************************************************
159  * KeyConfigControl implementation
160  *****************************************************************************/
161 static wxString KeysList[] =
162 {
163     wxT("Unset"),
164     wxT("Left"),
165     wxT("Right"),
166     wxT("Up"),
167     wxT("Down"),
168     wxT("Space"),
169     wxT("Enter"),
170     wxT("F1"),
171     wxT("F2"),
172     wxT("F3"),
173     wxT("F4"),
174     wxT("F5"),
175     wxT("F6"),
176     wxT("F7"),
177     wxT("F8"),
178     wxT("F9"),
179     wxT("F10"),
180     wxT("F11"),
181     wxT("F12"),
182     wxT("Home"),
183     wxT("End"),
184     wxT("Menu"),
185     wxT("Esc"),
186     wxT("Page Up"),
187     wxT("Page Down"),
188     wxT("Tab"),
189     wxT("Backspace"),
190     wxT("a"),
191     wxT("b"),
192     wxT("c"),
193     wxT("d"),
194     wxT("e"),
195     wxT("f"),
196     wxT("g"),
197     wxT("h"),
198     wxT("i"),
199     wxT("j"),
200     wxT("k"),
201     wxT("l"),
202     wxT("m"),
203     wxT("n"),
204     wxT("o"),
205     wxT("p"),
206     wxT("q"),
207     wxT("r"),
208     wxT("s"),
209     wxT("t"),
210     wxT("u"),
211     wxT("v"),
212     wxT("w"),
213     wxT("x"),
214     wxT("y"),
215     wxT("z"),
216     wxT("+"),
217     wxT("="),
218     wxT("-"),
219     wxT(","),
220     wxT("."),
221     wxT("<"),
222     wxT(">"),
223     wxT("`"),
224     wxT("/"),
225     wxT(";"),
226     wxT("'"),
227     wxT("\\"),
228     wxT("["),
229     wxT("]"),
230     wxT("*")
231 };
232
233 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
234                                     module_config_t *p_item, wxWindow *parent )
235   : ConfigControl( p_this, p_item, parent )
236 {
237     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
238     alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
239     alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
240     ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
241     ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
242     shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
243     shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
244     combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
245                             wxDefaultSize, WXSIZEOF(KeysList), KeysList,
246                             wxCB_READONLY );
247     for( unsigned int i = 0; i < WXSIZEOF(KeysList); i++ )
248     {
249         combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
250         if( (unsigned int)vlc_keys[i].i_key_code ==
251             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
252         {
253             combo->SetSelection( i );
254             combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
255         }
256     }
257
258     sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
259     sizer->Add( alt,   1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
260     sizer->Add( ctrl,  1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
261     sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
262     sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
263     sizer->Layout();
264     this->SetSizerAndFit( sizer );
265 }
266
267 KeyConfigControl::~KeyConfigControl()
268 {
269     ;
270 }
271
272 int KeyConfigControl::GetIntValue()
273 {
274     int result = 0;
275     if( alt->IsChecked() )
276     {
277         result |= KEY_MODIFIER_ALT;
278     }
279     if( ctrl->IsChecked() )
280     {
281         result |= KEY_MODIFIER_CTRL;
282     }
283     if( shift->IsChecked() )
284     {
285         result |= KEY_MODIFIER_SHIFT;
286     }
287     int selected = combo->GetSelection();
288     if( selected != -1 )
289     {
290         result |= (int)combo->GetClientData( selected );
291     }
292     return result;
293 }
294
295 /*****************************************************************************
296  * ModuleConfigControl implementation
297  *****************************************************************************/
298 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
299                                           module_config_t *p_item,
300                                           wxWindow *parent )
301   : ConfigControl( p_this, p_item, parent )
302 {
303     vlc_list_t *p_list;
304     module_t *p_parser;
305
306     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
307     combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
308                             wxDefaultPosition, wxDefaultSize,
309                             0, NULL, wxCB_READONLY | wxCB_SORT );
310
311     /* build a list of available modules */
312     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
313     combo->Append( wxU(_("Default")), (void *)NULL );
314     combo->SetSelection( 0 );
315     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
316     {
317         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
318
319         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
320         {
321             combo->Append( wxU(p_parser->psz_longname),
322                            p_parser->psz_object_name );
323             if( p_item->psz_value && !strcmp(p_item->psz_value,
324                                              p_parser->psz_object_name) )
325                 combo->SetValue( wxU(p_parser->psz_longname) );
326         }
327     }
328     vlc_list_release( p_list );
329
330     combo->SetToolTip( wxU(p_item->psz_longtext) );
331     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
332     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
333     sizer->Layout();
334     this->SetSizerAndFit( sizer );
335 }
336
337 ModuleConfigControl::~ModuleConfigControl()
338 {
339     ;
340 }
341
342 wxString ModuleConfigControl::GetPszValue()
343 {
344     return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
345 }
346
347 /*****************************************************************************
348  * StringConfigControl implementation
349  *****************************************************************************/
350 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
351                                           module_config_t *p_item,
352                                           wxWindow *parent )
353   : ConfigControl( p_this, p_item, parent )
354 {
355     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
356     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
357     textctrl = new wxTextCtrl( this, -1,
358                                wxL2U(p_item->psz_value),
359                                wxDefaultPosition,
360                                wxDefaultSize,
361                                wxTE_PROCESS_ENTER);
362     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
363     sizer->Add( textctrl, 1, wxALL, 5 );
364     sizer->Layout();
365     this->SetSizerAndFit( sizer );
366 }
367
368 StringConfigControl::~StringConfigControl()
369 {
370     ;
371 }
372
373 wxString StringConfigControl::GetPszValue()
374 {
375     return textctrl->GetValue();
376 }
377
378 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
379     /* Text events */
380     EVT_TEXT(-1, StringConfigControl::OnUpdate)
381 END_EVENT_TABLE()
382
383 /*****************************************************************************
384  * StringListConfigControl implementation
385  *****************************************************************************/
386 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
387                                                   module_config_t *p_item,
388                                                   wxWindow *parent )
389   : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
390 {
391     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
392     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
393     combo = new wxComboBox( this, -1, wxT(""),
394                             wxDefaultPosition, wxDefaultSize,
395                             0, NULL, wxCB_READONLY );
396     UpdateCombo( p_item );
397
398     combo->SetToolTip( wxU(p_item->psz_longtext) );
399     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
400
401     if( p_item->pf_list_update )
402     {
403         wxButton *refresh =
404             new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
405         sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
406
407         psz_name = strdup( p_item->psz_name );
408         pf_list_update = p_item->pf_list_update;
409     }
410
411     sizer->Layout();
412     this->SetSizerAndFit( sizer );
413 }
414
415 StringListConfigControl::~StringListConfigControl()
416 {
417     if( psz_name ) free( psz_name );
418 }
419
420 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
421 {
422     /* build a list of available options */
423     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
424     {
425         combo->Append( ( p_item->ppsz_list_text &&
426                          p_item->ppsz_list_text[i_index] ) ?
427                        wxU(p_item->ppsz_list_text[i_index]) :
428                        wxL2U(p_item->ppsz_list[i_index]) );
429         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
430         if( ( p_item->psz_value &&
431               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
432              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
433         {
434             combo->SetSelection( i_index );
435             combo->SetValue( ( p_item->ppsz_list_text &&
436                                p_item->ppsz_list_text[i_index] ) ?
437                              wxU(p_item->ppsz_list_text[i_index]) :
438                              wxL2U(p_item->ppsz_list[i_index]) );
439         }
440     }
441 }
442
443 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
444     /* Button events */
445     EVT_BUTTON(wxID_HIGHEST, StringListConfigControl::OnRefresh)
446
447     /* Text events */
448     EVT_TEXT(-1, StringListConfigControl::OnUpdate)
449 END_EVENT_TABLE()
450
451 void StringListConfigControl::OnRefresh( wxCommandEvent& event )
452 {
453     if( pf_list_update )
454     {
455         vlc_value_t val;
456         module_config_t *p_item;
457
458         pf_list_update( p_this, psz_name, val, val, 0 );
459         p_item = config_FindConfig( p_this, psz_name );
460
461         combo->Clear();
462         UpdateCombo( p_item );
463     }
464 }
465
466 wxString StringListConfigControl::GetPszValue()
467 {
468     int selected = combo->GetSelection();
469     if( selected != -1 )
470     {
471         return wxU((char *)combo->GetClientData( selected ));
472     }
473     return wxString();
474 }
475
476 /*****************************************************************************
477  * FileConfigControl implementation
478  *****************************************************************************/
479 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
480                                       module_config_t *p_item,
481                                       wxWindow *parent )
482   : ConfigControl( p_this, p_item, parent )
483 {
484     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
485     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
486     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
487     textctrl = new wxTextCtrl( this, -1,
488                                wxL2U(p_item->psz_value),
489                                wxDefaultPosition,
490                                wxDefaultSize,
491                                wxTE_PROCESS_ENTER);
492     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
493     sizer->Add( textctrl, 1, wxALL, 5 );
494     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
495     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
496     sizer->Layout();
497     this->SetSizerAndFit( sizer );
498 }
499
500 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
501     /* Button events */
502     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
503 END_EVENT_TABLE()
504
505 void FileConfigControl::OnBrowse( wxCommandEvent& event )
506 {
507     if( directory )
508     {
509         wxDirDialog dialog( this, wxU(_("Choose directory")) );
510
511         if( dialog.ShowModal() == wxID_OK )
512         {
513             textctrl->SetValue( dialog.GetPath() );
514         }
515     }
516     else
517     {
518         wxFileDialog dialog( this, wxU(_("Choose file")),
519                              wxT(""), wxT(""), wxT("*.*"),
520 #if defined( __WXMSW__ )
521                              wxOPEN
522 #else
523                              wxOPEN | wxSAVE
524 #endif
525                            );
526         if( dialog.ShowModal() == wxID_OK )
527         {
528             textctrl->SetValue( dialog.GetPath() );
529         }
530     }
531 }
532
533 FileConfigControl::~FileConfigControl()
534 {
535     ;
536 }
537
538 wxString FileConfigControl::GetPszValue()
539 {
540     return textctrl->GetValue();
541 }
542
543 /*****************************************************************************
544  * IntegerConfigControl implementation
545  *****************************************************************************/
546 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
547                                             module_config_t *p_item,
548                                             wxWindow *parent )
549   : ConfigControl( p_this, p_item, parent )
550 {
551     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
552     spin = new wxSpinCtrl( this, -1,
553                            wxString::Format(wxT("%d"),
554                                             p_item->i_value),
555                            wxDefaultPosition, wxDefaultSize,
556                            wxSP_ARROW_KEYS,
557                            -16000, 16000, p_item->i_value);
558     spin->SetToolTip( wxU(p_item->psz_longtext) );
559     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
560     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
561     sizer->Layout();
562     this->SetSizerAndFit( sizer );
563 }
564
565 IntegerConfigControl::~IntegerConfigControl()
566 {
567     ;
568 }
569
570 int IntegerConfigControl::GetIntValue()
571 {
572     return spin->GetValue();
573 }
574
575 /*****************************************************************************
576  * IntegerListConfigControl implementation
577  *****************************************************************************/
578 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
579                                                     module_config_t *p_item,
580                                                     wxWindow *parent )
581   : ConfigControl( p_this, p_item, parent ), psz_name( NULL )
582 {
583     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
584     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
585     combo = new wxComboBox( this, -1, wxT(""),
586                             wxDefaultPosition, wxDefaultSize,
587                             0, NULL, wxCB_READONLY );
588
589     UpdateCombo( p_item );
590
591     combo->SetToolTip( wxU(p_item->psz_longtext) );
592     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
593
594     if( p_item->pf_list_update )
595     {
596         wxButton *refresh =
597             new wxButton( this, wxID_HIGHEST, wxU(_("Refresh")) );
598         sizer->Add( refresh, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
599
600         psz_name = strdup( p_item->psz_name );
601         pf_list_update = p_item->pf_list_update;
602     }
603
604     sizer->Layout();
605     this->SetSizerAndFit( sizer );
606 }
607
608 IntegerListConfigControl::~IntegerListConfigControl()
609 {
610     if( psz_name ) free( psz_name );
611 }
612
613 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
614 {
615     /* build a list of available options */
616     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
617     {
618         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
619         {
620             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
621         }
622         else
623         {
624             combo->Append( wxString::Format(wxT("%i"),
625                                             p_item->pi_list[i_index]) );
626         }
627         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
628         if( p_item->i_value == p_item->pi_list[i_index] )
629         {
630             combo->SetSelection( i_index );
631             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
632             {
633                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
634             }
635             else
636             {
637                 combo->SetValue( wxString::Format(wxT("%i"),
638                                                   p_item->pi_list[i_index]) );
639             }
640         }
641     }
642 }
643
644 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
645     /* Button events */
646     EVT_BUTTON(wxID_HIGHEST, IntegerListConfigControl::OnRefresh)
647 END_EVENT_TABLE()
648
649 void IntegerListConfigControl::OnRefresh( wxCommandEvent& event )
650 {
651     if( pf_list_update )
652     {
653         vlc_value_t val;
654         module_config_t *p_item;
655
656         pf_list_update( p_this, psz_name, val, val, 0 );
657         p_item = config_FindConfig( p_this, psz_name );
658
659         combo->Clear();
660         UpdateCombo( p_item );
661     }
662 }
663
664 int IntegerListConfigControl::GetIntValue()
665 {
666     int selected = combo->GetSelection();
667     if( selected != -1 )
668     {
669         return (int)combo->GetClientData( selected );
670     }
671     return -1;
672 }
673
674 /*****************************************************************************
675  * RangedIntConfigControl implementation
676  *****************************************************************************/
677 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
678                                                 module_config_t *p_item,
679                                                 wxWindow *parent )
680   : ConfigControl( p_this, p_item, parent )
681 {
682     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
683     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
684                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
685                            wxSL_LABELS | wxSL_HORIZONTAL );
686     slider->SetToolTip( wxU(p_item->psz_longtext) );
687     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
688     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
689     sizer->Layout();
690     this->SetSizerAndFit( sizer );
691 }
692
693 RangedIntConfigControl::~RangedIntConfigControl()
694 {
695     ;
696 }
697
698 int RangedIntConfigControl::GetIntValue()
699 {
700     return slider->GetValue();
701 }
702
703 /*****************************************************************************
704  * FloatConfigControl implementation
705  *****************************************************************************/
706 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
707                                         module_config_t *p_item,
708                                         wxWindow *parent )
709   : ConfigControl( p_this, p_item, parent )
710 {
711     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
712     textctrl = new wxTextCtrl( this, -1,
713                                wxString::Format(wxT("%f"),
714                                                 p_item->f_value),
715                                wxDefaultPosition, wxDefaultSize,
716                                wxTE_PROCESS_ENTER );
717     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
718     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
719     sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
720     sizer->Layout();
721     this->SetSizerAndFit( sizer );
722 }
723
724 FloatConfigControl::~FloatConfigControl()
725 {
726     ;
727 }
728
729 float FloatConfigControl::GetFloatValue()
730 {
731     float f_value;
732     if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
733         return f_value;
734     else return 0.0;
735 }
736
737 /*****************************************************************************
738  * BoolConfigControl implementation
739  *****************************************************************************/
740 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
741                                       module_config_t *p_item,
742                                       wxWindow *parent )
743   : ConfigControl( p_this, p_item, parent )
744 {
745     checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
746     if( p_item->i_value ) checkbox->SetValue(TRUE);
747     checkbox->SetToolTip( wxU(p_item->psz_longtext) );
748     sizer->Add( checkbox, 0, wxALL, 5 );
749     sizer->Layout();
750     this->SetSizerAndFit( sizer );
751 }
752
753 BoolConfigControl::~BoolConfigControl()
754 {
755     ;
756 }
757
758 int BoolConfigControl::GetIntValue()
759 {
760     if( checkbox->IsChecked() )
761     {
762         return 1;
763     }
764     else
765     {
766         return 0;
767     }
768 }