xref: /reactos/dll/cpl/intl/sort.c (revision c2c66aff)
1 /*
2  * PROJECT:         ReactOS International Control Panel
3  * FILE:            dll/cpl/intl/sort.c
4  * PURPOSE:         Sorting property page
5  * PROGRAMMER:      Eric Kohl
6  */
7 
8 #include "intl.h"
9 
10 static BOOL bSortPage = FALSE;
11 static LCID userLcid;
12 
13 static HWND hWndSortList = NULL;
14 
15 
16 static BOOL CALLBACK
SortTestEnumProc(PWSTR lpLocale)17 SortTestEnumProc(PWSTR lpLocale)
18 {
19     LCID lcid;
20 
21     lcid = wcstoul(lpLocale, NULL, 16);
22 
23     if ((LANGIDFROMLCID(lcid) == LANGIDFROMLCID(userLcid)) &&
24         (SORTIDFROMLCID(lcid) != SORTIDFROMLCID(userLcid)))
25         bSortPage = TRUE;
26 
27     return TRUE;
28 }
29 
30 
31 BOOL
IsSortPageNeeded(LCID lcid)32 IsSortPageNeeded(LCID lcid)
33 {
34     /* Handle special case for Spanish (Spain) */
35     if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
36         lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
37         return TRUE;
38 
39     userLcid = lcid;
40     bSortPage = FALSE;
41 
42     EnumSystemLocalesW(SortTestEnumProc, LCID_ALTERNATE_SORTS);
43 
44     return bSortPage;
45 }
46 
47 
48 static BOOL CALLBACK
SortEnumProc(LPTSTR lpLocale)49 SortEnumProc(LPTSTR lpLocale)
50 {
51     LCID lcid;
52     WCHAR lang[255];
53     INT index;
54 
55     lcid = wcstoul(lpLocale, NULL, 16);
56 
57     if ((LANGIDFROMLCID(lcid) == LANGIDFROMLCID(userLcid)) &&
58         (SORTIDFROMLCID(lcid) != SORTIDFROMLCID(userLcid)))
59     {
60         GetLocaleInfoW(lcid, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));
61 
62         index = SendMessageW(hWndSortList,
63                              CB_ADDSTRING,
64                              0,
65                              (LPARAM)lang);
66 
67         SendMessageW(hWndSortList,
68                      CB_SETITEMDATA,
69                      index,
70                      (LPARAM)lcid);
71     }
72 
73     return TRUE;
74 }
75 
76 static VOID
CreateSortList(HWND hwnd,LCID lcid)77 CreateSortList(HWND hwnd, LCID lcid)
78 {
79     WCHAR lang[255];
80     INT index;
81 
82     hWndSortList = hwnd;
83 
84     /* Handle special case for Spanish (Spain) */
85     if (lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH), SORT_DEFAULT) ||
86         lcid == MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN), SORT_DEFAULT))
87     {
88         /* Add traditional sorting */
89         GetLocaleInfoW(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH),
90                        LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(TCHAR));
91 
92         index = SendMessageW(hwnd,
93                              CB_ADDSTRING,
94                              0,
95                              (LPARAM)lang);
96 
97         SendMessageW(hwnd,
98                      CB_SETITEMDATA,
99                      index,
100                      (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH));
101 
102         /* Add modern sorting */
103         GetLocaleInfoW(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN),
104                        LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(TCHAR));
105 
106         index = SendMessageW(hwnd,
107                              CB_ADDSTRING,
108                              0,
109                              (LPARAM)lang);
110 
111         SendMessageW(hwnd,
112                      CB_SETITEMDATA,
113                      index,
114                      (LPARAM)MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MODERN));
115     }
116     else
117     {
118         userLcid = lcid;
119 
120         GetLocaleInfoW(lcid & 0xFFFF, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));
121 
122         index = SendMessageW(hWndSortList,
123                              CB_ADDSTRING,
124                              0,
125                              (LPARAM)lang);
126 
127         SendMessageW(hWndSortList,
128                      CB_SETITEMDATA,
129                      index,
130                      (LPARAM)lcid & 0xFFFF);
131 
132         EnumSystemLocalesW(SortEnumProc, LCID_ALTERNATE_SORTS);
133     }
134 
135     /* Select current locale */
136     /* or should it be System and not user? */
137     GetLocaleInfoW(lcid, LOCALE_SSORTNAME, lang, sizeof(lang)/sizeof(WCHAR));
138 
139     SendMessageW(hwnd,
140                  CB_SELECTSTRING,
141                  -1,
142                  (LPARAM)lang);
143 }
144 
145 /* Property page dialog callback */
146 INT_PTR CALLBACK
SortPageProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)147 SortPageProc(HWND hwndDlg,
148              UINT uMsg,
149              WPARAM wParam,
150              LPARAM lParam)
151 {
152     PGLOBALDATA pGlobalData;
153 
154     pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
155 
156     switch (uMsg)
157     {
158         case WM_INITDIALOG:
159             pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
160             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
161 
162             CreateSortList(GetDlgItem(hwndDlg, IDC_SORTLIST_COMBO), pGlobalData->UserLCID);
163             break;
164 
165         case WM_COMMAND:
166             switch (LOWORD(wParam))
167             {
168                 case IDC_SORTLIST_COMBO:
169                     if (HIWORD(wParam) == CBN_SELCHANGE)
170                     {
171                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
172                     }
173                     break;
174             }
175             break;
176 
177         case WM_NOTIFY:
178             if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
179             {
180                 LCID NewLcid;
181                 INT iCurSel;
182 
183                 iCurSel = SendDlgItemMessage(hwndDlg,
184                                              IDC_SORTLIST_COMBO,
185                                              CB_GETCURSEL,
186                                              0,
187                                              0);
188                 if (iCurSel == CB_ERR)
189                     break;
190 
191                 NewLcid = SendDlgItemMessage(hwndDlg,
192                                              IDC_SORTLIST_COMBO,
193                                              CB_GETITEMDATA,
194                                              iCurSel,
195                                              0);
196                 if (NewLcid == (LCID)CB_ERR)
197                     break;
198 
199                 /* Save the new LCID */
200                 pGlobalData->UserLCID = NewLcid;
201                 pGlobalData->bUserLocaleChanged = TRUE;
202             }
203             break;
204     }
205 
206   return FALSE;
207 }
208 
209 /* EOF */
210