change explorer sort order so that virtual folders are moved after physical folders Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp _____
Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp --- trunk/reactos/subsys/system/explorer/shell/entries.cpp 2006-01-15 10:17:35 UTC (rev 20888) +++ trunk/reactos/subsys/system/explorer/shell/entries.cpp 2006-01-15 12:30:17 UTC (rev 20889) @@ -59,6 +59,7 @@
_bhfi_valid = false; _level = 0; _icon_id = ICID_UNKNOWN; + _shell_attribs = 0; _display_name = _data.cFileName; _type_name = NULL; _content = NULL; @@ -167,19 +168,53 @@ }
+ // 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 +}; + + // distinguish between ".", ".." and any other directory names +static TYPE_ORDER TypeOrderFromDirname(LPCTSTR name) +{ + if (name[0] == '.') { + if (name[1] == '\0') + return TO_DOT; // "." + + if (name[1]=='.' && name[2]=='\0') + return TO_DOTDOT; // ".." + } + + return TO_OTHER_DIR; // any other directory +} + // directories first... -static int compareType(const WIN32_FIND_DATA* fd1, const WIN32_FIND_DATA* fd2) +static int compareType(const Entry* entry1, const Entry* entry2) { - int order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; - int order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + const WIN32_FIND_DATA* fd1 = &entry1->_data; + const WIN32_FIND_DATA* fd2 = &entry2->_data;
- /* Handle "." and ".." as special case and move them at the very first beginning. */ - if (order1 && order2) { - order1 = fd1->cFileName[0]!='.'? 1: fd1->cFileName[1]=='.'? 2: fd1->cFileName[1]=='\0'? 3: 1; - order2 = fd2->cFileName[0]!='.'? 1: fd2->cFileName[1]=='.'? 2: fd2->cFileName[1]=='\0'? 3: 1; + int order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + int 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); }
- return order2==order1? 0: order2<order1? -1: 1; + // Move virtual folders after physical folders + if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM)) + order1 |= TO_VIRTUAL; + + if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM)) + order2 |= TO_VIRTUAL; + + return order2==order1? 0: order1<order2? -1: 1; }
@@ -190,28 +225,28 @@
static int compareName(const void* arg1, const void* arg2) { - const WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data; - const WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data; + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2;
- int cmp = compareType(fd1, fd2); + int cmp = compareType(entry1, entry2); if (cmp) return cmp;
- return lstrcmpi(fd1->cFileName, fd2->cFileName); + return lstrcmpi(entry1->_data.cFileName, entry2->_data.cFileName); }
static int compareExt(const void* arg1, const void* arg2) { - const WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data; - const WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data; + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; const TCHAR *name1, *name2, *ext1, *ext2;
- int cmp = compareType(fd1, fd2); + int cmp = compareType(entry1, entry2); if (cmp) return cmp;
- name1 = fd1->cFileName; - name2 = fd2->cFileName; + name1 = entry1->_data.cFileName; + name2 = entry2->_data.cFileName;
ext1 = _tcsrchr(name1, TEXT('.')); ext2 = _tcsrchr(name2, TEXT('.')); @@ -235,35 +270,35 @@
static int compareSize(const void* arg1, const void* arg2) { - WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data; - WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data; + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2;
- int cmp = compareType(fd1, fd2); + int cmp = compareType(entry1, entry2); if (cmp) return cmp;
- cmp = fd2->nFileSizeHigh - fd1->nFileSizeHigh; + cmp = entry2->_data.nFileSizeHigh - entry1->_data.nFileSizeHigh;
if (cmp < 0) return -1; else if (cmp > 0) return 1;
- cmp = fd2->nFileSizeLow - fd1->nFileSizeLow; + cmp = entry2->_data.nFileSizeLow - entry1->_data.nFileSizeLow;
return cmp<0? -1: cmp>0? 1: 0; }
static int compareDate(const void* arg1, const void* arg2) { - WIN32_FIND_DATA* fd1 = &(*(Entry**)arg1)->_data; - WIN32_FIND_DATA* fd2 = &(*(Entry**)arg2)->_data; + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2;
- int cmp = compareType(fd1, fd2); + int cmp = compareType(entry1, entry2); if (cmp) return cmp;
- return CompareFileTime(&fd2->ftLastWriteTime, &fd1->ftLastWriteTime); + return CompareFileTime(&entry2->_data.ftLastWriteTime, &entry1->_data.ftLastWriteTime); }