/*++ Copyright (c) 1996 Microsoft Corporation Module Name: diaglog.c Abstract: Functions for handling events in the "Diagnostics Logging" tab of the fax server configuration property sheet Environment: Fax configuration applet Revision History: 03/22/96 -davidx- Created it. mm/dd/yy -author- description --*/ #include "faxcpl.h" VOID UpdateLoggingLevels( HWND hwndLV ) /*++ Routine Description: Display current logging level for each category Arguments: hwndLV - Specifies the list view window Return Value: NONE --*/ { INT index, nItems, strId; TCHAR buffer[MAX_TITLE_LEN]; LV_ITEM lvi; // // Count the number of items in the list view // if (hwndLV == NULL || (nItems = ListView_GetItemCount(hwndLV)) == -1 || gConfigData->pFaxConfig == NULL || nItems > (INT) gConfigData->NumberCategories) { return; } ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT; lvi.iSubItem = 1; lvi.pszText = buffer; for (index=0; index < nItems; index++) { // // Map logging level to radio button control ID // switch (gConfigData->pFaxLogging[index].Level) { case FAXLOG_LEVEL_MIN: strId = IDS_LOGGING_MIN; break; case FAXLOG_LEVEL_MED: strId = IDS_LOGGING_MED; break; case FAXLOG_LEVEL_MAX: strId = IDS_LOGGING_MAX; break; default: strId = IDS_LOGGING_NONE; break; } if (! LoadString(ghInstance, strId, buffer, MAX_TITLE_LEN)) buffer[0] = NUL; lvi.iItem = index; if (! ListView_SetItem(hwndLV, &lvi)) Error(("ListView_SetItem failed\n")); } } VOID DoInitDiagLog( HWND hDlg ) /*++ Routine Description: Perform one-time initialization of "Diagnostics Logging" property page Arguments: hDlg - Window handle to the "Diagnostics Logging" property page Return Value: NONE --*/ { HWND hwndLV; RECT rect; LV_COLUMN lvc; TCHAR buffer[MAX_TITLE_LEN]; // // Connect to the fax service and retrieve the list of fax devices // GetFaxDeviceAndConfigInfo(); // // Insert two columns: Category and Logging Level // if (! (hwndLV = GetDlgItem(hDlg, IDC_LOGGING_LIST))) return; GetClientRect(hwndLV, &rect); rect.right -= rect.left; ZeroMemory(&lvc, sizeof(lvc)); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.pszText = buffer; lvc.cx = rect.right * 2 / 3; lvc.iSubItem = 0; LoadString(ghInstance, IDS_CATEGORY, buffer, MAX_TITLE_LEN); if (ListView_InsertColumn(hwndLV, 0, &lvc) == -1) { Error(("ListView_InsertColumn failed\n")); return; } lvc.cx = rect.right / 3 - GetSystemMetrics(SM_CXVSCROLL); lvc.iSubItem = 1; LoadString(ghInstance, IDS_LOGGING_LEVEL, buffer, MAX_TITLE_LEN); if (ListView_InsertColumn(hwndLV, 1, &lvc) == -1) { Error(("ListView_InsertColumn failed\n")); return; } // // Insert an item for each category // if (gConfigData->pFaxConfig) { LV_ITEM lvi; DWORD index; ZeroMemory(&lvi, sizeof(lvi)); lvi.iSubItem = 0; lvi.mask = LVIF_TEXT; for (index=0; index < gConfigData->NumberCategories; index++) { lvi.iItem = index; lvi.pszText = gConfigData->pFaxLogging[index].Name; if (ListView_InsertItem(hwndLV, &lvi) == -1) { Error(("ListView_InsertItem failed\n")); break; } } } UpdateLoggingLevels(hwndLV); // // The initial selection is the first category in the list // ListView_SetItemState(hwndLV, 0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); } BOOL DoSaveDiagLog( HWND hDlg ) /*++ Routine Description: Save the information on the "Diagnostics Logging" property page Arguments: hDlg - Handle to the "Diagnostics Logging" property page Return Value: TRUE if successful, FALSE if there is an error --*/ { // // Check if anything on this page was changed // Verbose(("Saving 'Diagnostics Logging' page ...\n")); if (! GetChangedFlag(DIAG_LOG_PAGE)) return TRUE; // // Save the fax device information if this is the last modified page // return SaveFaxDeviceAndConfigInfo(hDlg, DIAG_LOG_PAGE); } VOID DoChangeLoggingCategory( HWND hDlg, HWND hwndLV ) /*++ Routine Description: Called when the changes the category selection Arguments: hDlg - Handle to the "Diagnostics Logging" property page hwndLV - Handle to the logging category list view Return Value: NONE --*/ { INT index, itemId; DWORD level = 0xffffffff; // // Find the common level shared by selected categories // if (hwndLV == NULL || gConfigData->pFaxLogging == NULL) return; if ((index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < (INT) gConfigData->NumberCategories); level = gConfigData->pFaxLogging[index].Level; while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < (INT) gConfigData->NumberCategories ); if (gConfigData->pFaxLogging[index].Level != level) { level = 0xffffffff; break; } } } // // Map logging level to radio button control ID // switch (level) { case FAXLOG_LEVEL_NONE: itemId = IDC_LOG_NONE; break; case FAXLOG_LEVEL_MIN: itemId = IDC_LOG_MIN; break; case FAXLOG_LEVEL_MED: itemId = IDC_LOG_MED; break; case FAXLOG_LEVEL_MAX: itemId = IDC_LOG_MAX; break; default: itemId = 0; break; } for (index=IDC_LOG_NONE; index <= IDC_LOG_MAX; index++) CheckDlgButton(hDlg, index, (index == itemId) ? BST_CHECKED : BST_UNCHECKED); } VOID DoChangeLoggingLevel( HWND hDlg, INT itemId ) /*++ Routine Description: Change the logging level of the currently selected categories Arguments: hDlg - Handle to the "Diagnostics Logging" property page itemId - Control ID of the selected logging level Return Value: NONE --*/ { HWND hwndLV; DWORD level; INT index = -1; if (!(hwndLV = GetDlgItem(hDlg, IDC_LOGGING_LIST)) || gConfigData->pFaxLogging == NULL) return; switch (itemId) { case IDC_LOG_NONE: level = FAXLOG_LEVEL_NONE; break; case IDC_LOG_MIN: level = FAXLOG_LEVEL_MIN; break; case IDC_LOG_MED: level = FAXLOG_LEVEL_MED; break; case IDC_LOG_MAX: level = FAXLOG_LEVEL_MAX; break; } while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) { Assert(index < (INT) gConfigData->NumberCategories); gConfigData->pFaxLogging[index].Level = level; } UpdateLoggingLevels(hwndLV); } BOOL DiagLogProc( HWND hDlg, UINT message, UINT wParam, LONG lParam ) /*++ Routine Description: Procedure for handling the "Diagnostics Logging" 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; NMHDR *pNMHdr; switch (message) { case WM_INITDIALOG: DoInitDiagLog(hDlg); return TRUE; case WM_COMMAND: switch (cmdId = GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_LOG_NONE: case IDC_LOG_MIN: case IDC_LOG_MED: case IDC_LOG_MAX: DoChangeLoggingLevel(hDlg, cmdId); SetChangedFlag(hDlg, DIAG_LOG_PAGE, TRUE); return TRUE; default: break; } break; case WM_NOTIFY: pNMHdr = (NMHDR *) lParam; if (pNMHdr->hwndFrom == GetDlgItem(hDlg, IDC_LOGGING_LIST)) { if (pNMHdr->code == LVN_ITEMCHANGED) DoChangeLoggingCategory(hDlg, pNMHdr->hwndFrom); } else if (pNMHdr->code == PSN_APPLY) { // // User pressed OK or Apply - validate inputs and save changes // if (! DoSaveDiagLog(hDlg)) { SetWindowLong(hDlg, DWL_MSGRESULT, -1); return PSNRET_INVALID_NOCHANGEPAGE; } else { SetChangedFlag(hDlg, DIAG_LOG_PAGE, FALSE); return PSNRET_NOERROR; } } break; case WM_HELP: case WM_CONTEXTMENU: return HandleHelpPopup(hDlg, message, wParam, lParam, DIAG_LOG_PAGE); } return FALSE; }