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.

1473 lines
58 KiB
C++

// XTPCalendarUtils.h: interface for the CXTPCalendarUtils class.
//
// 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
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPCALENDARUTILS_H_)
#define __XTPCALENDARUTILS_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//}}AFX_CODEJOCK_PRIVATE
//===========================================================================
// Remarks:
// Half a second, expressed in days.
// See Also: COleDateTime overview.
//===========================================================================
#define XTP_HALF_SECOND (1.0/172800.0)
//---------------------------------------------------------------------------
// Summary: Defines a lower bound of the time frame for the Calendar control.
// See Also: xtpCalendarDateTime_max
//---------------------------------------------------------------------------
static const COleDateTime xtpCalendarDateTime_min(100, 1, 1, 0, 0, 0);
//---------------------------------------------------------------------------
// Summary: Defines an upper bound of the time frame for the Calendar control.
// See Also: xtpCalendarDateTime_min
//---------------------------------------------------------------------------
static const COleDateTime xtpCalendarDateTime_max(9999, 12, 31, 0, 0, 0);
class CXTPCalendarEvent;
//---------------------------------------------------------------------------
// Summary: Interface f for overriding GetCurrentTime() function in calendar control.
// Allows to set custom date\time for calendar
//---------------------------------------------------------------------------
class ITimeProvider
{
public:
virtual COleDateTime GetCurrentTime() = 0;
};
//////////////////////////////////////////////////////////////////////////
//===========================================================================
// Summary:
// This template function is used to compare operands using operator >
// for the operands type and return compare result from the set: {-1, 0, 1}.
// Parameters:
// _Type - Operands type.
// e1 - First operand to compare.
// e2 - Second operand to compare.
// Returns:
// 0 if e1 == e2; 1 if e1 > e2; -1 if e1 \< e2.
//===========================================================================
template<class _Type>
AFX_INLINE int XTPCompare(_Type e1, _Type e2)
{
if (e1 > e2)
return 1;
if (e2 > e1)
return -1;
return 0;
}
//===========================================================================
// Summary:
// Helper class with static member functions to perform common
// tasks with dates, events and other objects.
//===========================================================================
class _XTP_EXT_CLASS CXTPCalendarUtils
{
private:
//-----------------------------------------------------------------------
// Summary:
// Default constructor
// Remarks:
// Do not create an instance of this class.
// Use CXTPCalendarUtils::MemberFunction form.
//-----------------------------------------------------------------------
CXTPCalendarUtils();
public:
//-----------------------------------------------------------------------
// Summary:
// This member function is used to retrieve information about a locale.
// Parameters:
// LCType - An LCTYPE that specifies the type of locale information to
// retrieve. (for the LOCALE_USER_DEFAULT)
// Returns:
// Integer value that contains the information about the locale.
// See Also: GetLocaleInfo
//-----------------------------------------------------------------------
static int AFX_CDECL GetLocaleLong(LCTYPE LCType);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to retrieve information about a locale.
// Parameters:
// LCType - An LCTYPE that specifies the type of locale information to
// retrieve. (for the LOCALE_USER_DEFAULT)
// nMaxLength - An int that contains the maximum string size to
// allocate for the corresponding buffer.
// Returns:
// String value.
// See Also: GetLocaleInfo
//-----------------------------------------------------------------------
static CString AFX_CDECL GetLocaleString(LCTYPE LCType, int nMaxLength = 128);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to format a date as a date string
// for a LOCALE_USER_DEFAULT locale.
// Parameters:
// lpDate - Pointer to a SYSTEMTIME structure that contains
// the date information to be formatted. If this
// pointer is NULL, the function uses the current
// local system date.
//
// lpFormat - Pointer to a format picture string that is used
// to form the date string. The format picture
// string must be zero terminated. If lpFormat is
// NULL, the function uses the date format of the
// specified locale.
// Remarks:
// The function formats either a specified date or the local system date.
// Returns:
// A CString that contains the formatted date string.
// See Also: GetDateFormat
//-----------------------------------------------------------------------
static CString AFX_CDECL GetDateFormat(CONST SYSTEMTIME* lpDate, LPCTSTR lpFormat);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to format a date as a date string
// for a LOCALE_USER_DEFAULT locale.
// Parameters:
// dtDate - A date to be formatted.
//
// lpFormat - Pointer to a format picture string that is used
// to form the date string. The format picture
// string must be zero terminated. If lpFormat is
// NULL, the function uses the date format of the
// specified locale.
// Remarks:
// The function formats either a specified date or the local system date.
// Returns:
// A CString that contains the formatted date string.
// See Also: GetDateFormat
//-----------------------------------------------------------------------
static CString AFX_CDECL GetDateFormat(CONST COleDateTime& dtDate, LPCTSTR lpFormat);
// ---------------------------------------------------------------------------
// Summary:
// This member function is used to format a time as a time string for
// a LOCALE_USER_DEFAULT locale.
// Parameters:
// lpTime - Pointer to a SYSTEMTIME structure that contains the time
// information to be formatted. If this pointer is NULL, the
// function uses the current local system time.
// lpFormat - Pointer to a format picture string that is used to form the
// time string. The format picture string must be zero
// terminated. If lpFormat is NULL, the function uses the time
// format of the specified locale.
// Remarks:
// The function formats either a specified time or the local system
// time.
// Returns:
// A CString that contains the formatted time string.
// See Also:
// GetTimeFormat
// ---------------------------------------------------------------------------
static CString AFX_CDECL GetTimeFormat(CONST SYSTEMTIME* lpTime, LPCTSTR lpFormat);
// ---------------------------------------------------------------------------
// Summary:
// This member function is used to format a time as a time string for
// a LOCALE_USER_DEFAULT locale.
// Parameters:
// dtTime - A time to be formatted.
// lpFormat - Pointer to a format picture string that is used to form the
// time string. The format picture string must be zero
// terminated. If lpFormat is NULL, the function uses the time
// format of the specified locale.
// Remarks:
// The function formats either a specified time or the local system
// time.
// Returns:
// A CString that contains the formatted time string.
// See Also:
// GetTimeFormat
// ---------------------------------------------------------------------------
static CString AFX_CDECL GetTimeFormat(CONST COleDateTime& dtTime, LPCTSTR lpFormat);
// ---------------------------------------------------------------------------
// Summary:
// This member function is used to format a time as a time string for
// a LOCALE_USER_DEFAULT locale.
// Parameters:
// nHour - Hour of time to be formatted.
// nMinutes - Minutes of time to be formatted.
//
// lpFormat - Pointer to a format picture string that is used to form the
// time string. The format picture string must be zero
// terminated. If lpFormat is NULL, the function uses the time
// format of the specified locale.
// Remarks:
// The function formats either a specified time or the local system
// time.
// Returns:
// A CString that contains the formatted time string.
// See Also:
// GetTimeFormat
// ---------------------------------------------------------------------------
static CString AFX_CDECL GetTimeFormat(int nHour, int nMinutes, LPCTSTR lpFormat);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to calculate the maximum month
// day number for a specified Year and Month in the dtDate parameter.
// Parameters:
// dtDate - A COleDateTime date value.
// Returns:
// An int that contains the maximum month day number. (30, 31, 28, 29)
//-----------------------------------------------------------------------
static int AFX_CDECL GetMaxMonthDay(COleDateTime dtDate);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to shift the specified date for
// the specified number of months.
// Parameters:
// refDate - A reference to the COleDateTime object to shift
// the date on.
// nMonthCount - An int that contains the number of months shifted.
// Can be both positive and negative numbers.
// Remarks:
// This is a utility function that is used to shift the specified date
// for the specific number of months.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object was set
// successfully. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL ShiftDate_Month(COleDateTime &refDate, int nMonthCount);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to shift the specified date for
// the specified number of months.
// Parameters:
// refDate - A reference to the COleDateTime object to shift
// the date on.
// nMonthCount - An int that contains the number of months shifted.
// Can be both positive and negative numbers.
// nMonthDay - An int that contains the day of the month to set
// for a resulting date. If nMonthDay is grater then the
// maximum month day in the result month, then the maximum
// possible day is set.
// Remarks:
// This is a utility function that is used to shift the specified date
// for the specific number of months.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object was set
// successfully. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL ShiftDate_Month(COleDateTime &refDate, int nMonthCount, int nMonthDay);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to shift the specified date for the
// specified number of years.
// Parameters:
// refDate - Reference to the COleDateTime object to shift the date on.
// nYearCount - An int that contains the number of years to shift. Can be both
// positive and negative numbers.
// Remarks:
// This is a utility function that is used to shift the specified date
// the specified number of years.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object is set
// successfully. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL ShiftDate_Year(COleDateTime &refDate, int nYearCount);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to shift the specified date for the
// specified number of years.
// Parameters:
// refDate - Reference to the COleDateTime object to shift the date on.
// nYearCount - An int that contains the number of years to shift. Can be both
// positive and negative numbers.
// nMonthDay - An int that contains the day of the month to set
// for the resulting date. If nMonthDay is grater
// then the maximum month day in the result month,
// then the maximum possible day is set.
// Remarks:
// This is a utility function that is used to shift the specified date
// the specified number of years.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object is set
// successfully. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL ShiftDate_Year(COleDateTime &refDate, int nYearCount, int nMonthDay);
// ---------------------------------------------------------------------
// Summary:
// This member function is used to determine the number of minutes
// between two DateTime objects.
// Parameters:
// dtStart : A COleDateTime object that contains the beginning
// date.
// dtEnd : A COleDateTime object that contains the end date.
// bAllDayEvent : Calculate duration for all day event.
// Remarks:
// This is a utility function that is used to retrieve the number of
// minutes between two COleDateTime objects.
// Returns:
// An int that contains the number of minutes between two DateTime
// \objects.
// ---------------------------------------------------------------------
static int AFX_CDECL GetDurationMinutes(const COleDateTime& dtStart, const COleDateTime& dtEnd, BOOL bAllDayEvent);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to safely update a month day in
// the specified date.
// Parameters:
// refDate - Reference to the COleDateTime object to shift
// the date on.
// nMonthDay - An int that contains the day of the month to set
// for the resulting date.
// If nMonthDay is grater then the maximum month day in
// the result month, then the maximum possible day is
// set.
// Remarks:
// This is utility function is used to update the month day in the
// specified date.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object was set
// successfully. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL UpdateMonthDay(COleDateTime &refDate, int nMonthDay);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to update the time part for the
// specified DateTime value.
// Parameters:
// dtDate - A COleDateTime object that contains the value that
// is used to update the time part.
// nHour - An int that contains the new Hour in the time part.
// nMinutes - An int that contains the new Minutes in the time part.
// nSeconds - An int that contains the new Seconds in the time part.
// Returns:
// A COleDateTime object that contains the updated time part.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL UpdateTime(const COleDateTime& dtDate, int nHour, int nMinutes, int nSeconds);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to update the time part for the
// specified DateTime value.
// Parameters:
// dtDate - A COleDateTime object that contains the value used
// to update the time part.
// dtTime - A COleDateTime object that contains the new time part value.
// Returns:
// A COleDateTime object that contains the updated time part.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL UpdateTime(const COleDateTime& dtDate, const COleDateTime& dtTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to update the time part to 23:59.
// Parameters:
// dtDateTime - A COleDateTime object that contains the value used
// to update the time part.
// Returns:
// A COleDateTime object that contains the updated time part.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL SetTime_235959(const COleDateTime& dtDateTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to update the date part of the
// specified DateTime value.
// Parameters:
// dtTime - A COleDateTime object that contains the value used
// to update the date part.
// dtDate - A COleDateTime object that contains the new date part.
// Returns:
// A COleDateTime object that contains the updated date part.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL UpdateDate(const COleDateTime& dtTime, const COleDateTime& dtDate);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to update the date part of the
// specified DateTime value.
// Parameters:
// dtTime - A COleDateTime object that contains the value used
// to update the date part.
// nYear - An int that contains the new Year used in the date part.
// nMonth - An int that contains the new Minutes used in the the date part.
// nDay - An int that contains the new Day used in the date part.
// Returns:
// A COleDateTime object that contains the updated date part.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL UpdateDate(const COleDateTime& dtTime, int nYear, int nMonth, int nDay);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to reset (set to zero) the time
// part for the specified DateTime value.
// Parameters:
// dtDateTime - a COleDateTime object that contains the time value to reset.
// Returns:
// A COleDateTime object with the time part set equal to zero.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL ResetTime(const COleDateTime& dtDateTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to reset (set to zero) the time
// part for the specified DateTime value.
// Parameters:
// dtDateTime - a DATE object that contains the time value to reset.
// Returns:
// A COleDateTime object with the time part set equal to zero.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL ResetTime(const DATE dtDateTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to reset (set to zero) the date
// part for the specified DateTime value.
// Parameters:
// dtDateTime - A COleDateTime DateTime value that contains the
// DateTime value to reset.
// Returns:
// A COleDateTime object with the date part set equal to zero.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static const COleDateTime AFX_CDECL ResetDate(const COleDateTime& dtDateTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to compare two dates (and times).
// Parameters:
// dt1 - A COleDateTime object that contains the first
// DateTime value.
// dt2 - A COleDateTime object that contains the second
// DateTime value.
// bOneSecTimeDiff - A BOOL. Used to set the precision of the compare operation.
// If TRUE, then one second precision is used.
// If FALSE, then half a second precision is used.
// Returns:
// A BOOL. TRUE if the dates differ by less than or equal to the specified
// precision. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL IsEqual(const COleDateTime& dt1, const COleDateTime& dt2, BOOL bOneSecTimeDiff = FALSE);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to determine if the time part is
// equal to zero.
// Parameters:
// dtDateTime - A COleDateTime object that contains the value to check.
// Returns:
// A BOOL. TRUE if the time part is equal to zero. FALSE otherwise.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static BOOL AFX_CDECL IsZeroTime(const COleDateTime& dtDateTime);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to calculate differences between 2 dates
// in months.
// Parameters:
// dt1 - A COleDateTime object that contains the first
// DateTime value.
// dt2 - A COleDateTime object that contains the second
// DateTime value.
// Returns:
// Months difference for dt1 - dt2.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static int AFX_CDECL GetDiff_Months(const COleDateTime& dt1, const COleDateTime& dt2);
//-----------------------------------------------------------------------
// Summary:
// Get event end date (date part only) value.
// Parameters:
// pEvent - Event object.
// Remarks:
// Useful when end DateTime has a zero time part and/or event
// start equal end.
// Returns:
// Date part of the event end DateTime.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static COleDateTime AFX_CDECL RetriveEventEndDate(const CXTPCalendarEvent* pEvent);
//-----------------------------------------------------------------------
// Summary:
// Get event end date (date part only) value.
// Parameters:
// dtStart - Event start time.
// dtEnd - Event end time.
// Remarks:
// Useful when end DateTime has a zero time part and/or event
// start equal end.
// Returns:
// Date part of the event end DateTime.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static COleDateTime AFX_CDECL RetriveEventEndDate(const COleDateTime& dtStart, const COleDateTime& dtEnd);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to get an event duration as a number
// of days.
// Parameters:
// dtStart - Event start time.
// dtEnd - Event end time.
// Returns:
// Integer value of an event duration in days.
// See Also:
// CXTPCalendarEvent::GetDurationMinutes(), CXTPCalendarEvent::GetDuration()
//-----------------------------------------------------------------------
static int AFX_CDECL GetEventPeriodDays(const COleDateTime& dtStart, const COleDateTime& dtEnd);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to calculate the day of the month
// from the provided COleDateTime object.
// Parameters:
// rdtDate - A COleDateTime object that contains the date to
// update with the valid year and month parts.
// nWhichDay - An int that contains the value from the enum
// XTPCalendarWeek. This parameter specifies
// the sequential number of the day For example:
// First Friday.
// nWhichDayMask - An int that contains the combination of values
// from the enums XTPCalendarWeekDay or the
// XTPCalendarWeekDay. This parameter, together
// with the nWhichDay parameter are used to
// specify the following logical values:
// Which Day of Month, Which WeekDay,
// Which WeekEndDay, Which day of week
// Su, Mo, ..., St. For example: Last day of Month,
// Second WeekEndDay, Fourth Monday.
// Returns:
// A BOOL. TRUE if the value of this COleDateTime object was set
// successfully. FALSE otherwise.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL CalcDayOfMonth(COleDateTime& rdtDate, int nWhichDay, int nWhichDayMask);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to convert a sequential week day
// number (from 1 to 7) to a value from the enum XTPCalendarWeekDay.
// Parameters:
// nWeekDay - An int that contains the sequential week day number.
// 1-Sunday, 2-Monday, ...
// Returns:
// An int that contains the corresponding value from the enum
// XTPCalendarWeekDay.
// See Also: GetDayOfWeekIndex, enum XTPCalendarWeekDay
//-----------------------------------------------------------------------
static int AFX_CDECL GetDayOfWeekMask(int nWeekDay);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to convert an XTPCalendarWeekDay
// enum value to a sequential week day number (from 1 to 7).
// Parameters:
// nDayOfWeekMask - An int that contains the value from the enum
// XTPCalendarWeekDay.
// Returns:
// An int that contains the sequential week day number.
// 1-Sunday, 2-Monday, ...
// See Also: GetDayOfWeekMask, enum XTPCalendarWeekDay
//-----------------------------------------------------------------------
static int AFX_CDECL GetDayOfWeekIndex(int nDayOfWeekMask);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to count the bits in the specified
// bit mask.
// Parameters:
// nDayOfWeekMask - An int that contains the mask from the enum
// XTPCalendarWeekDay.
// Returns:
// An int that contains the integer value of the day 0f the week
// contained in the bit mask.
// See Also: GetDayOfWeekMask, enum XTPCalendarWeekDay
//-----------------------------------------------------------------------
static int AFX_CDECL GetDayOfWeekCount(int nDayOfWeekMask);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to make the days mask from Monday
// until the specified day.
// Parameters:
// nEndWDay - An int that contains the sequential week day number.
// 1-Sunday, 2-Monday, ...
// Returns:
// An int that contains the values set from the enum XTPCalendarWeekDay.
// See Also: GetDayOfWeekIndex, enum XTPCalendarWeekDay
//-----------------------------------------------------------------------
static int AFX_CDECL MakeDaysOfWeekMask_Mo_(int nEndWDay);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to shift the specified date to
// the begin of the week.
// Parameters:
// dtDate - A COleDateTime object that contains the value
// to shift to the beginning of the week.
// nFirstDayOfWeekIndex - Index of the first day of week. Default value 1.
// 1-Sunday, 2-Monday, ...
// Returns:
// A COleDateTime object that contains the date of the first day of week
// before the specified date.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static COleDateTime AFX_CDECL ShiftDateToWeekBegin(COleDateTime dtDate,
int nFirstDayOfWeekIndex = 1);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to calculate a week number of year.
// Parameters:
// dtDate - A COleDateTime object that contains the date
// to calculate the week of year.
// nFirstDayOfWeekIndex - Index of the first day of week. Default value 1.
// 1-Sunday, 2-Monday, ...
// Returns:
// A week number of year for the specified date.
// See Also: COleDateTime overview
//-----------------------------------------------------------------------
static int AFX_CDECL GetWeekOfYear(COleDateTime dtDate, int nFirstDayOfWeekIndex = 1);
//-----------------------------------------------------------------------
// Summary:
// The SystemTimeToTzSpecificLocalTime function converts a time in
// Coordinated Universal Time (UTC) to a specified time zone's
// corresponding local time.
// Parameters:
// pTZI - [in] Pointer to a TIME_ZONE_INFORMATION structure
// that specifies the time zone of interest.
// pUTime - [in] Pointer to a SYSTEMTIME structure that specifies
// a UTC. The function converts this universal time to
// the specified time zone's corresponding local time.
// pTzTime - [out] Pointer to a SYSTEMTIME structure that receives
// the local time information.
// Returns:
// If the function succeeds, the return value is nonzero,
// and the function sets the members of the SYSTEMTIME structure
// pointed to by pTzTime to the appropriate local time values.
// See Also:
// SystemTimeToTzSpecificLocalTime() windows API function.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL SystemTimeToTzSpecificLocalTime(const TIME_ZONE_INFORMATION* pTZI,
const SYSTEMTIME* pUTime,
SYSTEMTIME* pTzTime);
//-----------------------------------------------------------------------
// Summary:
// This function is used to determine that program running on
// Windows 9x operation system family.
// Returns:
// TRUE for Windows 9x operation system, otherwise FALSE.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL IsWin9x();
//-----------------------------------------------------------------------
// Summary:
// Converts a number of minutes to the corresponding COleDateTimeSpan
// object.
// Parameters:
// nMinutes - A number of minutes in the time span.
// Returns:
// Calculated COleDateTimeSpan object.
//-----------------------------------------------------------------------
static COleDateTimeSpan AFX_CDECL Minutes2Span(int nMinutes);
private:
static ITimeProvider* g_TimeProviderOverride;
public:
//-----------------------------------------------------------------------
// Summary:
// Returns current local time.
// Returns:
// COleDateTime object with the calculated local time value.
//-----------------------------------------------------------------------
static COleDateTime AFX_CDECL GetCurrentTime();
//-----------------------------------------------------------------------
// Summary:
// Overrides local time provider with custom provider. The date\time returned
// by custom provider will be used as current time for calendar control.
// All calls to CXTPCalendarUtils::GetCurrentTime() from within calendar control will be routed to custom provider
// Parameters:
// A pointer to an instance of custom time provider. The instance must remain until the time provider is reset by ResetTimeProvider() call
// The caller should free provider instance memory after ResetTimeProvider() call
//-----------------------------------------------------------------------
static void AFX_CDECL OverrideTimeProvider(ITimeProvider* pTimeProvider);
//-----------------------------------------------------------------------
// Summary:
// Resets time provider to default which will use current machine date time
//-----------------------------------------------------------------------
static void AFX_CDECL ResetTimeProvider();
//-----------------------------------------------------------------------
// Summary:
// Returns current time format string for hours and minutes.
// Returns:
// A time format string like: 'HH:mm', 'hh:mm tt', 'h:m t', ...
//-----------------------------------------------------------------------
static CString AFX_CDECL GetTimeFormatString_HrMin();
//-----------------------------------------------------------------------
// Summary:
// Parse a time string like "18:20" or "7:15 pm" and returns time
// as total minutes. Active locale setting are used.
// Parameters:
// pcszTime_HrMin - time string like "18:20" or "7:15 pm"
// Returns:
// Time as total minutes.
//-----------------------------------------------------------------------
static int AFX_CDECL ParceTimeString_min(LPCTSTR pcszTime_HrMin);
//-----------------------------------------------------------------------
// Summary:
// Format time duration like "3 minutes" or "1 week".
// Active locale setting are used.
// Parameters:
// nMinutes - Duration in minutes
// bRoundly - If TRUE duration will be rounded to biggest scale,
// like 65 minutes will be formatted as "1 hour".
// If False duration will formatted exactly:
// 65 minutes as "65 minutes; 120 minutes as "2 hours".
// Returns:
// Time duration as string like "5 minutes", "2 hours", "1 day", "3 weeks".
//-----------------------------------------------------------------------
static CString AFX_CDECL FormatTimeDuration(int nMinutes, BOOL bRoundly);
//-----------------------------------------------------------------------
// Summary:
// Parse a time duration string like "5 minutes", "2 hours", "1 day"
// or "3 weeks" and returns duration as total minutes.
// Active locale setting are used.
// Parameters:
// pcszTimeDuration - time duration string like "5 minutes", "2 hours"
// Returns:
// Time duration as total minutes.
//-----------------------------------------------------------------------
static int AFX_CDECL ParceTimeDuration_min(LPCTSTR pcszTimeDuration);
//-----------------------------------------------------------------------
// Summary:
// Loads string using XTPResourceManager.
// Parameters:
// nIDResource - ID of the string in resource.
// Returns:
// Loaded string or an empty string.
//-----------------------------------------------------------------------
static CString AFX_CDECL LoadString(UINT nIDResource);
//-----------------------------------------------------------------------
// Summary:
// Loads string using XTPResourceManager.
// Parameters:
// nIDResource - ID of the string in resource.
// rstrString - [out] Reference to CString object to load string to.
// Remarks:
// If string with such ID is not present in the resource - rstrString
// is not changed.
// Returns:
// TRUE if string loaded, FALSE otherwise.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL LoadString2(CString& rstrString, UINT nIDResource);
//-----------------------------------------------------------------------
// Summary:
// Prepares a string for single line display.
// Parameters:
// rstrString - [out] Reference to CString object to update.
// Remarks:
// Removes from the string not visible characters which are valid
// for multiline display, but not valid for singleline.
// Examples: '\n'.
// See also:
// DT_SINGLELINE
//-----------------------------------------------------------------------
static void AFX_CDECL TextPrepareSingleline(CString& rstrString);
//-----------------------------------------------------------------------
// Summary:
// Determine which locale is used active locale: current user locale
// or resource file locale.
// Returns:
// TRUE if resource file locale is used active locale, FALSE otherwise.
// See Also:
// SetUseResourceFileLocale, CXTPResourceManager::GetResourcesLangID,
// GetActiveLCID, LOCALE_USER_DEFAULT
//-----------------------------------------------------------------------
static BOOL AFX_CDECL IsUseResourceFileLocale();
//-----------------------------------------------------------------------
// Summary:
// Used to set which locale is used active locale: current user locale
// or resource file locale.
// Parameters:
// bUseResourceFileLocale - If TRUE resource file locale will be used,
// if FALSE current user locale will be used.
// See Also:
// IsUseResourceFileLocale, CXTPResourceManager::GetResourcesLangID,
// GetActiveLCID, LOCALE_USER_DEFAULT
//-----------------------------------------------------------------------
static void AFX_CDECL SetUseResourceFileLocale(BOOL bUseResourceFileLocale);
//-----------------------------------------------------------------------
// Summary:
// Returns active locale ID (current user locale or resource file locale)
// Returns:
// LOCALE_USER_DEFAULT or resource file locale ID.
// See Also:
// IsUseResourceFileLocale, SetUseResourceFileLocale,
// CXTPResourceManager::GetResourcesLangID, LOCALE_USER_DEFAULT
//-----------------------------------------------------------------------
static LCID AFX_CDECL GetActiveLCID();
//-----------------------------------------------------------------------
// Summary:
// This function used to determine a font with maximum symbols height
// in an array of fonts.
// Parameters:
// arFonts - [in] A reference to array of fonts.
// pDC - [in] A pointer to valid device context or NULL.
// pnMaxHeight - [out] A pointer to int variable to store maximum font
// height or NULL.
// Remarks:
// if pDC is not NULL - the font height in device logical units is used.
// Otherwise the LOGFONT.lfHeight member is used as font height.
// Returns:
// A font from the provided array with maximum symbols height.
//-----------------------------------------------------------------------
static CFont* AFX_CDECL GetMaxHeightFont(CArray<CFont*, CFont*>& arFonts,
CDC* pDC, int* pnMaxHeight = NULL);
public:
//-----------------------------------------------------------------------
// Summary:
// Call this function to check a character is a format character
// Mm Dd Yy
// Parameters:
// t - character.
// Returns:
// TRUE if the input character is a format character, FALSE else.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL IsFormatChar(TCHAR t);
//-----------------------------------------------------------------------
// Summary:
// Call this function to remove a portion from the time format part(Mm Dd Yy).
// Parameters:
// strFormat - The format string.
// lpszRemove - String to remove.
// Returns:
// The new string.
//-----------------------------------------------------------------------
static CString AFX_CDECL RemoveFormatPart(CString strFormat, LPCTSTR lpszRemove);
//-----------------------------------------------------------------------
// Summary:
// Call this function to remove a character from the time format part(Mm Dd Yy).
// Parameters:
// strFormat - The format string.
// lpszRemove - String to remove.
// Returns:
// The new string.
//-----------------------------------------------------------------------
static CString AFX_CDECL RemoveFormatPart(CString strFormat, TCHAR cRemove);
//-----------------------------------------------------------------------
// Summary:
// This function reomves fixed number of characters from the format
// string, starting at a particular index.
// Parameters:
// strFormat - The format string.
// nIndex - Starting index.
// nRemove - The number of characters to remove.
//-----------------------------------------------------------------------
static void StripFormat(CString& strFormat, int nIndex, int nRemove);
private:
static BOOL AFX_CDECL IsInDst(const TIME_ZONE_INFORMATION* pTZI, COleDateTime dtTime);
struct CXTPTimesResourceIDs
{
typedef CMap<int, int, UINT, UINT> CMapInt2UINT;
CMapInt2UINT s_mapMinutes;
CMapInt2UINT s_mapHours;
CMapInt2UINT s_mapDays;
CMapInt2UINT s_mapWeeks;
CXTPTimesResourceIDs();
};
static BOOL s_bUseResourceFileLocale;
public:
//-----------------------------------------------------------------------
// Summary:
// This function used to round date time value by add (subtract)
// half-second double value.
// Parameters:
// dblDT - [in] A date time value in COLEDateTime double representation.
// Returns:
// Rounded date time value in COLEDateTime double representation.
//-----------------------------------------------------------------------
static double AFX_CDECL _RoundDateTime_dbl(double dblDT);
//-----------------------------------------------------------------------
// Summary:
// This function used to reset time part.
// Parameters:
// dblDT - [in] A date time value in COLEDateTime double representation.
// Returns:
// Date value (with zero time) in COLEDateTime double representation.
//-----------------------------------------------------------------------
static double AFX_CDECL _ResetTime_dbl(double dblDT);
//-----------------------------------------------------------------------
// Summary:
// This function used to reset date part.
// Parameters:
// dblDT - [in] A date time value in COLEDateTime double representation.
// Returns:
// Time value (with zero date) in COLEDateTime double representation.
//-----------------------------------------------------------------------
static double AFX_CDECL _ResetDate_dbl(double dblDT);
public:
//-----------------------------------------------------------------------
// Summary:
// The TrackMouseEvent function posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.
// Parameters:
// dwFlags - Specifies the services requested
// hwndTrack - Specifies a handle to the window to track.
// dwHoverTime - Specifies the hover time-out (if TME_HOVER was specified in dwFlags), in milliseconds.
// Can be HOVER_DEFAULT, which means to use the system default hover time-out.
// Returns:
// If the function succeeds, the return value is nonzero.
//-----------------------------------------------------------------------
static BOOL AFX_CDECL TrackMouseEvent(DWORD dwFlags, HWND hwndTrack, DWORD dwHoverTime = HOVER_DEFAULT);
public:
static BOOL AFX_CDECL GetAsSystemTime(const COleDateTime& dtTime, SYSTEMTIME& sysTime);
static LONG AFX_CDECL GetTotalDays(const COleDateTimeSpan& spSpan);
static LONG AFX_CDECL GetTotalHours(const COleDateTimeSpan& spSpan);
static LONG AFX_CDECL GetTotalMinutes(const COleDateTimeSpan& spSpan);
static LONG AFX_CDECL GetTotalSeconds(const COleDateTimeSpan& spSpan);
static LONG AFX_CDECL _DoubleToLONG(double dValue);
};
//===========================================================================
//===========================================================================
// Summary:
// Helper class template provides functionality to temporary set some
// to variable and reset to initial or other value on destroy.
// Can be useful to lock some data or actions via flags and unlock
// automatically.
//===========================================================================
template<class _TValue>
class CXTPAutoResetValue
{
_TValue m_valReset;
_TValue& m_rData;
public:
//-----------------------------------------------------------------------
// Summary:
// Object constructor.
// Parameters:
// rData - A reference to managing variable.
// Remarks:
// The original value of rData is stored in separate member and it
// will be restored on destroy.
//-----------------------------------------------------------------------
CXTPAutoResetValue(_TValue& rData) :
m_rData(rData)
{
m_valReset = rData;
}
//-----------------------------------------------------------------------
// Summary:
// Object constructor.
// Parameters:
// rData - A reference to managing variable.
// valReset - A value to set when destroy.
// Remarks:
// The original value of rData is ignored.
// valReset value will be used on destroy.
//-----------------------------------------------------------------------
CXTPAutoResetValue(_TValue& rData, const _TValue& valReset): m_rData(rData)
{
m_valReset = valReset;
}
//-----------------------------------------------------------------------
// Summary:
// Object destructor.
// Remarks:
// Managing variable value will be restored to the original one or to
// value specified as second constructor parameter.
//-----------------------------------------------------------------------
virtual ~CXTPAutoResetValue()
{
m_rData = m_valReset;
}
//-----------------------------------------------------------------------
// Summary:
// This member operator is use to access managing variable.
// Returns:
// Managing variable reference.
//-----------------------------------------------------------------------
operator _TValue&()
{
return m_rData;
}
//-----------------------------------------------------------------------
// Summary:
// This member function overloads the assignment operator for the
// CXTPAutoResetValue class.
// Parameters:
// rSrc - A new value.
// Returns:
// A reference to this object.
//-----------------------------------------------------------------------
const _TValue& operator =(const _TValue& rSrc)
{
return m_rData = rSrc;
}
};
/////////////////////////////////////////////////////////////////////////////
AFX_INLINE double CXTPCalendarUtils::_RoundDateTime_dbl(double dblDT)
{
return (dblDT >= 0 ? dblDT + XTP_HALF_SECOND : dblDT - XTP_HALF_SECOND);
}
AFX_INLINE double CXTPCalendarUtils::_ResetTime_dbl(double dblDT)
{
return (double)((LONGLONG)_RoundDateTime_dbl(dblDT));
}
AFX_INLINE double CXTPCalendarUtils::_ResetDate_dbl(double dblDT)
{
double dblDate = _ResetTime_dbl(dblDT);
double dblResult = dblDT > dblDate ? (dblDT - dblDate) : (dblDate - dblDT);
double dblDate_raw = (double)((LONGLONG)dblDT);
if (dblDate_raw != dblDate)
{
dblResult = _RoundDateTime_dbl(dblResult);
}
return dblResult;
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetTime(const COleDateTime& dtDateTime)
{
return (DATE)_ResetTime_dbl((double)dtDateTime);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetTime(const DATE dtDateTime)
{
return (DATE)_ResetTime_dbl((double)dtDateTime);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetDate(const COleDateTime& dtDateTime)
{
return (DATE)_ResetDate_dbl((double)dtDateTime);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::SetTime_235959(const COleDateTime& dtDateTime)
{
double dDate = _ResetTime_dbl((double)dtDateTime);
return (DATE)(dDate + 1 - XTP_HALF_SECOND * 2);
}
AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekMask(int nWeekDay)
{
ASSERT(nWeekDay >= 1 && nWeekDay <= 7);
int nRes = 1 << (nWeekDay-1);
return nRes;
}
//return 1 = Sunday, 2 = Monday ...
AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekIndex(int nDayOfWeekMask)
{
//int nTestMask[7];
//for (int i = 1; i <= 7; i++)
//{
// nTestMask[i - 1] = 1 << (i-1);
//}
//this loop fill array {1,2,4,8,16,32,64}
//by enum XTPCalendarWeekDay
//xtpCalendarDaySunday = 0x001, // Sunday
//xtpCalendarDayMonday = 0x002, // Monday
//xtpCalendarDayTuesday = 0x004, // Tuesday
//xtpCalendarDayWednesday = 0x008, // Wednesday
//xtpCalendarDayThursday = 0x010, // Thursday
//xtpCalendarDayFriday = 0x020, // Friday
//xtpCalendarDaySaturday = 0x040, // Saturday
for (int i = 1; i <= 7; i++)
{
//if (nTestMask[i-1] == nDayOfWeekMask)
int nTestMask = 1 << (i-1);
if (nTestMask == nDayOfWeekMask)
{
return i;
}
}
ASSERT(FALSE);
return 0;
}
AFX_INLINE int CXTPCalendarUtils::GetMaxMonthDay(COleDateTime dtDate)
{
SYSTEMTIME sysDate;
if (!CXTPCalendarUtils::GetAsSystemTime(dtDate, sysDate))
return 0;
// days per month - _ jan feb mar apr may jun jul aug sep oct nov dec
static int arDays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (sysDate.wMonth == 2 && sysDate.wYear % 4 == 0)
{
if (sysDate.wYear % 100 != 0 || sysDate.wYear % 400 == 0)
return 29;
else
return 28;
}
else
{
return arDays[sysDate.wMonth];
}
}
AFX_INLINE BOOL CXTPCalendarUtils::UpdateMonthDay(COleDateTime &refDate, int nMonthDay)
{
if (nMonthDay > 28)
{
int nMaxDay = GetMaxMonthDay(refDate);
if (!nMaxDay)
{
return FALSE;
}
nMonthDay = min(nMonthDay, nMaxDay);
}
SYSTEMTIME sysDate;
if (!CXTPCalendarUtils::GetAsSystemTime(refDate, sysDate))
return FALSE;
int nRes = refDate.SetDate(sysDate.wYear, sysDate.wMonth, nMonthDay);
return nRes == 0;
}
/*
AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Month(COleDateTime &refDate, int nMonthCount)
{
int nYearOld = refDate.GetYear();
int nMonthOld = refDate.GetMonth();
int nYearNew = nYearOld + (-12 + nMonthOld + nMonthCount) / 12;
int nMonthCalc = nMonthOld + nMonthCount - 1;
if (nMonthCalc < 0)
nMonthCalc = 12 * (-nMonthCalc) + nMonthCalc;
int nMonthNew = 1 + nMonthCalc % 12;
return COleDateTime::valid == refDate.SetDate(nYearNew, nMonthNew, 1);
}
*/
AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Month(COleDateTime &refDate, int nMonthCount)
{
SYSTEMTIME sysDate;
if (!CXTPCalendarUtils::GetAsSystemTime(refDate, sysDate))
return FALSE;
int nYearNew = sysDate.wYear + nMonthCount / 12;
int nMonthNew = sysDate.wMonth + nMonthCount % 12;
if (nMonthNew > 12)
{
nMonthNew -= 12 * (nMonthCount / abs(nMonthCount));
nYearNew++;
}
else if (nMonthNew <= 0)
{
nYearNew--;
nMonthNew += 12;
ASSERT(nMonthNew >= 1 && nMonthNew <= 12);
}
return COleDateTime::valid == refDate.SetDate(nYearNew, nMonthNew, 1);
}
AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Month(COleDateTime &refDate, int nMonthCount, int nMonthDay)
{
if (ShiftDate_Month(refDate, nMonthCount))
{
BOOL bRes = UpdateMonthDay(refDate, nMonthDay);
return bRes;
}
return FALSE;
}
AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Year(COleDateTime &refDate, int nYearCount)
{
SYSTEMTIME sysDate;
if (!CXTPCalendarUtils::GetAsSystemTime(refDate, sysDate))
{
return FALSE;
}
int nYearNew = sysDate.wYear + nYearCount;
return COleDateTime::valid == refDate.SetDate(nYearNew, sysDate.wMonth, 1);
}
AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Year(COleDateTime &refDate, int nYearCount, int nMonthDay)
{
if (ShiftDate_Year(refDate, nYearCount))
{
BOOL bRes = UpdateMonthDay(refDate, nMonthDay);
return bRes;
}
return FALSE;
}
AFX_INLINE int CXTPCalendarUtils::GetDiff_Months(const COleDateTime& dt1, const COleDateTime& dt2)
{
int nYear1 = dt1.GetYear();
int nMonth1 = dt1.GetMonth();
int nYear2 = dt2.GetYear();
int nMonth2 = dt2.GetMonth();
int nYearDiff = nYear1 - nYear2;
int nMonthDiff = nYearDiff * 12;
nMonthDiff += nMonth1 - nMonth2;
return nMonthDiff;
}
AFX_INLINE int CXTPCalendarUtils::GetDurationMinutes(const COleDateTime& dtStart, const COleDateTime& dtEnd, BOOL bAllDayEvent)
{
COleDateTimeSpan spDuration;
if (bAllDayEvent)
{
spDuration = SetTime_235959(dtEnd) - ResetTime(dtStart);
}
else
{
spDuration = dtEnd - dtStart;
}
return (int)CXTPCalendarUtils::GetTotalMinutes(spDuration);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateTime(const COleDateTime& dtDate, int nHour, int nMinutes, int nSeconds)
{
SYSTEMTIME stResult;
if (!CXTPCalendarUtils::GetAsSystemTime(dtDate, stResult))
{
ASSERT(FALSE);
return dtDate;
}
stResult.wHour = (WORD)nHour;
stResult.wMinute = (WORD)nMinutes;
stResult.wSecond = (WORD)nSeconds;
return COleDateTime(stResult);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateTime(const COleDateTime& dtDate, const COleDateTime& dtTime)
{
double dDate = _ResetTime_dbl((double)dtDate);
double dTime = _ResetDate_dbl((double)dtTime);
return (DATE)(dDate + dTime);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateDate(const COleDateTime& dtTime, int nYear, int nMonth, int nDay)
{
SYSTEMTIME stResult;
if (!CXTPCalendarUtils::GetAsSystemTime(dtTime, stResult))
{
ASSERT(FALSE);
return dtTime;
}
stResult.wYear = (WORD)nYear;
stResult.wMonth = (WORD)nMonth;
stResult.wDay = (WORD)nDay;
return COleDateTime(stResult);
}
AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateDate(const COleDateTime& dtTime, const COleDateTime& dtDate)
{
double dDate = _ResetTime_dbl((double)dtDate);
double dTime = _ResetDate_dbl((double)dtTime);
return (DATE)(dDate + dTime);
}
AFX_INLINE COleDateTime CXTPCalendarUtils::RetriveEventEndDate(const COleDateTime& dtStart, const COleDateTime& dtEnd)
{
COleDateTime dtEndDay = ResetTime(dtEnd);
if (IsZeroTime(dtEnd))
{
COleDateTime dtStartDay = ResetTime(dtStart);
if (dtStartDay < dtEndDay)
{
const COleDateTimeSpan spDay(1, 0, 0, 0);
dtEndDay -= spDay;
}
}
return dtEndDay;
}
AFX_INLINE int CXTPCalendarUtils::GetEventPeriodDays(const COleDateTime& dtStart, const COleDateTime& dtEnd)
{
COleDateTime dtStartDay = ResetTime(dtStart);
COleDateTime dtEndDay = RetriveEventEndDate(dtStart, dtEnd);
COleDateTimeSpan spDuration = dtEndDay - dtStartDay;
int nDays = (int)CXTPCalendarUtils::GetTotalDays(spDuration) + 1;
return nDays;
}
AFX_INLINE COleDateTimeSpan CXTPCalendarUtils::Minutes2Span(int nMunutes)
{
double dblSpan = ((double)nMunutes) / (24 * 60);
return COleDateTimeSpan(dblSpan);
}
AFX_INLINE COleDateTime CXTPCalendarUtils::ShiftDateToWeekBegin(COleDateTime dtDate, int nFirstDayOfWeekIndex)
{
dtDate = CXTPCalendarUtils::ResetTime(dtDate);
int nShift = (dtDate.GetDayOfWeek() - nFirstDayOfWeekIndex + 7) % 7;
if (nShift)
{
COleDateTimeSpan spShift(nShift, 0, 0, 0);
dtDate -= spShift;
}
return dtDate;
}
AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekCount(int nDayOfWeekMask)
{
int nCount = 0;
for (int i = 1; i <= 7; i++)
{
int nTestMask = 1 << (i-1);
if (nTestMask & nDayOfWeekMask)
{
nCount++;
}
}
return nCount;
}
AFX_INLINE int CXTPCalendarUtils::MakeDaysOfWeekMask_Mo_(int nEndWDay)
{
int nMask = 0;
for (int i = 1; i < nEndWDay; i++)
{
int nWDMask = CXTPCalendarUtils::GetDayOfWeekMask(i);
nMask |= nWDMask;
}
return nMask;
}
AFX_INLINE BOOL CXTPCalendarUtils::GetAsSystemTime(const COleDateTime& dtTime, SYSTEMTIME& sysTime)
{
::ZeroMemory(&sysTime, sizeof(sysTime));
return dtTime.GetAsSystemTime(sysTime);
}
AFX_INLINE LONG CXTPCalendarUtils::GetTotalDays(const COleDateTimeSpan& spSpan)
{
return (LONG)spSpan.GetTotalDays();
}
AFX_INLINE LONG CXTPCalendarUtils::GetTotalHours(const COleDateTimeSpan& spSpan)
{
return (LONG)spSpan.GetTotalHours();
}
AFX_INLINE LONG CXTPCalendarUtils::_DoubleToLONG(double dValue)
{
return LONG(dValue > 0 ? min(dValue, double(LONG_MAX)) : max(dValue, double(LONG_MIN)) );
}
AFX_INLINE LONG CXTPCalendarUtils::GetTotalMinutes(const COleDateTimeSpan& spSpan)
{
double dSpan = _RoundDateTime_dbl(spSpan);
double dMinutes = dSpan * 24 * 60;
LONG nMinutes = _DoubleToLONG(dMinutes);
return nMinutes;
}
AFX_INLINE LONG CXTPCalendarUtils::GetTotalSeconds(const COleDateTimeSpan& spSpan)
{
double dSpan = _RoundDateTime_dbl(spSpan);
double dSeconds = dSpan * 24 * 60 * 60;
LONG nSeconds = _DoubleToLONG(dSeconds);
return nSeconds;
}
/////////////////////////////////////////////////////////////////////////////
#endif // !defined(__XTPCALENDARUTILS_H_)