PPageFormats.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:20k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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_RADIO1, 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 {LPCSTR verb, cmd; UINT action;} handlers[] =
  252. {
  253. {"VideoFiles", " %1", IDS_AUTOPLAY_PLAYVIDEO},
  254. {"MusicFiles", " %1", IDS_AUTOPLAY_PLAYMUSIC},
  255. {"CDAudio", " %1 /cd", IDS_AUTOPLAY_PLAYAUDIOCD},
  256. {"DVDMovie", " %1 /dvd", IDS_AUTOPLAY_PLAYDVDMOVIE},
  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(CStringA("MediaPlayerClassic.Autorun\Shell\Play") + handlers[i].verb + "\Command"))) return;
  273. key.SetStringValue(NULL, exe + handlers[i].cmd);
  274. key.Close();
  275. if(ERROR_SUCCESS != key.Create(HKEY_LOCAL_MACHINE,
  276. CString(CStringA("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\MPCPlay") + handlers[i].verb + "OnArrival"))) return;
  277. key.SetStringValue(_T("Action"), ResStr(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(CStringA("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(CStringA("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play") + handlers[i].verb + "OnArrival"))) return;
  285. key.SetStringValue(CString(CStringA("MPCPlay") + handlers[i].verb + "OnArrival"), _T(""));
  286. key.Close();
  287. }
  288. else
  289. {
  290. if(ERROR_SUCCESS != key.Create(HKEY_LOCAL_MACHINE, 
  291. CString(CStringA("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play") + handlers[i].verb + "OnArrival"))) return;
  292. key.DeleteValue(CString(CStringA("MPCPlay") + handlers[i].verb + "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(CStringA("SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\EventHandlers\Play") + handlers[i].verb + "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(CStringA("MediaPlayerClassic.Autorun\Shell\Play") + handlers[i].verb + "\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. CAtlList<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_BUTTON2, OnBnClickedButton12)
  343. ON_BN_CLICKED(IDC_BUTTON_EXT_SET, OnBnClickedButton11)
  344. ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton14)
  345. ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton13)
  346. ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateButtonDefault)
  347. ON_UPDATE_COMMAND_UI(IDC_BUTTON_EXT_SET, 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. CreateToolTip();
  404. return TRUE;  // return TRUE unless you set the focus to a control
  405. // EXCEPTION: OCX Property Pages should return FALSE
  406. }
  407. BOOL CPPageFormats::OnApply()
  408. {
  409. UpdateData();
  410. {
  411. int i = m_list.GetSelectionMark();
  412. if(i >= 0) i = (int)m_list.GetItemData(i);
  413. if(i >= 0)
  414. {
  415. CMediaFormats& mf = AfxGetAppSettings().Formats;
  416. mf[i].SetExts(m_exts);
  417. m_exts = mf[i].GetExtsWithPeriod();
  418. UpdateData(FALSE);
  419. }
  420. }
  421. CMediaFormats& mf = AfxGetAppSettings().Formats;
  422. for(int i = 0; i < m_list.GetItemCount(); i++)
  423. {
  424. int iChecked = GetChecked(i);
  425. if(iChecked == 2) continue;
  426. CAtlList<CString> exts;
  427. Explode(mf[(int)m_list.GetItemData(i)].GetExtsWithPeriod(), exts, ' ');
  428. POSITION pos = exts.GetHeadPosition();
  429. while(pos) RegisterExt(exts.GetNext(pos), !!iChecked);
  430. }
  431. {
  432. SetListItemState(m_list.GetSelectionMark());
  433. }
  434. AddAutoPlayToRegistry(AP_VIDEO, !!m_apvideo.GetCheck());
  435. AddAutoPlayToRegistry(AP_MUSIC, !!m_apmusic.GetCheck());
  436. AddAutoPlayToRegistry(AP_AUDIOCD, !!m_apaudiocd.GetCheck());
  437. AddAutoPlayToRegistry(AP_DVDMOVIE, !!m_apdvd.GetCheck());
  438. // SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
  439. AppSettings& s = AfxGetAppSettings();
  440. s.Formats.SetRtspHandler(m_iRtspHandler==0?RealMedia:m_iRtspHandler==1?QuickTime:DirectShow, !!m_fRtspFileExtFirst);
  441. return __super::OnApply();
  442. }
  443. void CPPageFormats::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
  444. {
  445. LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
  446. if(lpnmlv->iItem >= 0 && lpnmlv->iSubItem == COL_CATEGORY)
  447. {
  448. CRect r;
  449. m_list.GetItemRect(lpnmlv->iItem, r, LVIR_ICON);
  450. if(r.PtInRect(lpnmlv->ptAction))
  451. {
  452. SetChecked(lpnmlv->iItem, (GetChecked(lpnmlv->iItem)&1) == 0 ? 1 : 0);
  453. SetModified();
  454. }
  455. }
  456. *pResult = 0;
  457. }
  458. void CPPageFormats::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
  459. {
  460. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  461. if(pNMLV->iItem >= 0 && pNMLV->iSubItem == COL_CATEGORY
  462. && (pNMLV->uChanged&LVIF_STATE) && (pNMLV->uNewState&LVIS_SELECTED))
  463. {
  464. m_exts = AfxGetAppSettings().Formats[(int)m_list.GetItemData(pNMLV->iItem)].GetExtsWithPeriod();
  465. UpdateData(FALSE);
  466. }
  467. *pResult = 0;
  468. }
  469. void CPPageFormats::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  470. {
  471. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  472. LV_ITEM* pItem = &pDispInfo->item;
  473. *pResult = FALSE;
  474. if(pItem->iItem < 0) 
  475. return;
  476. if(pItem->iSubItem == COL_ENGINE)
  477. {
  478. *pResult = TRUE;
  479. }
  480. }
  481. void CPPageFormats::OnDolabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  482. {
  483. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  484. LV_ITEM* pItem = &pDispInfo->item;
  485. *pResult = FALSE;
  486. if(pItem->iItem < 0) 
  487. return;
  488. CMediaFormatCategory& mfc = AfxGetAppSettings().Formats[m_list.GetItemData(pItem->iItem)];
  489. CAtlList<CString> sl;
  490. int nSel = -1;
  491. if(pItem->iSubItem == COL_ENGINE)
  492. {
  493. sl.AddTail(_T("DirectShow"));
  494. sl.AddTail(_T("RealMedia"));
  495. sl.AddTail(_T("QuickTime"));
  496. sl.AddTail(_T("ShockWave"));
  497. nSel = (int)mfc.GetEngineType();
  498. m_list.ShowInPlaceComboBox(pItem->iItem, pItem->iSubItem, sl, nSel);
  499. *pResult = TRUE;
  500. }
  501. }
  502. void CPPageFormats::OnEndlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) 
  503. {
  504. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  505. LV_ITEM* pItem = &pDispInfo->item;
  506. *pResult = FALSE;
  507. if(!m_list.m_fInPlaceDirty)
  508. return;
  509. if(pItem->iItem < 0) 
  510. return;
  511. CMediaFormatCategory& mfc = AfxGetAppSettings().Formats[m_list.GetItemData(pItem->iItem)];
  512. if(pItem->iSubItem == COL_ENGINE && pItem->lParam >= 0)
  513. {
  514. mfc.SetEngineType((engine_t)pItem->lParam);
  515. m_list.SetItemText(pItem->iItem, pItem->iSubItem, pItem->pszText);
  516. *pResult = TRUE;
  517. }
  518. if(*pResult)
  519. SetModified();
  520. }
  521. void CPPageFormats::OnBnClickedButton1()
  522. {
  523. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  524. {
  525. SetChecked(i, 1);
  526. }
  527. m_apvideo.SetCheck(1);
  528. m_apmusic.SetCheck(1);
  529. m_apaudiocd.SetCheck(1);
  530. m_apdvd.SetCheck(1);
  531.     
  532. SetModified();
  533. }
  534. void CPPageFormats::OnBnClickedButton14()
  535. {
  536. CMediaFormats& mf = AfxGetAppSettings().Formats;
  537. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  538. {
  539. SetChecked(i, mf[(int)m_list.GetItemData(i)].IsAudioOnly()?0:1);
  540. }
  541. m_apvideo.SetCheck(1);
  542. m_apmusic.SetCheck(0);
  543. m_apaudiocd.SetCheck(0);
  544. m_apdvd.SetCheck(1);
  545.     
  546. SetModified();
  547. }
  548. void CPPageFormats::OnBnClickedButton13()
  549. {
  550. CMediaFormats& mf = AfxGetAppSettings().Formats;
  551. for(int i = 0, j = m_list.GetItemCount(); i < j; i++)
  552. {
  553. SetChecked(i, mf[(int)m_list.GetItemData(i)].IsAudioOnly()?1:0);
  554. }
  555. m_apvideo.SetCheck(0);
  556. m_apmusic.SetCheck(1);
  557. m_apaudiocd.SetCheck(1);
  558. m_apdvd.SetCheck(0);
  559.     
  560. SetModified();
  561. }
  562. void CPPageFormats::OnBnClickedButton12()
  563. {
  564. int i = m_list.GetSelectionMark();
  565. if(i < 0) return;
  566. i = (int)m_list.GetItemData(i);
  567. CMediaFormats& mf = AfxGetAppSettings().Formats;
  568. mf[i].RestoreDefaultExts();
  569. m_exts = mf[i].GetExtsWithPeriod();
  570. SetListItemState(m_list.GetSelectionMark());
  571. UpdateData(FALSE);
  572.     
  573. SetModified();
  574. }
  575. void CPPageFormats::OnBnClickedButton11()
  576. {
  577. UpdateData();
  578. int i = m_list.GetSelectionMark();
  579. if(i < 0) return;
  580. i = (int)m_list.GetItemData(i);
  581. CMediaFormats& mf = AfxGetAppSettings().Formats;
  582. mf[i].SetExts(m_exts);
  583. m_exts = mf[i].GetExtsWithPeriod();
  584. SetListItemState(m_list.GetSelectionMark());
  585. UpdateData(FALSE);
  586.     
  587. SetModified();
  588. }
  589. void CPPageFormats::OnUpdateButtonDefault(CCmdUI* pCmdUI)
  590. {
  591. int i = m_list.GetSelectionMark();
  592. if(i < 0) {pCmdUI->Enable(FALSE); return;}
  593. i = (int)m_list.GetItemData(i);
  594. CString orgexts, newexts;
  595. GetDlgItem(IDC_EDIT1)->GetWindowText(newexts);
  596. newexts.Trim();
  597. orgexts = AfxGetAppSettings().Formats[i].GetBackupExtsWithPeriod();
  598. pCmdUI->Enable(!!newexts.CompareNoCase(orgexts));
  599. }
  600. void CPPageFormats::OnUpdateButtonSet(CCmdUI* pCmdUI)
  601. {
  602. int i = m_list.GetSelectionMark();
  603. if(i < 0) {pCmdUI->Enable(FALSE); return;}
  604. i = (int)m_list.GetItemData(i);
  605. CString orgexts, newexts;
  606. GetDlgItem(IDC_EDIT1)->GetWindowText(newexts);
  607. newexts.Trim();
  608. orgexts = AfxGetAppSettings().Formats[i].GetExtsWithPeriod();
  609. pCmdUI->Enable(!!newexts.CompareNoCase(orgexts));
  610. }