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

多媒体编程

开发平台:

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. #include "stdafx.h"
  22. #include <commdlg.h>
  23. #include <afxdlgs.h>
  24. #include "DirectVobSubFilter.h"
  25. #include "DirectVobSubPropPage.h"
  26. #include "VSFilter.h"
  27. #include "StyleEditorDialog.h"
  28. #include "......DSUtilDSUtil.h"
  29. #include "......DSUtilMediaTypes.h"
  30. BOOL WINAPI MyGetDialogSize(int iResourceID, DLGPROC pDlgProc, LPARAM lParam, SIZE* pResult)
  31. {
  32.     HWND hwnd = CreateDialogParam(AfxGetResourceHandle(),
  33.         MAKEINTRESOURCE(iResourceID),
  34.         GetDesktopWindow(),
  35.         pDlgProc,
  36.         lParam);
  37.     
  38. if(hwnd == NULL) return FALSE;
  39.     RECT rc;
  40.     GetWindowRect(hwnd, &rc);
  41.     pResult->cx = rc.right - rc.left;
  42.     pResult->cy = rc.bottom - rc.top;
  43.     DestroyWindow(hwnd);
  44.     return TRUE;
  45. }
  46. STDMETHODIMP CDVSBasePPage::GetPageInfo(LPPROPPAGEINFO pPageInfo)
  47. {
  48. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  49. CString str;
  50. if(!str.LoadString(m_TitleId)) return E_FAIL;
  51. WCHAR wszTitle[STR_MAX_LENGTH];
  52. #ifdef UNICODE
  53. wcscpy(wszTitle, str);
  54. #else
  55. mbstowcs(wszTitle, str, str.GetLength()+1);
  56. #endif
  57. CheckPointer(pPageInfo, E_POINTER);
  58. // Allocate dynamic memory for the property page title
  59. LPOLESTR pszTitle;
  60. HRESULT hr = AMGetWideString(wszTitle, &pszTitle);
  61. if(FAILED(hr)) {NOTE("No caption memory"); return hr;}
  62. pPageInfo->cb               = sizeof(PROPPAGEINFO);
  63. pPageInfo->pszTitle         = pszTitle;
  64. pPageInfo->pszDocString     = NULL;
  65. pPageInfo->pszHelpFile      = NULL;
  66. pPageInfo->dwHelpContext    = 0;
  67. // Set defaults in case GetDialogSize fails
  68. pPageInfo->size.cx          = 340;
  69. pPageInfo->size.cy          = 150;
  70. MyGetDialogSize(m_DialogId, DialogProc, 0L, &pPageInfo->size);
  71. return NOERROR;
  72. }
  73. STDMETHODIMP CDVSBasePPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)
  74. {
  75. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  76. CheckPointer(pRect,E_POINTER);
  77. /*
  78.     // Return failure if SetObject has not been called.
  79.     if (m_bObjectSet == FALSE) {
  80.         return E_UNEXPECTED;
  81.     }
  82. */
  83.     if(m_hwnd) return E_UNEXPECTED;
  84.     m_hwnd = CreateDialogParam(AfxGetResourceHandle(), MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM)this);
  85.     if(m_hwnd == NULL) return E_OUTOFMEMORY;
  86.     OnActivate();
  87.     Move(pRect);
  88.     return Show(SW_SHOWNORMAL);
  89. }
  90. /* CDVSBasePPage */
  91. CDVSBasePPage::CDVSBasePPage(TCHAR* pName, LPUNKNOWN lpunk, int DialogId, int TitleId) :
  92.     CBasePropertyPage(pName, lpunk, DialogId, TitleId),
  93.     m_bIsInitialized(FALSE),
  94. m_fAttached(false),
  95. m_fDisableInstantUpdate(false)
  96. {
  97. }
  98. BOOL CDVSBasePPage::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  99. {
  100.     switch(uMsg)
  101.     {
  102.         case WM_COMMAND:
  103.         {
  104. if(m_bIsInitialized)
  105. {
  106. m_bDirty = TRUE;
  107. if(m_pPageSite) m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
  108. switch(HIWORD(wParam))
  109. {
  110. case BN_CLICKED: 
  111. case CBN_SELCHANGE:
  112. case EN_CHANGE:
  113. {
  114. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  115. if(!m_fDisableInstantUpdate 
  116. && !(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_INSTANTUPDATE)
  117. && !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 0)) 
  118. OnApplyChanges();
  119. }
  120. }
  121. }
  122. }
  123. break;
  124. case WM_NCDESTROY:
  125. DetachControls();
  126. break;
  127. }
  128. return OnMessage(uMsg, wParam, lParam) 
  129. ? 0 
  130. : CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
  131. }
  132. HRESULT CDVSBasePPage::OnConnect(IUnknown* pUnknown)
  133. {
  134.     if(!(m_pDirectVobSub = pUnknown)) return E_NOINTERFACE;
  135. m_pDirectVobSub->LockSubtitleReloader(true); // *
  136. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  137. UpdateObjectData(false);
  138. m_bIsInitialized = FALSE;
  139.     return NOERROR;
  140. }
  141. HRESULT CDVSBasePPage::OnDisconnect()
  142. {
  143.     if(m_pDirectVobSub == NULL) return E_UNEXPECTED;
  144. m_pDirectVobSub->LockSubtitleReloader(false); // *
  145. // for some reason OnDisconnect() will be called twice, that's why we 
  146. // need to release m_pDirectVobSub manually on the first call to avoid 
  147. // a second "m_pDirectVobSub->LockSubtitleReloader(false);"
  148. m_pDirectVobSub.Release(); 
  149. return NOERROR;
  150. }
  151. HRESULT CDVSBasePPage::OnActivate()
  152. {
  153. ASSERT(m_pDirectVobSub);
  154. AttachControls();
  155. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  156. UpdateControlData(false);
  157. m_bIsInitialized = TRUE;
  158.     return NOERROR;
  159. }
  160. HRESULT CDVSBasePPage::OnDeactivate()
  161. {
  162. ASSERT(m_pDirectVobSub);
  163. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  164. UpdateControlData(true);
  165.     m_bIsInitialized = FALSE;
  166.     return NOERROR;
  167. }
  168. HRESULT CDVSBasePPage::OnApplyChanges()
  169. {
  170.     ASSERT(m_pDirectVobSub);
  171. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  172. if(m_bIsInitialized)
  173. {
  174. OnDeactivate();
  175.         UpdateObjectData(true);
  176. m_pDirectVobSub->UpdateRegistry(); // *
  177. OnActivate();
  178. }
  179.     return NOERROR;
  180. }
  181. void CDVSBasePPage::AttachControls()
  182. {
  183. DetachControls();
  184. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  185. POSITION pos = m_controls.GetStartPosition();
  186. while(pos)
  187. {
  188. UINT id;
  189. CWnd* pControl;
  190. m_controls.GetNextAssoc(pos, id, pControl);
  191. if(pControl) 
  192. {
  193. BOOL fRet = pControl->Attach(GetDlgItem(m_Dlg, id));
  194. ASSERT(fRet);
  195. }
  196. }
  197. m_fAttached = true;
  198. }
  199. void CDVSBasePPage::DetachControls()
  200. {
  201. if(!m_fAttached) return;
  202. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  203. POSITION pos = m_controls.GetStartPosition();
  204. while(pos)
  205. {
  206. UINT id;
  207. CWnd* pControl;
  208. m_controls.GetNextAssoc(pos, id, pControl);
  209. if(pControl) pControl->Detach();
  210. }
  211. m_fAttached = false;
  212. }
  213. void CDVSBasePPage::BindControl(UINT id, CWnd& control)
  214. {
  215. m_controls[id] = &control;
  216. }
  217. /* CDVSMainPPage */
  218. CDVSMainPPage::CDVSMainPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  219.     CDVSBasePPage(NAME("DirectVobSub Property Page (main)"), pUnk, IDD_DVSMAINPAGE, IDD_DVSMAINPAGE),
  220. m_nLangs(0),
  221. m_ppLangs(NULL)
  222. {
  223. BindControl(IDC_FILENAME, m_fnedit);
  224. BindControl(IDC_LANGCOMBO, m_langs);
  225. BindControl(IDC_OVERRIDEPLACEMENT, m_oplacement);
  226. BindControl(IDC_SPIN1, m_subposx);
  227. BindControl(IDC_SPIN2, m_subposy);
  228. BindControl(IDC_FONT, m_font);
  229. BindControl(IDC_ONLYSHOWFORCEDSUBS, m_forcedsubs);
  230. }
  231. CDVSMainPPage::~CDVSMainPPage()
  232. {
  233. FreeLangs();
  234. }
  235. void CDVSMainPPage::FreeLangs()
  236. {
  237. if(m_nLangs > 0 && m_ppLangs) 
  238. {
  239. for(int i = 0; i < m_nLangs; i++) CoTaskMemFree(m_ppLangs[i]);
  240. CoTaskMemFree(m_ppLangs);
  241. m_nLangs = 0;
  242. m_ppLangs = NULL;
  243. }
  244. }
  245. void CDVSMainPPage::AllocLangs(int nLangs)
  246. {
  247. m_ppLangs = (WCHAR**)CoTaskMemRealloc(m_ppLangs, sizeof(WCHAR*)*nLangs);
  248. m_nLangs = nLangs;
  249. }
  250. bool CDVSMainPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  251. {
  252.     switch(uMsg)
  253.     {
  254.         case WM_COMMAND:
  255.         {
  256. switch(HIWORD(wParam))
  257. {
  258. case BN_CLICKED:
  259. {
  260. if(LOWORD(wParam) == IDC_OPEN)
  261. {
  262. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  263. CFileDialog fd(TRUE, NULL, NULL, 
  264. OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
  265. _T(".idx .smi .sub .srt .psb .ssa .ass .usf|*.idx;*.smi;*.sub;*.srt;*.psb;*.ssa;*.ass;*.usf|"),
  266. CDialog::FromHandle(m_Dlg), 0);
  267. if(fd.DoModal() == IDOK)
  268. {
  269. m_fnedit.SetWindowText(fd.GetPathName());
  270. }
  271. return(true);
  272. }
  273. else if(LOWORD(wParam) == IDC_FONT)
  274. {
  275. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  276. CStyleEditorDialog dlg(_T("Default"), &m_defStyle, CWnd::FromHandle(m_hwnd));
  277. if(dlg.DoModal() == IDOK)
  278. {
  279. m_defStyle = dlg.m_stss;
  280. CString str = m_defStyle.fontName;
  281. if(str.GetLength() > 18) str = str.Left(16).TrimRight() + _T("...");
  282. m_font.SetWindowText(str);
  283. }
  284. return(true);
  285. }
  286. }
  287. break;
  288. }
  289. }
  290. break;
  291. }
  292. return(false);
  293. }
  294. void CDVSMainPPage::UpdateObjectData(bool fSave)
  295. {
  296. if(fSave)
  297. {
  298. if(m_pDirectVobSub->put_FileName(m_fn) == S_OK)
  299. {
  300. int nLangs;
  301. m_pDirectVobSub->get_LanguageCount(&nLangs); 
  302. AllocLangs(nLangs);
  303. for(int i = 0; i < m_nLangs; i++) m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
  304. m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
  305. }
  306. m_pDirectVobSub->put_SelectedLanguage(m_iSelectedLanguage);
  307. m_pDirectVobSub->put_Placement(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc);
  308. m_pDirectVobSub->put_VobSubSettings(true, m_fOnlyShowForcedVobSubs, false);
  309. m_pDirectVobSub->put_TextSettings(&m_defStyle);
  310. }
  311. else
  312. {
  313. m_pDirectVobSub->get_FileName(m_fn);
  314. int nLangs;
  315. m_pDirectVobSub->get_LanguageCount(&nLangs); 
  316. AllocLangs(nLangs);
  317. for(int i = 0; i < m_nLangs; i++) m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
  318. m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
  319. m_pDirectVobSub->get_Placement(&m_fOverridePlacement, &m_PlacementXperc, &m_PlacementYperc);
  320. m_pDirectVobSub->get_VobSubSettings(NULL, &m_fOnlyShowForcedVobSubs, NULL);
  321. m_pDirectVobSub->get_TextSettings(&m_defStyle);
  322. }
  323. }
  324. void CDVSMainPPage::UpdateControlData(bool fSave)
  325. {
  326. if(fSave)
  327. {
  328. CString fn;
  329. m_fnedit.GetWindowText(fn);
  330. #ifdef UNICODE
  331. wcscpy(m_fn, fn);
  332. #else
  333. mbstowcs(m_fn, fn, fn.GetLength()+1);
  334. #endif
  335. m_iSelectedLanguage = m_langs.GetCurSel();
  336. m_fOverridePlacement = !!m_oplacement.GetCheck();
  337. m_PlacementXperc = m_subposx.GetPos();
  338. m_PlacementYperc = m_subposy.GetPos();
  339. m_fOnlyShowForcedVobSubs = !!m_forcedsubs.GetCheck();
  340. }
  341. else
  342. {
  343. m_fnedit.SetWindowText(CString(m_fn));
  344. m_oplacement.SetCheck(m_fOverridePlacement);
  345. m_subposx.SetRange(-20, 120);
  346. m_subposx.SetPos(m_PlacementXperc);
  347. m_subposx.EnableWindow(m_fOverridePlacement);
  348. m_subposy.SetRange(-20, 120);
  349. m_subposy.SetPos(m_PlacementYperc);
  350. m_subposy.EnableWindow(m_fOverridePlacement);
  351. m_font.SetWindowText(m_defStyle.fontName);
  352. m_forcedsubs.SetCheck(m_fOnlyShowForcedVobSubs);
  353. m_langs.ResetContent();
  354. m_langs.EnableWindow(m_nLangs > 0);
  355. for(int i = 0; i < m_nLangs; i++) m_langs.AddString(CString(m_ppLangs[i]));
  356. m_langs.SetCurSel(m_iSelectedLanguage);
  357. }
  358. }
  359. /* CDVSGeneralPPage */
  360. CDVSGeneralPPage::CDVSGeneralPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  361.     CDVSBasePPage(NAME("DirectVobSub Property Page (global settings)"), pUnk, IDD_DVSGENERALPAGE, IDD_DVSGENERALPAGE)
  362. {
  363. BindControl(IDC_VEREXTCOMBO, m_verext);
  364. BindControl(IDC_MOD32FIX, m_mod32fix);
  365. BindControl(IDC_RESX2COMBO, m_resx2);
  366. BindControl(IDC_SPIN3, m_resx2w);
  367. BindControl(IDC_SPIN4, m_resx2h);
  368. BindControl(IDC_LOADCOMBO, m_load);
  369. BindControl(IDC_EXTLOAD, m_extload);
  370. BindControl(IDC_WEBLOAD, m_webload);
  371. BindControl(IDC_EMBLOAD, m_embload);
  372. }
  373. bool CDVSGeneralPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  374. {
  375.     switch(uMsg)
  376.     {
  377.         case WM_COMMAND:
  378.         {
  379. switch(HIWORD(wParam))
  380. {
  381. case CBN_SELCHANGE:
  382. {
  383. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  384. if(LOWORD(wParam) == IDC_RESX2COMBO)
  385. {
  386. m_resx2w.EnableWindow(m_resx2.GetCurSel() == 2);
  387. m_resx2h.EnableWindow(m_resx2.GetCurSel() == 2);
  388. return(true);
  389. }
  390. else if(LOWORD(wParam) == IDC_LOADCOMBO)
  391. {
  392. m_extload.EnableWindow(m_load.GetCurSel() == 1);
  393. m_webload.EnableWindow(m_load.GetCurSel() == 1);
  394. m_embload.EnableWindow(m_load.GetCurSel() == 1);
  395. return(true);
  396. }
  397. }
  398. break;
  399. }
  400. }
  401. break;
  402. }
  403. return(false);
  404. }
  405. void CDVSGeneralPPage::UpdateObjectData(bool fSave)
  406. {
  407. if(fSave)
  408. {
  409. m_pDirectVobSub->put_ExtendPicture(m_HorExt, m_VerExt, m_ResX2, m_ResX2minw, m_ResX2minh);
  410. m_pDirectVobSub->put_LoadSettings(m_LoadLevel, m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad);
  411. }
  412. else
  413. {
  414. m_pDirectVobSub->get_ExtendPicture(&m_HorExt, &m_VerExt, &m_ResX2, &m_ResX2minw, &m_ResX2minh);
  415. m_pDirectVobSub->get_LoadSettings(&m_LoadLevel, &m_fExternalLoad, &m_fWebLoad, &m_fEmbeddedLoad);
  416. }
  417. }
  418. void CDVSGeneralPPage::UpdateControlData(bool fSave)
  419. {
  420. if(fSave)
  421. {
  422. if(m_verext.GetCurSel() >= 0) m_VerExt = m_verext.GetItemData(m_verext.GetCurSel());
  423. m_HorExt = !!m_mod32fix.GetCheck();
  424. if(m_resx2.GetCurSel() >= 0) m_ResX2 = m_resx2.GetItemData(m_resx2.GetCurSel());
  425. m_ResX2minw = m_resx2w.GetPos(); 
  426. m_ResX2minh = m_resx2h.GetPos();
  427. if(m_load.GetCurSel() >= 0) m_LoadLevel = m_load.GetItemData(m_load.GetCurSel());
  428. m_fExternalLoad = !!m_extload.GetCheck();
  429. m_fWebLoad = !!m_webload.GetCheck();
  430. m_fEmbeddedLoad = !!m_embload.GetCheck();
  431. }
  432. else
  433. {
  434. m_verext.ResetContent();
  435. m_verext.AddString(ResStr(IDS_ORGHEIGHT)); m_verext.SetItemData(0, 0);
  436. m_verext.AddString(ResStr(IDS_EXTTO169)); m_verext.SetItemData(1, 1);
  437. m_verext.AddString(ResStr(IDS_EXTTO43)); m_verext.SetItemData(2, 2);
  438. m_verext.AddString(ResStr(IDS_EXTTO480)); m_verext.SetItemData(3, 3);
  439. m_verext.AddString(ResStr(IDS_EXTTO576)); m_verext.SetItemData(4, 4);
  440. m_verext.AddString(ResStr(IDS_CROPTO169)); m_verext.SetItemData(5, 0x81);
  441. m_verext.AddString(ResStr(IDS_CROPTO43)); m_verext.SetItemData(6, 0x82);
  442. m_verext.SetCurSel((m_VerExt&0x7f) + ((m_VerExt&0x80)?4:0));
  443. m_mod32fix.SetCheck(m_HorExt&1);
  444. m_resx2.ResetContent();
  445. m_resx2.AddString(ResStr(IDS_ORGRES)); m_resx2.SetItemData(0, 0);
  446. m_resx2.AddString(ResStr(IDS_DBLRES)); m_resx2.SetItemData(1, 1);
  447. m_resx2.AddString(ResStr(IDS_DBLRESIF)); m_resx2.SetItemData(2, 2);
  448. m_resx2.SetCurSel(m_ResX2);
  449. m_resx2w.SetRange(0, 2048);
  450. m_resx2w.SetPos(m_ResX2minw);
  451. m_resx2w.EnableWindow(m_ResX2 == 2);
  452. m_resx2h.SetRange(0, 2048);
  453. m_resx2h.SetPos(m_ResX2minh);
  454. m_resx2h.EnableWindow(m_ResX2 == 2);
  455. m_load.ResetContent();
  456. m_load.AddString(ResStr(IDS_DONOTLOAD)); m_load.SetItemData(0, 2);
  457. m_load.AddString(ResStr(IDS_LOADWHENNEEDED)); m_load.SetItemData(1, 0);
  458. m_load.AddString(ResStr(IDS_ALWAYSLOAD)); m_load.SetItemData(2, 1);
  459. m_load.SetCurSel(!m_LoadLevel?1:m_LoadLevel==1?2:0);
  460. m_extload.SetCheck(m_fExternalLoad);
  461. m_webload.SetCheck(m_fWebLoad);
  462. m_embload.SetCheck(m_fEmbeddedLoad);
  463. m_extload.EnableWindow(m_load.GetCurSel() == 1);
  464. m_webload.EnableWindow(m_load.GetCurSel() == 1);
  465. m_embload.EnableWindow(m_load.GetCurSel() == 1);
  466. }
  467. }
  468. /* CDVSMiscPPage */
  469. CDVSMiscPPage::CDVSMiscPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  470.     CDVSBasePPage(NAME("DirectVobSub Property Page (misc settings)"), pUnk, IDD_DVSMISCPAGE, IDD_DVSMISCPAGE)
  471. {
  472. BindControl(IDC_FLIP, m_flippic);
  473. BindControl(IDC_FLIPSUB, m_flipsub);
  474. BindControl(IDC_HIDE, m_hidesub);
  475. BindControl(IDC_SHOWOSDSTATS, m_showosd);
  476. BindControl(IDC_PREBUFFERING, m_prebuff);
  477. BindControl(IDC_AUTORELOAD, m_autoreload);
  478. BindControl(IDC_SAVEFULLPATH, m_savefullpath);
  479. BindControl(IDC_INSTANTUPDATE, m_instupd);
  480. }
  481. bool CDVSMiscPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  482. {
  483.     switch(uMsg)
  484.     {
  485.         case WM_COMMAND:
  486.         {
  487. switch(HIWORD(wParam))
  488. {
  489. case BN_CLICKED:
  490. {
  491. if(LOWORD(wParam) == IDC_INSTANTUPDATE)
  492. {
  493. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  494. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), !!m_instupd.GetCheck());
  495. return(true);
  496. }
  497. }
  498. break;
  499. }
  500. }
  501. break;
  502. }
  503.     return(false);
  504. }
  505. void CDVSMiscPPage::UpdateObjectData(bool fSave)
  506. {
  507. if(fSave)
  508. {
  509. m_pDirectVobSub->put_Flip(m_fFlipPicture, m_fFlipSubtitles);
  510. m_pDirectVobSub->put_HideSubtitles(m_fHideSubtitles);
  511. m_pDirectVobSub->put_OSD(m_fOSD);
  512. m_pDirectVobSub->put_PreBuffering(m_fDoPreBuffering);
  513. m_pDirectVobSub->put_SubtitleReloader(m_fReloaderDisabled);
  514. m_pDirectVobSub->put_SaveFullPath(m_fSaveFullPath);
  515. }
  516. else
  517. {
  518. m_pDirectVobSub->get_Flip(&m_fFlipPicture, &m_fFlipSubtitles);
  519. m_pDirectVobSub->get_HideSubtitles(&m_fHideSubtitles);
  520. m_pDirectVobSub->get_OSD(&m_fOSD);
  521. m_pDirectVobSub->get_PreBuffering(&m_fDoPreBuffering);
  522. m_pDirectVobSub->get_SubtitleReloader(&m_fReloaderDisabled);
  523. m_pDirectVobSub->get_SaveFullPath(&m_fSaveFullPath);
  524. }
  525. }
  526. void CDVSMiscPPage::UpdateControlData(bool fSave)
  527. {
  528. if(fSave)
  529. {
  530. m_fFlipPicture = !!m_flippic.GetCheck();
  531. m_fFlipSubtitles = !!m_flipsub.GetCheck();
  532. m_fHideSubtitles = !!m_hidesub.GetCheck();
  533. m_fSaveFullPath = !!m_savefullpath.GetCheck();
  534. m_fDoPreBuffering = !!m_prebuff.GetCheck();
  535. m_fOSD = !!m_showosd.GetCheck();
  536. m_fReloaderDisabled = !m_autoreload.GetCheck();
  537. }
  538. else
  539. {
  540. m_flippic.SetCheck(m_fFlipPicture);
  541. m_flipsub.SetCheck(m_fFlipSubtitles);
  542. m_hidesub.SetCheck(m_fHideSubtitles);
  543. m_savefullpath.SetCheck(m_fSaveFullPath);
  544. m_prebuff.SetCheck(m_fDoPreBuffering);
  545. m_showosd.SetCheck(m_fOSD);
  546. m_autoreload.SetCheck(!m_fReloaderDisabled);
  547. m_instupd.SetCheck(!!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 0));
  548. }
  549. }
  550. /* CDVSTimingPPage */
  551. CDVSTimingPPage::CDVSTimingPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  552.     CDVSBasePPage(NAME("DirectVobSub Timing Property Page"), pUnk, IDD_DVSTIMINGPAGE, IDD_DVSTIMINGPAGE)
  553. {
  554. BindControl(IDC_MODFPS, m_modfps);
  555. BindControl(IDC_FPS, m_fps);
  556. BindControl(IDC_SPIN5, m_subdelay);
  557. BindControl(IDC_SPIN6, m_subspeedmul);
  558. BindControl(IDC_SPIN9, m_subspeeddiv);
  559. }
  560. bool CDVSTimingPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  561. {
  562.     switch(uMsg)
  563.     {
  564.         case WM_COMMAND:
  565.         {
  566. switch(HIWORD(wParam))
  567. {
  568. case BN_CLICKED:
  569. {
  570. if(LOWORD(wParam) == IDC_MODFPS)
  571. {
  572. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  573. m_fps.EnableWindow(!!m_modfps.GetCheck());
  574. return(true);
  575. }
  576. }
  577. break;
  578. }
  579. }
  580. break;
  581. }
  582. return(false);
  583. }
  584. void CDVSTimingPPage::UpdateObjectData(bool fSave)
  585. {
  586. if(fSave)
  587. {
  588. m_pDirectVobSub->put_SubtitleTiming(m_SubtitleDelay, m_SubtitleSpeedMul, m_SubtitleSpeedDiv);
  589. m_pDirectVobSub->put_MediaFPS(m_fMediaFPSEnabled, m_MediaFPS);
  590. }
  591. else
  592. {
  593. m_pDirectVobSub->get_SubtitleTiming(&m_SubtitleDelay, &m_SubtitleSpeedMul, &m_SubtitleSpeedDiv);
  594. m_pDirectVobSub->get_MediaFPS(&m_fMediaFPSEnabled, &m_MediaFPS);
  595. }
  596. }
  597. void CDVSTimingPPage::UpdateControlData(bool fSave)
  598. {
  599. if(fSave)
  600. {
  601. m_fMediaFPSEnabled = !!m_modfps.GetCheck();
  602. CString fpsstr;
  603. m_fps.GetWindowText(fpsstr);
  604. float fps;
  605. if(_stscanf(fpsstr, _T("%f"), &fps) == 1) m_MediaFPS = fps;
  606. #if _MFC_VER >= 0x0700
  607. m_SubtitleDelay = m_subdelay.GetPos32();
  608. m_SubtitleSpeedMul = m_subspeedmul.GetPos32();
  609. m_SubtitleSpeedDiv = m_subspeeddiv.GetPos32();
  610. #else
  611. m_SubtitleDelay = SendMessage(GetDlgItem(m_Dlg, IDC_SPIN5), UDM_GETPOS32, 0, 0);
  612. m_SubtitleSpeedMul = SendMessage(GetDlgItem(m_Dlg, IDC_SPIN6), UDM_GETPOS32, 0, 0);
  613. m_SubtitleSpeedDiv = SendMessage(GetDlgItem(m_Dlg, IDC_SPIN9), UDM_GETPOS32, 0, 0);
  614. #endif
  615. }
  616. else
  617. {
  618. m_modfps.SetCheck(m_fMediaFPSEnabled);
  619. CString fpsstr;
  620. fpsstr.Format(_T("%.4f"), m_MediaFPS);
  621. m_fps.SetWindowText(fpsstr);
  622. m_fps.EnableWindow(m_fMediaFPSEnabled);
  623. m_subdelay.SetRange32(-180*60*1000, 180*60*1000);
  624. m_subspeedmul.SetRange32(0, 1000000);
  625. m_subspeeddiv.SetRange32(1, 1000000);
  626. #if _MFC_VER >= 0x0700
  627. m_subdelay.SetPos32(m_SubtitleDelay);
  628. m_subspeedmul.SetPos32(m_SubtitleSpeedMul);
  629. m_subspeeddiv.SetPos32(m_SubtitleSpeedDiv);
  630. #else
  631. SendMessage(GetDlgItem(m_Dlg, IDC_SPIN5), UDM_SETPOS32, 0, (LPARAM)m_SubtitleDelay);
  632. SendMessage(GetDlgItem(m_Dlg, IDC_SPIN6), UDM_SETPOS32, 0, (LPARAM)m_SubtitleSpeedMul);
  633. SendMessage(GetDlgItem(m_Dlg, IDC_SPIN9), UDM_SETPOS32, 0, (LPARAM)m_SubtitleSpeedDiv);
  634. #endif
  635. }
  636. }
  637. /* CDVSAboutPPage */
  638. CDVSAboutPPage::CDVSAboutPPage(LPUNKNOWN lpunk, HRESULT* phr) : 
  639. CDVSBasePPage(NAME("About Property Page"), lpunk, IDD_DVSABOUTPAGE, IDD_DVSABOUTPAGE)
  640. {
  641. }
  642. bool CDVSAboutPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  643. {
  644.     switch(uMsg)
  645.     {
  646.         case WM_COMMAND:
  647.         {
  648. switch(HIWORD(wParam))
  649. {
  650. case BN_CLICKED:
  651. {
  652. if(LOWORD(wParam) == IDC_HOMEPAGEBTN)
  653. {
  654. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  655. ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_HOMEPAGE), NULL, NULL, SW_SHOWNORMAL);
  656. return(true);
  657. }
  658. else if(LOWORD(wParam) == IDC_BUGREPORTBTN)
  659. {
  660. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  661. ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_EMAIL), NULL, NULL, SW_SHOWNORMAL);
  662. return(true);
  663. }
  664. }
  665. break;
  666. }
  667. }
  668. break;
  669. }
  670.     return(false);
  671. }
  672. /* CDVSZoomPPage */
  673. CDVSZoomPPage::CDVSZoomPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  674.     CDVSBasePPage(NAME("DirectVobSub Zoom Property Page"), pUnk, IDD_DVSZOOMPAGE, IDD_DVSZOOMPAGE)
  675. {
  676. BindControl(IDC_SPIN1, m_posx);
  677. BindControl(IDC_SPIN2, m_posy);
  678. BindControl(IDC_SPIN7, m_scalex);
  679. BindControl(IDC_SPIN8, m_scaley);
  680. }
  681. bool CDVSZoomPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  682. {
  683.     switch(uMsg)
  684.     {
  685.         case WM_COMMAND:
  686.         {
  687. switch(HIWORD(wParam))
  688. {
  689. case EN_CHANGE:
  690. {
  691. if(LOWORD(wParam) == IDC_EDIT1 || LOWORD(wParam) == IDC_EDIT2
  692. || LOWORD(wParam) == IDC_EDIT7 || LOWORD(wParam) == IDC_EDIT8)
  693. {
  694. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  695. UpdateControlData(true);
  696. UpdateObjectData(true);
  697. return(true);
  698. }
  699. }
  700. break;
  701. }
  702. }
  703. break;
  704. }
  705. return(false);
  706. }
  707. void CDVSZoomPPage::UpdateControlData(bool fSave)
  708. {
  709. if(fSave)
  710. {
  711. m_rect.left = 1.0f * (short)m_posx.GetPos() / 100;
  712. m_rect.top = 1.0f * (short)m_posy.GetPos() / 100;
  713. m_rect.right = m_rect.left + 1.0f * (short)m_scalex.GetPos() / 100;
  714. m_rect.bottom = m_rect.top + 1.0f * (short)m_scaley.GetPos() / 100;
  715. }
  716. else
  717. {
  718. m_posx.SetRange(-100, 100);
  719. m_posx.SetPos((int)(m_rect.left*100));
  720. m_posy.SetRange(-100, 100);
  721. m_posy.SetPos((int)(m_rect.top*100));
  722. m_scalex.SetRange(-300, 300);
  723. m_scalex.SetPos((int)((m_rect.right-m_rect.left)*100));
  724. m_scaley.SetRange(-300, 300);
  725. m_scaley.SetPos((int)((m_rect.bottom-m_rect.top)*100));
  726. }
  727. }
  728. void CDVSZoomPPage::UpdateObjectData(bool fSave)
  729. {
  730. if(fSave)
  731. {
  732. m_pDirectVobSub->put_ZoomRect(&m_rect);
  733. }
  734. else
  735. {
  736. m_pDirectVobSub->get_ZoomRect(&m_rect);
  737. }
  738. }
  739. // TODO: Make CDVSColorPPage and CDVSPathsPPage use an interface on DirectVobSub instead of the registry to communicate
  740. /* CDVSColorPPage */
  741. CDVSColorPPage::CDVSColorPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  742.     CDVSBasePPage(NAME("DirectVobSub Color Property Page"), pUnk, IDD_DVSCOLORPAGE, IDD_DVSCOLORPAGE)
  743. {
  744. BindControl(IDC_PREFLIST, m_preflist);
  745. BindControl(IDC_DYNCHGLIST, m_dynchglist);
  746. BindControl(IDC_FORCERGBCHK, m_forcergb);
  747. m_fDisableInstantUpdate = true;
  748. }
  749. bool CDVSColorPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  750. {
  751.     switch(uMsg)
  752.     {
  753.         case WM_COMMAND:
  754.         {
  755. switch(HIWORD(wParam))
  756. {
  757. case LBN_DBLCLK:
  758. if((HWND)lParam == m_dynchglist.m_hWnd)
  759. {
  760. int old = -1; 
  761. m_pDirectVobSub->get_ColorFormat(&old);
  762. if(FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel())))
  763. m_dynchglist.SetCurSel(old);
  764. return(true);
  765. }
  766. break;
  767. case BN_CLICKED:
  768. {
  769. switch(LOWORD(wParam))
  770. {
  771. case IDC_COLORCHANGE:
  772. {
  773. int old = -1; 
  774. m_pDirectVobSub->get_ColorFormat(&old);
  775. if(FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel())))
  776. m_dynchglist.SetCurSel(old);
  777. return(true);
  778. }
  779. case IDC_COLORUP:
  780. {
  781. int sel = m_preflist.GetCurSel();
  782. if(sel > 0)
  783. {
  784. CString str;
  785. m_preflist.GetText(sel, str);
  786. int iPos = (int)m_preflist.GetItemData(sel);
  787. m_preflist.DeleteString(sel);
  788. sel--;
  789. m_preflist.InsertString(sel, str);
  790. m_preflist.SetItemData(sel, iPos);
  791. m_preflist.SetCurSel(sel);
  792. }
  793. return(true);
  794. }
  795. case IDC_COLORDOWN:
  796. {
  797. int sel = m_preflist.GetCurSel();
  798. if(sel >= 0 && sel < m_preflist.GetCount()-1)
  799. {
  800. CString str;
  801. m_preflist.GetText(sel, str);
  802. int iPos = (int)m_preflist.GetItemData(sel);
  803. m_preflist.DeleteString(sel);
  804. sel++;
  805. m_preflist.InsertString(sel, str);
  806. m_preflist.SetItemData(sel, iPos);
  807. m_preflist.SetCurSel(sel);
  808. }
  809. return(true);
  810. }
  811. }
  812. }
  813. break;
  814. }
  815. }
  816. break;
  817. }
  818.     return(false);
  819. }
  820. void CDVSColorPPage::UpdateObjectData(bool fSave)
  821. {
  822. if(fSave)
  823. {
  824. }
  825. else
  826. {
  827. }
  828. }
  829. void CDVSColorPPage::UpdateControlData(bool fSave)
  830. {
  831. if(fSave)
  832. {
  833. if(m_preflist.GetCount() == VIHSIZE)
  834. {
  835. BYTE* pData = new BYTE[VIHSIZE];
  836. for(int i = 0; i < m_preflist.GetCount(); i++)
  837. pData[i] = (BYTE)m_preflist.GetItemData(i);
  838. theApp.WriteProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), pData, VIHSIZE);
  839. delete [] pData;
  840. }
  841. else ASSERT(0);
  842. theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), !!m_forcergb.GetCheck());
  843. }
  844. else
  845. {
  846. m_preflist.ResetContent();
  847. m_dynchglist.ResetContent();
  848. BYTE* pData = NULL;
  849. UINT nSize;
  850. if(!theApp.GetProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), &pData, &nSize)
  851. || !pData || nSize != VIHSIZE)
  852. {
  853. if(pData) delete [] pData, pData = NULL;
  854. nSize = VIHSIZE;
  855. pData = new BYTE[VIHSIZE];
  856. for(int i = 0; i < VIHSIZE; i++) pData[i] = i;
  857. }
  858. if(pData)
  859. {
  860. for(int i = 0; i < (int)nSize; i++)
  861. {
  862. m_dynchglist.AddString(VIH2String(pData[i]));
  863. m_dynchglist.SetItemData(i, pData[i]);
  864. m_preflist.AddString(VIH2String(pData[i]));
  865. m_preflist.SetItemData(i, pData[i]);
  866. }
  867. int iPosition = -1;
  868. m_pDirectVobSub->get_ColorFormat(&iPosition);
  869. m_dynchglist.SetCurSel(iPosition);
  870. delete [] pData;
  871. }
  872. m_forcergb.SetCheck(theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), 0)?BST_CHECKED:BST_UNCHECKED);
  873. }
  874. }
  875. /* CDVSPathsPPage */
  876. CDVSPathsPPage::CDVSPathsPPage(LPUNKNOWN pUnk, HRESULT* phr) :
  877.     CDVSBasePPage(NAME("DirectVobSub Paths Property Page"), pUnk, IDD_DVSPATHSPAGE, IDD_DVSPATHSPAGE)
  878. {
  879. BindControl(IDC_PATHLIST, m_pathlist);
  880. BindControl(IDC_PATHEDIT, m_path);
  881. BindControl(IDC_BROWSE, m_browse);
  882. BindControl(IDC_REMOVE, m_remove);
  883. BindControl(IDC_ADD, m_add);
  884. m_fDisableInstantUpdate = true;
  885. }
  886. bool CDVSPathsPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  887. {
  888.     switch(uMsg)
  889.     {
  890.         case WM_COMMAND:
  891.         {
  892. switch(HIWORD(wParam))
  893. {
  894. case LBN_SELCHANGE:
  895. if((HWND)lParam == m_pathlist.m_hWnd)
  896. {
  897. int i = m_pathlist.GetCurSel();
  898. m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
  899. if(i >= 0)
  900. {
  901. CString path;
  902. m_pathlist.GetText(i, path);
  903. m_path.SetWindowText(path);
  904. }
  905. return(true);
  906. }
  907. break;
  908. case LBN_SELCANCEL:
  909. if((HWND)lParam == m_pathlist.m_hWnd)
  910. {
  911. m_remove.EnableWindow(FALSE);
  912. return(true);
  913. }
  914. break;
  915. case BN_CLICKED:
  916. {
  917. switch(LOWORD(wParam))
  918. {
  919. case IDC_BROWSE:
  920. {
  921. TCHAR pathbuff[MAX_PATH];
  922. BROWSEINFO bi;
  923. bi.hwndOwner = m_Dlg;
  924. bi.pidlRoot = NULL;
  925. bi.pszDisplayName = pathbuff;
  926. bi.lpszTitle = _T("");
  927. bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_VALIDATE | BIF_USENEWUI;
  928. bi.lpfn = NULL;
  929. bi.lParam = 0;
  930. bi.iImage = 0; 
  931. LPITEMIDLIST iil;
  932. if(iil = SHBrowseForFolder(&bi))
  933. {
  934. SHGetPathFromIDList(iil, pathbuff);
  935. m_path.SetWindowText(pathbuff);
  936. }
  937. return(true);
  938. }
  939. break;
  940. case IDC_REMOVE:
  941. {
  942. int i = m_pathlist.GetCurSel();
  943. if(i >= 0)
  944. {
  945. m_pathlist.DeleteString(i);
  946. i = min(i, m_pathlist.GetCount()-1);
  947. if(i >= 0 && m_pathlist.GetCount() > 0)
  948. {
  949. m_pathlist.SetCurSel(i);
  950. m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
  951. }
  952. }
  953. return(true);
  954. }
  955. break;
  956. case IDC_ADD:
  957. {
  958. CString path;
  959. m_path.GetWindowText(path);
  960. if(!path.IsEmpty() && m_pathlist.FindString(-1, path) < 0)
  961. m_pathlist.AddString(path);
  962. return(true);
  963. }
  964. break;
  965. }
  966. }
  967. break;
  968. }
  969. }
  970. break;
  971. }
  972.     return(false);
  973. }
  974. void CDVSPathsPPage::UpdateObjectData(bool fSave)
  975. {
  976. if(fSave)
  977. {
  978. CString chk(_T("123456789")), path, tmp;
  979. int i = 0;
  980. do
  981. {
  982. tmp.Format(ResStr(IDS_RP_PATH), i++);
  983. path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
  984. if(path != chk) theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, _T(""));
  985. }
  986. while(path != chk);
  987. for(i = 0; i < m_paths.GetSize(); i++)
  988. {
  989. tmp.Format(ResStr(IDS_RP_PATH), i);
  990. theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, m_paths[i]);
  991. }
  992. }
  993. else
  994. {
  995. CString chk(_T("123456789")), path, tmp;
  996. int i = 0;
  997. do
  998. {
  999. if(!path.IsEmpty()) m_paths.Add(path);
  1000. tmp.Format(ResStr(IDS_RP_PATH), i++);
  1001. path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
  1002. }
  1003. while(path != chk);
  1004. }
  1005. }
  1006. void CDVSPathsPPage::UpdateControlData(bool fSave)
  1007. {
  1008. if(fSave)
  1009. {
  1010. m_paths.RemoveAll();
  1011. for(int i = 0; i < m_pathlist.GetCount(); i++) 
  1012. {
  1013. CString path;
  1014. m_pathlist.GetText(i, path);
  1015. m_paths.Add(path);
  1016. }
  1017. }
  1018. else
  1019. {
  1020. m_pathlist.ResetContent();
  1021. for(int i = 0; i < m_paths.GetSize(); i++) 
  1022. m_pathlist.AddString(m_paths[i]);
  1023. m_remove.EnableWindow(FALSE);
  1024. m_add.EnableWindow(TRUE);
  1025. }
  1026. }