/*++ Copyright (c) 1999 - 2000 Microsoft Corporation Module Name: sendwzrd.c Abstract: Fax wizard pages for sending configuration plus the welcome and complete page for the wizard. Environment: Fax configuration wizard Revision History: 03/13/00 -taoyuan- Created it. mm/dd/yy -author- description --*/ #include "faxcfgwz.h" // // functions which will be used only in this file // VOID DoInitSendDeviceList(HWND); BOOL DoShowSendDevices(HWND); VOID DoSaveSendDevices(HWND); BOOL ValidateControl(HWND, INT); BOOL ChangePriority(HWND, BOOL); VOID CheckSendDevices(HWND hDlg); BOOL DoShowSendDevices( HWND hDlg ) /*++ Routine Description: Load the device information into the list view control Arguments: hDlg - Handle to the "Send Device" page Return Value: NONE --*/ { LV_ITEM item; INT iItem = 0; INT iIndex; DWORD dw; int nDevInx; HWND hwndLv; DEBUG_FUNCTION_NAME(TEXT("DoShowSendDevices()")); hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST); ListView_DeleteAllItems(hwndLv ); // // Fill the list of devices and select the first item. // for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw) { nDevInx = GetDevIndexByDevId(g_wizData.pdwSendDevOrder[dw]); if(nDevInx < 0) { Assert(FALSE); continue; } if(!(g_wizData.pDevInfo[nDevInx].bSelected)) { // // skip unselected device // continue; } ZeroMemory( &item, sizeof(item) ); item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; item.iItem = iItem++; item.pszText = g_wizData.pDevInfo[nDevInx].szDeviceName; // // we only support modem icon right now, if we can distinguish // the type of a specific, add code here // item.iImage = DI_Modem; item.lParam = nDevInx; iIndex = ListView_InsertItem(hwndLv, &item ); ListView_SetCheckState(hwndLv, iIndex, g_wizData.pDevInfo[nDevInx].bSend); } // // Select the first item and validate the buttons // ListView_SetItemState(hwndLv, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); ListView_SetColumnWidth(hwndLv, 0, LVSCW_AUTOSIZE_USEHEADER ); ValidateControl(hDlg, 0); return TRUE; } VOID DoSaveSendDevices( HWND hDlg ) /*++ Routine Description: Save the user's choice for fax sending devices Arguments: hDlg - Handle to the "Send Device" page Return Value: TRUE -- if at least one device is selected or confirms for disable send FALSE -- if no device is selected but user chooses to go back. --*/ { DWORD dw; DWORD dwOrder; LVITEM lv = {0}; // for getting info of device Id DWORD dwDevInx; DWORD dwDeviceCount; HWND hwndLv; DEBUG_FUNCTION_NAME(TEXT("DoSaveSendDevices()")); hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST); dwDeviceCount = ListView_GetItemCount(hwndLv); lv.mask = LVIF_PARAM; // // check selected devices // for(dwOrder = 0; dwOrder < dwDeviceCount; ++dwOrder) { // // Get device index // lv.iItem = dwOrder; ListView_GetItem(hwndLv, &lv); dwDevInx = (DWORD)lv.lParam; // // get device selection // g_wizData.pDevInfo[dwDevInx].bSend = ListView_GetCheckState(hwndLv, dwOrder); // // save order info // g_wizData.pdwSendDevOrder[dwOrder] = g_wizData.pDevInfo[dwDevInx].dwDeviceId; } // // Store unselected device order // for (dw=0; dw < g_wizData.dwDeviceCount && dwOrder < g_wizData.dwDeviceCount; ++dw) { if(!(g_wizData.pDevInfo[dw].bSelected)) { g_wizData.pdwSendDevOrder[dwOrder] = g_wizData.pDevInfo[dw].dwDeviceId; ++dwOrder; } } Assert(dwOrder == g_wizData.dwDeviceCount); } BOOL ValidateControl( HWND hDlg, INT iItem ) /*++ Routine Description: Validate the up and down button in the device select page Arguments: hDlg - Handle to the Device Send Options property sheet page iItem - index of the item being selected Return Value: TRUE -- if no error FALSE -- if error --*/ { DWORD dwDeviceCount = ListView_GetItemCount(GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST)); // // if there is only one device or we don't click on any item // up and down buttons are disabled // if(dwDeviceCount < 2 || iItem == -1) { EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_UP), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_DOWN), FALSE); return TRUE; } EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_UP), iItem > 0); // not the top one EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_DOWN), iItem < (INT)dwDeviceCount - 1 ); // not the last one if (!IsWindowEnabled (GetFocus())) { // // The currently selected control turned disabled - select the list control // SetFocus (GetDlgItem (hDlg, IDC_SEND_DEVICE_LIST)); } return TRUE; } BOOL ChangePriority( HWND hDlg, BOOL bMoveUp ) /*++ Routine Description: Validate the up and down button in the device select page Arguments: hDlg - Handle to the Device Send Options property sheet page bMoveUp -- TRUE for moving up, FALSE for moving down Return Value: TRUE -- if no error FALSE -- if error --*/ { INT iItem; BOOL rslt; LVITEM lv={0}; HWND hwndLv; BOOL bChecked; TCHAR pszText[MAX_DEVICE_NAME]; DEBUG_FUNCTION_NAME(TEXT("ChangePriority()")); hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST); iItem = ListView_GetNextItem(hwndLv, -1, LVNI_ALL | LVNI_SELECTED); if(iItem == -1) { return FALSE; } // // get selected item information and then remove it // lv.iItem = iItem; lv.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lv.stateMask = LVIS_SELECTED; lv.pszText = pszText; lv.cchTextMax = MAX_DEVICE_NAME; ListView_GetItem(hwndLv, &lv); bChecked = ListView_GetCheckState(hwndLv, iItem); rslt = ListView_DeleteItem(hwndLv, iItem); // // recalculate the item index; // if(bMoveUp) { lv.iItem--; } else { lv.iItem++; } // // reinsert the item and validate button state // iItem = ListView_InsertItem(hwndLv, &lv); ListView_SetCheckState(hwndLv, iItem, bChecked); ListView_SetItemState(hwndLv, iItem, LVIS_SELECTED, LVIS_SELECTED); ValidateControl(hDlg, iItem); return TRUE; } VOID CheckSendDevices( HWND hDlg ) /*++ Routine Description: Display a warning if no device is selected Arguments: hDlg - Handle to the "Send Device" page Return Value: None --*/ { HWND hwndLv; // list view windows DWORD dwDeviceIndex; DWORD dwDeviceCount; BOOL bDeviceSelect = FALSE; // indicate whether we have at least one device selected. DEBUG_FUNCTION_NAME(TEXT("CheckSendDevices()")); hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST); dwDeviceCount = ListView_GetItemCount(hwndLv); if(dwDeviceCount < 1) // if there isn't device in the list. { goto exit; } for(dwDeviceIndex = 0; dwDeviceIndex < dwDeviceCount; dwDeviceIndex++) { if(ListView_GetCheckState(hwndLv, dwDeviceIndex)) { bDeviceSelect = TRUE; break; } } exit: ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_SEND_DEVICE), bDeviceSelect ? SW_HIDE : SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_DEVICE_ERR), bDeviceSelect ? SW_HIDE : SW_SHOW); return; } INT_PTR CALLBACK SendDeviceDlgProc ( 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 : { // icon handles for up and down arrows. HICON hIconUp, hIconDown; hIconUp = LoadIcon(g_hResource, MAKEINTRESOURCE(IDI_Up)); hIconDown = LoadIcon(g_hResource, MAKEINTRESOURCE(IDI_Down)); SendDlgItemMessage(hDlg, IDC_SENDPRI_UP, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIconUp); SendDlgItemMessage(hDlg, IDC_SENDPRI_DOWN, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIconDown); // // load device info // InitDeviceList(hDlg, IDC_SEND_DEVICE_LIST); DoShowSendDevices(hDlg); CheckSendDevices(hDlg); return TRUE; } case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_SENDPRI_UP: ChangePriority(hDlg, TRUE); break; case IDC_SENDPRI_DOWN: ChangePriority(hDlg, FALSE); break; default: break; } break; case WM_NOTIFY : { LPNMHDR lpnm = (LPNMHDR) lParam; switch (lpnm->code) { case PSN_SETACTIVE : DoShowSendDevices(hDlg); // Enable the Back and Finish button PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT); break; case PSN_WIZBACK : { // // Handle a Back button click here // DoSaveSendDevices(hDlg); if(RemoveLastPage(hDlg)) { return TRUE; } break; } case PSN_WIZNEXT : // // Handle a Next button click, if necessary // DoSaveSendDevices(hDlg); // // switch to appropriate page // if(!IsSendEnable()) { // // go to the receive configuration or completion page // if(g_bShowDevicePages) { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_RECV_SELECT_DEVICES); } else { SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE); } SetLastPage(IDD_WIZARD_SEND_SELECT_DEVICES); return TRUE; } SetLastPage(IDD_WIZARD_SEND_SELECT_DEVICES); 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 // LPNMLISTVIEW pnmv; pnmv = (LPNMLISTVIEW) lParam; ValidateControl(hDlg, pnmv->iItem); CheckSendDevices(hDlg); break; } case NM_DBLCLK: { // // Handle a double click event // INT iItem; HWND hwndLv; hwndLv = GetDlgItem(hDlg, IDC_SEND_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 // HWND hwndLv; LPNMITEMACTIVATE lpnmitem; lpnmitem = (LPNMITEMACTIVATE)lParam; hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST); ListView_SetItemState(hwndLv, lpnmitem->iItem, LVIS_SELECTED, LVIS_SELECTED); ValidateControl(hDlg, lpnmitem->iItem); CheckSendDevices(hDlg); break; } default : break; } } break; default: break; } return FALSE; } INT_PTR CALLBACK SendTsidDlgProc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) /*++ Routine Description: Procedure for handling the "TSID" 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 : { // // Maximum length for various text fields in the dialog // static INT textLimits[] = { IDC_TSID, FXS_TSID_CSID_MAX_LENGTH + 1, 0, }; LimitTextFields(hDlg, textLimits); if(g_wizData.szTsid) { SetDlgItemText(hDlg, IDC_TSID, g_wizData.szTsid); } return TRUE; } 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 LPTSTR pTsid; pTsid = (LPTSTR)MemAlloc((FXS_TSID_CSID_MAX_LENGTH + 1) * sizeof(TCHAR)); Assert(pTsid); if(pTsid) { pTsid[0] = '\0'; GetDlgItemText(hDlg, IDC_TSID, pTsid, FXS_TSID_CSID_MAX_LENGTH + 1); MemFree(g_wizData.szTsid); g_wizData.szTsid = NULL; } else { LPCTSTR faxDbgFunction = TEXT("SendTsidDlgProc()"); DebugPrintEx(DEBUG_ERR, TEXT("Can't allocate memory for TSID.")); } g_wizData.szTsid = pTsid; if(1 == g_wizData.dwDeviceLimit && !IsReceiveEnable()) { // // go to the completion page // SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE); SetLastPage(IDD_WIZARD_SEND_TSID); return TRUE; } SetLastPage(IDD_WIZARD_SEND_TSID); break; } case PSN_RESET : { // Handle a Cancel button click, if necessary break; } default : break; } break; } // WM_NOTIFY default: break; } return FALSE; }