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

多媒体编程

开发平台:

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. // PPageOverrides.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PPageOverrides.h"
  26. #include "ComPropertySheet.h"
  27. #include "RegFilterChooserDlg.h"
  28. #include "SelectMediaType.h"
  29. #include "GraphBuilder.h"
  30. #include "......includemoreuuids.h"
  31. #include <initguid.h>
  32. #include <Dmoreg.h>
  33. #include "uuids.h"
  34. // CPPageOverrides dialog
  35. IMPLEMENT_DYNAMIC(CPPageOverrides, CPPageBase)
  36. CPPageOverrides::CPPageOverrides()
  37. : CPPageBase(CPPageOverrides::IDD, CPPageOverrides::IDD)
  38. , m_iLoadType(Filter::PREFERRED)
  39. , m_pLastSelFilter(NULL)
  40. {
  41. }
  42. CPPageOverrides::~CPPageOverrides()
  43. {
  44. }
  45. void CPPageOverrides::DoDataExchange(CDataExchange* pDX)
  46. {
  47. __super::DoDataExchange(pDX);
  48. DDX_Control(pDX, IDC_LIST1, m_filters);
  49. DDX_Radio(pDX, IDC_RADIO1, m_iLoadType);
  50. DDX_Control(pDX, IDC_EDIT1, m_dwMerit);
  51. DDX_Control(pDX, IDC_TREE2, m_tree);
  52. }
  53. void CPPageOverrides::StepUp(CCheckListBox& list)
  54. {
  55. int i = list.GetCurSel();
  56. if(i < 1) return;
  57. CString str;
  58. list.GetText(i, str);
  59. DWORD_PTR dwItemData = list.GetItemData(i);
  60. int nCheck = list.GetCheck(i);
  61. list.DeleteString(i);
  62. i--;
  63. list.InsertString(i, str);
  64. list.SetItemData(i, dwItemData);
  65. list.SetCheck(i, nCheck);
  66. list.SetCurSel(i);
  67. }
  68. void CPPageOverrides::StepDown(CCheckListBox& list)
  69. {
  70. int i = list.GetCurSel();
  71. if(i < 0 || i >= list.GetCount()-1) return;
  72. CString str;
  73. list.GetText(i, str);
  74. DWORD_PTR dwItemData = list.GetItemData(i);
  75. int nCheck = list.GetCheck(i);
  76. list.DeleteString(i);
  77. i++;
  78. list.InsertString(i, str);
  79. list.SetItemData(i, dwItemData);
  80. list.SetCheck(i, nCheck);
  81. list.SetCurSel(i);
  82. }
  83. Filter* CPPageOverrides::GetCurFilter()
  84. {
  85. int i = m_filters.GetCurSel();
  86. return i >= 0 ? (Filter*)m_pFilters.GetAt((POSITION)m_filters.GetItemDataPtr(i)) : (Filter*)NULL;
  87. }
  88. void CPPageOverrides::SetupMajorTypes(CArray<GUID>& guids)
  89. {
  90. guids.RemoveAll();
  91. guids.Add(MEDIATYPE_NULL);
  92. guids.Add(MEDIATYPE_Video);
  93. guids.Add(MEDIATYPE_Audio);
  94. guids.Add(MEDIATYPE_Text);
  95. guids.Add(MEDIATYPE_Midi);
  96. guids.Add(MEDIATYPE_Stream);
  97. guids.Add(MEDIATYPE_Interleaved);
  98. guids.Add(MEDIATYPE_File);
  99. guids.Add(MEDIATYPE_ScriptCommand);
  100. guids.Add(MEDIATYPE_AUXLine21Data);
  101. guids.Add(MEDIATYPE_VBI);
  102. guids.Add(MEDIATYPE_Timecode);
  103. guids.Add(MEDIATYPE_LMRT);
  104. guids.Add(MEDIATYPE_URL_STREAM);
  105. guids.Add(MEDIATYPE_MPEG1SystemStream);
  106. guids.Add(MEDIATYPE_AnalogVideo);
  107. guids.Add(MEDIATYPE_AnalogAudio);
  108. guids.Add(MEDIATYPE_MPEG2_PACK);
  109. guids.Add(MEDIATYPE_MPEG2_PES);
  110. guids.Add(MEDIATYPE_MPEG2_SECTIONS);
  111. guids.Add(MEDIATYPE_DVD_ENCRYPTED_PACK);
  112. guids.Add(MEDIATYPE_DVD_NAVIGATION);
  113. }
  114. void CPPageOverrides::SetupSubTypes(CArray<GUID>& guids)
  115. {
  116. guids.RemoveAll();
  117. guids.Add(MEDIASUBTYPE_None);
  118. guids.Add(MEDIASUBTYPE_CLPL);
  119. guids.Add(MEDIASUBTYPE_YUYV);
  120. guids.Add(MEDIASUBTYPE_IYUV);
  121. guids.Add(MEDIASUBTYPE_YVU9);
  122. guids.Add(MEDIASUBTYPE_Y411);
  123. guids.Add(MEDIASUBTYPE_Y41P);
  124. guids.Add(MEDIASUBTYPE_YUY2);
  125. guids.Add(MEDIASUBTYPE_YVYU);
  126. guids.Add(MEDIASUBTYPE_UYVY);
  127. guids.Add(MEDIASUBTYPE_Y211);
  128. guids.Add(MEDIASUBTYPE_CLJR);
  129. guids.Add(MEDIASUBTYPE_IF09);
  130. guids.Add(MEDIASUBTYPE_CPLA);
  131. guids.Add(MEDIASUBTYPE_MJPG);
  132. guids.Add(MEDIASUBTYPE_TVMJ);
  133. guids.Add(MEDIASUBTYPE_WAKE);
  134. guids.Add(MEDIASUBTYPE_CFCC);
  135. guids.Add(MEDIASUBTYPE_IJPG);
  136. guids.Add(MEDIASUBTYPE_Plum);
  137. guids.Add(MEDIASUBTYPE_DVCS);
  138. guids.Add(MEDIASUBTYPE_DVSD);
  139. guids.Add(MEDIASUBTYPE_MDVF);
  140. guids.Add(MEDIASUBTYPE_RGB1);
  141. guids.Add(MEDIASUBTYPE_RGB4);
  142. guids.Add(MEDIASUBTYPE_RGB8);
  143. guids.Add(MEDIASUBTYPE_RGB565);
  144. guids.Add(MEDIASUBTYPE_RGB555);
  145. guids.Add(MEDIASUBTYPE_RGB24);
  146. guids.Add(MEDIASUBTYPE_RGB32);
  147. guids.Add(MEDIASUBTYPE_ARGB1555);
  148. guids.Add(MEDIASUBTYPE_ARGB4444);
  149. guids.Add(MEDIASUBTYPE_ARGB32);
  150. guids.Add(MEDIASUBTYPE_A2R10G10B10);
  151. guids.Add(MEDIASUBTYPE_A2B10G10R10);
  152. guids.Add(MEDIASUBTYPE_AYUV);
  153. guids.Add(MEDIASUBTYPE_AI44);
  154. guids.Add(MEDIASUBTYPE_IA44);
  155. guids.Add(MEDIASUBTYPE_RGB32_D3D_DX7_RT);
  156. guids.Add(MEDIASUBTYPE_RGB16_D3D_DX7_RT);
  157. guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX7_RT);
  158. guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX7_RT);
  159. guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX7_RT);
  160. guids.Add(MEDIASUBTYPE_RGB32_D3D_DX9_RT);
  161. guids.Add(MEDIASUBTYPE_RGB16_D3D_DX9_RT);
  162. guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX9_RT);
  163. guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX9_RT);
  164. guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX9_RT);
  165. guids.Add(MEDIASUBTYPE_YV12);
  166. guids.Add(MEDIASUBTYPE_NV12);
  167. guids.Add(MEDIASUBTYPE_IMC1);
  168. guids.Add(MEDIASUBTYPE_IMC2);
  169. guids.Add(MEDIASUBTYPE_IMC3);
  170. guids.Add(MEDIASUBTYPE_IMC4);
  171. guids.Add(MEDIASUBTYPE_S340);
  172. guids.Add(MEDIASUBTYPE_S342);
  173. guids.Add(MEDIASUBTYPE_Overlay);
  174. guids.Add(MEDIASUBTYPE_MPEG1Packet);
  175. guids.Add(MEDIASUBTYPE_MPEG1Payload);
  176. guids.Add(MEDIASUBTYPE_MPEG1AudioPayload);
  177. guids.Add(MEDIASUBTYPE_MPEG1System);
  178. guids.Add(MEDIASUBTYPE_MPEG1VideoCD);
  179. guids.Add(MEDIASUBTYPE_MPEG1Video);
  180. guids.Add(MEDIASUBTYPE_MPEG1Audio);
  181. guids.Add(MEDIASUBTYPE_Avi);
  182. guids.Add(MEDIASUBTYPE_Asf);
  183. guids.Add(MEDIASUBTYPE_QTMovie);
  184. guids.Add(MEDIASUBTYPE_QTRpza);
  185. guids.Add(MEDIASUBTYPE_QTSmc);
  186. guids.Add(MEDIASUBTYPE_QTRle);
  187. guids.Add(MEDIASUBTYPE_QTJpeg);
  188. guids.Add(MEDIASUBTYPE_PCMAudio_Obsolete);
  189. guids.Add(MEDIASUBTYPE_PCM);
  190. guids.Add(MEDIASUBTYPE_WAVE);
  191. guids.Add(MEDIASUBTYPE_AU);
  192. guids.Add(MEDIASUBTYPE_AIFF);
  193. guids.Add(MEDIASUBTYPE_dvsd);
  194. guids.Add(MEDIASUBTYPE_dvhd);
  195. guids.Add(MEDIASUBTYPE_dvsl);
  196. guids.Add(MEDIASUBTYPE_dv25);
  197. guids.Add(MEDIASUBTYPE_dv50);
  198. guids.Add(MEDIASUBTYPE_dvh1);
  199. guids.Add(MEDIASUBTYPE_Line21_BytePair);
  200. guids.Add(MEDIASUBTYPE_Line21_GOPPacket);
  201. guids.Add(MEDIASUBTYPE_Line21_VBIRawData);
  202. guids.Add(MEDIASUBTYPE_TELETEXT);
  203. guids.Add(MEDIASUBTYPE_DRM_Audio);
  204. guids.Add(MEDIASUBTYPE_IEEE_FLOAT);
  205. guids.Add(MEDIASUBTYPE_DOLBY_AC3_SPDIF);
  206. guids.Add(MEDIASUBTYPE_RAW_SPORT);
  207. guids.Add(MEDIASUBTYPE_SPDIF_TAG_241h);
  208. guids.Add(MEDIASUBTYPE_DssVideo);
  209. guids.Add(MEDIASUBTYPE_DssAudio);
  210. guids.Add(MEDIASUBTYPE_VPVideo);
  211. guids.Add(MEDIASUBTYPE_VPVBI);
  212. guids.Add(MEDIASUBTYPE_ATSC_SI);
  213. guids.Add(MEDIASUBTYPE_DVB_SI);
  214. guids.Add(MEDIASUBTYPE_MPEG2DATA);
  215. guids.Add(MEDIASUBTYPE_MPEG2_VIDEO);
  216. guids.Add(MEDIASUBTYPE_MPEG2_PROGRAM);
  217. guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT);
  218. guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE);
  219. guids.Add(MEDIASUBTYPE_MPEG2_AUDIO);
  220. guids.Add(MEDIASUBTYPE_DOLBY_AC3);
  221. guids.Add(MEDIASUBTYPE_DVD_SUBPICTURE);
  222. guids.Add(MEDIASUBTYPE_DVD_LPCM_AUDIO);
  223. guids.Add(MEDIASUBTYPE_DTS);
  224. guids.Add(MEDIASUBTYPE_SDDS);
  225. guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PCI);
  226. guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_DSI);
  227. guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER);
  228. guids.Add(MEDIASUBTYPE_I420);
  229. guids.Add(MEDIASUBTYPE_WAVE_DOLBY_AC3);
  230. guids.Add(MEDIASUBTYPE_WAVE_DTS);
  231. }
  232. BEGIN_MESSAGE_MAP(CPPageOverrides, CPPageBase)
  233. ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateFilter)
  234. ON_UPDATE_COMMAND_UI(IDC_RADIO1, OnUpdateFilter)
  235. ON_UPDATE_COMMAND_UI(IDC_RADIO2, OnUpdateFilter)
  236. ON_UPDATE_COMMAND_UI(IDC_RADIO3, OnUpdateFilter)
  237. ON_UPDATE_COMMAND_UI(IDC_BUTTON11, OnUpdateFilterUp)
  238. ON_UPDATE_COMMAND_UI(IDC_BUTTON6, OnUpdateFilterDown)
  239. ON_UPDATE_COMMAND_UI(IDC_EDIT1, OnUpdateFilterMerit)
  240. ON_UPDATE_COMMAND_UI(IDC_BUTTON13, OnUpdateFilter)
  241. ON_UPDATE_COMMAND_UI(IDC_BUTTON14, OnUpdateSubType)
  242. ON_UPDATE_COMMAND_UI(IDC_BUTTON9, OnUpdateDeleteType)
  243. ON_UPDATE_COMMAND_UI(IDC_BUTTON10, OnUpdateFilter)
  244. ON_BN_CLICKED(IDC_BUTTON1, OnAddRegistered)
  245. ON_BN_CLICKED(IDC_BUTTON2, OnRemoveFilter)
  246. ON_BN_CLICKED(IDC_BUTTON11, OnMoveFilterUp)
  247. ON_BN_CLICKED(IDC_BUTTON6, OnMoveFilterDown)
  248. ON_LBN_DBLCLK(IDC_LIST1, OnLbnDblclkFilter)
  249. ON_BN_CLICKED(IDC_BUTTON13, OnAddMajorType)
  250. ON_BN_CLICKED(IDC_BUTTON14, OnAddSubType)
  251. ON_BN_CLICKED(IDC_BUTTON9, OnDeleteType)
  252. ON_BN_CLICKED(IDC_BUTTON10, OnResetTypes)
  253. ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
  254. ON_BN_CLICKED(IDC_RADIO1, OnBnClickedRadio)
  255. ON_BN_CLICKED(IDC_RADIO2, OnBnClickedRadio)
  256. ON_BN_CLICKED(IDC_RADIO3, OnBnClickedRadio)
  257. ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
  258. ON_NOTIFY(NM_DBLCLK, IDC_TREE2, OnNMDblclkTree2)
  259. ON_WM_DROPFILES()
  260. END_MESSAGE_MAP()
  261. // CPPageOverrides message handlers
  262. BOOL CPPageOverrides::OnInitDialog()
  263. {
  264. __super::OnInitDialog();
  265. DragAcceptFiles(TRUE);
  266. AppSettings& s = AfxGetAppSettings();
  267. m_pFilters.RemoveAll();
  268. POSITION pos = s.filters.GetHeadPosition();
  269. while(pos)
  270. {
  271. CAutoPtr<Filter> f(new Filter(s.filters.GetNext(pos)));
  272. CString name(_T("<unknown>"));
  273. if(f->type == Filter::REGISTERED)
  274. {
  275. name = CGraphRegFilter(f->dispname).GetName();
  276. if(name.IsEmpty()) name = f->name + _T(" <not registered>");
  277. }
  278. else if(f->type == Filter::EXTERNAL)
  279. {
  280. name = f->name;
  281. if(f->fTemporary) name += _T(" <temporary>");
  282. if(!CPath(MakeFullPath(f->path)).FileExists()) name += _T(" <not found!>");
  283. }
  284. int i = m_filters.AddString(name);
  285. m_filters.SetCheck(i, f->fDisabled ? 0 : 1);
  286. m_filters.SetItemDataPtr(i, m_pFilters.AddTail(f));
  287. }
  288. UpdateData(FALSE);
  289. return TRUE;  // return TRUE unless you set the focus to a control
  290. // EXCEPTION: OCX Property Pages should return FALSE
  291. }
  292. BOOL CPPageOverrides::OnApply()
  293. {
  294. UpdateData();
  295. AppSettings& s = AfxGetAppSettings();
  296. s.filters.RemoveAll();
  297. for(int i = 0; i < m_filters.GetCount(); i++)
  298. {
  299. if(POSITION pos = (POSITION)m_filters.GetItemData(i))
  300. {
  301. CAutoPtr<Filter> f(new Filter(m_pFilters.GetAt(pos)));
  302. f->fDisabled = !m_filters.GetCheck(i);
  303. s.filters.AddTail(f);
  304. }
  305. }
  306. return __super::OnApply();
  307. }
  308. void CPPageOverrides::OnUpdateFilter(CCmdUI* pCmdUI)
  309. {
  310. if(Filter* f = GetCurFilter())
  311. {
  312. pCmdUI->Enable(!(pCmdUI->m_nID == IDC_RADIO2 && f->type == Filter::EXTERNAL));
  313. }
  314. else
  315. {
  316. pCmdUI->Enable(FALSE);
  317. }
  318. }
  319. void CPPageOverrides::OnUpdateFilterUp(CCmdUI* pCmdUI)
  320. {
  321. pCmdUI->Enable(m_filters.GetCurSel() > 0);
  322. }
  323. void CPPageOverrides::OnUpdateFilterDown(CCmdUI* pCmdUI)
  324. {
  325. pCmdUI->Enable(m_filters.GetCurSel() >= 0 && m_filters.GetCurSel() < m_filters.GetCount()-1);
  326. }
  327. void CPPageOverrides::OnUpdateFilterMerit(CCmdUI* pCmdUI)
  328. {
  329. UpdateData();
  330. pCmdUI->Enable(m_iLoadType == Filter::MERIT);
  331. }
  332. void CPPageOverrides::OnUpdateSubType(CCmdUI* pCmdUI)
  333. {
  334. HTREEITEM node = m_tree.GetSelectedItem();
  335. pCmdUI->Enable(node != NULL && m_tree.GetItemData(node) == NULL);
  336. }
  337. void CPPageOverrides::OnUpdateDeleteType(CCmdUI* pCmdUI)
  338. {
  339. pCmdUI->Enable(!!m_tree.GetSelectedItem());
  340. }
  341. void CPPageOverrides::OnAddRegistered()
  342. {
  343. CRegFilterChooserDlg dlg(this);
  344. if(dlg.DoModal() == IDOK)
  345. {
  346. while(!dlg.m_filters.IsEmpty())
  347. {
  348. if(Filter* f = dlg.m_filters.RemoveHead())
  349. {
  350. CAutoPtr<Filter> p(f);
  351. CString name = f->name;
  352. if(f->type == Filter::EXTERNAL)
  353. {
  354. if(!CPath(MakeFullPath(f->path)).FileExists()) name += _T(" <not found!>");
  355. }
  356. int i = m_filters.AddString(name);
  357. m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
  358. m_filters.SetCheck(i, 1);
  359. if(dlg.m_filters.IsEmpty())
  360. {
  361. m_filters.SetCurSel(i);
  362. OnLbnSelchangeList1();
  363. }
  364. }
  365. }
  366. }
  367. }
  368. void CPPageOverrides::OnRemoveFilter()
  369. {
  370. int i = m_filters.GetCurSel();
  371. m_pFilters.RemoveAt((POSITION)m_filters.GetItemDataPtr(i));
  372. m_filters.DeleteString(i);
  373. if(i >= m_filters.GetCount()) i--;
  374. m_filters.SetCurSel(i);
  375. OnLbnSelchangeList1();
  376. }
  377. void CPPageOverrides::OnMoveFilterUp()
  378. {
  379. StepUp(m_filters);
  380. }
  381. void CPPageOverrides::OnMoveFilterDown()
  382. {
  383. StepDown(m_filters);
  384. }
  385. void CPPageOverrides::OnLbnDblclkFilter()
  386. {
  387. if(Filter* f = GetCurFilter())
  388. {
  389. CComPtr<IBaseFilter> pBF;
  390. CString name;
  391. if(f->type == Filter::REGISTERED)
  392. {
  393. CStringW namew;
  394. if(CreateFilter(f->dispname, &pBF, namew))
  395. name = namew;
  396. }
  397. else if(f->type == Filter::EXTERNAL)
  398. {
  399. if(SUCCEEDED(LoadExternalFilter(f->path, f->clsid, &pBF)))
  400. name = f->name;
  401. }
  402. if(CComQIPtr<ISpecifyPropertyPages> pSPP = pBF)
  403. {
  404. CComPropertySheet ps(name, this);
  405. if(ps.AddPages(pSPP) > 0)
  406. {
  407. CComPtr<IFilterGraph> pFG;
  408. if(SUCCEEDED(pFG.CoCreateInstance(CLSID_FilterGraph)))
  409. pFG->AddFilter(pBF, L"");
  410. ps.DoModal();
  411. }
  412. }
  413. }
  414. }
  415. void CPPageOverrides::OnAddMajorType()
  416. {
  417. Filter* f = GetCurFilter();
  418. if(!f) return;
  419. CArray<GUID> guids;
  420. SetupMajorTypes(guids);
  421. CSelectMediaType dlg(guids, MEDIATYPE_NULL, this);
  422. if(dlg.DoModal() == IDOK)
  423. {
  424. POSITION pos = f->guids.GetHeadPosition();
  425. while(pos)
  426. {
  427. if(f->guids.GetNext(pos) == dlg.m_guid) {AfxMessageBox(_T("Already on the list!")); return;}
  428. f->guids.GetNext(pos);
  429. }
  430. f->guids.AddTail(dlg.m_guid);
  431. pos = f->guids.GetTailPosition();
  432. f->guids.AddTail(GUID_NULL);
  433. CString major = GetMediaTypeName(dlg.m_guid);
  434. CString sub = GetMediaTypeName(GUID_NULL);
  435. HTREEITEM node = m_tree.InsertItem(major);
  436. m_tree.SetItemData(node, NULL);
  437. node = m_tree.InsertItem(sub, node);
  438. m_tree.SetItemData(node, (DWORD_PTR)pos);
  439. }
  440. }
  441. void CPPageOverrides::OnAddSubType()
  442. {
  443. Filter* f = GetCurFilter();
  444. if(!f) return;
  445. HTREEITEM node = m_tree.GetSelectedItem();
  446. if(!node) return;
  447. HTREEITEM child = m_tree.GetChildItem(node);
  448. if(!child) return;
  449. POSITION pos = (POSITION)m_tree.GetItemData(child);
  450. GUID major = f->guids.GetAt(pos);
  451. CArray<GUID> guids;
  452. SetupSubTypes(guids);
  453. CSelectMediaType dlg(guids, MEDIASUBTYPE_NULL, this);
  454. if(dlg.DoModal() == IDOK)
  455. {
  456. for(child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child))
  457. {
  458. pos = (POSITION)m_tree.GetItemData(child);
  459. f->guids.GetNext(pos);
  460. if(f->guids.GetAt(pos) == dlg.m_guid) {AfxMessageBox(_T("Already on the list!")); return;}
  461. }
  462. f->guids.AddTail(major);
  463. pos = f->guids.GetTailPosition();
  464. f->guids.AddTail(dlg.m_guid);
  465. CString sub = GetMediaTypeName(dlg.m_guid);
  466. node = m_tree.InsertItem(sub, node);
  467. m_tree.SetItemData(node, (DWORD_PTR)pos);
  468. }
  469. }
  470. void CPPageOverrides::OnDeleteType()
  471. {
  472. if(Filter* f = GetCurFilter())
  473. {
  474. HTREEITEM node = m_tree.GetSelectedItem();
  475. if(!node) return;
  476. POSITION pos = (POSITION)m_tree.GetItemData(node);
  477. if(pos == NULL)
  478. {
  479. for(HTREEITEM child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child))
  480. {
  481. pos = (POSITION)m_tree.GetItemData(child);
  482. POSITION pos1 = pos;
  483. f->guids.GetNext(pos);
  484. POSITION pos2 = pos;
  485. f->guids.GetNext(pos);
  486. f->guids.RemoveAt(pos1);
  487. f->guids.RemoveAt(pos2);
  488. }
  489. m_tree.DeleteItem(node);
  490. }
  491. else
  492. {
  493. HTREEITEM parent = m_tree.GetParentItem(node);
  494. POSITION pos1 = pos;
  495. f->guids.GetNext(pos);
  496. POSITION pos2 = pos;
  497. f->guids.GetNext(pos);
  498. m_tree.DeleteItem(node);
  499. if(!m_tree.ItemHasChildren(parent))
  500. {
  501. f->guids.SetAt(pos2, GUID_NULL);
  502. node = m_tree.InsertItem(GetMediaTypeName(GUID_NULL), parent);
  503. m_tree.SetItemData(node, (DWORD_PTR)pos1);
  504. }
  505. else
  506. {
  507. f->guids.RemoveAt(pos1);
  508. f->guids.RemoveAt(pos2);
  509. }
  510. }
  511. }
  512. }
  513. void CPPageOverrides::OnResetTypes()
  514. {
  515. if(Filter* f = GetCurFilter())
  516. {
  517. f->guids.RemoveAll();
  518. f->guids.AddTail(&f->backup);
  519. m_pLastSelFilter = NULL;
  520. OnLbnSelchangeList1();
  521. }
  522. }
  523. void CPPageOverrides::OnLbnSelchangeList1()
  524. {
  525. if(Filter* f = GetCurFilter())
  526. {
  527. if(m_pLastSelFilter == f) return;
  528. m_pLastSelFilter = f;
  529. m_iLoadType = f->iLoadType;
  530. UpdateData(FALSE);
  531. m_dwMerit = f->dwMerit;
  532. HTREEITEM dummy_item = m_tree.InsertItem(_T(""), 0,0, NULL, TVI_FIRST);
  533. if(dummy_item)
  534. for(HTREEITEM item = m_tree.GetNextVisibleItem(dummy_item); item; item = m_tree.GetNextVisibleItem(dummy_item)) 
  535. m_tree.DeleteItem(item);
  536. CMapStringToPtr map;
  537. POSITION pos = f->guids.GetHeadPosition();
  538. while(pos)
  539. {
  540. POSITION tmp = pos;
  541. CString major = GetMediaTypeName(f->guids.GetNext(pos));
  542. CString sub = GetMediaTypeName(f->guids.GetNext(pos));
  543. HTREEITEM node = NULL;
  544. void* val = NULL;
  545. if(map.Lookup(major, val)) node = (HTREEITEM)val;
  546. else map[major] = node = m_tree.InsertItem(major);
  547. m_tree.SetItemData(node, NULL);
  548. node = m_tree.InsertItem(sub, node);
  549. m_tree.SetItemData(node, (DWORD_PTR)tmp);
  550. }
  551. m_tree.DeleteItem(dummy_item);
  552. for(HTREEITEM item = m_tree.GetFirstVisibleItem(); item; item = m_tree.GetNextVisibleItem(item)) 
  553. m_tree.Expand(item, TVE_EXPAND);
  554. m_tree.EnsureVisible(m_tree.GetRootItem());
  555. }
  556. else
  557. {
  558. m_pLastSelFilter = NULL;
  559. m_iLoadType = Filter::PREFERRED;
  560. UpdateData(FALSE);
  561. m_dwMerit = 0;
  562. m_tree.DeleteAllItems();
  563. }
  564. }
  565. void CPPageOverrides::OnBnClickedRadio()
  566. {
  567. UpdateData();
  568. if(Filter* f = GetCurFilter())
  569. f->iLoadType = m_iLoadType;
  570. }
  571. void CPPageOverrides::OnEnChangeEdit1()
  572. {
  573. UpdateData();
  574. if(Filter* f = GetCurFilter())
  575. {
  576. DWORD dw;
  577. if(m_dwMerit.GetDWORD(dw))
  578. f->dwMerit = dw;
  579. }
  580. }
  581. void CPPageOverrides::OnNMDblclkTree2(NMHDR *pNMHDR, LRESULT *pResult)
  582. {
  583. *pResult = 0;
  584. if(Filter* f = GetCurFilter())
  585. {
  586. HTREEITEM node = m_tree.GetSelectedItem();
  587. if(!node) return;
  588. POSITION pos = (POSITION)m_tree.GetItemData(node);
  589. if(!pos) return;
  590. f->guids.GetNext(pos);
  591. if(!pos) return;
  592. CArray<GUID> guids;
  593. SetupSubTypes(guids);
  594. CSelectMediaType dlg(guids, f->guids.GetAt(pos), this);
  595. if(dlg.DoModal() == IDOK)
  596. {
  597. f->guids.SetAt(pos, dlg.m_guid);
  598. m_tree.SetItemText(node, GetMediaTypeName(dlg.m_guid));
  599. }
  600. }
  601. }
  602. void CPPageOverrides::OnDropFiles(HDROP hDropInfo)
  603. {
  604. SetActiveWindow();
  605. UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
  606. for(UINT iFile = 0; iFile < nFiles; iFile++)
  607. {
  608. TCHAR szFileName[_MAX_PATH];
  609. ::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
  610. CFilterMapper2 fm2(false);
  611. fm2.Register(szFileName);
  612. while(!fm2.m_filters.IsEmpty())
  613. {
  614. if(Filter* f = fm2.m_filters.RemoveHead())
  615. {
  616. CAutoPtr<Filter> p(f);
  617. int i = m_filters.AddString(f->name);
  618. m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
  619. m_filters.SetCheck(i, 1);
  620. if(fm2.m_filters.IsEmpty())
  621. {
  622. m_filters.SetCurSel(i);
  623. OnLbnSelchangeList1();
  624. }
  625. }
  626. }
  627. }
  628. ::DragFinish(hDropInfo);
  629. }