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);