open.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:47k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * open.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004 VideoLAN
  5.  * $Id: open.cpp 9035 2004-10-22 13:33:31Z gbazin $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                      /* malloc(), free() */
  27. #include <errno.h>                                                 /* ENOMEM */
  28. #include <string.h>                                            /* strerror() */
  29. #include <stdio.h>
  30. #include <vlc/vlc.h>
  31. #include <wx/combobox.h>
  32. #include <wx/statline.h>
  33. #include <wx/tokenzr.h>
  34. #include <vlc/intf.h>
  35. #include "wxwindows.h"
  36. #include "preferences_widgets.h"
  37. #ifndef wxRB_SINGLE
  38. #   define wxRB_SINGLE 0
  39. #endif
  40. /*****************************************************************************
  41.  * Event Table.
  42.  *****************************************************************************/
  43. /* IDs for the controls and the menu commands */
  44. enum
  45. {
  46.     Notebook_Event = wxID_HIGHEST,
  47.     MRL_Event,
  48.     FileBrowse_Event,
  49.     FileName_Event,
  50.     DiscType_Event,
  51.     DiscDevice_Event,
  52.     DiscTitle_Event,
  53.     DiscChapter_Event,
  54.     DiscSub_Event,
  55.     NetType_Event,
  56.     NetRadio1_Event, NetRadio2_Event, NetRadio3_Event, NetRadio4_Event,
  57.     NetPort1_Event, NetPort2_Event, NetPort3_Event,
  58.     NetAddr1_Event, NetAddr2_Event, NetAddr3_Event, NetAddr4_Event,
  59.     NetForceIPv6_Event,
  60.     SubsFileEnable_Event,
  61.     SubsFileSettings_Event,
  62.     SoutEnable_Event,
  63.     SoutSettings_Event,
  64.     CachingEnable_Event,
  65.     CachingChange_Event,
  66.     AdvancedOptions_Event
  67. };
  68. BEGIN_EVENT_TABLE(OpenDialog, wxDialog)
  69.     /* Button events */
  70.     EVT_BUTTON(wxID_OK, OpenDialog::OnOk)
  71.     EVT_BUTTON(wxID_CANCEL, OpenDialog::OnCancel)
  72.     EVT_NOTEBOOK_PAGE_CHANGED(Notebook_Event, OpenDialog::OnPageChange)
  73.     EVT_TEXT(MRL_Event, OpenDialog::OnMRLChange)
  74.     /* Events generated by the file panel */
  75.     EVT_TEXT(FileName_Event, OpenDialog::OnFilePanelChange)
  76.     EVT_BUTTON(FileBrowse_Event, OpenDialog::OnFileBrowse)
  77.     /* Events generated by the disc panel */
  78.     EVT_RADIOBOX(DiscType_Event, OpenDialog::OnDiscTypeChange)
  79.     EVT_TEXT(DiscDevice_Event, OpenDialog::OnDiscDeviceChange)
  80.     EVT_TEXT(DiscDevice_Event, OpenDialog::OnDiscPanelChange)
  81.     EVT_TEXT(DiscTitle_Event, OpenDialog::OnDiscPanelChange)
  82.     EVT_SPINCTRL(DiscTitle_Event, OpenDialog::OnDiscPanelChange)
  83.     EVT_TEXT(DiscChapter_Event, OpenDialog::OnDiscPanelChange)
  84.     EVT_SPINCTRL(DiscChapter_Event, OpenDialog::OnDiscPanelChange)
  85.     EVT_TEXT(DiscSub_Event, OpenDialog::OnDiscPanelChange)
  86.     EVT_SPINCTRL(DiscSub_Event, OpenDialog::OnDiscPanelChange)
  87.     /* Events generated by the net panel */
  88.     EVT_RADIOBUTTON(NetRadio1_Event, OpenDialog::OnNetTypeChange)
  89.     EVT_RADIOBUTTON(NetRadio2_Event, OpenDialog::OnNetTypeChange)
  90.     EVT_RADIOBUTTON(NetRadio3_Event, OpenDialog::OnNetTypeChange)
  91.     EVT_RADIOBUTTON(NetRadio4_Event, OpenDialog::OnNetTypeChange)
  92.     EVT_TEXT(NetPort1_Event, OpenDialog::OnNetPanelChange)
  93.     EVT_SPINCTRL(NetPort1_Event, OpenDialog::OnNetPanelChange)
  94.     EVT_TEXT(NetPort2_Event, OpenDialog::OnNetPanelChange)
  95.     EVT_SPINCTRL(NetPort2_Event, OpenDialog::OnNetPanelChange)
  96.     EVT_TEXT(NetPort3_Event, OpenDialog::OnNetPanelChange)
  97.     EVT_SPINCTRL(NetPort3_Event, OpenDialog::OnNetPanelChange)
  98.     EVT_TEXT(NetAddr2_Event, OpenDialog::OnNetPanelChange)
  99.     EVT_TEXT(NetAddr3_Event, OpenDialog::OnNetPanelChange)
  100.     EVT_TEXT(NetAddr4_Event, OpenDialog::OnNetPanelChange)
  101.     EVT_CHECKBOX(NetForceIPv6_Event, OpenDialog::OnNetPanelChange)
  102.     /* Events generated by the subtitle file buttons */
  103.     EVT_CHECKBOX(SubsFileEnable_Event, OpenDialog::OnSubsFileEnable)
  104.     EVT_BUTTON(SubsFileSettings_Event, OpenDialog::OnSubsFileSettings)
  105.     /* Events generated by the stream output buttons */
  106.     EVT_CHECKBOX(SoutEnable_Event, OpenDialog::OnSoutEnable)
  107.     EVT_BUTTON(SoutSettings_Event, OpenDialog::OnSoutSettings)
  108.     /* Events generated by the caching button */
  109.     EVT_CHECKBOX(CachingEnable_Event, OpenDialog::OnCachingEnable)
  110.     EVT_TEXT(CachingChange_Event, OpenDialog::OnCachingChange)
  111.     EVT_SPINCTRL(CachingChange_Event, OpenDialog::OnCachingChange)
  112.     /* Hide the window when the user closes the window */
  113.     EVT_CLOSE(OpenDialog::OnCancel)
  114. END_EVENT_TABLE()
  115. /*****************************************************************************
  116.  * AutoBuiltPanel.
  117.  *****************************************************************************/
  118. WX_DEFINE_ARRAY(ConfigControl *, ArrayOfConfigControls);
  119. class AutoBuiltPanel : public wxPanel
  120. {
  121. public:
  122.     AutoBuiltPanel() { }
  123.     AutoBuiltPanel( wxWindow *, OpenDialog *, intf_thread_t *,
  124.                     const module_t * );
  125.     virtual ~AutoBuiltPanel() {}
  126.     void UpdateAdvancedMRL();
  127.     wxString name;
  128.     ArrayOfConfigControls config_array;
  129.     ArrayOfConfigControls advanced_config_array;
  130.     wxComboBox *p_advanced_mrl_combo;
  131. private:
  132.     intf_thread_t *p_intf;
  133.     OpenDialog *p_open_dialog;
  134.     void OnAdvanced( wxCommandEvent& event );
  135.     wxDialog *p_advanced_dialog;
  136.     DECLARE_EVENT_TABLE();
  137. };
  138. BEGIN_EVENT_TABLE(AutoBuiltPanel, wxPanel)
  139.     EVT_BUTTON(AdvancedOptions_Event, AutoBuiltPanel::OnAdvanced)
  140. END_EVENT_TABLE()
  141. static void AutoBuildCallback( void *p_data )
  142. {
  143.     ((OpenDialog *)p_data)->UpdateMRL();
  144. }
  145. static void AutoBuildAdvancedCallback( void *p_data )
  146. {
  147.     ((AutoBuiltPanel *)p_data)->UpdateAdvancedMRL();
  148. }
  149. AutoBuiltPanel::AutoBuiltPanel( wxWindow *parent, OpenDialog *dialog,
  150.                                 intf_thread_t *_p_intf,
  151.                                 const module_t *p_module )
  152.   : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize ),
  153.     name( wxU(p_module->psz_object_name) ),
  154.     p_advanced_mrl_combo( NULL ),
  155.     p_intf( _p_intf ), p_open_dialog( dialog ), p_advanced_dialog( NULL )
  156. {
  157.     wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
  158.     module_config_t *p_item = p_module->p_config;
  159.     bool b_advanced = false;
  160.     if( p_item ) do
  161.     {
  162.         if( !(p_item->i_type & CONFIG_HINT) && p_item->b_advanced )
  163.             b_advanced = true;
  164.         if( p_item->i_type & CONFIG_HINT || p_item->b_advanced )
  165.             continue;
  166.         ConfigControl *control =
  167.             CreateConfigControl( VLC_OBJECT(p_intf), p_item, this );
  168.         config_array.Add( control );
  169.         /* Don't add items that were not recognized */
  170.         if( control == NULL ) continue;
  171.         control->SetUpdateCallback( AutoBuildCallback, (void *)dialog );
  172.         sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
  173.     }
  174.     while( p_item->i_type != CONFIG_HINT_END && p_item++ );
  175.     if( b_advanced )
  176.     {
  177.         wxButton *button =
  178.             new wxButton( this, AdvancedOptions_Event,
  179.                           wxU(_("Advanced options...")) );
  180.         sizer->Add( button, 0, wxALL, 5 );
  181.         /* Build the advanced dialog */
  182.         p_advanced_dialog =
  183.             new wxDialog( this, -1, ((wxString)wxU(_("Advanced options"))) +
  184.                           wxT(" (") + wxU( p_module->psz_longname ) + wxT(")"),
  185.                           wxDefaultPosition, wxDefaultSize,
  186.                           wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
  187.         wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
  188.         /* Create MRL combobox */
  189.         wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
  190.         wxStaticBox *mrl_box =
  191.             new wxStaticBox( p_advanced_dialog, -1,
  192.                              wxU(_("Advanced options")) );
  193.         wxStaticBoxSizer *mrl_sizer =
  194.             new wxStaticBoxSizer( mrl_box, wxHORIZONTAL );
  195.         wxStaticText *mrl_label =
  196.             new wxStaticText( p_advanced_dialog, -1, wxU(_("Options:")) );
  197.         p_advanced_mrl_combo =
  198.             new wxComboBox( p_advanced_dialog, MRL_Event, wxT(""),
  199.                             wxDefaultPosition, wxDefaultSize );
  200.         mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
  201.         mrl_sizer->Add( p_advanced_mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
  202.         mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
  203.         sizer->Add( mrl_sizer_sizer, 0, wxEXPAND | wxALL, 2 );
  204.         /* Add advanced options to panel */
  205.         module_config_t *p_item = p_module->p_config;
  206.         if( p_item ) do
  207.         {
  208.             if( p_item->i_type & CONFIG_HINT || !p_item->b_advanced )
  209.                 continue;
  210.             ConfigControl *control =
  211.                 CreateConfigControl( VLC_OBJECT(p_intf), p_item,
  212.                                      p_advanced_dialog );
  213.             advanced_config_array.Add( control );
  214.             /* Don't add items that were not recognized */
  215.             if( control == NULL ) continue;
  216.             control->SetUpdateCallback( AutoBuildAdvancedCallback,
  217.                                         (void *)this );
  218.             sizer->Add( control, 0, wxEXPAND | wxALL, 2 );
  219.         }
  220.         while( p_item->i_type != CONFIG_HINT_END && p_item++ );
  221.         /* Separation */
  222.         wxPanel *dummy_panel = new wxPanel( p_advanced_dialog, -1 );
  223.         sizer->Add( dummy_panel, 1 );
  224.         wxStaticLine *static_line =
  225.             new wxStaticLine( p_advanced_dialog, wxID_OK );
  226.         sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
  227.         /* Create buttons */
  228.         wxButton *ok_button =
  229.             new wxButton( p_advanced_dialog, wxID_OK, wxU(_("OK")) );
  230.         ok_button->SetDefault();
  231.         wxButton *cancel_button =
  232.             new wxButton( p_advanced_dialog, wxID_CANCEL, wxU(_("Cancel")) );
  233.         wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
  234.         button_sizer->Add( ok_button, 0, wxALL, 5 );
  235.         button_sizer->Add( cancel_button, 0, wxALL, 5 );
  236.         button_sizer->Layout();
  237.         sizer->Add( button_sizer, 0, wxALL, 0 );
  238.         sizer->SetMinSize( 400, -1 );
  239.         p_advanced_dialog->SetSizerAndFit( sizer );
  240.     }
  241.     this->SetSizerAndFit( sizer );
  242. }
  243. void AutoBuiltPanel::OnAdvanced( wxCommandEvent& event )
  244. {
  245.     if( p_advanced_dialog->ShowModal() == wxID_OK )
  246.     {
  247.         UpdateAdvancedMRL();
  248.         p_open_dialog->UpdateMRL();
  249.     }
  250. }
  251. void AutoBuiltPanel::UpdateAdvancedMRL()
  252. {
  253.     wxString mrltemp;
  254.     for( int i = 0; i < (int)advanced_config_array.GetCount(); i++ )
  255.     {
  256.         ConfigControl *control = advanced_config_array.Item(i);
  257.         mrltemp += (i ? wxT(" :") : wxT(":"));
  258.         if( control->GetType() == CONFIG_ITEM_BOOL &&
  259.             !control->GetIntValue() ) mrltemp += wxT("no-");
  260.         mrltemp += control->GetName();
  261.         switch( control->GetType() )
  262.         {
  263.         case CONFIG_ITEM_STRING:
  264.         case CONFIG_ITEM_FILE:
  265.         case CONFIG_ITEM_DIRECTORY:
  266.         case CONFIG_ITEM_MODULE:
  267.             mrltemp += wxT("="") + control->GetPszValue() + wxT(""");
  268.             break;
  269.         case CONFIG_ITEM_INTEGER:
  270.             mrltemp +=
  271.                 wxString::Format( wxT("=%i"), control->GetIntValue() );
  272.             break;
  273.         case CONFIG_ITEM_FLOAT:
  274.             mrltemp +=
  275.                 wxString::Format(wxT("=%f"), control->GetFloatValue());
  276.             break;
  277.         }
  278.     }
  279.     p_advanced_mrl_combo->SetValue( mrltemp );
  280. }
  281. /*****************************************************************************
  282.  * Constructor.
  283.  *****************************************************************************/
  284. OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
  285.                         int i_access_method, int i_arg ):
  286.       wxDialog( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition,
  287.              wxDefaultSize, wxDEFAULT_FRAME_STYLE )
  288. {
  289.     OpenDialog( _p_intf, _p_parent, i_access_method, i_arg, OPEN_NORMAL );
  290. }
  291. OpenDialog::OpenDialog( intf_thread_t *_p_intf, wxWindow *_p_parent,
  292.                         int i_access_method, int i_arg, int _i_method ):
  293.       wxDialog( _p_parent, -1, wxU(_("Open...")), wxDefaultPosition,
  294.              wxDefaultSize, wxDEFAULT_FRAME_STYLE )
  295. {
  296.     /* Initializations */
  297.     i_method = _i_method;
  298.     p_intf = _p_intf;
  299.     p_parent = _p_parent;
  300.     SetIcon( *p_intf->p_sys->p_icon );
  301.     file_dialog = NULL;
  302.     i_disc_type_selection = 0;
  303.     i_open_arg = i_arg;
  304.     sout_dialog = NULL;
  305.     subsfile_dialog = NULL;
  306.     b_disc_device_changed = false;
  307.     /* Create a panel to put everything in */
  308.     wxPanel *panel = new wxPanel( this, -1 );
  309.     panel->SetAutoLayout( TRUE );
  310.     /* Create MRL combobox */
  311.     wxBoxSizer *mrl_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
  312.     wxStaticBox *mrl_box = new wxStaticBox( panel, -1,
  313.                                wxU(_("Media Resource Locator (MRL)")) );
  314.     wxStaticBoxSizer *mrl_sizer = new wxStaticBoxSizer( mrl_box,
  315.                                                         wxHORIZONTAL );
  316.     wxStaticText *mrl_label = new wxStaticText( panel, -1,
  317.                                                 wxU(_("Open:")) );
  318.     mrl_combo = new wxComboBox( panel, MRL_Event, wxT(""),
  319.                                 wxPoint(20,25), wxSize(120, -1),
  320.                                 0, NULL );
  321.     mrl_combo->SetToolTip( wxU(_("You can use this field directly by typing "
  322.         "the full MRL you want to open.n""Alternatively, the field will be "
  323.         "filled automatically when you use the controls below.")) );
  324.     mrl_sizer->Add( mrl_label, 0, wxALL | wxALIGN_CENTER, 5 );
  325.     mrl_sizer->Add( mrl_combo, 1, wxALL | wxALIGN_CENTER, 5 );
  326.     mrl_sizer_sizer->Add( mrl_sizer, 1, wxEXPAND | wxALL, 5 );
  327.     /* Create Static Text */
  328.     wxStaticText *label = new wxStaticText( panel, -1,
  329.         wxU(_("Alternatively, you can build an MRL using one of the "
  330.               "following predefined targets:")) );
  331.     wxFlexGridSizer *common_opt_sizer = new wxFlexGridSizer( 5, 1, 20 );
  332.     if( i_method == OPEN_NORMAL )
  333.     {
  334.         /* Create Stream Output checkox */
  335.         sout_checkbox = new wxCheckBox( panel, SoutEnable_Event,
  336.                                          wxU(_("Stream output")) );
  337.         sout_checkbox->SetToolTip( wxU(_("Use VLC as a server of streams")) );
  338.         common_opt_sizer->Add( sout_checkbox, 0,
  339.                                wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  340.         sout_button = new wxButton( panel, SoutSettings_Event,
  341.                                     wxU(_("Settings...")) );
  342.         sout_button->Disable();
  343.         char *psz_sout = config_GetPsz( p_intf, "sout" );
  344.         if( psz_sout && *psz_sout )
  345.         {
  346.             sout_checkbox->SetValue(TRUE);
  347.             sout_button->Enable();
  348.             subsfile_mrl.Add( wxString(wxT("sout=")) + wxL2U(psz_sout) );
  349.         }
  350.         if( psz_sout ) free( psz_sout );
  351.         common_opt_sizer->Add( sout_button, 1, wxALIGN_LEFT |
  352.                                wxALIGN_CENTER_VERTICAL );
  353.         common_opt_sizer->Add( new wxPanel( this, -1 ), 1,
  354.                                wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  355.     }
  356.     /* Create caching options */
  357.     caching_checkbox = new wxCheckBox( panel, CachingEnable_Event,
  358.                                        wxU(_("Caching")) );
  359.     caching_checkbox->SetToolTip( wxU(_("Change the default caching value "
  360.                                         "(in milliseconds)")) );
  361.     common_opt_sizer->Add( caching_checkbox, 0,
  362.                            wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  363.     caching_value = new wxSpinCtrl( panel, CachingChange_Event );
  364.     caching_value->SetRange( 0, 1000000 );
  365.     caching_value->Disable();
  366.     common_opt_sizer->Add( caching_value, 0,
  367.                            wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  368.     /* Separation */
  369.     wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
  370.     /* Create the buttons */
  371.     wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
  372.     ok_button->SetDefault();
  373.     wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
  374.                                             wxU(_("Cancel")) );
  375.     /* Create notebook */
  376.     notebook = new wxNotebook( panel, Notebook_Event );
  377.     wxNotebookSizer *notebook_sizer = new wxNotebookSizer( notebook );
  378.     notebook->AddPage( FilePanel( notebook ), wxU(_("File")),
  379.                        i_access_method == FILE_ACCESS );
  380.     notebook->AddPage( DiscPanel( notebook ), wxU(_("Disc")),
  381.                        i_access_method == DISC_ACCESS );
  382.     notebook->AddPage( NetPanel( notebook ), wxU(_("Network")),
  383.                        i_access_method == NET_ACCESS );
  384.     module_t *p_module = config_FindModule( VLC_OBJECT(p_intf), "v4l" );
  385.     if( p_module )
  386.     {
  387.         AutoBuiltPanel *autopanel =
  388.             new AutoBuiltPanel( notebook, this, p_intf, p_module );
  389.         input_tab_array.Add( autopanel );
  390.         notebook->AddPage( autopanel, wxU( p_module->psz_shortname ),
  391.                            i_access_method == CAPTURE_ACCESS );
  392.     }
  393.     p_module = config_FindModule( VLC_OBJECT(p_intf), "pvr" );
  394.     if( p_module )
  395.     {
  396.         AutoBuiltPanel *autopanel =
  397.             new AutoBuiltPanel( notebook, this, p_intf, p_module );
  398.         input_tab_array.Add( autopanel );
  399.         notebook->AddPage( autopanel, wxU( p_module->psz_shortname ),
  400.                            i_access_method == CAPTURE_ACCESS );
  401.     }
  402.     p_module = config_FindModule( VLC_OBJECT(p_intf), "dvb" );
  403.     if( p_module )
  404.     {
  405.         AutoBuiltPanel *autopanel =
  406.             new AutoBuiltPanel( notebook, this, p_intf, p_module );
  407.         input_tab_array.Add( autopanel );
  408.         notebook->AddPage( autopanel, wxU( p_module->psz_shortname ),
  409.                            i_access_method == CAPTURE_ACCESS );
  410.     }
  411.     p_module = config_FindModule( VLC_OBJECT(p_intf), "dshow" );
  412.     if( p_module )
  413.     {
  414.         AutoBuiltPanel *autopanel =
  415.             new AutoBuiltPanel( notebook, this, p_intf, p_module );
  416.         input_tab_array.Add( autopanel );
  417.         notebook->AddPage( autopanel, wxU( p_module->psz_shortname ),
  418.                            i_access_method == CAPTURE_ACCESS );
  419.     }
  420.     /* Update Disc panel */
  421.     wxCommandEvent dummy_event;
  422.     OnDiscTypeChange( dummy_event );
  423.     /* Update Net panel */
  424.     dummy_event.SetId( NetRadio1_Event );
  425.     OnNetTypeChange( dummy_event );
  426.     /* Update MRL */
  427.     wxNotebookEvent event( wxEVT_NULL, 0, i_access_method );
  428.     OnPageChange( event );
  429.     /* Place everything in sizers */
  430.     wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
  431.     button_sizer->Add( ok_button, 0, wxALL, 5 );
  432.     button_sizer->Add( cancel_button, 0, wxALL, 5 );
  433.     button_sizer->Layout();
  434.     wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
  435.     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
  436.     panel_sizer->Add( mrl_sizer_sizer, 0, wxEXPAND, 5 );
  437.     panel_sizer->Add( label, 0, wxEXPAND | wxALL, 5 );
  438.     panel_sizer->Add( notebook_sizer, 1, wxEXPAND | wxALL, 5 );
  439.     panel_sizer->Add( common_opt_sizer, 0, wxALIGN_LEFT | wxALL, 5 );
  440.     panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
  441.     panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALL, 5 );
  442.     panel_sizer->Layout();
  443.     panel->SetSizerAndFit( panel_sizer );
  444.     main_sizer->Add( panel, 1, wxGROW, 0 );
  445.     main_sizer->Layout();
  446.     SetSizerAndFit( main_sizer );
  447. }
  448. OpenDialog::~OpenDialog()
  449. {
  450.     /* Clean up */
  451.     if( file_dialog ) delete file_dialog;
  452.     if( sout_dialog ) delete sout_dialog;
  453.     if( subsfile_dialog ) delete subsfile_dialog;
  454. }
  455. int OpenDialog::Show( int i_access_method, int i_arg )
  456. {
  457.     notebook->SetSelection( i_access_method );
  458.     int i_ret = wxDialog::Show();
  459.     Raise();
  460.     SetFocus();
  461.     i_open_arg = i_arg;
  462.     return i_ret;
  463. }
  464. int OpenDialog::Show()
  465. {
  466.     int i_ret = wxDialog::Show();
  467.     Raise();
  468.     SetFocus();
  469.     return i_ret;
  470. }
  471. /*****************************************************************************
  472.  * Private methods.
  473.  *****************************************************************************/
  474. wxPanel *OpenDialog::FilePanel( wxWindow* parent )
  475. {
  476.     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
  477.                                   wxSize(200, 200) );
  478.     wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
  479.     /* Create browse file line */
  480.     wxBoxSizer *file_sizer = new wxBoxSizer( wxHORIZONTAL );
  481.     file_combo = new wxComboBox( panel, FileName_Event, wxT(""),
  482.                                  wxPoint(20,25), wxSize(200, -1), 0, NULL );
  483.     wxButton *browse_button = new wxButton( panel, FileBrowse_Event,
  484.                                             wxU(_("Browse...")) );
  485.     file_sizer->Add( file_combo, 1, wxALL, 5 );
  486.     file_sizer->Add( browse_button, 0, wxALL, 5 );
  487.     /* Create Subtitles File checkox */
  488.     wxFlexGridSizer *subsfile_sizer = new wxFlexGridSizer( 2, 1, 20 );
  489.     subsfile_checkbox = new wxCheckBox( panel, SubsFileEnable_Event,
  490.                                         wxU(_("Subtitle options")) );
  491.     subsfile_checkbox->SetToolTip( wxU(_("Force options for separate subtitle files.")) );
  492.     subsfile_sizer->Add( subsfile_checkbox, 0,
  493.                          wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  494.     subsfile_button = new wxButton( panel, SubsFileSettings_Event,
  495.                                     wxU(_("Settings...")) );
  496.     subsfile_button->Disable();
  497.     char *psz_subsfile = config_GetPsz( p_intf, "sub-file" );
  498.     if( psz_subsfile && *psz_subsfile )
  499.     {
  500.         subsfile_checkbox->SetValue(TRUE);
  501.         subsfile_button->Enable();
  502.         subsfile_mrl.Add( wxString(wxT("sub-file=")) + wxL2U(psz_subsfile) );
  503.     }
  504.     if( psz_subsfile ) free( psz_subsfile );
  505.     subsfile_sizer->Add( subsfile_button, 1,
  506.                          wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  507.     sizer->Add( file_sizer, 0, wxEXPAND | wxALL, 5 );
  508.     sizer->Add( subsfile_sizer, 0, wxEXPAND | wxALL, 5 );
  509.     panel->SetSizerAndFit( sizer );
  510.     return panel;
  511. }
  512. wxPanel *OpenDialog::DiscPanel( wxWindow* parent )
  513. {
  514.     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
  515.                                   wxSize(200, 200) );
  516.     wxBoxSizer *sizer_row = new wxBoxSizer( wxVERTICAL );
  517.     wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 3, 20 );
  518.     static const wxString disc_type_array[] =
  519.     {
  520.         wxU(_("DVD (menus)")),
  521.         wxU(_("DVD")),
  522.         wxU(_("VCD")),
  523.         wxU(_("Audio CD")),
  524.     };
  525.     disc_type = new wxRadioBox( panel, DiscType_Event, wxU(_("Disc type")),
  526.                                 wxDefaultPosition, wxDefaultSize,
  527.                                 WXSIZEOF(disc_type_array), disc_type_array,
  528.                                 WXSIZEOF(disc_type_array), wxRA_SPECIFY_COLS );
  529.     sizer_row->Add( disc_type, i_disc_type_selection, wxEXPAND | wxALL, 5 );
  530.     wxStaticText *label = new wxStaticText( panel, -1, wxU(_("Device name")) );
  531.     disc_device = new wxTextCtrl( panel, DiscDevice_Event, wxT(""),
  532.                                   wxDefaultPosition, wxDefaultSize,
  533.                                   wxTE_PROCESS_ENTER);
  534.     sizer->Add( label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  535.     sizer->Add( disc_device, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  536.     disc_title_label = new wxStaticText( panel, -1, wxU(_("Title")) );
  537.     disc_title = new wxSpinCtrl( panel, DiscTitle_Event );
  538.     sizer->Add( disc_title_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  539.     sizer->Add( disc_title, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  540.     disc_chapter_label = new wxStaticText( panel, -1, wxU(_("Chapter")) );
  541.     disc_chapter = new wxSpinCtrl( panel, DiscChapter_Event );
  542.     sizer->Add( disc_chapter_label, 0,
  543.                 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  544.     sizer->Add( disc_chapter, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  545.     disc_sub_label = new wxStaticText( panel, -1, wxU(_("Subtitles track")) );
  546.     disc_sub = new wxSpinCtrl( panel, DiscSub_Event );
  547.     sizer->Add( disc_sub_label, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  548.     sizer->Add( disc_sub, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  549.     disc_sub->SetRange( -1, 255 );
  550.     i_disc_sub = config_GetInt( p_intf, "spu-channel" );
  551.     disc_sub->SetValue( i_disc_sub );
  552.     sizer_row->Add( sizer, 0, wxEXPAND | wxALL, 5 );
  553.     panel->SetSizerAndFit( sizer_row );
  554.     return panel;
  555. }
  556. wxPanel *OpenDialog::NetPanel( wxWindow* parent )
  557. {
  558.     int i;
  559.     wxPanel *panel = new wxPanel( parent, -1, wxDefaultPosition,
  560.                                   wxSize(200, 200) );
  561.     wxBoxSizer *sizer_row = new wxBoxSizer( wxVERTICAL );
  562.     wxFlexGridSizer *sizer = new wxFlexGridSizer( 2, 4, 20 );
  563.     static const wxString net_type_array[] =
  564.     {
  565.         wxU(_("UDP/RTP")),
  566.         wxU(_("UDP/RTP Multicast")),
  567.         wxU(_("HTTP/FTP/MMS")),
  568.         wxU(_("RTSP"))
  569.     };
  570.     for( i=0; i<4; i++ )
  571.     {
  572.         net_radios[i] = new wxRadioButton( panel, NetRadio1_Event + i,
  573.                                            net_type_array[i],
  574.                                            wxDefaultPosition, wxDefaultSize,
  575.                                            wxRB_SINGLE );
  576.         net_subpanels[i] = new wxPanel( panel, -1,
  577.                                         wxDefaultPosition, wxDefaultSize );
  578.     }
  579.     /* UDP/RTP row */
  580.     wxFlexGridSizer *subpanel_sizer;
  581.     wxStaticText *label;
  582.     i_net_ports[0] = config_GetInt( p_intf, "server-port" );
  583.     subpanel_sizer = new wxFlexGridSizer( 3, 1, 20 );
  584.     label = new wxStaticText( net_subpanels[0], -1, wxU(_("Port")) );
  585.     net_ports[0] = new wxSpinCtrl( net_subpanels[0], NetPort1_Event,
  586.                                    wxString::Format(wxT("%d"), i_net_ports[0]),
  587.                                    wxDefaultPosition, wxDefaultSize,
  588.                                    wxSP_ARROW_KEYS,
  589.                                    0, 16000, i_net_ports[0] );
  590.     subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  591.     subpanel_sizer->Add( net_ports[0], 1,
  592.                          wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  593.     net_ipv6 = new wxCheckBox( net_subpanels[0], NetForceIPv6_Event,
  594.                                wxU(_("Force IPv6")));
  595.     subpanel_sizer->Add( net_ipv6, 0,
  596.                          wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  597.     net_subpanels[0]->SetSizerAndFit( subpanel_sizer );
  598.     net_radios[0]->SetValue( TRUE );
  599.     /* UDP/RTP Multicast row */
  600.     subpanel_sizer = new wxFlexGridSizer( 4, 1, 20 );
  601.     label = new wxStaticText( net_subpanels[1], -1, wxU(_("Address")) );
  602.     net_addrs[1] = new wxTextCtrl( net_subpanels[1], NetAddr2_Event, wxT(""),
  603.                                    wxDefaultPosition, wxDefaultSize,
  604.                                    wxTE_PROCESS_ENTER);
  605.     subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  606.     subpanel_sizer->Add( net_addrs[1], 1,
  607.                          wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  608.     label = new wxStaticText( net_subpanels[1], -1, wxU(_("Port")) );
  609.     i_net_ports[1] = i_net_ports[0];
  610.     net_ports[1] = new wxSpinCtrl( net_subpanels[1], NetPort2_Event,
  611.                                    wxString::Format(wxT("%d"), i_net_ports[1]),
  612.                                    wxDefaultPosition, wxDefaultSize,
  613.                                    wxSP_ARROW_KEYS,
  614.                                    0, 16000, i_net_ports[1] );
  615.     subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  616.     subpanel_sizer->Add( net_ports[1], 1,
  617.                          wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  618.     net_subpanels[1]->SetSizerAndFit( subpanel_sizer );
  619.     /* HTTP and RTSP rows */
  620.     for( i=2; i<4; i++ )
  621.     {
  622.         subpanel_sizer = new wxFlexGridSizer( 2, 1, 20 );
  623.         label = new wxStaticText( net_subpanels[i], -1, wxU(_("URL")) );
  624.         net_addrs[i] = new wxTextCtrl( net_subpanels[i], NetAddr1_Event + i,
  625.                                        (i == 2) ? wxT("") : wxT("rtsp://"),
  626.                                        wxDefaultPosition, wxSize( 200, -1 ),
  627.                                        wxTE_PROCESS_ENTER);
  628.         subpanel_sizer->Add( label, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL );
  629.         subpanel_sizer->Add( net_addrs[i], 1,
  630.                              wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL );
  631.         net_subpanels[i]->SetSizerAndFit( subpanel_sizer );
  632.     }
  633.     /* Stuff everything into the main panel */
  634.     for( i=0; i<4; i++ )
  635.     {
  636.         sizer->Add( net_radios[i], 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
  637.                     wxALL, 5 );
  638.         sizer->Add( net_subpanels[i], 1, wxEXPAND | wxALIGN_LEFT |
  639.                     wxALIGN_CENTER_VERTICAL | wxALL, 5  );
  640.     }
  641.     sizer_row->Add( sizer, 0, wxEXPAND | wxALL, 5 );
  642.     panel->SetSizerAndFit( sizer_row );
  643.     return panel;
  644. }
  645. void OpenDialog::UpdateMRL()
  646. {
  647.     UpdateMRL( i_current_access_method );
  648. }
  649. void OpenDialog::UpdateMRL( int i_access_method )
  650. {
  651.     wxString mrltemp, caching_name;
  652.     i_current_access_method = i_access_method;
  653.     switch( i_access_method )
  654.     {
  655.     case FILE_ACCESS:
  656.         mrltemp = file_combo->GetValue();
  657.         caching_name = wxT("file-caching");
  658.         break;
  659.     case DISC_ACCESS:
  660.         i_disc_type_selection = disc_type->GetSelection();
  661.         switch ( i_disc_type_selection )
  662.         {
  663.         case 0: /* DVD with menus */
  664.         case 1: /* DVD without menus */
  665.             if( i_disc_type_selection == 0 )
  666.             {
  667.                 mrltemp = wxT("dvd://") + disc_device->GetValue();
  668.                 caching_name = wxT("dvdnav-caching");
  669.             }
  670.             else
  671.             {
  672.                 mrltemp = wxT("dvdsimple://") + disc_device->GetValue();
  673.                 caching_name = wxT("dvdread-caching");
  674.             }
  675.             if( i_disc_title > 0 )
  676.             {
  677.                 mrltemp += wxString::Format( wxT("@%d"), i_disc_title );
  678.                 if( i_disc_chapter > 0 )
  679.                     mrltemp += wxString::Format( wxT(":%d"), i_disc_chapter );
  680.             }
  681.             if( i_disc_sub >= 0 )
  682.                 mrltemp += wxString::Format( wxT("  :spu-channel=%d"),
  683.                                              i_disc_sub );
  684.             break;
  685.         case 2:  /* VCD of some sort */
  686. #ifdef HAVE_VCDX
  687.             mrltemp = wxT("vcdx://") + disc_device->GetValue();
  688.             if( i_disc_title > 0 )
  689.                 mrltemp += wxString::Format( wxT("@%c%d"),
  690.                                   config_GetInt( p_intf, "vcdx-PBC"  )
  691.                                   ? 'P' : 'E', i_disc_title );
  692. #else
  693.             mrltemp = wxT("vcd://") + disc_device->GetValue();
  694.             if( i_disc_title > 0 )
  695.                 mrltemp += wxString::Format( wxT("@%d"), i_disc_title );
  696. #endif
  697.             if( i_disc_sub >= 0 )
  698.                 mrltemp += wxString::Format( wxT("  :spu-channel=%d"),
  699.                                              i_disc_sub );
  700.             caching_name = wxT("vcd-caching");
  701.             break;
  702.         case 3: /* CD-DA */
  703.             mrltemp = wxT("cdda://") + disc_device->GetValue();
  704.             if( i_disc_title > 0 )
  705.                 mrltemp += wxString::Format( wxT("@%d"), i_disc_title );
  706.             caching_name = wxT("cdda-caching");
  707.             break;
  708.         default:
  709.             msg_Err( p_intf, "invalid selection (%d)",
  710.                      disc_type->GetSelection() );
  711.         }
  712.         break;
  713.     case NET_ACCESS:
  714.         switch( i_net_type )
  715.         {
  716.         case 0:
  717.             mrltemp = wxT("udp://");
  718.             if ( net_ipv6->GetValue() )
  719.             {
  720.                 mrltemp += wxT("@[::]");
  721.             }
  722.             if( i_net_ports[0] !=
  723.                 config_GetInt( p_intf, "server-port" ) )
  724.             {
  725.                 mrltemp += wxString::Format( wxT("@:%d"), i_net_ports[0] );
  726.             }
  727.             caching_name = wxT("udp-caching");
  728.             break;
  729.         case 1:
  730.             mrltemp = wxT("udp://@");
  731.             if ((net_addrs[1]->GetLineText(0).Find (':') != -1)
  732.                 && (net_addrs[1]->GetLineText(0)[0u] != '['))
  733.             {
  734.                 /* automatically adds '[' and ']' to IPv6 addresses */
  735.                 mrltemp += wxT("[") + net_addrs[1]->GetLineText(0)
  736.                          + wxT("]");
  737.             }
  738.             else
  739.             {
  740.                 mrltemp += net_addrs[1]->GetLineText(0);
  741.             }
  742.             if( i_net_ports[1] != config_GetInt( p_intf, "server-port" ) )
  743.             {
  744.                 mrltemp += wxString::Format( wxT(":%d"), i_net_ports[1] );
  745.             }
  746.             caching_name = wxT("udp-caching");
  747.             break;
  748.         case 2:
  749.             /* http access */
  750.             if( net_addrs[2]->GetLineText(0).Find(wxT("://")) == -1 )
  751.                 mrltemp = wxT("http://");
  752.             mrltemp += net_addrs[2]->GetLineText(0);
  753.             caching_name = wxT("http-caching");
  754.             break;
  755.         case 3:
  756.             /* RTSP access */
  757.             if( net_addrs[3]->GetLineText(0).Find(wxT("rtsp://")) != 0 )
  758.             {
  759.                 mrltemp = wxT("rtsp://");
  760.             }
  761.             mrltemp += net_addrs[3]->GetLineText(0);
  762.             caching_name = wxT("rtsp-caching");
  763.             break;
  764.         }
  765.         break;
  766.     default:
  767.         {
  768.             int i_item = i_access_method - MAX_ACCESS;
  769.             if( i_item < 0 || i_item >= (int)input_tab_array.GetCount() )
  770.                 break;
  771.             AutoBuiltPanel *input_panel = input_tab_array.Item( i_item );
  772.             mrltemp = input_panel->name + wxT("://");
  773.             for( int i=0; i < (int)input_panel->config_array.GetCount(); i++ )
  774.             {
  775.                 ConfigControl *control = input_panel->config_array.Item(i);
  776.                 mrltemp += wxT(" :");
  777.                 if( control->GetType() == CONFIG_ITEM_BOOL &&
  778.                     !control->GetIntValue() ) mrltemp += wxT("no-");
  779.                 mrltemp += control->GetName();
  780.                 switch( control->GetType() )
  781.                 {
  782.                 case CONFIG_ITEM_STRING:
  783.                 case CONFIG_ITEM_FILE:
  784.                 case CONFIG_ITEM_DIRECTORY:
  785.                 case CONFIG_ITEM_MODULE:
  786.                     mrltemp += wxT("="") + control->GetPszValue() + wxT(""");
  787.                     break;
  788.                 case CONFIG_ITEM_INTEGER:
  789.                     mrltemp +=
  790.                         wxString::Format( wxT("=%i"), control->GetIntValue() );
  791.                     break;
  792.                 case CONFIG_ITEM_FLOAT:
  793.                     mrltemp +=
  794.                         wxString::Format(wxT("=%f"), control->GetFloatValue());
  795.                     break;
  796.                 }
  797.             }
  798.             if( input_panel->p_advanced_mrl_combo &&
  799.                 input_panel->p_advanced_mrl_combo->GetValue() )
  800.             {
  801.                 mrltemp += wxT(" ") +
  802.                     input_panel->p_advanced_mrl_combo->GetValue();
  803.             }
  804.         }
  805.         break;
  806.     }
  807.     if( caching_name.size() )
  808.     {
  809.         if( caching_value->IsEnabled() )
  810.         {
  811.             mrltemp += wxT("  :") + caching_name +
  812.                 wxString::Format( wxT("=%d"), i_caching );
  813.         }
  814.         else
  815.         {
  816.             int i_value = config_GetInt( p_intf, caching_name.mb_str() );
  817.             caching_value->SetValue( i_value );
  818.         }
  819.     }
  820.     mrl_combo->SetValue( mrltemp );
  821. }
  822. /*****************************************************************************
  823.  * Events methods.
  824.  *****************************************************************************/
  825. void OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
  826. {
  827.     mrl = SeparateEntries( mrl_combo->GetValue() );
  828.     mrl_combo->Append( mrl_combo->GetValue() );
  829.     if( mrl_combo->GetCount() > 10 ) mrl_combo->Delete( 0 );
  830.     mrl_combo->SetSelection( mrl_combo->GetCount() - 1 );
  831.     if( i_method == OPEN_STREAM )
  832.     {
  833.         if( IsModal() ) EndModal( wxID_OK );
  834.         Hide();
  835.         return;
  836.     }
  837.     /* Update the playlist */
  838.     playlist_t *p_playlist =
  839.         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  840.                                        FIND_ANYWHERE );
  841.     if( p_playlist == NULL ) return;
  842.     for( int i = 0; i < (int)mrl.GetCount(); i++ )
  843.     {
  844.         vlc_bool_t b_start = !i && i_open_arg;
  845.         playlist_item_t *p_item =
  846.             playlist_ItemNew( p_intf, (const char*)mrl[i].mb_str(),
  847.                               (const char *)mrl[i].mb_str() );
  848.         /* Insert options */
  849.         while( i + 1 < (int)mrl.GetCount() &&
  850.                ((const char *)mrl[i + 1].mb_str())[0] == ':' )
  851.         {
  852.             playlist_ItemAddOption( p_item, mrl[i + 1].mb_str() );
  853.             i++;
  854.         }
  855.         /* Get the options from the subtitles dialog */
  856.         if( subsfile_checkbox->IsChecked() && subsfile_mrl.GetCount() )
  857.         {
  858.             for( int j = 0; j < (int)subsfile_mrl.GetCount(); j++ )
  859.             {
  860.                 playlist_ItemAddOption( p_item, subsfile_mrl[j].mb_str() );
  861.             }
  862.         }
  863.         /* Get the options from the stream output dialog */
  864.         if( sout_checkbox->IsChecked() && sout_mrl.GetCount() )
  865.         {
  866.             for( int j = 0; j < (int)sout_mrl.GetCount(); j++ )
  867.             {
  868.                 playlist_ItemAddOption( p_item, sout_mrl[j].mb_str() );
  869.             }
  870.         }
  871.         int i_id = playlist_AddItem( p_playlist, p_item,
  872.                                      PLAYLIST_APPEND, PLAYLIST_END );
  873.         if( b_start )
  874.         {
  875.             int i_pos = playlist_GetPositionById( p_playlist , i_id );
  876.             playlist_Command( p_playlist, PLAYLIST_GOTO, i_pos );
  877.         }
  878.     }
  879.     vlc_object_release( p_playlist );
  880.     Hide();
  881.     if( IsModal() ) EndModal( wxID_OK );
  882. }
  883. void OpenDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
  884. {
  885.     Hide();
  886.     if( IsModal() ) EndModal( wxID_CANCEL );
  887. }
  888. void OpenDialog::OnPageChange( wxNotebookEvent& event )
  889. {
  890.     UpdateMRL( event.GetSelection() );
  891. }
  892. void OpenDialog::OnMRLChange( wxCommandEvent& event )
  893. {
  894.     //mrl = SeparateEntries( event.GetString() );
  895. }
  896. /*****************************************************************************
  897.  * File panel event methods.
  898.  *****************************************************************************/
  899. void OpenDialog::OnFilePanelChange( wxCommandEvent& WXUNUSED(event) )
  900. {
  901.     UpdateMRL( FILE_ACCESS );
  902. }
  903. void OpenDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) )
  904. {
  905.     if( file_dialog == NULL )
  906.         file_dialog = new wxFileDialog( this, wxU(_("Open File")),
  907.             wxT(""), wxT(""), wxT("*"), wxOPEN | wxMULTIPLE );
  908.     if( file_dialog && file_dialog->ShowModal() == wxID_OK )
  909.     {
  910.         wxArrayString paths;
  911.         wxString path;
  912.         file_dialog->GetPaths( paths );
  913.         for( size_t i = 0; i < paths.GetCount(); i++ )
  914.         {
  915.             if( paths[i].Find( wxT(' ') ) >= 0 )
  916.                 path += wxT(""") + paths[i] + wxT("" ");
  917.             else
  918.                 path += paths[i] + wxT(" ");
  919.         }
  920.         file_combo->SetValue( path );
  921.         file_combo->Append( path );
  922.         if( file_combo->GetCount() > 10 ) file_combo->Delete( 0 );
  923.         UpdateMRL( FILE_ACCESS );
  924.     }
  925. }
  926. /*****************************************************************************
  927.  * Disc panel event methods.
  928.  *****************************************************************************/
  929. void OpenDialog::OnDiscPanelChange( wxCommandEvent& event )
  930. {
  931.     if( event.GetId() == DiscTitle_Event ) i_disc_title = event.GetInt();
  932.     if( event.GetId() == DiscChapter_Event ) i_disc_chapter = event.GetInt();
  933.     if( event.GetId() == DiscSub_Event ) i_disc_sub = event.GetInt();
  934.     UpdateMRL( DISC_ACCESS );
  935. }
  936. void OpenDialog::OnDiscDeviceChange( wxCommandEvent& event )
  937. {
  938.     char *psz_device;
  939.     switch( disc_type->GetSelection() )
  940.     {
  941.         case 3:
  942.             psz_device = config_GetPsz( p_intf, "cd-audio" );
  943.             break;
  944.         case 2:
  945.             psz_device = config_GetPsz( p_intf, "vcd" );
  946.             break;
  947.         default:
  948.             psz_device = config_GetPsz( p_intf, "dvd" );
  949.             break;
  950.     }
  951.     if ( !psz_device ) psz_device = "";
  952.     if( disc_device->GetValue().Cmp( wxL2U( psz_device ) ) )
  953.     {
  954.         b_disc_device_changed = true;
  955.     }
  956.     UpdateMRL( DISC_ACCESS );
  957. }
  958. void OpenDialog::OnDiscTypeChange( wxCommandEvent& WXUNUSED(event) )
  959. {
  960.     char *psz_device = NULL;
  961.     switch( disc_type->GetSelection() )
  962.     {
  963.     case 0: /* DVD with menus */
  964.     case 1: /* DVD without menus */
  965.         disc_sub->Enable(); disc_sub_label->Enable();
  966.         disc_chapter->Enable(); disc_chapter_label->Enable();
  967.         disc_title_label->SetLabel ( wxU(_("Title")) );
  968.         psz_device = config_GetPsz( p_intf, "dvd" );
  969.         if( !b_disc_device_changed )
  970.         {
  971.             if( psz_device ) disc_device->SetValue( wxL2U(psz_device) );
  972.             else disc_device->SetValue( wxT("") );
  973.         }
  974.         disc_title->SetRange( 0, 255 );
  975.         disc_chapter->SetRange( 0, 255 );
  976.         break;
  977.     case 2:  /* VCD of some sort */
  978.         disc_sub->Enable(); disc_sub_label->Enable();
  979.         disc_chapter->Disable(); disc_chapter_label->Disable();
  980.         psz_device = config_GetPsz( p_intf, "vcd" );
  981.         if( !b_disc_device_changed )
  982.         {
  983.             if( psz_device ) disc_device->SetValue( wxL2U(psz_device) );
  984.             else disc_device->SetValue( wxT("") );
  985.         }
  986. #ifdef HAVE_VCDX
  987.         disc_title_label->SetLabel ( config_GetInt( p_intf, "vcdx-PBC"  )
  988.                                      ? wxT("Playback LID") : wxT("Entry") );
  989. #else
  990.         disc_title_label->SetLabel ( wxU(_("Track")) );
  991. #endif
  992.         disc_title->SetRange( 0, 999 );
  993.         break;
  994.     case 3: /* CD-DA */
  995.         disc_sub->Disable(); disc_sub_label->Disable();
  996.         disc_chapter->Disable(); disc_chapter_label->Disable();
  997.         disc_title_label->SetLabel ( wxU(_("Track")) );
  998.         psz_device = config_GetPsz( p_intf, "cd-audio" );
  999.         if( !b_disc_device_changed )
  1000.         {
  1001.             if( psz_device ) disc_device->SetValue( wxL2U(psz_device) );
  1002.             else disc_device->SetValue( wxT("") );
  1003.         }
  1004.         /* There are at most 99 tracks in a CD-DA */
  1005.         disc_title->SetRange( 0, 99 );
  1006.         break;
  1007.     default:
  1008.         msg_Err( p_intf, "invalid Disc type selection (%d)",
  1009.                  disc_type->GetSelection() );
  1010.         break;
  1011.     }
  1012.     disc_title->SetValue( 0 ); i_disc_title = 0;
  1013.     disc_chapter->SetValue( 0 ); i_disc_chapter = 0;
  1014.     if( psz_device ) free( psz_device );
  1015.     UpdateMRL( DISC_ACCESS );
  1016. }
  1017. /*****************************************************************************
  1018.  * Net panel event methods.
  1019.  *****************************************************************************/
  1020. void OpenDialog::OnNetPanelChange( wxCommandEvent& event )
  1021. {
  1022.     if( event.GetId() >= NetPort1_Event && event.GetId() <= NetPort3_Event )
  1023.     {
  1024.         i_net_ports[event.GetId() - NetPort1_Event] = event.GetInt();
  1025.     }
  1026.     UpdateMRL( NET_ACCESS );
  1027. }
  1028. void OpenDialog::OnNetTypeChange( wxCommandEvent& event )
  1029. {
  1030.     int i;
  1031.     i_net_type = event.GetId() - NetRadio1_Event;
  1032.     for(i=0; i<4; i++)
  1033.     {
  1034.         net_radios[i]->SetValue( event.GetId() == (NetRadio1_Event+i) );
  1035.         net_subpanels[i]->Enable( event.GetId() == (NetRadio1_Event+i) );
  1036.     }
  1037.     UpdateMRL( NET_ACCESS );
  1038. }
  1039. /*****************************************************************************
  1040.  * Subtitles file event methods.
  1041.  *****************************************************************************/
  1042. void OpenDialog::OnSubsFileEnable( wxCommandEvent& event )
  1043. {
  1044.     subsfile_button->Enable( event.GetInt() != 0 );
  1045. }
  1046. void OpenDialog::OnSubsFileSettings( wxCommandEvent& WXUNUSED(event) )
  1047. {
  1048.     /* Show/hide the open dialog */
  1049.     if( subsfile_dialog == NULL )
  1050.         subsfile_dialog = new SubsFileDialog( p_intf, this );
  1051.     if( subsfile_dialog && subsfile_dialog->ShowModal() == wxID_OK )
  1052.     {
  1053.         subsfile_mrl.Empty();
  1054.         subsfile_mrl.Add( wxString(wxT("sub-file=")) +
  1055.                           subsfile_dialog->file_combo->GetValue() );
  1056.         if( subsfile_dialog->encoding_combo )
  1057.             subsfile_mrl.Add( wxString(wxT("subsdec-encoding=")) +
  1058.                               subsfile_dialog->encoding_combo->GetValue() );
  1059.         subsfile_mrl.Add( wxString::Format(wxT("subsdec-align=%i"),
  1060.                            (int)subsfile_dialog->align_combo->GetClientData(
  1061.                            subsfile_dialog->align_combo->GetSelection()) ) );
  1062.         subsfile_mrl.Add( wxString::Format( wxT("freetype-rel-fontsize=%i"),
  1063.                           (int)subsfile_dialog->size_combo->GetClientData(
  1064.                           subsfile_dialog->size_combo->GetSelection()) ) );
  1065.         subsfile_mrl.Add( wxString::Format( wxT("sub-fps=%i"),
  1066.                           subsfile_dialog->fps_spinctrl->GetValue() ) );
  1067.         subsfile_mrl.Add( wxString::Format( wxT("sub-delay=%i"),
  1068.                           subsfile_dialog->delay_spinctrl->GetValue() ) );
  1069.     }
  1070. }
  1071. /*****************************************************************************
  1072.  * Stream output event methods.
  1073.  *****************************************************************************/
  1074. void OpenDialog::OnSoutEnable( wxCommandEvent& event )
  1075. {
  1076.     sout_button->Enable( event.GetInt() != 0 );
  1077. }
  1078. void OpenDialog::OnSoutSettings( wxCommandEvent& WXUNUSED(event) )
  1079. {
  1080.     /* Show/hide the open dialog */
  1081.     if( sout_dialog == NULL )
  1082.         sout_dialog = new SoutDialog( p_intf, this );
  1083.     if( sout_dialog && sout_dialog->ShowModal() == wxID_OK )
  1084.     {
  1085.         sout_mrl = sout_dialog->GetOptions();
  1086.     }
  1087. }
  1088. /*****************************************************************************
  1089.  * Caching event methods.
  1090.  *****************************************************************************/
  1091. void OpenDialog::OnCachingEnable( wxCommandEvent& event )
  1092. {
  1093.     caching_value->Enable( event.GetInt() != 0 );
  1094.     i_caching = caching_value->GetValue();
  1095.     UpdateMRL();
  1096. }
  1097. void OpenDialog::OnCachingChange( wxCommandEvent& event )
  1098. {
  1099.     i_caching = event.GetInt();
  1100.     UpdateMRL();
  1101. }
  1102. /*****************************************************************************
  1103.  * Utility functions.
  1104.  *****************************************************************************/
  1105. wxArrayString SeparateEntries( wxString entries )
  1106. {
  1107.     vlc_bool_t b_quotes_mode = VLC_FALSE;
  1108.     wxArrayString entries_array;
  1109.     wxString entry;
  1110.     wxStringTokenizer token( entries, wxT(" trn""), wxTOKEN_RET_DELIMS );
  1111.     while( token.HasMoreTokens() )
  1112.     {
  1113.         entry += token.GetNextToken();
  1114.         if( entry.IsEmpty() ) continue;
  1115.         if( !b_quotes_mode && entry.Last() == wxT('"') )
  1116.         {
  1117.             /* Enters quotes mode */
  1118.             entry.RemoveLast();
  1119.             b_quotes_mode = VLC_TRUE;
  1120.         }
  1121.         else if( b_quotes_mode && entry.Last() == wxT('"') )
  1122.         {
  1123.             /* Finished the quotes mode */
  1124.             entry.RemoveLast();
  1125.             b_quotes_mode = VLC_FALSE;
  1126.         }
  1127.         else if( !b_quotes_mode && entry.Last() != wxT('"') )
  1128.         {
  1129.             /* we found a non-quoted standalone string */
  1130.             if( token.HasMoreTokens() ||
  1131.                 entry.Last() == wxT(' ') || entry.Last() == wxT('t') ||
  1132.                 entry.Last() == wxT('r') || entry.Last() == wxT('n') )
  1133.                 entry.RemoveLast();
  1134.             if( !entry.IsEmpty() ) entries_array.Add( entry );
  1135.             entry.Empty();
  1136.         }
  1137.         else
  1138.         {;}
  1139.     }
  1140.     if( !entry.IsEmpty() ) entries_array.Add( entry );
  1141.     return entries_array;
  1142. }