]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/preferences_widgets.cpp
Improvements to preferences
[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@videolan.org>
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_config_cat.h>
37
38 #include "wxwindows.h"
39 #include "preferences_widgets.h"
40
41 #include <wx/statline.h>
42
43 /*****************************************************************************
44  * CreateConfigControl wrapper
45  *****************************************************************************/
46 ConfigControl *CreateConfigControl( vlc_object_t *p_this,
47                                     module_config_t *p_item, wxWindow *parent )
48 {
49     ConfigControl *p_control = NULL;
50
51     switch( p_item->i_type )
52     {
53     case CONFIG_ITEM_MODULE:
54         p_control = new ModuleConfigControl( p_this, p_item, parent );
55         break;
56     case CONFIG_ITEM_MODULE_LIST_CAT:
57         p_control = new ModuleListCatConfigControl( p_this, p_item, parent );
58         break;
59
60     case CONFIG_ITEM_STRING:
61         if( !p_item->i_list )
62         {
63             p_control = new StringConfigControl( p_this, p_item, parent );
64         }
65         else
66         {
67             p_control = new StringListConfigControl( p_this, p_item, parent );
68         }
69         break;
70
71     case CONFIG_ITEM_FILE:
72     case CONFIG_ITEM_DIRECTORY:
73         p_control = new FileConfigControl( p_this, p_item, parent );
74         break;
75
76     case CONFIG_ITEM_INTEGER:
77         if( p_item->i_list )
78         {
79             p_control = new IntegerListConfigControl( p_this, p_item, parent );
80         }
81         else if( p_item->i_min != 0 || p_item->i_max != 0 )
82         {
83             p_control = new RangedIntConfigControl( p_this, p_item, parent );
84         }
85         else
86         {
87             p_control = new IntegerConfigControl( p_this, p_item, parent );
88         }
89         break;
90
91     case CONFIG_ITEM_KEY:
92         p_control = new KeyConfigControl( p_this, p_item, parent );
93         break;
94
95     case CONFIG_ITEM_FLOAT:
96         p_control = new FloatConfigControl( p_this, p_item, parent );
97         break;
98
99     case CONFIG_ITEM_BOOL:
100         p_control = new BoolConfigControl( p_this, p_item, parent );
101         break;
102
103     case CONFIG_SECTION:
104         p_control = new SectionConfigControl( p_this, p_item, parent );
105         break;
106
107     default:
108         break;
109     }
110
111     return p_control;
112 }
113
114 /*****************************************************************************
115  * ConfigControl implementation
116  *****************************************************************************/
117 ConfigControl::ConfigControl( vlc_object_t *_p_this,
118                               module_config_t *p_item, wxWindow *parent )
119   : wxPanel( parent ), p_this( _p_this ),
120     pf_update_callback( NULL ), p_update_data( NULL ),
121     name( wxU(p_item->psz_name) ), i_type( p_item->i_type ),
122     b_advanced( p_item->b_advanced )
123
124 {
125     sizer = new wxBoxSizer( wxHORIZONTAL );
126 }
127
128 ConfigControl::~ConfigControl()
129 {
130 }
131
132 wxSizer *ConfigControl::Sizer()
133 {
134     return sizer;
135 }
136
137 wxString ConfigControl::GetName()
138 {
139     return name;
140 }
141
142 int ConfigControl::GetType()
143 {
144     return i_type;
145 }
146
147 vlc_bool_t ConfigControl::IsAdvanced()
148 {
149     return b_advanced;
150 }
151
152 void ConfigControl::SetUpdateCallback( void (*p_callback)( void * ),
153                                              void *p_data )
154 {
155     pf_update_callback = p_callback;
156     p_update_data = p_data;
157 }
158
159 void ConfigControl::OnUpdate( wxCommandEvent& WXUNUSED(event) )
160 {
161     if( pf_update_callback )
162     {
163         pf_update_callback( p_update_data );
164     }
165 }
166
167 /*****************************************************************************
168  * KeyConfigControl implementation
169  *****************************************************************************/
170 wxString *KeyConfigControl::m_keysList = NULL;
171
172 KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
173                                     module_config_t *p_item, wxWindow *parent )
174   : ConfigControl( p_this, p_item, parent )
175 {
176     // Number of keys descriptions
177     unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
178
179     // Init the keys decriptions array
180     if( m_keysList == NULL )
181     {
182         m_keysList = new wxString[i_keys];
183         for( unsigned int i = 0; i < i_keys; i++ )
184         {
185             m_keysList[i] = wxU(vlc_keys[i].psz_key_string);
186         }
187     }
188
189     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
190     alt = new wxCheckBox( this, -1, wxU(_("Alt")) );
191     alt->SetValue( p_item->i_value & KEY_MODIFIER_ALT );
192     ctrl = new wxCheckBox( this, -1, wxU(_("Ctrl")) );
193     ctrl->SetValue( p_item->i_value & KEY_MODIFIER_CTRL );
194     shift = new wxCheckBox( this, -1, wxU(_("Shift")) );
195     shift->SetValue( p_item->i_value & KEY_MODIFIER_SHIFT );
196     combo = new wxComboBox( this, -1, wxT(""), wxDefaultPosition,
197                             wxDefaultSize, i_keys, m_keysList,
198                             wxCB_READONLY );
199     for( unsigned int i = 0; i < i_keys; i++ )
200     {
201         combo->SetClientData( i, (void*)vlc_keys[i].i_key_code );
202         if( (unsigned int)vlc_keys[i].i_key_code ==
203             ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
204         {
205             combo->SetSelection( i );
206             combo->SetValue( wxU(_(vlc_keys[i].psz_key_string)) );
207         }
208     }
209
210     sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
211     sizer->Add( alt,   1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
212     sizer->Add( ctrl,  1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
213     sizer->Add( shift, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
214     sizer->Add( combo, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 );
215     sizer->Layout();
216     this->SetSizerAndFit( sizer );
217 }
218
219 KeyConfigControl::~KeyConfigControl()
220 {
221     if( m_keysList )
222     {
223         delete[] m_keysList;
224         m_keysList = NULL;
225     }
226 }
227
228 int KeyConfigControl::GetIntValue()
229 {
230     int result = 0;
231     if( alt->IsChecked() )
232     {
233         result |= KEY_MODIFIER_ALT;
234     }
235     if( ctrl->IsChecked() )
236     {
237         result |= KEY_MODIFIER_CTRL;
238     }
239     if( shift->IsChecked() )
240     {
241         result |= KEY_MODIFIER_SHIFT;
242     }
243     int selected = combo->GetSelection();
244     if( selected != -1 )
245     {
246         result |= (int)combo->GetClientData( selected );
247     }
248     return result;
249 }
250
251 /*****************************************************************************
252  * ModuleConfigControl implementation
253  *****************************************************************************/
254 ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
255                                           module_config_t *p_item,
256                                           wxWindow *parent )
257   : ConfigControl( p_this, p_item, parent )
258 {
259     vlc_list_t *p_list;
260     module_t *p_parser;
261
262     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
263     combo = new wxComboBox( this, -1, wxL2U(p_item->psz_value),
264                             wxDefaultPosition, wxDefaultSize,
265                             0, NULL, wxCB_READONLY | wxCB_SORT );
266
267     /* build a list of available modules */
268     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
269     combo->Append( wxU(_("Default")), (void *)NULL );
270     combo->SetSelection( 0 );
271     for( unsigned int i_index = 0; i_index < p_list->i_count; i_index++ )
272     {
273         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
274
275         if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
276         {
277             combo->Append( wxU(p_parser->psz_longname),
278                            p_parser->psz_object_name );
279             if( p_item->psz_value && !strcmp(p_item->psz_value,
280                                              p_parser->psz_object_name) )
281                 combo->SetValue( wxU(p_parser->psz_longname) );
282         }
283     }
284     vlc_list_release( p_list );
285
286     combo->SetToolTip( wxU(p_item->psz_longtext) );
287     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
288     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
289     sizer->Layout();
290     this->SetSizerAndFit( sizer );
291 }
292
293 ModuleConfigControl::~ModuleConfigControl()
294 {
295     ;
296 }
297
298 wxString ModuleConfigControl::GetPszValue()
299 {
300     return wxU( (char *)combo->GetClientData( combo->GetSelection() ));
301 }
302
303 /*****************************************************************************
304  * ModuleListCatonfigControl implementation
305  *****************************************************************************/
306 BEGIN_EVENT_TABLE(ModuleListCatConfigControl, wxPanel)
307     EVT_CHECKBOX( wxID_HIGHEST , ModuleListCatConfigControl::OnUpdate )
308 END_EVENT_TABLE()
309
310
311 ModuleListCatConfigControl::ModuleListCatConfigControl( vlc_object_t *p_this,
312                                                      module_config_t *p_item,
313                                                      wxWindow *parent )
314   : ConfigControl( p_this, p_item, parent )
315 {
316     vlc_list_t *p_list;
317     module_t *p_parser;
318
319     delete sizer;
320     sizer = new wxBoxSizer( wxVERTICAL );
321     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
322     sizer->Add( label );
323
324     text = new wxTextCtrl( this, -1, wxU(p_item->psz_value),
325                            wxDefaultPosition,wxSize( 300, 20 ) );
326
327
328     /* build a list of available modules */
329     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
330     for( unsigned int i_index = 0; i_index < p_list->i_count; i_index++ )
331     {
332         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
333
334         if( !strcmp( p_parser->psz_object_name, "main" ) )
335               continue;
336
337         module_config_t *p_config = p_parser->p_config;
338         if( p_config ) do
339         {
340             /* Hack: required subcategory is stored in i_min */
341             if( p_config->i_type == CONFIG_SUBCATEGORY &&
342                 p_config->i_value == p_item->i_min )
343             {
344                 moduleCheckBox *mc = new moduleCheckBox;
345                 mc->checkbox = new wxCheckBox( this, wxID_HIGHEST,
346                                                wxU(p_parser->psz_longname));
347                 mc->psz_module = strdup( p_parser->psz_object_name );
348                 pp_checkboxes.push_back( mc );
349
350                 if( p_item->psz_value &&
351                     strstr( p_item->psz_value, p_parser->psz_object_name ) )
352                 {
353                     mc->checkbox->SetValue( true );
354                 }
355                 sizer->Add( mc->checkbox );
356             }
357         } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
358     }
359     vlc_list_release( p_list );
360
361     text->SetToolTip( wxU(p_item->psz_longtext) );
362     sizer->Add(text, wxEXPAND );
363
364     sizer->Add (new wxStaticText( this, -1, wxU( vlc_wraptext( _("Select modules that you want. To get more advanced control, you can also modify the resulting chain by yourself") , 72, ISUTF8 ) ) ) );
365
366     sizer->Layout();
367     this->SetSizerAndFit( sizer );
368 }
369
370 ModuleListCatConfigControl::~ModuleListCatConfigControl()
371 {
372     ;
373 }
374
375 wxString ModuleListCatConfigControl::GetPszValue()
376 {
377     return wxU( text->GetValue().c_str() ) ;
378 }
379
380 void  ModuleListCatConfigControl::OnUpdate( wxCommandEvent &event )
381 {
382     wxString newtext = wxU("");
383     for( int i = 0 ; i< pp_checkboxes.size() ; i++ )
384     {
385         if( pp_checkboxes[i]->checkbox->IsChecked() )
386         {
387             if( newtext.Len() == 0 )
388             {
389                 newtext = newtext + wxU( pp_checkboxes[i]->psz_module );
390             }
391             else
392             {
393                 newtext += wxU( "," ) + wxU(pp_checkboxes[i]->psz_module);
394             }
395         }
396     }
397     text->SetValue( newtext );
398 }
399
400 /*****************************************************************************
401  * StringConfigControl implementation
402  *****************************************************************************/
403 StringConfigControl::StringConfigControl( vlc_object_t *p_this,
404                                           module_config_t *p_item,
405                                           wxWindow *parent )
406   : ConfigControl( p_this, p_item, parent )
407 {
408     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
409     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
410     textctrl = new wxTextCtrl( this, -1,
411                                wxL2U(p_item->psz_value),
412                                wxDefaultPosition,
413                                wxDefaultSize,
414                                wxTE_PROCESS_ENTER);
415     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
416     sizer->Add( textctrl, 1, wxALL, 5 );
417     sizer->Layout();
418     this->SetSizerAndFit( sizer );
419 }
420
421 StringConfigControl::~StringConfigControl()
422 {
423     ;
424 }
425
426 wxString StringConfigControl::GetPszValue()
427 {
428     return textctrl->GetValue();
429 }
430
431 BEGIN_EVENT_TABLE(StringConfigControl, wxPanel)
432     /* Text events */
433     EVT_TEXT(-1, StringConfigControl::OnUpdate)
434 END_EVENT_TABLE()
435
436 /*****************************************************************************
437  * StringListConfigControl implementation
438  *****************************************************************************/
439 StringListConfigControl::StringListConfigControl( vlc_object_t *p_this,
440                                                   module_config_t *p_item,
441                                                   wxWindow *parent )
442   : ConfigControl( p_this, p_item, parent )
443 {
444     psz_default_value = p_item->psz_value;
445     if( psz_default_value ) psz_default_value = strdup( psz_default_value );
446
447     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
448     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
449     combo = new wxComboBox( this, -1, wxT(""),
450                             wxDefaultPosition, wxDefaultSize,
451                             0, NULL, wxCB_READONLY );
452     UpdateCombo( p_item );
453
454     combo->SetToolTip( wxU(p_item->psz_longtext) );
455     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
456
457     for( int i = 0; i < p_item->i_action; i++ )
458     {
459         wxButton *button =
460             new wxButton( this, wxID_HIGHEST+i,
461                           wxU(p_item->ppsz_action_text[i]) );
462         sizer->Add( button, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
463     }
464
465     sizer->Layout();
466     this->SetSizerAndFit( sizer );
467 }
468
469 StringListConfigControl::~StringListConfigControl()
470 {
471     if( psz_default_value ) free( psz_default_value );
472 }
473
474 void StringListConfigControl::UpdateCombo( module_config_t *p_item )
475 {
476     vlc_bool_t b_found = VLC_FALSE;
477     int i_index;
478
479     /* build a list of available options */
480     for( i_index = 0; i_index < p_item->i_list; i_index++ )
481     {
482         combo->Append( ( p_item->ppsz_list_text &&
483                          p_item->ppsz_list_text[i_index] ) ?
484                        wxU(p_item->ppsz_list_text[i_index]) :
485                        wxL2U(p_item->ppsz_list[i_index]) );
486         combo->SetClientData( i_index, (void *)p_item->ppsz_list[i_index] );
487         if( ( p_item->psz_value &&
488               !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) ) ||
489              ( !p_item->psz_value && !*p_item->ppsz_list[i_index] ) )
490         {
491             combo->SetSelection( i_index );
492             combo->SetValue( ( p_item->ppsz_list_text &&
493                                p_item->ppsz_list_text[i_index] ) ?
494                              wxU(p_item->ppsz_list_text[i_index]) :
495                              wxL2U(p_item->ppsz_list[i_index]) );
496             b_found = VLC_TRUE;
497         }
498     }
499
500     if( p_item->psz_value && !b_found )
501     {
502         /* Add custom entry to list */
503         combo->Append( wxL2U(p_item->psz_value) );
504         combo->SetClientData( i_index, (void *)psz_default_value );
505         combo->SetSelection( i_index );
506         combo->SetValue( wxL2U(p_item->psz_value) );
507     }
508 }
509
510 BEGIN_EVENT_TABLE(StringListConfigControl, wxPanel)
511     /* Button events */
512     EVT_BUTTON(-1, StringListConfigControl::OnAction)
513
514     /* Text events */
515     EVT_TEXT(-1, StringListConfigControl::OnUpdate)
516 END_EVENT_TABLE()
517
518 void StringListConfigControl::OnAction( wxCommandEvent& event )
519 {
520     int i_action = event.GetId() - wxID_HIGHEST;
521
522     module_config_t *p_item = config_FindConfig( p_this, GetName().mb_str() );
523     if( !p_item ) return;
524
525     if( i_action < 0 || i_action >= p_item->i_action ) return;
526
527     vlc_value_t val;
528     wxString value = GetPszValue();
529     *((const char **)&val.psz_string) = value.mb_str();
530     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
531
532     if( p_item->b_dirty )
533     {
534         combo->Clear();
535         UpdateCombo( p_item );
536         p_item->b_dirty = VLC_FALSE;
537     }
538 }
539
540 wxString StringListConfigControl::GetPszValue()
541 {
542     int selected = combo->GetSelection();
543     if( selected != -1 )
544     {
545         return wxL2U((char *)combo->GetClientData( selected ));
546     }
547     return wxString();
548 }
549
550 /*****************************************************************************
551  * FileConfigControl implementation
552  *****************************************************************************/
553 FileConfigControl::FileConfigControl( vlc_object_t *p_this,
554                                       module_config_t *p_item,
555                                       wxWindow *parent )
556   : ConfigControl( p_this, p_item, parent )
557 {
558     directory = p_item->i_type == CONFIG_ITEM_DIRECTORY;
559     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
560     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
561     textctrl = new wxTextCtrl( this, -1,
562                                wxL2U(p_item->psz_value),
563                                wxDefaultPosition,
564                                wxDefaultSize,
565                                wxTE_PROCESS_ENTER);
566     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
567     sizer->Add( textctrl, 1, wxALL, 5 );
568     browse = new wxButton( this, wxID_HIGHEST, wxU(_("Browse...")) );
569     sizer->Add( browse, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
570     sizer->Layout();
571     this->SetSizerAndFit( sizer );
572 }
573
574 BEGIN_EVENT_TABLE(FileConfigControl, wxPanel)
575     /* Button events */
576     EVT_BUTTON(wxID_HIGHEST, FileConfigControl::OnBrowse)
577 END_EVENT_TABLE()
578
579 void FileConfigControl::OnBrowse( wxCommandEvent& event )
580 {
581     if( directory )
582     {
583         wxDirDialog dialog( this, wxU(_("Choose directory")) );
584
585         if( dialog.ShowModal() == wxID_OK )
586         {
587             textctrl->SetValue( dialog.GetPath() );
588         }
589     }
590     else
591     {
592         wxFileDialog dialog( this, wxU(_("Choose file")),
593                              wxT(""), wxT(""), wxT("*.*"),
594 #if defined( __WXMSW__ )
595                              wxOPEN
596 #else
597                              wxOPEN | wxSAVE
598 #endif
599                            );
600         if( dialog.ShowModal() == wxID_OK )
601         {
602             textctrl->SetValue( dialog.GetPath() );
603         }
604     }
605 }
606
607 FileConfigControl::~FileConfigControl()
608 {
609     ;
610 }
611
612 wxString FileConfigControl::GetPszValue()
613 {
614     return textctrl->GetValue();
615 }
616
617 /*****************************************************************************
618  * IntegerConfigControl implementation
619  *****************************************************************************/
620 BEGIN_EVENT_TABLE(IntegerConfigControl, wxPanel)
621     EVT_TEXT(-1, IntegerConfigControl::OnUpdate)
622     EVT_COMMAND_SCROLL(-1, IntegerConfigControl::OnUpdate)
623 END_EVENT_TABLE()
624
625 IntegerConfigControl::IntegerConfigControl( vlc_object_t *p_this,
626                                             module_config_t *p_item,
627                                             wxWindow *parent )
628   : ConfigControl( p_this, p_item, parent )
629 {
630     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
631     spin = new wxSpinCtrl( this, -1,
632                            wxString::Format(wxT("%d"),
633                                             p_item->i_value),
634                            wxDefaultPosition, wxDefaultSize,
635                            wxSP_ARROW_KEYS,
636                            -100000000, 100000000, p_item->i_value);
637     spin->SetToolTip( wxU(p_item->psz_longtext) );
638     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
639     sizer->Add( spin, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
640     sizer->Layout();
641     this->SetSizerAndFit( sizer );
642     i_value = p_item->i_value;
643 }
644
645 IntegerConfigControl::~IntegerConfigControl()
646 {
647     ;
648 }
649
650 int IntegerConfigControl::GetIntValue()
651 {
652     /* We avoid using GetValue because of a recursion bug with wxSpinCtrl with
653      * wxGTK. */
654     return i_value; //spin->GetValue();
655 }
656
657 void IntegerConfigControl::OnUpdate( wxCommandEvent &event )
658 {
659     i_value = event.GetInt();
660     ConfigControl::OnUpdate( event );
661 }
662
663 /*****************************************************************************
664  * IntegerListConfigControl implementation
665  *****************************************************************************/
666 IntegerListConfigControl::IntegerListConfigControl( vlc_object_t *p_this,
667                                                     module_config_t *p_item,
668                                                     wxWindow *parent )
669   : ConfigControl( p_this, p_item, parent )
670 {
671     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
672     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
673     combo = new wxComboBox( this, -1, wxT(""),
674                             wxDefaultPosition, wxDefaultSize,
675                             0, NULL, wxCB_READONLY );
676
677     UpdateCombo( p_item );
678
679     combo->SetToolTip( wxU(p_item->psz_longtext) );
680     sizer->Add( combo, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
681
682     sizer->Layout();
683     this->SetSizerAndFit( sizer );
684 }
685
686 IntegerListConfigControl::~IntegerListConfigControl()
687 {
688 }
689
690 void IntegerListConfigControl::UpdateCombo( module_config_t *p_item )
691 {
692     /* build a list of available options */
693     for( int i_index = 0; i_index < p_item->i_list; i_index++ )
694     {
695         if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
696         {
697             combo->Append( wxU(p_item->ppsz_list_text[i_index]) );
698         }
699         else
700         {
701             combo->Append( wxString::Format(wxT("%i"),
702                                             p_item->pi_list[i_index]) );
703         }
704         combo->SetClientData( i_index, (void *)p_item->pi_list[i_index] );
705         if( p_item->i_value == p_item->pi_list[i_index] )
706         {
707             combo->SetSelection( i_index );
708             if( p_item->ppsz_list_text && p_item->ppsz_list_text[i_index] )
709             {
710                 combo->SetValue( wxU(p_item->ppsz_list_text[i_index]) );
711             }
712             else
713             {
714                 combo->SetValue( wxString::Format(wxT("%i"),
715                                                   p_item->pi_list[i_index]) );
716             }
717         }
718     }
719 }
720
721 BEGIN_EVENT_TABLE(IntegerListConfigControl, wxPanel)
722     /* Button events */
723     EVT_BUTTON(-1, IntegerListConfigControl::OnAction)
724 END_EVENT_TABLE()
725
726 void IntegerListConfigControl::OnAction( wxCommandEvent& event )
727 {
728     int i_action = event.GetId() - wxID_HIGHEST;
729
730     module_config_t *p_item;
731     p_item = config_FindConfig( p_this, GetName().mb_str() );
732     if( !p_item ) return;
733
734     if( i_action < 0 || i_action >= p_item->i_action ) return;
735
736     vlc_value_t val;
737     val.i_int = GetIntValue();
738     p_item->ppf_action[i_action]( p_this, GetName().mb_str(), val, val, 0 );
739
740     if( p_item->b_dirty )
741     {
742         combo->Clear();
743         UpdateCombo( p_item );
744         p_item->b_dirty = VLC_FALSE;
745     }
746 }
747
748 int IntegerListConfigControl::GetIntValue()
749 {
750     int selected = combo->GetSelection();
751     if( selected != -1 )
752     {
753         return (int)combo->GetClientData( selected );
754     }
755     return -1;
756 }
757
758 /*****************************************************************************
759  * RangedIntConfigControl implementation
760  *****************************************************************************/
761 BEGIN_EVENT_TABLE(RangedIntConfigControl, wxPanel)
762     EVT_COMMAND_SCROLL(-1, RangedIntConfigControl::OnUpdate)
763 END_EVENT_TABLE()
764
765 RangedIntConfigControl::RangedIntConfigControl( vlc_object_t *p_this,
766                                                 module_config_t *p_item,
767                                                 wxWindow *parent )
768   : ConfigControl( p_this, p_item, parent )
769 {
770     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
771     slider = new wxSlider( this, -1, p_item->i_value, p_item->i_min,
772                            p_item->i_max, wxDefaultPosition, wxDefaultSize,
773                            wxSL_LABELS | wxSL_HORIZONTAL );
774     slider->SetToolTip( wxU(p_item->psz_longtext) );
775     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
776     sizer->Add( slider, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
777     sizer->Layout();
778     this->SetSizerAndFit( sizer );
779 }
780
781 RangedIntConfigControl::~RangedIntConfigControl()
782 {
783     ;
784 }
785
786 int RangedIntConfigControl::GetIntValue()
787 {
788     return slider->GetValue();
789 }
790
791 /*****************************************************************************
792  * FloatConfigControl implementation
793  *****************************************************************************/
794 BEGIN_EVENT_TABLE(FloatConfigControl, wxPanel)
795     EVT_TEXT(-1, FloatConfigControl::OnUpdate)
796 END_EVENT_TABLE()
797
798 FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
799                                         module_config_t *p_item,
800                                         wxWindow *parent )
801   : ConfigControl( p_this, p_item, parent )
802 {
803     label = new wxStaticText(this, -1, wxU(p_item->psz_text));
804     textctrl = new wxTextCtrl( this, -1,
805                                wxString::Format(wxT("%f"),
806                                                 p_item->f_value),
807                                wxDefaultPosition, wxDefaultSize,
808                                wxTE_PROCESS_ENTER );
809     textctrl->SetToolTip( wxU(p_item->psz_longtext) );
810     sizer->Add( label, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
811     sizer->Add( textctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
812     sizer->Layout();
813     this->SetSizerAndFit( sizer );
814 }
815
816 FloatConfigControl::~FloatConfigControl()
817 {
818     ;
819 }
820
821 float FloatConfigControl::GetFloatValue()
822 {
823     float f_value;
824     if( (wxSscanf(textctrl->GetValue(), wxT("%f"), &f_value) == 1) )
825         return f_value;
826     else return 0.0;
827 }
828
829 /*****************************************************************************
830  * BoolConfigControl implementation
831  *****************************************************************************/
832 BEGIN_EVENT_TABLE(BoolConfigControl, wxPanel)
833     EVT_CHECKBOX(-1, BoolConfigControl::OnUpdate)
834 END_EVENT_TABLE()
835
836 BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
837                                       module_config_t *p_item,
838                                       wxWindow *parent )
839   : ConfigControl( p_this, p_item, parent )
840 {
841     checkbox = new wxCheckBox( this, -1, wxU(p_item->psz_text) );
842     if( p_item->i_value ) checkbox->SetValue(TRUE);
843     checkbox->SetToolTip( wxU(p_item->psz_longtext) );
844     sizer->Add( checkbox, 0, wxALL, 5 );
845     sizer->Layout();
846     this->SetSizerAndFit( sizer );
847 }
848
849 BoolConfigControl::~BoolConfigControl()
850 {
851     ;
852 }
853
854 int BoolConfigControl::GetIntValue()
855 {
856     if( checkbox->IsChecked() ) return 1;
857     else return 0;
858 }
859
860 /*****************************************************************************
861  * SectionConfigControl implementation
862  *****************************************************************************/
863 SectionConfigControl::SectionConfigControl( vlc_object_t *p_this,
864                                             module_config_t *p_item,
865                                             wxWindow *parent )
866   : ConfigControl( p_this, p_item, parent )
867 {
868     delete sizer;
869     sizer = new wxBoxSizer( wxVERTICAL );
870     sizer->Add( new wxStaticText( this, -1, wxU( p_item->psz_text ) ) );
871     sizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND, 5 );
872     sizer->Layout();
873     this->SetSizerAndFit( sizer );
874 }
875
876 SectionConfigControl::~SectionConfigControl()
877 {
878     ;
879 }