Remove code killed by previous commit
[vlc.git] / modules / gui / wince / preferences_widgets.cpp
1 /*****************************************************************************
2  * preferences_widgets.cpp : WinCE gui plugin for VLC
3  *****************************************************************************
4  * Copyright (C) 2000-2004 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Marodon Cedric <cedric_marodon@yahoo.fr>
8  *          Gildas Bazin <gbazin@videolan.org>
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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <vlc/vlc.h>
29 #include <vlc_interface.h>
30
31 #include "wince.h"
32
33 #include <windows.h>
34 #include <windowsx.h>
35 #include <winuser.h>
36 #include <commctrl.h>
37
38 #include "preferences_widgets.h"
39
40 /*****************************************************************************
41  * CreateConfigControl wrapper
42  *****************************************************************************/
43 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
44                                     module_config_t *p_item,
45                                     HWND parent, HINSTANCE hInst,
46                                     int *py_pos )
47 {
48     ConfigControl *p_control = NULL;
49
50     switch( p_item->i_type )
51     {
52     case CONFIG_ITEM_MODULE:
53         p_control = new ModuleConfigControl( p_this, p_item, parent, hInst, py_pos );
54         break;
55
56     case CONFIG_ITEM_STRING:
57         if( !p_item->i_list )
58         {
59             p_control = new StringConfigControl( p_this, p_item, parent, hInst, py_pos );
60         }
61         /*else
62         {
63             p_control = new StringListConfigControl( p_this, p_item, parent, hInst, py_pos );
64         }*/
65         break;
66 /*
67     case CONFIG_ITEM_FILE:
68     case CONFIG_ITEM_DIRECTORY:
69         p_control = new FileConfigControl( p_this, p_item, parent, hInst, py_pos );
70         break;
71
72     case CONFIG_ITEM_INTEGER:
73         if( p_item->i_list )
74         {
75             p_control = new IntegerListConfigControl( p_this, p_item, parent, hInst, py_pos );
76         }
77         else if( p_item->i_min != 0 || p_item->i_max != 0 )
78         {
79             p_control = new RangedIntConfigControl( p_this, p_item, parent, hInst, py_pos );
80         }
81         else
82         {
83             p_control = new IntegerConfigControl( p_this, p_item, parent, hInst, py_pos );
84         }
85         break;
86 */
87     case CONFIG_ITEM_KEY:
88         p_control = new KeyConfigControl( p_this, p_item, parent, hInst, py_pos  );
89         break;
90
91     case CONFIG_ITEM_FLOAT:
92         p_control = new FloatConfigControl( p_this, p_item, parent, hInst, py_pos );
93         break;
94
95     case CONFIG_ITEM_BOOL:
96         p_control = new BoolConfigControl( p_this, p_item, parent, hInst, py_pos );
97         break;
98
99     default:
100         break;
101     }
102
103     return p_control;
104 }
105
106 /*****************************************************************************
107  * ConfigControl implementation
108  *****************************************************************************/
109 ConfigControl::ConfigControl( vlc_object_t *_p_this,
110                               module_config_t *p_item,
111                               HWND parent, HINSTANCE hInst )
112   : p_this( _p_this ), pf_update_callback( NULL ), p_update_data( NULL ),
113     parent( parent ), name( p_item->psz_name ), i_type( p_item->i_type ),
114     b_advanced( p_item->b_advanced )
115
116 {
117     /*sizer = new wxBoxSizer( wxHORIZONTAL );*/
118 }
119
120 ConfigControl::~ConfigControl()
121 {
122 }
123
124 /*wxSizer *ConfigControl::Sizer()
125 {
126     return sizer;
127 }*/
128
129 char *ConfigControl::GetName()
130 {
131     return name;
132 }
133
134 int ConfigControl::GetType()
135 {
136     return i_type;
137 }
138
139 vlc_bool_t ConfigControl::IsAdvanced()
140 {
141     return b_advanced;
142 }
143
144 void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
145                                              void *p_data )
146 {
147     pf_update_callback = p_callback;
148     p_update_data = p_data;
149 }
150
151 void ConfigControl::OnUpdate( UINT event )
152 {
153     if( pf_update_callback )
154     {
155         pf_update_callback( p_update_data );
156     }
157 }
158
159 /*****************************************************************************
160  * KeyConfigControl implementation
161  *****************************************************************************/
162 string *KeyConfigControl::m_keysList = NULL;
163
164 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
165                                     module_config_t *p_item,
166                                     HWND parent, HINSTANCE hInst,
167                                     int * py_pos )
168   : ConfigControl( p_this, p_item, parent, hInst )
169 {
170     // Number of keys descriptions
171     unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
172
173     // Init the keys decriptions array
174     if( m_keysList == NULL )
175     {
176         m_keysList = new string[i_keys];
177         for( unsigned int i = 0; i < i_keys; i++ )
178         {
179             m_keysList[i] = vlc_keys[i].psz_key_string;
180         }
181     }
182
183     label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
184                 WS_CHILD | WS_VISIBLE | SS_LEFT, 5, *py_pos, 200, 15,
185                 parent, NULL, hInst, NULL );
186
187     *py_pos += 15 + 10;
188
189     alt = CreateWindow( _T("BUTTON"), _T("Alt"),
190                         WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
191                         20, *py_pos, 15, 15, parent, NULL, hInst, NULL );
192     Button_SetCheck( alt, p_item->i_value & KEY_MODIFIER_ALT ? BST_CHECKED :
193                      BST_UNCHECKED );
194
195     alt_label = CreateWindow( _T("STATIC"), _T("Alt"),
196                 WS_CHILD | WS_VISIBLE | SS_LEFT, 20 + 15 + 5, *py_pos, 30, 15,
197                 parent, NULL, hInst, NULL );
198
199     ctrl = CreateWindow( _T("BUTTON"), _T("Ctrl"),
200                 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
201                 20 + 15 + 5 + 30 + 5, *py_pos, 15, 15,
202                 parent, NULL, hInst, NULL );
203     Button_SetCheck( ctrl, p_item->i_value & KEY_MODIFIER_CTRL ? BST_CHECKED :
204                      BST_UNCHECKED );
205
206     ctrl_label = CreateWindow( _T("STATIC"), _T("Ctrl"),
207                 WS_CHILD | WS_VISIBLE | SS_LEFT,
208                 20 + 15 + 5 + 30 + 5 + 15 + 5, *py_pos, 30, 15,
209                 parent, NULL, hInst, NULL );
210
211     shift = CreateWindow( _T("BUTTON"), _T("Shift"),
212                 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
213                 20 + 15 + 5 + 2*(30 + 5) + 15 + 5, *py_pos, 15, 15,
214                 parent, NULL, hInst, NULL );
215     Button_SetCheck( shift, p_item->i_value & KEY_MODIFIER_SHIFT ?
216                      BST_CHECKED : BST_UNCHECKED );
217
218     shift_label = CreateWindow( _T("STATIC"), _T("Shift"),
219                 WS_CHILD | WS_VISIBLE | SS_LEFT,
220                 20 + 15 + 5 + 2*(30 + 5) + 2*(15 + 5), *py_pos, 30, 15,
221                 parent, NULL, hInst, NULL );
222
223     *py_pos += 15 + 10;
224
225     combo = CreateWindow( _T("COMBOBOX"), _T(""),
226                 WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST |
227                 CBS_SORT | WS_VSCROLL, 20, *py_pos, 130, 5*15 + 6,
228                 parent, NULL, hInst, NULL );
229
230     *py_pos += 15 + 10;
231
232     for( unsigned int i = 0; i < i_keys ; i++ )
233     {
234         ComboBox_AddString( combo, _FROMMB(m_keysList[i].c_str()) );
235         ComboBox_SetItemData( combo, i, (void*)vlc_keys[i].i_key_code );
236         if( (unsigned int)vlc_keys[i].i_key_code ==
237             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
238         {
239             ComboBox_SetCurSel( combo, i );
240             ComboBox_SetText( combo, _FROMMB(m_keysList[i].c_str()) );
241         }
242     }
243 }
244
245 KeyConfigControl::~KeyConfigControl()
246 {
247     if( m_keysList )
248     {
249         delete[] m_keysList;
250         m_keysList = NULL;
251     }
252 }
253
254 int KeyConfigControl::GetIntValue()
255 {
256     int result = 0;
257     if( Button_GetCheck( alt ) )
258     {
259         result |= KEY_MODIFIER_ALT;
260     }
261     if( Button_GetCheck( ctrl ) )
262     {
263         result |= KEY_MODIFIER_CTRL;
264     }
265     if( Button_GetCheck( shift ) )
266     {
267         result |= KEY_MODIFIER_SHIFT;
268     }
269     int selected = ComboBox_GetCurSel( combo );
270     if( selected != -1 )
271     {
272         result |= (int)ComboBox_GetItemData( combo, selected );
273     }
274     return result;
275 }
276
277 /*****************************************************************************
278  * ModuleConfigControl implementation
279  *****************************************************************************/
280 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
281                                           module_config_t *p_item,
282                                           HWND parent, HINSTANCE hInst,
283                                           int * py_pos )
284   : ConfigControl( p_this, p_item, parent, hInst )
285 {
286     vlc_list_t *p_list;
287     module_t *p_parser;
288
289     label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
290                           WS_CHILD | WS_VISIBLE | SS_LEFT,
291                           5, *py_pos, 200, 15,
292                           parent, NULL, hInst, NULL );
293
294     *py_pos += 15 + 10;
295
296     combo = CreateWindow( _T("COMBOBOX"), _T(""),
297                           WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL |
298                           CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL,
299                           20, *py_pos, 180, 5*15 + 6,
300                           parent, NULL, hInst, NULL);
301
302     *py_pos += 15 + 10;
303
304     /* build a list of available modules */
305     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
306     ComboBox_AddString( combo, _T("Default") );
307     ComboBox_SetItemData( combo, 0, (void *)NULL );
308     ComboBox_SetCurSel( combo, 0 );
309     //ComboBox_SetText( combo, _T("Default") );
310     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
311     {
312         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
313
314         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
315         {
316             ComboBox_AddString( combo, _FROMMB(p_parser->psz_longname) );
317             ComboBox_SetItemData( combo, i_index,
318                                   (void*)p_parser->psz_object_name );
319             if( p_item->psz_value && !strcmp(p_item->psz_value,
320                                              p_parser->psz_object_name) )
321             {
322                 ComboBox_SetCurSel( combo, i_index );
323                 //ComboBox_SetText( combo, _FROMMB(p_parser->psz_longname) );
324             }
325         }
326     }
327     vlc_list_release( p_list );
328 }
329
330 ModuleConfigControl::~ModuleConfigControl()
331 {
332     ;
333 }
334
335 char *ModuleConfigControl::GetPszValue()
336 {
337     int selected = ComboBox_GetCurSel( combo );
338     if( selected != -1 )
339         return (char *)ComboBox_GetItemData( combo, selected );
340     else return NULL;
341 }
342
343 /*****************************************************************************
344  * StringConfigControl implementation
345  *****************************************************************************/
346 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
347                                           module_config_t *p_item,
348                                           HWND parent, HINSTANCE hInst,
349                                           int * py_pos )
350   : ConfigControl( p_this, p_item, parent, hInst )
351 {
352     label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
353                           WS_CHILD | WS_VISIBLE | SS_LEFT,
354                           5, *py_pos, 200, 15,
355                           parent, NULL, hInst, NULL );
356
357     *py_pos += 15 + 10;
358
359     textctrl = CreateWindow( _T("EDIT"), p_item->psz_value ?
360                              _FROMMB(p_item->psz_value) : _T(""),
361                              WS_CHILD | WS_VISIBLE | WS_BORDER | SS_LEFT |
362                              ES_AUTOHSCROLL, 20, *py_pos - 3, 180, 15 + 3,
363                              parent, NULL, hInst, NULL );
364
365     *py_pos += 15 + 10;
366 }
367
368 StringConfigControl::~StringConfigControl()
369 {
370     ;
371 }
372
373 char *StringConfigControl::GetPszValue()
374 {
375     int i_size;
376     char *psz_result;
377     TCHAR *psz_string;
378
379     i_size = Edit_GetTextLength( textctrl );
380     psz_string = (TCHAR *)malloc( (i_size + 1) * sizeof(TCHAR) );
381     Edit_GetText( textctrl, psz_string, i_size + 1 );
382     psz_result = strdup( _TOMB(psz_string) );
383     free( psz_string );
384     return psz_result;
385 }
386
387 #if 0
388 /*****************************************************************************
389  * StringListConfigControl implementation
390  *****************************************************************************/
391 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
392                                                   module_config_t *p_item,
393                                                   HWND parent, HINSTANCE hInst,
394                                                   int * py_pos )
395   : ConfigControl( p_this, p_item, parent, hInst )
396 {
397     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
398     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
399     combo = new wxComboBox( this, -1, wxT(""),
400                             wxDefaultPosition, wxDefaultSize,
401                             0, NULL, wxCB_READONLY );
402     UpdateCombo( p_item );
403
404     combo->SetToolTip( wxU(p_item->psz_longtext) );
405     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
406
407     for( int i = 0; i < p_item->i_action; i++ )
408     {
409         wxButton *button =
410             new wxButton( this, wxID_HIGHEST+i,
411                           wxU(p_item->ppsz_action_text[i]) );
412         sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
413     }
414
415     sizer->Layout();
416     this->SetSizerAndFit( sizer );
417 }
418
419 StringListConfigControl::~StringListConfigControl()
420 {
421 }
422
423 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
424 {
425     /* build a list of available options */
426     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
427     {
428         combo->Append( ( p_item->ppsz_list_text &&
429                          p_item->ppsz_list_text[i_index] ) ?
430                        wxU(p_item->ppsz_list_text[i_index]) :
431                        wxL2U(p_item->ppsz_list[i_index]) );
432         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
433         if( ( p_item->psz_value &&
434               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
435              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
436         {
437             combo->SetSelection( i_index );
438             combo->SetValue( ( p_item->ppsz_list_text &&
439                                p_item->ppsz_list_text[i_index] ) ?
440                              wxU(p_item->ppsz_list_text[i_index]) :
441                              wxL2U(p_item->ppsz_list[i_index]) );
442         }
443     }
444 }
445
446 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
447     /* Button events */
448     EVT_BUTTON(-1, StringListConfigControl::OnAction)
449
450     /* Text events */
451     EVT__T(-1, StringListConfigControl::OnUpdate)
452 END_EVENT_TABLE()
453
454 void StringListConfigControl::OnAction( wxCommandEvent& event )
455 {
456     int i_action = event.GetId() - wxID_HIGHEST;
457
458     module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
459     if( !p_item ) return;
460
461     if( i_action < 0 || i_action >= p_item->i_action ) return;
462
463     vlc_value_t val;
464     wxString value = GetPszValue();
465     (const char *)val.psz_string = value.mb_str();
466     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
467
468     if( p_item->b_dirty )
469     {
470         combo->Clear();
471         UpdateCombo( p_item );
472         p_item->b_dirty = VLC_FALSE;
473     }
474 }
475
476 wxString StringListConfigControl::GetPszValue()
477 {
478     int selected = combo->GetSelection();
479     if( selected != -1 )
480     {
481         return wxL2U((char *)combo->GetClientData( selected ));
482     }
483     return wxString();
484 }
485
486 /*****************************************************************************
487  * FileConfigControl implementation
488  *****************************************************************************/
489 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
490                                       module_config_t *p_item,
491                                       HWND parent, HINSTANCE hInst,
492                                       int * py_pos )
493   : ConfigControl( p_this, p_item, parent, hInst )
494 {
495     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
496     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
497     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
498     textctrl = new wxTextCtrl( this, -1,
499                                wxL2U(p_item->psz_value),
500                                wxDefaultPosition,
501                                wxDefaultSize,
502                                wxTE_PROCESS_ENTER);
503     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
504     sizer->Add( textctrl, 1, wxALL, 5 );
505     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
506     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
507     sizer->Layout();
508     this->SetSizerAndFit( sizer );
509 }
510
511 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
512     /* Button events */
513     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
514 END_EVENT_TABLE()
515
516 void FileConfigControl::OnBrowse( wxCommandEvent& event )
517 {
518     if( directory )
519     {
520         wxDirDialog dialog( this, wxU(_("Choose directory")) );
521
522         if( dialog.ShowModal() == wxID_OK )
523         {
524             textctrl->SetValue( dialog.GetPath() );
525         }
526     }
527     else
528     {
529         wxFileDialog dialog( this, wxU(_("Choose file")),
530                              wxT(""), wxT(""), wxT("*.*"),
531 #if defined( __WXMSW__ )
532                              wxOPEN
533 #else
534                              wxOPEN | wxSAVE
535 #endif
536                            );
537         if( dialog.ShowModal() == wxID_OK )
538         {
539             textctrl->SetValue( dialog.GetPath() );
540         }
541     }
542 }
543
544 FileConfigControl::~FileConfigControl()
545 {
546     ;
547 }
548
549 wxString FileConfigControl::GetPszValue()
550 {
551     return textctrl->GetValue();
552 }
553
554 /*****************************************************************************
555  * IntegerConfigControl implementation
556  *****************************************************************************/
557 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
558                                             module_config_t *p_item,
559                                             HWND parent, HINSTANCE hInst,
560                                             int * py_pos )
561   : ConfigControl( p_this, p_item, parent, hInst )
562 {
563     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
564     spin = new wxSpinCtrl( this, -1,
565                            wxString::Format(wxT("%d"),
566                                             p_item->i_value),
567                            wxDefaultPosition, wxDefaultSize,
568                            wxSP_ARROW_KEYS,
569                            -10000000, 10000000, p_item->i_value);
570     spin->SetToolTip( wxU(p_item->psz_longtext) );
571     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
572     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
573     sizer->Layout();
574     this->SetSizerAndFit( sizer );
575 }
576
577 IntegerConfigControl::~IntegerConfigControl()
578 {
579     ;
580 }
581
582 int IntegerConfigControl::GetIntValue()
583 {
584     return spin->GetValue();
585 }
586
587 /*****************************************************************************
588  * IntegerListConfigControl implementation
589  *****************************************************************************/
590 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
591                                                     module_config_t *p_item,
592                                                     HWND parent,
593                                                     HINSTANCE hInst,
594                                                     int * py_pos )
595   : ConfigControl( p_this, p_item, parent, hInst )
596 {
597     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
598     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
599     combo = new wxComboBox( this, -1, wxT(""),
600                             wxDefaultPosition, wxDefaultSize,
601                             0, NULL, wxCB_READONLY );
602
603     UpdateCombo( p_item );
604
605     combo->SetToolTip( wxU(p_item->psz_longtext) );
606     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
607
608     sizer->Layout();
609     this->SetSizerAndFit( sizer );
610 }
611
612 IntegerListConfigControl::~IntegerListConfigControl()
613 {
614 }
615
616 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
617 {
618     /* build a list of available options */
619     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
620     {
621         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
622         {
623             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
624         }
625         else
626         {
627             combo->Append( wxString::Format(wxT("%i"),
628                                             p_item->pi_list[i_index]) );
629         }
630         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
631         if( p_item->i_value == p_item->pi_list[i_index] )
632         {
633             combo->SetSelection( i_index );
634             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
635             {
636                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
637             }
638             else
639             {
640                 combo->SetValue( wxString::Format(wxT("%i"),
641                                                   p_item->pi_list[i_index]) );
642             }
643         }
644     }
645 }
646
647 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
648     /* Button events */
649     EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
650 END_EVENT_TABLE()
651
652 void IntegerListConfigControl::OnAction( wxCommandEvent& event )
653 {
654     int i_action = event.GetId() - wxID_HIGHEST;
655
656     module_config_t *p_item;
657     p_item = config_FindConfig( p_this, GetName().mb_str() );
658     if( !p_item ) return;
659
660     if( i_action < 0 || i_action >= p_item->i_action ) return;
661
662     vlc_value_t val;
663     val.i_int = GetIntValue();
664     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
665
666     if( p_item->b_dirty )
667     {
668         combo->Clear();
669         UpdateCombo( p_item );
670         p_item->b_dirty = VLC_FALSE;
671     }
672 }
673
674 int IntegerListConfigControl::GetIntValue()
675 {
676     int selected = combo->GetSelection();
677     if( selected != -1 )
678     {
679         return (int)combo->GetClientData( selected );
680     }
681     return -1;
682 }
683
684 /*****************************************************************************
685  * RangedIntConfigControl implementation
686  *****************************************************************************/
687 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
688                                                 module_config_t *p_item,
689                                                 HWND parent, HINSTANCE hInst,
690                                                 int * py_pos )
691   : ConfigControl( p_this, p_item, parent, hInst )
692 {
693     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
694     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
695                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
696                            wxSL_LABELS | wxSL_HORIZONTAL );
697     slider->SetToolTip( wxU(p_item->psz_longtext) );
698     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
699     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
700     sizer->Layout();
701     this->SetSizerAndFit( sizer );
702 }
703
704 RangedIntConfigControl::~RangedIntConfigControl()
705 {
706     ;
707 }
708
709 int RangedIntConfigControl::GetIntValue()
710 {
711     return slider->GetValue();
712 }
713
714 #endif
715 /*****************************************************************************
716  * FloatConfigControl implementation
717  *****************************************************************************/
718 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
719                                         module_config_t *p_item,
720                                         HWND parent, HINSTANCE hInst,
721                                         int *py_pos )
722   : ConfigControl( p_this, p_item, parent, hInst )
723 {
724     label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
725                           WS_CHILD | WS_VISIBLE | SS_LEFT,
726                           5, *py_pos, 200, 15,
727                           parent, NULL, hInst, NULL );
728
729     *py_pos += 15 + 10;
730
731     TCHAR psz_string[100];
732     _stprintf( psz_string, _T("%f"), p_item->f_value );
733     textctrl = CreateWindow( _T("EDIT"), psz_string,
734         WS_CHILD | WS_VISIBLE | WS_BORDER | SS_RIGHT | ES_AUTOHSCROLL,
735         20, *py_pos - 3, 70, 15 + 3, parent, NULL, hInst, NULL );
736
737     *py_pos += 15 + 10;
738 }
739
740 FloatConfigControl::~FloatConfigControl()
741 {
742     ;
743 }
744
745 float FloatConfigControl::GetFloatValue()
746 {
747     float f_value;
748
749     int i_size = Edit_GetTextLength( textctrl );
750     TCHAR *psz_string = (TCHAR *)malloc( (i_size + 1) * sizeof(TCHAR) );
751     Edit_GetText( textctrl, psz_string, i_size + 1 );
752
753     if( _tscanf( psz_string, _T("%f"), &f_value ) == 1 )
754     {
755         free( psz_string );
756         return f_value;
757     }
758
759     free( psz_string );
760     return 0.0;
761 }
762
763 /*****************************************************************************
764  * BoolConfigControl implementation
765  *****************************************************************************/
766 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
767                                       module_config_t *p_item, HWND parent,
768                                       HINSTANCE hInst, int * py_pos )
769   : ConfigControl( p_this, p_item, parent, hInst )
770 {
771     checkbox = CreateWindow( _T("BUTTON"), _T(""),
772                              WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
773                              5, *py_pos, 15, 15,
774                              parent, NULL, hInst, NULL );
775     Button_SetCheck( checkbox, p_item->i_value ? BST_CHECKED : BST_UNCHECKED );
776
777     checkbox_label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
778                                    WS_CHILD | WS_VISIBLE | SS_LEFT,
779                                    5 + 15 + 5, *py_pos, 180, 15,
780                                    parent, NULL, hInst, NULL );
781
782     *py_pos += 15 + 10;
783 }
784
785 BoolConfigControl::~BoolConfigControl()
786 {
787     ;
788 }
789
790 int BoolConfigControl::GetIntValue()
791 {
792     if( Button_GetCheck( checkbox ) ) return 1;
793     else return 0;
794 }