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