803 lines
19 KiB
C++
803 lines
19 KiB
C++
|
#include "shellprv.h"
|
||
|
#include "ids.h"
|
||
|
|
||
|
#include "apdlg.h"
|
||
|
#include "hwcmmn.h"
|
||
|
|
||
|
#include "mtpt.h"
|
||
|
|
||
|
static const DWORD s_rgdwHelpIDsArray[] =
|
||
|
{
|
||
|
IDC_AP_TOPTEXT, IDH_SELECT_CONTENT_TYPE,
|
||
|
IDC_AP_LIST, IDH_SELECT_CONTENT_TYPE,
|
||
|
IDC_AP_DEFAULTHANDLER, IDH_SELECT_ACTION,
|
||
|
IDC_AP_LIST_ACTIONS, IDH_SELECT_ACTION,
|
||
|
IDC_AP_PROMPTEACHTIME, IDH_PROMPT_ME_EACH_TIME,
|
||
|
IDC_AP_NOACTION, IDH_TAKE_NO_ACTION,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
static const DWORD g_rgdwContentTypes[] =
|
||
|
{
|
||
|
CT_AUTOPLAYMUSIC ,
|
||
|
CT_AUTOPLAYPIX ,
|
||
|
CT_AUTOPLAYMOVIE ,
|
||
|
CT_AUTOPLAYMIXEDCONTENT ,
|
||
|
CT_CDAUDIO ,
|
||
|
CT_DVDMOVIE ,
|
||
|
CT_BLANKCDR , // could also have been: CT_BLANKCDRW
|
||
|
};
|
||
|
|
||
|
#define COL_ACTION 0
|
||
|
#define COL_PROVIDER 1
|
||
|
|
||
|
const UINT c_auTileColumns[] = {COL_ACTION, COL_PROVIDER};
|
||
|
const UINT c_auTileSubItems[] = {COL_PROVIDER};
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_InitListViewActions()
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(_hwnd, IDC_AP_LIST_ACTIONS);
|
||
|
|
||
|
HRESULT hr = _uilListViewActions.Init(hwndList);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _uilListViewActions.InitTileInfo(c_auTileSubItems, ARRAYSIZE(c_auTileSubItems));
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
RECT rc = {0};
|
||
|
LVTILEVIEWINFO lvtvi = {0};
|
||
|
HIMAGELIST himagelist;
|
||
|
|
||
|
ListView_SetView(hwndList, LV_VIEW_TILE);
|
||
|
|
||
|
for (int i = 0; i < ARRAYSIZE(c_auTileColumns); ++i)
|
||
|
{
|
||
|
LVCOLUMN lvcolumn = {0};
|
||
|
|
||
|
lvcolumn.mask = LVCF_SUBITEM;
|
||
|
lvcolumn.iSubItem = c_auTileColumns[i];
|
||
|
ListView_InsertColumn(hwndList, i, &lvcolumn);
|
||
|
}
|
||
|
|
||
|
GetClientRect(hwndList, &rc);
|
||
|
|
||
|
lvtvi.cbSize = sizeof(lvtvi);
|
||
|
lvtvi.dwMask = LVTVIM_TILESIZE | LVTVIM_COLUMNS;
|
||
|
lvtvi.dwFlags = LVTVIF_FIXEDWIDTH;
|
||
|
|
||
|
// Leave room for the scroll bar when setting tile sizes or listview gets screwed up.
|
||
|
lvtvi.sizeTile.cx = ((rc.right - rc.left) - GetSystemMetrics(SM_CXVSCROLL));
|
||
|
lvtvi.cLines = ARRAYSIZE(c_auTileSubItems);
|
||
|
ListView_SetTileViewInfo(hwndList, &lvtvi);
|
||
|
|
||
|
Shell_GetImageLists(&himagelist, NULL);
|
||
|
|
||
|
if (himagelist)
|
||
|
{
|
||
|
ListView_SetImageList(hwndList, himagelist, LVSIL_NORMAL);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_FillListViewActions(CContentTypeData* pdata)
|
||
|
{
|
||
|
HRESULT hr = _uilListViewActions.ResetContent();
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
int c = pdata->GetHandlerCount();
|
||
|
if (c)
|
||
|
{
|
||
|
for (int i = 0; SUCCEEDED(hr) && (i < c); ++i)
|
||
|
{
|
||
|
CHandlerData* phandlerdata = pdata->GetHandlerData(i);
|
||
|
|
||
|
if (phandlerdata)
|
||
|
{
|
||
|
CHandlerLVItem* puidata = new CHandlerLVItem();
|
||
|
|
||
|
if (puidata)
|
||
|
{
|
||
|
hr = puidata->InitData(phandlerdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _uilListViewActions.AddItem(puidata);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
delete puidata;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
phandlerdata->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_fAtLeastOneAction = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// disable the listview and its radio button
|
||
|
_fAtLeastOneAction = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_UpdateRestoreButton(BOOL fPromptEachTime)
|
||
|
{
|
||
|
BOOL fEnable;
|
||
|
|
||
|
if (fPromptEachTime)
|
||
|
{
|
||
|
fEnable = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fEnable = TRUE;
|
||
|
}
|
||
|
|
||
|
EnableWindow(GetDlgItem(_hwnd, IDC_AP_RESTOREDEFAULTS), fEnable);
|
||
|
|
||
|
return fEnable;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_UpdateLowerPane()
|
||
|
{
|
||
|
CContentTypeData* pdata;
|
||
|
HRESULT hr = _uilListView.GetSelectedItemData(&pdata);
|
||
|
|
||
|
_fIgnoreListViewItemStateChanges = TRUE;
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
BOOL fPromptEachTime = !lstrcmpi(pdata->_pszHandlerDefault, TEXT("MSPromptEachTime"));
|
||
|
|
||
|
if (!fPromptEachTime)
|
||
|
{
|
||
|
if (!(pdata->_dwHandlerDefaultFlags & HANDLERDEFAULT_USERCHOSENDEFAULT))
|
||
|
{
|
||
|
// There *NO* User Chosen Default
|
||
|
fPromptEachTime = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// There is a User Chosen Default
|
||
|
if (pdata->_dwHandlerDefaultFlags &
|
||
|
HANDLERDEFAULT_MORERECENTHANDLERSINSTALLED)
|
||
|
{
|
||
|
// But there's also more recent apps
|
||
|
fPromptEachTime = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hr = _FillListViewActions(pdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _SelectListViewActionsItem(pdata->_pszHandlerDefault);
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _SelectRadioButton(fPromptEachTime);
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _UpdateRestoreButton(fPromptEachTime);
|
||
|
}
|
||
|
|
||
|
pdata->Release();
|
||
|
}
|
||
|
|
||
|
_fIgnoreListViewItemStateChanges = FALSE;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_UpdateApplyButton()
|
||
|
{
|
||
|
if (_dlmanager.IsDirty())
|
||
|
{
|
||
|
PropSheet_Changed(GetParent(_hwnd), _hwnd);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PropSheet_UnChanged(GetParent(_hwnd), _hwnd);
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT _SetHandlerDefault(LPWSTR* ppszHandlerDefault, LPCWSTR pszHandler)
|
||
|
{
|
||
|
LPWSTR pszHandlerNew;
|
||
|
HRESULT hr = SHStrDup(pszHandler, &pszHandlerNew);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (*ppszHandlerDefault)
|
||
|
{
|
||
|
CoTaskMemFree(*ppszHandlerDefault);
|
||
|
}
|
||
|
|
||
|
*ppszHandlerDefault = pszHandlerNew;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_SelectRadioButton(BOOL fPromptEachTime)
|
||
|
{
|
||
|
CContentTypeData* pdata;
|
||
|
HRESULT hr = _uilListView.GetSelectedItemData(&pdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
int iCtrl;
|
||
|
BOOL fEnableListView = FALSE;
|
||
|
|
||
|
if (fPromptEachTime)
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), TEXT("MSPromptEachTime"));
|
||
|
|
||
|
iCtrl = IDC_AP_PROMPTEACHTIME;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fEnableListView = TRUE;
|
||
|
|
||
|
CHandlerData* phandlerdata;
|
||
|
hr = _uilListViewActions.GetSelectedItemData(&phandlerdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), phandlerdata->_pszHandler);
|
||
|
|
||
|
phandlerdata->Release();
|
||
|
}
|
||
|
|
||
|
iCtrl = IDC_AP_DEFAULTHANDLER;
|
||
|
}
|
||
|
|
||
|
Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_DEFAULTHANDLER), (IDC_AP_DEFAULTHANDLER == iCtrl));
|
||
|
Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_PROMPTEACHTIME), (IDC_AP_PROMPTEACHTIME == iCtrl));
|
||
|
|
||
|
EnableWindow(GetDlgItem(_hwnd, IDC_AP_LIST_ACTIONS), fEnableListView);
|
||
|
|
||
|
pdata->Release();
|
||
|
|
||
|
hr = _UpdateApplyButton();
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_SelectListViewActionsItem(LPCWSTR pszHandlerDefault)
|
||
|
{
|
||
|
HRESULT hr = S_FALSE;
|
||
|
LVITEM lvitem = {0};
|
||
|
int iItemToSelect = 0;
|
||
|
HWND hwndList = GetDlgItem(_hwnd, IDC_AP_LIST_ACTIONS);
|
||
|
|
||
|
if (pszHandlerDefault)
|
||
|
{
|
||
|
int c = ListView_GetItemCount(hwndList);
|
||
|
|
||
|
if (c)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < c; ++i)
|
||
|
{
|
||
|
lvitem.mask = LVIF_PARAM;
|
||
|
lvitem.iItem = i;
|
||
|
|
||
|
if (ListView_GetItem(hwndList, &lvitem))
|
||
|
{
|
||
|
CHandlerLVItem* phandleruidata = (CHandlerLVItem*)lvitem.lParam;
|
||
|
|
||
|
if (phandleruidata)
|
||
|
{
|
||
|
CHandlerData* phandlerdata = phandleruidata->GetData();
|
||
|
|
||
|
if (phandlerdata)
|
||
|
{
|
||
|
if (!lstrcmp(phandlerdata->_pszHandler,
|
||
|
pszHandlerDefault))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
phandlerdata->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (i == c)
|
||
|
{
|
||
|
i = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
iItemToSelect = i;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Select first one
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
lvitem.mask = LVIF_STATE;
|
||
|
lvitem.iItem = iItemToSelect;
|
||
|
lvitem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
|
||
|
lvitem.state = LVIS_SELECTED | LVIS_FOCUSED;
|
||
|
|
||
|
ListView_SetItem(hwndList, &lvitem);
|
||
|
ListView_EnsureVisible(hwndList, lvitem.iItem, FALSE);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::_OnApply()
|
||
|
{
|
||
|
if (_dlmanager.IsDirty())
|
||
|
{
|
||
|
// Should we get the return value, and if so, why?
|
||
|
_dlmanager.Commit();
|
||
|
}
|
||
|
|
||
|
return PSNRET_NOERROR;
|
||
|
}
|
||
|
|
||
|
// Listview Actions
|
||
|
HRESULT CAutoPlayDlg::_OnListViewActionsSelChange()
|
||
|
{
|
||
|
CHandlerData* phandlerdata;
|
||
|
HRESULT hr = _uilListViewActions.GetSelectedItemData(&phandlerdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
CContentTypeData* pdata;
|
||
|
hr = _uilListView.GetSelectedItemData(&pdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), phandlerdata->_pszHandler);
|
||
|
|
||
|
pdata->Release();
|
||
|
}
|
||
|
|
||
|
phandlerdata->Release();
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _UpdateApplyButton();
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
// Radio buttons
|
||
|
HRESULT CAutoPlayDlg::_OnRestoreDefault()
|
||
|
{
|
||
|
CContentTypeData* pdata;
|
||
|
HRESULT hr = _uilListView.GetSelectedItemData(&pdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), TEXT("MSPromptEachTime"));
|
||
|
|
||
|
_SelectRadioButton(TRUE);
|
||
|
|
||
|
hr = _UpdateApplyButton();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_UpdateRestoreButton(TRUE);
|
||
|
}
|
||
|
|
||
|
pdata->Release();
|
||
|
|
||
|
SetFocus(GetNextDlgTabItem(_hwnd, GetDlgItem(_hwnd, IDC_AP_RESTOREDEFAULTS), FALSE /*next ctrl*/));
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_OnRadio(int iButton)
|
||
|
{
|
||
|
CContentTypeData* pdata;
|
||
|
HRESULT hr = _uilListView.GetSelectedItemData(&pdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(_hwnd, IDC_AP_LIST_ACTIONS);
|
||
|
|
||
|
if (IDC_AP_DEFAULTHANDLER == iButton)
|
||
|
{
|
||
|
CHandlerData* phandlerdata;
|
||
|
|
||
|
EnableWindow(hwndList, TRUE);
|
||
|
|
||
|
hr = _uilListViewActions.GetSelectedItemData(&phandlerdata);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), phandlerdata->_pszHandler);
|
||
|
|
||
|
phandlerdata->Release();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_SetHandlerDefault(&(pdata->_pszHandlerDefault), TEXT("MSPromptEachTime"));
|
||
|
|
||
|
EnableWindow(hwndList, FALSE);
|
||
|
}
|
||
|
|
||
|
hr = _UpdateApplyButton();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
_UpdateRestoreButton(!lstrcmpi(pdata->_pszHandlerDefault, TEXT("MSPromptEachTime")));
|
||
|
}
|
||
|
|
||
|
pdata->Release();
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnInitDialog(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
HRESULT hr = _InitDataObjects();
|
||
|
|
||
|
_fIgnoreListViewItemStateChanges = TRUE;
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _InitListView();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _FillListView();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _InitListViewActions();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _uilListView.SelectFirstItem();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _UpdateLowerPane();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_fIgnoreListViewItemStateChanges = FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnNotify(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
LRESULT lRes = FALSE;
|
||
|
|
||
|
LPNMHDR pNMHDR = (LPNMHDR)lParam;
|
||
|
UINT_PTR idFrom = pNMHDR->idFrom;
|
||
|
UINT uCode = pNMHDR->code;
|
||
|
|
||
|
switch (uCode)
|
||
|
{
|
||
|
case PSN_APPLY:
|
||
|
lRes = _OnApply();
|
||
|
|
||
|
CBaseDlg::OnNotify(wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
switch (idFrom)
|
||
|
{
|
||
|
case IDC_AP_LIST_ACTIONS:
|
||
|
|
||
|
if (!_fIgnoreListViewItemStateChanges)
|
||
|
{
|
||
|
NMLISTVIEW* pNMLV = (NMLISTVIEW*)pNMHDR;
|
||
|
|
||
|
if (LVN_ITEMCHANGED == uCode)
|
||
|
{
|
||
|
// Is a new item being selected?
|
||
|
if ((pNMLV->uChanged & LVIF_STATE) &&
|
||
|
pNMLV->uNewState & LVIS_SELECTED)
|
||
|
{
|
||
|
_OnListViewActionsSelChange();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lRes = CBaseDlg::OnNotify(wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
lRes = CBaseDlg::OnNotify(wParam, lParam);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return lRes;
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
int iCtl = LOWORD(wParam);
|
||
|
int iNot = HIWORD(wParam);
|
||
|
|
||
|
switch (iCtl)
|
||
|
{
|
||
|
case IDC_AP_DEFAULTHANDLER:
|
||
|
case IDC_AP_PROMPTEACHTIME:
|
||
|
if (BN_CLICKED == iNot)
|
||
|
{
|
||
|
_OnRadio(iCtl);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_AP_LIST:
|
||
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||
|
{
|
||
|
_UpdateLowerPane();
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case IDC_AP_RESTOREDEFAULTS:
|
||
|
if (BN_CLICKED == iNot)
|
||
|
{
|
||
|
_OnRestoreDefault();
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return CBaseDlg::OnCommand(wParam, lParam);
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnDestroy(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
_uilListView.ResetContent();
|
||
|
_uilListViewActions.ResetContent();
|
||
|
|
||
|
return CBaseDlg::OnDestroy(wParam, lParam);
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnHelp(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
HWND hwndItem = (HWND)((LPHELPINFO)lParam)->hItemHandle;
|
||
|
BOOL ret = WinHelp(hwndItem, TEXT("filefold.hlp"), HELP_WM_HELP, (ULONG_PTR)(LPTSTR)s_rgdwHelpIDsArray);
|
||
|
if (!ret)
|
||
|
{
|
||
|
return CBaseDlg::OnHelp(wParam, lParam);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
LRESULT CAutoPlayDlg::OnContextMenu(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
BOOL lRes=FALSE;
|
||
|
|
||
|
if (HTCLIENT == (int)SendMessage(_hwnd, WM_NCHITTEST, 0, lParam))
|
||
|
{
|
||
|
POINT pt;
|
||
|
HWND hwndItem = NULL;
|
||
|
int iCtrlID = 0;
|
||
|
|
||
|
pt.x = GET_X_LPARAM(lParam);
|
||
|
pt.y = GET_Y_LPARAM(lParam);
|
||
|
ScreenToClient(_hwnd, &pt);
|
||
|
|
||
|
hwndItem = ChildWindowFromPoint(_hwnd, pt);
|
||
|
iCtrlID = GetDlgCtrlID(hwndItem);
|
||
|
|
||
|
lRes = WinHelp((HWND)wParam, TEXT("filefold.hlp"), HELP_CONTEXTMENU, (ULONG_PTR)(LPTSTR)s_rgdwHelpIDsArray);
|
||
|
if (!lRes)
|
||
|
{
|
||
|
return CBaseDlg::OnContextMenu(wParam, lParam);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lRes = FALSE;
|
||
|
}
|
||
|
|
||
|
return lRes;
|
||
|
}
|
||
|
|
||
|
CAutoPlayDlg::CAutoPlayDlg() : CBaseDlg((ULONG_PTR)s_rgdwHelpIDsArray)
|
||
|
{
|
||
|
ASSERT(ARRAYSIZE(_rgpContentTypeData) >= ARRAYSIZE(g_rgdwContentTypes));
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::Init(LPWSTR pszDrive, int iDriveType)
|
||
|
{
|
||
|
_iDriveType = iDriveType;
|
||
|
|
||
|
return StringCchCopy(_szDrive, ARRAYSIZE(_szDrive), pszDrive);
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_InitDataObjects()
|
||
|
{
|
||
|
HRESULT hr = S_FALSE;
|
||
|
BOOL fIsCDDrive = FALSE;
|
||
|
DWORD dwDriveCapabilities = HWDDC_CDROM;
|
||
|
DWORD dwMediaCapabilities = HWDMC_CDROM;
|
||
|
|
||
|
CMountPoint* pmtpt = CMountPoint::GetMountPoint(_szDrive);
|
||
|
|
||
|
if (pmtpt)
|
||
|
{
|
||
|
fIsCDDrive = pmtpt->IsCDROM();
|
||
|
|
||
|
if (fIsCDDrive)
|
||
|
{
|
||
|
hr = pmtpt->GetCDInfo(&dwDriveCapabilities, &dwMediaCapabilities);
|
||
|
}
|
||
|
|
||
|
pmtpt->Release();
|
||
|
}
|
||
|
|
||
|
for (DWORD dw = 0; SUCCEEDED(hr) && (dw < ARRAYSIZE(g_rgdwContentTypes));
|
||
|
++dw)
|
||
|
{
|
||
|
BOOL fAddOption = TRUE;
|
||
|
|
||
|
if (fIsCDDrive)
|
||
|
{
|
||
|
if ((g_rgdwContentTypes[dw] & CT_DVDMOVIE) &&
|
||
|
!(dwDriveCapabilities & (HWDDC_DVDROM | HWDDC_DVDRECORDABLE | HWDDC_DVDREWRITABLE)))
|
||
|
{
|
||
|
fAddOption = FALSE;
|
||
|
}
|
||
|
else if ((g_rgdwContentTypes[dw] & CT_BLANKCDR) &&
|
||
|
!(dwDriveCapabilities & (HWDDC_CDRECORDABLE | HWDDC_CDREWRITABLE)))
|
||
|
{
|
||
|
fAddOption = FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (g_rgdwContentTypes[dw] &
|
||
|
(CT_CDAUDIO | CT_DVDMOVIE | CT_BLANKCDR))
|
||
|
{
|
||
|
fAddOption = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (fAddOption)
|
||
|
{
|
||
|
_rgpContentTypeData[dw] = new CContentTypeData();
|
||
|
|
||
|
if (_rgpContentTypeData[dw])
|
||
|
{
|
||
|
hr = (_rgpContentTypeData[dw])->Init(_szDrive, g_rgdwContentTypes[dw]);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _dlmanager.AddDataObject(_rgpContentTypeData[dw]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Let's just skip this one, do not go out of the loop and
|
||
|
// abort the whole initialization.
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_InitListView()
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(_hwnd, IDC_AP_LIST);
|
||
|
HRESULT hr = _uilListView.Init(hwndList);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
Shell_GetImageLists(NULL, &_himagelist);
|
||
|
|
||
|
if (_himagelist)
|
||
|
{
|
||
|
SendMessage(hwndList, CBEM_SETIMAGELIST, 0, (LPARAM)_himagelist);
|
||
|
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CAutoPlayDlg::_FillListView()
|
||
|
{
|
||
|
HRESULT hr = S_FALSE;
|
||
|
|
||
|
for (DWORD dw = 0; SUCCEEDED(hr) && (dw < ARRAYSIZE(_rgpContentTypeData));
|
||
|
++dw)
|
||
|
{
|
||
|
if (_rgpContentTypeData[dw])
|
||
|
{
|
||
|
CContentTypeCBItem* pctlvitem = new CContentTypeCBItem();
|
||
|
|
||
|
if (pctlvitem)
|
||
|
{
|
||
|
hr = pctlvitem->InitData(_rgpContentTypeData[dw]);
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = _uilListView.AddItem(pctlvitem);
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
{
|
||
|
delete pctlvitem;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
CAutoPlayDlg::~CAutoPlayDlg()
|
||
|
{
|
||
|
for (DWORD dw = 0; dw < ARRAYSIZE(_rgpContentTypeData); ++dw)
|
||
|
{
|
||
|
if (_rgpContentTypeData[dw])
|
||
|
{
|
||
|
(_rgpContentTypeData[dw])->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#ifdef AUTOPLAYDLG_LEAKPARANOIA
|
||
|
// If this is on, you cannot open two Autoplay dialogs (e.g.: Autoplay
|
||
|
// proppage and Autoplay prompt) at the same time and then close one.
|
||
|
// It will assert for sure when you close the first one.
|
||
|
ASSERT(!_DbgLocalAllocCount);
|
||
|
#endif
|
||
|
}
|
||
|
|