4ecf955bed12e56f186ea3f6a9b4bd320cb5c162
[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
411 static
412 VOID
413 HardwareProfileProperties(
414 HWND hwndDlg,
415 PPROFILEDATA pProfileData)
416 {
417 HPROPSHEETPAGE hpsp;
418 PROPSHEETHEADER psh;
419 PROPSHEETPAGE psp;
420
421 ZeroMemory(&psp, sizeof(psp));
422 psp.dwSize = sizeof(psp);
423 psp.dwFlags = PSP_DEFAULT;
424 psp.hInstance = hApplet;
425 psp.pszTemplate = MAKEINTRESOURCE(IDD_HARDWAREPROFILE);
426 psp.pfnDlgProc = HardwareProfilePropertiesDlgProc;
427
428 hpsp = CreatePropertySheetPage(&psp);
429 if (hpsp == NULL)
430 {
431 return;
432 }
433
434 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
435 psh.dwSize = sizeof(PROPSHEETHEADER);
436 psh.dwFlags = PSH_PROPTITLE;
437 psh.hwndParent = hwndDlg;
438 psh.hInstance = hApplet;
439 psh.hIcon = NULL;
440 psh.pszCaption = pProfileData->pProfiles[pProfileData->dwSelectedProfileIndex].szFriendlyName;
441 psh.nPages = 1;
442 psh.nStartPage = 0;
443 psh.phpage = &hpsp;
444 psh.pfnCallback = NULL;
445
446 PropertySheet(&psh);
447 }
448
449
450 static
451 DWORD
452 GetUserWaitInterval(VOID)
453 {
454 DWORD dwWaitInterval = 30;
455 DWORD dwSize;
456 HKEY hKey;
457
458 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
459 L"System\\CurrentControlSet\\Control\\IDConfigDB",
460 0,
461 KEY_QUERY_VALUE,
462 &hKey))
463 return dwWaitInterval;
464
465 dwSize = sizeof(DWORD);
466 RegQueryValueExW(hKey,
467 L"UserWaitInterval",
468 NULL,
469 NULL,
470 (LPBYTE)&dwWaitInterval,
471 &dwSize);
472
473 RegCloseKey(hKey);
474
475 return dwWaitInterval;
476 }
477
478
479 static
480 VOID
481 SetUserWaitInterval(DWORD dwWaitInterval)
482 {
483 HKEY hKey;
484
485 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
486 L"System\\CurrentControlSet\\Control\\IDConfigDB",
487 0,
488 KEY_SET_VALUE,
489 &hKey))
490 return;
491
492 RegSetValueExW(hKey,
493 L"UserWaitInterval",
494 0,
495 REG_DWORD,
496 (LPBYTE)&dwWaitInterval,
497 sizeof(DWORD));
498
499 RegCloseKey(hKey);
500 }
501
502
503 static
504 BOOL
505 GetProfileCount(LPDWORD lpProfileCount)
506 {
507 HKEY hKey;
508 LONG lError;
509
510 *lpProfileCount = 0;
511
512 lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
513 L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
514 0,
515 KEY_READ,
516 &hKey);
517 if (lError != ERROR_SUCCESS)
518 return FALSE;
519
520 lError = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, lpProfileCount,
521 NULL, NULL, NULL, NULL, NULL, NULL, NULL);
522
523 RegCloseKey(hKey);
524
525 if (lError != ERROR_SUCCESS)
526 return FALSE;
527
528 return TRUE;
529 }
530
531
532 static
533 VOID
534 GetProfile(
535 HWND hwndDlg,
536 HKEY hKey,
537 LPWSTR lpName,
538 DWORD dwProfileNumber,
539 PPROFILE pProfile)
540 {
541 HKEY hProfileKey;
542 DWORD dwSize;
543 LONG lError;
544
545 lError = RegOpenKeyExW(hKey,
546 lpName,
547 0,
548 KEY_READ,
549 &hProfileKey);
550 if (lError != ERROR_SUCCESS)
551 return;
552
553 dwSize = PROFILE_NAME_LENGTH * sizeof(WCHAR);
554 lError = RegQueryValueExW(hProfileKey,
555 L"FriendlyName",
556 NULL,
557 NULL,
558 (LPBYTE)pProfile->szFriendlyName,
559 &dwSize);
560 if (lError == ERROR_SUCCESS)
561 {
562 DPRINT1("Profile: %S\n", pProfile->szFriendlyName);
563 }
564
565 dwSize = sizeof(DWORD);
566 lError = RegQueryValueExW(hProfileKey,
567 L"PreferenceOrder",
568 NULL,
569 NULL,
570 (LPBYTE)&pProfile->dwPreferenceOrder,
571 &dwSize);
572 if (lError == ERROR_SUCCESS)
573 {
574 DPRINT1("PreferenceOrder: %lu\n", pProfile->dwPreferenceOrder);
575 }
576
577 pProfile->dwProfileNumber = dwProfileNumber;
578
579 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFLSTBOX, LB_ADDSTRING, 0, (LPARAM)pProfile->szFriendlyName);
580
581 RegCloseKey(hProfileKey);
582 }
583
584
585 static
586 BOOL
587 GetProfiles(HWND hwndDlg)
588 {
589 PPROFILEDATA pProfileData;
590 WCHAR szName[8];
591 DWORD dwNameLength;
592 DWORD dwProfileNumber;
593 DWORD dwIndex = 0;
594 HKEY hKey;
595 LONG lError;
596
597 pProfileData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PROFILEDATA));
598 if (pProfileData == NULL)
599 return FALSE;
600
601 pProfileData->dwLastProfile = (DWORD)-1;
602 pProfileData->dwSelectedProfileIndex = (DWORD)-1;
603
604 if (!GetProfileCount(&pProfileData->dwProfileCount))
605 {
606 HeapFree(GetProcessHeap(), 0, pProfileData);
607 return FALSE;
608 }
609
610 pProfileData->pProfiles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
611 pProfileData->dwProfileCount * sizeof(PROFILE));
612 if (pProfileData->pProfiles == NULL)
613 {
614 HeapFree(GetProcessHeap(), 0, pProfileData);
615 return FALSE;
616 }
617
618 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pProfileData);
619
620 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
621 L"System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles",
622 0,
623 KEY_READ,
624 &hKey) != ERROR_SUCCESS)
625 return FALSE;
626
627 for (dwIndex = 0; dwIndex < pProfileData->dwProfileCount; dwIndex++)
628 {
629 dwNameLength = 8;
630 lError = RegEnumKeyExW(hKey,
631 dwIndex,
632 szName,
633 &dwNameLength,
634 NULL,
635 NULL,
636 NULL,
637 NULL);
638 if (lError != ERROR_SUCCESS)
639 break;
640
641 dwProfileNumber = wcstoul(szName, NULL, 10);
642 DPRINT("Profile name: %S\n", szName);
643 DPRINT("Profile number: %lu\n", dwProfileNumber);
644
645 if ((pProfileData->dwLastProfile == (DWORD)-1) ||
646 (pProfileData->dwLastProfile < dwProfileNumber))
647 pProfileData->dwLastProfile = dwProfileNumber;
648
649 DPRINT("Last Profile number: %lu\n", pProfileData->dwLastProfile);
650
651 GetProfile(hwndDlg, hKey, szName, dwProfileNumber, &pProfileData->pProfiles[dwIndex]);
652 }
653
654 RegCloseKey(hKey);
655
656 return TRUE;
657 }
658
659
660 static
661 BOOL
662 OnInitHardProfDialog(HWND hwndDlg)
663 {
664 DWORD dwWaitInterval;
665
666 DPRINT("OnInitHardProfDialog()\n");
667
668 SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFUP),
669 BM_SETIMAGE,(WPARAM)IMAGE_ICON,
670 (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_UP)));
671 SendMessage(GetDlgItem(hwndDlg, IDC_HRDPROFDWN),
672 BM_SETIMAGE,(WPARAM)IMAGE_ICON,
673 (LPARAM)(HANDLE)LoadIcon(hApplet, MAKEINTRESOURCE(IDI_DOWN)));
674
675 if (!GetProfiles(hwndDlg))
676 return FALSE;
677
678 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETRANGE, (WPARAM)0, (LPARAM)MAKELONG((SHORT)500, 0));
679
680 dwWaitInterval = GetUserWaitInterval();
681 if (dwWaitInterval == (DWORD)-1)
682 {
683 CheckDlgButton(hwndDlg, IDC_HRDPROFWAIT, BST_CHECKED);
684 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, 30);
685 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE);
686 }
687 else
688 {
689 CheckDlgButton(hwndDlg, IDC_HRDPROFSELECT, BST_CHECKED);
690 SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_SETPOS, 0, dwWaitInterval);
691 }
692
693 return TRUE;
694 }
695
696
697 static
698 VOID
699 OnOk(HWND hwndDlg)
700 {
701 DWORD dwWaitInterval;
702
703 if (IsDlgButtonChecked(hwndDlg, IDC_HRDPROFWAIT) == BST_CHECKED)
704 {
705 dwWaitInterval = (DWORD)-1;
706 }
707 else
708 {
709 dwWaitInterval = LOWORD(SendDlgItemMessageW(hwndDlg, IDC_HRDPROFUPDWN, UDM_GETPOS, 0, 0));
710 }
711
712 SetUserWaitInterval(dwWaitInterval);
713 }
714
715
716 /* Property page dialog callback */
717 INT_PTR
718 CALLBACK
719 HardProfDlgProc(HWND hwndDlg,
720 UINT uMsg,
721 WPARAM wParam,
722 LPARAM lParam)
723 {
724 PPROFILEDATA pProfileData;
725
726 UNREFERENCED_PARAMETER(lParam);
727 UNREFERENCED_PARAMETER(wParam);
728 UNREFERENCED_PARAMETER(hwndDlg);
729
730 pProfileData = (PPROFILEDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
731
732 switch (uMsg)
733 {
734 case WM_INITDIALOG:
735 return OnInitHardProfDialog(hwndDlg);
736
737 case WM_DESTROY:
738 if (pProfileData != NULL)
739 {
740 if (pProfileData->pProfiles != NULL)
741 HeapFree(GetProcessHeap(), 0, pProfileData->pProfiles);
742 HeapFree(GetProcessHeap(), 0, pProfileData);
743 }
744 break;
745
746 case WM_COMMAND:
747 switch (LOWORD(wParam))
748 {
749 case IDC_HRDPROFPROP:
750 HardwareProfileProperties(hwndDlg, pProfileData);
751 break;
752
753 case IDC_HRDPROFCOPY:
754 CopyHardwareProfile(hwndDlg, pProfileData);
755 break;
756
757 case IDC_HRDPROFRENAME:
758 RenameHardwareProfile(hwndDlg, pProfileData);
759 break;
760
761 case IDC_HRDPROFDEL:
762 DeleteHardwareProfile(hwndDlg, pProfileData);
763 break;
764
765 case IDC_HRDPROFUP:
766 MoveHardwareProfile(hwndDlg, pProfileData, TRUE);
767 break;
768
769 case IDC_HRDPROFDWN:
770 MoveHardwareProfile(hwndDlg, pProfileData, FALSE);
771 break;
772
773 case IDC_HRDPROFWAIT:
774 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), FALSE);
775 return TRUE;
776
777 case IDC_HRDPROFSELECT:
778 EnableWindow(GetDlgItem(hwndDlg, IDC_HRDPROFEDIT), TRUE);
779 return TRUE;
780
781 case IDC_HRDPROFLSTBOX:
782 if (HIWORD(wParam) == LBN_SELCHANGE)
783 {
784 pProfileData->dwSelectedProfileIndex = (DWORD)SendDlgItemMessage(hwndDlg, IDC_HRDPROFLSTBOX, LB_GETCURSEL, 0, 0);
785 UpdateButtons(hwndDlg, pProfileData);
786 }
787 return TRUE;
788
789 case IDOK:
790 OnOk(hwndDlg);
791
792 case IDCANCEL:
793 EndDialog(hwndDlg, LOWORD(wParam));
794 return TRUE;
795 }
796 break;
797 }
798
799 return FALSE;
800 }