|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: advanced.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 3/13/1996 RaviR Created
// 11/16/00 Dgrube Remove Win4Assert(m_pjt->MinutesInterval >= 0);
// Win4Assert(m_pjt->MinutesDuration >= 0); Since they are
// DWORD this is always true and is causing compiler erros
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "..\folderui\dbg.h"
#include "..\folderui\macros.h"
#include "..\inc\resource.h"
#include "..\inc\dll.hxx"
#include "dlg.hxx"
#include "rc.h"
#include <mstask.h>
#include "uiutil.hxx"
#include "strings.hxx"
#include "timeutil.hxx"
#include "helpids.h"
//
// (Control id, help id) list for context sensitivity help.
//
ULONG s_aAdvancedDlgHelpIds[] = { dlg_advanced, Hdlg_advanced, lbl_start_date, Hlbl_start_date, dp_start_date, Hdp_start_date, chk_repeat_task, Hchk_repeat_task, txt_repeat_task, Htxt_repeat_task, spin_repeat_task, Hspin_repeat_task, cbx_time_unit, Hcbx_time_unit, dp_end_date, Hdp_end_date, chk_terminate_at_end, Hchk_terminate_at_end, rb_end_time, Hrb_end_time, rb_end_duration, Hrb_end_duration, dp_end_time, Hdp_end_time, txt_end_duration_hr, Htxt_end_duration_hr, spin_end_duration_hr, Hspin_end_duration_hr, txt_end_duration_min, Htxt_end_duration_min, spin_end_duration_min, Hspin_end_duration_min, grp_repeat_until, Hgrp_repeat_until, lbl_hours, Hlbl_hours, lbl_min, Hlbl_min, chk_end_date, Hchk_end_date, lbl_every, Hlbl_every, lbl_until, Hlbl_until, 0,0 };
extern "C" TCHAR szMstaskHelp[];
//
// externs
//
extern HINSTANCE g_hInstance;
#define INDEX_MINUTES 0
#define INDEX_HOURS 1
const size_t c_MinsPerDay = (60 * 24);
class CAdvScheduleDlg : public CDlg { public:
CAdvScheduleDlg(PTASK_TRIGGER pjt) : m_pjt(pjt), CDlg() {} virtual ~CAdvScheduleDlg() {}
protected:
virtual INT_PTR RealDlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
LRESULT _OnInitDialog(LPARAM lParam); LRESULT _OnCommand(int id, HWND hwndCtl, UINT codeNotify); BOOL _OnOK(void); void _EnableRepeatCtrls(BOOL fEnable); LRESULT _OnSetIniChange(WPARAM wParam, LPARAM lParam); LRESULT _OnHelp(HANDLE hRequesting, UINT uiHelpCommand);
void _ErrorDialog(int idsErr, LONG error = 0, UINT idsHelpHint = 0) { SchedUIErrorDialog(Hwnd(), idsErr, error, idsHelpHint); }
PTASK_TRIGGER m_pjt;
//
// Time format string for use with Date picker control
//
TCHAR m_tszTimeFormat[MAX_DP_TIME_FORMAT]; };
INT_PTR AdvancedDialog( HWND hParent, PTASK_TRIGGER pjt) { CAdvScheduleDlg * pAdvScheduleDlg = new CAdvScheduleDlg(pjt);
if (pAdvScheduleDlg != NULL) { return pAdvScheduleDlg->DoModal(dlg_advanced, hParent); }
return FALSE; }
INT_PTR CAdvScheduleDlg::RealDlgProc( UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: return _OnInitDialog(lParam);
case WM_COMMAND: return(_OnCommand(GET_WM_COMMAND_ID(wParam, lParam), GET_WM_COMMAND_HWND(wParam, lParam), GET_WM_COMMAND_CMD(wParam, lParam)));
case WM_DESTROY: SetWindowLongPtr(Hwnd(), DWLP_USER, 0L); delete this; break;
case WM_SETTINGCHANGE: // WM_WININICHANGE
_OnSetIniChange(wParam, lParam); break;
case WM_HELP: return _OnHelp(((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
case WM_CONTEXTMENU: return _OnHelp((HANDLE) wParam, HELP_CONTEXTMENU);
default: return FALSE; }
return TRUE; }
LRESULT CAdvScheduleDlg::_OnSetIniChange( WPARAM wParam, LPARAM lParam) { TRACE(CAdvScheduleDlg, _OnSetIniChange);
DateTime_SetFormat(_hCtrl(dp_start_date), NULL); DateTime_SetFormat(_hCtrl(dp_end_date), NULL);
UpdateTimeFormat(m_tszTimeFormat, ARRAYLEN(m_tszTimeFormat)); DateTime_SetFormat(_hCtrl(dp_end_time), m_tszTimeFormat); return 0; }
LRESULT CAdvScheduleDlg::_OnHelp( HANDLE hRequesting, UINT uiHelpCommand) { WinHelp((HWND) hRequesting, szMstaskHelp, uiHelpCommand, (DWORD_PTR)(LPSTR)s_aAdvancedDlgHelpIds); return TRUE; }
LRESULT CAdvScheduleDlg::_OnInitDialog( LPARAM lParam) { //
// Initialize time format string m_tszTimeFormat
//
UpdateTimeFormat(m_tszTimeFormat, ARRAYLEN(m_tszTimeFormat));
//
// Init the time unit combo box
//
HWND hCombo = GetDlgItem(Hwnd(), cbx_time_unit);
TCHAR tcBuff[100];
LoadString(g_hInstance, IDS_MINUTES, tcBuff, 100); ComboBox_AddString(hCombo, tcBuff);
LoadString(g_hInstance, IDS_HOURS, tcBuff, 100); ComboBox_AddString(hCombo, tcBuff);
//
// Init all the spin controls, and the associated edit controls
//
Spin_SetRange(Hwnd(), spin_repeat_task, 1, 9999); Spin_SetRange(Hwnd(), spin_end_duration_hr, 0, 9999); Spin_SetRange(Hwnd(), spin_end_duration_min, 0, 59);
SendDlgItemMessage(Hwnd(), txt_repeat_task, EM_LIMITTEXT, 4, 0); SendDlgItemMessage(Hwnd(), txt_end_duration_hr, EM_LIMITTEXT, 4, 0); SendDlgItemMessage(Hwnd(), txt_end_duration_min, EM_LIMITTEXT, 2, 0);
//
// Set the start and end dates.
//
SYSTEMTIME st;
ZeroMemory(&st, sizeof st); st.wYear = m_pjt->wBeginYear; st.wMonth = m_pjt->wBeginMonth; st.wDay = m_pjt->wBeginDay;
if (DateTime_SetSystemtime(_hCtrl(dp_start_date), GDT_VALID, &st) == FALSE) { DEBUG_OUT((DEB_USER1, "DateTime_SetSystemtime failed, err %uL.\n", GetLastError())); }
if (m_pjt->rgFlags & TASK_TRIGGER_FLAG_HAS_END_DATE) { CheckDlgButton(Hwnd(), chk_end_date, BST_CHECKED);
st.wYear = m_pjt->wEndYear; st.wMonth = m_pjt->wEndMonth; st.wDay = m_pjt->wEndDay;
if (DateTime_SetSystemtime(_hCtrl(dp_end_date), GDT_VALID, &st) == FALSE) { DEBUG_OUT((DEB_USER1, "DateTime_SetSystemtime failed.\n")); } } else { CheckDlgButton(Hwnd(), chk_end_date, BST_UNCHECKED);
DateTime_SetFormat(_hCtrl(dp_end_date), tszBlank);
EnableWindow(_hCtrl(dp_end_date), FALSE); }
if (m_pjt->TriggerType == TASK_TIME_TRIGGER_ONCE) { EnableWindow(_hCtrl(lbl_start_date), FALSE); EnableWindow(_hCtrl(dp_start_date), FALSE); EnableWindow(_hCtrl(chk_end_date), FALSE); EnableWindow(_hCtrl(dp_end_date), FALSE); }
//
// Set repetition
//
if (m_pjt->MinutesInterval > 0) { CheckDlgButton(Hwnd(), chk_repeat_task, BST_CHECKED);
if (m_pjt->MinutesInterval % 60) { Spin_SetPos(Hwnd(), spin_repeat_task, (WORD)m_pjt->MinutesInterval); ComboBox_SetCurSel(hCombo, INDEX_MINUTES); } else { Spin_SetPos(Hwnd(), spin_repeat_task, (WORD)(m_pjt->MinutesInterval / 60));
ComboBox_SetCurSel(hCombo, INDEX_HOURS); }
//
// Set end time / duration
//
CheckRadioButton(Hwnd(), rb_end_time, rb_end_duration, rb_end_duration);
WORD wHours = (WORD) (m_pjt->MinutesDuration / 60); WORD wMins = (WORD) (m_pjt->MinutesDuration % 60);
if (wHours > 9999) { wMins += (wHours - 9999) * 60; }
Spin_SetPos(Hwnd(), spin_end_duration_hr, wHours); Spin_SetPos(Hwnd(), spin_end_duration_min, wMins);
DateTime_SetFormat(_hCtrl(dp_end_time), tszBlank); EnableWindow(_hCtrl(dp_end_time), FALSE);
//
// Set terminate at end
//
if (m_pjt->rgFlags & TASK_TRIGGER_FLAG_KILL_AT_DURATION_END) { CheckDlgButton(Hwnd(), chk_terminate_at_end, BST_CHECKED); } } else { CheckDlgButton(Hwnd(), chk_repeat_task, BST_UNCHECKED);
_EnableRepeatCtrls(FALSE); }
return TRUE; }
void CAdvScheduleDlg::_EnableRepeatCtrls( BOOL fEnable) { int aCtrls[] = { lbl_every, txt_repeat_task, spin_repeat_task, cbx_time_unit, lbl_until, rb_end_time, rb_end_duration, txt_end_duration_hr, spin_end_duration_hr, lbl_hours, txt_end_duration_min, spin_end_duration_min, lbl_min, chk_terminate_at_end, dp_end_time // CAUTION: last position is special, see comment below
};
int cCtrls;
//
// If we're disabling repeat controls, disable them all, i.e. set cCtrls
// the number of repeat controls.
//
// Otherwise if we're enabling controls, set cCtrls to the number of
// repeat controls less one. This will prevent the end time date-
// picker control from being enabled. We need to do this because when
// these controls are being enabled, the Duration radio button is
// always checked, therefore the end time date picker should always
// remain disabled.
//
if (fEnable == FALSE) { cCtrls = ARRAYLEN(aCtrls); DateTime_SetFormat(_hCtrl(dp_end_time), tszBlank);
SetDlgItemText(Hwnd(), txt_repeat_task, TEXT("")); SetDlgItemText(Hwnd(), txt_end_duration_hr, TEXT("")); SetDlgItemText(Hwnd(), txt_end_duration_min, TEXT("")); SetDlgItemText(Hwnd(), cbx_time_unit, TEXT("")); } else { cCtrls = ARRAYLEN(aCtrls) - 1; Spin_SetPos(Hwnd(), spin_repeat_task, 10);
ComboBox_SetCurSel(_hCtrl(cbx_time_unit), INDEX_MINUTES);
CheckRadioButton(Hwnd(), rb_end_time, rb_end_duration, rb_end_duration);
Spin_SetPos(Hwnd(), spin_end_duration_hr, 1); Spin_SetPos(Hwnd(), spin_end_duration_min, 0); }
for (int i=0; i < cCtrls; i++) { EnableWindow(_hCtrl(aCtrls[i]), fEnable); } }
LRESULT CAdvScheduleDlg::_OnCommand( int id, HWND hwndCtl, UINT codeNotify) { SYSTEMTIME st; GetSystemTime(&st);
switch (id) { case chk_end_date: if (IsDlgButtonChecked(Hwnd(), chk_end_date) == BST_CHECKED) { FILETIME ftNow, ftStart; SYSTEMTIME stStart, stEnd; CopyMemory(&stEnd, &st, sizeof(SYSTEMTIME));
if (DateTime_GetSystemtime(_hCtrl(dp_start_date), &stStart) == GDT_VALID) { // compare start time to current date, set End == max of the two
SystemTimeToFileTime(&stStart, &ftStart); SystemTimeToFileTime(&st, &ftNow); if (CompareFileTime(&ftStart, &ftNow) <= 0) { FileTimeToSystemTime(&ftNow, &stEnd); } else { FileTimeToSystemTime(&ftStart, &stEnd); } } DateTime_SetSystemtime(_hCtrl(dp_end_date), GDT_VALID, &stEnd); DateTime_SetFormat(_hCtrl(dp_end_date), tszEmpty); EnableWindow(_hCtrl(dp_end_date), TRUE); } else { DateTime_SetFormat(_hCtrl(dp_end_date), tszBlank); EnableWindow(_hCtrl(dp_end_date), FALSE); } break;
case chk_repeat_task: if (IsDlgButtonChecked(Hwnd(), chk_repeat_task) == BST_CHECKED) { _EnableRepeatCtrls(TRUE); } else { _EnableRepeatCtrls(FALSE); } break;
case rb_end_time: //if (IsDlgButtonChecked(Hwnd(), rb_end_time) == BST_CHECKED)
{ EnableWindow(_hCtrl(dp_end_time), TRUE); DateTime_SetFormat(_hCtrl(dp_end_time), m_tszTimeFormat);
Spin_Disable(Hwnd(), spin_end_duration_hr); Spin_Disable(Hwnd(), spin_end_duration_min); } break;
case rb_end_duration: //if (IsDlgButtonChecked(Hwnd(), rb_end_duration) == BST_CHECKED)
{ Spin_Enable(Hwnd(), spin_end_duration_hr, 1); Spin_Enable(Hwnd(), spin_end_duration_min, 0);
DateTime_SetFormat(_hCtrl(dp_end_time), tszBlank); EnableWindow(_hCtrl(dp_end_time), FALSE); } break;
case IDOK: if (_OnOK() == TRUE) { EndDialog(Hwnd(), TRUE); } break;
case IDCANCEL: EndDialog(Hwnd(), FALSE); break;
default: return FALSE; }
return TRUE; }
BOOL CAdvScheduleDlg::_OnOK(void) { WORD wTemp = 0; SYSTEMTIME stStart, stEnd;
if (DateTime_GetSystemtime(_hCtrl(dp_start_date), &stStart) == GDT_VALID) { m_pjt->wBeginYear = stStart.wYear; m_pjt->wBeginMonth = stStart.wMonth; m_pjt->wBeginDay = stStart.wDay; } else { DEBUG_OUT((DEB_USER1, "DateTime_GetSystemtime failed.\n")); }
if (IsDlgButtonChecked(Hwnd(), chk_end_date) == BST_CHECKED) { if (DateTime_GetSystemtime(_hCtrl(dp_end_date), &stEnd) == GDT_VALID) { m_pjt->wEndYear = stEnd.wYear; m_pjt->wEndMonth = stEnd.wMonth; m_pjt->wEndDay = stEnd.wDay; } else { DEBUG_OUT((DEB_USER1, "DateTime_GetSystemtime failed.\n")); }
m_pjt->rgFlags |= TASK_TRIGGER_FLAG_HAS_END_DATE;
//
// Ensure end date is after start date
//
stStart.wDayOfWeek = 0; stEnd.wDayOfWeek = 0;
if (CompareSystemDate(stStart, stEnd) > 0) { _ErrorDialog(IERR_ENDDATE_LT_STARTDATE); return FALSE; } } else { m_pjt->rgFlags &= ~TASK_TRIGGER_FLAG_HAS_END_DATE; }
if (IsDlgButtonChecked(Hwnd(), chk_repeat_task) == BST_CHECKED) { //
// Determine MinutesInterval
//
m_pjt->MinutesInterval = Spin_GetPos(Hwnd(), spin_repeat_task);
switch (ComboBox_GetCurSel(_hCtrl(cbx_time_unit))) { case INDEX_MINUTES: break;
case INDEX_HOURS: m_pjt->MinutesInterval *= 60; break; }
//
// Determine MinutesDuration
//
if (IsDlgButtonChecked(Hwnd(), rb_end_time) == BST_CHECKED) { SYSTEMTIME stEndTime;
if (DateTime_GetSystemtime(_hCtrl(dp_end_time), &stEndTime) == GDT_VALID) { DWORD dwMin = 0;
DWORD dwStartMin = m_pjt->wStartHour * 60 + m_pjt->wStartMinute; DWORD dwEndMin = stEndTime.wHour * 60 + stEndTime.wMinute;
if (dwEndMin > dwStartMin) { dwMin = dwEndMin - dwStartMin; } else { dwMin = c_MinsPerDay - (dwStartMin - dwEndMin); }
m_pjt->MinutesDuration = dwMin; } else { DEBUG_OUT((DEB_USER1, "DateTime_GetSystemtime failed.\n")); } } else { ULONG ulDuration = Spin_GetPos(Hwnd(), spin_end_duration_min);
if (HIWORD(ulDuration)) { ulDuration = 59; } m_pjt->MinutesDuration = ulDuration + 60 * Spin_GetPos(Hwnd(), spin_end_duration_hr); }
if (m_pjt->MinutesDuration <= m_pjt->MinutesInterval) { _ErrorDialog(IERR_DURATION_LT_INTERVAL); return FALSE; }
if (IsDlgButtonChecked(Hwnd(), chk_terminate_at_end) == BST_CHECKED) { m_pjt->rgFlags |= TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; } else { m_pjt->rgFlags &= ~TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; }
} else { m_pjt->MinutesInterval = 0; m_pjt->MinutesDuration = 0;
m_pjt->rgFlags &= ~TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; }
return TRUE; }
|