XTPCalendarUtils.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:48k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarUtils.h: interface for the CXTPCalendarUtils class.
  2. //
  3. // This file is a part of the XTREME CALENDAR MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPCALENDARUTILS_H_)
  22. #define __XTPCALENDARUTILS_H_
  23. #if _MSC_VER > 1000
  24. #pragma once
  25. #endif // _MSC_VER > 1000
  26. //}}AFX_CODEJOCK_PRIVATE
  27. #include "Common/XTPVC50Helpers.h"
  28. #include <math.h>
  29. //////////////////////////////////////////////////////////////////////////
  30. // Macros
  31. //{{AFX_CODEJOCK_PRIVATE
  32. #define XTPchSTR(x) #x
  33. #define XTPchSTR2(x) XTPchSTR(x)
  34. #define XTPNOTE(desc) message(__FILE__ "(" XTPchSTR2(__LINE__) ") : NOTE: " ##desc)
  35. //How to use it: #pragma XTPNOTE("Message text")
  36. //}}AFX_CODEJOCK_PRIVATE
  37. //===========================================================================
  38. //===========================================================================
  39. // Remarks:
  40. //     Half a second, expressed in days.
  41. // See Also: COleDateTime overview.
  42. //===========================================================================
  43. #define XTP_HALF_SECOND  (1.0/172800.0)
  44. //---------------------------------------------------------------------------
  45. // Summary: Defines a lower bound of the time frame for the Calendar control.
  46. // See Also: xtpCalendarDateTime_max
  47. //---------------------------------------------------------------------------
  48. static const COleDateTime xtpCalendarDateTime_min(100, 1, 1, 0, 0, 0);
  49. //---------------------------------------------------------------------------
  50. // Summary: Defines an upper bound of the time frame for the Calendar control.
  51. // See Also: xtpCalendarDateTime_min
  52. //---------------------------------------------------------------------------
  53. static const COleDateTime xtpCalendarDateTime_max(9999, 12, 31, 0, 0, 0);
  54. //{{AFX_CODEJOCK_PRIVATE
  55. class CXTPCalendarEvent;
  56. //}}AFX_CODEJOCK_PRIVATE
  57. //////////////////////////////////////////////////////////////////////////
  58. //===========================================================================
  59. // Summary:
  60. //      This template function is used to compare operands using operator >
  61. //      for the operands type and return compare result from the set: {-1, 0, 1}.
  62. // Parameters:
  63. //     _Type    - Operands type.
  64. //     e1       - First operand to compare.
  65. //     e2       - Second operand to compare.
  66. // Returns:
  67. //     0 if e1 == e2; 1 if e1 > e2; -1 if e1 < e2.
  68. //===========================================================================
  69. template<class _Type>
  70. AFX_INLINE int XTPCompare(_Type e1, _Type e2) {
  71. if (e1 > e2)
  72. return 1;
  73. if (e2 > e1)
  74. return -1;
  75. return 0;
  76. }
  77. //===========================================================================
  78. // Summary:
  79. //     Helper class with static member functions to perform common
  80. //     tasks with dates, events and other objects.
  81. //===========================================================================
  82. class _XTP_EXT_CLASS CXTPCalendarUtils
  83. {
  84. private:
  85. //-----------------------------------------------------------------------
  86. // Summary:
  87. //     Default constructor
  88. // Remarks:
  89. //     Do not create an instance of this class.
  90. //     Use CXTPCalendarUtils::<MemberFunction> form.
  91. //-----------------------------------------------------------------------
  92. CXTPCalendarUtils();
  93. public:
  94. //-----------------------------------------------------------------------
  95. // Summary:
  96. //     This member function is used to retrieve information about a locale.
  97. // Parameters:
  98. //     LCType - An LCTYPE that specifies the type of locale information to
  99. //              retrieve. (for the LOCALE_USER_DEFAULT)
  100. // Returns:
  101. //     Integer value that contains the information about the locale.
  102. // See Also: GetLocaleInfo
  103. //-----------------------------------------------------------------------
  104. static int AFX_CDECL GetLocaleLong(LCTYPE LCType);
  105. //-----------------------------------------------------------------------
  106. // Summary:
  107. //     This member function is used to retrieve information about a locale.
  108. // Parameters:
  109. //     LCType     - An LCTYPE that specifies the type of locale information to
  110. //                  retrieve. (for the LOCALE_USER_DEFAULT)
  111. //     nMaxLength - An int that contains the maximum string size to
  112. //                  allocate for the corresponding buffer.
  113. // Returns:
  114. //     String value.
  115. // See Also: GetLocaleInfo
  116. //-----------------------------------------------------------------------
  117. static CString AFX_CDECL GetLocaleString(LCTYPE LCType, int nMaxLength);
  118. //-----------------------------------------------------------------------
  119. // Summary:
  120. //     This member function is used to format a date as a date string
  121. //     for a LOCALE_USER_DEFAULT locale.
  122. // Parameters:
  123. //     lpDate   - Pointer to a SYSTEMTIME structure that contains
  124. //                the date information to be formatted. If this
  125. //                pointer is NULL, the function uses the current
  126. //                local system date.
  127. //
  128. //     dtDate   - A date to be formatted.
  129. //
  130. //     lpFormat - Pointer to a format picture string that is used
  131. //                to form the date string. The format picture
  132. //                string must be zero terminated. If lpFormat is
  133. //                NULL, the function uses the date format of the
  134. //                specified locale.
  135. // Remarks:
  136. //     The function formats either a specified date or the local system date.
  137. // Returns:
  138. //     A CString that contains the formatted date string.
  139. // See Also: GetDateFormat
  140. //-----------------------------------------------------------------------
  141. static CString AFX_CDECL GetDateFormat(CONST SYSTEMTIME* lpDate, LPCTSTR lpFormat);
  142. static CString AFX_CDECL GetDateFormat(CONST COleDateTime& dtDate, LPCTSTR lpFormat); // <COMBINE CXTPCalendarUtils::GetDateFormat@CONST SYSTEMTIME*@LPCTSTR>
  143. // ---------------------------------------------------------------------------
  144. // Summary:
  145. //     This member function is used to format a time as a time string for
  146. //     a LOCALE_USER_DEFAULT locale.
  147. // Parameters:
  148. //     lpTime   - Pointer to a SYSTEMTIME structure that contains the time
  149. //                 information to be formatted. If this pointer is NULL, the
  150. //                 function uses the current local system time.
  151. //
  152. //     dtTime   - A time to be formatted.
  153. //
  154. //     nHour    - Hour of time to be formatted.
  155. //     nMinutes - Minutes of time to be formatted.
  156. //
  157. //     lpFormat - Pointer to a format picture string that is used to form the
  158. //                 time string. The format picture string must be zero
  159. //                 terminated. If lpFormat is NULL, the function uses the time
  160. //                 format of the specified locale.
  161. // Remarks:
  162. //     The function formats either a specified time or the local system
  163. //     time.
  164. // Returns:
  165. //     A CString that contains the formatted time string.
  166. // See Also:
  167. //     GetTimeFormat
  168. // ---------------------------------------------------------------------------
  169. static CString AFX_CDECL GetTimeFormat(CONST SYSTEMTIME* lpTime, LPCTSTR lpFormat);
  170. static CString AFX_CDECL GetTimeFormat(CONST COleDateTime& dtTime, LPCTSTR lpFormat);   // <COMBINE CXTPCalendarUtils::GetTimeFormat@CONST SYSTEMTIME*@LPCTSTR>
  171. static CString AFX_CDECL GetTimeFormat(int nHour, int nMinutes, LPCTSTR lpFormat);      // <COMBINE CXTPCalendarUtils::GetTimeFormat@CONST SYSTEMTIME*@LPCTSTR>
  172. //-----------------------------------------------------------------------
  173. // Summary:
  174. //     This member function is used to calculate the maximum month
  175. //     day number for a specified Year and Month in the dtDate parameter.
  176. // Parameters:
  177. //     dtDate   - A COleDateTime date value.
  178. // Returns:
  179. //     An int that contains the maximum month day number. (30, 31, 28, 29)
  180. //-----------------------------------------------------------------------
  181. static int AFX_CDECL GetMaxMonthDay(COleDateTime dtDate);
  182. //-----------------------------------------------------------------------
  183. // Summary:
  184. //     This member function is used to shift the specified date for
  185. //     the specified number of months.
  186. // Parameters:
  187. //     refDate     - A reference to the COleDateTime object to shift
  188. //                   the date on.
  189. //     nMonthCount - An int that contains the number of months shifted.
  190. //                   Can be both positive and negative numbers.
  191. //     nMonthDay   - An int that contains the day of the month to set
  192. //                   for a resulting date. If nMonthDay is grater then the
  193. //                   maximum month day in the result month, then the maximum
  194. //                   possible day is set.
  195. // Remarks:
  196. //     This is a utility function that is used to shift the specified date
  197. //     for the specific number of months.
  198. // Returns:
  199. //     A BOOL. TRUE if the value of this COleDateTime object was set
  200. //     successfully. FALSE otherwise.
  201. // See Also: COleDateTime overview
  202. //-----------------------------------------------------------------------
  203. static BOOL AFX_CDECL ShiftDate_Month(COleDateTime &refDate, int nMonthCount);
  204. static BOOL AFX_CDECL ShiftDate_Month(COleDateTime &refDate, int nMonthCount, int nMonthDay); // <combine CXTPCalendarUtils::ShiftDate_Month@COleDateTime &@int>
  205. //-----------------------------------------------------------------------
  206. // Summary:
  207. //     This member function is used to shift the specified date for the
  208. //     specified number of years.
  209. // Parameters:
  210. //     refDate     - Reference to the COleDateTime object to shift the date on.
  211. //     nYearCount  - An int that contains the number of years to shift. Can be both
  212. //                   positive and negative numbers.
  213. //     nMonthDay   - An int that contains the day of the month to set
  214. //                   for the resulting date. If nMonthDay is grater
  215. //                   then the maximum month day in the result month,
  216. //                   then the maximum possible day is set.
  217. // Remarks:
  218. //     This is a utility function that is used to shift the specified date
  219. //     the specified number of years.
  220. // Returns:
  221. //     A BOOL. TRUE if the value of this COleDateTime object is set
  222. //     successfully. FALSE otherwise.
  223. // See Also: COleDateTime overview
  224. //-----------------------------------------------------------------------
  225. static BOOL AFX_CDECL ShiftDate_Year(COleDateTime &refDate, int nYearCount);
  226. static BOOL AFX_CDECL ShiftDate_Year(COleDateTime &refDate, int nYearCount, int nMonthDay); // <combine CXTPCalendarUtils::ShiftDate_Year@COleDateTime &@int>
  227. // ---------------------------------------------------------------------
  228. // Summary:
  229. //     This member function is used to determine the number of minutes
  230. //     between two DateTime objects.
  231. // Parameters:
  232. //      dtStart :      A COleDateTime object that contains the beginning
  233. //                     date.
  234. //      dtEnd :        A COleDateTime object that contains the end date.
  235. //      bAllDayEvent : Calculate duration for all day event.
  236. // Remarks:
  237. //     This is a utility function that is used to retrieve the number of
  238. //     minutes between two COleDateTime objects.
  239. // Returns:
  240. //     An int that contains the number of minutes between two DateTime
  241. //     objects.
  242. // ---------------------------------------------------------------------
  243. static int AFX_CDECL GetDurationMinutes(const COleDateTime& dtStart, const COleDateTime& dtEnd, BOOL bAllDayEvent);
  244. //-----------------------------------------------------------------------
  245. // Summary:
  246. //     This member function is used to safely update a month day in
  247. //     the specified date.
  248. // Parameters:
  249. //     refDate     - Reference to the COleDateTime object to shift
  250. //                   the date on.
  251. //     nMonthDay   - An int that contains the day of the month to set
  252. //                   for the resulting date.
  253. //                   If nMonthDay is grater then the maximum month day in
  254. //                   the result month, then the maximum possible day is
  255. //                   set.
  256. // Remarks:
  257. //     This is utility function is used to update the month day in the
  258. //     specified date.
  259. // Returns:
  260. //     A BOOL. TRUE if the value of this COleDateTime object was set
  261. //     successfully. FALSE otherwise.
  262. // See Also: COleDateTime overview
  263. //-----------------------------------------------------------------------
  264. static BOOL AFX_CDECL UpdateMonthDay(COleDateTime &refDate, int nMonthDay);
  265. //-----------------------------------------------------------------------
  266. // Summary:
  267. //     This member function is used to update the time part for the
  268. //     specified DateTime value.
  269. // Parameters:
  270. //     dtDate   - A COleDateTime object that contains the value that
  271. //                is used to update the time part.
  272. //     nHour    - An int that contains the new Hour in the time part.
  273. //     nMinutes - An int that contains the new Minutes in the time part.
  274. //     nSeconds - An int that contains the new Seconds in the time part.
  275. // Returns:
  276. //     A COleDateTime object that contains the updated time part.
  277. // See Also: COleDateTime overview
  278. //-----------------------------------------------------------------------
  279. static const COleDateTime AFX_CDECL UpdateTime(const COleDateTime& dtDate, int nHour, int nMinutes, int nSeconds);
  280. //-----------------------------------------------------------------------
  281. // Summary:
  282. //     This member function is used to update the time part for the
  283. //     specified DateTime value.
  284. // Parameters:
  285. //     dtDate   - A COleDateTime object that contains the value used
  286. //                to update the time part.
  287. //     dtTime   - A COleDateTime object that contains the new time part value.
  288. // Returns:
  289. //     A COleDateTime object that contains the updated time part.
  290. // See Also: COleDateTime overview
  291. //-----------------------------------------------------------------------
  292. static const COleDateTime AFX_CDECL UpdateTime(const COleDateTime& dtDate, const COleDateTime& dtTime);
  293. //-----------------------------------------------------------------------
  294. // Summary:
  295. //     This member function is used to update the time part to 23:59.
  296. // Parameters:
  297. //     dtDateTime - A COleDateTime object that contains the value used
  298. //                  to update the time part.
  299. // Returns:
  300. //     A COleDateTime object that contains the updated time part.
  301. // See Also: COleDateTime overview
  302. //-----------------------------------------------------------------------
  303. static const COleDateTime AFX_CDECL SetTime_235959(const COleDateTime& dtDateTime);
  304. //-----------------------------------------------------------------------
  305. // Summary:
  306. //     This member function is used to update the date part of the
  307. //     specified DateTime value.
  308. // Parameters:
  309. //     dtTime   - A COleDateTime object that contains the value used
  310. //                to update the date part.
  311. //     nYear    - An int that contains the new Year used in the date part.
  312. //     nMonth   - An int that contains the new Minutes used in the the date part.
  313. //     nDay     - An int that contains the new Day used in the date part.
  314. //     dtDate   - A COleDateTime object that contains the new date part.
  315. // Returns:
  316. //     A COleDateTime object that contains the updated date part.
  317. // See Also: COleDateTime overview
  318. //-----------------------------------------------------------------------
  319. static const COleDateTime AFX_CDECL UpdateDate(const COleDateTime& dtTime, const COleDateTime& dtDate);
  320. static const COleDateTime AFX_CDECL UpdateDate(const COleDateTime& dtTime, int nYear, int nMonth, int nDay); // <COMBINE CXTPCalendarUtils::UpdateDate@const COleDateTime&@const COleDateTime&>
  321. //-----------------------------------------------------------------------
  322. // Summary:
  323. //     This member function is used to reset (set to zero) the time
  324. //     part for the specified DateTime value.
  325. // Parameters:
  326. //     dtDateTime   - A COleDateTime object that contains the time
  327. //                    value to reset.
  328. // Returns:
  329. //     A COleDateTime object with the time part set equal to zero.
  330. // See Also: COleDateTime overview
  331. //-----------------------------------------------------------------------
  332. static const COleDateTime AFX_CDECL ResetTime(const COleDateTime& dtDateTime);
  333. static const COleDateTime AFX_CDECL ResetTime(const DATE dtDateTime); // <COMBINE CXTPCalendarUtils::ResetTime@const COleDateTime&>
  334. //-----------------------------------------------------------------------
  335. // Summary:
  336. //     This member function is used to reset (set to zero) the date
  337. //     part for the specified DateTime value.
  338. // Parameters:
  339. //     dtDateTime   - A COleDateTime DateTime value that contains the
  340. //                    DateTime value to reset.
  341. // Returns:
  342. //     A COleDateTime object with the date part set equal to zero.
  343. // See Also: COleDateTime overview
  344. //-----------------------------------------------------------------------
  345. static const COleDateTime AFX_CDECL ResetDate(const COleDateTime& dtDateTime);
  346. //-----------------------------------------------------------------------
  347. // Summary:
  348. //     This member function is used to compare two dates (and times).
  349. // Parameters:
  350. //     dt1             - A COleDateTime object that contains the first
  351. //                       DateTime value.
  352. //     dt2             - A COleDateTime object that contains the second
  353. //                       DateTime value.
  354. //     bOneSecTimeDiff - A BOOL.  Used to set the precision of the compare operation.
  355. //                       If TRUE, then one second precision is used.
  356. //                       If FALSE, then half a second precision is used.
  357. // Returns:
  358. //     A BOOL. TRUE if the dates differ by less than or equal to the specified
  359. //     precision. FALSE otherwise.
  360. // See Also: COleDateTime overview
  361. //-----------------------------------------------------------------------
  362. static BOOL AFX_CDECL IsEqual(const COleDateTime& dt1, const COleDateTime& dt2, BOOL bOneSecTimeDiff = FALSE);
  363. //-----------------------------------------------------------------------
  364. // Summary:
  365. //     This member function is used to determine if the time part is
  366. //     equal to zero.
  367. // Parameters:
  368. //     dtDateTime   - A COleDateTime object that contains the value to check.
  369. // Returns:
  370. //     A BOOL. TRUE if the time part is equal to zero. FALSE otherwise.
  371. // See Also: COleDateTime overview
  372. //-----------------------------------------------------------------------
  373. static BOOL AFX_CDECL IsZeroTime(const COleDateTime& dtDateTime);
  374. //-----------------------------------------------------------------------
  375. // Summary:
  376. //     This member function is used to calculate differences between 2 dates
  377. //     in months.
  378. // Parameters:
  379. //     dt1             - A COleDateTime object that contains the first
  380. //                       DateTime value.
  381. //     dt2             - A COleDateTime object that contains the second
  382. //                       DateTime value.
  383. // Returns:
  384. //     Months difference for dt1 - dt2.
  385. // See Also: COleDateTime overview
  386. //-----------------------------------------------------------------------
  387. static int AFX_CDECL GetDiff_Months(const COleDateTime& dt1, const COleDateTime& dt2);
  388. //-----------------------------------------------------------------------
  389. // Summary:
  390. //     Get event end date (date part only) value.
  391. // Parameters:
  392. //     pEvent - Event object.
  393. //     dtStart - Event start time.
  394. //     dtEnd   - Event end time.
  395. // Remarks:
  396. //     Useful when end DateTime has a zero time part and/or event
  397. //     start equal end.
  398. // Returns:
  399. //     Date part of the event end DateTime.
  400. // See Also: COleDateTime overview
  401. //-----------------------------------------------------------------------
  402. static COleDateTime AFX_CDECL RetriveEventEndDate(const CXTPCalendarEvent* pEvent);
  403. static COleDateTime AFX_CDECL RetriveEventEndDate(const COleDateTime& dtStart, const COleDateTime& dtEnd); //<COMBINE CXTPCalendarUtils::RetriveEventEndDate@const CXTPCalendarEvent*>
  404. //-----------------------------------------------------------------------
  405. // Summary:
  406. //     Call this member function to get an event duration as a number
  407. //     of days.
  408. // Parameters:
  409. //     dtStart - Event start time.
  410. //     dtEnd   - Event end time.
  411. // Returns:
  412. //     Integer value of an event duration in days.
  413. // See Also:
  414. //     CXTPCalendarEvent::GetDurationMinutes(), CXTPCalendarEvent::GetDuration()
  415. //-----------------------------------------------------------------------
  416. static int AFX_CDECL GetEventPeriodDays(const COleDateTime& dtStart, const COleDateTime& dtEnd);
  417. //-----------------------------------------------------------------------
  418. // Summary:
  419. //     This member function is used to calculate the day of the month
  420. //     from the provided COleDateTime object.
  421. // Parameters:
  422. //     rdtDate       - A COleDateTime object that contains the date to
  423. //                     update with the valid year and month parts.
  424. //     nWhichDay     - An int that contains the value from the enum
  425. //                     XTPCalendarWeek. This parameter specifies
  426. //                     the sequential number of the day For example:
  427. //                     First Friday.
  428. //     nWhichDayMask - An int that contains the combination of values
  429. //                     from the enums XTPCalendarWeekDay or the
  430. //                     XTPCalendarWeekDay. This parameter, together
  431. //                     with the nWhichDay parameter are used to
  432. //                     specify the following logical values:
  433. //                     Which Day of Month, Which WeekDay,
  434. //                     Which WeekEndDay, Which day of week
  435. //                     Su, Mo, ..., St. For example: Last day of Month,
  436. //                     Second WeekEndDay, Fourth Monday.
  437. // Returns:
  438. //     A BOOL. TRUE if the value of this COleDateTime object was set
  439. //     successfully. FALSE otherwise.
  440. //-----------------------------------------------------------------------
  441. static BOOL AFX_CDECL CalcDayOfMonth(COleDateTime& rdtDate, int nWhichDay, int nWhichDayMask);
  442. //-----------------------------------------------------------------------
  443. // Summary:
  444. //     This member function is used to convert a sequential week day
  445. //     number (from 1 to 7) to a value from the enum XTPCalendarWeekDay.
  446. // Parameters:
  447. //     nWeekDay - An int that contains the sequential week day number.
  448. //     1-Sunday, 2-Monday, ...
  449. // Returns:
  450. //     An int that contains the corresponding value from the enum
  451. //     XTPCalendarWeekDay.
  452. // See Also: GetDayOfWeekIndex, enum XTPCalendarWeekDay
  453. //-----------------------------------------------------------------------
  454. static int AFX_CDECL GetDayOfWeekMask(int nWeekDay);
  455. //-----------------------------------------------------------------------
  456. // Summary:
  457. //     This member function is used to convert an XTPCalendarWeekDay
  458. //     enum value to a sequential week day number (from 1 to 7).
  459. // Parameters:
  460. //     nDayOfWeekMask - An int that contains the value from the enum
  461. //     XTPCalendarWeekDay.
  462. // Returns:
  463. //     An int that contains the sequential week day number.
  464. //     1-Sunday, 2-Monday, ...
  465. // See Also: GetDayOfWeekMask, enum XTPCalendarWeekDay
  466. //-----------------------------------------------------------------------
  467. static int AFX_CDECL GetDayOfWeekIndex(int nDayOfWeekMask);
  468. //-----------------------------------------------------------------------
  469. // Summary:
  470. //     This member function is used to count the bits in the specified
  471. //     bit mask.
  472. // Parameters:
  473. //     nDayOfWeekMask - An int that contains the mask from the enum
  474. //                      XTPCalendarWeekDay.
  475. // Returns:
  476. //     An int that contains the integer value of the day 0f the week
  477. //     contained in the bit mask.
  478. // See Also: GetDayOfWeekMask, enum XTPCalendarWeekDay
  479. //-----------------------------------------------------------------------
  480. static int AFX_CDECL GetDayOfWeekCount(int nDayOfWeekMask);
  481. //-----------------------------------------------------------------------
  482. // Summary:
  483. //     This member function is used to make the days mask from Monday
  484. //     until the specified day.
  485. // Parameters:
  486. //     nEndWDay - An int that contains the sequential week day number.
  487. //     1-Sunday, 2-Monday, ...
  488. // Returns:
  489. //     An int that contains the values set from the enum XTPCalendarWeekDay.
  490. // See Also: GetDayOfWeekIndex, enum XTPCalendarWeekDay
  491. //-----------------------------------------------------------------------
  492. static int AFX_CDECL MakeDaysOfWeekMask_Mo_(int nEndWDay);
  493. //-----------------------------------------------------------------------
  494. // Summary:
  495. //     This member function is used to shift the specified date to
  496. //     the begin of the week.
  497. // Parameters:
  498. //     dtDate               - A COleDateTime object that contains the value
  499. //                            to shift to the beginning of the week.
  500. //     nFirstDayOfWeekIndex - Index of the first day of week. Default value 1.
  501. //                            1-Sunday, 2-Monday, ...
  502. // Returns:
  503. //     A COleDateTime object that contains the date of the first day of week
  504. //     before the specified date.
  505. // See Also: COleDateTime overview
  506. //-----------------------------------------------------------------------
  507. static COleDateTime AFX_CDECL ShiftDateToWeekBegin(COleDateTime dtDate,
  508.  int nFirstDayOfWeekIndex = 1);
  509. //-----------------------------------------------------------------------
  510. // Summary:
  511. //     This member function is used to calculate a week number of year.
  512. // Parameters:
  513. //     dtDate               - A COleDateTime object that contains the date
  514. //                            to calculate the week of year.
  515. //     nFirstDayOfWeekIndex - Index of the first day of week. Default value 1.
  516. //                            1-Sunday, 2-Monday, ...
  517. // Returns:
  518. //     A week number of year for the specified date.
  519. // See Also: COleDateTime overview
  520. //-----------------------------------------------------------------------
  521. static int AFX_CDECL GetWeekOfYear(COleDateTime dtDate, int nFirstDayOfWeekIndex = 1);
  522. //-----------------------------------------------------------------------
  523. // Summary:
  524. //      The SystemTimeToTzSpecificLocalTime function converts a time in
  525. //      Coordinated Universal Time (UTC) to a specified time zone's
  526. //      corresponding local time.
  527. // Parameters:
  528. //      pTZI    - [in] Pointer to a TIME_ZONE_INFORMATION structure
  529. //                that specifies the time zone of interest.
  530. //      pUTime  - [in] Pointer to a SYSTEMTIME structure that specifies
  531. //                a UTC. The function converts this universal time to
  532. //                the specified time zone's corresponding local time.
  533. //      pTzTime - [out] Pointer to a SYSTEMTIME structure that receives
  534. //                the local time information.
  535. // Returns:
  536. //      If the function succeeds, the return value is nonzero,
  537. //      and the function sets the members of the SYSTEMTIME structure
  538. //      pointed to by pTzTime to the appropriate local time values.
  539. // See Also:
  540. //      SystemTimeToTzSpecificLocalTime() windows API function.
  541. //-----------------------------------------------------------------------
  542. static BOOL AFX_CDECL SystemTimeToTzSpecificLocalTime(const TIME_ZONE_INFORMATION* pTZI,
  543. const SYSTEMTIME* pUTime,
  544. SYSTEMTIME* pTzTime);
  545. //-----------------------------------------------------------------------
  546. // Summary:
  547. //      This function is used to determine that program running on
  548. //      Windows 9x operation system family.
  549. // Returns:
  550. //      TRUE for Windows 9x operation system, otherwise FALSE.
  551. //-----------------------------------------------------------------------
  552. static BOOL AFX_CDECL IsWin9x();
  553. //-----------------------------------------------------------------------
  554. // Summary:
  555. //      Converts a number of minutes to the corresponding COleDateTimeSpan
  556. //      object.
  557. // Parameters:
  558. //      nMinutes - A number of minutes in the time span.
  559. // Returns: Calculated COleDateTimeSpan object.
  560. //-----------------------------------------------------------------------
  561. static COleDateTimeSpan AFX_CDECL Minutes2Span(int nMinutes);
  562. //-----------------------------------------------------------------------
  563. // Summary:
  564. //      Returns current local time.
  565. // Returns:
  566. //      COleDateTime object with the calculated local time value.
  567. //-----------------------------------------------------------------------
  568. static COleDateTime AFX_CDECL GetCurrentTime();
  569. //-----------------------------------------------------------------------
  570. // Summary:
  571. //      Returns current time format string for hours and minutes.
  572. // Returns:
  573. //      A time format string like: 'HH:mm', 'hh:mm tt', 'h:m t', ...
  574. //-----------------------------------------------------------------------
  575. static CString AFX_CDECL GetTimeFormatString_HrMin();
  576. //-----------------------------------------------------------------------
  577. // Summary:
  578. //      Parse a time string like "18:20" or "7:15 pm" and returns time
  579. //      as total minutes. Active locale setting are used.
  580. // Parameters:
  581. //      pcszTime_HrMin  - time string like "18:20" or "7:15 pm"
  582. // Returns:
  583. //      Time as total minutes.
  584. //-----------------------------------------------------------------------
  585. static int AFX_CDECL ParceTimeString_min(LPCTSTR pcszTime_HrMin);
  586. //-----------------------------------------------------------------------
  587. // Summary:
  588. //      Format time duration like "3 minutes" or "1 week".
  589. //      Active locale setting are used.
  590. // Parameters:
  591. //      nMinutes - Duration in minutes
  592. //      bRoundly - If TRUE duration will be rounded to biggest scale,
  593. //                 like 65 minutes will be formatted as "1 hour".
  594. //                 If False duration will formatted exactly:
  595. //                 65 minutes as "65 minutes; 120 minutes as "2 hours".
  596. // Returns:
  597. //      Time duration as string like "5 minutes", "2 hours", "1 day", "3 weeks".
  598. //-----------------------------------------------------------------------
  599. static CString AFX_CDECL FormatTimeDuration(int nMinutes, BOOL bRoundly);
  600. //-----------------------------------------------------------------------
  601. // Summary:
  602. //      Parse a time duration string like "5 minutes", "2 hours", "1 day"
  603. //      or "3 weeks" and returns duration as total minutes.
  604. //      Active locale setting are used.
  605. // Parameters:
  606. //      pcszTimeDuration - time duration string like "5 minutes", "2 hours"
  607. // Returns:
  608. //      Time duration as total minutes.
  609. //-----------------------------------------------------------------------
  610. static int AFX_CDECL ParceTimeDuration_min(LPCTSTR pcszTimeDuration);
  611. //-----------------------------------------------------------------------
  612. // Summary:
  613. //      Loads string using XTPResourceManager.
  614. // Parameters:
  615. //      nIDResource - ID of the string in resource.
  616. // Returns:
  617. //      Loaded string or an empty string.
  618. //-----------------------------------------------------------------------
  619. static CString AFX_CDECL LoadString(UINT nIDResource);
  620. //-----------------------------------------------------------------------
  621. // Summary:
  622. //      Loads string using XTPResourceManager.
  623. // Parameters:
  624. //      nIDResource - ID of the string in resource.
  625. //      rstrString  - [out] Reference to CString object to load string to.
  626. // Remarks:
  627. //      If string with such ID is not present in the resource - rstrString
  628. //      is not changed.
  629. // Returns:
  630. //      TRUE if string loaded, FALSE otherwise.
  631. //-----------------------------------------------------------------------
  632. static BOOL AFX_CDECL LoadString2(CString& rstrString, UINT nIDResource);
  633. //-----------------------------------------------------------------------
  634. // Summary:
  635. //      Determine which locale is used active locale: current user locale
  636. //      or resource file locale.
  637. // Returns:
  638. //      TRUE if resource file locale is used active locale, FALSE otherwise.
  639. // See Also:
  640. //      SetUseResourceFileLocale, CXTPResourceManager::GetResourcesLangID,
  641. //      GetActiveLCID, LOCALE_USER_DEFAULT
  642. //-----------------------------------------------------------------------
  643. static BOOL AFX_CDECL IsUseResourceFileLocale();
  644. //-----------------------------------------------------------------------
  645. // Summary:
  646. //      Used to set which locale is used active locale: current user locale
  647. //      or resource file locale.
  648. // Parameters:
  649. //      bUseResourceFileLocale - If TRUE resource file locale will be used,
  650. //                               if FALSE current user locale will be used.
  651. // See Also:
  652. //      IsUseResourceFileLocale, CXTPResourceManager::GetResourcesLangID,
  653. //      GetActiveLCID, LOCALE_USER_DEFAULT
  654. //-----------------------------------------------------------------------
  655. static void AFX_CDECL SetUseResourceFileLocale(BOOL bUseResourceFileLocale);
  656. //-----------------------------------------------------------------------
  657. // Summary:
  658. //      Returns active locale ID (current user locale or resource file locale)
  659. // Returns:
  660. //      LOCALE_USER_DEFAULT or resource file locale ID.
  661. // See Also:
  662. //      IsUseResourceFileLocale, SetUseResourceFileLocale,
  663. //      CXTPResourceManager::GetResourcesLangID, LOCALE_USER_DEFAULT
  664. //-----------------------------------------------------------------------
  665. static LCID AFX_CDECL GetActiveLCID();
  666. //-----------------------------------------------------------------------
  667. // Summary:
  668. //      This function used to determine a font with maximum symbols height
  669. //      in an array of fonts.
  670. // Parameters:
  671. //      arFonts     - [in] A reference to array of fonts.
  672. //      pDC         - [in] A pointer to valid device context or NULL.
  673. //      pnMaxHeight - [out] A pointer to int variable to store maximum font
  674. //                          height or NULL.
  675. // Remarks:
  676. //      if pDC is not NULL - the font height in device logical units is used.
  677. //      Otherwise the LOGFONT.lfHeight member is used as font height.
  678. // Returns:
  679. //      A font from the provided array with maximum symbols height.
  680. //-----------------------------------------------------------------------
  681. static CFont* AFX_CDECL GetMaxHeightFont(CArray<CFont*, CFont*>& arFonts,
  682.  CDC* pDC, int* pnMaxHeight = NULL);
  683. private:
  684. static BOOL AFX_CDECL IsInDst(const TIME_ZONE_INFORMATION* pTZI, COleDateTime dtTime);
  685. struct CXTPTimesResourceIDs
  686. {
  687. typedef CMap<int, int, UINT, UINT> CMapInt2UINT;
  688. CMapInt2UINT s_mapMinutes;
  689. CMapInt2UINT s_mapHours;
  690. CMapInt2UINT s_mapDays;
  691. CMapInt2UINT s_mapWeeks;
  692. CXTPTimesResourceIDs();
  693. };
  694. static BOOL s_bUseResourceFileLocale;
  695. public:
  696. //-----------------------------------------------------------------------
  697. // Summary:
  698. //      This function used to round date time value by add (subtract)
  699. //      half-second double value.
  700. // Parameters:
  701. //      dblDT - [in] A date time value in COLEDateTime double representation.
  702. // Returns:
  703. //      Rounded date time value in COLEDateTime double representation.
  704. //-----------------------------------------------------------------------
  705. static double AFX_CDECL _RoundDateTime_dbl(double dblDT);
  706. //-----------------------------------------------------------------------
  707. // Summary:
  708. //      This function used to reset time part.
  709. // Parameters:
  710. //      dblDT - [in] A date time value in COLEDateTime double representation.
  711. // Returns:
  712. //      Date value (with zero time) in COLEDateTime double representation.
  713. //-----------------------------------------------------------------------
  714. static double AFX_CDECL _ResetTime_dbl(double dblDT);
  715. //-----------------------------------------------------------------------
  716. // Summary:
  717. //      This function used to reset date part.
  718. // Parameters:
  719. //      dblDT - [in] A date time value in COLEDateTime double representation.
  720. // Returns:
  721. //      Time value (with zero date) in COLEDateTime double representation.
  722. //-----------------------------------------------------------------------
  723. static double AFX_CDECL _ResetDate_dbl(double dblDT);
  724. };
  725. //===========================================================================
  726. //===========================================================================
  727. // Summary:
  728. //      Helper class template provides functionality to temporary set some
  729. //      to variable and reset to initial or other value on destroy.
  730. //      Can be useful to lock some data or actions via flags and unlock
  731. //      automatically.
  732. //===========================================================================
  733. template<class _TValue>
  734. class CXTPAutoResetValue
  735. {
  736. _TValue     m_valReset;
  737. _TValue&    m_rData;
  738. public:
  739. //-----------------------------------------------------------------------
  740. // Summary:
  741. //      Object constructor.
  742. // Parameters:
  743. //      rData - A reference to managing variable.
  744. // Remarks:
  745. //      The original value of rData is stored in separate member and it
  746. //      will be restored on destroy.
  747. //-----------------------------------------------------------------------
  748. CXTPAutoResetValue(_TValue& rData) :
  749. m_rData(rData)
  750. {
  751. m_valReset = rData;
  752. }
  753. //-----------------------------------------------------------------------
  754. // Summary:
  755. //      Object constructor.
  756. // Parameters:
  757. //      rData    - A reference to managing variable.
  758. //      valReset - A value to set when destroy.
  759. // Remarks:
  760. //      The original value of rData is ignored.
  761. //      valReset value will be used on destroy.
  762. //-----------------------------------------------------------------------
  763. CXTPAutoResetValue(_TValue& rData, const _TValue& valReset): m_rData(rData) {
  764. m_valReset = valReset;
  765. }
  766. //-----------------------------------------------------------------------
  767. // Summary:
  768. //      Object destructor.
  769. // Remarks:
  770. //      Managing variable value will be restored to the original one or to
  771. //      value specified as second constructor parameter.
  772. //-----------------------------------------------------------------------
  773. virtual ~CXTPAutoResetValue() {
  774. m_rData = m_valReset;
  775. }
  776. //-----------------------------------------------------------------------
  777. // Summary:
  778. //     This member operator is use to access managing variable.
  779. // Returns:
  780. //     Managing variable reference.
  781. //-----------------------------------------------------------------------
  782. operator _TValue&() {
  783. return m_rData;
  784. }
  785. //-----------------------------------------------------------------------
  786. // Summary:
  787. //     This member function overloads the assignment operator for the
  788. //     CXTPAutoResetValue class.
  789. // Parameters:
  790. //     rSrc - A new value.
  791. // Returns:
  792. //     A reference to this object.
  793. //-----------------------------------------------------------------------
  794. const _TValue& operator =(const _TValue& rSrc) {
  795. return m_rData = rSrc;
  796. }
  797. };
  798. /////////////////////////////////////////////////////////////////////////////
  799. AFX_INLINE double CXTPCalendarUtils::_RoundDateTime_dbl(double dblDT)
  800. {
  801. return (dblDT >= 0 ? dblDT + XTP_HALF_SECOND : dblDT - XTP_HALF_SECOND);
  802. }
  803. AFX_INLINE double CXTPCalendarUtils::_ResetTime_dbl(double dblDT)
  804. {
  805. return (double)((LONGLONG)_RoundDateTime_dbl(dblDT));
  806. }
  807. AFX_INLINE double CXTPCalendarUtils::_ResetDate_dbl(double dblDT)
  808. {
  809. double dblDate = _ResetTime_dbl(dblDT);
  810. double dblResult = dblDT > dblDate ? (dblDT - dblDate) : (dblDate - dblDT);
  811. double dblDate_raw = (double)((LONGLONG)dblDT);
  812. if (dblDate_raw != dblDate)
  813. {
  814. dblResult = _RoundDateTime_dbl(dblResult);
  815. }
  816. return dblResult;
  817. }
  818. AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetTime(const COleDateTime& dtDateTime)
  819. {
  820. return (DATE)_ResetTime_dbl((double)dtDateTime);
  821. }
  822. AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetTime(const DATE dtDateTime)
  823. {
  824. return (DATE)_ResetTime_dbl((double)dtDateTime);
  825. }
  826. AFX_INLINE const COleDateTime CXTPCalendarUtils::ResetDate(const COleDateTime& dtDateTime)
  827. {
  828. return (DATE)_ResetDate_dbl((double)dtDateTime);
  829. }
  830. AFX_INLINE const COleDateTime CXTPCalendarUtils::SetTime_235959(const COleDateTime& dtDateTime)
  831. {
  832. double dDate = _ResetTime_dbl((double)dtDateTime);
  833. return (DATE)(dDate + 1 - XTP_HALF_SECOND * 2);
  834. }
  835. AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekMask(int nWeekDay) {
  836. ASSERT(nWeekDay >= 1 && nWeekDay <= 7);
  837. int nRes = 1 << (nWeekDay-1);
  838. return nRes;
  839. }
  840. //return 1 = Sunday, 2 = Monday ...
  841. AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekIndex(int nDayOfWeekMask) {
  842. for (int i = 1; i <= 7; i++)
  843. {
  844. int nTestMask = 1 << (i-1);
  845. if (nTestMask == nDayOfWeekMask){
  846. return i;
  847. }
  848. }
  849. ASSERT(FALSE);
  850. return 0;
  851. }
  852. AFX_INLINE int CXTPCalendarUtils::GetMaxMonthDay(COleDateTime dtDate)
  853. {
  854. SYSTEMTIME sysDate;
  855. if (!GETASSYSTEMTIME_DT(dtDate, sysDate))
  856. return 0;
  857. // days per month  -     _  jan feb mar apr may jun   jul aug sep oct nov dec
  858. static int arDays[13] = {0, 31, 28, 31, 30, 31, 30,   31, 31, 30, 31, 30, 31};
  859. if (sysDate.wMonth == 2 && 0 == (sysDate.wYear % 4))
  860. {
  861. return 29;
  862. }
  863. else
  864. {
  865. return arDays[sysDate.wMonth];
  866. }
  867. }
  868. AFX_INLINE BOOL CXTPCalendarUtils::UpdateMonthDay(COleDateTime &refDate, int nMonthDay)
  869. {
  870. if (nMonthDay > 28)
  871. {
  872. int nMaxDay = GetMaxMonthDay(refDate);
  873. if (!nMaxDay)
  874. {
  875. return FALSE;
  876. }
  877. nMonthDay = min(nMonthDay, nMaxDay);
  878. }
  879. SYSTEMTIME sysDate;
  880. if (!GETASSYSTEMTIME_DT(refDate, sysDate))
  881. return FALSE;
  882. int nRes = refDate.SetDate(sysDate.wYear, sysDate.wMonth, nMonthDay);
  883. return nRes == 0;
  884. }
  885. AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Month(COleDateTime &refDate, int nMonthCount)
  886. {
  887. SYSTEMTIME sysDate;
  888. if (!GETASSYSTEMTIME_DT(refDate, sysDate))
  889. return FALSE;
  890. int nYearNew = sysDate.wYear + nMonthCount / 12;
  891. int nMonthNew = sysDate.wMonth + nMonthCount % 12;
  892. if (nMonthNew > 12)
  893. {
  894. nMonthNew -= 12 * (nMonthCount / abs(nMonthCount));
  895. nYearNew++;
  896. }
  897. else if (nMonthNew <= 0)
  898. {
  899. nYearNew--;
  900. nMonthNew += 12;
  901. ASSERT(nMonthNew >= 1 && nMonthNew <= 12);
  902. }
  903. return COleDateTime::valid == refDate.SetDate(nYearNew, nMonthNew, 1);
  904. }
  905. AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Month(COleDateTime &refDate, int nMonthCount, int nMonthDay)
  906. {
  907. if (ShiftDate_Month(refDate, nMonthCount))
  908. {
  909. BOOL bRes = UpdateMonthDay(refDate, nMonthDay);
  910. return bRes;
  911. }
  912. return FALSE;
  913. }
  914. AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Year(COleDateTime &refDate, int nYearCount)
  915. {
  916. SYSTEMTIME sysDate;
  917. if (!GETASSYSTEMTIME_DT(refDate, sysDate))
  918. {
  919. return FALSE;
  920. }
  921. int nYearNew = sysDate.wYear + nYearCount;
  922. return COleDateTime::valid == refDate.SetDate(nYearNew, sysDate.wMonth, 1);
  923. }
  924. AFX_INLINE BOOL CXTPCalendarUtils::ShiftDate_Year(COleDateTime &refDate, int nYearCount, int nMonthDay)
  925. {
  926. if (ShiftDate_Year(refDate, nYearCount))
  927. {
  928. BOOL bRes = UpdateMonthDay(refDate, nMonthDay);
  929. return bRes;
  930. }
  931. return FALSE;
  932. }
  933. AFX_INLINE int CXTPCalendarUtils::GetDiff_Months(const COleDateTime& dt1, const COleDateTime& dt2)
  934. {
  935. int nYear1 = dt1.GetYear();
  936. int nMonth1 = dt1.GetMonth();
  937. int nYear2 = dt2.GetYear();
  938. int nMonth2 = dt2.GetMonth();
  939. int nYearDiff = nYear1 - nYear2;
  940. int nMonthDiff = nYearDiff * 12;
  941. nMonthDiff += nMonth1 - nMonth2;
  942. return nMonthDiff;
  943. }
  944. AFX_INLINE int CXTPCalendarUtils::GetDurationMinutes(const COleDateTime& dtStart, const COleDateTime& dtEnd, BOOL bAllDayEvent)
  945. {
  946. COleDateTimeSpan spDuration;
  947. if (bAllDayEvent)
  948. {
  949. spDuration = SetTime_235959(dtEnd) - ResetTime(dtStart);
  950. }
  951. else
  952. {
  953. spDuration = dtEnd - dtStart;
  954. }
  955. return (int)GETTOTAL_MINUTES_DTS(spDuration);
  956. }
  957. AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateTime(const COleDateTime& dtDate, int nHour, int nMinutes, int nSeconds)
  958. {
  959. SYSTEMTIME stResult;
  960. if (!GETASSYSTEMTIME_DT(dtDate, stResult))
  961. {
  962. ASSERT(FALSE);
  963. return dtDate;
  964. }
  965. stResult.wHour   = (WORD)nHour;
  966. stResult.wMinute = (WORD)nMinutes;
  967. stResult.wSecond = (WORD)nSeconds;
  968. return COleDateTime(stResult);
  969. }
  970. AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateTime(const COleDateTime& dtDate, const COleDateTime& dtTime)
  971. {
  972. double dDate = _ResetTime_dbl((double)dtDate);
  973. double dTime = _ResetDate_dbl((double)dtTime);
  974. return (DATE)(dDate + dTime);
  975. }
  976. AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateDate(const COleDateTime& dtTime, int nYear, int nMonth, int nDay)
  977. {
  978. SYSTEMTIME stResult;
  979. if (!GETASSYSTEMTIME_DT(dtTime, stResult))
  980. {
  981. ASSERT(FALSE);
  982. return dtTime;
  983. }
  984. stResult.wYear  = (WORD)nYear;
  985. stResult.wMonth = (WORD)nMonth;
  986. stResult.wDay   = (WORD)nDay;
  987. return COleDateTime(stResult);
  988. }
  989. AFX_INLINE const COleDateTime CXTPCalendarUtils::UpdateDate(const COleDateTime& dtTime, const COleDateTime& dtDate)
  990. {
  991. double dDate = _ResetTime_dbl((double)dtDate);
  992. double dTime = _ResetDate_dbl((double)dtTime);
  993. return (DATE)(dDate + dTime);
  994. }
  995. AFX_INLINE BOOL CXTPCalendarUtils::IsZeroTime(const COleDateTime& dtDateTime)
  996. {
  997. double dTime = _ResetDate_dbl((double)dtDateTime);
  998. return fabs(dTime) < XTP_HALF_SECOND;
  999. }
  1000. AFX_INLINE BOOL CXTPCalendarUtils::IsEqual(const COleDateTime& dt1, const COleDateTime& dt2, BOOL bOneSecTimeDiff)
  1001. {
  1002. double dTimeDiff = bOneSecTimeDiff ? XTP_HALF_SECOND * 2 : XTP_HALF_SECOND;
  1003. return dTimeDiff >= fabs(dt1 - dt2);
  1004. }
  1005. AFX_INLINE COleDateTime CXTPCalendarUtils::RetriveEventEndDate(const COleDateTime& dtStart, const COleDateTime& dtEnd)
  1006. {
  1007. COleDateTime dtEndDay = ResetTime(dtEnd);
  1008. if (IsZeroTime(dtEnd))
  1009. {
  1010. COleDateTime dtStartDay = ResetTime(dtStart);
  1011. if (dtStartDay < dtEndDay)
  1012. {
  1013. const COleDateTimeSpan spDay(1, 0, 0, 0);
  1014. dtEndDay -= spDay;
  1015. }
  1016. }
  1017. return dtEndDay;
  1018. }
  1019. AFX_INLINE int CXTPCalendarUtils::GetEventPeriodDays(const COleDateTime& dtStart, const COleDateTime& dtEnd)
  1020. {
  1021. COleDateTime dtStartDay = ResetTime(dtStart);
  1022. COleDateTime dtEndDay = RetriveEventEndDate(dtStart, dtEnd);
  1023. COleDateTimeSpan spDuration = dtEndDay - dtStartDay;
  1024. int nDays = (int)GETTOTAL_DAYS_DTS(spDuration) + 1;
  1025. return nDays;
  1026. }
  1027. AFX_INLINE COleDateTimeSpan CXTPCalendarUtils::Minutes2Span(int nMunutes)
  1028. {
  1029. double dblSpan =  ((double)nMunutes) / (24 * 60);
  1030. return COleDateTimeSpan(dblSpan);
  1031. }
  1032. AFX_INLINE COleDateTime CXTPCalendarUtils::ShiftDateToWeekBegin(COleDateTime dtDate, int nFirstDayOfWeekIndex)
  1033. {
  1034. dtDate = CXTPCalendarUtils::ResetTime(dtDate);
  1035. int nShift = (dtDate.GetDayOfWeek() - nFirstDayOfWeekIndex + 7) % 7;
  1036. if (nShift)
  1037. {
  1038. COleDateTimeSpan spShift(nShift, 0, 0, 0);
  1039. dtDate -= spShift;
  1040. }
  1041. return dtDate;
  1042. }
  1043. AFX_INLINE int CXTPCalendarUtils::GetDayOfWeekCount(int nDayOfWeekMask)
  1044. {
  1045. int nCount = 0;
  1046. for (int i = 1; i <= 7; i++)
  1047. {
  1048. int nTestMask = 1 << (i-1);
  1049. if (nTestMask & nDayOfWeekMask)
  1050. {
  1051. nCount++;
  1052. }
  1053. }
  1054. return nCount;
  1055. }
  1056. AFX_INLINE int CXTPCalendarUtils::MakeDaysOfWeekMask_Mo_(int nEndWDay)
  1057. {
  1058. int nMask = 0;
  1059. for (int i = 1; i < nEndWDay; i++)
  1060. {
  1061. int nWDMask = CXTPCalendarUtils::GetDayOfWeekMask(i);
  1062. nMask |= nWDMask;
  1063. }
  1064. return nMask;
  1065. }
  1066. /////////////////////////////////////////////////////////////////////////////
  1067. #endif // !defined(__XTPCALENDARUTILS_H_)