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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * subtitles.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2001 VideoLAN
  5.  * $Id: subtitles.cpp 8898 2004-10-03 11:52:25Z zorglub $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  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 <vlc/intf.h>
  32. #include "wxwindows.h"
  33. #include <wx/combobox.h>
  34. #include <wx/statline.h>
  35. #ifndef wxRB_SINGLE
  36. #   define wxRB_SINGLE 0
  37. #endif
  38. /*****************************************************************************
  39.  * Event Table.
  40.  *****************************************************************************/
  41. /* IDs for the controls and the menu commands */
  42. enum
  43. {
  44.     FileBrowse_Event = wxID_HIGHEST,
  45. };
  46. BEGIN_EVENT_TABLE(SubsFileDialog, wxDialog)
  47.     /* Button events */
  48.     EVT_BUTTON(wxID_OK, SubsFileDialog::OnOk)
  49.     EVT_BUTTON(wxID_CANCEL, SubsFileDialog::OnCancel)
  50.     EVT_BUTTON(FileBrowse_Event, SubsFileDialog::OnFileBrowse)
  51. END_EVENT_TABLE()
  52. /*****************************************************************************
  53.  * Constructor.
  54.  *****************************************************************************/
  55. SubsFileDialog::SubsFileDialog( intf_thread_t *_p_intf, wxWindow* _p_parent ):
  56.     wxDialog( _p_parent, -1, wxU(_("Subtitle options")),
  57.               wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
  58. {
  59.     /* Initializations */
  60.     p_intf = _p_intf;
  61.     p_parent = _p_parent;
  62.     SetIcon( *p_intf->p_sys->p_icon );
  63.     /* Create a panel to put everything in */
  64.     wxPanel *panel = new wxPanel( this, -1 );
  65.     panel->SetAutoLayout( TRUE );
  66.     wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
  67.     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
  68.     /* Create the subtitles file textctrl */
  69.     wxBoxSizer *file_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
  70.     wxStaticBox *file_box = new wxStaticBox( panel, -1,
  71.                                              wxU(_("Subtitles file")) );
  72.     wxStaticBoxSizer *file_sizer = new wxStaticBoxSizer( file_box,
  73.                                                         wxHORIZONTAL );
  74.     char *psz_subsfile = config_GetPsz( p_intf, "sub-file" );
  75.     if( !psz_subsfile ) psz_subsfile = strdup("");
  76.     file_combo = new wxComboBox( panel, -1, wxL2U(psz_subsfile),
  77.                                  wxPoint(20,25), wxSize(300, -1), 0, NULL );
  78.     if( psz_subsfile ) free( psz_subsfile );
  79.     wxButton *browse_button = new wxButton( panel, FileBrowse_Event,
  80.                                             wxU(_("Browse...")) );
  81.     file_sizer->Add( file_combo, 1, wxALL, 5 );
  82.     file_sizer->Add( browse_button, 0, wxALL, 5 );
  83.     file_sizer_sizer->Add( file_sizer, 1, wxEXPAND | wxALL, 5 );
  84.     panel_sizer->Add( file_sizer, 0, wxEXPAND | wxALL, 5 );
  85.     /* Subtitles encoding */
  86.     encoding_combo = NULL;
  87.     module_config_t *p_item =
  88.         config_FindConfig( VLC_OBJECT(p_intf), "subsdec-encoding" );
  89.     if( p_item )
  90.     {
  91.         wxBoxSizer *enc_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
  92.         wxStaticBox *enc_box = new wxStaticBox( panel, -1,
  93.                                                 wxU(_("Subtitles encoding")) );
  94.         wxStaticBoxSizer *enc_sizer = new wxStaticBoxSizer( enc_box,
  95.                                                             wxHORIZONTAL );
  96.         wxStaticText *label =
  97.             new wxStaticText(panel, -1, wxU(p_item->psz_text));
  98.         encoding_combo = new wxComboBox( panel, -1, wxU(p_item->psz_value),
  99.                                          wxDefaultPosition, wxDefaultSize,
  100.                                          0, NULL, wxCB_READONLY );
  101.         /* build a list of available options */
  102.         for( int i_index = 0; p_item->ppsz_list && p_item->ppsz_list[i_index];
  103.              i_index++ )
  104.         {
  105.             encoding_combo->Append( wxU(p_item->ppsz_list[i_index]) );
  106.             if( p_item->psz_value && !strcmp( p_item->psz_value,
  107.                                               p_item->ppsz_list[i_index] ) )
  108.                 encoding_combo->SetSelection( i_index );
  109.         }
  110.         if( p_item->psz_value )
  111.         encoding_combo->SetValue( wxU(p_item->psz_value) );
  112.         encoding_combo->SetToolTip( wxU(p_item->psz_longtext) );
  113.         enc_sizer->Add( label, 0, wxALL | wxALIGN_CENTER, 5 );
  114.         enc_sizer->Add( encoding_combo, 0, wxEXPAND | wxALL | wxALIGN_CENTER, 5 );
  115.         enc_sizer_sizer->Add( enc_sizer, 1, wxEXPAND | wxALL, 5 );
  116.         panel_sizer->Add( enc_sizer, 0, wxEXPAND | wxALL, 5 );
  117.     }
  118.     /* Misc Subtitles options */
  119.     wxBoxSizer *misc_sizer_sizer = new wxBoxSizer( wxHORIZONTAL );
  120.     wxStaticBox *misc_box = new wxStaticBox( panel, -1,
  121.                                              wxU(_("Subtitles options")) );
  122.     wxStaticBoxSizer *misc_sizer = new wxStaticBoxSizer( misc_box,
  123.                                                          wxVERTICAL );
  124.     wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 1, 20 );
  125.     /* Font size */
  126.     p_item =
  127.         config_FindConfig( VLC_OBJECT(p_intf), "freetype-rel-fontsize" );
  128.     if( p_item )
  129.     {
  130.         wxBoxSizer *size_sizer = new wxBoxSizer( wxHORIZONTAL );
  131.         wxStaticText *label =
  132.             new wxStaticText(panel, -1, wxU(p_item->psz_text));
  133.         size_combo = new wxComboBox( panel, -1, wxT(""),
  134.                                      wxDefaultPosition, wxDefaultSize,
  135.                                      0, NULL, wxCB_READONLY );
  136.         /* build a list of available options */
  137.         for( int i_index = 0; i_index < p_item->i_list; i_index++ )
  138.         {
  139.             size_combo->Append( wxU(p_item->ppsz_list_text[i_index]),
  140.                                 (void *)p_item->pi_list[i_index] );
  141.             if( p_item->i_value == p_item->pi_list[i_index] )
  142.             {
  143.                 size_combo->SetSelection( i_index );
  144.                 size_combo->SetValue(wxU(p_item->ppsz_list_text[i_index]));
  145.             }
  146.         }
  147.         size_combo->SetToolTip( wxU(p_item->psz_longtext) );
  148.         size_sizer->Add( label, 0,  wxRIGHT | wxALIGN_CENTER, 5 );
  149.         size_sizer->Add( size_combo, 0, wxLEFT | wxALIGN_CENTER, 5 );
  150.         grid_sizer->Add( size_sizer, 1, wxEXPAND | wxALL, 5 );
  151.     }
  152.     p_item =
  153.         config_FindConfig( VLC_OBJECT(p_intf), "subsdec-align" );
  154.     if( p_item )
  155.     {
  156.         wxBoxSizer *align_sizer = new wxBoxSizer( wxHORIZONTAL );
  157.         wxStaticText *label =
  158.             new wxStaticText(panel, -1, wxU(p_item->psz_text));
  159.         align_combo = new wxComboBox( panel, -1, wxT(""),
  160.                                      wxDefaultPosition, wxDefaultSize,
  161.                                      0, NULL, wxCB_READONLY );
  162.         /* build a list of available options */
  163.         for( int i_index = 0; i_index < p_item->i_list; i_index++ )
  164.         {
  165.             align_combo->Append( wxU(p_item->ppsz_list_text[i_index]),
  166.                                 (void *)p_item->pi_list[i_index] );
  167.             if( p_item->i_value == p_item->pi_list[i_index] )
  168.             {
  169.                 align_combo->SetSelection( i_index );
  170.                 align_combo->SetValue(wxU(p_item->ppsz_list_text[i_index]));
  171.             }
  172.         }
  173.         align_combo->SetToolTip( wxU(p_item->psz_longtext) );
  174.         align_sizer->Add( label, 0,  wxRIGHT | wxALIGN_CENTER, 5 );
  175.         align_sizer->Add( align_combo, 0, wxLEFT | wxALIGN_CENTER, 5 );
  176.         grid_sizer->Add( align_sizer, 1, wxEXPAND | wxALL, 5 );
  177.     }
  178.     misc_sizer->Add( grid_sizer, 1, wxEXPAND | wxALL , 5 );
  179.     grid_sizer = new wxFlexGridSizer( 4, 1, 20 );
  180.     wxStaticText *label =
  181.         new wxStaticText(panel, -1, wxU(_("Frames per second")));
  182.     float f_fps = config_GetFloat( p_intf, "sub-fps" );
  183.     /* Outside the new wxSpinCtrl to avoid an internal error in gcc2.95 ! */
  184.     wxString format_fps(wxString::Format(wxT("%d"),(int)f_fps));
  185.     fps_spinctrl = new wxSpinCtrl( panel, -1, format_fps,
  186.                                    wxDefaultPosition, wxDefaultSize,
  187.                                    wxSP_ARROW_KEYS,
  188.                                    0, 16000, (int)f_fps );
  189.     fps_spinctrl->SetToolTip( wxU(_("Override frames per second. "
  190.                "It will only work with MicroDVD and SubRIP subtitles.")) );
  191.     grid_sizer->Add( label, 0, wxALIGN_CENTER, 5 );
  192.     grid_sizer->Add( fps_spinctrl, 0,wxALIGN_CENTER, 5 );
  193.     wxStaticText *label_delay =
  194.         new wxStaticText(panel, -1, wxU(_("Delay")));
  195.     int i_delay = config_GetInt( p_intf, "sub-delay" );
  196.     /* Outside the new wxSpinCtrl to avoid an internal error in gcc2.95 ! */
  197.     wxString format_delay(wxString::Format(wxT("%i"), i_delay ));
  198.     delay_spinctrl = new wxSpinCtrl( panel, -1, format_delay,
  199.                                      wxDefaultPosition, wxDefaultSize,
  200.                                      wxSP_ARROW_KEYS,
  201.                                      0, 16000, i_delay );
  202.     delay_spinctrl->SetToolTip( wxU(_("Set subtitle delay (in 1/10s)" ) ) );
  203.     grid_sizer->Add( label_delay , 0, wxALIGN_CENTER, 5 );
  204.     grid_sizer->Add( delay_spinctrl, 0, wxALIGN_CENTER, 5 );
  205.     misc_sizer->Add( grid_sizer, 0, wxALL, 5 );
  206.     misc_sizer_sizer->Add( misc_sizer, 1, wxEXPAND | wxALL, 5 );
  207.     panel_sizer->Add( misc_sizer, 0, wxEXPAND | wxALL, 5 );
  208.     /* Separation */
  209.     wxStaticLine *static_line = new wxStaticLine( panel, wxID_OK );
  210.     /* Create the buttons */
  211.     wxButton *ok_button = new wxButton( panel, wxID_OK, wxU(_("OK")) );
  212.     ok_button->SetDefault();
  213.     wxButton *cancel_button = new wxButton( panel, wxID_CANCEL,
  214.                                             wxU(_("Cancel")) );
  215.     /* Place everything in sizers */
  216.     wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
  217.     button_sizer->Add( ok_button, 0, wxALL, 5 );
  218.     button_sizer->Add( cancel_button, 0, wxALL, 5 );
  219.     button_sizer->Layout();
  220.     panel_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
  221.     panel_sizer->Add( button_sizer, 0, wxALIGN_LEFT | wxALIGN_BOTTOM |
  222.                       wxALL, 5 );
  223.     panel_sizer->Layout();
  224.     panel->SetSizerAndFit( panel_sizer );
  225.     main_sizer->Add( panel, 1, wxGROW, 0 );
  226.     main_sizer->Layout();
  227.     SetSizerAndFit( main_sizer );
  228. }
  229. SubsFileDialog::~SubsFileDialog()
  230. {
  231. }
  232. /*****************************************************************************
  233.  * Private methods.
  234.  *****************************************************************************/
  235. /*****************************************************************************
  236.  * Events methods.
  237.  *****************************************************************************/
  238. void SubsFileDialog::OnOk( wxCommandEvent& WXUNUSED(event) )
  239. {
  240.     EndModal( wxID_OK );
  241. }
  242. void SubsFileDialog::OnCancel( wxCommandEvent& WXUNUSED(event) )
  243. {
  244.     EndModal( wxID_CANCEL );
  245. }
  246. void SubsFileDialog::OnFileBrowse( wxCommandEvent& WXUNUSED(event) )
  247. {
  248.     wxFileDialog dialog( this, wxU(_("Open file")),
  249.                          wxT(""), wxT(""), wxT("*"), wxOPEN );
  250.     if( dialog.ShowModal() == wxID_OK )
  251.     {
  252.         file_combo->SetValue( dialog.GetPath() );
  253.     }
  254. }