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

多媒体编程

开发平台:

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