768 lines
16 KiB
C
768 lines
16 KiB
C
/*++
|
||
|
||
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;
|
||
}
|