Index: dll/win32/shell32/folders/CControlPanelFolder.cpp =================================================================== --- dll/win32/shell32/folders/CControlPanelFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CControlPanelFolder.cpp (working copy) @@ -49,7 +49,7 @@ */ static const shvheader ControlPanelSFHeader[] = { - {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},/*FIXME*/ + {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20},/*FIXME*/ {IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 80},/*FIXME*/ }; @@ -339,12 +339,14 @@ HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { - int nReturn; + SHELLDETAILS sd; + CHAR szItem1[MAX_PATH], szItem2[MAX_PATH]; - TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2); - nReturn = SHELL32_CompareIDs(this, lParam, pidl1, pidl2); - TRACE("-- %i\n", nReturn); - return nReturn; + GetDetailsOf(pidl1, lParam, &sd); + StrRetToBufA(&sd.str, pidl1, szItem1, MAX_PATH); + GetDetailsOf(pidl2, lParam, &sd); + StrRetToBufA(&sd.str, pidl2, szItem2, MAX_PATH); + return lstrcmpiA(szItem1, szItem2); } /************************************************************************** Index: dll/win32/shell32/CDefView.cpp =================================================================== --- dll/win32/shell32/CDefView.cpp (revision 69628) +++ dll/win32/shell32/CDefView.cpp (working copy) @@ -131,7 +131,6 @@ BOOL CreateList(); void UpdateListColors(); BOOL InitList(); - static INT CALLBACK CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData); static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData); PCUITEMID_CHILD _PidlByItem(int i); @@ -647,30 +646,6 @@ return TRUE; } -/********************************************************** -* ShellView_CompareItems() -* -* NOTES -* internal, CALLBACK for DSA_Sort -*/ -INT CALLBACK CDefView::CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData) -{ - int ret; - TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData); - - if (!lpData) - return 0; - - IShellFolder* psf = reinterpret_cast(lpData); - PCUIDLIST_RELATIVE pidl1 = reinterpret_cast(lParam1); - PCUIDLIST_RELATIVE pidl2 = reinterpret_cast(lParam2); - - ret = (SHORT)SCODE_CODE(psf->CompareIDs(0, pidl1, pidl2)); - TRACE("ret=%i\n", ret); - - return ret; -} - /************************************************************************* * ShellView_ListViewCompareItems * @@ -698,76 +673,13 @@ INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData) { INT nDiff = 0; - FILETIME fd1, fd2; - char strName1[MAX_PATH], strName2[MAX_PATH]; - BOOL bIsFolder1, bIsFolder2, bIsBothFolder; PCUIDLIST_RELATIVE pidl1 = reinterpret_cast(lParam1); PCUIDLIST_RELATIVE pidl2 = reinterpret_cast(lParam2); - LISTVIEW_SORT_INFO *pSortInfo = reinterpret_cast(lpData); + CDefView *pThis = reinterpret_cast(lpData); - - bIsFolder1 = _ILIsFolder(pidl1); - bIsFolder2 = _ILIsFolder(pidl2); - bIsBothFolder = bIsFolder1 && bIsFolder2; - - /* When sorting between a File and a Folder, the Folder gets sorted first */ - if ( (bIsFolder1 || bIsFolder2) && !bIsBothFolder) - { - nDiff = bIsFolder1 ? -1 : 1; - } - else - { - /* Sort by Time: Folders or Files can be sorted */ - - if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME) - { - _ILGetFileDateTime(pidl1, &fd1); - _ILGetFileDateTime(pidl2, &fd2); - nDiff = CompareFileTime(&fd2, &fd1); - } - /* Sort by Attribute: Folder or Files can be sorted */ - else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB) - { - _ILGetFileAttributes(pidl1, strName1, MAX_PATH); - _ILGetFileAttributes(pidl2, strName2, MAX_PATH); - nDiff = lstrcmpiA(strName1, strName2); - } - /* Sort by FileName: Folder or Files can be sorted */ - else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder) - { - /* Sort by Text */ - _ILSimpleGetText(pidl1, strName1, MAX_PATH); - _ILSimpleGetText(pidl2, strName2, MAX_PATH); - nDiff = lstrcmpiA(strName1, strName2); - } - /* Sort by File Size, Only valid for Files */ - else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE) - { - nDiff = (INT)(_ILGetFileSize(pidl1, NULL, 0) - _ILGetFileSize(pidl2, NULL, 0)); - } - /* Sort by File Type, Only valid for Files */ - else if (pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE) - { - /* Sort by Type */ - _ILGetFileType(pidl1, strName1, MAX_PATH); - _ILGetFileType(pidl2, strName2, MAX_PATH); - nDiff = lstrcmpiA(strName1, strName2); - } - } - /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */ - - if (nDiff == 0) - { - _ILSimpleGetText(pidl1, strName1, MAX_PATH); - _ILSimpleGetText(pidl2, strName2, MAX_PATH); - nDiff = lstrcmpiA(strName1, strName2); - } - - if (!pSortInfo->bIsAscending) - { + nDiff = pThis->m_pSFParent->CompareIDs(pThis->m_sortInfo.nHeaderID, pidl1, pidl2); + if (!pThis->m_sortInfo.bIsAscending) nDiff = -nDiff; - } - return nDiff; } @@ -971,14 +883,17 @@ } } - /* sort the array */ - DPA_Sort(hdpa, CompareItems, reinterpret_cast(m_pSFParent.p)); - /*turn the listview's redrawing off*/ m_ListView.SetRedraw(FALSE); DPA_DestroyCallback( hdpa, fill_list, this); + /* sort the array */ + m_pSF2Parent->GetDefaultColumn(NULL, (ULONG*)&m_sortInfo.nHeaderID, NULL); + m_sortInfo.bIsAscending = TRUE; + m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID; + m_ListView.SortItems(ListViewCompareItems, this); + /*turn the listview's redrawing back on and force it to draw*/ m_ListView.SetRedraw(TRUE); @@ -1657,7 +1572,7 @@ m_sortInfo.nHeaderID = dwCmdID - 0x30; m_sortInfo.bIsAscending = TRUE; m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID; - m_ListView.SortItems(ListViewCompareItems, &m_sortInfo); + m_ListView.SortItems(ListViewCompareItems, this); break; case FCIDM_SHVIEW_SELECTALL: @@ -1787,7 +1702,7 @@ m_sortInfo.bIsAscending = TRUE; m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID; - m_ListView.SortItems(ListViewCompareItems, &m_sortInfo); + m_ListView.SortItems(ListViewCompareItems, this); break; case LVN_GETDISPINFOA: Index: dll/win32/shell32/folders/CDesktopFolder.cpp =================================================================== --- dll/win32/shell32/folders/CDesktopFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CDesktopFolder.cpp (working copy) @@ -63,14 +63,13 @@ int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll); static const shvheader DesktopSFHeader[] = { - {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, - {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}, + {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12}, }; -#define DESKTOPSHELLVIEWCOLUMNS 5 +#define DESKTOPSHELLVIEWCOLUMNS 4 static const DWORD dwDesktopAttributes = SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | @@ -464,9 +463,12 @@ */ HRESULT WINAPI CDesktopFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { - if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2)) - return SHELL32_CompareIDs ((IShellFolder *)this, lParam, pidl1, pidl2); + int type1, type2; + type1 = _ILGetDataPointer(pidl1)->type; + type2 = _ILGetDataPointer(pidl2)->type; + if (type1 != type2) + return type1 - type2; return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2); } Index: dll/win32/shell32/folders/CDrivesFolder.cpp =================================================================== --- dll/win32/shell32/folders/CDrivesFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CDrivesFolder.cpp (working copy) @@ -58,8 +58,8 @@ */ static const shvheader MyComputerSFHeader[] = { - {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}, {IDS_SHV_COLUMN6, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, {IDS_SHV_COLUMN7, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, }; @@ -298,12 +298,56 @@ HRESULT WINAPI CDrivesFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { - int nReturn; + HRESULT hr = 0; + ULARGE_INTEGER ulBytes1; + ULARGE_INTEGER ulBytes2; + CHAR szItem1[MAX_PATH]; + CHAR szItem2[MAX_PATH]; + int type1, type2; - TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2); - nReturn = SHELL32_CompareIDs (this, lParam, pidl1, pidl2); - TRACE("-- %i\n", nReturn); - return nReturn; + type1 = _ILGetDataPointer(pidl1)->type; + type2 = _ILGetDataPointer(pidl2)->type; + if (type1 != type2) + return type2 - type1; + + switch (lParam) + { + case 0: /* Name */ + _ILSimpleGetText(pidl1, szItem1, MAX_PATH); + _ILSimpleGetText(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 1: /* Type */ + GetTypeString(pidl1, szItem1, MAX_PATH); + GetTypeString(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 2: /* Size */ + case 3: /* Size Available */ + _ILSimpleGetText(pidl1, szItem1, MAX_PATH); + if (GetVolumeInformationA(szItem1, NULL, 0, NULL, NULL, NULL, NULL, 0)) + { + if (lParam == 2) + GetDiskFreeSpaceExA(szItem1, NULL, &ulBytes1, NULL); + else + GetDiskFreeSpaceExA(szItem1, &ulBytes1, NULL, NULL); + } + else + ulBytes1.QuadPart = 0; + _ILSimpleGetText(pidl2, szItem2, MAX_PATH); + if (GetVolumeInformationA(szItem2, NULL, 0, NULL, NULL, NULL, NULL, 0)) + { + if (lParam == 2) + GetDiskFreeSpaceExA(szItem2, NULL, &ulBytes2, NULL); + else + GetDiskFreeSpaceExA(szItem2, &ulBytes2, NULL, NULL); + } + else + ulBytes2.QuadPart = 0; + hr = ulBytes1.QuadPart - ulBytes2.QuadPart; + break; + } + return hr; } /************************************************************************** @@ -539,6 +583,12 @@ case DRIVE_CDROM: ResourceId = IDS_DRIVE_CDROM; break; + case DRIVE_REMOVABLE: + if (*wszDrive == L'a' || *wszDrive == L'A' || *wszDrive == L'b' || *wszDrive == L'B') + ResourceId = IDS_DRIVE_FLOPPY; + else + ResourceId = IDS_DRIVE_REMOVABLE; + break; default: ResourceId = 0; } @@ -655,10 +705,6 @@ psd->str.cStr, MAX_PATH); return S_OK; } - else if (_ILIsSpecialFolder(pidl)) - { - return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd); - } else { char szPath[MAX_PATH]; @@ -672,7 +718,7 @@ hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); break; case 1: /* type */ - _ILGetFileType(pidl, psd->str.cStr, MAX_PATH); + GetTypeString(pidl, psd->str.cStr, MAX_PATH); break; case 2: /* total size */ _ILSimpleGetText (pidl, szPath, MAX_PATH); @@ -746,3 +792,37 @@ *pidl = ILClone(pidlRoot); return S_OK; } + +HRESULT WINAPI CDrivesFolder::GetTypeString(PCUITEMID_CHILD pidl, LPSTR szType, UINT length) +{ + CHAR szDrive[MAX_PATH]; + + *szType = 0; + if(_ILGetDrive(pidl, szDrive, MAX_PATH)) + { + switch (GetDriveTypeA(szDrive)) + { + case DRIVE_FIXED: + LoadStringA(shell32_hInstance, IDS_DRIVE_FIXED, szType, length); + break; + case DRIVE_CDROM: + LoadStringA(shell32_hInstance, IDS_DRIVE_CDROM, szType, length); + break; + case DRIVE_REMOTE: + LoadStringA(shell32_hInstance, IDS_DRIVE_NETWORK, szType, length); + break; + case DRIVE_REMOVABLE: + if (*szDrive == 'a' || *szDrive == 'A' || *szDrive == 'b' || *szDrive == 'B') + LoadStringA(shell32_hInstance, IDS_DRIVE_FLOPPY, szType, length); + else + LoadStringA(shell32_hInstance, IDS_DRIVE_REMOVABLE, szType, length); + break; + } + } + else + { + //LoadStringA(shell32_hInstance, IDS_SYS_FOLDER, szType, length); + StringCchCopyA(szType, length, "System Folder"); + } + return S_OK; +} \ No newline at end of file Index: dll/win32/shell32/folders/CDrivesFolder.h =================================================================== --- dll/win32/shell32/folders/CDrivesFolder.h (revision 69628) +++ dll/win32/shell32/folders/CDrivesFolder.h (working copy) @@ -37,6 +37,7 @@ CDrivesFolder(); ~CDrivesFolder(); HRESULT WINAPI FinalConstruct(); + HRESULT WINAPI GetTypeString(PCUITEMID_CHILD pidl, LPSTR szType, UINT length); // IShellFolder virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); Index: dll/win32/shell32/folders/CFSFolder.cpp =================================================================== --- dll/win32/shell32/folders/CFSFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CFSFolder.cpp (working copy) @@ -94,11 +94,11 @@ static const shvheader GenericSFHeader[] = { - {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, - {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}, + {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12}, + {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10} }; #define GENERICSHELLVIEWCOLUMNS 5 @@ -319,12 +319,49 @@ PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { - int nReturn; + HRESULT hr = 0; + BOOL bIsFolder1, bIsFolder2, bIsBothFolder; + CHAR szItem1[MAX_PATH], szItem2[MAX_PATH]; + DWORD dwItem1, dwItem2; + FILETIME ft1, ft2; - TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam, pidl1, pidl2); - nReturn = SHELL32_CompareIDs(this, lParam, pidl1, pidl2); - TRACE("-- %i\n", nReturn); - return nReturn; + bIsFolder1 = _ILIsFolder(pidl1); + bIsFolder2 = _ILIsFolder(pidl2); + bIsBothFolder = bIsFolder1 && bIsFolder2; + + /* When sorting between a File and a Folder, the Folder gets sorted first */ + if ((bIsFolder1 || bIsFolder2) && !bIsBothFolder) + return bIsFolder1 ? -1 : 1; + + switch (lParam) + { + case 0: /* Name */ + _ILSimpleGetText(pidl1, szItem1, MAX_PATH); + _ILSimpleGetText(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 1: /* Size */ + dwItem1 = _ILGetFileSize(pidl1, NULL, 0); + dwItem2 = _ILGetFileSize(pidl2, NULL, 0); + hr = dwItem1 - dwItem2; + break; + case 2: /* Type */ + _ILGetFileType(pidl1, szItem1, MAX_PATH); + _ILGetFileType(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 3: /* Modified */ + _ILGetFileDateTime(pidl1, &ft1); + _ILGetFileDateTime(pidl1, &ft2); + hr = CompareFileTime(&ft1, &ft2); + break; + case 4: /* Attributes */ + _ILGetFileAttributes(pidl1, szItem1, MAX_PATH); + _ILGetFileAttributes(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + } + return hr; } /************************************************************************** Index: dll/win32/shell32/folders/CNetFolder.cpp =================================================================== --- dll/win32/shell32/folders/CNetFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CNetFolder.cpp (working copy) @@ -32,10 +32,10 @@ */ static shvheader NetworkPlacesSFHeader[] = { - {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN13, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN_WORKGROUP, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_NETWORKLOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15} + {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN13, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}, + {IDS_SHV_COLUMN_WORKGROUP, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_NETWORKLOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15} }; #define COLUMN_NAME 0 Index: dll/win32/shell32/folders/CPrinterFolder.cpp =================================================================== --- dll/win32/shell32/folders/CPrinterFolder.cpp (revision 69628) +++ dll/win32/shell32/folders/CPrinterFolder.cpp (working copy) @@ -57,12 +57,12 @@ }; static shvheader PrinterSFHeader[] = { - {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN_MODEL, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15} + {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN_DOCUMENTS , SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15}, + {IDS_SHV_COLUMN_MODEL, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15} }; #define COLUMN_NAME 0 Index: dll/win32/shell32/folders/CRecycleBin.cpp =================================================================== --- dll/win32/shell32/folders/CRecycleBin.cpp (revision 69628) +++ dll/win32/shell32/folders/CRecycleBin.cpp (working copy) @@ -492,11 +492,46 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { - /* TODO */ - TRACE("(%p, %p, %p, %p)\n", this, (void *)lParam, pidl1, pidl2); - if (pidl1->mkid.cb != pidl2->mkid.cb) - return MAKE_HRESULT(SEVERITY_SUCCESS, 0, pidl1->mkid.cb - pidl2->mkid.cb); - return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (unsigned short)memcmp(pidl1->mkid.abID, pidl2->mkid.abID, pidl1->mkid.cb)); + HRESULT hr = 0; + PIDLRecycleStruct* pFileDetails1; + PIDLRecycleStruct* pFileDetails2; + CHAR szItem1[MAX_PATH], szItem2[MAX_PATH]; + FILETIME ft1, ft2; + + pFileDetails1 = _ILGetRecycleStruct(pidl1); + pFileDetails2 = _ILGetRecycleStruct(pidl2); + switch (lParam) + { + case 0: /* Name */ + _ILSimpleGetText(pidl1, szItem1, MAX_PATH); + _ILSimpleGetText(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 1: /* Orig. Location */ + _ILSimpleGetText(pidl1, szItem1, MAX_PATH); + _ILSimpleGetText(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 2: /* Date Deleted */ + hr = pFileDetails1->DeletionTime.dwHighDateTime - pFileDetails2->DeletionTime.dwHighDateTime; + if (hr == 0) + hr = pFileDetails1->DeletionTime.dwLowDateTime - pFileDetails2->DeletionTime.dwLowDateTime; + break; + case 3: /* Size */ + hr = pFileDetails1->FileSize.QuadPart - pFileDetails2->FileSize.QuadPart; + break; + case 4: /* Type */ + _ILGetFileType(pidl1, szItem1, MAX_PATH); + _ILGetFileType(pidl2, szItem2, MAX_PATH); + hr = lstrcmpiA(szItem1, szItem2); + break; + case 5: /* Modified */ + _ILGetFileDateTime(pidl1, &ft1); + _ILGetFileDateTime(pidl1, &ft2); + hr = CompareFileTime(&ft1, &ft2); + break; + } + return hr; } HRESULT WINAPI CRecycleBin::CreateViewObject(HWND hwndOwner, REFIID riid, void **ppv)