]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/preferences_widgets.cpp
* wxwindows/preferences_widgets.*: do not duplicate hot keys list in
[vlc] / modules / gui / wxwindows / preferences_widgets.cpp
1 /*****************************************************************************
2  * preferences_widgets.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2004 VideoLAN
5  * $Id$
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 wxString *KeyConfigControl::m_keysList = NULL;
162
163 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
164                                     module_config_t *p_item, wxWindow *parent )
165   : ConfigControl( p_this, p_item, parent )
166 {
167     // Number of keys descriptions
168     unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
169
170     // Init the keys decriptions array
171     if( m_keysList == NULL )
172     {
173         m_keysList = new wxString[i_keys];
174         for( unsigned int i = 0; i < i_keys; i++ )
175         {
176             m_keysList[i] = wxT(vlc_keys[i].psz_key_string);
177         }
178     }
179
180     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
181     alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
182     alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
183     ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
184     ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
185     shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
186     shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
187     combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
188                             wxDefaultSize, i_keys, m_keysList,
189                             wxCB_READONLY );
190     for( unsigned int i = 0; i < i_keys; i++ )
191     {
192         combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
193         if( (unsigned int)vlc_keys[i].i_key_code ==
194             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
195         {
196             combo->SetSelection( i );
197             combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
198         }
199     }
200
201     sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
202     sizer->Add( alt,   1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
203     sizer->Add( ctrl,  1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
204     sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
205     sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
206     sizer->Layout();
207     this->SetSizerAndFit( sizer );
208 }
209
210 KeyConfigControl::~KeyConfigControl()
211 {
212     if( m_keysList )
213     {
214         delete[] m_keysList;
215         m_keysList = NULL;
216     }
217 }
218
219 int KeyConfigControl::GetIntValue()
220 {
221     int result = 0;
222     if( alt->IsChecked() )
223     {
224         result |= KEY_MODIFIER_ALT;
225     }
226     if( ctrl->IsChecked() )
227     {
228         result |= KEY_MODIFIER_CTRL;
229     }
230     if( shift->IsChecked() )
231     {
232         result |= KEY_MODIFIER_SHIFT;
233     }
234     int selected = combo->GetSelection();
235     if( selected != -1 )
236     {
237         result |= (int)combo->GetClientData( selected );
238     }
239     return result;
240 }
241
242 /*****************************************************************************
243  * ModuleConfigControl implementation
244  *****************************************************************************/
245 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
246                                           module_config_t *p_item,
247                                           wxWindow *parent )
248   : ConfigControl( p_this, p_item, parent )
249 {
250     vlc_list_t *p_list;
251     module_t *p_parser;
252
253     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
254     combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
255                             wxDefaultPosition, wxDefaultSize,
256                             0, NULL, wxCB_READONLY | wxCB_SORT );
257
258     /* build a list of available modules */
259     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
260     combo->Append( wxU(_("Default")), (void *)NULL );
261     combo->SetSelection( 0 );
262     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
263     {
264         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
265
266         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
267         {
268             combo->Append( wxU(p_parser->psz_longname),
269                            p_parser->psz_object_name );
270             if( p_item->psz_value && !strcmp(p_item->psz_value,
271                                              p_parser->psz_object_name) )
272                 combo->SetValue( wxU(p_parser->psz_longname) );
273         }
274     }
275     vlc_list_release( p_list );
276
277     combo->SetToolTip( wxU(p_item->psz_longtext) );
278     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
279     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
280     sizer->Layout();
281     this->SetSizerAndFit( sizer );
282 }
283
284 ModuleConfigControl::~ModuleConfigControl()
285 {
286     ;
287 }
288
289 wxString ModuleConfigControl::GetPszValue()
290 {
291     return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
292 }
293
294 /*****************************************************************************
295  * StringConfigControl implementation
296  *****************************************************************************/
297 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
298                                           module_config_t *p_item,
299                                           wxWindow *parent )
300   : ConfigControl( p_this, p_item, parent )
301 {
302     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
303     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
304     textctrl = new wxTextCtrl( this, -1,
305                                wxL2U(p_item->psz_value),
306                                wxDefaultPosition,
307                                wxDefaultSize,
308                                wxTE_PROCESS_ENTER);
309     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
310     sizer->Add( textctrl, 1, wxALL, 5 );
311     sizer->Layout();
312     this->SetSizerAndFit( sizer );
313 }
314
315 StringConfigControl::~StringConfigControl()
316 {
317     ;
318 }
319
320 wxString StringConfigControl::GetPszValue()
321 {
322     return textctrl->GetValue();
323 }
324
325 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
326     /* Text events */
327     EVT_TEXT(-1, StringConfigControl::OnUpdate)
328 END_EVENT_TABLE()
329
330 /*****************************************************************************
331  * StringListConfigControl implementation
332  *****************************************************************************/
333 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
334                                                   module_config_t *p_item,
335                                                   wxWindow *parent )
336   : ConfigControl( p_this, p_item, parent )
337 {
338     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
339     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
340     combo = new wxComboBox( this, -1, wxT(""),
341                             wxDefaultPosition, wxDefaultSize,
342                             0, NULL, wxCB_READONLY );
343     UpdateCombo( p_item );
344
345     combo->SetToolTip( wxU(p_item->psz_longtext) );
346     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
347
348     for( int i = 0; i < p_item->i_action; i++ )
349     {
350         wxButton *button =
351             new wxButton( this, wxID_HIGHEST+i,
352                           wxU(p_item->ppsz_action_text[i]) );
353         sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
354     }
355
356     sizer->Layout();
357     this->SetSizerAndFit( sizer );
358 }
359
360 StringListConfigControl::~StringListConfigControl()
361 {
362 }
363
364 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
365 {
366     /* build a list of available options */
367     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
368     {
369         combo->Append( ( p_item->ppsz_list_text &&
370                          p_item->ppsz_list_text[i_index] ) ?
371                        wxU(p_item->ppsz_list_text[i_index]) :
372                        wxL2U(p_item->ppsz_list[i_index]) );
373         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
374         if( ( p_item->psz_value &&
375               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
376              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
377         {
378             combo->SetSelection( i_index );
379             combo->SetValue( ( p_item->ppsz_list_text &&
380                                p_item->ppsz_list_text[i_index] ) ?
381                              wxU(p_item->ppsz_list_text[i_index]) :
382                              wxL2U(p_item->ppsz_list[i_index]) );
383         }
384     }
385 }
386
387 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
388     /* Button events */
389     EVT_BUTTON(-1, StringListConfigControl::OnAction)
390
391     /* Text events */
392     EVT_TEXT(-1, StringListConfigControl::OnUpdate)
393 END_EVENT_TABLE()
394
395 void StringListConfigControl::OnAction( wxCommandEvent& event )
396 {
397     int i_action = event.GetId() - wxID_HIGHEST;
398
399     module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
400     if( !p_item ) return;
401
402     if( i_action < 0 || i_action >= p_item->i_action ) return;
403
404     vlc_value_t val;
405     wxString value = GetPszValue();
406     (const char *)val.psz_string = value.mb_str();
407     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
408
409     if( p_item->b_dirty )
410     {
411         combo->Clear();
412         UpdateCombo( p_item );
413         p_item->b_dirty = VLC_FALSE;
414     }
415 }
416
417 wxString StringListConfigControl::GetPszValue()
418 {
419     int selected = combo->GetSelection();
420     if( selected != -1 )
421     {
422         return wxL2U((char *)combo->GetClientData( selected ));
423     }
424     return wxString();
425 }
426
427 /*****************************************************************************
428  * FileConfigControl implementation
429  *****************************************************************************/
430 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
431                                       module_config_t *p_item,
432                                       wxWindow *parent )
433   : ConfigControl( p_this, p_item, parent )
434 {
435     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
436     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
437     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
438     textctrl = new wxTextCtrl( this, -1,
439                                wxL2U(p_item->psz_value),
440                                wxDefaultPosition,
441                                wxDefaultSize,
442                                wxTE_PROCESS_ENTER);
443     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
444     sizer->Add( textctrl, 1, wxALL, 5 );
445     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
446     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
447     sizer->Layout();
448     this->SetSizerAndFit( sizer );
449 }
450
451 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
452     /* Button events */
453     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
454 END_EVENT_TABLE()
455
456 void FileConfigControl::OnBrowse( wxCommandEvent& event )
457 {
458     if( directory )
459     {
460         wxDirDialog dialog( this, wxU(_("Choose directory")) );
461
462         if( dialog.ShowModal() == wxID_OK )
463         {
464             textctrl->SetValue( dialog.GetPath() );
465         }
466     }
467     else
468     {
469         wxFileDialog dialog( this, wxU(_("Choose file")),
470                              wxT(""), wxT(""), wxT("*.*"),
471 #if defined( __WXMSW__ )
472                              wxOPEN
473 #else
474                              wxOPEN | wxSAVE
475 #endif
476                            );
477         if( dialog.ShowModal() == wxID_OK )
478         {
479             textctrl->SetValue( dialog.GetPath() );
480         }
481     }
482 }
483
484 FileConfigControl::~FileConfigControl()
485 {
486     ;
487 }
488
489 wxString FileConfigControl::GetPszValue()
490 {
491     return textctrl->GetValue();
492 }
493
494 /*****************************************************************************
495  * IntegerConfigControl implementation
496  *****************************************************************************/
497 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
498                                             module_config_t *p_item,
499                                             wxWindow *parent )
500   : ConfigControl( p_this, p_item, parent )
501 {
502     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
503     spin = new wxSpinCtrl( this, -1,
504                            wxString::Format(wxT("%d"),
505                                             p_item->i_value),
506                            wxDefaultPosition, wxDefaultSize,
507                            wxSP_ARROW_KEYS,
508                            -10000000, 10000000, p_item->i_value);
509     spin->SetToolTip( wxU(p_item->psz_longtext) );
510     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
511     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
512     sizer->Layout();
513     this->SetSizerAndFit( sizer );
514 }
515
516 IntegerConfigControl::~IntegerConfigControl()
517 {
518     ;
519 }
520
521 int IntegerConfigControl::GetIntValue()
522 {
523     return spin->GetValue();
524 }
525
526 /*****************************************************************************
527  * IntegerListConfigControl implementation
528  *****************************************************************************/
529 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
530                                                     module_config_t *p_item,
531                                                     wxWindow *parent )
532   : ConfigControl( p_this, p_item, parent )
533 {
534     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
535     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
536     combo = new wxComboBox( this, -1, wxT(""),
537                             wxDefaultPosition, wxDefaultSize,
538                             0, NULL, wxCB_READONLY );
539
540     UpdateCombo( p_item );
541
542     combo->SetToolTip( wxU(p_item->psz_longtext) );
543     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
544
545     sizer->Layout();
546     this->SetSizerAndFit( sizer );
547 }
548
549 IntegerListConfigControl::~IntegerListConfigControl()
550 {
551 }
552
553 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
554 {
555     /* build a list of available options */
556     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
557     {
558         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
559         {
560             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
561         }
562         else
563         {
564             combo->Append( wxString::Format(wxT("%i"),
565                                             p_item->pi_list[i_index]) );
566         }
567         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
568         if( p_item->i_value == p_item->pi_list[i_index] )
569         {
570             combo->SetSelection( i_index );
571             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
572             {
573                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
574             }
575             else
576             {
577                 combo->SetValue( wxString::Format(wxT("%i"),
578                                                   p_item->pi_list[i_index]) );
579             }
580         }
581     }
582 }
583
584 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
585     /* Button events */
586     EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
587 END_EVENT_TABLE()
588
589 void IntegerListConfigControl::OnAction( wxCommandEvent& event )
590 {
591     int i_action = event.GetId() - wxID_HIGHEST;
592
593     module_config_t *p_item;
594     p_item = config_FindConfig( p_this, GetName().mb_str() );
595     if( !p_item ) return;
596
597     if( i_action < 0 || i_action >= p_item->i_action ) return;
598
599     vlc_value_t val;
600     val.i_int = GetIntValue();
601     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
602
603     if( p_item->b_dirty )
604     {
605         combo->Clear();
606         UpdateCombo( p_item );
607         p_item->b_dirty = VLC_FALSE;
608     }
609 }
610
611 int IntegerListConfigControl::GetIntValue()
612 {
613     int selected = combo->GetSelection();
614     if( selected != -1 )
615     {
616         return (int)combo->GetClientData( selected );
617     }
618     return -1;
619 }
620
621 /*****************************************************************************
622  * RangedIntConfigControl implementation
623  *****************************************************************************/
624 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
625                                                 module_config_t *p_item,
626                                                 wxWindow *parent )
627   : ConfigControl( p_this, p_item, parent )
628 {
629     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
630     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
631                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
632                            wxSL_LABELS | wxSL_HORIZONTAL );
633     slider->SetToolTip( wxU(p_item->psz_longtext) );
634     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
635     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
636     sizer->Layout();
637     this->SetSizerAndFit( sizer );
638 }
639
640 RangedIntConfigControl::~RangedIntConfigControl()
641 {
642     ;
643 }
644
645 int RangedIntConfigControl::GetIntValue()
646 {
647     return slider->GetValue();
648 }
649
650 /*****************************************************************************
651  * FloatConfigControl implementation
652  *****************************************************************************/
653 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
654                                         module_config_t *p_item,
655                                         wxWindow *parent )
656   : ConfigControl( p_this, p_item, parent )
657 {
658     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
659     textctrl = new wxTextCtrl( this, -1,
660                                wxString::Format(wxT("%f"),
661                                                 p_item->f_value),
662                                wxDefaultPosition, wxDefaultSize,
663                                wxTE_PROCESS_ENTER );
664     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
665     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
666     sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
667     sizer->Layout();
668     this->SetSizerAndFit( sizer );
669 }
670
671 FloatConfigControl::~FloatConfigControl()
672 {
673     ;
674 }
675
676 float FloatConfigControl::GetFloatValue()
677 {
678     float f_value;
679     if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
680         return f_value;
681     else return 0.0;
682 }
683
684 /*****************************************************************************
685  * BoolConfigControl implementation
686  *****************************************************************************/
687 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
688                                       module_config_t *p_item,
689                                       wxWindow *parent )
690   : ConfigControl( p_this, p_item, parent )
691 {
692     checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
693     if( p_item->i_value ) checkbox->SetValue(TRUE);
694     checkbox->SetToolTip( wxU(p_item->psz_longtext) );
695     sizer->Add( checkbox, 0, wxALL, 5 );
696     sizer->Layout();
697     this->SetSizerAndFit( sizer );
698 }
699
700 BoolConfigControl::~BoolConfigControl()
701 {
702     ;
703 }
704
705 int BoolConfigControl::GetIntValue()
706 {
707     if( checkbox->IsChecked() )
708     {
709         return 1;
710     }
711     else
712     {
713         return 0;
714     }
715 }