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

多媒体编程

开发平台:

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. // PPageFormats.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PPageFormats.h"
  26. // CPPageFormats dialog
  27. IMPLEMENT_DYNAMIC(CPPageFormats, CPPageBase)
  28. CPPageFormats::CPPageFormats()
  29. : CPPageBase(CPPageFormats::IDD, CPPageFormats::IDD)
  30. , m_list(0)
  31. , m_exts(_T(""))
  32. , m_iRtspHandler(0)
  33. , m_fRtspFileExtFirst(FALSE)
  34. {
  35. }
  36. CPPageFormats::~CPPageFormats()
  37. {
  38. }
  39. void CPPageFormats::DoDataExchange(CDataExchange* pDX)
  40. {
  41. __super::DoDataExchange(pDX);
  42. DDX_Control(pDX, IDC_LIST1, m_list);
  43. DDX_Text(pDX, IDC_EDIT1, m_exts);
  44. DDX_Control(pDX, IDC_STATIC1, m_autoplay);
  45. DDX_Control(pDX, IDC_CHECK1, m_apvideo);
  46. DDX_Control(pDX, IDC_CHECK2, m_apmusic);
  47. DDX_Control(pDX, IDC_CHECK3, m_apaudiocd);
  48. DDX_Control(pDX, IDC_CHECK4, m_apdvd);
  49. DDX_Radio(pDX, IDC_RADIO4, m_iRtspHandler);
  50. DDX_Check(pDX, IDC_CHECK5, m_fRtspFileExtFirst);
  51. }
  52. int CPPageFormats::GetChecked(int iItem)
  53. {
  54. LVITEM lvi;
  55. lvi.iItem = iItem;
  56. lvi.iSubItem = 0;
  57. lvi.mask = LVIF_IMAGE;
  58. m_list.GetItem(&lvi);
  59. return(lvi.iImage);
  60. }
  61. void CPPageFormats::SetChecked(int iItem, int iChecked)
  62. {
  63. LVITEM lvi;
  64. lvi.iItem = iItem;
  65. lvi.iSubItem = 0;
  66. lvi.mask = LVIF_IMAGE;
  67. lvi.iImage = iChecked;
  68. m_list.SetItem(&lvi);
  69. }
  70. static bool MakeRegParams(CString ext, CString& path, CString& fn, CString& extfile, CString& cmd)
  71. {
  72. if(ext.GetLength() == 0)
  73. return(false);
  74. TCHAR buff[MAX_PATH];
  75. if(::GetModuleFileName(AfxGetInstanceHandle(), buff, MAX_PATH) == 0)
  76. return(false);
  77. path = buff;
  78. fn = path.Mid(path.ReverseFind('\')+1).MakeLower();
  79. if(fn.IsEmpty())
  80. return(false);
  81. extfile = ext.TrimLeft('.')+_T("file");
  82. cmd = _T(""") + path + _T("" "%1"");
  83. return(true);
  84. }
  85. bool CPPageFormats::IsRegistered(CString ext)
  86. {
  87. CString path, fn, extfile, cmd;
  88. if(!MakeRegParams(ext, path, fn, extfile, cmd))
  89. return(false);
  90. TCHAR buff[256];
  91. ULONG len = sizeof(buff);
  92. memset(buff, 0, len);
  93. CRegKey key;
  94. CString ExplExt = _T("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\") + ext;
  95. if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, ExplExt, KEY_READ))
  96. {
  97. len = sizeof(buff);
  98. memset(buff, 0, len);
  99. if(ERROR_SUCCESS == key.QueryStringValue(_T("Application"), buff, &len))
  100. return(CString(buff).Trim() == cmd);
  101. }
  102. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext, KEY_READ))
  103. return(false);
  104. len = sizeof(buff);
  105. memset(buff, 0, len);
  106. if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (extfile = buff).Trim().IsEmpty())
  107. return(false);
  108. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open\command"), KEY_READ))
  109. return(false);
  110. len = sizeof(buff);
  111. memset(buff, 0, len);
  112. CRegKey key2;
  113. if(ERROR_SUCCESS == key2.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open"), KEY_READ)
  114. && ERROR_SUCCESS == key2.QueryStringValue(_T("LegacyDisable"), buff, &len))
  115. return(false);
  116. len = sizeof(buff);
  117. memset(buff, 0, len);
  118. if(ERROR_SUCCESS == key2.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open\DropTarget"), KEY_READ))
  119. return(false);
  120. len = sizeof(buff);
  121. memset(buff, 0, len);
  122. return(ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) 
  123. && !CString(buff).CompareNoCase(cmd));
  124. }
  125. bool CPPageFormats::RegisterExt(CString ext, bool fRegister)
  126. {
  127. if(fRegister == IsRegistered(ext))
  128. return(true);
  129. CString path, fn, extfile, cmd;
  130. if(!MakeRegParams(ext, path, fn, extfile, cmd))
  131. return(false);
  132. TCHAR buff[256];
  133. ULONG len = sizeof(buff);
  134. memset(buff, 0, len);
  135. CRegKey key;
  136. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, ext))
  137. return(false);
  138. len = sizeof(buff);
  139. memset(buff, 0, len);
  140. if(ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && !CString(buff).Trim().IsEmpty())
  141. {
  142. extfile = buff;
  143. }
  144. else
  145. {
  146. if(!fRegister) return(true);
  147. else if(ERROR_SUCCESS != key.SetStringValue(NULL, extfile)) return(false);
  148. }
  149. if(fRegister)
  150. {
  151. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, extfile + _T("\shell")))
  152. return(false);
  153. len = sizeof(buff);
  154. memset(buff, 0, len);
  155. key.QueryStringValue(NULL, buff, &len);
  156. if(ERROR_SUCCESS != key.SetStringValue(fn + _T(".bak"), buff))
  157. return(false);
  158. if(ERROR_SUCCESS != key.SetStringValue(NULL, _T("open")))
  159. {
  160. key.SetStringValue(NULL, buff);
  161. key.DeleteValue(fn + _T(".bak"));
  162. return(false);
  163. }
  164. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, extfile + _T("\shell\open")))
  165. return(false);
  166. len = sizeof(buff);
  167. memset(buff, 0, len);
  168. if(ERROR_SUCCESS != key.SetStringValue(NULL, _T("&Open")))
  169. return(false);
  170. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, extfile + _T("\shell\open\command")))
  171. return(false);
  172. len = sizeof(buff);
  173. memset(buff, 0, len);
  174. key.QueryStringValue(NULL, buff, &len);
  175. if(CString(buff).MakeLower() == cmd)
  176. return(true);
  177. if(ERROR_SUCCESS != key.SetStringValue(fn + _T(".bak"), buff))
  178. return(false);
  179. if(ERROR_SUCCESS != key.SetStringValue(NULL, cmd))
  180. {
  181. key.SetStringValue(NULL, buff);
  182. key.DeleteValue(fn + _T(".bak"));
  183. return(false);
  184. }
  185. len = sizeof(buff);
  186. memset(buff, 0, len);
  187. if(ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open")))
  188. {
  189. if(ERROR_SUCCESS == key.QueryStringValue(_T("LegacyDisable"), buff, &len))
  190. {
  191. key.DeleteValue(_T("LegacyDisable"));
  192. key.SetStringValue(_T("LegacyDisable.bak"), _T(""));
  193. }
  194. key.RecurseDeleteKey(_T("ddeexec"));
  195. key.RecurseDeleteKey(_T("DropTarget"));
  196. }
  197. if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\") + ext))
  198. {
  199. key.DeleteValue(_T("Application"));
  200. }
  201. }
  202. else
  203. {
  204. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open\command")))
  205. return(true);
  206. len = sizeof(buff);
  207. memset(buff, 0, len);
  208. if(ERROR_SUCCESS != key.QueryStringValue(fn + _T(".bak"), buff, &len))
  209. buff[0] = 0; //return(true);
  210. if(CString(buff).Trim().IsEmpty())
  211. {
  212. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open"))
  213. || ERROR_SUCCESS != key.RecurseDeleteKey(_T("command")))
  214. return(false);
  215. }
  216. else
  217. {
  218. if(ERROR_SUCCESS != key.SetStringValue(NULL, buff)
  219. || ERROR_SUCCESS != key.DeleteValue(fn + _T(".bak")))
  220. return(false);
  221. len = sizeof(buff);
  222. memset(buff, 0, len);
  223. if(ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell\open"))
  224. && ERROR_SUCCESS == key.QueryStringValue(_T("LegacyDisable.bak"), buff, &len))
  225. {
  226. key.DeleteValue(_T("LegacyDisable.bak"));
  227. key.SetStringValue(_T("LegacyDisable"), _T(""));
  228. }
  229. }
  230. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, extfile + _T("\shell")))
  231. return(true);
  232. len = sizeof(buff);
  233. memset(buff, 0, len);
  234. if(ERROR_SUCCESS != key.QueryStringValue(fn + _T(".bak"), buff, &len))
  235. return(true);
  236. if(CString(buff).Trim().IsEmpty())
  237. {
  238. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, extfile)
  239. || ERROR_SUCCESS != key.RecurseDeleteKey(_T("shell")))
  240. return(false);
  241. }
  242. else
  243. {
  244. if(ERROR_SUCCESS != key.SetStringValue(NULL, buff)
  245. || ERROR_SUCCESS != key.DeleteValue(fn + _T(".bak")))
  246. return(false);
  247. }
  248. }
  249. return(true);
  250. }
  251. static struct {TCHAR verb[20], cmd[20], action[100];} handlers[] =
  252. {
  253. {_T("VideoFiles"), _T(" %1"), _T("Play Video")},
  254. {_T("MusicFiles"), _T(" %1"), _T("Play Music")},
  255. {_T("CDAudio"), _T(" %1 /cd"), _T("Play Audio CD")},
  256. {_T("DVDMovie"), _T(" %1 /dvd"), _T("Play DVD Movie")},
  257. };
  258. void CPPageFormats::AddAutoPlayToRegistry(autoplay_t ap, bool fRegister)
  259. {
  260. if(!AfxGetAppSettings().fXpOrBetter) return;
  261. TCHAR buff[MAX_PATH];
  262. if(::GetModuleFileName(AfxGetInstanceHandle(), buff, MAX_PATH) == 0) return;
  263. CString exe = buff;
  264. int i = (int)ap;
  265. if(i < 0 || i >= countof(handlers)) return;
  266. CRegKey key;
  267. if(fRegister)
  268. {
  269. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, _T("MediaPlayerClassic.Autorun"))) return;
  270. key.Close();
  271. if(ERROR_SUCCESS != key.Create(HKEY_CLASSES_ROOT, 
  272. CString(_T("MediaPlayerClassic.Autorun\Shell\Play")) + handlers[i].verb + _T("\Command"))) return;
  273. key.SetStringValue(NULL, exe + handlers[i].cmd);
  274. key.Close();
  275. if(ERROR_SUCCESS != key.Create(HKEY_LOCAL_MACHINE, 
  276. CString(_T("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\MPCPlay")) + handlers[i].verb + _T("OnArrival"))) return;
  277. key.SetStringValue(_T("Action"), handlers[i].action);
  278. key.SetStringValue(_T("Provider"), _T("Media Player Classic"));
  279. key.SetStringValue(_T("InvokeProgID"), _T("MediaPlayerClassic.Autorun"));
  280. key.SetStringValue(_T("InvokeVerb"), CString(_T("Play")) + handlers[i].verb);
  281. key.SetStringValue(_T("DefaultIcon"), exe + _T(",0"));
  282. key.Close();
  283. if(ERROR_SUCCESS != key.Create(HKEY_LOCAL_MACHINE, 
  284. CString(_T("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play")) + handlers[i].verb + _T("OnArrival"))) return;
  285. key.SetStringValue(CString(_T("MPCPlay")) + handlers[i].verb + _T("OnArrival"), _T(""));
  286. key.Close();
  287. }
  288. else
  289. {
  290. if(ERROR_SUCCESS != key.Create(HKEY_LOCAL_MACHINE, 
  291. CString(_T("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play")) + handlers[i].verb + _T("OnArrival"))) return;
  292. key.DeleteValue(CString(_T("MPCPlay")) + handlers[i].verb + _T("OnArrival"));
  293. key.Close();
  294. }
  295. }
  296. bool CPPageFormats::IsAutoPlayRegistered(autoplay_t ap)
  297. {
  298. ULONG len;
  299. TCHAR buff[MAX_PATH];
  300. if(::GetModuleFileName(AfxGetInstanceHandle(), buff, MAX_PATH) == 0) return(false);
  301. CString exe = buff;
  302. int i = (int)ap;
  303. if(i < 0 || i >= countof(handlers)) return(false);
  304. CRegKey key;
  305. if(ERROR_SUCCESS != key.Open(HKEY_LOCAL_MACHINE, 
  306. CString(_T("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play")) + handlers[i].verb + _T("OnArrival"),
  307. KEY_READ)) return(false);
  308. len = countof(buff);
  309. if(ERROR_SUCCESS != key.QueryStringValue(
  310. CString(_T("MPCPlay")) + handlers[i].verb + _T("OnArrival"), 
  311. buff, &len)) return(false);
  312. key.Close();
  313. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, 
  314. CString(_T("MediaPlayerClassic.Autorun\Shell\Play")) + handlers[i].verb + _T("\Command"),
  315. KEY_READ)) return(false);
  316. len = countof(buff);
  317. if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len))
  318. return(false);
  319. if(_tcsnicmp(exe, buff, exe.GetLength()))
  320. return(false);
  321. key.Close();
  322. return(true);
  323. }
  324. void CPPageFormats::SetListItemState(int nItem)
  325. {
  326. if(nItem < 0) return;
  327. CString str = AfxGetAppSettings().Formats[(int)m_list.GetItemData(nItem)].GetExtsWithPeriod();
  328. CList<CString> exts;
  329. ExplodeMin(str, exts, ' ');
  330. int cnt = 0;
  331. POSITION pos = exts.GetHeadPosition();
  332. while(pos) if(IsRegistered(exts.GetNext(pos))) cnt++;
  333. SetChecked(nItem, cnt == 0 ? 0 : cnt == exts.GetCount() ? 1 : 2);
  334. }
  335. BEGIN_MESSAGE_MAP(CPPageFormats, CPPageBase)
  336. ON_NOTIFY(NM_CLICK, IDC_LIST1, OnNMClickList1)
  337. ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnLvnItemchangedList1)
  338. ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_LIST1, OnBeginlabeleditList)
  339. ON_NOTIFY(LVN_DOLABELEDIT, IDC_LIST1, OnDolabeleditList)
  340. ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST1, OnEndlabeleditList)
  341. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  342. ON_BN_CLICKED(IDC_BUTTON12, OnBnClickedButton12)
  343. ON_BN_CLICKED(IDC_BUTTON11, OnBnClickedButton11)
  344. ON_BN_CLICKED(IDC_BUTTON14, OnBnClickedButton14)
  345. ON_BN_CLICKED(IDC_BUTTON13, OnBnClickedButton13)
  346. ON_UPDATE_COMMAND_UI(IDC_BUTTON12, OnUpdateButtonDefault)
  347. ON_UPDATE_COMMAND_UI(IDC_BUTTON11, OnUpdateButtonSet)
  348. END_MESSAGE_MAP()
  349. // CPPageFormats message handlers
  350. BOOL CPPageFormats::OnInitDialog()
  351. {
  352. __super::OnInitDialog();
  353. m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
  354. m_list.InsertColumn(COL_CATEGORY, _T("Category"), LVCFMT_LEFT, 300);
  355. m_list.InsertColumn(COL_ENGINE, _T("Engine"), LVCFMT_RIGHT, 60);
  356. m_onoff.Create(IDB_ONOFF, 12, 3, 0xffffff);
  357. m_list.SetImageList(&m_onoff, LVSIL_SMALL);
  358. CMediaFormats& mf = AfxGetAppSettings().Formats;
  359. for(int i = 0; i < mf.GetCount(); i++)
  360. {
  361. CString label = mf[i].GetLabel();
  362. // HACK: sorry, mpc is just not an image viewer :)
  363. if(!label.CompareNoCase(_T("Image file"))) continue;
  364. int iItem = m_list.InsertItem(i, label);
  365. m_list.SetItemData(iItem, i);
  366. engine_t e = mf[i].GetEngineType();
  367. m_list.SetItemText(iItem, COL_ENGINE, 
  368. e == DirectShow ? _T("DirectShow") : 
  369. e == RealMedia ? _T("RealMedia") : 
  370. e == QuickTime ? _T("QuickTime") : 
  371. e == ShockWave ? _T("ShockWave") : _T("-"));
  372. }
  373. // m_list.SetColumnWidth(COL_CATEGORY, LVSCW_AUTOSIZE);
  374. m_list.SetColumnWidth(COL_ENGINE, LVSCW_AUTOSIZE_USEHEADER);
  375. m_list.SetSelectionMark(0);
  376. m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
  377. m_exts = mf[(int)m_list.GetItemData(0)].GetExtsWithPeriod();
  378. AppSettings& s = AfxGetAppSettings();
  379. bool fRtspFileExtFirst;
  380. engine_t e = s.Formats.GetRtspHandler(fRtspFileExtFirst);
  381. m_iRtspHandler = (e==RealMedia?0:e==QuickTime?1:2);
  382. m_fRtspFileExtFirst = fRtspFileExtFirst;
  383. UpdateData(FALSE);
  384. for(int i = 0; i < m_list.GetItemCount(); i++)
  385. {
  386. SetListItemState(i);
  387. }
  388. if(AfxGetAppSettings().fXpOrBetter)
  389. {
  390. m_apvideo.SetCheck(IsAutoPlayRegistered(AP_VIDEO));
  391. m_apmusic.SetCheck(IsAutoPlayRegistered(AP_MUSIC));
  392. m_apaudiocd.SetCheck(IsAutoPlayRegistered(AP_AUDIOCD));
  393. m_apdvd.SetCheck(IsAutoPlayRegistered(AP_DVDMOVIE));
  394. }
  395. else
  396. {
  397. m_autoplay.ShowWindow(SW_HIDE);
  398. m_apvideo.ShowWindow(SW_HIDE);
  399. m_apmusic.ShowWindow(SW_HIDE);
  400. m_apaudiocd.ShowWindow(SW_HIDE);
  401. m_apdvd.ShowWindow(SW_HIDE);
  402. }
  403. return TRUE;  // return TRUE unless you set the focus to a control
  404. // EXCEPTION: OCX Property Pages should return FALSE
  405. }
  406. BOOL CPPageFormats::OnApply()
  407. {
  408. UpdateData();
  409. {
  410. int i = m_list.GetSelectionMark();
  411. if(i >= 0) i = (int)m_list.GetItemData(i);
  412. if(i >= 0)
  413. {
  414. CMediaFormats& mf = AfxGetAppSettings().Formats;
  415. mf[i].SetExts(m_exts);
  416. m_exts = mf[i].GetExtsWithPeriod();
  417. UpdateData(FALSE);
  418. }
  419. }
  420. CMediaFormats& mf = AfxGetAppSettings().Formats;
  421. for(int i = 0; i < m_list.GetItemCount(); i++)
  422. {
  423. int iChecked = GetChecked(i);
  424. if(iChecked == 2) continue;
  425. CList<CString> exts;
  426. Explode(mf[(int)m_list.GetItemData(i)].GetExtsWithPeriod(), exts, ' ');
  427. POSITION pos = exts.GetHeadPosition();
  428. while(pos) RegisterExt(exts.GetNext(pos), !!iChecked);
  429. }
  430. {
  431. SetListItemState(m_list.GetSelectionMark());
  432. }
  433. AddAutoPlayToRegistry(AP_VIDEO, !!m_apvideo.GetCheck());
  434. AddAutoPlayToRegistry(AP_MUSIC, !!m_apmusic.GetCheck());
  435. AddAutoPlayToRegistry(AP_AUDIOCD, !!m_apaudiocd.GetCheck());
  436. AddAutoPlayToRegistry(AP_DVDMOVIE, !!m_apdvd.GetCheck());
  437. // SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
  438. AppSettings& s = AfxGetAppSettings();
  439. s.Formats.SetRtspHandler(m_iRtspHandler==0?RealMedia:m_iRtspHandler==1?QuickTime:DirectShow, !!m_fRtspFileExtFirst);
  440. return __super::OnApply();
  441. }
  442. void CPPageFormats::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
  443. {
  444. LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
  445. if(lpnmlv->iItem >= 0 && lpnmlv->iSubItem == COL_CATEGORY)
  446. {
  447. CRect r;
  448. m_list.GetItemRect(lpnmlv->iItem, r, LVIR_ICON);
  449. if(r.PtInRect(lpnmlv->ptAction))
  450. {
  451. SetChecked(lpnmlv->iItem, (GetChecked(lpnmlv->iItem)&1) == 0 ? 1 : 0);
  452. SetModified();
  453. }
  454. }
  455. *pResult = 0;
  456. }
  457. void CPPageFormats::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
  458. {
  459. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  460. if(pNMLV->iItem >= 0 && pNMLV->iSubItem == COL_CATEGORY
  461. && (pNMLV->uChanged&LVIF_STATE) && (pNMLV->uNewState&LVIS_SELECTED))
  462. {
  463. m_exts = AfxGetAppSettings().Formats[(int)m_list.GetItemData(pNMLV->iItem)].GetExtsWithPeriod();
  464. UpdateData(FALSE);
  465. }
  466. *pResult = 0;
  467. }
  468. void CPPageFormats::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  469. {
  470. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  471. LV_ITEM* pItem = &pDispInfo->item;
  472. *pResult = FALSE;
  473. if(pItem->iItem < 0) 
  474. return;
  475. if(pItem->iSubItem == COL_ENGINE)
  476. {
  477. *pResult = TRUE;
  478. }
  479. }
  480. void CPPageFormats::OnDolabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  481. {
  482. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  483. LV_ITEM* pItem = &pDispInfo->item;
  484. *pResult = FALSE;
  485. if(pItem->iItem < 0) 
  486. return;
  487. CMediaFormatCategory& mfc = AfxGetAppSettings().Formats[m_list.GetItemData(pItem->iItem)];
  488. CList<CString> sl;
  489. int nSel = -1;
  490. if(pItem->iSubItem == COL_ENGINE)
  491. {
  492. sl.AddTail(_T("DirectShow"));
  493. sl.AddTail(_T("RealMedia"));
  494. sl.AddTail(_T("QuickTime"));
  495. sl.AddTail(_T("ShockWave"));
  496. nSel = (int)mfc.GetEngineType();
  497. m_list.ShowInPlaceComboBox(pItem->iItem, pItem->iSubItem, sl, nSel);
  498. *pResult = TRUE;
  499. }
  500. }
  501. void CPPageFormats::OnEndlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  502. {
  503. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  504. LV_ITEM* pItem = &pDispInfo->item;
  505. *pResult = FALSE;
  506. if(!m_list.m_fInPlaceDirty)
  507. return;
  508. if(pItem->iItem < 0) 
  509. return;
  510. CMediaFormatCategory& mfc = AfxGetAppSettings().Formats[m_list.GetItemData(pItem->iItem)];
  511. if(pItem->iSubItem == COL_ENGINE && pItem->lParam >= 0)
  512. {
  513. mfc.SetEngineType((engine_t)pItem->lParam);
  514. m_list.SetItemText(pItem->iItem, pItem->iSubItem, pItem->pszText);
  515. *pResult = TRUE;
  516. }
  517. if(*pResult)
  518. SetModified();
  519. }
  520. void CPPageFormats::OnBnClickedButton1()
  521. {
  522. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  523. {
  524. SetChecked(i, 1);
  525. }
  526. m_apvideo.SetCheck(1);
  527. m_apmusic.SetCheck(1);
  528. m_apaudiocd.SetCheck(1);
  529. m_apdvd.SetCheck(1);
  530.     
  531. SetModified();
  532. }
  533. void CPPageFormats::OnBnClickedButton14()
  534. {
  535. CMediaFormats& mf = AfxGetAppSettings().Formats;
  536. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  537. {
  538. SetChecked(i, mf[(int)m_list.GetItemData(i)].IsAudioOnly()?0:1);
  539. }
  540. m_apvideo.SetCheck(1);
  541. m_apmusic.SetCheck(0);
  542. m_apaudiocd.SetCheck(0);
  543. m_apdvd.SetCheck(1);
  544.     
  545. SetModified();
  546. }
  547. void CPPageFormats::OnBnClickedButton13()
  548. {
  549. CMediaFormats& mf = AfxGetAppSettings().Formats;
  550. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  551. {
  552. SetChecked(i, mf[(int)m_list.GetItemData(i)].IsAudioOnly()?1:0);
  553. }
  554. m_apvideo.SetCheck(0);
  555. m_apmusic.SetCheck(1);
  556. m_apaudiocd.SetCheck(1);
  557. m_apdvd.SetCheck(0);
  558.     
  559. SetModified();
  560. }
  561. void CPPageFormats::OnBnClickedButton12()
  562. {
  563. int i = m_list.GetSelectionMark();
  564. if(i < 0) return;
  565. i = (int)m_list.GetItemData(i);
  566. CMediaFormats& mf = AfxGetAppSettings().Formats;
  567. mf[i].RestoreDefaultExts();
  568. m_exts = mf[i].GetExtsWithPeriod();
  569. SetListItemState(m_list.GetSelectionMark());
  570. UpdateData(FALSE);
  571.     
  572. SetModified();
  573. }
  574. void CPPageFormats::OnBnClickedButton11()
  575. {
  576. UpdateData();
  577. int i = m_list.GetSelectionMark();
  578. if(i < 0) return;
  579. i = (int)m_list.GetItemData(i);
  580. CMediaFormats& mf = AfxGetAppSettings().Formats;
  581. mf[i].SetExts(m_exts);
  582. m_exts = mf[i].GetExtsWithPeriod();
  583. SetListItemState(m_list.GetSelectionMark());
  584. UpdateData(FALSE);
  585.     
  586. SetModified();
  587. }
  588. void CPPageFormats::OnUpdateButtonDefault(CCmdUI* pCmdUI)
  589. {
  590. int i = m_list.GetSelectionMark();
  591. if(i < 0) {pCmdUI->Enable(FALSE); return;}
  592. i = (int)m_list.GetItemData(i);
  593. CString orgexts, newexts;
  594. GetDlgItem(IDC_EDIT1)->GetWindowText(newexts);
  595. newexts.Trim();
  596. orgexts = AfxGetAppSettings().Formats[i].GetBackupExtsWithPeriod();
  597. pCmdUI->Enable(!!newexts.CompareNoCase(orgexts));
  598. }
  599. void CPPageFormats::OnUpdateButtonSet(CCmdUI* pCmdUI)
  600. {
  601. int i = m_list.GetSelectionMark();
  602. if(i < 0) {pCmdUI->Enable(FALSE); return;}
  603. i = (int)m_list.GetItemData(i);
  604. CString orgexts, newexts;
  605. GetDlgItem(IDC_EDIT1)->GetWindowText(newexts);
  606. newexts.Trim();
  607. orgexts = AfxGetAppSettings().Formats[i].GetExtsWithPeriod();
  608. pCmdUI->Enable(!!newexts.CompareNoCase(orgexts));
  609. }