00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "PPageOverrides.h"
00028 #include "ComPropertySheet.h"
00029 #include "RegFilterChooserDlg.h"
00030 #include "SelectMediaType.h"
00031 #include "GraphBuilder.h"
00032 #include "..\..\..\include\moreuuids.h"
00033
00034 #include <initguid.h>
00035 #include <Dmoreg.h>
00036
00037
00038
00039 IMPLEMENT_DYNAMIC(CPPageOverrides, CPPageBase)
00040 CPPageOverrides::CPPageOverrides()
00041 : CPPageBase(CPPageOverrides::IDD, CPPageOverrides::IDD)
00042 , m_iLoadType(Filter::PREFERRED)
00043 , m_pLastSelFilter(NULL)
00044 {
00045 }
00046
00047 CPPageOverrides::~CPPageOverrides()
00048 {
00049 }
00050
00051 void CPPageOverrides::DoDataExchange(CDataExchange* pDX)
00052 {
00053 __super::DoDataExchange(pDX);
00054 DDX_Control(pDX, IDC_LIST1, m_filters);
00055 DDX_Radio(pDX, IDC_RADIO1, m_iLoadType);
00056 DDX_Control(pDX, IDC_EDIT1, m_dwMerit);
00057 DDX_Control(pDX, IDC_TREE2, m_tree);
00058 }
00059
00060 void CPPageOverrides::StepUp(CCheckListBox& list)
00061 {
00062 int i = list.GetCurSel();
00063 if(i < 1) return;
00064
00065 CString str;
00066 list.GetText(i, str);
00067 DWORD_PTR dwItemData = list.GetItemData(i);
00068 int nCheck = list.GetCheck(i);
00069 list.DeleteString(i);
00070 i--;
00071 list.InsertString(i, str);
00072 list.SetItemData(i, dwItemData);
00073 list.SetCheck(i, nCheck);
00074 list.SetCurSel(i);
00075 }
00076
00077 void CPPageOverrides::StepDown(CCheckListBox& list)
00078 {
00079 int i = list.GetCurSel();
00080 if(i < 0 || i >= list.GetCount()-1) return;
00081
00082 CString str;
00083 list.GetText(i, str);
00084 DWORD_PTR dwItemData = list.GetItemData(i);
00085 int nCheck = list.GetCheck(i);
00086 list.DeleteString(i);
00087 i++;
00088 list.InsertString(i, str);
00089 list.SetItemData(i, dwItemData);
00090 list.SetCheck(i, nCheck);
00091 list.SetCurSel(i);
00092 }
00093
00094 Filter* CPPageOverrides::GetCurFilter()
00095 {
00096 int i = m_filters.GetCurSel();
00097 return i >= 0 ? (Filter*)m_pFilters.GetAt((POSITION)m_filters.GetItemDataPtr(i)) : (Filter*)NULL;
00098 }
00099
00100 void CPPageOverrides::SetupMajorTypes(CArray<GUID>& guids)
00101 {
00102 guids.RemoveAll();
00103 guids.Add(MEDIATYPE_NULL);
00104 guids.Add(MEDIATYPE_Video);
00105 guids.Add(MEDIATYPE_Audio);
00106 guids.Add(MEDIATYPE_Text);
00107 guids.Add(MEDIATYPE_Midi);
00108 guids.Add(MEDIATYPE_Stream);
00109 guids.Add(MEDIATYPE_Interleaved);
00110 guids.Add(MEDIATYPE_File);
00111 guids.Add(MEDIATYPE_ScriptCommand);
00112 guids.Add(MEDIATYPE_AUXLine21Data);
00113 guids.Add(MEDIATYPE_VBI);
00114 guids.Add(MEDIATYPE_Timecode);
00115 guids.Add(MEDIATYPE_LMRT);
00116 guids.Add(MEDIATYPE_URL_STREAM);
00117 guids.Add(MEDIATYPE_MPEG1SystemStream);
00118 guids.Add(MEDIATYPE_AnalogVideo);
00119 guids.Add(MEDIATYPE_AnalogAudio);
00120 guids.Add(MEDIATYPE_MPEG2_PACK);
00121 guids.Add(MEDIATYPE_MPEG2_PES);
00122 guids.Add(MEDIATYPE_MPEG2_SECTIONS);
00123 guids.Add(MEDIATYPE_DVD_ENCRYPTED_PACK);
00124 guids.Add(MEDIATYPE_DVD_NAVIGATION);
00125 }
00126
00127 void CPPageOverrides::SetupSubTypes(CArray<GUID>& guids)
00128 {
00129 guids.RemoveAll();
00130 guids.Add(MEDIASUBTYPE_None);
00131 guids.Add(MEDIASUBTYPE_CLPL);
00132 guids.Add(MEDIASUBTYPE_YUYV);
00133 guids.Add(MEDIASUBTYPE_IYUV);
00134 guids.Add(MEDIASUBTYPE_YVU9);
00135 guids.Add(MEDIASUBTYPE_Y411);
00136 guids.Add(MEDIASUBTYPE_Y41P);
00137 guids.Add(MEDIASUBTYPE_YUY2);
00138 guids.Add(MEDIASUBTYPE_YVYU);
00139 guids.Add(MEDIASUBTYPE_UYVY);
00140 guids.Add(MEDIASUBTYPE_Y211);
00141 guids.Add(MEDIASUBTYPE_CLJR);
00142 guids.Add(MEDIASUBTYPE_IF09);
00143 guids.Add(MEDIASUBTYPE_CPLA);
00144 guids.Add(MEDIASUBTYPE_MJPG);
00145 guids.Add(MEDIASUBTYPE_TVMJ);
00146 guids.Add(MEDIASUBTYPE_WAKE);
00147 guids.Add(MEDIASUBTYPE_CFCC);
00148 guids.Add(MEDIASUBTYPE_IJPG);
00149 guids.Add(MEDIASUBTYPE_Plum);
00150 guids.Add(MEDIASUBTYPE_DVCS);
00151 guids.Add(MEDIASUBTYPE_DVSD);
00152 guids.Add(MEDIASUBTYPE_MDVF);
00153 guids.Add(MEDIASUBTYPE_RGB1);
00154 guids.Add(MEDIASUBTYPE_RGB4);
00155 guids.Add(MEDIASUBTYPE_RGB8);
00156 guids.Add(MEDIASUBTYPE_RGB565);
00157 guids.Add(MEDIASUBTYPE_RGB555);
00158 guids.Add(MEDIASUBTYPE_RGB24);
00159 guids.Add(MEDIASUBTYPE_RGB32);
00160 guids.Add(MEDIASUBTYPE_ARGB1555);
00161 guids.Add(MEDIASUBTYPE_ARGB4444);
00162 guids.Add(MEDIASUBTYPE_ARGB32);
00163 guids.Add(MEDIASUBTYPE_A2R10G10B10);
00164 guids.Add(MEDIASUBTYPE_A2B10G10R10);
00165 guids.Add(MEDIASUBTYPE_AYUV);
00166 guids.Add(MEDIASUBTYPE_AI44);
00167 guids.Add(MEDIASUBTYPE_IA44);
00168 guids.Add(MEDIASUBTYPE_RGB32_D3D_DX7_RT);
00169 guids.Add(MEDIASUBTYPE_RGB16_D3D_DX7_RT);
00170 guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX7_RT);
00171 guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX7_RT);
00172 guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX7_RT);
00173 guids.Add(MEDIASUBTYPE_RGB32_D3D_DX9_RT);
00174 guids.Add(MEDIASUBTYPE_RGB16_D3D_DX9_RT);
00175 guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX9_RT);
00176 guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX9_RT);
00177 guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX9_RT);
00178 guids.Add(MEDIASUBTYPE_YV12);
00179 guids.Add(MEDIASUBTYPE_NV12);
00180 guids.Add(MEDIASUBTYPE_IMC1);
00181 guids.Add(MEDIASUBTYPE_IMC2);
00182 guids.Add(MEDIASUBTYPE_IMC3);
00183 guids.Add(MEDIASUBTYPE_IMC4);
00184 guids.Add(MEDIASUBTYPE_S340);
00185 guids.Add(MEDIASUBTYPE_S342);
00186 guids.Add(MEDIASUBTYPE_Overlay);
00187 guids.Add(MEDIASUBTYPE_MPEG1Packet);
00188 guids.Add(MEDIASUBTYPE_MPEG1Payload);
00189 guids.Add(MEDIASUBTYPE_MPEG1AudioPayload);
00190 guids.Add(MEDIASUBTYPE_MPEG1System);
00191 guids.Add(MEDIASUBTYPE_MPEG1VideoCD);
00192 guids.Add(MEDIASUBTYPE_MPEG1Video);
00193 guids.Add(MEDIASUBTYPE_MPEG1Audio);
00194 guids.Add(MEDIASUBTYPE_Avi);
00195 guids.Add(MEDIASUBTYPE_Asf);
00196 guids.Add(MEDIASUBTYPE_QTMovie);
00197 guids.Add(MEDIASUBTYPE_QTRpza);
00198 guids.Add(MEDIASUBTYPE_QTSmc);
00199 guids.Add(MEDIASUBTYPE_QTRle);
00200 guids.Add(MEDIASUBTYPE_QTJpeg);
00201 guids.Add(MEDIASUBTYPE_PCMAudio_Obsolete);
00202 guids.Add(MEDIASUBTYPE_PCM);
00203 guids.Add(MEDIASUBTYPE_WAVE);
00204 guids.Add(MEDIASUBTYPE_AU);
00205 guids.Add(MEDIASUBTYPE_AIFF);
00206 guids.Add(MEDIASUBTYPE_dvsd);
00207 guids.Add(MEDIASUBTYPE_dvhd);
00208 guids.Add(MEDIASUBTYPE_dvsl);
00209 guids.Add(MEDIASUBTYPE_dv25);
00210 guids.Add(MEDIASUBTYPE_dv50);
00211 guids.Add(MEDIASUBTYPE_dvh1);
00212 guids.Add(MEDIASUBTYPE_Line21_BytePair);
00213 guids.Add(MEDIASUBTYPE_Line21_GOPPacket);
00214 guids.Add(MEDIASUBTYPE_Line21_VBIRawData);
00215 guids.Add(MEDIASUBTYPE_TELETEXT);
00216 guids.Add(MEDIASUBTYPE_DRM_Audio);
00217 guids.Add(MEDIASUBTYPE_IEEE_FLOAT);
00218 guids.Add(MEDIASUBTYPE_DOLBY_AC3_SPDIF);
00219 guids.Add(MEDIASUBTYPE_RAW_SPORT);
00220 guids.Add(MEDIASUBTYPE_SPDIF_TAG_241h);
00221 guids.Add(MEDIASUBTYPE_DssVideo);
00222 guids.Add(MEDIASUBTYPE_DssAudio);
00223 guids.Add(MEDIASUBTYPE_VPVideo);
00224 guids.Add(MEDIASUBTYPE_VPVBI);
00225 guids.Add(MEDIASUBTYPE_ATSC_SI);
00226 guids.Add(MEDIASUBTYPE_DVB_SI);
00227 guids.Add(MEDIASUBTYPE_MPEG2DATA);
00228 guids.Add(MEDIASUBTYPE_MPEG2_VIDEO);
00229 guids.Add(MEDIASUBTYPE_MPEG2_PROGRAM);
00230 guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT);
00231 guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE);
00232 guids.Add(MEDIASUBTYPE_MPEG2_AUDIO);
00233 guids.Add(MEDIASUBTYPE_DOLBY_AC3);
00234 guids.Add(MEDIASUBTYPE_DVD_SUBPICTURE);
00235 guids.Add(MEDIASUBTYPE_DVD_LPCM_AUDIO);
00236 guids.Add(MEDIASUBTYPE_DTS);
00237 guids.Add(MEDIASUBTYPE_SDDS);
00238 guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PCI);
00239 guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_DSI);
00240 guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER);
00241 guids.Add(MEDIASUBTYPE_I420);
00242 guids.Add(MEDIASUBTYPE_WAVE_DOLBY_AC3);
00243 guids.Add(MEDIASUBTYPE_WAVE_DTS);
00244 }
00245
00246 BEGIN_MESSAGE_MAP(CPPageOverrides, CPPageBase)
00247 ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateFilter)
00248 ON_UPDATE_COMMAND_UI(IDC_RADIO1, OnUpdateFilter)
00249 ON_UPDATE_COMMAND_UI(IDC_RADIO2, OnUpdateFilter)
00250 ON_UPDATE_COMMAND_UI(IDC_RADIO3, OnUpdateFilter)
00251 ON_UPDATE_COMMAND_UI(IDC_BUTTON11, OnUpdateFilterUp)
00252 ON_UPDATE_COMMAND_UI(IDC_BUTTON6, OnUpdateFilterDown)
00253 ON_UPDATE_COMMAND_UI(IDC_EDIT1, OnUpdateFilterMerit)
00254 ON_UPDATE_COMMAND_UI(IDC_BUTTON13, OnUpdateFilter)
00255 ON_UPDATE_COMMAND_UI(IDC_BUTTON14, OnUpdateSubType)
00256 ON_UPDATE_COMMAND_UI(IDC_BUTTON9, OnUpdateDeleteType)
00257 ON_UPDATE_COMMAND_UI(IDC_BUTTON10, OnUpdateFilter)
00258 ON_BN_CLICKED(IDC_BUTTON1, OnAddRegistered)
00259 ON_BN_CLICKED(IDC_BUTTON2, OnRemoveFilter)
00260 ON_BN_CLICKED(IDC_BUTTON11, OnMoveFilterUp)
00261 ON_BN_CLICKED(IDC_BUTTON6, OnMoveFilterDown)
00262 ON_LBN_DBLCLK(IDC_LIST1, OnLbnDblclkFilter)
00263 ON_BN_CLICKED(IDC_BUTTON13, OnAddMajorType)
00264 ON_BN_CLICKED(IDC_BUTTON14, OnAddSubType)
00265 ON_BN_CLICKED(IDC_BUTTON9, OnDeleteType)
00266 ON_BN_CLICKED(IDC_BUTTON10, OnResetTypes)
00267 ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
00268 ON_BN_CLICKED(IDC_RADIO1, OnBnClickedRadio)
00269 ON_BN_CLICKED(IDC_RADIO2, OnBnClickedRadio)
00270 ON_BN_CLICKED(IDC_RADIO3, OnBnClickedRadio)
00271 ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
00272 ON_NOTIFY(NM_DBLCLK, IDC_TREE2, OnNMDblclkTree2)
00273 ON_WM_DROPFILES()
00274 END_MESSAGE_MAP()
00275
00276
00277
00278
00279 BOOL CPPageOverrides::OnInitDialog()
00280 {
00281 __super::OnInitDialog();
00282
00283 DragAcceptFiles(TRUE);
00284
00285 AppSettings& s = AfxGetAppSettings();
00286
00287 m_pFilters.RemoveAll();
00288
00289 POSITION pos = s.filters.GetHeadPosition();
00290 while(pos)
00291 {
00292 CAutoPtr<Filter> f(new Filter(s.filters.GetNext(pos)));
00293
00294 CString name(_T("<unknown>"));
00295
00296 if(f->type == Filter::REGISTERED)
00297 {
00298 name = CGraphRegFilter(f->dispname).GetName();
00299 if(name.IsEmpty()) name = f->name + _T(" <not registered>");
00300 }
00301 else if(f->type == Filter::EXTERNAL)
00302 {
00303 name = f->name;
00304 if(f->fTemporary) name += _T(" <temporary>");
00305 if(!CPath(MakeFullPath(f->path)).FileExists()) name += _T(" <not found!>");
00306 }
00307
00308 int i = m_filters.AddString(name);
00309 m_filters.SetCheck(i, f->fDisabled ? 0 : 1);
00310 m_filters.SetItemDataPtr(i, m_pFilters.AddTail(f));
00311 }
00312
00313 UpdateData(FALSE);
00314
00315 return TRUE;
00316
00317 }
00318
00319 BOOL CPPageOverrides::OnApply()
00320 {
00321 UpdateData();
00322
00323 AppSettings& s = AfxGetAppSettings();
00324
00325 s.filters.RemoveAll();
00326
00327 for(int i = 0; i < m_filters.GetCount(); i++)
00328 {
00329 if(POSITION pos = (POSITION)m_filters.GetItemData(i))
00330 {
00331 CAutoPtr<Filter> f(new Filter(m_pFilters.GetAt(pos)));
00332 f->fDisabled = !m_filters.GetCheck(i);
00333 s.filters.AddTail(f);
00334 }
00335 }
00336
00337 return __super::OnApply();
00338 }
00339
00340 void CPPageOverrides::OnUpdateFilter(CCmdUI* pCmdUI)
00341 {
00342 if(Filter* f = GetCurFilter())
00343 {
00344 pCmdUI->Enable(!(pCmdUI->m_nID == IDC_RADIO2 && f->type == Filter::EXTERNAL));
00345 }
00346 else
00347 {
00348 pCmdUI->Enable(FALSE);
00349 }
00350 }
00351
00352 void CPPageOverrides::OnUpdateFilterUp(CCmdUI* pCmdUI)
00353 {
00354 pCmdUI->Enable(m_filters.GetCurSel() > 0);
00355 }
00356
00357 void CPPageOverrides::OnUpdateFilterDown(CCmdUI* pCmdUI)
00358 {
00359 pCmdUI->Enable(m_filters.GetCurSel() >= 0 && m_filters.GetCurSel() < m_filters.GetCount()-1);
00360 }
00361
00362 void CPPageOverrides::OnUpdateFilterMerit(CCmdUI* pCmdUI)
00363 {
00364 UpdateData();
00365 pCmdUI->Enable(m_iLoadType == Filter::MERIT);
00366 }
00367
00368 void CPPageOverrides::OnUpdateSubType(CCmdUI* pCmdUI)
00369 {
00370 HTREEITEM node = m_tree.GetSelectedItem();
00371 pCmdUI->Enable(node != NULL && m_tree.GetItemData(node) == NULL);
00372 }
00373
00374 void CPPageOverrides::OnUpdateDeleteType(CCmdUI* pCmdUI)
00375 {
00376 pCmdUI->Enable(!!m_tree.GetSelectedItem());
00377 }
00378
00379 void CPPageOverrides::OnAddRegistered()
00380 {
00381 CRegFilterChooserDlg dlg(this);
00382 if(dlg.DoModal() == IDOK)
00383 {
00384 while(!dlg.m_filters.IsEmpty())
00385 {
00386 if(Filter* f = dlg.m_filters.RemoveHead())
00387 {
00388 CAutoPtr<Filter> p(f);
00389
00390 CString name = f->name;
00391
00392 if(f->type == Filter::EXTERNAL)
00393 {
00394 if(!CPath(MakeFullPath(f->path)).FileExists()) name += _T(" <not found!>");
00395 }
00396
00397 int i = m_filters.AddString(name);
00398 m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
00399 m_filters.SetCheck(i, 1);
00400
00401 if(dlg.m_filters.IsEmpty())
00402 {
00403 m_filters.SetCurSel(i);
00404 OnLbnSelchangeList1();
00405 }
00406 }
00407 }
00408 }
00409 }
00410
00411 void CPPageOverrides::OnRemoveFilter()
00412 {
00413 int i = m_filters.GetCurSel();
00414 m_pFilters.RemoveAt((POSITION)m_filters.GetItemDataPtr(i));
00415 m_filters.DeleteString(i);
00416 if(i >= m_filters.GetCount()) i--;
00417 m_filters.SetCurSel(i);
00418 OnLbnSelchangeList1();
00419 }
00420
00421 void CPPageOverrides::OnMoveFilterUp()
00422 {
00423 StepUp(m_filters);
00424 }
00425
00426 void CPPageOverrides::OnMoveFilterDown()
00427 {
00428 StepDown(m_filters);
00429 }
00430
00431 void CPPageOverrides::OnLbnDblclkFilter()
00432 {
00433 if(Filter* f = GetCurFilter())
00434 {
00435 CComPtr<IBaseFilter> pBF;
00436 CString name;
00437
00438 if(f->type == Filter::REGISTERED)
00439 {
00440 CStringW namew;
00441 if(CreateFilter(f->dispname, &pBF, namew))
00442 name = namew;
00443 }
00444 else if(f->type == Filter::EXTERNAL)
00445 {
00446 if(SUCCEEDED(LoadExternalFilter(f->path, f->clsid, &pBF)))
00447 name = f->name;
00448 }
00449
00450 if(CComQIPtr<ISpecifyPropertyPages> pSPP = pBF)
00451 {
00452 CComPropertySheet ps(name, this);
00453 if(ps.AddPages(pSPP) > 0)
00454 {
00455 CComPtr<IFilterGraph> pFG;
00456 if(SUCCEEDED(pFG.CoCreateInstance(CLSID_FilterGraph)))
00457 pFG->AddFilter(pBF, L"");
00458
00459 ps.DoModal();
00460 }
00461 }
00462 }
00463 }
00464
00465 void CPPageOverrides::OnAddMajorType()
00466 {
00467 Filter* f = GetCurFilter();
00468 if(!f) return;
00469
00470 CArray<GUID> guids;
00471 SetupMajorTypes(guids);
00472
00473 CSelectMediaType dlg(guids, MEDIATYPE_NULL, this);
00474 if(dlg.DoModal() == IDOK)
00475 {
00476 POSITION pos = f->guids.GetHeadPosition();
00477 while(pos)
00478 {
00479 if(f->guids.GetNext(pos) == dlg.m_guid) {AfxMessageBox(_T("Already on the list!")); return;}
00480 f->guids.GetNext(pos);
00481 }
00482
00483 f->guids.AddTail(dlg.m_guid);
00484 pos = f->guids.GetTailPosition();
00485 f->guids.AddTail(GUID_NULL);
00486
00487 CString major = GetMediaTypeName(dlg.m_guid);
00488 CString sub = GetMediaTypeName(GUID_NULL);
00489
00490 HTREEITEM node = m_tree.InsertItem(major);
00491 m_tree.SetItemData(node, NULL);
00492
00493 node = m_tree.InsertItem(sub, node);
00494 m_tree.SetItemData(node, (DWORD_PTR)pos);
00495 }
00496 }
00497
00498 void CPPageOverrides::OnAddSubType()
00499 {
00500 Filter* f = GetCurFilter();
00501 if(!f) return;
00502
00503 HTREEITEM node = m_tree.GetSelectedItem();
00504 if(!node) return;
00505
00506 HTREEITEM child = m_tree.GetChildItem(node);
00507 if(!child) return;
00508
00509 POSITION pos = (POSITION)m_tree.GetItemData(child);
00510 GUID major = f->guids.GetAt(pos);
00511
00512 CArray<GUID> guids;
00513 SetupSubTypes(guids);
00514
00515 CSelectMediaType dlg(guids, MEDIASUBTYPE_NULL, this);
00516 if(dlg.DoModal() == IDOK)
00517 {
00518 for(child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child))
00519 {
00520 pos = (POSITION)m_tree.GetItemData(child);
00521 f->guids.GetNext(pos);
00522 if(f->guids.GetAt(pos) == dlg.m_guid) {AfxMessageBox(_T("Already on the list!")); return;}
00523 }
00524
00525 f->guids.AddTail(major);
00526 pos = f->guids.GetTailPosition();
00527 f->guids.AddTail(dlg.m_guid);
00528
00529 CString sub = GetMediaTypeName(dlg.m_guid);
00530
00531 node = m_tree.InsertItem(sub, node);
00532 m_tree.SetItemData(node, (DWORD_PTR)pos);
00533 }
00534 }
00535
00536 void CPPageOverrides::OnDeleteType()
00537 {
00538 if(Filter* f = GetCurFilter())
00539 {
00540 HTREEITEM node = m_tree.GetSelectedItem();
00541 if(!node) return;
00542
00543 POSITION pos = (POSITION)m_tree.GetItemData(node);
00544
00545 if(pos == NULL)
00546 {
00547 for(HTREEITEM child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child))
00548 {
00549 pos = (POSITION)m_tree.GetItemData(child);
00550
00551 POSITION pos1 = pos;
00552 f->guids.GetNext(pos);
00553 POSITION pos2 = pos;
00554 f->guids.GetNext(pos);
00555
00556 f->guids.RemoveAt(pos1);
00557 f->guids.RemoveAt(pos2);
00558 }
00559
00560 m_tree.DeleteItem(node);
00561 }
00562 else
00563 {
00564 HTREEITEM parent = m_tree.GetParentItem(node);
00565
00566 POSITION pos1 = pos;
00567 f->guids.GetNext(pos);
00568 POSITION pos2 = pos;
00569 f->guids.GetNext(pos);
00570
00571 m_tree.DeleteItem(node);
00572
00573 if(!m_tree.ItemHasChildren(parent))
00574 {
00575 f->guids.SetAt(pos2, GUID_NULL);
00576 node = m_tree.InsertItem(GetMediaTypeName(GUID_NULL), parent);
00577 m_tree.SetItemData(node, (DWORD_PTR)pos1);
00578 }
00579 else
00580 {
00581 f->guids.RemoveAt(pos1);
00582 f->guids.RemoveAt(pos2);
00583 }
00584 }
00585 }
00586 }
00587
00588 void CPPageOverrides::OnResetTypes()
00589 {
00590 if(Filter* f = GetCurFilter())
00591 {
00592 f->guids.RemoveAll();
00593 f->guids.AddTail(&f->backup);
00594
00595 m_pLastSelFilter = NULL;
00596 OnLbnSelchangeList1();
00597 }
00598 }
00599
00600 void CPPageOverrides::OnLbnSelchangeList1()
00601 {
00602 if(Filter* f = GetCurFilter())
00603 {
00604 if(m_pLastSelFilter == f) return;
00605 m_pLastSelFilter = f;
00606
00607 m_iLoadType = f->iLoadType;
00608 UpdateData(FALSE);
00609 m_dwMerit = f->dwMerit;
00610
00611 HTREEITEM dummy_item = m_tree.InsertItem(_T(""), 0,0, NULL, TVI_FIRST);
00612 if(dummy_item)
00613 for(HTREEITEM item = m_tree.GetNextVisibleItem(dummy_item); item; item = m_tree.GetNextVisibleItem(dummy_item))
00614 m_tree.DeleteItem(item);
00615
00616 CMapStringToPtr map;
00617
00618 POSITION pos = f->guids.GetHeadPosition();
00619 while(pos)
00620 {
00621 POSITION tmp = pos;
00622 CString major = GetMediaTypeName(f->guids.GetNext(pos));
00623 CString sub = GetMediaTypeName(f->guids.GetNext(pos));
00624
00625 HTREEITEM node = NULL;
00626
00627 void* val = NULL;
00628 if(map.Lookup(major, val)) node = (HTREEITEM)val;
00629 else map[major] = node = m_tree.InsertItem(major);
00630 m_tree.SetItemData(node, NULL);
00631
00632 node = m_tree.InsertItem(sub, node);
00633 m_tree.SetItemData(node, (DWORD_PTR)tmp);
00634 }
00635
00636 m_tree.DeleteItem(dummy_item);
00637
00638 for(HTREEITEM item = m_tree.GetFirstVisibleItem(); item; item = m_tree.GetNextVisibleItem(item))
00639 m_tree.Expand(item, TVE_EXPAND);
00640
00641 m_tree.EnsureVisible(m_tree.GetRootItem());
00642 }
00643 else
00644 {
00645 m_pLastSelFilter = NULL;
00646
00647 m_iLoadType = Filter::PREFERRED;
00648 UpdateData(FALSE);
00649 m_dwMerit = 0;
00650
00651 m_tree.DeleteAllItems();
00652 }
00653 }
00654
00655 void CPPageOverrides::OnBnClickedRadio()
00656 {
00657 UpdateData();
00658 if(Filter* f = GetCurFilter())
00659 f->iLoadType = m_iLoadType;
00660 }
00661
00662 void CPPageOverrides::OnEnChangeEdit1()
00663 {
00664 UpdateData();
00665 if(Filter* f = GetCurFilter())
00666 {
00667 DWORD dw;
00668 if(m_dwMerit.GetDWORD(dw))
00669 f->dwMerit = dw;
00670 }
00671 }
00672
00673 void CPPageOverrides::OnNMDblclkTree2(NMHDR *pNMHDR, LRESULT *pResult)
00674 {
00675 *pResult = 0;
00676
00677 if(Filter* f = GetCurFilter())
00678 {
00679 HTREEITEM node = m_tree.GetSelectedItem();
00680 if(!node) return;
00681
00682 POSITION pos = (POSITION)m_tree.GetItemData(node);
00683 if(!pos) return;
00684
00685 f->guids.GetNext(pos);
00686 if(!pos) return;
00687
00688 CArray<GUID> guids;
00689 SetupSubTypes(guids);
00690
00691 CSelectMediaType dlg(guids, f->guids.GetAt(pos), this);
00692 if(dlg.DoModal() == IDOK)
00693 {
00694 f->guids.SetAt(pos, dlg.m_guid);
00695 m_tree.SetItemText(node, GetMediaTypeName(dlg.m_guid));
00696 }
00697 }
00698 }
00699
00700 void CPPageOverrides::OnDropFiles(HDROP hDropInfo)
00701 {
00702 SetActiveWindow();
00703
00704 UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
00705 for(UINT iFile = 0; iFile < nFiles; iFile++)
00706 {
00707 TCHAR szFileName[_MAX_PATH];
00708 ::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
00709
00710 CFilterMapper2 fm2(false);
00711 fm2.Register(szFileName);
00712
00713 while(!fm2.m_filters.IsEmpty())
00714 {
00715 if(Filter* f = fm2.m_filters.RemoveHead())
00716 {
00717 CAutoPtr<Filter> p(f);
00718 int i = m_filters.AddString(f->name);
00719 m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
00720 m_filters.SetCheck(i, 1);
00721
00722 if(fm2.m_filters.IsEmpty())
00723 {
00724 m_filters.SetCurSel(i);
00725 OnLbnSelchangeList1();
00726 }
00727 }
00728 }
00729 }
00730 ::DragFinish(hDropInfo);
00731 }