/*++ Copyright (c) 1996 Microsoft Corporation Module Name: sendopts.c Abstract: Functions for handling events in the "Send Options" tab of the fax server configuration property sheet Environment: Fax configuration applet Revision History: 03/13/96 -davidx- Created it. mm/dd/yy -author- description --*/ #include "faxcpl.h" // // Information about the fax device list view on "Send Options" page // static COLUMNINFO faxDeviceListViewColumnInfo[] = { { COLUMN_DEVICE_NAME, 2 }, { COLUMN_TSID, 1 }, { 0, 0 }, }; VOID DoInitSendOptions( HWND hDlg ) /*++ Routine Description: Perform one-time initialization of "Send Options" property page Arguments: hDlg - Window handle to the "Send Options" property page Return Value: NONE --*/ { // // Maximum length for various text fields in the dialog // static INT textLimits[] = { IDC_TSID, 21, IDC_ARCHIVE_DIRECTORY, MAX_ARCHIVE_DIR, 0, }; LimitTextFields(hDlg, textLimits); // // Connect to the fax service and retrieve the list of fax devices // GetFaxDeviceAndConfigInfo(); // // Initialize the dialog appearance // if (gConfigData->configType != FAXCONFIG_SERVER) { EnableWindow(GetDlgItem(hDlg, IDC_NEW_PRINTER), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_DELETE_PRINTER), FALSE); } } VOID ToggleArchiveControls( HWND hDlg ) /*++ Routine Description: Enable/disable archive directory edit box and browse button depending on whether archive outgoing fax checkbox is checked Arguments: hDlg - Window handle to the "Send Options" property page Return Value: NONE --*/ { BOOL enabled = (IsDlgButtonChecked(hDlg, IDC_ARCHIVE_CHECKBOX) == BST_CHECKED); EnableWindow(GetDlgItem(hDlg, IDC_ARCHIVE_DIRECTORY), enabled); EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_DIR), enabled && gConfigData->pServerName == NULL); } VOID DoActivateSendOptions( HWND hDlg ) /*++ Routine Description: Called when the "Send Options" property page is activated Arguments: hDlg - Window handle to the "Send Options" property page Return Value: NONE --*/ { // // Controls on the "Send Options" page which may be enabled or disabled // static INT sendOptionsCtrls[] = { IDC_FAX_DEVICE_LIST, IDC_TSID, IDC_ARCHIVE_CHECKBOX, IDC_ARCHIVE_DIRECTORY, IDC_BROWSE_DIR, 0, }; BOOL enabled = FALSE; LPTSTR pPortName = NULL; BOOL devListInSync; HWND hwndLV; LPTSTR pArchiveDir; INT index; // // Redisplay the fax device list if it's out-of-sync // hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST); if (! (devListInSync = IsFaxDeviceListInSync(SEND_OPTIONS_PAGE))) { InitFaxDeviceListView(hwndLV, LV_HASCHECKBOX, faxDeviceListViewColumnInfo); SetFaxDeviceListInSync(SEND_OPTIONS_PAGE); for (index=0; index < gConfigData->cDevices; index++) { if (gConfigData->pDevInfo[index].Flags & FPF_SEND) { CheckListViewItem(hwndLV, index); } } } SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, FALSE); Verbose(("Updating 'Send Options' page ...\n")); // // Discount rate period // InitTimeControl(hDlg, IDC_TC_CHEAP_BEGIN, &gConfigData->pFaxConfig->StartCheapTime); InitTimeControl(hDlg, IDC_TC_CHEAP_END, &gConfigData->pFaxConfig->StopCheapTime); // // Archive directory // pArchiveDir = gConfigData->pFaxConfig->ArchiveDirectory; CheckDlgButton( hDlg, IDC_ARCHIVE_CHECKBOX, gConfigData->pFaxConfig->ArchiveOutgoingFaxes ? BST_CHECKED : BST_UNCHECKED ); MySetDlgItemText(hDlg, IDC_ARCHIVE_DIRECTORY, pArchiveDir ? pArchiveDir : TEXT("")); enabled = TRUE; // // Disable or enable the controls depending on whether the user // has privilege to perform printer administration. // EnableControls(hDlg, sendOptionsCtrls, enabled); EnableTimeControl(hDlg, IDC_TC_CHEAP_BEGIN, enabled); EnableTimeControl(hDlg, IDC_TC_CHEAP_END, enabled); if (enabled) { ToggleArchiveControls(hDlg); } } BOOL DoSaveSendOptions( HWND hDlg ) /*++ Routine Description: Save the information on the "Send Options" property page Arguments: hDlg - Handle to the "Send Options" property page Return Value: TRUE if successful, FALSE if there is an error --*/ #define FAIL_SAVE_SEND_OPTIONS(err) { errorId = err; goto ExitSaveSendOptions; } { INT errorId = 0; LPTSTR pPortName = NULL; FAX_TIME beginTime, endTime; INT archiveFlag; TCHAR archiveDir[MAX_PATH]; // // Check if anything on this page was changed // Verbose(("Saving 'Send Options' page ...\n")); if (! GetChangedFlag(SEND_OPTIONS_PAGE)) { return TRUE; } // // Save discount rate period and archive directory information // GetTimeControlValue(hDlg, IDC_TC_CHEAP_BEGIN, &beginTime); GetTimeControlValue(hDlg, IDC_TC_CHEAP_END, &endTime); archiveFlag = IsDlgButtonChecked(hDlg, IDC_ARCHIVE_CHECKBOX); if (! GetDlgItemText(hDlg, IDC_ARCHIVE_DIRECTORY, archiveDir, MAX_PATH)) { if (archiveFlag) { FAIL_SAVE_SEND_OPTIONS(IDS_MISSING_ARCHIVEDIR); } archiveDir[0] = NUL; } gConfigData->pFaxConfig->StartCheapTime = beginTime; gConfigData->pFaxConfig->StopCheapTime = endTime; gConfigData->pFaxConfig->ArchiveOutgoingFaxes = archiveFlag; if (gConfigData->pFaxConfig->ArchiveDirectory) { MemFree( gConfigData->pFaxConfig->ArchiveDirectory ); gConfigData->pFaxConfig->ArchiveDirectory = NULL; } gConfigData->pFaxConfig->ArchiveDirectory = DuplicateString( archiveDir ); ExitSaveSendOptions: MemFree(pPortName); // // Display a message box if an error is encountered // if (errorId != 0) { DisplayMessageDialog(hDlg, 0, 0, errorId); return FALSE; } // // Save the fax device information if this is the last modified page // return SaveFaxDeviceAndConfigInfo(hDlg, SEND_OPTIONS_PAGE); } VOID DoChangeTSID( HWND hDlg ) /*++ Routine Description: Called when the user changes sending station identifier (TSID) Arguments: hDlg - Handle to the "Send Options" property page Return Value: NONE --*/ { TCHAR buffer[MAX_STRING_LEN]; INT index = -1; HWND hwndLV; if (! (hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST))) return; if (! GetDlgItemText(hDlg, IDC_TSID, buffer, MAX_STRING_LEN)) buffer[0] = NUL; while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < gConfigData->cDevices); MemFree(gConfigData->pDevInfo[index].TSID); gConfigData->pDevInfo[index].TSID = DuplicateString(buffer); } } VOID DoChangeSendDeviceSel( HWND hDlg, HWND hwndLV ) /*++ Routine Description: Process selection change events in the fax device list Arguments: hDlg - Window handle to the "Send Options" property page hwndLV - Handle to the fax device list Return Value: NONE --*/ { LPTSTR tsid = NULL; INT index; // // Find the common attributes shared by selected devices // if ((index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < gConfigData->cDevices); tsid = gConfigData->pDevInfo[index].TSID; EnableWindow(GetDlgItem(hDlg, IDC_TSID), TRUE); while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < gConfigData->cDevices); if (! tsid || ! gConfigData->pDevInfo[index].TSID || _tcscmp(tsid, gConfigData->pDevInfo[index].TSID) != EQUAL_STRING) { tsid = NULL; break; } } } else { EnableWindow(GetDlgItem(hDlg, IDC_TSID), FALSE); } MySetDlgItemText(hDlg, IDC_TSID, tsid ? tsid : TEXT("")); } VOID ToggleFaxDeviceForSend( HWND hwndLV, INT index ) /*++ Routine Description: Toggle a fax device for sending Arguments: hwndLV - Handle to the fax device list view index - Specifies the fax device to be toggled Return Value: NONE --*/ { if (IsListViewItemChecked(hwndLV, index)) { UncheckListViewItem(hwndLV, index); gConfigData->pDevInfo[index].Flags &= ~FPF_SEND; } else { CheckListViewItem(hwndLV, index); gConfigData->pDevInfo[index].Flags |= FPF_SEND; // // NOTE: Since we allow at most one fax device for sending on workstation // configuration, here we must make sure to disable all other fax devices. // if (gConfigData->configType == FAXCONFIG_WORKSTATION) { INT count = ListView_GetItemCount(hwndLV); while (count-- > 0) { if (count != index) { UncheckListViewItem(hwndLV, count); gConfigData->pDevInfo[count].Flags &= ~FPF_SEND; } } } } } BOOL HandleSendListViewMessage( HWND hDlg, LPNMHDR pNMHdr ) /*++ Routine Description: Handle notification events from the fax device list Arguments: hDlg - Window handle to the "Send Options" property page pNMHdr - Points to an NMHDR structure Return Value: TRUE if any change was made to the fax device list FALSE otherwise --*/ { LV_HITTESTINFO hitTestInfo; DWORD msgPos; INT index; NM_LISTVIEW *pnmlv; HWND hwndLV = pNMHdr->hwndFrom; switch (pNMHdr->code) { case NM_CLICK: // // Figure out which item (if any) was clicked on // if (! IsWindowEnabled(hwndLV)) break; msgPos = GetMessagePos(); hitTestInfo.pt.x = LOWORD(msgPos); hitTestInfo.pt.y = HIWORD(msgPos); MapWindowPoints(HWND_DESKTOP, hwndLV, &hitTestInfo.pt, 1 ); index = ListView_HitTest(hwndLV, &hitTestInfo); if (index != -1 && (hitTestInfo.flags & LVHT_ONITEMSTATEICON)) { // // Toggle between checked and unchecked state // ToggleFaxDeviceForSend(hwndLV, index); return TRUE; } break; case LVN_KEYDOWN: // // Use space key to toggle check boxes // if (! IsWindowEnabled(hwndLV)) break; if (((LV_KEYDOWN *) pNMHdr)->wVKey == VK_SPACE) { index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL | LVNI_SELECTED); if (index != -1) { ToggleFaxDeviceForSend(hwndLV, index); return TRUE; } } break; case LVN_ITEMCHANGED: // // Update the TSID field when the currently selected fax device has changed // pnmlv = (NM_LISTVIEW *) pNMHdr; if ((pnmlv->uChanged & LVIF_STATE) != 0 && (pnmlv->uOldState & LVIS_SELECTED) != (pnmlv->uNewState & LVIS_SELECTED)) { Verbose(("Selection change: %d\n", pnmlv->iItem)); DoChangeSendDeviceSel(hDlg, hwndLV); } break; } return FALSE; } BOOL SendOptionsProc( HWND hDlg, UINT message, UINT wParam, LONG lParam ) /*++ Routine Description: Procedure for handling the "Send Options" tab Arguments: hDlg - Identifies the property sheet page message - Specifies the message wParam - Specifies additional message-specific information lParam - Specifies additional message-specific information Return Value: Depends on the value of message parameter --*/ { INT cmdId; BOOL result; LPNMHDR pNMHdr; switch (message) { case WM_INITDIALOG: DoInitSendOptions(hDlg); return TRUE; case WM_COMMAND: switch (cmdId = GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_TC_CHEAP_BEGIN+TC_HOUR: case IDC_TC_CHEAP_BEGIN+TC_MINUTE: case IDC_TC_CHEAP_BEGIN+TC_AMPM: // // Handle user actions inside the time control // result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_BEGIN, cmdId - IDC_TC_CHEAP_BEGIN); break; case IDC_TC_CHEAP_END+TC_HOUR: case IDC_TC_CHEAP_END+TC_MINUTE: case IDC_TC_CHEAP_END+TC_AMPM: result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_END, cmdId - IDC_TC_CHEAP_END); break; case IDC_ARCHIVE_CHECKBOX: ToggleArchiveControls(hDlg); break; case IDC_ARCHIVE_DIRECTORY: if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_CHANGE || insideSetDlgItemText) return TRUE; break; case IDC_TSID: switch (GET_WM_COMMAND_CMD(wParam, lParam)) { case EN_CHANGE: if (! insideSetDlgItemText) { DoChangeTSID(hDlg); break; } return TRUE; case EN_KILLFOCUS: UpdateFaxDeviceListViewColumns(GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST), faxDeviceListViewColumnInfo, 1); default: return TRUE; } break; case IDC_BROWSE_DIR: if (! DoBrowseForDirectory(hDlg, IDC_ARCHIVE_DIRECTORY, IDS_ARCHIVE_DIR)) return TRUE; break; default: return FALSE; } SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, TRUE); return TRUE; case WM_CTLCOLORLISTBOX: case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLOR: // // Deal with color changes in various time control fields // if ((result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_BEGIN, TRUE)) || (result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_END, TRUE))) { return result; } break; case WM_NOTIFY: pNMHdr = (NMHDR *) lParam; if (pNMHdr->hwndFrom == GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) { if (HandleSendListViewMessage(hDlg, pNMHdr)) SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, TRUE); } else switch (pNMHdr->code) { case PSN_SETACTIVE: DoActivateSendOptions(hDlg); break; case PSN_APPLY: // // User pressed OK or Apply - validate inputs and save changes // if (! DoSaveSendOptions(hDlg)) { SetWindowLong(hDlg, DWL_MSGRESULT, -1); return PSNRET_INVALID_NOCHANGEPAGE; } else { SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, FALSE); return PSNRET_NOERROR; } } break; case WM_HELP: case WM_CONTEXTMENU: return HandleHelpPopup(hDlg, message, wParam, lParam, SEND_OPTIONS_PAGE); } return FALSE; }