windows-nt/Source/XPSP1/NT/admin/services/sched/wizard/monthly.cxx

491 lines
12 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1996.
//
// File: monthly.cxx
//
// Contents: Task wizard monthly trigger property page implementation.
//
// Classes: CMonthlyPage
//
// History: 4-28-1997 DavidMun Created
//
//---------------------------------------------------------------------------
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "myheaders.hxx"
//
// Constants
//
// NMONTHDAYS_MIN - minimum value for monthly_day_ud spin control
// NMONTHDAYS_MAX - maximun value for monthly_day_ud spin control
// MONTHS_WITHOUT_DAY_31 - used to ensure trigger settings will allow task
// to run
//
#define NMONTHDAYS_MIN 1
#define NMONTHDAYS_MAX 31
#define MONTHS_WITHOUT_DAY_31 (TASK_FEBRUARY | \
TASK_APRIL | \
TASK_JUNE | \
TASK_SEPTEMBER | \
TASK_NOVEMBER)
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::CMonthlyPage
//
// Synopsis: ctor
//
// Arguments: [ptszFolderPath] - full path to tasks folder with dummy
// filename appended
// [phPSP] - filled with prop page handle
//
// History: 4-28-1997 DavidMun Created
//
//---------------------------------------------------------------------------
CMonthlyPage::CMonthlyPage(
CTaskWizard *pParent,
LPTSTR ptszFolderPath,
HPROPSHEETPAGE *phPSP):
CTriggerPage(IDD_MONTHLY,
IDS_MONTHLY_HDR2,
ptszFolderPath,
phPSP)
{
TRACE_CONSTRUCTOR(CMonthlyPage);
_idSelectedDayType = 0;
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::~CMonthlyPage
//
// Synopsis: dtor
//
// History: 4-28-1997 DavidMun Created
//
//---------------------------------------------------------------------------
CMonthlyPage::~CMonthlyPage()
{
TRACE_DESTRUCTOR(CMonthlyPage);
}
//===========================================================================
//
// CPropPage overrides
//
//===========================================================================
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_OnCommand
//
// Synopsis: Handle user input
//
// Arguments: [id] - resource id of control affected
// [hwndCtl] - window handle of control affected
// [codeNotify] - indicates what happened to control
//
// Returns: 0 (handled), 1 (not handled)
//
// History: 5-20-1997 DavidMun Created
//
//---------------------------------------------------------------------------
LRESULT
CMonthlyPage::_OnCommand(
INT id,
HWND hwndCtl,
UINT codeNotify)
{
LRESULT lr = 0;
switch (codeNotify)
{
case BN_CLICKED:
switch (id)
{
case monthly_day_rb:
case monthly_combo_rb:
_idSelectedDayType = (WORD)id;
_EnableDayCombos(id == monthly_combo_rb);
EnableWindow(_hCtrl(monthly_day_edit), id == monthly_day_rb);
EnableWindow(_hCtrl(monthly_day_ud), id == monthly_day_rb);
break;
}
_UpdateWizButtons();
break;
case EN_UPDATE:
{
//
// If the user just pasted non-numeric text or an illegal numeric
// value, overwrite it and complain.
//
INT iNewPos = GetDlgItemInt(Hwnd(), monthly_day_edit, NULL, FALSE);
if (iNewPos < NMONTHDAYS_MIN || iNewPos > NMONTHDAYS_MAX)
{
HWND hUD = _hCtrl(monthly_day_ud);
UpDown_SetPos(hUD, UpDown_GetPos(hUD));
MessageBeep(MB_ICONASTERISK);
}
}
default:
lr = 1;
break;
}
return lr;
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_OnInitDialog
//
// Synopsis: Perform initialization that should only occur once.
//
// Arguments: [lParam] - LPPROPSHEETPAGE used to create this page
//
// Returns: TRUE (let windows set focus)
//
// History: 5-20-1997 DavidMun Created
//
//---------------------------------------------------------------------------
LRESULT
CMonthlyPage::_OnInitDialog(
LPARAM lParam)
{
TRACE_METHOD(CMonthlyPage, _OnInitDialog);
TCHAR tszBuff[SCH_BIGBUF_LEN];
ULONG i;
HWND hCombo = _hCtrl(monthly_ordinality_combo);
_UpdateTimeFormat();
for (i = 0; i < ARRAYLEN(g_aWeekData); i++)
{
LoadStr(g_aWeekData[i].ids, tszBuff, SCH_BIGBUF_LEN);
ComboBox_AddString(hCombo, tszBuff);
}
ComboBox_SetCurSel(hCombo, 0);
hCombo = _hCtrl(monthly_day_combo);
for (i = 0; i < ARRAYLEN(g_aDayData); i++)
{
LoadStr(g_aDayData[i].ids, tszBuff, SCH_BIGBUF_LEN);
ComboBox_AddString(hCombo, tszBuff);
}
ComboBox_SetCurSel(hCombo, 0);
_EnableDayCombos(FALSE);
UpDown_SetRange(_hCtrl(monthly_day_ud), NMONTHDAYS_MIN, NMONTHDAYS_MAX);
UpDown_SetPos(_hCtrl(monthly_day_ud), NMONTHDAYS_MIN);
Edit_LimitText(_hCtrl(monthly_day_edit), 3);
for (i = monthly_jan_ckbox; i <= monthly_dec_ckbox; i++)
{
CheckDlgButton(Hwnd(), i, BST_CHECKED);
}
return TRUE;
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_OnPSNSetActive
//
// Synopsis: Enable Next button if this page's data is valid
//
// History: 5-20-1997 DavidMun Created
//
// Notes: Some of the page verification is left to the _OnWizNext
// routine. This allows us to respond to invalid data by
// displaying an explanatory message rather than simply
// disabling the Next button.
//
//---------------------------------------------------------------------------
LRESULT
CMonthlyPage::_OnPSNSetActive(
LPARAM lParam)
{
_UpdateWizButtons();
return CPropPage::_OnPSNSetActive(lParam);
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_OnWizNext
//
// Synopsis: Validate the selections not already checked by
// _OnPSNSetActive and _OnCommand.
//
// Returns: 0 - advance to next page
// -1 - stay on this page
//
// History: 5-20-1997 DavidMun Created
//
//---------------------------------------------------------------------------
LRESULT
CMonthlyPage::_OnWizNext()
{
USHORT flMonths = _ReadSelectedMonths();
//
// Verify at least one month is selected
//
if (!flMonths)
{
SchedUIMessageDialog(Hwnd(),
IERR_INVALID_MONTHLY_TASK,
MB_OK | MB_ICONERROR | MB_SETFOREGROUND,
(LPTSTR) NULL);
return -1;
}
//
// If the user specified that the trigger should fire on a specific day,
// verify that at least one of the selected months contains that day.
//
if (_idSelectedDayType == monthly_day_rb)
{
USHORT usDay = (USHORT) UpDown_GetPos(_hCtrl(monthly_day_ud));
ULONG idsErrMsg = 0;
if (usDay == 31 &&
(flMonths & MONTHS_WITHOUT_DAY_31) &&
!(flMonths & ~MONTHS_WITHOUT_DAY_31))
{
idsErrMsg = IDS_MONTHS_HAVE_LT_31_DAYS;
}
else if (usDay == 30 && flMonths == TASK_FEBRUARY)
{
idsErrMsg = IDS_MONTHS_HAVE_LT_30_DAYS;
}
if (idsErrMsg)
{
SchedUIMessageDialog(Hwnd(),
idsErrMsg,
MB_OK | MB_ICONERROR | MB_SETFOREGROUND,
(LPTSTR) NULL);
SetWindowLongPtr(Hwnd(), DWLP_MSGRESULT, IDD_MONTHLY);
return -1;
}
}
//
// Trigger is valid, delegate to base to advance to the next page.
//
return CTriggerPage::_OnWizNext();
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_UpdateWizButtons
//
// Synopsis: Enable the Next button if a preliminary analysis indicates
// that the user's selections are valid.
//
// History: 5-20-1997 DavidMun Created
//
// Notes: _OnWizNext does additional checking
//
//---------------------------------------------------------------------------
VOID
CMonthlyPage::_UpdateWizButtons()
{
BOOL fEnableNext = TRUE;
if (!_ReadSelectedMonths() || !_idSelectedDayType)
{
fEnableNext = FALSE;
}
if (fEnableNext)
{
_SetWizButtons(PSWIZB_BACK | PSWIZB_NEXT);
}
else
{
_SetWizButtons(PSWIZB_BACK);
}
}
//===========================================================================
//
// CTriggerPage overrides
//
//===========================================================================
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::FillInTrigger
//
// Synopsis: Fill in the fields of the trigger structure according to the
// settings specified for this type of trigger
//
// Arguments: [pTrigger] - trigger struct to fill in
//
// Modifies: *[pTrigger]
//
// History: 5-06-1997 DavidMun Created
//
// Notes: Precondition is that trigger's cbTriggerSize member is
// initialized.
//
//---------------------------------------------------------------------------
VOID
CMonthlyPage::FillInTrigger(
TASK_TRIGGER *pTrigger)
{
INT i;
WORD *prgfMonths;
if (_idSelectedDayType == monthly_day_rb)
{
pTrigger->TriggerType = TASK_TIME_TRIGGER_MONTHLYDATE;
USHORT usDay = (USHORT) UpDown_GetPos(_hCtrl(monthly_day_ud));
pTrigger->Type.MonthlyDate.rgfDays = 1 << (usDay - 1);
prgfMonths = &pTrigger->Type.MonthlyDate.rgfMonths;
}
else
{
DEBUG_ASSERT(_idSelectedDayType == monthly_combo_rb);
pTrigger->TriggerType = TASK_TIME_TRIGGER_MONTHLYDOW;
i = ComboBox_GetCurSel(_hCtrl(monthly_ordinality_combo));
pTrigger->Type.MonthlyDOW.wWhichWeek = (WORD)g_aWeekData[i].week;
i = ComboBox_GetCurSel(_hCtrl(monthly_day_combo));
pTrigger->Type.MonthlyDOW.rgfDaysOfTheWeek = (WORD)g_aDayData[i].day;
prgfMonths = &pTrigger->Type.MonthlyDOW.rgfMonths;
}
*prgfMonths = _ReadSelectedMonths();
SYSTEMTIME st;
GetLocalTime(&st);
pTrigger->wBeginYear = st.wYear;
pTrigger->wBeginMonth = st.wMonth;
pTrigger->wBeginDay = 1;
DateTime_GetSystemtime(_hCtrl(starttime_dp), &st);
pTrigger->wStartHour = st.wHour;
pTrigger->wStartMinute = st.wMinute;
}
//===========================================================================
//
// CMonthlyPage methods
//
//===========================================================================
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_ReadSelectedMonths
//
// Synopsis: Return a bitmask representing the checked day of week buttons
//
// History: 07-18-1997 DavidMun Created
//
//---------------------------------------------------------------------------
WORD
CMonthlyPage::_ReadSelectedMonths()
{
WORD flMonths = 0;
INT i;
for (i = monthly_jan_ckbox; i <= monthly_dec_ckbox; i++)
{
if (IsDlgButtonChecked(Hwnd(), i))
{
flMonths |= 1 << (i - monthly_jan_ckbox);
}
}
return flMonths;
}
//+--------------------------------------------------------------------------
//
// Member: CMonthlyPage::_EnableDayCombos
//
// Synopsis: Enable or disable the monthly DOW controls
//
// History: 5-20-1997 DavidMun Created
//
//---------------------------------------------------------------------------
VOID
CMonthlyPage::_EnableDayCombos(
BOOL fEnable)
{
EnableWindow(_hCtrl(monthly_ordinality_combo), fEnable);
EnableWindow(_hCtrl(monthly_day_combo), fEnable);
EnableWindow(_hCtrl(monthly_combo_lbl), fEnable);
}