/* * $Id$ * * (C) 2003-2005 Gabest * (C) 2006-2010 see AUTHORS * * This file is part of vsrip. * * Vsrip is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Vsrip is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "stdafx.h" #include #include "VSRip.h" #include "VSRipPGCDlg.h" #include "../../Subtitles/VobSubFile.h" // CVSRipPGCDlg dialog IMPLEMENT_DYNAMIC(CVSRipPGCDlg, CVSRipPage) CVSRipPGCDlg::CVSRipPGCDlg(IVSFRipper* pVSFRipper, CWnd* pParent /*=NULL*/) : CVSRipPage(pVSFRipper, CVSRipPGCDlg::IDD, pParent) , m_bResetTime(TRUE) , m_bClosedCaption(FALSE) , m_bForcedOnly(FALSE) { m_rd.Reset(); } CVSRipPGCDlg::~CVSRipPGCDlg() { } void CVSRipPGCDlg::DoDataExchange(CDataExchange* pDX) { CVSRipPage::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_pgclist); DDX_Control(pDX, IDC_LIST2, m_anglelist); DDX_Control(pDX, IDC_LIST3, m_vclist); DDX_Control(pDX, IDC_LIST4, m_langlist); DDX_Check(pDX, IDC_CHECK1, m_bResetTime); DDX_Check(pDX, IDC_CHECK2, m_bClosedCaption); DDX_Check(pDX, IDC_CHECK3, m_bForcedOnly); } void CVSRipPGCDlg::OnPrev() { OnNext(); } void CVSRipPGCDlg::OnNext() { CAutoVectorPtr items; m_rd.iSelPGC = m_pgclist.GetCurSel(); m_rd.selids.RemoveAll(); if(items.Allocate(m_langlist.GetSelCount())) { int j = m_langlist.GetSelItems(m_langlist.GetSelCount(), items); for(int i = 0; i < j; i++) m_rd.selids[(BYTE)m_langlist.GetItemData(items[i])] = true; items.Free(); } m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_anglelist.GetCurSel(); m_rd.selvcs.RemoveAll(); if(items.Allocate(m_vclist.GetSelCount())) { int j = m_vclist.GetSelItems(m_vclist.GetSelCount(), items); for(int i = 0; i < j; i++) m_rd.selvcs.Add((DWORD)m_vclist.GetItemData(items[i])); items.Free(); } m_rd.fClosedCaption = !!m_bClosedCaption; m_rd.fResetTime = !!m_bResetTime; m_rd.fForcedOnly = !!m_bForcedOnly; m_pVSFRipper->UpdateRipperData(m_rd); } bool CVSRipPGCDlg::CanGoNext() { UpdateData(); return(m_pgclist.GetCurSel() >= 0 && m_anglelist.GetCurSel() >= 0 && m_vclist.GetSelCount() > 0 && (m_langlist.GetSelCount() > 0 || m_bClosedCaption)); } void CVSRipPGCDlg::SetupPGCList() { ASSERT(m_rd.iSelPGC >= 0); m_pgclist.ResetContent(); for(int i = 0; i < (int)m_rd.pgcs.GetCount(); i++) { CString str; str.Format(_T("PGC %d"), i+1); m_pgclist.AddString(str); } m_pgclist.SetCurSel(m_rd.iSelPGC); SetupLangList(); SetupAngleList(); } void CVSRipPGCDlg::SetupLangList() { m_langlist.ResetContent(); for(BYTE i = 0; i < 32; i++) { WORD id = m_rd.pgcs[m_rd.iSelPGC].ids[i]; CString str; if(id == 0) { str.Format(_T("%02d (empty)"), (int)i); } else if(!isalpha(id>>8) || !isalpha(id&0xff)) { str.Format(_T("%02d (unknown)"), (int)i); } else { str.Format(_T("%02d %s (%c%c)"), (int)i, FindLangFromId(id), TCHAR(id>>8), TCHAR(id&0xff)); } int j = m_langlist.AddString(str); m_langlist.SetSel(j, !!id); m_langlist.SetItemData(j, (DWORD_PTR)i); } m_langlist.SetTopIndex(0); } void CVSRipPGCDlg::SetupAngleList() { m_anglelist.ResetContent(); m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_rd.pgcs[m_rd.iSelPGC].nAngles > 0 ? 1 : 0; for(int i = 0; i < 10; i++) { CString str; if(i == 0) { str = _T("Everything"); } else { str.Format(_T("Angle %d"), i); if(i > m_rd.pgcs[m_rd.iSelPGC].nAngles) str += _T(" (empty)"); } m_anglelist.AddString(str); } m_anglelist.SetCurSel(m_rd.pgcs[m_rd.iSelPGC].iSelAngle); SetupVCList(); } void CVSRipPGCDlg::SetupVCList() { m_vclist.ResetContent(); CAtlArray& vca =( m_rd.pgcs[m_rd.iSelPGC].angles[m_rd.pgcs[m_rd.iSelPGC].iSelAngle]); for(int i = 0; i < (int)vca.GetCount(); i++) { CString str; str.Format(_T("V%02d C%02d"), vca[i].vob, vca[i].cell); DWORD vc = (vca[i].vob<<16)|vca[i].cell; int j = m_vclist.AddString(str); m_vclist.SetSel(j, TRUE); m_vclist.SetItemData(j, (DWORD_PTR)vc); } m_vclist.SetTopIndex(0); } BEGIN_MESSAGE_MAP(CVSRipPGCDlg, CVSRipPage) ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1) ON_LBN_SELCHANGE(IDC_LIST2, OnLbnSelchangeList2) ON_WM_SHOWWINDOW() END_MESSAGE_MAP() // CVSRipPGCDlg message handlers void CVSRipPGCDlg::OnLbnSelchangeList1() { if(m_rd.iSelPGC == m_pgclist.GetCurSel()) return; m_rd.iSelPGC = m_pgclist.GetCurSel(); SetupAngleList(); } void CVSRipPGCDlg::OnLbnSelchangeList2() { if(m_rd.pgcs[m_rd.iSelPGC].iSelAngle == m_anglelist.GetCurSel()) return; m_rd.pgcs[m_rd.iSelPGC].iSelAngle = m_anglelist.GetCurSel(); SetupVCList(); } void CVSRipPGCDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CVSRipPage::OnShowWindow(bShow, nStatus); if(!bShow) return; m_pVSFRipper->GetRipperData(m_rd); if(m_rd.iSelPGC == -1) { m_rd.iSelPGC = 0; SetupPGCList(); m_bClosedCaption = m_rd.vidinfo.line21_1 || m_rd.vidinfo.line21_2; UpdateData(FALSE); } }