|
|
#include "shellprv.h"
#include "ids.h"
#include "apprmdlg.h"
#include "mtpt.h"
#include "hwcmmn.h"
#include "mixctnt.h"
static DWORD s_rgdwHelpIDsArray[] = { // Context Help IDs
IDC_AP_MXCT_TOPICON, NO_HELP, IDC_AP_MXCT_TOPTEXT, NO_HELP, IDC_AP_MXCT_TOPTEXT2, NO_HELP, IDC_AP_MXCT_LIST, NO_HELP, IDC_AP_MXCT_CHECKBOX, NO_HELP, 0, 0 };
CBaseContentDlg::CBaseContentDlg() : CBaseDlg((ULONG_PTR)s_rgdwHelpIDsArray), _pszDeviceID(NULL), _hiconInfo(NULL), _hiconTop(NULL) {}
CBaseContentDlg::~CBaseContentDlg() { if (_pszDeviceID) { LocalFree((HLOCAL)_pszDeviceID); }
if (_hiconInfo) { DestroyIcon(_hiconInfo); }
if (_hiconTop) { DestroyIcon(_hiconTop); } }
HRESULT CBaseContentDlg::_SetHandler() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler));
phandlerdata->Release(); }
return hr; }
HRESULT CBaseContentDlg::Init(LPCWSTR pszDeviceID, LPCWSTR pszDeviceIDAlt, DWORD dwContentType, BOOL fCheckAlwaysDoThis) { HRESULT hr = E_INVALIDARG;
_fCheckAlwaysDoThis = fCheckAlwaysDoThis;
if (pszDeviceID) { _pszDeviceID = StrDup(pszDeviceID);
if (_pszDeviceID) { _szDeviceIDAlt[0] = 0;
if (pszDeviceIDAlt) { if (InRange(*pszDeviceIDAlt, 'a', 'z') || InRange(*pszDeviceIDAlt, 'A', 'Z')) { lstrcpyn(_szDeviceIDAlt, pszDeviceIDAlt, ARRAYSIZE(_szDeviceIDAlt));
_dwContentType = dwContentType;
hr = _GetContentTypeHandler(dwContentType, _szContentTypeHandler, ARRAYSIZE(_szContentTypeHandler)); } }
hr = S_OK; } else { hr = E_OUTOFMEMORY; } } return hr; }
#define COL_ACTION 0
#define COL_PROVIDER 1
const UINT c_auTileColumns[] = {COL_ACTION, COL_PROVIDER}; const UINT c_auTileSubItems[] = {COL_PROVIDER};
HRESULT CBaseContentDlg::_InitListView() { HWND hwndList = GetDlgItem(_hwnd, IDC_AP_MXCT_LIST);
HRESULT hr = _uilListView.Init(hwndList);
if (SUCCEEDED(hr)) { hr = _uilListView.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(LVTILEVIEWINFO); 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; }
LRESULT CBaseContentDlg::OnInitDialog(WPARAM wParam, LPARAM lParam) { HRESULT hr = _InitListView();
if (SUCCEEDED(hr)) { hr = _FillListView();
if (SUCCEEDED(hr)) { hr = _InitStaticsCommon();
if (SUCCEEDED(hr)) { hr = _InitStatics();
if (SUCCEEDED(hr)) { hr = _InitSelections(); } } } }
if (_szDeviceIDAlt[0]) { _SetAutoplayPromptHWND(_szDeviceIDAlt, _hwnd); }
return TRUE; }
LRESULT CBaseContentDlg::OnNotify(WPARAM wParam, LPARAM lParam) { LRESULT lRes = FALSE;
LPNMHDR pNMHDR = (NMHDR *)lParam; UINT_PTR idFrom = pNMHDR->idFrom; UINT uCode = pNMHDR->code;
switch (idFrom) { case IDC_AP_MXCT_LIST:
if (LVN_ITEMCHANGED == uCode) { NMLISTVIEW* pNMLV = (NMLISTVIEW*)pNMHDR;
// Is a new item being selected/unselected?
if (pNMLV->uChanged & LVIF_STATE) { // Yes
_OnListSelChange(); } } else if (NM_DBLCLK == uCode) { OnOK(0); }
lRes = CBaseDlg::OnNotify(wParam, lParam); break;
default: lRes = CBaseDlg::OnNotify(wParam, lParam); break; }
return lRes; }
LRESULT CBaseContentDlg::OnDestroy(WPARAM wParam, LPARAM lParam) { _uilListView.ResetContent();
return CBaseDlg::OnDestroy(wParam, lParam); }
LRESULT CBaseContentDlg::OnOK(WORD wNotif) { // Wait cursor...
EndDialog(_hwnd, IDOK); return FALSE; }
LRESULT CBaseContentDlg::OnCancel(WORD wNotif) { EndDialog(_hwnd, IDCANCEL);
return FALSE; }
HRESULT CBaseContentDlg::_InitStaticsCommon() { // Initialize _szDeviceName to something
HRESULT hr = _InitDeviceName();
if (SUCCEEDED(hr)) { SetWindowText(_hwnd, _szDeviceName); }
if (_fCheckAlwaysDoThis) { Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis); }
if (_szDeviceIDAlt[0]) { // Initialize _szDeviceName to something
CMountPoint* pmtpt = CMountPoint::GetMountPoint(_szDeviceIDAlt);
if (pmtpt) { WCHAR szIconLocation[MAX_PATH + 12]; int iIcon = pmtpt->GetIcon(szIconLocation, ARRAYSIZE(szIconLocation));
if (SUCCEEDED(hr)) { if (!szIconLocation[0]) { lstrcpy(szIconLocation, TEXT("shell32.dll")); }
int iImage = Shell_GetCachedImageIndex(szIconLocation, iIcon, 0);
HIMAGELIST himagelist;
if ((-1 != iImage) && Shell_GetImageLists(&himagelist, NULL)) { _hiconTop = ImageList_GetIcon(himagelist, iImage, ILD_TRANSPARENT);
SendDlgItemMessage(_hwnd, IDC_AP_MXCT_TOPICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop); } }
pmtpt->Release(); } }
return hr; }
HRESULT CBaseContentDlg::_InitDeviceName() { HRESULT hr = E_FAIL;
if (_szDeviceIDAlt[0]) { CMountPoint* pmtpt = CMountPoint::GetMountPoint(_szDeviceIDAlt);
if (pmtpt) { hr = pmtpt->GetDisplayName(_szDeviceName, ARRAYSIZE(_szDeviceName));
pmtpt->Release(); } } if (FAILED(hr)) { GetWindowText(_hwnd, _szDeviceName, ARRAYSIZE(_szDeviceName)); hr = S_FALSE; }
return hr; }
///////////////////////////////////////////////////////////////////////////////
CHWContentPromptDlg::CHWContentPromptDlg() : CBaseContentDlg() {} CHWContentPromptDlg::~CHWContentPromptDlg() {}
HRESULT CHWContentPromptDlg::_InitDataObjects() { HRESULT hr = _data.Init(_pszDeviceID, _dwContentType);
if (SUCCEEDED(hr)) { hr = _dlmanager.AddDataObject(&_data); }
return hr; }
HRESULT CHWContentPromptDlg::_FillListView() { HRESULT hr = _InitDataObjects();
if (SUCCEEDED(hr)) { int c = _data.GetHandlerCount(); for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CHandlerData* phandlerdata = _data.GetHandlerData(i); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem();
if (puidata) { hr = puidata->InitData(phandlerdata);
if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); }
if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; }
phandlerdata->Release(); } } }
return hr; }
HRESULT CHWContentPromptDlg::_InitStatics() { // Set content icon
if (_hiconTop) { DestroyIcon(_hiconTop); }
_hiconTop = _GetIconFromIconLocation(_data._szIconLocation, FALSE);
SendDlgItemMessage(_hwnd, IDC_AP_MXCT_CONTENTICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop);
// Set content name
SetDlgItemText(_hwnd, IDC_AP_MXCT_CONTENTTYPE, _data._szIconLabel);
return S_OK; }
HRESULT CHWContentPromptDlg::_InitSelections() { HRESULT hr; if (_data._pszHandlerDefaultOriginal && *(_data._pszHandlerDefaultOriginal)) { hr = _uilListView.SelectItem(_data._pszHandlerDefaultOriginal); } else { hr = _uilListView.SelectFirstItem(); }
if (SUCCEEDED(hr)) { CHandlerData* phandlerdata;
hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler));
_SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler);
phandlerdata->Release(); } }
Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis);
return hr; }
HRESULT CHWContentPromptDlg::_UpdateHandlerSettings() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler);
phandlerdata->Release(); }
return hr; }
HRESULT CHWContentPromptDlg::_OnListSelChange() { return _UpdateHandlerSettings(); }
LRESULT CHWContentPromptDlg::OnOK(WORD wNotif) { if (BST_CHECKED == Button_GetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX))) { _SaveSettings(FALSE);
// return value????
} else { _SaveSettings(TRUE); }
_SetHandler();
// Do default processing
return CBaseContentDlg::OnOK(wNotif); }
HRESULT CHWContentPromptDlg::_SaveSettings(BOOL fSoftCommit) { _data._fSoftCommit = fSoftCommit;
return _dlmanager.Commit(); }
CMixedContentDlg::CMixedContentDlg() : _dpaContentTypeData(NULL) { } CMixedContentDlg::~CMixedContentDlg() { if (_dpaContentTypeData) { int c = _dpaContentTypeData.GetPtrCount();
for (int i = 0; i < c; ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i); pdata->Release(); }
_dpaContentTypeData.Destroy(); } }
const DWORD c_rgdwContentTypeAutoplay[] = { CT_AUTOPLAYMUSIC, CT_AUTOPLAYPIX, CT_AUTOPLAYMOVIE, };
HRESULT CMixedContentDlg::_InitDataObjects() { HRESULT hr = _dpaContentTypeData.Create(4) ? S_OK : E_OUTOFMEMORY; if (SUCCEEDED(hr)) { for (DWORD dw = 0; dw < ARRAYSIZE(c_rgdwContentTypeAutoplay); ++dw) { if (_dwContentType & c_rgdwContentTypeAutoplay[dw]) { CContentTypeData* pdata = new CContentTypeData();
if (pdata) { hr = pdata->Init(_pszDeviceID, _dwContentType & c_rgdwContentTypeAutoplay[dw]);
if (SUCCEEDED(hr)) { if (-1 == _dpaContentTypeData.AppendPtr(pdata)) { hr = E_OUTOFMEMORY; } }
if (FAILED(hr)) { pdata->Release(); } } else { hr = E_OUTOFMEMORY; } } }
if (SUCCEEDED(hr)) { // Eliminate the duplicates. Go thru all the content types
// and then thru all their handlers and see if their would
// not be two duplicate handlers that were brought by two diff
// content type. E.g.: Open folder is registered for music,
// pictures and video
int cContentType = _dpaContentTypeData.GetPtrCount();
for (int iContentType = 0; iContentType < cContentType; ++iContentType) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(iContentType);
if (pdata) { int cHandler = pdata->GetHandlerCount(); for (int iHandler = 0; iHandler < cHandler; ++iHandler) { CHandlerData* phandlerdata = pdata->GetHandlerData(iHandler); if (phandlerdata) { for (int iContentTypeInner = 0; iContentTypeInner < cContentType; ++iContentTypeInner) { BOOL fExitInnerLoop = FALSE;
// Cannot have duplicate handler within same content type
if (iContentTypeInner != iContentType) { CContentTypeData* pdataInner = _dpaContentTypeData.GetPtr(iContentTypeInner); if (pdataInner) { int cHandlerInner = pdataInner->GetHandlerCount(); for (int iHandlerInner = 0; !fExitInnerLoop && (iHandlerInner < cHandlerInner); ++iHandlerInner) { CHandlerData* phandlerdataInner = pdataInner->GetHandlerData(iHandlerInner); if (phandlerdataInner) { if (!lstrcmp(phandlerdataInner->_pszHandler, phandlerdata->_pszHandler)) { pdataInner->RemoveHandler(iHandlerInner); // Can be only one duplicate for a
// handler within another content type
fExitInnerLoop = TRUE; } phandlerdataInner->Release(); } } } } } phandlerdata->Release(); } } } } } } else { hr = E_OUTOFMEMORY; }
return hr; }
HRESULT CMixedContentDlg::_FillListView() { HRESULT hr = _InitDataObjects();
if (SUCCEEDED(hr)) { if (_dpaContentTypeData) { int c = _dpaContentTypeData.GetPtrCount();
for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i);
if (pdata) { pdata->AddRef();
int cHandler = pdata->GetHandlerCount(); for (int j = 0; SUCCEEDED(hr) && (j < cHandler); ++j) { CHandlerData* phandlerdata = pdata->GetHandlerData(j); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem();
if (puidata) { hr = puidata->InitData(phandlerdata);
if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); }
if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; }
phandlerdata->Release(); } }
pdata->Release(); } } } }
return hr; }
HRESULT CMixedContentDlg::_InitStatics() { return S_OK; }
HRESULT CMixedContentDlg::_InitSelections() { HRESULT hr = _uilListView.SelectFirstItem();
if (SUCCEEDED(hr)) { CHandlerData* phandlerdata;
hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler));
phandlerdata->Release(); } }
return hr; }
HRESULT CMixedContentDlg::_OnListSelChange() { return S_OK; }
LRESULT CMixedContentDlg::OnOK(WORD wNotif) { _SetHandler();
if (_dpaContentTypeData) { BOOL fFound = FALSE; int c = _dpaContentTypeData.GetPtrCount();
for (int i = 0; !fFound && (i < c); ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i);
if (pdata) { pdata->AddRef(); int cHandler = pdata->GetHandlerCount(); for (int j = 0; !fFound && (j < cHandler); ++j) { CHandlerData* phandlerdata = pdata->GetHandlerData(j); if (phandlerdata) { if (!lstrcmp(phandlerdata->_pszHandler, _szHandler)) { lstrcpyn(_szContentTypeHandler, pdata->_szContentTypeHandler, ARRAYSIZE(_szContentTypeHandler));
fFound = TRUE; }
phandlerdata->Release(); } }
pdata->Release(); } } } // Do default processing
return CBaseContentDlg::OnOK(wNotif); } ///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
CNoContentDlg::CNoContentDlg() : CBaseContentDlg() {} CNoContentDlg::~CNoContentDlg() {}
HRESULT CNoContentDlg::_InitDataObjects() { HRESULT hr = _data.Init(_pszDeviceID);
if (SUCCEEDED(hr)) { hr = _dlmanager.AddDataObject(&_data); }
_SetAutoplayPromptHWND(_pszDeviceID, _hwnd);
return hr; }
HRESULT CNoContentDlg::_FillListView() { HRESULT hr = _InitDataObjects();
if (SUCCEEDED(hr)) { int c = _data.GetHandlerCount(); for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CHandlerData* phandlerdata = _data.GetHandlerData(i); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem();
if (puidata) { hr = puidata->InitData(phandlerdata);
if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); }
if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; }
phandlerdata->Release(); } } }
return hr; }
HRESULT CNoContentDlg::_InitStatics() { if (_hiconTop) { DestroyIcon(_hiconTop); }
// Set device icon
_hiconTop = _GetIconFromIconLocation(_data._pszIconLocation, TRUE);
SendDlgItemMessage(_hwnd, IDC_AP_MXCT_TOPICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop); // Set device name
SetWindowText(_hwnd, _data._pszIconLabel);
return S_OK; }
HRESULT CNoContentDlg::_InitSelections() { HRESULT hr; if (_data._pszHandlerDefaultOriginal && *(_data._pszHandlerDefaultOriginal)) { hr = _uilListView.SelectItem(_data._pszHandlerDefaultOriginal); } else { hr = _uilListView.SelectFirstItem(); }
if (SUCCEEDED(hr)) { CHandlerData* phandlerdata;
hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler));
_SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler);
phandlerdata->Release(); } }
Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis);
return hr; }
HRESULT CNoContentDlg::_UpdateHandlerSettings() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata);
if (SUCCEEDED(hr)) { _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler);
phandlerdata->Release(); }
return hr; }
HRESULT CNoContentDlg::_OnListSelChange() { return _UpdateHandlerSettings(); }
LRESULT CNoContentDlg::OnOK(WORD wNotif) { if (BST_CHECKED == Button_GetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX))) { _SaveSettings(FALSE);
// return value????
} else { _SaveSettings(TRUE); }
_SetHandler();
// Do default processing
return CBaseContentDlg::OnOK(wNotif); }
HRESULT CNoContentDlg::_SaveSettings(BOOL fSoftCommit) { _data._fSoftCommit = fSoftCommit;
return _dlmanager.Commit(); }
|