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