/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc 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.
*
* Mplayerc 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 "mplayerc.h"
#include "PPageExternalFilters.h"
#include "ComPropertySheet.h"
#include "RegFilterChooserDlg.h"
#include "SelectMediaType.h"
#include "FGFilter.h"
#include
#include
#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);
}
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);
}
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_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_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_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_WM_DROPFILES()
END_MESSAGE_MAP()
// CPPageExternalFilters message handlers
BOOL CPPageExternalFilters::OnInitDialog()
{
__super::OnInitDialog();
DragAcceptFiles(TRUE);
AppSettings& s = AfxGetAppSettings();
m_pFilters.RemoveAll();
POSITION pos = s.filters.GetHeadPosition();
while(pos)
{
CAutoPtr f(DNew FilterOverride(s.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.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.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();
}
}
}
}
}
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();
}
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();
}
}
}
}
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(_T("Already on the list!"));
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);
}
}
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(_T("Already on the list!"));
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);
}
}
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);
}
}
}
}
void CPPageExternalFilters::OnResetTypes()
{
if(FilterOverride* f = GetCurFilter())
{
f->guids.RemoveAll();
f->guids.AddTailList(&f->backup);
m_pLastSelFilter = NULL;
OnLbnSelchangeList1();
}
}
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::OnBnClickedRadio()
{
UpdateData();
if(FilterOverride* f = GetCurFilter())
f->iLoadType = m_iLoadType;
}
void CPPageExternalFilters::OnEnChangeEdit1()
{
UpdateData();
if(FilterOverride* f = GetCurFilter())
{
DWORD dw;
if(m_dwMerit.GetDWORD(dw))
f->dwMerit = dw;
}
}
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));
}
}
}
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();
}
}
}
}
::DragFinish(hDropInfo);
}