xref: /reactos/dll/cpl/intl/time.c (revision 23373acb)
1 /*
2  *  ReactOS
3  *  Copyright (C) 2004 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License along
16  *  with this program; if not, write to the Free Software Foundation, Inc.,
17  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  * PROJECT:         ReactOS International Control Panel
21  * FILE:            dll/cpl/intl/time.c
22  * PURPOSE:         Time property page
23  * PROGRAMMERS:     Eric Kohl
24  *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
25  */
26 
27 #include "intl.h"
28 
29 static HWND hwndTimeEnum = NULL;
30 
31 static BOOL CALLBACK
32 TimeFormatEnumProc(PWSTR lpTimeFormatString)
33 {
34     SendMessageW(hwndTimeEnum,
35                 CB_ADDSTRING,
36                 0,
37                 (LPARAM)lpTimeFormatString);
38 
39     return TRUE;
40 }
41 
42 static VOID
43 UpdateTimeSample(HWND hWnd, PGLOBALDATA pGlobalData)
44 {
45     WCHAR szBuffer[MAX_SAMPLES_STR_SIZE];
46 
47     GetTimeFormatW(pGlobalData->UserLCID, 0, NULL,
48                    pGlobalData->szTimeFormat, szBuffer,
49                    MAX_SAMPLES_STR_SIZE);
50     SendDlgItemMessageW(hWnd, IDC_TIMESAMPLE, WM_SETTEXT, 0, (LPARAM)szBuffer);
51 }
52 
53 
54 static
55 VOID
56 InitTimeFormatCB(
57     HWND hwndDlg,
58     PGLOBALDATA pGlobalData)
59 {
60     /* Get the time format */
61     SendDlgItemMessageW(hwndDlg, IDC_TIMEFORMAT,
62                         CB_LIMITTEXT, MAX_TIMEFORMAT, 0);
63 
64     /* Add available time formats to the list */
65     hwndTimeEnum = GetDlgItem(hwndDlg, IDC_TIMEFORMAT);
66     EnumTimeFormatsW(TimeFormatEnumProc, pGlobalData->UserLCID, 0);
67 
68     SendDlgItemMessageW(hwndDlg, IDC_TIMEFORMAT,
69                         CB_SELECTSTRING,
70                         -1,
71                         (LPARAM)pGlobalData->szTimeFormat);
72 }
73 
74 static
75 VOID
76 InitTimeSeparatorCB(
77     HWND hwndDlg,
78     PGLOBALDATA pGlobalData)
79 {
80     SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
81                         CB_LIMITTEXT, MAX_TIMESEPARATOR, 0);
82 
83     SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
84                         CB_ADDSTRING,
85                         0,
86                         (LPARAM)pGlobalData->szTimeSep);
87 
88     SendDlgItemMessageW(hwndDlg, IDC_TIMESEPARATOR,
89                         CB_SETCURSEL,
90                         0, /* Index */
91                         0);
92 }
93 
94 
95 static
96 VOID
97 InitAmSymbol(
98     HWND hwndDlg,
99     PGLOBALDATA pGlobalData)
100 {
101     int nLen;
102 
103     SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
104                         CB_LIMITTEXT, MAX_TIMEAMSYMBOL, 0);
105 
106     nLen = wcslen(pGlobalData->szTimeAM);
107 
108     SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
109                         CB_ADDSTRING,
110                         0,
111                         (LPARAM)pGlobalData->szTimeAM);
112     if (nLen != 0)
113     {
114         SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
115                             CB_ADDSTRING,
116                             0,
117                             (LPARAM)L"");
118     }
119 
120     SendDlgItemMessageW(hwndDlg, IDC_TIMEAMSYMBOL,
121                         CB_SETCURSEL,
122                         0, /* Index */
123                         0);
124 }
125 
126 
127 static
128 VOID
129 InitPmSymbol(
130     HWND hwndDlg,
131     PGLOBALDATA pGlobalData)
132 {
133     int nLen;
134 
135     SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
136                         CB_LIMITTEXT, MAX_TIMEPMSYMBOL, 0);
137 
138     nLen = wcslen(pGlobalData->szTimeAM);
139 
140     SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
141                         CB_ADDSTRING,
142                         0,
143                         (LPARAM)pGlobalData->szTimePM);
144     if (nLen != 0)
145     {
146         SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
147                             CB_ADDSTRING,
148                             0,
149                             (LPARAM)L"");
150     }
151     SendDlgItemMessageW(hwndDlg, IDC_TIMEPMSYMBOL,
152                         CB_SETCURSEL,
153                         0, /* Index */
154                         0);
155 }
156 
157 
158 static
159 BOOL
160 GetTimeSetting(
161     HWND hwndDlg,
162     PGLOBALDATA pGlobalData)
163 {
164     WCHAR szTimeFormat[MAX_TIMEFORMAT];
165     WCHAR szTimeSep[MAX_TIMESEPARATOR];
166     WCHAR szTimeAM[MAX_TIMEAMSYMBOL];
167     WCHAR szTimePM[MAX_TIMEPMSYMBOL];
168 
169     /* Time format */
170     GetSelectedComboBoxText(hwndDlg,
171                             IDC_TIMEFORMAT,
172                             szTimeFormat,
173                             MAX_TIMEFORMAT);
174 
175     /* Check the time format */
176     if (szTimeFormat[0] == L'\0')
177     {
178         /* TODO: Show error message */
179 
180         return FALSE;
181     }
182 
183     /* Time separator */
184     GetSelectedComboBoxText(hwndDlg,
185                             IDC_TIMESEPARATOR,
186                             szTimeSep,
187                             MAX_TIMESEPARATOR);
188 
189     /* Check the time separator */
190     if (szTimeSep[0] == L'\0')
191     {
192         /* TODO: Show error message */
193 
194         return FALSE;
195     }
196 
197     /* AM symbol */
198     GetSelectedComboBoxText(hwndDlg,
199                             IDC_TIMEAMSYMBOL,
200                             szTimeAM,
201                             MAX_TIMEAMSYMBOL);
202 
203     /* PM symbol */
204     GetSelectedComboBoxText(hwndDlg,
205                             IDC_TIMEPMSYMBOL,
206                             szTimePM,
207                             MAX_TIMEPMSYMBOL);
208 
209     /* Store settings in global data */
210     wcscpy(pGlobalData->szTimeFormat, szTimeFormat);
211     wcscpy(pGlobalData->szTimeSep, szTimeSep);
212     wcscpy(pGlobalData->szTimeAM, szTimeAM);
213     wcscpy(pGlobalData->szTimePM, szTimePM);
214 
215     return TRUE;
216 }
217 
218 /* Property page dialog callback */
219 INT_PTR CALLBACK
220 TimePageProc(HWND hwndDlg,
221              UINT uMsg,
222              WPARAM wParam,
223              LPARAM lParam)
224 {
225     PGLOBALDATA pGlobalData;
226 
227     pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
228 
229     switch (uMsg)
230     {
231         case WM_INITDIALOG:
232             pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam;
233             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
234 
235             /* Get the time format */
236             InitTimeFormatCB(hwndDlg, pGlobalData);
237 
238             /* Get the time separator */
239             InitTimeSeparatorCB(hwndDlg, pGlobalData);
240 
241             /* Get the AM symbol */
242             InitAmSymbol(hwndDlg, pGlobalData);
243 
244             /* Get the PM symbol */
245             InitPmSymbol(hwndDlg, pGlobalData);
246 
247             /* Update the time format sample */
248             UpdateTimeSample(hwndDlg, pGlobalData);
249             break;
250 
251         case WM_COMMAND:
252             switch (LOWORD(wParam))
253             {
254                 case IDC_TIMEFORMAT:
255                 case IDC_TIMESEPARATOR:
256                 case IDC_TIMEAMSYMBOL:
257                 case IDC_TIMEPMSYMBOL:
258                     if (HIWORD(wParam) == CBN_SELCHANGE ||
259                         HIWORD(wParam) == CBN_EDITCHANGE)
260                     {
261                         /* Enable the Apply button */
262                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
263                     }
264                     break;
265             }
266             break;
267 
268         case WM_NOTIFY:
269             if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
270             {
271                 if (GetTimeSetting(hwndDlg, pGlobalData))
272                 {
273                     pGlobalData->bUserLocaleChanged = TRUE;
274                     UpdateTimeSample(hwndDlg, pGlobalData);
275                 }
276             }
277             break;
278     }
279 
280     return FALSE;
281 }
282 
283 /* EOF */
284