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