windows-nt/Source/XPSP1/NT/printscan/fax/config/dll/sendopts.c
2020-09-26 16:20:57 +08:00

768 lines
16 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}