Explorer: sort drives by path name; ignore hidden attribute of NTFS volumes This resolves Bugzilla issue 1236 Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.cpp _____
Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp --- trunk/reactos/subsys/system/explorer/shell/entries.cpp 2006-01-15 13:25:50 UTC (rev 20891) +++ trunk/reactos/subsys/system/explorer/shell/entries.cpp 2006-01-15 13:44:14 UTC (rev 20892) @@ -170,12 +170,12 @@
// sort order for different directory/file types enum TYPE_ORDER { - TO_DIR = 0, - TO_DOT = 1, - TO_DOTDOT = 2, - TO_OTHER_DIR= 3, - TO_FILE = 4, - TO_VIRTUAL = 8 + TO_DIR, + TO_DOT, + TO_DOTDOT, + TO_OTHER_DIR, + TO_VIRTUAL_FOLDER, + TO_FILE };
// distinguish between ".", ".." and any other directory names @@ -198,21 +198,21 @@ const WIN32_FIND_DATA* fd1 = &entry1->_data; const WIN32_FIND_DATA* fd2 = &entry2->_data;
- int order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; - int order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + TYPE_ORDER order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + TYPE_ORDER order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE;
// Handle "." and ".." as special case and move them at the very first beginning. if (order1==TO_DIR && order2==TO_DIR) { order1 = TypeOrderFromDirname(fd1->cFileName); order2 = TypeOrderFromDirname(fd2->cFileName); - }
- // Move virtual folders after physical folders - if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM)) - order1 |= TO_VIRTUAL; + // Move virtual folders after physical folders + if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM)) + order1 = TO_VIRTUAL_FOLDER;
- if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM)) - order2 |= TO_VIRTUAL; + if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM)) + order2 = TO_VIRTUAL_FOLDER; + }
return order2==order1? 0: order1<order2? -1: 1; } _____
Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.cpp --- trunk/reactos/subsys/system/explorer/shell/shellfs.cpp 2006-01-15 13:25:50 UTC (rev 20891) +++ trunk/reactos/subsys/system/explorer/shell/shellfs.cpp 2006-01-15 13:44:14 UTC (rev 20892) @@ -72,8 +72,15 @@
pw32fdata->ftLastWriteTime = fad.ftLastWriteTime;
if (!(fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + // copy file size
pw32fdata->nFileSizeLow = fad.nFileSizeLow;
pw32fdata->nFileSizeHigh = fad.nFileSizeHigh; + } else { + // ignore FILE_ATTRIBUTE_HIDDEN attribute of NTFS drives - this would hide those drives in ShellBrowser + if (pw32fdata->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) { + if (path[1]==':' && path[2]=='\' && !path[3]) // Is it a drive path? + pw32fdata->dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN; + } } }
@@ -355,6 +362,7 @@ ShellItemEnumerator enumerator(_folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREAB LE|SHCONTF_STORAGE);
TCHAR name[MAX_PATH]; + TCHAR path[MAX_PATH]; HRESULT hr_next = S_OK;
do { @@ -423,6 +431,11 @@ if (bhfi_valid) memcpy(&entry->_bhfi, &bhfi, sizeof(BY_HANDLE_FILE_INFORMATION));
+ // store path in entry->_data.cFileName in case fill_w32fdata_shell() didn't already fill it + if (!entry->_data.cFileName[0]) + if (SUCCEEDED(path_from_pidl(_folder, pidls[n], path, COUNTOF(path)))) + _tcscpy(entry->_data.cFileName, path); + if (SUCCEEDED(name_from_pidl(_folder, pidls[n], name, COUNTOF(name), SHGDN_INFOLDER|0x2000/*0x2000=SHGDN_INCLUDE_NONFILESYS*/))) { if (!entry->_data.cFileName[0])
_tcscpy(entry->_data.cFileName, name);