[SHELL32]

- Remove lots of typecasts in CDefView
- Use strict typed itemids

svn path=/branches/shell-experiments/; revision=65185
This commit is contained in:
Giannis Adamopoulos 2014-11-02 17:49:28 +00:00
parent c472e29a70
commit a099e6c7a2

View file

@ -92,7 +92,7 @@ class CDefView :
BOOL m_menusLoaded; BOOL m_menusLoaded;
UINT m_uState; UINT m_uState;
UINT m_cidl; UINT m_cidl;
LPITEMIDLIST *m_apidl; PCUITEMID_CHILD_ARRAY m_apidl;
LISTVIEW_SORT_INFO m_sortInfo; LISTVIEW_SORT_INFO m_sortInfo;
ULONG m_hNotify; /* change notification handle */ ULONG m_hNotify; /* change notification handle */
HACCEL m_hAccel; HACCEL m_hAccel;
@ -120,7 +120,7 @@ class CDefView :
CDefView(); CDefView();
~CDefView(); ~CDefView();
HRESULT WINAPI Initialize(IShellFolder *shellFolder); HRESULT WINAPI Initialize(IShellFolder *shellFolder);
HRESULT IncludeObject(LPCITEMIDLIST pidl); HRESULT IncludeObject(PCUITEMID_CHILD pidl);
HRESULT OnDefaultCommand(); HRESULT OnDefaultCommand();
HRESULT OnStateChange(UINT uFlags); HRESULT OnStateChange(UINT uFlags);
void CheckToolbar(); void CheckToolbar();
@ -130,10 +130,13 @@ class CDefView :
BOOL InitList(); BOOL InitList();
static INT CALLBACK CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData); static INT CALLBACK CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData);
static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData); static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData);
int LV_FindItemByPidl(LPCITEMIDLIST pidl);
BOOLEAN LV_AddItem(LPCITEMIDLIST pidl); PCUITEMID_CHILD _PidlByItem(int i);
BOOLEAN LV_DeleteItem(LPCITEMIDLIST pidl); PCUITEMID_CHILD _PidlByItem(LVITEM& lvItem);
BOOLEAN LV_RenameItem(LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew); int LV_FindItemByPidl(PCUITEMID_CHILD pidl);
BOOLEAN LV_AddItem(PCUITEMID_CHILD pidl);
BOOLEAN LV_DeleteItem(PCUITEMID_CHILD pidl);
BOOLEAN LV_RenameItem(PCUITEMID_CHILD pidlOld, PCUITEMID_CHILD pidlNew);
static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg); static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg);
HRESULT FillList(); HRESULT FillList();
HMENU BuildFileMenu(); HMENU BuildFileMenu();
@ -160,19 +163,19 @@ class CDefView :
virtual HRESULT STDMETHODCALLTYPE GetCurrentInfo(LPFOLDERSETTINGS pfs); virtual HRESULT STDMETHODCALLTYPE GetCurrentInfo(LPFOLDERSETTINGS pfs);
virtual HRESULT STDMETHODCALLTYPE AddPropertySheetPages(DWORD dwReserved, LPFNSVADDPROPSHEETPAGE pfn, LPARAM lparam); virtual HRESULT STDMETHODCALLTYPE AddPropertySheetPages(DWORD dwReserved, LPFNSVADDPROPSHEETPAGE pfn, LPARAM lparam);
virtual HRESULT STDMETHODCALLTYPE SaveViewState(); virtual HRESULT STDMETHODCALLTYPE SaveViewState();
virtual HRESULT STDMETHODCALLTYPE SelectItem(LPCITEMIDLIST pidlItem, SVSIF uFlags); virtual HRESULT STDMETHODCALLTYPE SelectItem(PCUITEMID_CHILD pidlItem, SVSIF uFlags);
virtual HRESULT STDMETHODCALLTYPE GetItemObject(UINT uItem, REFIID riid, void **ppv); virtual HRESULT STDMETHODCALLTYPE GetItemObject(UINT uItem, REFIID riid, void **ppv);
// *** IFolderView methods *** // *** IFolderView methods ***
virtual HRESULT STDMETHODCALLTYPE GetCurrentViewMode(UINT *pViewMode); virtual HRESULT STDMETHODCALLTYPE GetCurrentViewMode(UINT *pViewMode);
virtual HRESULT STDMETHODCALLTYPE SetCurrentViewMode(UINT ViewMode); virtual HRESULT STDMETHODCALLTYPE SetCurrentViewMode(UINT ViewMode);
virtual HRESULT STDMETHODCALLTYPE GetFolder(REFIID riid, void **ppv); virtual HRESULT STDMETHODCALLTYPE GetFolder(REFIID riid, void **ppv);
virtual HRESULT STDMETHODCALLTYPE Item(int iItemIndex, LPITEMIDLIST *ppidl); virtual HRESULT STDMETHODCALLTYPE Item(int iItemIndex, PITEMID_CHILD *ppidl);
virtual HRESULT STDMETHODCALLTYPE ItemCount(UINT uFlags, int *pcItems); virtual HRESULT STDMETHODCALLTYPE ItemCount(UINT uFlags, int *pcItems);
virtual HRESULT STDMETHODCALLTYPE Items(UINT uFlags, REFIID riid, void **ppv); virtual HRESULT STDMETHODCALLTYPE Items(UINT uFlags, REFIID riid, void **ppv);
virtual HRESULT STDMETHODCALLTYPE GetSelectionMarkedItem(int *piItem); virtual HRESULT STDMETHODCALLTYPE GetSelectionMarkedItem(int *piItem);
virtual HRESULT STDMETHODCALLTYPE GetFocusedItem(int *piItem); virtual HRESULT STDMETHODCALLTYPE GetFocusedItem(int *piItem);
virtual HRESULT STDMETHODCALLTYPE GetItemPosition(LPCITEMIDLIST pidl, POINT *ppt); virtual HRESULT STDMETHODCALLTYPE GetItemPosition(PCUITEMID_CHILD pidl, POINT *ppt);
virtual HRESULT STDMETHODCALLTYPE GetSpacing(POINT *ppt); virtual HRESULT STDMETHODCALLTYPE GetSpacing(POINT *ppt);
virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(POINT *ppt); virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(POINT *ppt);
virtual HRESULT STDMETHODCALLTYPE GetAutoArrange(); virtual HRESULT STDMETHODCALLTYPE GetAutoArrange();
@ -390,14 +393,14 @@ HRESULT WINAPI CDefView::Initialize(IShellFolder *shellFolder)
* *
* ##### helperfunctions for communication with ICommDlgBrowser ##### * ##### helperfunctions for communication with ICommDlgBrowser #####
*/ */
HRESULT CDefView::IncludeObject(LPCITEMIDLIST pidl) HRESULT CDefView::IncludeObject(PCUITEMID_CHILD pidl)
{ {
HRESULT ret = S_OK; HRESULT ret = S_OK;
if (m_pCommDlgBrowser.p != NULL) if (m_pCommDlgBrowser.p != NULL)
{ {
TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl); TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
ret = m_pCommDlgBrowser->IncludeObject((IShellView *)this, pidl); ret = m_pCommDlgBrowser->IncludeObject(this, pidl);
TRACE("--0x%08x\n", ret); TRACE("--0x%08x\n", ret);
} }
@ -411,7 +414,7 @@ HRESULT CDefView::OnDefaultCommand()
if (m_pCommDlgBrowser.p != NULL) if (m_pCommDlgBrowser.p != NULL)
{ {
TRACE("ICommDlgBrowser::OnDefaultCommand\n"); TRACE("ICommDlgBrowser::OnDefaultCommand\n");
ret = m_pCommDlgBrowser->OnDefaultCommand((IShellView *)this); ret = m_pCommDlgBrowser->OnDefaultCommand(this);
TRACE("-- returns %08x\n", ret); TRACE("-- returns %08x\n", ret);
} }
@ -425,7 +428,7 @@ HRESULT CDefView::OnStateChange(UINT uFlags)
if (m_pCommDlgBrowser.p != NULL) if (m_pCommDlgBrowser.p != NULL)
{ {
TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags); TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
ret = m_pCommDlgBrowser->OnStateChange((IShellView *)this, uFlags); ret = m_pCommDlgBrowser->OnStateChange(this, uFlags);
TRACE("--\n"); TRACE("--\n");
} }
@ -625,7 +628,11 @@ INT CALLBACK CDefView::CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpDat
if (!lpData) if (!lpData)
return 0; return 0;
ret = (SHORT)SCODE_CODE(((IShellFolder *)lpData)->CompareIDs(0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2)); IShellFolder* psf = reinterpret_cast<IShellFolder*>(lpData);
PCUIDLIST_RELATIVE pidl1 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam1);
PCUIDLIST_RELATIVE pidl2 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam2);
ret = (SHORT)SCODE_CODE(psf->CompareIDs(0, pidl1, pidl2));
TRACE("ret=%i\n", ret); TRACE("ret=%i\n", ret);
return ret; return ret;
@ -661,13 +668,13 @@ INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPAR
FILETIME fd1, fd2; FILETIME fd1, fd2;
char strName1[MAX_PATH], strName2[MAX_PATH]; char strName1[MAX_PATH], strName2[MAX_PATH];
BOOL bIsFolder1, bIsFolder2, bIsBothFolder; BOOL bIsFolder1, bIsFolder2, bIsBothFolder;
LPITEMIDLIST pItemIdList1 = (LPITEMIDLIST) lParam1; PCUIDLIST_RELATIVE pidl1 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam1);
LPITEMIDLIST pItemIdList2 = (LPITEMIDLIST) lParam2; PCUIDLIST_RELATIVE pidl2 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam2);
LISTVIEW_SORT_INFO *pSortInfo = (LPLISTVIEW_SORT_INFO) lpData; LISTVIEW_SORT_INFO *pSortInfo = reinterpret_cast<LPLISTVIEW_SORT_INFO>(lpData);
bIsFolder1 = _ILIsFolder(pItemIdList1); bIsFolder1 = _ILIsFolder(pidl1);
bIsFolder2 = _ILIsFolder(pItemIdList2); bIsFolder2 = _ILIsFolder(pidl2);
bIsBothFolder = bIsFolder1 && bIsFolder2; bIsBothFolder = bIsFolder1 && bIsFolder2;
/* When sorting between a File and a Folder, the Folder gets sorted first */ /* When sorting between a File and a Folder, the Folder gets sorted first */
@ -681,36 +688,36 @@ INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPAR
if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME) if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME)
{ {
_ILGetFileDateTime(pItemIdList1, &fd1); _ILGetFileDateTime(pidl1, &fd1);
_ILGetFileDateTime(pItemIdList2, &fd2); _ILGetFileDateTime(pidl2, &fd2);
nDiff = CompareFileTime(&fd2, &fd1); nDiff = CompareFileTime(&fd2, &fd1);
} }
/* Sort by Attribute: Folder or Files can be sorted */ /* Sort by Attribute: Folder or Files can be sorted */
else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB) else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB)
{ {
_ILGetFileAttributes(pItemIdList1, strName1, MAX_PATH); _ILGetFileAttributes(pidl1, strName1, MAX_PATH);
_ILGetFileAttributes(pItemIdList2, strName2, MAX_PATH); _ILGetFileAttributes(pidl2, strName2, MAX_PATH);
nDiff = lstrcmpiA(strName1, strName2); nDiff = lstrcmpiA(strName1, strName2);
} }
/* Sort by FileName: Folder or Files can be sorted */ /* Sort by FileName: Folder or Files can be sorted */
else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder) else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder)
{ {
/* Sort by Text */ /* Sort by Text */
_ILSimpleGetText(pItemIdList1, strName1, MAX_PATH); _ILSimpleGetText(pidl1, strName1, MAX_PATH);
_ILSimpleGetText(pItemIdList2, strName2, MAX_PATH); _ILSimpleGetText(pidl2, strName2, MAX_PATH);
nDiff = lstrcmpiA(strName1, strName2); nDiff = lstrcmpiA(strName1, strName2);
} }
/* Sort by File Size, Only valid for Files */ /* Sort by File Size, Only valid for Files */
else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE) else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE)
{ {
nDiff = (INT)(_ILGetFileSize(pItemIdList1, NULL, 0) - _ILGetFileSize(pItemIdList2, NULL, 0)); nDiff = (INT)(_ILGetFileSize(pidl1, NULL, 0) - _ILGetFileSize(pidl2, NULL, 0));
} }
/* Sort by File Type, Only valid for Files */ /* Sort by File Type, Only valid for Files */
else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE) else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE)
{ {
/* Sort by Type */ /* Sort by Type */
_ILGetFileType(pItemIdList1, strName1, MAX_PATH); _ILGetFileType(pidl1, strName1, MAX_PATH);
_ILGetFileType(pItemIdList2, strName2, MAX_PATH); _ILGetFileType(pidl2, strName2, MAX_PATH);
nDiff = lstrcmpiA(strName1, strName2); nDiff = lstrcmpiA(strName1, strName2);
} }
} }
@ -718,8 +725,8 @@ INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPAR
if (nDiff == 0) if (nDiff == 0)
{ {
_ILSimpleGetText(pItemIdList1, strName1, MAX_PATH); _ILSimpleGetText(pidl1, strName1, MAX_PATH);
_ILSimpleGetText(pItemIdList2, strName2, MAX_PATH); _ILSimpleGetText(pidl2, strName2, MAX_PATH);
nDiff = lstrcmpiA(strName1, strName2); nDiff = lstrcmpiA(strName1, strName2);
} }
@ -731,16 +738,26 @@ INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPAR
return nDiff; return nDiff;
} }
PCUITEMID_CHILD CDefView::_PidlByItem(int i)
{
return reinterpret_cast<PCUITEMID_CHILD>(m_ListView.GetItemData(i));
}
PCUITEMID_CHILD CDefView::_PidlByItem(LVITEM& lvItem)
{
return reinterpret_cast<PCUITEMID_CHILD>(lvItem.lParam);
}
/********************************************************** /**********************************************************
* LV_FindItemByPidl() * LV_FindItemByPidl()
*/ */
int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl) int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl)
{ {
int cItems = m_ListView.GetItemCount(); int cItems = m_ListView.GetItemCount();
for (int i = 0; i<cItems; i++) for (int i = 0; i<cItems; i++)
{ {
LPITEMIDLIST currentpidl = reinterpret_cast<LPITEMIDLIST>(m_ListView.GetItemData(i)); PCUITEMID_CHILD currentpidl = _PidlByItem(i);
HRESULT hr = m_pSFParent->CompareIDs(0, pidl, currentpidl); HRESULT hr = m_pSFParent->CompareIDs(0, pidl, currentpidl);
if (SUCCEEDED(hr) && !HRESULT_CODE(hr)) if (SUCCEEDED(hr) && !HRESULT_CODE(hr))
@ -754,7 +771,7 @@ int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl)
/********************************************************** /**********************************************************
* LV_AddItem() * LV_AddItem()
*/ */
BOOLEAN CDefView::LV_AddItem(LPCITEMIDLIST pidl) BOOLEAN CDefView::LV_AddItem(PCUITEMID_CHILD pidl)
{ {
LVITEMW lvItem; LVITEMW lvItem;
@ -763,7 +780,7 @@ BOOLEAN CDefView::LV_AddItem(LPCITEMIDLIST pidl)
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/ lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
lvItem.iItem = m_ListView.GetItemCount(); /*add the item to the end of the list*/ lvItem.iItem = m_ListView.GetItemCount(); /*add the item to the end of the list*/
lvItem.iSubItem = 0; lvItem.iSubItem = 0;
lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/ lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidl)); /*set the item's data*/
lvItem.pszText = LPSTR_TEXTCALLBACKW; /*get text on a callback basis*/ lvItem.pszText = LPSTR_TEXTCALLBACKW; /*get text on a callback basis*/
lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/ lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
@ -776,13 +793,13 @@ BOOLEAN CDefView::LV_AddItem(LPCITEMIDLIST pidl)
/********************************************************** /**********************************************************
* LV_DeleteItem() * LV_DeleteItem()
*/ */
BOOLEAN CDefView::LV_DeleteItem(LPCITEMIDLIST pidl) BOOLEAN CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl)
{ {
int nIndex; int nIndex;
TRACE("(%p)(pidl=%p)\n", this, pidl); TRACE("(%p)(pidl=%p)\n", this, pidl);
nIndex = LV_FindItemByPidl(ILFindLastID(pidl)); nIndex = LV_FindItemByPidl(pidl);
return (-1 == m_ListView.DeleteItem(nIndex)) ? FALSE : TRUE; return (-1 == m_ListView.DeleteItem(nIndex)) ? FALSE : TRUE;
} }
@ -790,14 +807,14 @@ BOOLEAN CDefView::LV_DeleteItem(LPCITEMIDLIST pidl)
/********************************************************** /**********************************************************
* LV_RenameItem() * LV_RenameItem()
*/ */
BOOLEAN CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew) BOOLEAN CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld, PCUITEMID_CHILD pidlNew)
{ {
int nItem; int nItem;
LVITEMW lvItem; LVITEMW lvItem;
TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld, pidlNew); TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld, pidlNew);
nItem = LV_FindItemByPidl(ILFindLastID(pidlOld)); nItem = LV_FindItemByPidl(pidlOld);
if ( -1 != nItem ) if ( -1 != nItem )
{ {
@ -805,10 +822,10 @@ BOOLEAN CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew)
lvItem.iItem = nItem; lvItem.iItem = nItem;
m_ListView.GetItem(&lvItem); m_ListView.GetItem(&lvItem);
SHFree((LPITEMIDLIST)lvItem.lParam); SHFree(reinterpret_cast<LPVOID>(lvItem.lParam));
lvItem.mask = LVIF_PARAM|LVIF_IMAGE; lvItem.mask = LVIF_PARAM|LVIF_IMAGE;
lvItem.iItem = nItem; lvItem.iItem = nItem;
lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidlNew)); /* set the item's data */ lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidlNew)); /* set the item's data */
lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidlNew, 0); lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidlNew, 0);
m_ListView.SetItem(&lvItem); m_ListView.SetItem(&lvItem);
m_ListView.Update(nItem); m_ListView.Update(nItem);
@ -827,8 +844,9 @@ BOOLEAN CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew)
*/ */
INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg ) INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg )
{ {
LPITEMIDLIST pidl = (LPITEMIDLIST)ptr; PITEMID_CHILD pidl = static_cast<PITEMID_CHILD>(ptr);
CDefView *pThis = static_cast<CDefView *>(arg); CDefView *pThis = static_cast<CDefView *>(arg);
/* in a commdlg This works as a filemask*/ /* in a commdlg This works as a filemask*/
if (pThis->IncludeObject(pidl) == S_OK) if (pThis->IncludeObject(pidl) == S_OK)
pThis->LV_AddItem(pidl); pThis->LV_AddItem(pidl);
@ -839,8 +857,8 @@ INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg )
HRESULT CDefView::FillList() HRESULT CDefView::FillList()
{ {
LPENUMIDLIST pEnumIDList; CComPtr<IEnumIDList> pEnumIDList;
LPITEMIDLIST pidl; PITEMID_CHILD pidl;
DWORD dwFetched; DWORD dwFetched;
HRESULT hRes; HRESULT hRes;
HDPA hdpa; HDPA hdpa;
@ -873,18 +891,16 @@ HRESULT CDefView::FillList()
} }
/* sort the array */ /* sort the array */
DPA_Sort(hdpa, CompareItems, (LPARAM)m_pSFParent.p); DPA_Sort(hdpa, CompareItems, reinterpret_cast<LPARAM>(m_pSFParent.p));
/*turn the listview's redrawing off*/ /*turn the listview's redrawing off*/
m_ListView.SetRedraw(FALSE); m_ListView.SetRedraw(FALSE);
DPA_DestroyCallback( hdpa, fill_list, (void *)this); DPA_DestroyCallback( hdpa, fill_list, this);
/*turn the listview's redrawing back on and force it to draw*/ /*turn the listview's redrawing back on and force it to draw*/
m_ListView.SetRedraw(TRUE); m_ListView.SetRedraw(TRUE);
pEnumIDList->Release(); /* destroy the list*/
return S_OK; return S_OK;
} }
@ -912,8 +928,9 @@ LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
LRESULT CDefView::OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CDefView::OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
/* redirect to parent */
if (m_FolderSettings.fFlags & (FWF_DESKTOP | FWF_TRANSPARENT)) if (m_FolderSettings.fFlags & (FWF_DESKTOP | FWF_TRANSPARENT))
return SendMessageW(GetParent(), WM_ERASEBKGND, wParam, lParam); /* redirect to parent */ return SendMessageW(GetParent(), WM_ERASEBKGND, wParam, lParam);
bHandled = FALSE; bHandled = FALSE;
return 0; return 0;
@ -930,7 +947,7 @@ LRESULT CDefView::OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
LRESULT CDefView::OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CDefView::OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
return (LRESULT)m_pShellBrowser.p; return reinterpret_cast<LRESULT>(m_pShellBrowser.p);
} }
/********************************************************** /**********************************************************
@ -962,10 +979,12 @@ LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
m_pSFParent->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); m_pSFParent->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
if (ppf2) if (ppf2)
{ {
ppf2->GetCurFolder((LPITEMIDLIST*)&ntreg.pidl); PIDLIST_ABSOLUTE pidlParent;
ppf2->GetCurFolder(&pidlParent);
ntreg.fRecursive = TRUE; ntreg.fRecursive = TRUE;
ntreg.pidl = pidlParent;
m_hNotify = SHChangeNotifyRegister(m_hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg); m_hNotify = SHChangeNotifyRegister(m_hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
SHFree((LPITEMIDLIST)ntreg.pidl); SHFree(pidlParent);
} }
m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW)); m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
@ -984,9 +1003,7 @@ HMENU CDefView::BuildFileMenu()
GetSelections(); GetSelections();
LPCITEMIDLIST * apidl = (LPCITEMIDLIST *)m_apidl; hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IContextMenu, &cm));
hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, apidl, IID_NULL_PPV_ARG(IContextMenu, &cm));
if (FAILED(hr)) if (FAILED(hr))
return NULL; return NULL;
@ -1097,7 +1114,7 @@ UINT CDefView::GetSelections()
SHFree(m_apidl); SHFree(m_apidl);
m_cidl = m_ListView.GetSelectedCount(); m_cidl = m_ListView.GetSelectedCount();
m_apidl = (LPITEMIDLIST*)SHAlloc(m_cidl * sizeof(LPITEMIDLIST)); m_apidl = reinterpret_cast<PCUITEMID_CHILD_ARRAY>(SHAlloc(m_cidl * sizeof(PCUITEMID_CHILD)));
if (!m_apidl) if (!m_apidl)
{ {
m_cidl = 0; m_cidl = 0;
@ -1110,7 +1127,7 @@ UINT CDefView::GetSelections()
int lvIndex = -1; int lvIndex = -1;
while ((lvIndex = m_ListView.GetNextItem(lvIndex, LVNI_SELECTED)) > -1) while ((lvIndex = m_ListView.GetNextItem(lvIndex, LVNI_SELECTED)) > -1)
{ {
m_apidl[i] = (LPITEMIDLIST)m_ListView.GetItemData(lvIndex); m_apidl[i] = _PidlByItem(lvIndex);
i++; i++;
if (i == m_cidl) if (i == m_cidl)
break; break;
@ -1142,7 +1159,7 @@ HRESULT CDefView::OpenSelectedItems()
if (!hMenu) if (!hMenu)
return E_FAIL; return E_FAIL;
hResult = GetItemObject( SVGIO_SELECTION, IID_PPV_ARG(IContextMenu, &m_pCM)); hResult = GetItemObject(SVGIO_SELECTION, IID_PPV_ARG(IContextMenu, &m_pCM));
if (FAILED(hResult)) if (FAILED(hResult))
goto cleanup; goto cleanup;
@ -1235,7 +1252,7 @@ LRESULT CDefView::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
ZeroMemory(&cmi, sizeof(cmi)); ZeroMemory(&cmi, sizeof(cmi));
cmi.cbSize = sizeof(cmi); cmi.cbSize = sizeof(cmi);
cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand); cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
cmi.hwnd = m_hWnd; cmi.hwnd = m_hWnd;
m_pCM->InvokeCommand(&cmi); m_pCM->InvokeCommand(&cmi);
@ -1277,7 +1294,7 @@ LRESULT CDefView::OnExplorerCommand(UINT uCommand, BOOL bUseSelection)
ZeroMemory(&cmi, sizeof(cmi)); ZeroMemory(&cmi, sizeof(cmi));
cmi.cbSize = sizeof(cmi); cmi.cbSize = sizeof(cmi);
cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand); cmi.lpVerb = MAKEINTRESOURCEA(uCommand);
cmi.hwnd = m_hWnd; cmi.hwnd = m_hWnd;
m_pCM->InvokeCommand(&cmi); m_pCM->InvokeCommand(&cmi);
@ -1469,7 +1486,7 @@ LRESULT CDefView::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHan
should always be done before merging menus (OnActivate merges the should always be done before merging menus (OnActivate merges the
menus) if one of our windows has the focus.*/ menus) if one of our windows has the focus.*/
m_pShellBrowser->OnViewWindowActive((IShellView *)this); m_pShellBrowser->OnViewWindowActive(this);
DoActivate(SVUIA_ACTIVATE_FOCUS); DoActivate(SVUIA_ACTIVATE_FOCUS);
/* Set the focus to the listview */ /* Set the focus to the listview */
@ -1544,7 +1561,7 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
case 0x31: case 0x31:
case 0x32: case 0x32:
case 0x33: case 0x33:
m_sortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30); m_sortInfo.nHeaderID = dwCmdID - 0x30;
m_sortInfo.bIsAscending = TRUE; m_sortInfo.bIsAscending = TRUE;
m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID; m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
m_ListView.SortItems(ListViewCompareItems, &m_sortInfo); m_ListView.SortItems(ListViewCompareItems, &m_sortInfo);
@ -1582,7 +1599,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
LPNMHDR lpnmh; LPNMHDR lpnmh;
LPNMLISTVIEW lpnmlv; LPNMLISTVIEW lpnmlv;
NMLVDISPINFOW *lpdi; NMLVDISPINFOW *lpdi;
LPITEMIDLIST pidl; PCUITEMID_CHILD pidl;
BOOL unused; BOOL unused;
CtlID = wParam; CtlID = wParam;
@ -1640,7 +1657,10 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
case LVN_DELETEITEM: case LVN_DELETEITEM:
TRACE("-- LVN_DELETEITEM %p\n", this); TRACE("-- LVN_DELETEITEM %p\n", this);
SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
/*delete the pidl because we made a copy of it*/
SHFree(reinterpret_cast<LPVOID>(lpnmlv->lParam));
break; break;
case LVN_DELETEALLITEMS: case LVN_DELETEALLITEMS:
@ -1670,7 +1690,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
case LVN_GETDISPINFOA: case LVN_GETDISPINFOA:
case LVN_GETDISPINFOW: case LVN_GETDISPINFOW:
TRACE("-- LVN_GETDISPINFO %p\n", this); TRACE("-- LVN_GETDISPINFO %p\n", this);
pidl = (LPITEMIDLIST)lpdi->item.lParam; pidl = _PidlByItem(lpdi->item);
if (lpdi->item.mask & LVIF_TEXT) /* text requested */ if (lpdi->item.mask & LVIF_TEXT) /* text requested */
{ {
@ -1723,11 +1743,9 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
DWORD dwAttributes = SFGAO_CANLINK; DWORD dwAttributes = SFGAO_CANLINK;
DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE; DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda)))) if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
{ {
CComPtr<IDropSource> pds = static_cast<IDropSource *>(this); /* own DropSource interface */ if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, m_apidl, &dwAttributes)))
if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes)))
{ {
if (dwAttributes & SFGAO_CANLINK) if (dwAttributes & SFGAO_CANLINK)
{ {
@ -1741,10 +1759,8 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
piaso->SetAsyncMode(TRUE); piaso->SetAsyncMode(TRUE);
} }
if (pds) DWORD dwEffect2;
{ DWORD dwEffect2; DoDragDrop(pda, this, dwEffect, &dwEffect2);
DoDragDrop(pda, pds, dwEffect, &dwEffect2);
}
} }
} }
break; break;
@ -1752,11 +1768,11 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
case LVN_BEGINLABELEDITW: case LVN_BEGINLABELEDITW:
{ {
DWORD dwAttr = SFGAO_CANRENAME; DWORD dwAttr = SFGAO_CANRENAME;
pidl = (LPITEMIDLIST)lpdi->item.lParam; pidl = _PidlByItem(lpdi->item);
TRACE("-- LVN_BEGINLABELEDITW %p\n", this); TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
m_pSFParent->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &dwAttr); m_pSFParent->GetAttributesOf(1, &pidl, &dwAttr);
if (SFGAO_CANRENAME & dwAttr) if (SFGAO_CANRENAME & dwAttr)
{ {
m_isEditing = TRUE; m_isEditing = TRUE;
@ -1776,15 +1792,16 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
HRESULT hr; HRESULT hr;
LVITEMW lvItem; LVITEMW lvItem;
pidl = (LPITEMIDLIST)lpdi->item.lParam; pidl = _PidlByItem(lpdi->item);
hr = m_pSFParent->SetNameOf(0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidl); PITEMID_CHILD pidlNew;
hr = m_pSFParent->SetNameOf(0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidlNew);
if (SUCCEEDED(hr) && pidl) if (SUCCEEDED(hr) && pidlNew)
{ {
lvItem.mask = LVIF_PARAM|LVIF_IMAGE; lvItem.mask = LVIF_PARAM|LVIF_IMAGE;
lvItem.iItem = lpdi->item.iItem; lvItem.iItem = lpdi->item.iItem;
lvItem.lParam = (LPARAM)pidl; lvItem.lParam = reinterpret_cast<LPARAM>(pidlNew);
lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0); lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidlNew, 0);
m_ListView.SetItem(&lvItem); m_ListView.SetItem(&lvItem);
m_ListView.Update(lpdi->item.iItem); m_ListView.Update(lpdi->item.iItem);
return TRUE; return TRUE;
@ -1807,9 +1824,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
*/ */
LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
LPITEMIDLIST *Pidls; PCIDLIST_ABSOLUTE *Pidls = reinterpret_cast<PCIDLIST_ABSOLUTE*>(wParam);
Pidls = (LPITEMIDLIST *)wParam;
TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam); TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam);
@ -1817,21 +1832,21 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
{ {
case SHCNE_MKDIR: case SHCNE_MKDIR:
case SHCNE_CREATE: case SHCNE_CREATE:
LV_AddItem(Pidls[0]); LV_AddItem(ILFindLastID(Pidls[0]));
break; break;
case SHCNE_RMDIR: case SHCNE_RMDIR:
case SHCNE_DELETE: case SHCNE_DELETE:
LV_DeleteItem(Pidls[0]); LV_DeleteItem(ILFindLastID(Pidls[0]));
break; break;
case SHCNE_RENAMEFOLDER: case SHCNE_RENAMEFOLDER:
case SHCNE_RENAMEITEM: case SHCNE_RENAMEITEM:
LV_RenameItem(Pidls[0], Pidls[1]); LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[1]));
break; break;
case SHCNE_UPDATEITEM: case SHCNE_UPDATEITEM:
LV_RenameItem(Pidls[0], Pidls[0]); LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[0]));
break; break;
case SHCNE_UPDATEDIR: case SHCNE_UPDATEDIR:
@ -2148,7 +2163,7 @@ HRESULT WINAPI CDefView::SaveViewState()
return S_OK; return S_OK;
} }
HRESULT WINAPI CDefView::SelectItem(LPCITEMIDLIST pidl, UINT uFlags) HRESULT WINAPI CDefView::SelectItem(PCUITEMID_CHILD pidl, UINT uFlags)
{ {
int i; int i;
@ -2207,17 +2222,20 @@ HRESULT WINAPI CDefView::GetItemObject(UINT uItem, REFIID riid, LPVOID *ppvOut)
if (IsEqualIID(riid, IID_IContextMenu)) if (IsEqualIID(riid, IID_IContextMenu))
{ {
//*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE); //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
CDefFolderMenu_Create2(NULL, NULL, 0, NULL, m_pSFParent, NULL, 0, NULL, (IContextMenu**)ppvOut);
if (!ppvOut) if (!ppvOut)
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
else
hr = S_OK; IContextMenu* pcm;
hr = CDefFolderMenu_Create2(NULL, NULL, 0, NULL, m_pSFParent, NULL, 0, NULL, &pcm);
if (FAILED(hr))
return hr;
*ppvOut = pcm;
} }
break; break;
case SVGIO_SELECTION: case SVGIO_SELECTION:
GetSelections(); GetSelections();
hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, riid, 0, ppvOut); hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, riid, 0, ppvOut);
break; break;
} }
@ -2243,7 +2261,7 @@ HRESULT STDMETHODCALLTYPE CDefView::SetCurrentViewMode(UINT ViewMode)
TRACE("(%p)->(%u), stub\n", this, ViewMode); TRACE("(%p)->(%u), stub\n", this, ViewMode);
/* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */ /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
if ((ViewMode < FVM_FIRST || ViewMode > FVM_LAST) && (ViewMode != (UINT)FVM_AUTO)) if ((ViewMode < FVM_FIRST || ViewMode > FVM_LAST) && (ViewMode != FVM_AUTO))
return E_INVALIDARG; return E_INVALIDARG;
/* Windows before Vista uses LVM_SETVIEW and possibly /* Windows before Vista uses LVM_SETVIEW and possibly
@ -2289,9 +2307,9 @@ HRESULT STDMETHODCALLTYPE CDefView::GetFolder(REFIID riid, void **ppv)
return m_pSFParent->QueryInterface(riid, ppv); return m_pSFParent->QueryInterface(riid, ppv);
} }
HRESULT STDMETHODCALLTYPE CDefView::Item(int iItemIndex, LPITEMIDLIST *ppidl) HRESULT STDMETHODCALLTYPE CDefView::Item(int iItemIndex, PITEMID_CHILD *ppidl)
{ {
PITEMID_CHILD pidl = reinterpret_cast<PITEMID_CHILD>(m_ListView.GetItemData(iItemIndex)); PCUITEMID_CHILD pidl = _PidlByItem(iItemIndex);
if (pidl) if (pidl)
{ {
*ppidl = ILClone(pidl); *ppidl = ILClone(pidl);
@ -2337,7 +2355,7 @@ HRESULT STDMETHODCALLTYPE CDefView::GetFocusedItem(int *piItem)
return S_OK; return S_OK;
} }
HRESULT STDMETHODCALLTYPE CDefView::GetItemPosition(LPCITEMIDLIST pidl, POINT *ppt) HRESULT STDMETHODCALLTYPE CDefView::GetItemPosition(PCUITEMID_CHILD pidl, POINT *ppt)
{ {
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -2468,7 +2486,8 @@ HRESULT STDMETHODCALLTYPE CDefView::RemoveObject(PITEMID_CHILD pidl, UINT *item)
HRESULT STDMETHODCALLTYPE CDefView::GetObjectCount(UINT *count) HRESULT STDMETHODCALLTYPE CDefView::GetObjectCount(UINT *count)
{ {
TRACE("(%p)->(%p)\n", this, count); TRACE("(%p)->(%p)\n", this, count);
return ItemCount(SVGIO_ALLVIEW, reinterpret_cast<INT*>(count)); *count = m_ListView.GetItemCount();
return S_OK;
} }
HRESULT STDMETHODCALLTYPE CDefView::SetObjectCount(UINT count, UINT flags) HRESULT STDMETHODCALLTYPE CDefView::SetObjectCount(UINT count, UINT flags)
@ -2510,14 +2529,14 @@ HRESULT STDMETHODCALLTYPE CDefView::GetSelectedObjects(PCUITEMID_CHILD **pidl, U
if (*items) if (*items)
{ {
*pidl = static_cast<PCUITEMID_CHILD *>(LocalAlloc(0, *items * sizeof(LPITEMIDLIST))); *pidl = static_cast<PCUITEMID_CHILD *>(LocalAlloc(0, *items * sizeof(PCUITEMID_CHILD)));
if (!*pidl) if (!*pidl)
{ {
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
/* it's documented that caller shouldn't PIDLs, only array itself */ /* it's documented that caller shouldn't PIDLs, only array itself */
memcpy(static_cast<PCUITEMID_CHILD *>(*pidl), m_apidl, *items * sizeof(LPITEMIDLIST)); memcpy(*pidl, m_apidl, *items * sizeof(PCUITEMID_CHILD));
} }
return S_OK; return S_OK;
@ -2761,7 +2780,7 @@ HRESULT CDefView::drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEf
{ {
/* Query the relative PIDL of the shellfolder object represented by the currently /* Query the relative PIDL of the shellfolder object represented by the currently
* dragged over listview-item ... */ * dragged over listview-item ... */
LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(m_ListView.GetItemData(lResult)); PCUITEMID_CHILD pidl = _PidlByItem(lResult);
/* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */ /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
hr = m_pSFParent->GetUIObjectOf(m_ListView, 1, &pidl, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget)); hr = m_pSFParent->GetUIObjectOf(m_ListView, 1, &pidl, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget));