/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2012 see Authors.txt
*
* This file is part of MPC-HC.
*
* MPC-HC is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* MPC-HC is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#include "stdafx.h"
#include
#include
#include
#include "mplayerc.h"
#include "PPageExternalFilters.h"
#include "ComPropertySheet.h"
#include "RegFilterChooserDlg.h"
#include "SelectMediaType.h"
#include "FGFilter.h"
#include
// CPPageExternalFilters dialog
IMPLEMENT_DYNAMIC(CPPageExternalFilters, CPPageBase)
CPPageExternalFilters::CPPageExternalFilters()
: CPPageBase(CPPageExternalFilters::IDD, CPPageExternalFilters::IDD)
, m_iLoadType(FilterOverride::PREFERRED)
, m_pLastSelFilter(NULL)
{
}
CPPageExternalFilters::~CPPageExternalFilters()
{
}
void CPPageExternalFilters::DoDataExchange(CDataExchange* pDX)
{
__super::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_filters);
DDX_Radio(pDX, IDC_RADIO1, m_iLoadType);
DDX_Control(pDX, IDC_EDIT1, m_dwMerit);
DDX_Control(pDX, IDC_TREE2, m_tree);
}
void CPPageExternalFilters::StepUp(CCheckListBox& list)
{
int i = list.GetCurSel();
if (i < 1) {
return;
}
CString str;
list.GetText(i, str);
DWORD_PTR dwItemData = list.GetItemData(i);
int nCheck = list.GetCheck(i);
list.DeleteString(i);
i--;
list.InsertString(i, str);
list.SetItemData(i, dwItemData);
list.SetCheck(i, nCheck);
list.SetCurSel(i);
SetModified();
}
void CPPageExternalFilters::StepDown(CCheckListBox& list)
{
int i = list.GetCurSel();
if (i < 0 || i >= list.GetCount()-1) {
return;
}
CString str;
list.GetText(i, str);
DWORD_PTR dwItemData = list.GetItemData(i);
int nCheck = list.GetCheck(i);
list.DeleteString(i);
i++;
list.InsertString(i, str);
list.SetItemData(i, dwItemData);
list.SetCheck(i, nCheck);
list.SetCurSel(i);
SetModified();
}
FilterOverride* CPPageExternalFilters::GetCurFilter()
{
int i = m_filters.GetCurSel();
return i >= 0 ? (FilterOverride*)m_pFilters.GetAt((POSITION)m_filters.GetItemDataPtr(i)) : (FilterOverride*)NULL;
}
void CPPageExternalFilters::SetupMajorTypes(CAtlArray& guids)
{
guids.RemoveAll();
guids.Add(MEDIATYPE_NULL);
guids.Add(MEDIATYPE_Video);
guids.Add(MEDIATYPE_Audio);
guids.Add(MEDIATYPE_Text);
guids.Add(MEDIATYPE_Midi);
guids.Add(MEDIATYPE_Stream);
guids.Add(MEDIATYPE_Interleaved);
guids.Add(MEDIATYPE_File);
guids.Add(MEDIATYPE_ScriptCommand);
guids.Add(MEDIATYPE_AUXLine21Data);
guids.Add(MEDIATYPE_VBI);
guids.Add(MEDIATYPE_Timecode);
guids.Add(MEDIATYPE_LMRT);
guids.Add(MEDIATYPE_URL_STREAM);
guids.Add(MEDIATYPE_MPEG1SystemStream);
guids.Add(MEDIATYPE_AnalogVideo);
guids.Add(MEDIATYPE_AnalogAudio);
guids.Add(MEDIATYPE_MPEG2_PACK);
guids.Add(MEDIATYPE_MPEG2_PES);
guids.Add(MEDIATYPE_MPEG2_SECTIONS);
guids.Add(MEDIATYPE_DVD_ENCRYPTED_PACK);
guids.Add(MEDIATYPE_DVD_NAVIGATION);
}
void CPPageExternalFilters::SetupSubTypes(CAtlArray& guids)
{
guids.RemoveAll();
guids.Add(MEDIASUBTYPE_None);
guids.Add(MEDIASUBTYPE_CLPL);
guids.Add(MEDIASUBTYPE_YUYV);
guids.Add(MEDIASUBTYPE_IYUV);
guids.Add(MEDIASUBTYPE_YVU9);
guids.Add(MEDIASUBTYPE_Y411);
guids.Add(MEDIASUBTYPE_Y41P);
guids.Add(MEDIASUBTYPE_YUY2);
guids.Add(MEDIASUBTYPE_YVYU);
guids.Add(MEDIASUBTYPE_UYVY);
guids.Add(MEDIASUBTYPE_Y211);
guids.Add(MEDIASUBTYPE_CLJR);
guids.Add(MEDIASUBTYPE_IF09);
guids.Add(MEDIASUBTYPE_CPLA);
guids.Add(MEDIASUBTYPE_MJPG);
guids.Add(MEDIASUBTYPE_MJPA);
guids.Add(MEDIASUBTYPE_MJPB);
guids.Add(MEDIASUBTYPE_TVMJ);
guids.Add(MEDIASUBTYPE_WAKE);
guids.Add(MEDIASUBTYPE_CFCC);
guids.Add(MEDIASUBTYPE_IJPG);
guids.Add(MEDIASUBTYPE_Plum);
guids.Add(MEDIASUBTYPE_DVCS);
guids.Add(MEDIASUBTYPE_DVSD);
guids.Add(MEDIASUBTYPE_MDVF);
guids.Add(MEDIASUBTYPE_RGB1);
guids.Add(MEDIASUBTYPE_RGB4);
guids.Add(MEDIASUBTYPE_RGB8);
guids.Add(MEDIASUBTYPE_RGB565);
guids.Add(MEDIASUBTYPE_RGB555);
guids.Add(MEDIASUBTYPE_RGB24);
guids.Add(MEDIASUBTYPE_RGB32);
guids.Add(MEDIASUBTYPE_ARGB1555);
guids.Add(MEDIASUBTYPE_ARGB4444);
guids.Add(MEDIASUBTYPE_ARGB32);
guids.Add(MEDIASUBTYPE_A2R10G10B10);
guids.Add(MEDIASUBTYPE_A2B10G10R10);
guids.Add(MEDIASUBTYPE_AYUV);
guids.Add(MEDIASUBTYPE_AI44);
guids.Add(MEDIASUBTYPE_IA44);
guids.Add(MEDIASUBTYPE_RGB32_D3D_DX7_RT);
guids.Add(MEDIASUBTYPE_RGB16_D3D_DX7_RT);
guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX7_RT);
guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX7_RT);
guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX7_RT);
guids.Add(MEDIASUBTYPE_RGB32_D3D_DX9_RT);
guids.Add(MEDIASUBTYPE_RGB16_D3D_DX9_RT);
guids.Add(MEDIASUBTYPE_ARGB32_D3D_DX9_RT);
guids.Add(MEDIASUBTYPE_ARGB4444_D3D_DX9_RT);
guids.Add(MEDIASUBTYPE_ARGB1555_D3D_DX9_RT);
guids.Add(MEDIASUBTYPE_YV12);
guids.Add(MEDIASUBTYPE_NV12);
guids.Add(MEDIASUBTYPE_IMC1);
guids.Add(MEDIASUBTYPE_IMC2);
guids.Add(MEDIASUBTYPE_IMC3);
guids.Add(MEDIASUBTYPE_IMC4);
guids.Add(MEDIASUBTYPE_S340);
guids.Add(MEDIASUBTYPE_S342);
guids.Add(MEDIASUBTYPE_Overlay);
guids.Add(MEDIASUBTYPE_MPEG1Packet);
guids.Add(MEDIASUBTYPE_MPEG1Payload);
guids.Add(MEDIASUBTYPE_MPEG1AudioPayload);
guids.Add(MEDIASUBTYPE_MPEG1System);
guids.Add(MEDIASUBTYPE_MPEG1VideoCD);
guids.Add(MEDIASUBTYPE_MPEG1Video);
guids.Add(MEDIASUBTYPE_MPEG1Audio);
guids.Add(MEDIASUBTYPE_Avi);
guids.Add(MEDIASUBTYPE_Asf);
guids.Add(MEDIASUBTYPE_QTMovie);
guids.Add(MEDIASUBTYPE_QTRpza);
guids.Add(MEDIASUBTYPE_QTSmc);
guids.Add(MEDIASUBTYPE_QTRle);
guids.Add(MEDIASUBTYPE_QTJpeg);
guids.Add(MEDIASUBTYPE_PCMAudio_Obsolete);
guids.Add(MEDIASUBTYPE_PCM);
guids.Add(MEDIASUBTYPE_WAVE);
guids.Add(MEDIASUBTYPE_AU);
guids.Add(MEDIASUBTYPE_AIFF);
guids.Add(MEDIASUBTYPE_dvsd);
guids.Add(MEDIASUBTYPE_dvhd);
guids.Add(MEDIASUBTYPE_dvsl);
guids.Add(MEDIASUBTYPE_dv25);
guids.Add(MEDIASUBTYPE_dv50);
guids.Add(MEDIASUBTYPE_dvh1);
guids.Add(MEDIASUBTYPE_Line21_BytePair);
guids.Add(MEDIASUBTYPE_Line21_GOPPacket);
guids.Add(MEDIASUBTYPE_Line21_VBIRawData);
guids.Add(MEDIASUBTYPE_TELETEXT);
guids.Add(MEDIASUBTYPE_DRM_Audio);
guids.Add(MEDIASUBTYPE_IEEE_FLOAT);
guids.Add(MEDIASUBTYPE_DOLBY_AC3_SPDIF);
guids.Add(MEDIASUBTYPE_RAW_SPORT);
guids.Add(MEDIASUBTYPE_SPDIF_TAG_241h);
guids.Add(MEDIASUBTYPE_DssVideo);
guids.Add(MEDIASUBTYPE_DssAudio);
guids.Add(MEDIASUBTYPE_VPVideo);
guids.Add(MEDIASUBTYPE_VPVBI);
guids.Add(MEDIASUBTYPE_ATSC_SI);
guids.Add(MEDIASUBTYPE_DVB_SI);
guids.Add(MEDIASUBTYPE_MPEG2DATA);
guids.Add(MEDIASUBTYPE_MPEG2_VIDEO);
guids.Add(MEDIASUBTYPE_MPEG2_PROGRAM);
guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT);
guids.Add(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE);
guids.Add(MEDIASUBTYPE_MPEG2_AUDIO);
guids.Add(MEDIASUBTYPE_DOLBY_AC3);
guids.Add(MEDIASUBTYPE_DVD_SUBPICTURE);
guids.Add(MEDIASUBTYPE_DVD_LPCM_AUDIO);
guids.Add(MEDIASUBTYPE_DTS);
guids.Add(MEDIASUBTYPE_SDDS);
guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PCI);
guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_DSI);
guids.Add(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER);
guids.Add(MEDIASUBTYPE_I420);
guids.Add(MEDIASUBTYPE_WAVE_DOLBY_AC3);
guids.Add(MEDIASUBTYPE_WAVE_DTS);
}
BEGIN_MESSAGE_MAP(CPPageExternalFilters, CPPageBase)
ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateFilter)
ON_UPDATE_COMMAND_UI(IDC_RADIO1, OnUpdateFilter)
ON_UPDATE_COMMAND_UI(IDC_RADIO2, OnUpdateFilter)
ON_UPDATE_COMMAND_UI(IDC_RADIO3, OnUpdateFilter)
ON_UPDATE_COMMAND_UI(IDC_BUTTON3, OnUpdateFilterUp)
ON_UPDATE_COMMAND_UI(IDC_BUTTON4, OnUpdateFilterDown)
ON_UPDATE_COMMAND_UI(IDC_EDIT1, OnUpdateFilterMerit)
ON_UPDATE_COMMAND_UI(IDC_BUTTON5, OnUpdateFilter)
ON_UPDATE_COMMAND_UI(IDC_BUTTON6, OnUpdateSubType)
ON_UPDATE_COMMAND_UI(IDC_BUTTON7, OnUpdateDeleteType)
ON_UPDATE_COMMAND_UI(IDC_BUTTON8, OnUpdateFilter)
ON_BN_CLICKED(IDC_BUTTON1, OnAddRegistered)
ON_BN_CLICKED(IDC_BUTTON2, OnRemoveFilter)
ON_BN_CLICKED(IDC_BUTTON3, OnMoveFilterUp)
ON_BN_CLICKED(IDC_BUTTON4, OnMoveFilterDown)
ON_LBN_DBLCLK(IDC_LIST1, OnLbnDblclkFilter)
ON_WM_VKEYTOITEM()
ON_BN_CLICKED(IDC_BUTTON5, OnAddMajorType)
ON_BN_CLICKED(IDC_BUTTON6, OnAddSubType)
ON_BN_CLICKED(IDC_BUTTON7, OnDeleteType)
ON_BN_CLICKED(IDC_BUTTON8, OnResetTypes)
ON_LBN_SELCHANGE(IDC_LIST1, OnLbnSelchangeList1)
ON_CLBN_CHKCHANGE(IDC_LIST1, OnCheckChangeList1)
ON_BN_CLICKED(IDC_RADIO1, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO2, OnBnClickedRadio)
ON_BN_CLICKED(IDC_RADIO3, OnBnClickedRadio)
ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
ON_NOTIFY(NM_DBLCLK, IDC_TREE2, OnNMDblclkTree2)
ON_NOTIFY(TVN_KEYDOWN, IDC_TREE2, OnTVNKeyDownTree2)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
// CPPageExternalFilters message handlers
BOOL CPPageExternalFilters::OnInitDialog()
{
__super::OnInitDialog();
DragAcceptFiles(TRUE);
AppSettings& s = AfxGetAppSettings();
m_pFilters.RemoveAll();
POSITION pos = s.m_filters.GetHeadPosition();
while (pos) {
CAutoPtr f(DNew FilterOverride(s.m_filters.GetNext(pos)));
CString name(_T(""));
if (f->type == FilterOverride::REGISTERED) {
name = CFGFilterRegistry(f->dispname).GetName();
if (name.IsEmpty()) {
name = f->name + _T(" ");
}
} else if (f->type == FilterOverride::EXTERNAL) {
name = f->name;
if (f->fTemporary) {
name += _T(" ");
}
if (!CPath(MakeFullPath(f->path)).FileExists()) {
name += _T(" ");
}
}
int i = m_filters.AddString(name);
m_filters.SetCheck(i, f->fDisabled ? 0 : 1);
m_filters.SetItemDataPtr(i, m_pFilters.AddTail(f));
}
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CPPageExternalFilters::OnApply()
{
UpdateData();
AppSettings& s = AfxGetAppSettings();
s.m_filters.RemoveAll();
for (int i = 0; i < m_filters.GetCount(); i++) {
if (POSITION pos = (POSITION)m_filters.GetItemData(i)) {
CAutoPtr f(DNew FilterOverride(m_pFilters.GetAt(pos)));
f->fDisabled = !m_filters.GetCheck(i);
s.m_filters.AddTail(f);
}
}
return __super::OnApply();
}
void CPPageExternalFilters::OnUpdateFilter(CCmdUI* pCmdUI)
{
if (FilterOverride* f = GetCurFilter()) {
pCmdUI->Enable(!(pCmdUI->m_nID == IDC_RADIO2 && f->type == FilterOverride::EXTERNAL));
} else {
pCmdUI->Enable(FALSE);
}
}
void CPPageExternalFilters::OnUpdateFilterUp(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_filters.GetCurSel() > 0);
}
void CPPageExternalFilters::OnUpdateFilterDown(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_filters.GetCurSel() >= 0 && m_filters.GetCurSel() < m_filters.GetCount()-1);
}
void CPPageExternalFilters::OnUpdateFilterMerit(CCmdUI* pCmdUI)
{
UpdateData();
pCmdUI->Enable(m_iLoadType == FilterOverride::MERIT);
}
void CPPageExternalFilters::OnUpdateSubType(CCmdUI* pCmdUI)
{
HTREEITEM node = m_tree.GetSelectedItem();
pCmdUI->Enable(node != NULL && m_tree.GetItemData(node) == NULL);
}
void CPPageExternalFilters::OnUpdateDeleteType(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!!m_tree.GetSelectedItem());
}
void CPPageExternalFilters::OnAddRegistered()
{
CRegFilterChooserDlg dlg(this);
if (dlg.DoModal() == IDOK) {
while (!dlg.m_filters.IsEmpty()) {
if (FilterOverride* f = dlg.m_filters.RemoveHead()) {
CAutoPtr p(f);
CString name = f->name;
if (f->type == FilterOverride::EXTERNAL) {
if (!CPath(MakeFullPath(f->path)).FileExists()) {
name += _T(" ");
}
}
int i = m_filters.AddString(name);
m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
m_filters.SetCheck(i, 1);
if (dlg.m_filters.IsEmpty()) {
m_filters.SetCurSel(i);
OnLbnSelchangeList1();
}
SetModified();
}
}
}
}
void CPPageExternalFilters::OnRemoveFilter()
{
int i = m_filters.GetCurSel();
m_pFilters.RemoveAt((POSITION)m_filters.GetItemDataPtr(i));
m_filters.DeleteString(i);
if (i >= m_filters.GetCount()) {
i--;
}
m_filters.SetCurSel(i);
OnLbnSelchangeList1();
SetModified();
}
void CPPageExternalFilters::OnMoveFilterUp()
{
StepUp(m_filters);
}
void CPPageExternalFilters::OnMoveFilterDown()
{
StepDown(m_filters);
}
void CPPageExternalFilters::OnLbnDblclkFilter()
{
if (FilterOverride* f = GetCurFilter()) {
CComPtr pBF;
CString name;
if (f->type == FilterOverride::REGISTERED) {
CStringW namew;
if (CreateFilter(f->dispname, &pBF, namew)) {
name = namew;
}
} else if (f->type == FilterOverride::EXTERNAL) {
if (SUCCEEDED(LoadExternalFilter(f->path, f->clsid, &pBF))) {
name = f->name;
}
}
if (CComQIPtr pSPP = pBF) {
CComPropertySheet ps(name, this);
if (ps.AddPages(pSPP) > 0) {
CComPtr pFG;
if (SUCCEEDED(pFG.CoCreateInstance(CLSID_FilterGraph))) {
pFG->AddFilter(pBF, L"");
}
ps.DoModal();
}
}
}
}
int CPPageExternalFilters::OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex)
{
if (nKey == VK_DELETE) {
OnRemoveFilter();
return -2;
}
return __super::OnVKeyToItem(nKey, pListBox, nIndex);
}
void CPPageExternalFilters::OnAddMajorType()
{
FilterOverride* f = GetCurFilter();
if (!f) {
return;
}
CAtlArray guids;
SetupMajorTypes(guids);
CSelectMediaType dlg(guids, MEDIATYPE_NULL, this);
if (dlg.DoModal() == IDOK) {
POSITION pos = f->guids.GetHeadPosition();
while (pos) {
if (f->guids.GetNext(pos) == dlg.m_guid) {
AfxMessageBox(ResStr(IDS_EXTERNAL_FILTERS_ERROR_MT), MB_ICONEXCLAMATION | MB_OK);
return;
}
f->guids.GetNext(pos);
}
f->guids.AddTail(dlg.m_guid);
pos = f->guids.GetTailPosition();
f->guids.AddTail(GUID_NULL);
CString major = GetMediaTypeName(dlg.m_guid);
CString sub = GetMediaTypeName(GUID_NULL);
HTREEITEM node = m_tree.InsertItem(major);
m_tree.SetItemData(node, NULL);
node = m_tree.InsertItem(sub, node);
m_tree.SetItemData(node, (DWORD_PTR)pos);
SetModified();
}
}
void CPPageExternalFilters::OnAddSubType()
{
FilterOverride* f = GetCurFilter();
if (!f) {
return;
}
HTREEITEM node = m_tree.GetSelectedItem();
if (!node) {
return;
}
HTREEITEM child = m_tree.GetChildItem(node);
if (!child) {
return;
}
POSITION pos = (POSITION)m_tree.GetItemData(child);
GUID major = f->guids.GetAt(pos);
CAtlArray guids;
SetupSubTypes(guids);
CSelectMediaType dlg(guids, MEDIASUBTYPE_NULL, this);
if (dlg.DoModal() == IDOK) {
for (child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child)) {
pos = (POSITION)m_tree.GetItemData(child);
f->guids.GetNext(pos);
if (f->guids.GetAt(pos) == dlg.m_guid) {
AfxMessageBox(ResStr(IDS_EXTERNAL_FILTERS_ERROR_MT), MB_ICONEXCLAMATION | MB_OK);
return;
}
}
f->guids.AddTail(major);
pos = f->guids.GetTailPosition();
f->guids.AddTail(dlg.m_guid);
CString sub = GetMediaTypeName(dlg.m_guid);
node = m_tree.InsertItem(sub, node);
m_tree.SetItemData(node, (DWORD_PTR)pos);
SetModified();
}
}
void CPPageExternalFilters::OnDeleteType()
{
if (FilterOverride* f = GetCurFilter()) {
HTREEITEM node = m_tree.GetSelectedItem();
if (!node) {
return;
}
POSITION pos = (POSITION)m_tree.GetItemData(node);
if (pos == NULL) {
for (HTREEITEM child = m_tree.GetChildItem(node); child; child = m_tree.GetNextSiblingItem(child)) {
pos = (POSITION)m_tree.GetItemData(child);
POSITION pos1 = pos;
f->guids.GetNext(pos);
POSITION pos2 = pos;
f->guids.GetNext(pos);
f->guids.RemoveAt(pos1);
f->guids.RemoveAt(pos2);
}
m_tree.DeleteItem(node);
} else {
HTREEITEM parent = m_tree.GetParentItem(node);
POSITION pos1 = pos;
f->guids.GetNext(pos);
POSITION pos2 = pos;
f->guids.GetNext(pos);
m_tree.DeleteItem(node);
if (!m_tree.ItemHasChildren(parent)) {
f->guids.SetAt(pos2, GUID_NULL);
node = m_tree.InsertItem(GetMediaTypeName(GUID_NULL), parent);
m_tree.SetItemData(node, (DWORD_PTR)pos1);
} else {
f->guids.RemoveAt(pos1);
f->guids.RemoveAt(pos2);
}
}
SetModified();
}
}
void CPPageExternalFilters::OnResetTypes()
{
if (FilterOverride* f = GetCurFilter()) {
if (f->type == FilterOverride::REGISTERED) {
CFGFilterRegistry fgf(f->dispname);
if (!fgf.GetName().IsEmpty()) {
f->guids.RemoveAll();
f->backup.RemoveAll();
f->guids.AddTailList(&fgf.GetTypes());
f->backup.AddTailList(&fgf.GetTypes());
} else {
f->guids.RemoveAll();
f->guids.AddTailList(&f->backup);
}
} else {
f->guids.RemoveAll();
f->guids.AddTailList(&f->backup);
}
m_pLastSelFilter = NULL;
OnLbnSelchangeList1();
SetModified();
}
}
void CPPageExternalFilters::OnLbnSelchangeList1()
{
if (FilterOverride* f = GetCurFilter()) {
if (m_pLastSelFilter == f) {
return;
}
m_pLastSelFilter = f;
m_iLoadType = f->iLoadType;
UpdateData(FALSE);
m_dwMerit = f->dwMerit;
HTREEITEM dummy_item = m_tree.InsertItem(_T(""), 0,0, NULL, TVI_FIRST);
if (dummy_item)
for (HTREEITEM item = m_tree.GetNextVisibleItem(dummy_item); item; item = m_tree.GetNextVisibleItem(dummy_item)) {
m_tree.DeleteItem(item);
}
CMapStringToPtr map;
POSITION pos = f->guids.GetHeadPosition();
while (pos) {
POSITION tmp = pos;
CString major = GetMediaTypeName(f->guids.GetNext(pos));
CString sub = GetMediaTypeName(f->guids.GetNext(pos));
HTREEITEM node = NULL;
void* val = NULL;
if (map.Lookup(major, val)) {
node = (HTREEITEM)val;
} else {
map[major] = node = m_tree.InsertItem(major);
}
m_tree.SetItemData(node, NULL);
node = m_tree.InsertItem(sub, node);
m_tree.SetItemData(node, (DWORD_PTR)tmp);
}
m_tree.DeleteItem(dummy_item);
for (HTREEITEM item = m_tree.GetFirstVisibleItem(); item; item = m_tree.GetNextVisibleItem(item)) {
m_tree.Expand(item, TVE_EXPAND);
}
m_tree.EnsureVisible(m_tree.GetRootItem());
} else {
m_pLastSelFilter = NULL;
m_iLoadType = FilterOverride::PREFERRED;
UpdateData(FALSE);
m_dwMerit = 0;
m_tree.DeleteAllItems();
}
}
void CPPageExternalFilters::OnCheckChangeList1()
{
SetModified();
}
void CPPageExternalFilters::OnBnClickedRadio()
{
UpdateData();
FilterOverride* f = GetCurFilter();
if (f && f->iLoadType != m_iLoadType) {
f->iLoadType = m_iLoadType;
SetModified();
}
}
void CPPageExternalFilters::OnEnChangeEdit1()
{
UpdateData();
if (FilterOverride* f = GetCurFilter()) {
DWORD dw;
if (m_dwMerit.GetDWORD(dw) && f->dwMerit != dw) {
f->dwMerit = dw;
SetModified();
}
}
}
void CPPageExternalFilters::OnNMDblclkTree2(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
if (FilterOverride* f = GetCurFilter()) {
HTREEITEM node = m_tree.GetSelectedItem();
if (!node) {
return;
}
POSITION pos = (POSITION)m_tree.GetItemData(node);
if (!pos) {
return;
}
f->guids.GetNext(pos);
if (!pos) {
return;
}
CAtlArray guids;
SetupSubTypes(guids);
CSelectMediaType dlg(guids, f->guids.GetAt(pos), this);
if (dlg.DoModal() == IDOK) {
f->guids.SetAt(pos, dlg.m_guid);
m_tree.SetItemText(node, GetMediaTypeName(dlg.m_guid));
SetModified();
}
}
}
void CPPageExternalFilters::OnTVNKeyDownTree2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast(pNMHDR);
if (pTVKeyDown->wVKey == VK_DELETE) {
OnDeleteType();
}
*pResult = 0;
}
void CPPageExternalFilters::OnDropFiles(HDROP hDropInfo)
{
SetActiveWindow();
UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
for (UINT iFile = 0; iFile < nFiles; iFile++) {
TCHAR szFileName[_MAX_PATH];
::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
CFilterMapper2 fm2(false);
fm2.Register(szFileName);
while (!fm2.m_filters.IsEmpty()) {
if (FilterOverride* f = fm2.m_filters.RemoveHead()) {
CAutoPtr p(f);
int i = m_filters.AddString(f->name);
m_filters.SetItemDataPtr(i, m_pFilters.AddTail(p));
m_filters.SetCheck(i, 1);
if (fm2.m_filters.IsEmpty()) {
m_filters.SetCurSel(i);
OnLbnSelchangeList1();
}
SetModified();
}
}
}
::DragFinish(hDropInfo);
}