[CPL][SHELL32] Add icons to input, joy, sysdm, folder options (#1138)
[reactos.git] / dll / cpl / sysdm / hardprof.c
1 /*
2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/hardprof.c
5 * PURPOSE: Modify hardware profiles
6 * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
7 *
8 */
9
10 #include "precomp.h"
11
12 #include <debug.h>
13
14 #define PROFILE_NAME_LENGTH 80
15
16 typedef struct _PROFILE
17 {
18 WCHAR szFriendlyName[PROFILE_NAME_LENGTH];
19 WCHAR szName[5];
20 DWORD dwProfileNumber;
21 DWORD dwPreferenceOrder;
22 } PROFILE, *PPROFILE;
23
24 typedef struct _PROFILEDATA
25 {
26 DWORD dwProfileCount;
27 DWORD dwLastProfile;
28 DWORD dwSelectedProfile;
29 DWORD dwSelectedProfileIndex;
30 PPROFILE pProfiles;
31 } PROFILEDATA, *PPROFILEDATA;
32
33 typedef struct _PROFILENAMES
34 {
35 WCHAR szSourceName[PROFILE_NAME_LENGTH];
36 WCHAR szDestinationName[PROFILE_NAME_LENGTH];
37 PPROFILEDATA pProfileData;
38 } PROFILENAMES, *PPROFILENAMES;
39
40
41 static
42 VOID
43 UpdateButtons(
44 HWND hwndDlg,
45 PPROFILEDATA pProfileData)
46 {
47 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFPROP), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE);
48 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFCOPY), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE);
49 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFRENAME), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE);
50 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDEL), (pProfileData->dwSelectedProfileIndex != (DWORD)-1) ? TRUE : FALSE);
51
52 if (pProfileData->dwProfileCount < 2)
53 {
54 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFUP), FALSE);
55 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDWN), FALSE);
56 }
57 else
58 {
59 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFUP),
60 (pProfileData->dwSelectedProfileIndex > 0) ? TRUE : FALSE);
61 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFDWN),
62 (pProfileData->dwSelectedProfileIndex < pProfileData->dwProfileCount - 1) ? TRUE : FALSE);
63 }
64 }
65
66
67 static
68 BOOL
69 IsProfileNameInUse(
70 PPROFILENAMES pProfileNames,
71 BOOL bIgnoreCurrent)
72 {
73 DWORD i;
74
75 for (i = 0; i < pProfileNames->pProfileData->dwProfileCount; i++)
76 {
77 if (bIgnoreCurrent == TRUE && i == pProfileNames->pProfileData->dwSelectedProfileIndex)
78 continue;
79
80 if (wcscmp(pProfileNames->pProfileData->pProfiles[i].szFriendlyName, pProfileNames->szDestinationName) == 0)
81 return TRUE;
82 }
83
84 return FALSE;
85 }
86
87
88 static
89 INT_PTR
90 CALLBACK
91 CopyProfileDlgProc(
92 HWND hwndDlg,
93 UINT uMsg,
94 WPARAM wParam,
95 LPARAM lParam)
96 {
97 PPROFILENAMES pProfileNames;
98
99 pProfileNames = (PPROFILENAMES)GetWindowLongPtr(hwndDlg, DWLP_USER);
100
101 switch (uMsg)
102 {
103 case WM_INITDIALOG:
104 SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);
105 pProfileNames = (PPROFILENAMES)lParam;
106
107 /* Set the old name */
108 SetDlgItemText(hwndDlg, IDC_COPYPROFILEFROM, pProfileNames->szSourceName);
109
110 /* Set the new name */
111 SendDlgItemMessageW(hwndDlg, IDC_COPYPROFILETO, EM_SETLIMITTEXT, PROFILE_NAME_LENGTH - 1, 0);
112 SetDlgItemText(hwndDlg, IDC_COPYPROFILETO, pProfileNames->szDestinationName);
113 break;
114
115 case WM_COMMAND:
116 switch (LOWORD(wParam))
117 {
118 case IDOK:
119 GetDlgItemText(hwndDlg,
120 IDC_COPYPROFILETO,
121 pProfileNames->szDestinationName,
122 PROFILE_NAME_LENGTH);
123 if (IsProfileNameInUse(pProfileNames, FALSE))
124 ResourceMessageBox(hApplet,
125 NULL,
126 MB_OK | MB_ICONERROR,
127 IDS_HWPROFILE_WARNING,
128 IDS_HWPROFILE_ALREADY_IN_USE);
129 else
130 EndDialog(hwndDlg, IDOK);
131 return TRUE;
132
133 case IDCANCEL:
134 EndDialog(hwndDlg, IDCANCEL);
135 return TRUE;
136 }
137 break;
138 }
139
140 return FALSE;
141 }
142
143
144 static
145 VOID
146 CopyHardwareProfile(
147 HWND hwndDlg,
148 PPROFILEDATA pProfileData)
149 {
150 PROFILENAMES ProfileNames;
151 PPROFILE pProfile, pNewProfiles, pNewProfile;
152 WCHAR szBuffer[80];
153
154 pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex];
155
156 LoadStringW(hApplet, IDS_HWPROFILE_PROFILE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR));
157
158 wcscpy(ProfileNames.szSourceName, pProfile->szFriendlyName);
159 swprintf(ProfileNames.szDestinationName, L"%s %lu", szBuffer, pProfileData->dwProfileCount);
160
161 ProfileNames.pProfileData = pProfileData;
162
163 if (DialogBoxParam(hApplet,
164 MAKEINTRESOURCE(IDD_COPYPROFILE),
165 hwndDlg,
166 CopyProfileDlgProc,
167 (LPARAM)&ProfileNames) != IDOK)
168 return;
169
170 /* Apply new name only if it has been changed */
171 if (wcscmp(ProfileNames.szSourceName, ProfileNames.szDestinationName) == 0)
172 return;
173
174 /* Allocate memory for the new profile */
175 pNewProfiles = HeapReAlloc(GetProcessHeap(),
176 HEAP_ZERO_MEMORY,
177 pProfileData->pProfiles,
178 (pProfileData->dwProfileCount + 1) * sizeof(PROFILE));
179 if (pNewProfiles == NULL)
180 {
181 DPRINT1("HeapReAlloc() failed!\n");
182 return;
183 }
184
185 pProfileData->dwProfileCount++;
186 pProfileData->pProfiles = pNewProfiles;
187
188 pNewProfile = &pProfileData->pProfiles[pProfileData->dwProfileCount - 1];
189
190 CopyMemory(pNewProfile, pProfile, sizeof(PROFILE));
191
192 wcscpy(pNewProfile->szFriendlyName, ProfileNames.szDestinationName);
193
194 pNewProfile->dwProfileNumber = ++pProfileData->dwLastProfile;
195 swprintf(pNewProfile->szName, L"%04lu", pNewProfile->dwProfileNumber);
196
197 pNewProfile->dwPreferenceOrder = pNewProfile->dwProfileNumber;
198
199 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_ADDSTRING, 0, (LPARAM)pNewProfile->szFriendlyName);
200
201 UpdateButtons(hwndDlg, pProfileData);
202 }
203
204
205 static
206 INT_PTR
207 CALLBACK
208 RenameProfileDlgProc(
209 HWND hwndDlg,
210 UINT uMsg,
211 WPARAM wParam,
212 LPARAM lParam)
213 {
214 PPROFILENAMES pProfileNames;
215
216 pProfileNames = (PPROFILENAMES)GetWindowLongPtr(hwndDlg, DWLP_USER);
217
218 switch (uMsg)
219 {
220 case WM_INITDIALOG:
221 SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);
222 pProfileNames = (PPROFILENAMES)lParam;
223
224 /* Set the old name */
225 SetDlgItemText(hwndDlg, IDC_RENPROFEDITFROM, pProfileNames->szSourceName);
226
227 /* Set the new name */
228 SendDlgItemMessageW(hwndDlg, IDC_RENPROFEDITTO, EM_SETLIMITTEXT, PROFILE_NAME_LENGTH - 1, 0);
229 SetDlgItemText(hwndDlg, IDC_RENPROFEDITTO, pProfileNames->szDestinationName);
230 break;
231
232 case WM_COMMAND:
233 switch (LOWORD(wParam))
234 {
235 case IDOK:
236 GetDlgItemText(hwndDlg,
237 IDC_RENPROFEDITTO,
238 pProfileNames->szDestinationName,
239 PROFILE_NAME_LENGTH);
240 if (IsProfileNameInUse(pProfileNames, TRUE))
241 ResourceMessageBox(hApplet,
242 NULL,
243 MB_OK | MB_ICONERROR,
244 IDS_HWPROFILE_WARNING,
245 IDS_HWPROFILE_ALREADY_IN_USE);
246 else
247 EndDialog(hwndDlg, IDOK);
248 return TRUE;
249
250 case IDCANCEL:
251 EndDialog(hwndDlg, IDCANCEL);
252 return TRUE;
253 }
254 break;
255 }
256
257 return FALSE;
258 }
259
260
261 static
262 VOID
263 RenameHardwareProfile(
264 HWND hwndDlg,
265 PPROFILEDATA pProfileData)
266 {
267 PROFILENAMES ProfileNames;
268 PPROFILE pProfile;
269 WCHAR szBuffer[80];
270
271 pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex];
272
273 LoadStringW(hApplet, IDS_HWPROFILE_PROFILE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR));
274
275 wcscpy(ProfileNames.szSourceName, pProfile->szFriendlyName);
276 swprintf(ProfileNames.szDestinationName, L"%s %lu", szBuffer, pProfileData->dwProfileCount);
277
278 ProfileNames.pProfileData = pProfileData;
279
280 if (DialogBoxParam(hApplet,
281 MAKEINTRESOURCE(IDD_RENAMEPROFILE),
282 hwndDlg,
283 RenameProfileDlgProc,
284 (LPARAM)&ProfileNames) != IDOK)
285 return;
286
287 /* Apply new name only if it has been changed */
288 if (wcscmp(pProfile->szFriendlyName, ProfileNames.szDestinationName) == 0)
289 return;
290
291 /* Replace the profile name in the profile list */
292 wcscpy(pProfile->szFriendlyName, ProfileNames.szDestinationName);
293
294 /* Replace the profile name in the listbox */
295 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, pProfileData->dwSelectedProfileIndex, 0);
296 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_INSERTSTRING, pProfileData->dwSelectedProfileIndex, (LPARAM)pProfile->szFriendlyName);
297 }
298
299
300 static
301 VOID
302 DeleteHardwareProfile(
303 HWND hwndDlg,
304 PPROFILEDATA pProfileData)
305 {
306 WCHAR szMessage[256];
307 WCHAR szBuffer[128];
308 WCHAR szCaption[80];
309 PPROFILE pProfiles;
310 PPROFILE pProfile;
311
312 pProfile = &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex];
313
314 LoadStringW(hApplet, IDS_HWPROFILE_CONFIRM_DELETE_TITLE, szCaption, sizeof(szCaption) / sizeof(WCHAR));
315 LoadStringW(hApplet, IDS_HWPROFILE_CONFIRM_DELETE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR));
316 swprintf(szMessage, szBuffer, pProfile->szFriendlyName);
317
318 if (MessageBox(NULL,
319 szMessage,
320 szCaption,
321 MB_YESNO | MB_ICONQUESTION) != IDYES)
322 return;
323
324 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, pProfileData->dwSelectedProfileIndex, 0);
325
326 if (pProfileData->dwSelectedProfileIndex != pProfileData->dwProfileCount - 1)
327 {
328 RtlMoveMemory(&pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex],
329 &pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex + 1],
330 (pProfileData->dwProfileCount - pProfileData->dwSelectedProfileIndex - 1) * sizeof(PROFILE));
331 }
332 else
333 {
334 pProfileData->dwSelectedProfileIndex--;
335 }
336
337 pProfiles = HeapReAlloc(GetProcessHeap(),
338 HEAP_ZERO_MEMORY,
339 pProfileData->pProfiles,
340 (pProfileData->dwProfileCount - 1) * sizeof(PROFILE));
341 if (pProfiles == NULL)
342 {
343 DPRINT1("HeapReAlloc() failed!\n");
344 return;
345 }
346
347 pProfileData->dwProfileCount--;
348 pProfileData->pProfiles = pProfiles;
349
350 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_SETCURSEL, pProfileData->dwSelectedProfileIndex, 0);
351
352 UpdateButtons(hwndDlg, pProfileData);
353 }
354
355
356 static
357 VOID
358 MoveHardwareProfile(
359 HWND hwndDlg,
360 PPROFILEDATA pProfileData,
361 BOOL bMoveUp)
362 {
363 PROFILE TempProfile;
364 PPROFILE pSrcProfile, pDstProfile;
365 DWORD dwSrcIndex, dwDstIndex;
366
367 dwSrcIndex = pProfileData->dwSelectedProfileIndex;
368 dwDstIndex = bMoveUp ? (dwSrcIndex - 1) : (dwSrcIndex + 1);
369
370 pSrcProfile = &pProfileData->pProfiles[dwSrcIndex];
371 pDstProfile = &pProfileData->pProfiles[dwDstIndex];
372
373 CopyMemory(&TempProfile, pDstProfile, sizeof(PROFILE));
374 CopyMemory(pDstProfile, pSrcProfile, sizeof(PROFILE));
375 CopyMemory(pSrcProfile, &TempProfile, sizeof(PROFILE));
376
377 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_DELETESTRING, dwSrcIndex, 0);
378 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_INSERTSTRING, dwDstIndex, (LPARAM)pDstProfile->szFriendlyName);
379
380 pProfileData->dwSelectedProfileIndex = dwDstIndex;
381 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_SETCURSEL, pProfileData->dwSelectedProfileIndex, 0);
382
383 UpdateButtons(hwndDlg, pProfileData);
384 }
385
386
387 static
388 INT_PTR
389 CALLBACK
390 HardwareProfilePropertiesDlgProc(
391 HWND hwndDlg,
392 UINT uMsg,
393 WPARAM wParam,
394 LPARAM lParam)
395 {
396 UNREFERENCED_PARAMETER(hwndDlg);
397 UNREFERENCED_PARAMETER(lParam);
398 UNREFERENCED_PARAMETER(wParam);
399
400 switch (uMsg)
401 {
402 case WM_INITDIALOG:
403 return TRUE;
404
405 }
406
407 return FALSE;
408 }
409
410 static int CALLBACK
411 PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
412 {
413 // NOTE: This callback is needed to set large icon correctly.
414 HICON hIcon;
415 switch (uMsg)
416 {
417 case PSCB_INITIALIZED:
418 {
419 hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_HARDPROF));
420 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
421 break;
422 }
423 }
424 return 0;
425 }
426
427 static
428 VOID
429 HardwareProfileProperties(
430 HWND hwndDlg,
431 PPROFILEDATA pProfileData)
432 {
433 HPROPSHEETPAGE hpsp;
434 PROPSHEETHEADER psh;
435 PROPSHEETPAGE psp;
436
437 ZeroMemory(&psp, sizeof(psp));
438 psp.dwSize = sizeof(psp);
439 psp.dwFlags = PSP_DEFAULT;
440 psp.hInstance = hApplet;
441 psp.pszTemplate = MAKEINTRESOURCE(IDD_HARDWAREPROFILE);
442 psp.pfnDlgProc = HardwareProfilePropertiesDlgProc;
443
444 hpsp = CreatePropertySheetPage(&psp);
445 if (hpsp == NULL)
446 {
447 return;
448 }
449
450 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
451 psh.dwSize = sizeof(PROPSHEETHEADER);
452 psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK;
453 psh.hwndParent = hwndDlg;
454 psh.hInstance = hApplet;
455 psh.pszIcon = MAKEINTRESOURCEW(IDI_HARDPROF);
456 psh.pszCaption = pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex].szFriendlyName;
457 psh.nPages = 1;
458 psh.nStartPage = 0;
459 psh.phpage = &hpsp;
460 psh.pfnCallback = PropSheetProc;
461
462 PropertySheet(&psh);
463 }
464
465
466 static
467 DWORD
468 GetUserWaitInterval(VOID)
469 {
470 DWORD dwWaitInterval = 30;
471 DWORD dwSize;
472 HKEY hKey;
473
474 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
475 L"System\\CurrentControlSet\\Control\\IDConfigDB",
476 0,
477 KEY_QUERY_VALUE,
478 &hKey))
479 return dwWaitInterval;
480
481 dwSize = sizeof(DWORD);
482 RegQueryValueExW(hKey,
483 L"UserWaitInterval",
484 NULL,
485 NULL,
486 (LPBYTE)&dwWaitInterval,
487 &dwSize);
488
489 RegCloseKey(hKey);
490
491 return dwWaitInterval;
492 }
493
494
495 static
496 VOID
497 SetUserWaitInterval(DWORD dwWaitInterval)
498 {
499 HKEY hKey;
500
501 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
502 L"System\\CurrentControlSet\\Control\\IDConfigDB",
503 0,
504 KEY_SET_VALUE,
505 &hKey))
506 return;
507
508 RegSetValueExW(hKey,
509 L"UserWaitInterval",
510 0,
511 REG_DWORD,
512 (LPBYTE)&dwWaitInterval,
513 sizeof(DWORD));
514
515 RegCloseKey(hKey);
516 }
517
518
519 static
520 BOOL
521 GetProfileCount(LPDWORD lpProfileCount)
522 {
523 HKEY hKey;
524 LONG lError;
525
526 *lpProfileCount = 0;
527
528 lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
529 L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
530 0,
531 KEY_READ,
532 &hKey);
533 if (lError != ERROR_SUCCESS)
534 return FALSE;
535
536 lError = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, lpProfileCount,
537 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
538
539 RegCloseKey(hKey);
540
541 if (lError != ERROR_SUCCESS)
542 return FALSE;
543
544 return TRUE;
545 }
546
547
548 static
549 VOID
550 GetProfile(
551 HWND hwndDlg,
552 HKEY hKey,
553 LPWSTR lpName,
554 DWORD dwProfileNumber,
555 PPROFILE pProfile)
556 {
557 HKEY hProfileKey;
558 DWORD dwSize;
559 LONG lError;
560
561 lError = RegOpenKeyExW(hKey,
562 lpName,
563 0,
564 KEY_READ,
565 &hProfileKey);
566 if (lError != ERROR_SUCCESS)
567 return;
568
569 dwSize = PROFILE_NAME_LENGTH * sizeof(WCHAR);
570 lError = RegQueryValueExW(hProfileKey,
571 L"FriendlyName",
572 NULL,
573 NULL,
574 (LPBYTE)pProfile->szFriendlyName,
575 &dwSize);
576 if (lError == ERROR_SUCCESS)
577 {
578 DPRINT1("Profile: %S\n", pProfile->szFriendlyName);
579 }
580
581 dwSize = sizeof(DWORD);
582 lError = RegQueryValueExW(hProfileKey,
583 L"PreferenceOrder",
584 NULL,
585 NULL,
586 (LPBYTE)&pProfile->dwPreferenceOrder,
587 &dwSize);
588 if (lError == ERROR_SUCCESS)
589 {
590 DPRINT1("PreferenceOrder: %lu\n", pProfile->dwPreferenceOrder);
591 }
592
593 pProfile->dwProfileNumber = dwProfileNumber;
594
595 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_ADDSTRING, 0, (LPARAM)pProfile->szFriendlyName);
596
597 RegCloseKey(hProfileKey);
598 }
599
600
601 static
602 BOOL
603 GetProfiles(HWND hwndDlg)
604 {
605 PPROFILEDATA pProfileData;
606 WCHAR szName[8];
607 DWORD dwNameLength;
608 DWORD dwProfileNumber;
609 DWORD dwIndex = 0;
610 HKEY hKey;
611 LONG lError;
612
613 pProfileData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PROFILEDATA));
614 if (pProfileData == NULL)
615 return FALSE;
616
617 pProfileData->dwLastProfile = (DWORD)-1;
618 pProfileData->dwSelectedProfileIndex = (DWORD)-1;
619
620 if (!GetProfileCount(&pProfileData->dwProfileCount))
621 {
622 HeapFree(GetProcessHeap(), 0, pProfileData);
623 return FALSE;
624 }
625
626 pProfileData->pProfiles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
627 pProfileData->dwProfileCount * sizeof(PROFILE));
628 if (pProfileData->pProfiles == NULL)
629 {
630 HeapFree(GetProcessHeap(), 0, pProfileData);
631 return FALSE;
632 }
633
634 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pProfileData);
635
636 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
637 L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
638 0,
639 KEY_READ,
640 &hKey) != ERROR_SUCCESS)
641 return FALSE;
642
643 for (dwIndex = 0; dwIndex < pProfileData->dwProfileCount; dwIndex++)
644 {
645 dwNameLength = 8;
646 lError = RegEnumKeyExW(hKey,
647 dwIndex,
648 szName,
649 &dwNameLength,
650 NULL,
651 NULL,
652 NULL,
653 NULL);
654 if (lError != ERROR_SUCCESS)
655 break;
656
657 dwProfileNumber = wcstoul(szName, NULL, 10);
658 DPRINT("Profile name: %S\n", szName);
659 DPRINT("Profile number: %lu\n", dwProfileNumber);
660
661 if ((pProfileData->dwLastProfile == (DWORD)-1) ||
662 (pProfileData->dwLastProfile < dwProfileNumber))
663 pProfileData->dwLastProfile = dwProfileNumber;
664
665 DPRINT("Last Profile number: %lu\n", pProfileData->dwLastProfile);
666
667 GetProfile(hwndDlg, hKey, szName, dwProfileNumber, &pProfileData->pProfiles[dwIndex]);
668 }
669
670 RegCloseKey(hKey);
671
672 return TRUE;
673 }
674
675
676 static
677 BOOL
678 OnInitHardProfDialog(HWND hwndDlg)
679 {
680 DWORD dwWaitInterval;
681
682 DPRINT("OnInitHardProfDialog()\n");
683
684 SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFUP),
685 BM_SETIMAGE,(WPARAM)IMAGE_ICON,
686 (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_UP)));
687 SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFDWN),
688 BM_SETIMAGE,(WPARAM)IMAGE_ICON,
689 (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_DOWN)));
690
691 if (!GetProfiles(hwndDlg))
692 return FALSE;
693
694 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETRANGE, (WPARAM)0, (LPARAM)MAKELONG((SHORT)500, 0));
695
696 dwWaitInterval = GetUserWaitInterval();
697 if (dwWaitInterval == (DWORD)-1)
698 {
699 CheckDlgButton(hwndDlg, IDC_HRDPROFWAIT, BST_CHECKED);
700 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, 30);
701 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE);
702 }
703 else
704 {
705 CheckDlgButton(hwndDlg, IDC_HRDPROFSELECT, BST_CHECKED);
706 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, dwWaitInterval);
707 }
708
709 return TRUE;
710 }
711
712
713 static
714 VOID
715 OnOk(HWND hwndDlg)
716 {
717 DWORD dwWaitInterval;
718
719 if (IsDlgButtonChecked(hwndDlg, IDC_HRDPROFWAIT) == BST_CHECKED)
720 {
721 dwWaitInterval = (DWORD)-1;
722 }
723 else
724 {
725 dwWaitInterval = LOWORD(SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_GETPOS, 0, 0));
726 }
727
728 SetUserWaitInterval(dwWaitInterval);
729 }
730
731
732 /* Property page dialog callback */
733 INT_PTR
734 CALLBACK
735 HardProfDlgProc(HWND hwndDlg,
736 UINT uMsg,
737 WPARAM wParam,
738 LPARAM lParam)
739 {
740 PPROFILEDATA pProfileData;
741
742 UNREFERENCED_PARAMETER(lParam);
743 UNREFERENCED_PARAMETER(wParam);
744 UNREFERENCED_PARAMETER(hwndDlg);
745
746 pProfileData = (PPROFILEDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
747
748 switch (uMsg)
749 {
750 case WM_INITDIALOG:
751 return OnInitHardProfDialog(hwndDlg);
752
753 case WM_DESTROY:
754 if (pProfileData != NULL)
755 {
756 if (pProfileData->pProfiles != NULL)
757 HeapFree(GetProcessHeap(), 0, pProfileData->pProfiles);
758 HeapFree(GetProcessHeap(), 0, pProfileData);
759 }
760 break;
761
762 case WM_COMMAND:
763 switch (LOWORD(wParam))
764 {
765 case IDC_HRDPROFPROP:
766 HardwareProfileProperties(hwndDlg, pProfileData);
767 break;
768
769 case IDC_HRDPROFCOPY:
770 CopyHardwareProfile(hwndDlg, pProfileData);
771 break;
772
773 case IDC_HRDPROFRENAME:
774 RenameHardwareProfile(hwndDlg, pProfileData);
775 break;
776
777 case IDC_HRDPROFDEL:
778 DeleteHardwareProfile(hwndDlg, pProfileData);
779 break;
780
781 case IDC_HRDPROFUP:
782 MoveHardwareProfile(hwndDlg, pProfileData, TRUE);
783 break;
784
785 case IDC_HRDPROFDWN:
786 MoveHardwareProfile(hwndDlg, pProfileData, FALSE);
787 break;
788
789 case IDC_HRDPROFWAIT:
790 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE);
791 return TRUE;
792
793 case IDC_HRDPROFSELECT:
794 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), TRUE);
795 return TRUE;
796
797 case IDC_HRDPROFLSTBOX:
798 if (HIWORD(wParam) == LBN_SELCHANGE)
799 {
800 pProfileData->dwSelectedProfileIndex = (DWORD)SendDlgItemMessage(hwndDlg, IDC_HRDPROFLSTBOX, LB_GETCURSEL, 0, 0);
801 UpdateButtons(hwndDlg, pProfileData);
802 }
803 return TRUE;
804
805 case IDOK:
806 OnOk(hwndDlg);
807
808 case IDCANCEL:
809 EndDialog(hwndDlg, LOWORD(wParam));
810 return TRUE;
811 }
812 break;
813 }
814
815 return FALSE;
816 }