VSRipPGCDlg.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // VSRipPGCDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <atlcoll.h>
  25. #include "VSRip.h"
  26. #include "VSRipPGCDlg.h"
  27. #include "....subtitlesVobSubFile.h"
  28. // CVSRipPGCDlg dialog
  29. IMPLEMENT_DYNAMIC(CVSRipPGCDlg, CVSRipPage)
  30. CVSRipPGCDlg::CVSRipPGCDlg(IVSFRipper* pVSFRipper, CWnd* pParent /*=NULL*/)
  31. : CVSRipPage(pVSFRipper, CVSRipPGCDlg::IDD, pParent)
  32. , m_bResetTime(TRUE)
  33. , m_bClosedCaption(FALSE)
  34. , m_bForcedOnly(FALSE)
  35. {
  36. m_rd.Reset();
  37. }
  38. CVSRipPGCDlg::~CVSRipPGCDlg()
  39. {
  40. }
  41. void CVSRipPGCDlg::DoDataExchange(CDataExchange* pDX)
  42. {
  43. CVSRipPage::DoDataExchange(pDX);
  44. DDX_Control(pDX, IDC_LIST1, m_pgclist);
  45. DDX_Control(pDX, IDC_LIST2, m_anglelist);
  46. DDX_Control(pDX, IDC_LIST3, m_vclist);
  47. DDX_Control(pDX, IDC_LIST4, m_langlist);
  48. DDX_Check(pDX, IDC_CHECK1, m_bResetTime);
  49. DDX_Check(pDX, IDC_CHECK2, m_bClosedCaption);
  50. DDX_Check(pDX, IDC_CHECK3, m_bForcedOnly);
  51. }
  52. void CVSRipPGCDlg::OnPrev()
  53. {
  54. OnNext();
  55. }
  56. void CVSRipPGCDlg::OnNext()
  57. {
  58. CAutoVectorPtr<int> items;
  59. m_rd.iSelPGC = m_pgclist.GetCurSel();
  60. m_rd.selids.RemoveAll();
  61. if(items.Allocate(m_langlist.GetSelCount()))
  62. {
  63. int j = m_langlist.GetSelItems(m_langlist.GetSelCount(), items);
  64. for(int i = 0; i < j; i++)
  65. m_rd.selids[(BYTE)m_langlist.GetItemData(items[i])] = true;
  66. items.Free();
  67. }
  68. m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_anglelist.GetCurSel();
  69. m_rd.selvcs.RemoveAll();
  70. if(items.Allocate(m_vclist.GetSelCount()))
  71. {
  72. int j = m_vclist.GetSelItems(m_vclist.GetSelCount(), items);
  73. for(int i = 0; i < j; i++)
  74. m_rd.selvcs.Add((DWORD)m_vclist.GetItemData(items[i]));
  75. items.Free();
  76. }
  77. m_rd.fClosedCaption = !!m_bClosedCaption;
  78. m_rd.fResetTime = !!m_bResetTime;
  79. m_rd.fForcedOnly = !!m_bForcedOnly;
  80. m_pVSFRipper->UpdateRipperData(m_rd);
  81. }
  82. bool CVSRipPGCDlg::CanGoNext()
  83. {
  84. UpdateData();
  85. return(m_pgclist.GetCurSel() >= 0
  86.         && m_anglelist.GetCurSel() >= 0 
  87. && m_vclist.GetSelCount() > 0 
  88. && (m_langlist.GetSelCount() > 0 || m_bClosedCaption));
  89. }
  90. void CVSRipPGCDlg::SetupPGCList()
  91. {
  92. ASSERT(m_rd.iSelPGC >= 0);
  93. m_pgclist.ResetContent();
  94. for(int i = 0; i < m_rd.pgcs.GetCount(); i++)
  95. {
  96. CString str;
  97. str.Format(_T("PGC %d"), i+1);
  98. m_pgclist.AddString(str);
  99. }
  100. m_pgclist.SetCurSel(m_rd.iSelPGC);
  101. SetupLangList();
  102. SetupAngleList();
  103. }
  104. void CVSRipPGCDlg::SetupLangList()
  105. {
  106. m_langlist.ResetContent();
  107. for(BYTE i = 0; i < 32; i++)
  108. {
  109. WORD id = m_rd.pgcs[m_rd.iSelPGC].ids[i];
  110. CString str;
  111. if(id == 0)
  112. {
  113. str.Format(_T("%02d (empty)"), (int)i);
  114. }
  115. else if(!isalpha(id>>8) || !isalpha(id&0xff))
  116. {
  117. str.Format(_T("%02d (unknown)"), (int)i);
  118. }
  119. else
  120. {
  121. str.Format(_T("%02d %s (%c%c)"), (int)i, FindLangFromId(id), TCHAR(id>>8), TCHAR(id&0xff));
  122. }
  123. int j = m_langlist.AddString(str);
  124. m_langlist.SetSel(j, !!id);
  125. m_langlist.SetItemData(j, (DWORD_PTR)i);
  126. }
  127. m_langlist.SetTopIndex(0);
  128. }
  129. void CVSRipPGCDlg::SetupAngleList()
  130. {
  131. m_anglelist.ResetContent();
  132. m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_rd.pgcs[m_rd.iSelPGC].nAngles > 0 ? 1 : 0;
  133. for(int i = 0; i < 10; i++)
  134. {
  135. CString str;
  136. if(i == 0)
  137. {
  138. str = _T("Everything");
  139. }
  140. else
  141. {
  142. str.Format(_T("Angle %d"), i);
  143. if(i > m_rd.pgcs[m_rd.iSelPGC].nAngles)
  144. str += _T(" (empty)");
  145. }
  146. m_anglelist.AddString(str);
  147. }
  148. m_anglelist.SetCurSel(m_rd.pgcs[m_rd.iSelPGC].iSelAngle);
  149. SetupVCList();
  150. }
  151. void CVSRipPGCDlg::SetupVCList()
  152. {
  153. m_vclist.ResetContent();
  154. CArray<vc_t>& vca = m_rd.pgcs[m_rd.iSelPGC].angles[m_rd.pgcs[m_rd.iSelPGC].iSelAngle];
  155. for(int i = 0; i < vca.GetCount(); i++)
  156. {
  157. CString str;
  158. str.Format(_T("V%02d C%02d"), vca[i].vob, vca[i].cell);
  159. DWORD vc = (vca[i].vob<<16)|vca[i].cell;
  160. int j = m_vclist.AddString(str);
  161. m_vclist.SetSel(j, TRUE);
  162. m_vclist.SetItemData(j, (DWORD_PTR)vc);
  163. }
  164. m_vclist.SetTopIndex(0);
  165. }
  166. BEGIN_MESSAGE_MAP(CVSRipPGCDlg, CVSRipPage)
  167. ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
  168. ON_LBN_SELCHANGE(IDC_LIST2, OnLbnSelchangeList2)
  169. ON_WM_SHOWWINDOW()
  170. END_MESSAGE_MAP()
  171. // CVSRipPGCDlg message handlers
  172. void CVSRipPGCDlg::OnLbnSelchangeList1()
  173. {
  174. if(m_rd.iSelPGC == m_pgclist.GetCurSel()) return;
  175. m_rd.iSelPGC = m_pgclist.GetCurSel();
  176. SetupAngleList();
  177. }
  178. void CVSRipPGCDlg::OnLbnSelchangeList2()
  179. {
  180. if(m_rd.pgcs[m_rd.iSelPGC].iSelAngle == m_anglelist.GetCurSel()) return;
  181. m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_anglelist.GetCurSel();
  182. SetupVCList();
  183. }
  184. void CVSRipPGCDlg::OnShowWindow(BOOL bShow, UINT nStatus)
  185. {
  186. CVSRipPage::OnShowWindow(bShow, nStatus);
  187. if(!bShow) return;
  188. m_pVSFRipper->GetRipperData(m_rd);
  189. if(m_rd.iSelPGC == -1)
  190. {
  191. m_rd.iSelPGC = 0;
  192. SetupPGCList();
  193. m_bClosedCaption = m_rd.vidinfo.line21_1 || m_rd.vidinfo.line21_2;
  194. UpdateData(FALSE);
  195. }
  196. }