00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "GoToDlg.h"
00028
00029 #include <atlrx.h>
00030
00031
00032
00033
00034 IMPLEMENT_DYNAMIC(CGoToDlg, CDialog)
00035 CGoToDlg::CGoToDlg(int time, float fps, CWnd* pParent )
00036 : CDialog(CGoToDlg::IDD, pParent)
00037 , m_timestr(_T(""))
00038 , m_framestr(_T(""))
00039 , m_time(time)
00040 , m_fps(fps)
00041 {
00042 if(m_fps == 0)
00043 {
00044 CString str = AfxGetApp()->GetProfileString(ResStr(IDS_R_SETTINGS), _T("fps"), _T("0"));
00045 if(_stscanf(str, _T("%f"), &m_fps) != 1) m_fps = 0;
00046 }
00047 }
00048
00049 CGoToDlg::~CGoToDlg()
00050 {
00051 }
00052
00053 void CGoToDlg::DoDataExchange(CDataExchange* pDX)
00054 {
00055 CDialog::DoDataExchange(pDX);
00056 DDX_Text(pDX, IDC_EDIT1, m_timestr);
00057 DDX_Text(pDX, IDC_EDIT4, m_framestr);
00058 DDX_Control(pDX, IDC_EDIT1, m_timeedit);
00059 DDX_Control(pDX, IDC_EDIT4, m_frameedit);
00060 }
00061
00062 BOOL CGoToDlg::OnInitDialog()
00063 {
00064 CDialog::OnInitDialog();
00065
00066 if(m_time >= 0)
00067 {
00068 m_timestr.Format(_T("%02d:%02d:%02d.%03d"),
00069 (m_time/(1000*60*60))%60, (m_time/(1000*60))%60, (m_time/1000)%60, m_time%1000);
00070
00071 if(m_fps > 0)
00072 {
00073 m_framestr.Format(_T("%d, %.3f"), (int)(m_fps*m_time/1000), m_fps);
00074 }
00075
00076 UpdateData(FALSE);
00077
00078 switch(AfxGetApp()->GetProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 0))
00079 {
00080 default:
00081 case 0: m_timeedit.SetFocus(); m_timeedit.SetSel(0, 0); break;
00082 case 1: m_frameedit.SetFocus(); m_frameedit.SetSel(0, m_framestr.Find(',')); break;
00083 }
00084
00085 }
00086
00087 return FALSE;
00088
00089
00090
00091 }
00092
00093
00094 BEGIN_MESSAGE_MAP(CGoToDlg, CDialog)
00095 ON_BN_CLICKED(IDOK, OnBnClickedOk)
00096 ON_BN_CLICKED(IDOK2, OnBnClickedOk2)
00097 END_MESSAGE_MAP()
00098
00099
00100
00101
00102 void CGoToDlg::OnBnClickedOk()
00103 {
00104 UpdateData();
00105
00106 int hh, mm, ss, ms;
00107 hh = mm = ss = ms = 0;
00108
00109 CAtlRegExp<> re;
00110
00111 REParseError status = re.Parse(_T("{\\z}"), FALSE);
00112 if(REPARSE_ERROR_OK == status)
00113 {
00114 CAtlREMatchContext<> mc;
00115 const CAtlREMatchContext<>::RECHAR* s = m_timestr.GetBuffer();
00116 const CAtlREMatchContext<>::RECHAR* e = NULL;
00117 while(s && re.Match(s, &mc, &e))
00118 {
00119 const CAtlREMatchContext<>::RECHAR* szStart = 0;
00120 const CAtlREMatchContext<>::RECHAR* szEnd = 0;
00121 mc.GetMatch(0, &szStart, &szEnd);
00122
00123 if(hh != 0 || hh > 59 || mm > 59 || ss > 59)
00124 {
00125 AfxMessageBox(_T("Error parsing entered time!"));
00126 return;
00127 }
00128
00129 hh = mm;
00130 mm = ss;
00131 ss = ms;
00132 ms = _tcstol(szStart, (TCHAR**)&szStart, 10);
00133
00134 s = e;
00135 }
00136
00137 m_time = ((hh*60+mm)*60+ss)*1000+ms;
00138
00139 AfxGetApp()->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 0);
00140
00141 OnOK();
00142 }
00143 }
00144
00145
00146 void CGoToDlg::OnBnClickedOk2()
00147 {
00148 UpdateData();
00149
00150 int frame = 0;
00151 float fps = 0;
00152
00153 CAtlRegExp<> re;
00154
00155 REParseError status = re.Parse(_T("{\\z}[^0-9\\.]+{[0-9\\.]+}"), FALSE);
00156 if(REPARSE_ERROR_OK == status)
00157 {
00158 CAtlREMatchContext<> mc;
00159 const CAtlREMatchContext<>::RECHAR* s = m_framestr.GetBuffer();
00160 const CAtlREMatchContext<>::RECHAR* e = NULL;
00161 if(re.Match(s, &mc, &e))
00162 {
00163 const CAtlREMatchContext<>::RECHAR* szStart = 0;
00164 const CAtlREMatchContext<>::RECHAR* szEnd = 0;
00165
00166 mc.GetMatch(0, &szStart, &szEnd);
00167 frame = _tcstol(szStart, (TCHAR**)&szStart, 10);
00168
00169 mc.GetMatch(1, &szStart, &szEnd);
00170 if(_stscanf(szStart, _T("%f"), &fps) != 1) fps = 0;
00171 else AfxGetApp()->WriteProfileString(ResStr(IDS_R_SETTINGS), _T("fps"), szStart);
00172 }
00173 else
00174 {
00175 AfxMessageBox(_T("Error parsing entered text!"));
00176 return;
00177 }
00178
00179 if(fps == 0)
00180 {
00181 AfxMessageBox(_T("Error parsing entered frame-rate!"));
00182 return;
00183 }
00184
00185 m_time = (int)(1000.0*frame/fps) + 1;
00186
00187 AfxGetApp()->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("gotoluf"), 1);
00188
00189 OnOK();
00190 }
00191 }
00192
00193 BOOL CGoToDlg::PreTranslateMessage(MSG* pMsg)
00194 {
00195 if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
00196 {
00197 if(*GetFocus() == m_timeedit) OnBnClickedOk();
00198 else if(*GetFocus() == m_frameedit) OnBnClickedOk2();
00199
00200 return TRUE;
00201 }
00202
00203 return CDialog::PreTranslateMessage(pMsg);
00204 }