Skip to content

Commit 5231a7f

Browse files
katahiromzJoachimHenze
authored andcommitted
[0.4.8] cherry-pick [SHELL32] Fix item order in Folder Options (reactos#415)
This fixes regression CORE-14393 for russian ros setups. (cherry picked from commit 1f4c636) cherry-picked by Joachim Henze
1 parent 64dcc95 commit 5231a7f

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

dll/win32/shell32/dialogs/folder_options.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ CreateTreeImageList(VOID)
359359
static ADVANCED_ENTRY *
360360
Advanced_GetItem(DWORD dwID)
361361
{
362+
if (dwID == DWORD(-1))
363+
return NULL;
364+
362365
for (INT i = 0; i < s_AdvancedCount; ++i)
363366
{
364367
ADVANCED_ENTRY *pEntry = &s_Advanced[i];
@@ -701,24 +704,52 @@ Advanced_Compare(const void *x, const void *y)
701704
{
702705
ADVANCED_ENTRY *pEntry1 = (ADVANCED_ENTRY *)x;
703706
ADVANCED_ENTRY *pEntry2 = (ADVANCED_ENTRY *)y;
707+
704708
DWORD dwParentID1 = pEntry1->dwParentID;
705709
DWORD dwParentID2 = pEntry2->dwParentID;
706-
while (dwParentID1 != dwParentID2)
710+
711+
if (dwParentID1 == dwParentID2)
712+
return lstrcmpi(pEntry1->szText, pEntry2->szText);
713+
714+
DWORD i, m, n;
715+
const UINT MAX_DEPTH = 32;
716+
ADVANCED_ENTRY *pArray1[MAX_DEPTH];
717+
ADVANCED_ENTRY *pArray2[MAX_DEPTH];
718+
719+
// Make ancestor lists
720+
for (i = m = n = 0; i < MAX_DEPTH; ++i)
707721
{
708722
ADVANCED_ENTRY *pParent1 = Advanced_GetItem(dwParentID1);
709723
ADVANCED_ENTRY *pParent2 = Advanced_GetItem(dwParentID2);
710724
if (!pParent1 && !pParent2)
711725
break;
712-
if (!pParent1 && pParent2)
726+
727+
if (pParent1)
728+
{
729+
pArray1[m++] = pParent1;
730+
dwParentID1 = pParent1->dwParentID;
731+
}
732+
if (pParent2)
733+
{
734+
pArray2[n++] = pParent2;
735+
dwParentID2 = pParent2->dwParentID;
736+
}
737+
}
738+
739+
UINT k = min(m, n);
740+
for (i = 0; i < k; ++i)
741+
{
742+
INT nCompare = lstrcmpi(pArray1[m - i - 1]->szText, pArray2[n - i - 1]->szText);
743+
if (nCompare < 0)
713744
return -1;
714-
if (pParent1 && !pParent2)
745+
if (nCompare > 0)
715746
return 1;
716-
INT nCompare = lstrcmpi(pParent1->szText, pParent2->szText);
717-
if (nCompare)
718-
return nCompare;
719-
dwParentID1 = pParent1->dwParentID;
720-
dwParentID2 = pParent2->dwParentID;
721747
}
748+
749+
if (m < n)
750+
return -1;
751+
if (m > n)
752+
return 1;
722753
return lstrcmpi(pEntry1->szText, pEntry2->szText);
723754
}
724755

0 commit comments

Comments
 (0)