#include "faxcfgwz.h" BOOL g_bInitializing = FALSE; // TRUE during DoInitDevLimitDlg() DWORD CountSelectedDev( HWND hDlg ) /*++ Routine Description: Count selected devices Arguments: hDlg - Handle to the "Device limit" page Return Value: Number of the selected devices --*/ { DWORD dw; HWND hwndLv; DWORD dwSelected=0; // count selected devices DEBUG_FUNCTION_NAME(TEXT("OnDevSelect()")); hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw) { if(ListView_GetCheckState(hwndLv, dw)) { ++dwSelected; } } return dwSelected; } VOID OnDevSelect( HWND hDlg ) /*++ Routine Description: Handle device selection Arguments: hDlg - Handle to the "Device limit" page Return Value: None --*/ { HWND hwndLv; INT iItem; DWORD dwSelectNum; // count selected devices DEBUG_FUNCTION_NAME(TEXT("OnDevSelect()")); hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); dwSelectNum = CountSelectedDev(hDlg); if(dwSelectNum > g_wizData.dwDeviceLimit) { // // If the user exceeds the device limit // uncheck selected device // iItem = ListView_GetNextItem(hwndLv, -1, LVNI_ALL | LVNI_SELECTED); if(iItem == -1) { Assert(FALSE); } else { ListView_SetCheckState(hwndLv, iItem, FALSE); } DisplayMessageDialog(hDlg, MB_OK | MB_ICONSTOP, 0, IDS_DEV_LIMIT_ERROR, g_wizData.dwDeviceLimit); } ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_DEVICE_ERR), (dwSelectNum > 0) ? SW_HIDE : SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_STATIC_NO_DEVICE), (dwSelectNum > 0) ? SW_HIDE : SW_SHOW); } VOID DoInitDevLimitDlg( HWND hDlg ) /*++ Routine Description: Init the "Device limit" page Arguments: hDlg - Handle to the "Device limit" page Return Value: None --*/ { DWORD dw; DWORD dwSelected=0; // count selected devices BOOL bCheck; HWND hwndLv; INT iIndex; LV_ITEM lvItem = {0}; DEBUG_FUNCTION_NAME(TEXT("DoInitDevLimitDlg()")); g_bInitializing = TRUE; InitDeviceList(hDlg, IDC_DEVICE_LIST); hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); // // Fill the list of devices and select the first item. // lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvItem.iImage = DI_Modem; for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw) { lvItem.iItem = dw; lvItem.pszText = g_wizData.pDevInfo[dw].szDeviceName; lvItem.lParam = dw; iIndex = ListView_InsertItem(hwndLv, &lvItem); bCheck = FALSE; if((dwSelected < g_wizData.dwDeviceLimit) && (g_wizData.pDevInfo[dw].bSend || (FAX_DEVICE_RECEIVE_MODE_OFF != g_wizData.pDevInfo[dw].ReceiveMode))) { bCheck = TRUE; ++dwSelected; } ListView_SetCheckState(hwndLv, iIndex, bCheck); } // // Select the first item. // ListView_SetItemState(hwndLv, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); OnDevSelect(hDlg); ListView_SetColumnWidth(hwndLv, 0, LVSCW_AUTOSIZE_USEHEADER ); g_bInitializing = FALSE; } void DoSaveDevLimit( HWND hDlg ) /*++ Routine Description: Save the user's choice for devices Arguments: hDlg - Handle to the "Device limit" page Return Value: None --*/ { DWORD dw; HWND hwndLv; BOOL bSelected; DEBUG_FUNCTION_NAME(TEXT("DoSaveDevLimit()")); hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw) { bSelected = ListView_GetCheckState(hwndLv, dw); g_wizData.pDevInfo[dw].bSelected = bSelected; if(!bSelected) { g_wizData.pDevInfo[dw].bSend = FALSE; g_wizData.pDevInfo[dw].ReceiveMode = FAX_DEVICE_RECEIVE_MODE_OFF; } } } INT_PTR CALLBACK DevLimitDlgProc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) /*++ Routine Description: Procedure for handling the "Send Device" page Arguments: hDlg - Identifies the property sheet page uMsg - Specifies the message wParam - Specifies additional message-specific information lParam - Specifies additional message-specific information Return Value: Depends on the value of message parameter --*/ { switch (uMsg) { case WM_INITDIALOG : { DoInitDevLimitDlg(hDlg); return TRUE; } case WM_COMMAND: switch(LOWORD(wParam)) { default: break; } break; case WM_NOTIFY : { LPNMHDR lpnm = (LPNMHDR) lParam; switch (lpnm->code) { case PSN_SETACTIVE : // Enable the Back and Finish button PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT); break; case PSN_WIZBACK : { // // Handle a Back button click here // if(RemoveLastPage(hDlg)) { return TRUE; } break; } case PSN_WIZNEXT : // // Handle a Next button click, if necessary // DoSaveDevLimit(hDlg); SetLastPage(IDD_DEVICE_LIMIT_SELECT); if(CountSelectedDev(hDlg) == 0) { // // go to the completion page // SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE); return TRUE; } break; case PSN_RESET : { // Handle a Cancel button click, if necessary break; } case LVN_ITEMCHANGED: { // // need to validate the control after changing selection by keyboard // if(!g_bInitializing) { OnDevSelect(hDlg); } break; } case NM_DBLCLK: { // // Handle a double click event // INT iItem; HWND hwndLv; hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); iItem = ((LPNMITEMACTIVATE) lParam)->iItem; ListView_SetCheckState(hwndLv, iItem, !ListView_GetCheckState(hwndLv, iItem)); // we don't have break here because we'll go through NM_CLICK } case NM_CLICK: { // // Handle a Click event // INT iItem; HWND hwndLv; hwndLv = GetDlgItem(hDlg, IDC_DEVICE_LIST); iItem = ((LPNMITEMACTIVATE) lParam)->iItem; ListView_SetItemState(hwndLv, iItem, LVIS_SELECTED, LVIS_SELECTED); break; } default : break; } } break; default: break; } return FALSE; }