You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1035 lines
32 KiB
C++

// XTPCalendarEventRecurrenceDlg.cpp: implementation of the CXTPCalendarEventPropertiesDlg.
//
// This file is a part of the XTREME CALENDAR MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Resource.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPSmartPtrInternalT.h"
#include "XTPCalendarDefines.h"
#include "XTPCalendarUtils.h"
#include "XTPCalendarEvent.h"
#include "XTPCalendarRecurrencePattern.h"
#include "XTPCalendarEvents.h"
#include "XTPCalendarEventRecurrenceDlg.h"
#define XTP_TIMER_ID_UPDATE_TIMEOUT 100
#define XTP_TIMER_ID_START_CB_CHANGED 0x01
#define XTP_TIMER_ID_END_CB_CHANGED 0x02
#define XTP_TIMER_ID_DURATION_CB_CHANGED 0x04
#define XTP_TIMER_ID_ALL_CB_CHANGED 0x07
IMPLEMENT_DYNAMIC(CXTPCalendarEventRecurrenceDlg, CDialog)
/////////////////////////////////////////////////////////////////////////////
CXTPCalendarEventRecurrenceDlg::CXTPCalendarEventRecurrenceDlg(CXTPCalendarEvent* pMasterEvent,
CWnd* pParent, UINT nIDTemplate)
:
m_nOccurNum(10),
m_dtEndDate(COleDateTime::GetCurrentTime()),
m_nDayInterval(1),
m_nWeeklyInterval(1),
m_bMonday(TRUE),
m_bTuesday(FALSE),
m_bWednesday(FALSE),
m_bThursday(FALSE),
m_bFriday(FALSE),
m_bSaturday(FALSE),
m_bSunday(FALSE),
m_MonthDate(1),
m_nMonthInterval(1),
m_nMonthInterval2(1),
m_nDayOfMonth(m_dtEndDate.GetDay()),
m_ptrMasterEvent(pMasterEvent, TRUE),
m_bDisableRemove(FALSE)
{
InitModalIndirect(XTPResourceManager()->LoadDialogTemplate(nIDTemplate), pParent);
ASSERT(m_ptrMasterEvent);
m_ptrPattern = m_ptrMasterEvent->GetRecurrencePattern();
m_dtStart = m_ptrPattern->GetStartTime();
m_dtEnd = m_dtStart + m_ptrPattern->GetDuration();
m_dtStartDate = m_ptrPattern->GetPatternStartDate();
}
CXTPCalendarEventRecurrenceDlg::~CXTPCalendarEventRecurrenceDlg()
{
}
#if _MSC_VER < 1200
AFX_INLINE void DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, COleDateTime& value)
{
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
CXTPDateTimeHelper::GetDateTimeCtrlTime(hWndCtrl, value);
else
CXTPDateTimeHelper::SetDateTimeCtrlTime(hWndCtrl, value);
}
#endif
void CXTPCalendarEventRecurrenceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, XTP_IDC_COMBO_SCHEDULEID, m_wndCbStart);
DDX_Control(pDX, XTP_IDC_COMBO_REC_END, m_wndCbEnd);
DDX_Control(pDX, XTP_IDC_COMBO_REC_DURATION, m_wndCbDuration);
DDX_DateTimeCtrl(pDX, XTP_IDC_DATETIMEPICKER_START, m_dtStartDate);
DDX_DateTimeCtrl(pDX, XTP_IDC_DATETIMEPICKER_ENDDATE, m_dtEndDate);
DDX_Text(pDX, XTP_IDC_EDIT_OCCUR, m_nOccurNum);
DDX_Text(pDX, XTP_IDC_EDIT_DAYINTERVAL, m_nDayInterval);
DDX_Text(pDX, XTP_IDC_EDIT_WEEKLY_INTERVAL, m_nWeeklyInterval);
DDX_Check(pDX, XTP_IDC_CHECK_MONDAY, m_bMonday);
DDX_Check(pDX, XTP_IDC_CHECK_TUESDAY, m_bTuesday);
DDX_Check(pDX, XTP_IDC_CHECK_WEDNESDAY, m_bWednesday);
DDX_Check(pDX, XTP_IDC_CHECK_THURSDAY, m_bThursday);
DDX_Check(pDX, XTP_IDC_CHECK_FRIDAY, m_bFriday);
DDX_Check(pDX, XTP_IDC_CHECK_SATURDAY, m_bSaturday);
DDX_Check(pDX, XTP_IDC_CHECK_SUNDAY, m_bSunday);
DDX_Text(pDX, XTP_IDC_EDIT_MONTH_DATE, m_MonthDate);
DDX_Text(pDX, XTP_IDC_EDIT_MONTH_MONTH, m_nMonthInterval);
DDX_Text(pDX, XTP_IDC_EDIT_MONTH_MONTH2, m_nMonthInterval2);
DDX_Control(pDX, XTP_IDC_COMBO_MONTH_DAY, m_wndCbMonthDay);
DDX_Control(pDX, XTP_IDC_COMBO_MONTH_CRIT, m_wndCbMonthWhich);
DDX_Text(pDX, XTP_IDC_EDIT_YEAR_DATE, m_nDayOfMonth);
DDX_Control(pDX, XTP_IDC_COMBO_YEAR_MONTH, m_wndYearMonth);
DDX_Control(pDX, XTP_IDC_COMBO_YEAR_MONTH2, m_wndComboYearMonth2);
DDX_Control(pDX, XTP_IDC_COMBO_YEAR_CRIT, m_wndCbYearWhich);
DDX_Control(pDX, XTP_IDC_COMBO_YEAR_DAY, m_wndCbYearDay);
}
BEGIN_MESSAGE_MAP(CXTPCalendarEventRecurrenceDlg, CDialog)
ON_CBN_SELCHANGE(XTP_IDC_COMBO_SCHEDULEID, OnStartComboChanged)
ON_CBN_SELCHANGE(XTP_IDC_COMBO_REC_END, OnEndComboChanged)
ON_CBN_SELCHANGE(XTP_IDC_COMBO_REC_DURATION, OnDurationComboChanged)
ON_CBN_KILLFOCUS(XTP_IDC_COMBO_SCHEDULEID, OnStartComboChanged)
ON_CBN_KILLFOCUS(XTP_IDC_COMBO_REC_END, OnEndComboChanged)
ON_CBN_KILLFOCUS(XTP_IDC_COMBO_REC_DURATION, OnDurationComboChanged)
ON_CBN_EDITCHANGE(XTP_IDC_COMBO_SCHEDULEID, OnStartComboEdited)
ON_CBN_EDITCHANGE(XTP_IDC_COMBO_REC_END, OnEndComboEdited)
ON_CBN_EDITCHANGE(XTP_IDC_COMBO_REC_DURATION, OnDurationComboEdited)
ON_BN_CLICKED(XTP_IDC_BUTTON_REMOVE_RECURRENCE, OnBnClickedButtonRemoveRecurrence)
ON_CONTROL_RANGE(BN_CLICKED, XTP_IDC_RADIO_DAILY, XTP_IDC_RADIO_YEARLY, OnBnClickedRadioDailyYearly)
ON_WM_TIMER()
END_MESSAGE_MAP()
void CXTPCalendarEventRecurrenceDlg::InitStartEndCB()
{
BOOL bInListStart = FALSE;
BOOL bInListEnd = FALSE;
CString strTimeFormat_HrMin = CXTPCalendarUtils::GetTimeFormatString_HrMin();
CString strTime;
// initializing m_wndCbStart and m_wndCbEnd combo boxes
for (int i = 0; i < 24*60; i += 30)
{
int nHours = i / 60;
int nMinutes = i % 60;
strTime = CXTPCalendarUtils::GetTimeFormat(nHours, nMinutes, strTimeFormat_HrMin);
int nIndex = m_wndCbStart.AddString(strTime);
if (m_dtStart.GetHour() == nHours && m_dtStart.GetMinute() == nMinutes)
{
m_wndCbStart.SetCurSel(nIndex);
bInListStart = TRUE;
}
nIndex = m_wndCbEnd.AddString(strTime);
if (m_dtEnd.GetHour() == nHours && m_dtEnd.GetMinute() == nMinutes)
{
m_wndCbEnd.SetCurSel(nIndex);
bInListEnd = TRUE;
}
}
if (!bInListStart)
{
strTime = CXTPCalendarUtils::GetTimeFormat(m_dtStart.GetHour(), m_dtStart.GetMinute(), strTimeFormat_HrMin);
m_wndCbStart.SetWindowText(strTime);
}
if (!bInListEnd)
{
strTime = CXTPCalendarUtils::GetTimeFormat(m_dtEnd.GetHour(), m_dtEnd.GetMinute(), strTimeFormat_HrMin);
m_wndCbEnd.SetWindowText(strTime);
}
}
int CXTPCalendarEventRecurrenceDlg::_AddString(CComboBox& wndCB, UINT nStrResID, DWORD_PTR dwItemData)
{
int nIndex = wndCB.AddString(CXTPCalendarUtils::LoadString(nStrResID));
wndCB.SetItemData(nIndex, dwItemData);
return nIndex;
}
int CXTPCalendarEventRecurrenceDlg::_AddLocaleString(CComboBox& wndCB, LCTYPE lcidStr, DWORD_PTR dwItemData)
{
int nIndex = wndCB.AddString(CXTPCalendarUtils::GetLocaleString(lcidStr, 255));
wndCB.SetItemData(nIndex, dwItemData);
return nIndex;
}
void CXTPCalendarEventRecurrenceDlg::InitDurationCB()
{
//initializing combo m_wndCbDuration combobox
int nDuration_min = m_ptrPattern->GetDurationMinutes();
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_0, 0);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_1, 1);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_5, 5);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_10, 10);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_15, 15);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_MINUTES_30, 30);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_1, 1 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_2, 2 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_3, 3 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_4, 4 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_5, 5 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_6, 6 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_7, 7 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_8, 8 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_9, 9 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_10, 10 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_11, 11 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_DAYS_0_5, 12 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_HOURS_18, 18 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_DAYS_1, 1 * 24 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_DAYS_2, 2 * 24 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_DAYS_3, 3 * 24 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_WEEKS_1, 1 * 7 * 24 * 60);
_AddString(m_wndCbDuration, XTP_IDS_CALENDAR_WEEKS_2, 2 * 7 * 24 * 60);
int nCount = m_wndCbDuration.GetCount();
for (int i = 0; i < nCount; i++)
{
if (nDuration_min == (int)m_wndCbDuration.GetItemData(i))
{
m_wndCbDuration.SetCurSel(i);
return;
}
}
CString strDuration = CXTPCalendarUtils::FormatTimeDuration(nDuration_min, FALSE);
m_wndCbDuration.SetWindowText(strDuration);
}
void CXTPCalendarEventRecurrenceDlg::InitDayOfWeekCBs(CComboBox& wndCB)
{
_AddLocaleString(wndCB, LOCALE_SDAYNAME1, xtpCalendarDayMonday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME2, xtpCalendarDayTuesday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME3, xtpCalendarDayWednesday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME4, xtpCalendarDayThursday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME5, xtpCalendarDayFriday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME6, xtpCalendarDaySaturday);
_AddLocaleString(wndCB, LOCALE_SDAYNAME7, xtpCalendarDaySunday);
wndCB.SetCurSel(0);
}
void CXTPCalendarEventRecurrenceDlg::InitWhichDayCBs(CComboBox& wndCB)
{
_AddString(wndCB, XTP_IDS_CALENDAR_FIRST, xtpCalendarWeekFirst);
_AddString(wndCB, XTP_IDS_CALENDAR_SECOND, xtpCalendarWeekSecond);
_AddString(wndCB, XTP_IDS_CALENDAR_THIRD, xtpCalendarWeekThird);
_AddString(wndCB, XTP_IDS_CALENDAR_FOURTH, xtpCalendarWeekFourth);
_AddString(wndCB, XTP_IDS_CALENDAR_LAST, xtpCalendarWeekLast);
wndCB.SetCurSel(0);
}
void CXTPCalendarEventRecurrenceDlg::InitMonthCBs(CComboBox& wndCB)
{
for (int nMonth = 0; nMonth < 12; nMonth++)
{
_AddLocaleString(wndCB, LOCALE_SMONTHNAME1 + nMonth, nMonth + 1);
}
COleDateTime dtNow(COleDateTime::GetCurrentTime());
wndCB.SetCurSel(dtNow.GetMonth() - 1);
}
// CXTPCalendarEventRecurrenceDlg message handlers
BOOL CXTPCalendarEventRecurrenceDlg::OnInitDialog()
{
CDialog::OnInitDialog();
InitStartEndCB();
InitDurationCB();
//initializing recurrence end properties
int nRadio = XTP_IDC_RADIO_NOEND;
XTPCalendarPatternEnd UseEnd = (XTPCalendarPatternEnd)m_ptrPattern->GetUseEndMethod();
//Fixed case - now it works for any working days set
//if (GetDlgItem(XTP_IDC_RADIO_EVERYWORKDAY))
// GetDlgItem(XTP_IDC_RADIO_EVERYWORKDAY)->SetWindowText(_T("Monday...Friday"));
switch (UseEnd)
{
case xtpCalendarPatternEndDate:
nRadio = XTP_IDC_RADIO_ENDBY;
m_dtEndDate = m_ptrPattern->GetPatternEndDate();
break;
case xtpCalendarPatternEndAfterOccurrences:
nRadio = XTP_IDC_RADIO_ENDAFTER;
m_nOccurNum = m_ptrPattern->GetEndAfterOccurrences();
break;
case xtpCalendarPatternEndNoDate:
nRadio = XTP_IDC_RADIO_NOEND;
break;
}
CheckRadioButton(XTP_IDC_RADIO_NOEND, XTP_IDC_RADIO_ENDBY, nRadio);
if (!m_bDisableRemove)
{
::EnableWindow(GetDlgItem(XTP_IDC_BUTTON_REMOVE_RECURRENCE)->GetSafeHwnd(), TRUE);
}
// initializing day/week/month/year recurrence settings
CheckRadioButton(XTP_IDC_RADIO_EVERYDAY, XTP_IDC_RADIO_EVERYWORKDAY, XTP_IDC_RADIO_EVERYDAY);
CheckRadioButton(XTP_IDC_RADIO_MONTH_RECUR, XTP_IDC_RADIO_MONTH_IN, XTP_IDC_RADIO_MONTH_RECUR);
CheckRadioButton(XTP_IDC_RADIO_YEAR_RECUR, XTP_IDC_RADIO_YEAR_IN, XTP_IDC_RADIO_YEAR_RECUR);
InitDayOfWeekCBs(m_wndCbMonthDay);
InitDayOfWeekCBs(m_wndCbYearDay);
InitWhichDayCBs(m_wndCbMonthWhich);
InitWhichDayCBs(m_wndCbYearWhich);
InitMonthCBs(m_wndYearMonth);
InitMonthCBs(m_wndComboYearMonth2);
nRadio = XTP_IDC_RADIO_WEEKLY;
XTP_CALENDAR_RECURRENCE_OPTIONS opt = m_ptrPattern->GetRecurrenceOptions();
int nRecType = m_ptrPattern->GetRecurrenceType();
int i;
switch (nRecType)
{
case xtpCalendarRecurrenceDaily:
{
nRadio = XTP_IDC_RADIO_DAILY;
int nRd = XTP_IDC_RADIO_EVERYDAY;
if (opt.m_Daily.bEveryWeekDayOnly)
{
m_nDayInterval = 1;
nRd = XTP_IDC_RADIO_EVERYWORKDAY;
}
else
{
m_nDayInterval = opt.m_Daily.nIntervalDays;
}
CheckRadioButton(XTP_IDC_RADIO_EVERYDAY, XTP_IDC_RADIO_EVERYWORKDAY, nRd);
}
break;
case xtpCalendarRecurrenceWeekly:
nRadio = XTP_IDC_RADIO_WEEKLY;
m_nWeeklyInterval = opt.m_Weekly.nIntervalWeeks;
m_bMonday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDayMonday) != 0;
m_bTuesday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDayTuesday) != 0;
m_bWednesday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDayWednesday) != 0;
m_bThursday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDayThursday) != 0;
m_bFriday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDayFriday) != 0;
m_bSaturday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDaySaturday) != 0;
m_bSunday = (opt.m_Weekly.nDayOfWeekMask & xtpCalendarDaySunday) != 0;
break;
case xtpCalendarRecurrenceMonthly:
nRadio = XTP_IDC_RADIO_MONTHLY;
CheckRadioButton(XTP_IDC_RADIO_MONTH_RECUR, XTP_IDC_RADIO_MONTH_IN, XTP_IDC_RADIO_MONTH_RECUR);
m_nMonthInterval = opt.m_Monthly.nIntervalMonths;
m_MonthDate = opt.m_Monthly.nDayOfMonth;
break;
case xtpCalendarRecurrenceMonthNth:
{
nRadio = XTP_IDC_RADIO_MONTHLY;
CheckRadioButton(XTP_IDC_RADIO_MONTH_RECUR, XTP_IDC_RADIO_MONTH_IN, XTP_IDC_RADIO_MONTH_IN);
m_nMonthInterval2 = opt.m_MonthNth.nIntervalMonths;
for (i = 0; i < m_wndCbMonthDay.GetCount(); i++)
if (opt.m_MonthNth.nWhichDayMask & m_wndCbMonthDay.GetItemData(i))
{
m_wndCbMonthDay.SetCurSel(i);
break;
}
for (i = 0; i < m_wndCbMonthWhich.GetCount(); i++)
if (opt.m_MonthNth.nWhichDay == (int) m_wndCbMonthWhich.GetItemData(i))
{
m_wndCbMonthWhich.SetCurSel(i);
break;
}
}
break;
case xtpCalendarRecurrenceYearly:
{
nRadio = XTP_IDC_RADIO_YEARLY;
CheckRadioButton(XTP_IDC_RADIO_YEAR_RECUR, XTP_IDC_RADIO_YEAR_IN, XTP_IDC_RADIO_YEAR_RECUR);
m_nDayOfMonth = opt.m_Yearly.nDayOfMonth;
for (i = 0; i < m_wndYearMonth.GetCount(); i++)
{
if (opt.m_Yearly.nMonthOfYear == (int) m_wndYearMonth.GetItemData(i))
{
m_wndYearMonth.SetCurSel(i);
break;
}
}
}
break;
case xtpCalendarRecurrenceYearNth:
nRadio = XTP_IDC_RADIO_YEARLY;
CheckRadioButton(XTP_IDC_RADIO_YEAR_RECUR, XTP_IDC_RADIO_YEAR_IN, XTP_IDC_RADIO_YEAR_IN);
for (i = 0; i < m_wndComboYearMonth2.GetCount(); i++)
if (opt.m_YearNth.nMonthOfYear == (int) m_wndComboYearMonth2.GetItemData(i))
{
m_wndComboYearMonth2.SetCurSel(i);
break;
}
for (i = 0; i < m_wndCbYearWhich.GetCount(); i++)
if (opt.m_YearNth.nWhichDay == (int) m_wndCbYearWhich.GetItemData(i))
{
m_wndCbYearWhich.SetCurSel(i);
break;
}
for (i = 0; i < m_wndCbYearDay.GetCount(); i++)
if (opt.m_YearNth.nWhichDayMask & m_wndCbYearDay.GetItemData(i))
{
m_wndCbYearDay.SetCurSel(i);
break;
}
break;
default:
ASSERT(nRecType == xtpCalendarRecurrenceUnknown);
}
CheckRadioButton(XTP_IDC_RADIO_DAILY, XTP_IDC_RADIO_YEARLY, nRadio);
OnBnClickedRadioDailyYearly(nRadio);
UpdateData(FALSE);
_MoveControlsBy_Y();
return TRUE;
}
void CXTPCalendarEventRecurrenceDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent & XTP_TIMER_ID_ALL_CB_CHANGED)
{
KillTimer(nIDEvent);
}
else
{
ASSERT(FALSE);
CDialog::OnTimer(nIDEvent);
}
if (nIDEvent & XTP_TIMER_ID_START_CB_CHANGED)
{
//TRACE(_T("_OnStartChanged() \n"));
_OnStartChanged();
}
if (nIDEvent & XTP_TIMER_ID_END_CB_CHANGED)
{
//TRACE(_T("_OnEndChanged() \n"));
_OnEndChanged();
}
if (nIDEvent & XTP_TIMER_ID_DURATION_CB_CHANGED)
{
//TRACE(_T("_OnDurationChanged() \n"));
_OnDurationChanged();
}
}
void CXTPCalendarEventRecurrenceDlg::OnStartChanged()
{
SetTimer(XTP_TIMER_ID_START_CB_CHANGED, XTP_TIMER_ID_UPDATE_TIMEOUT, NULL);
}
void CXTPCalendarEventRecurrenceDlg::OnEndChanged()
{
SetTimer(XTP_TIMER_ID_END_CB_CHANGED, XTP_TIMER_ID_UPDATE_TIMEOUT, NULL);
}
void CXTPCalendarEventRecurrenceDlg::OnDurationChanged()
{
SetTimer(XTP_TIMER_ID_DURATION_CB_CHANGED, XTP_TIMER_ID_UPDATE_TIMEOUT, NULL);
}
int CXTPCalendarEventRecurrenceDlg::GetChangedComboTimeInMin(CComboBox& wndCb)
{
CString strCBtext;
wndCb.GetWindowText(strCBtext);
return CXTPCalendarUtils::ParceTimeString_min(strCBtext);
}
void CXTPCalendarEventRecurrenceDlg::OnStartComboEdited()
{
int nMin = GetChangedComboTimeInMin(m_wndCbStart);
if (nMin >= 0)
OnStartChanged();
}
void CXTPCalendarEventRecurrenceDlg::OnEndComboEdited()
{
int nMin = GetChangedComboTimeInMin(m_wndCbEnd);
if (nMin >= 0)
OnEndChanged();
}
void CXTPCalendarEventRecurrenceDlg::OnDurationComboEdited()
{
int nMin = GetDurationComboInMin();
if (nMin >= 0)
OnDurationChanged();
}
void CXTPCalendarEventRecurrenceDlg::OnStartComboChanged()
{
OnStartChanged();
}
void CXTPCalendarEventRecurrenceDlg::_OnStartChanged()
{
int nMin = GetChangedComboTimeInMin(m_wndCbStart);
if (nMin == -1)
{
return;
}
m_dtStart.SetTime(nMin/60%24, nMin%60, 0);
int nDurationMin = GetDurationComboInMin();
if (nDurationMin < 0)
{
nDurationMin = 0;
}
COleDateTimeSpan spDiff((double)nDurationMin/((double)24*60));
m_dtEnd = m_dtStart + spDiff;
m_dtEnd = CXTPCalendarUtils::ResetDate(m_dtEnd);
CString strTimeFormat_HrMin = CXTPCalendarUtils::GetTimeFormatString_HrMin();
CString strTmp = CXTPCalendarUtils::GetTimeFormat(m_dtEnd.GetHour(), m_dtEnd.GetMinute(), strTimeFormat_HrMin);
m_wndCbEnd.SetWindowText(strTmp);
}
void CXTPCalendarEventRecurrenceDlg::OnEndComboChanged()
{
OnEndChanged();
}
void CXTPCalendarEventRecurrenceDlg::_OnEndChanged()
{
int nMin = GetChangedComboTimeInMin(m_wndCbEnd);
if (nMin == -1)
{
return;
}
COleDateTime dtPrevEnd = m_dtEnd;
m_dtEnd.SetTime(nMin/60%24, nMin%60, 0);
COleDateTimeSpan spDiff = m_dtEnd - dtPrevEnd;
int nDuration = GetDurationComboInMin();
if (nDuration < 0)
{
nDuration = 0;
}
nDuration += CXTPCalendarUtils::GetTotalMinutes(spDiff);
if (m_dtEnd < m_dtStart && nDuration < 0)
{
spDiff = m_dtStart - m_dtEnd;
nDuration = 24*60 - CXTPCalendarUtils::GetTotalMinutes(spDiff);
}
CString strDuration = CXTPCalendarUtils::FormatTimeDuration(nDuration, FALSE);
m_wndCbDuration.SetWindowText(strDuration);
}
int CXTPCalendarEventRecurrenceDlg::GetDurationComboInMin()
{
CString strCBtext;
m_wndCbDuration.GetWindowText(strCBtext);
return CXTPCalendarUtils::ParceTimeDuration_min(strCBtext);
}
void CXTPCalendarEventRecurrenceDlg::OnDurationComboChanged()
{
OnDurationChanged();
}
void CXTPCalendarEventRecurrenceDlg::_OnDurationChanged()
{
int nDuration_min = GetDurationComboInMin();
if (nDuration_min < 0)
{
return;
}
m_dtEnd = m_dtStart + CXTPCalendarUtils::Minutes2Span(nDuration_min);
CString strTimeFormat_HrMin = CXTPCalendarUtils::GetTimeFormatString_HrMin();
CString strTmp = CXTPCalendarUtils::GetTimeFormat(m_dtEnd.GetHour(), m_dtEnd.GetMinute(), strTimeFormat_HrMin);
m_wndCbEnd.SetWindowText(strTmp);
}
void CXTPCalendarEventRecurrenceDlg::MsgBox_WrongValue(CWnd* pWnd)
{
pWnd->SetFocus();
XTPResourceManager()->ShowMessageBox(XTP_IDS_CALENDAR_WRONG_VALUE);
}
void CXTPCalendarEventRecurrenceDlg::MsgBox_WrongValueRange(UINT nCtrlID, int nMin, int nMax)
{
if (GetDlgItem(nCtrlID))
GetDlgItem(nCtrlID)->SetFocus();
CString strFormat = CXTPCalendarUtils::LoadString(XTP_IDS_CALENDAR_WRONG_VALUE_RANGE);
CString strMsg, strVal1, strVal2;
strVal1.Format(_T("%d"), nMin);
strVal2.Format(_T("%d"), nMax);
strMsg.Format(strFormat, (LPCTSTR)strVal1, (LPCTSTR)strVal2);
XTPResourceManager()->ShowMessageBox(strMsg);
}
void CXTPCalendarEventRecurrenceDlg::OnOK()
{
int nMin = GetChangedComboTimeInMin(m_wndCbStart);
if (nMin == -1)
{
MsgBox_WrongValue(&m_wndCbStart);
return;
}
nMin = GetChangedComboTimeInMin(m_wndCbEnd);
if (nMin == -1)
{
MsgBox_WrongValue(&m_wndCbEnd);
return;
}
int nDuration_min = GetDurationComboInMin();
if (nDuration_min < 0)
{
MsgBox_WrongValue(&m_wndCbDuration);
return;
}
UpdateData();
CXTPCalendarEventsPtr ptrExceptions = m_ptrPattern->GetExceptions();
if (ptrExceptions && ptrExceptions->GetCount())
{
// Any exceptions associated with this recurring appointment will be lost. If any of the exceptions are meetings, the attendees will not be notified. Is this OK?
int nRes = XTPResourceManager()->ShowMessageBox(XTP_IDS_CALENDAR_REMOVE_EXCEPTIONS, MB_OKCANCEL);
if (nRes != IDOK)
{
return;
}
m_ptrPattern->RemoveAllExceptions();
}
m_dtStart = CXTPCalendarUtils::ResetDate(m_dtStart);
m_ptrPattern->SetStartTime(m_dtStart);
m_ptrPattern->SetDurationMinutes(nDuration_min);
//----------------------------------------------------------
XTP_CALENDAR_RECURRENCE_OPTIONS opt;
int nRadio = GetCheckedRadioButton(XTP_IDC_RADIO_DAILY, XTP_IDC_RADIO_YEARLY);
switch (nRadio)
{
case XTP_IDC_RADIO_DAILY:
{
if (m_nDayInterval < 1 || m_nDayInterval > 999)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_DAYINTERVAL, 1, 999);
return;
}
opt.m_nRecurrenceType = xtpCalendarRecurrenceDaily;
opt.m_Daily.bEveryWeekDayOnly = GetCheckedRadioButton(XTP_IDC_RADIO_EVERYDAY, XTP_IDC_RADIO_EVERYWORKDAY) == XTP_IDC_RADIO_EVERYWORKDAY;
if (opt.m_Daily.bEveryWeekDayOnly)
{
opt.m_Daily.nIntervalDays = 1;
if (nWorkWeekMask != xtpCalendarDayMo_Fr)
{
opt.m_nRecurrenceType = xtpCalendarRecurrenceWeekly;
opt.m_Weekly.nIntervalWeeks = 1;
opt.m_Weekly.nDayOfWeekMask = 0;
if (nWorkWeekMask & xtpCalendarDayMonday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayMonday;
if (nWorkWeekMask & xtpCalendarDayTuesday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayTuesday;
if (nWorkWeekMask & xtpCalendarDayWednesday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayWednesday;
if (nWorkWeekMask & xtpCalendarDayThursday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayThursday;
if (nWorkWeekMask & xtpCalendarDayFriday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayFriday;
if (nWorkWeekMask & xtpCalendarDaySaturday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDaySaturday;
if (nWorkWeekMask & xtpCalendarDaySunday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDaySunday;
}
}
else
opt.m_Daily.nIntervalDays = m_nDayInterval;
break;
}
case XTP_IDC_RADIO_WEEKLY:
if (m_nWeeklyInterval < 1 || m_nWeeklyInterval > 999)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_WEEKLY_INTERVAL, 1, 999);
return;
}
opt.m_nRecurrenceType = xtpCalendarRecurrenceWeekly;
opt.m_Weekly.nIntervalWeeks = m_nWeeklyInterval;
opt.m_Weekly.nDayOfWeekMask = 0;
if (m_bMonday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayMonday;
if (m_bTuesday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayTuesday;
if (m_bWednesday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayWednesday;
if (m_bThursday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayThursday;
if (m_bFriday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDayFriday;
if (m_bSaturday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDaySaturday;
if (m_bSunday)
opt.m_Weekly.nDayOfWeekMask |= xtpCalendarDaySunday;
break;
case XTP_IDC_RADIO_MONTHLY:
if (GetCheckedRadioButton(XTP_IDC_RADIO_MONTH_RECUR, XTP_IDC_RADIO_MONTH_IN) ==
XTP_IDC_RADIO_MONTH_RECUR)
{
if (m_nMonthInterval < 1 || m_nMonthInterval > 999)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_MONTH_MONTH, 1, 999);
return;
}
if (m_MonthDate < 1 || m_MonthDate > 31)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_MONTH_DATE, 1, 31);
return;
}
opt.m_nRecurrenceType = xtpCalendarRecurrenceMonthly;
opt.m_Monthly.nIntervalMonths = m_nMonthInterval;
opt.m_Monthly.nDayOfMonth = m_MonthDate;
}
else
{
if (m_nMonthInterval2 < 1 || m_nMonthInterval2 > 999)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_MONTH_MONTH2, 1, 999);
return;
}
opt.m_MonthNth.nIntervalMonths = m_nMonthInterval2;
opt.m_nRecurrenceType = xtpCalendarRecurrenceMonthNth;
opt.m_MonthNth.nWhichDayMask = (int)m_wndCbMonthDay.GetItemData(m_wndCbMonthDay.GetCurSel());
opt.m_MonthNth.nWhichDay = (int)m_wndCbMonthWhich.GetItemData(m_wndCbMonthWhich.GetCurSel());
}
break;
case XTP_IDC_RADIO_YEARLY:
opt.m_nRecurrenceType = xtpCalendarRecurrenceYearly;
if (GetCheckedRadioButton(XTP_IDC_RADIO_YEAR_RECUR, XTP_IDC_RADIO_YEAR_IN) ==
XTP_IDC_RADIO_YEAR_RECUR)
{
if (m_nDayOfMonth < 1 || m_nDayOfMonth > 31)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_YEAR_DATE, 1, 31);
return;
}
opt.m_Yearly.nDayOfMonth = m_nDayOfMonth;
opt.m_Yearly.nMonthOfYear = (int)m_wndYearMonth.GetItemData(m_wndYearMonth.GetCurSel());
}
else
{
opt.m_nRecurrenceType = xtpCalendarRecurrenceYearNth;
opt.m_YearNth.nMonthOfYear = (int)m_wndComboYearMonth2.GetItemData(m_wndComboYearMonth2.GetCurSel());
opt.m_YearNth.nWhichDay = (int)m_wndCbYearWhich.GetItemData(m_wndCbYearWhich.GetCurSel());
opt.m_YearNth.nWhichDayMask = (int)m_wndCbYearDay.GetItemData(m_wndCbYearDay.GetCurSel());
}
break;
}
m_ptrPattern->SetRecurrenceOptions(opt);
//-----------------------------------------------------------------------
m_dtStartDate = CXTPCalendarUtils::ResetTime(m_dtStartDate);
m_ptrPattern->SetPatternStartDate(m_dtStartDate);
nRadio = GetCheckedRadioButton(XTP_IDC_RADIO_NOEND, XTP_IDC_RADIO_ENDBY);
switch (nRadio)
{
case XTP_IDC_RADIO_ENDBY:
if (m_dtEndDate < m_dtStartDate)
{
MsgBox_WrongValue(GetDlgItem(XTP_IDC_DATETIMEPICKER_ENDDATE));
return;
}
m_ptrPattern->SetPatternEndDate(m_dtEndDate);
break;
case XTP_IDC_RADIO_ENDAFTER:
if (m_nOccurNum < 1 || m_nOccurNum > 999)
{
MsgBox_WrongValueRange(XTP_IDC_EDIT_OCCUR, 1, 999);
return;
}
m_ptrPattern->SetEndAfterOccurrences(m_nOccurNum);
break;
case XTP_IDC_RADIO_NOEND:
m_ptrPattern->SetNoEndDate();
break;
}
//-----------------------------------------------------------------------
VERIFY(m_ptrMasterEvent->UpdateRecurrence(m_ptrPattern));
CDialog::OnOK();
}
void CXTPCalendarEventRecurrenceDlg::OnBnClickedButtonRemoveRecurrence()
{
VERIFY(m_ptrMasterEvent->RemoveRecurrence());
EndDialog(XTP_CALENDAR_DLGRESULT_REMOVE_RECURRENCE);
}
void CXTPCalendarEventRecurrenceDlg::OnBnClickedRadioDailyYearly(UINT nID)
{
ShowWindow(XTP_IDC_RADIO_EVERYDAY, FALSE);
ShowWindow(XTP_IDC_RADIO_EVERYWORKDAY, FALSE);
ShowWindow(XTP_IDC_EDIT_DAYINTERVAL, FALSE);
ShowWindow(XTP_IDC_STATIC_DAY, FALSE);
ShowWindow(XTP_IDC_STATIC_WEEKLY_RECEVERY, FALSE);
ShowWindow(XTP_IDC_EDIT_WEEKLY_INTERVAL, FALSE);
ShowWindow(XTP_IDC_STATIC_WEEKLY_FOLLDAYS, FALSE);
ShowWindow(XTP_IDC_CHECK_MONDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_TUESDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_WEDNESDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_THURSDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_FRIDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_SATURDAY, FALSE);
ShowWindow(XTP_IDC_CHECK_SUNDAY, FALSE);
ShowWindow(XTP_IDC_RADIO_MONTH_RECUR, FALSE);
ShowWindow(XTP_IDC_RADIO_MONTH_IN, FALSE);
ShowWindow(XTP_IDC_EDIT_MONTH_DATE, FALSE);
ShowWindow(XTP_IDC_STATIC_MONTH_NUMEVERY, FALSE);
ShowWindow(XTP_IDC_EDIT_MONTH_MONTH, FALSE);
ShowWindow(XTP_IDC_STATIC_MONTH_MONTH, FALSE);
ShowWindow(XTP_IDC_COMBO_MONTH_CRIT, FALSE);
ShowWindow(XTP_IDC_COMBO_MONTH_DAY, FALSE);
ShowWindow(XTP_IDC_STATIC_MONTH_EVERY, FALSE);
ShowWindow(XTP_IDC_EDIT_MONTH_MONTH2, FALSE);
ShowWindow(XTP_IDC_STATIC_MONTH_MONTH2, FALSE);
ShowWindow(XTP_IDC_RADIO_YEAR_RECUR, FALSE);
ShowWindow(XTP_IDC_RADIO_YEAR_IN, FALSE);
ShowWindow(XTP_IDC_EDIT_YEAR_DATE, FALSE);
ShowWindow(XTP_IDC_COMBO_YEAR_MONTH, FALSE);
ShowWindow(XTP_IDC_COMBO_YEAR_CRIT, FALSE);
ShowWindow(XTP_IDC_COMBO_YEAR_DAY, FALSE);
ShowWindow(XTP_IDC_COMBO_YEAR_MONTH2, FALSE);
ShowWindow(XTP_IDC_STATIC_YEAR_OF, FALSE);
switch (nID)
{
case XTP_IDC_RADIO_DAILY:
ShowWindow(XTP_IDC_RADIO_EVERYDAY);
ShowWindow(XTP_IDC_RADIO_EVERYWORKDAY);
ShowWindow(XTP_IDC_EDIT_DAYINTERVAL);
ShowWindow(XTP_IDC_STATIC_DAY);
break;
case XTP_IDC_RADIO_WEEKLY:
ShowWindow(XTP_IDC_STATIC_WEEKLY_RECEVERY);
ShowWindow(XTP_IDC_EDIT_WEEKLY_INTERVAL);
ShowWindow(XTP_IDC_STATIC_WEEKLY_FOLLDAYS);
ShowWindow(XTP_IDC_CHECK_MONDAY);
ShowWindow(XTP_IDC_CHECK_TUESDAY);
ShowWindow(XTP_IDC_CHECK_WEDNESDAY);
ShowWindow(XTP_IDC_CHECK_THURSDAY);
ShowWindow(XTP_IDC_CHECK_FRIDAY);
ShowWindow(XTP_IDC_CHECK_SATURDAY);
ShowWindow(XTP_IDC_CHECK_SUNDAY);
break;
case XTP_IDC_RADIO_MONTHLY:
ShowWindow(XTP_IDC_RADIO_MONTH_RECUR);
ShowWindow(XTP_IDC_RADIO_MONTH_IN);
ShowWindow(XTP_IDC_EDIT_MONTH_DATE);
ShowWindow(XTP_IDC_STATIC_MONTH_NUMEVERY);
ShowWindow(XTP_IDC_EDIT_MONTH_MONTH);
ShowWindow(XTP_IDC_STATIC_MONTH_MONTH);
ShowWindow(XTP_IDC_COMBO_MONTH_CRIT);
ShowWindow(XTP_IDC_COMBO_MONTH_DAY);
ShowWindow(XTP_IDC_STATIC_MONTH_EVERY);
ShowWindow(XTP_IDC_EDIT_MONTH_MONTH2);
ShowWindow(XTP_IDC_STATIC_MONTH_MONTH2);
break;
case XTP_IDC_RADIO_YEARLY:
ShowWindow(XTP_IDC_RADIO_YEAR_RECUR);
ShowWindow(XTP_IDC_RADIO_YEAR_IN);
ShowWindow(XTP_IDC_EDIT_YEAR_DATE);
ShowWindow(XTP_IDC_COMBO_YEAR_MONTH);
ShowWindow(XTP_IDC_COMBO_YEAR_CRIT);
ShowWindow(XTP_IDC_COMBO_YEAR_DAY);
ShowWindow(XTP_IDC_COMBO_YEAR_MONTH2);
ShowWindow(XTP_IDC_STATIC_YEAR_OF);
break;
}
}
CRect CXTPCalendarEventRecurrenceDlg::GetCtrlRect(int nID)
{
ASSERT(GetDlgItem(nID));
CRect rcRect(0, 0, 0, 0);
if (GetDlgItem(nID))
GetDlgItem(nID)->GetWindowRect(&rcRect);
return rcRect;
}
void CXTPCalendarEventRecurrenceDlg::MoveWindow_Y(int nID, int nYOffset)
{
if (GetDlgItem(nID))
{
CRect rcRect = GetCtrlRect(nID);
ScreenToClient(&rcRect);
rcRect.top += nYOffset;
rcRect.bottom += nYOffset;
GetDlgItem(nID)->MoveWindow(rcRect);
}
else
{
ASSERT(FALSE);
}
}
void CXTPCalendarEventRecurrenceDlg::_MoveControlsBy_Y()
{
CRect rcBase = GetCtrlRect(XTP_IDC_RADIO_DAILY);
rcBase.top += 10;
CRect rcBase2 = GetCtrlRect(XTP_IDC_RADIO_EVERYDAY);
int nYOffset = rcBase.top - rcBase2.top;
MoveWindow_Y(XTP_IDC_RADIO_EVERYDAY, nYOffset);
MoveWindow_Y(XTP_IDC_RADIO_EVERYWORKDAY,nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_DAYINTERVAL, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_DAY, nYOffset);
rcBase2 = GetCtrlRect(XTP_IDC_STATIC_WEEKLY_RECEVERY);
nYOffset = rcBase.top - rcBase2.top;
MoveWindow_Y(XTP_IDC_STATIC_WEEKLY_RECEVERY,nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_WEEKLY_INTERVAL, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_WEEKLY_FOLLDAYS,nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_MONDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_TUESDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_WEDNESDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_THURSDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_FRIDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_SATURDAY, nYOffset);
MoveWindow_Y(XTP_IDC_CHECK_SUNDAY, nYOffset);
rcBase2 = GetCtrlRect(XTP_IDC_RADIO_MONTH_RECUR);
nYOffset = rcBase.top - rcBase2.top;
MoveWindow_Y(XTP_IDC_RADIO_MONTH_RECUR, nYOffset);
MoveWindow_Y(XTP_IDC_RADIO_MONTH_IN, nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_MONTH_DATE, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_MONTH_NUMEVERY, nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_MONTH_MONTH, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_MONTH_MONTH, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_MONTH_CRIT, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_MONTH_DAY, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_MONTH_EVERY, nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_MONTH_MONTH2, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_MONTH_MONTH2, nYOffset);
rcBase2 = GetCtrlRect(XTP_IDC_RADIO_YEAR_RECUR);
nYOffset = rcBase.top - rcBase2.top;
MoveWindow_Y(XTP_IDC_RADIO_YEAR_RECUR, nYOffset);
MoveWindow_Y(XTP_IDC_RADIO_YEAR_IN, nYOffset);
MoveWindow_Y(XTP_IDC_EDIT_YEAR_DATE, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_YEAR_MONTH, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_YEAR_CRIT, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_YEAR_DAY, nYOffset);
MoveWindow_Y(XTP_IDC_COMBO_YEAR_MONTH2, nYOffset);
MoveWindow_Y(XTP_IDC_STATIC_YEAR_OF, nYOffset);
//------------------------------------------------------------------------
CRect rcDialog;
GetWindowRect(&rcDialog);
CRect rcOK = GetCtrlRect(IDOK);
rcDialog.bottom = rcOK.bottom + 10;
SetWindowPos(NULL, 0, 0, rcDialog.Width(), rcDialog.Height(), SWP_NOMOVE | SWP_NOZORDER);
}