preferences_widgets.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:26k
源码类别:

midi

开发平台:

Unix_Linux

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