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

对话框与窗口

开发平台:

Visual C++

  1. // XTPDatePickerDaysCollection.cpp: implementation of the CXTPDatePickerDaysCollection 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. #include "stdafx.h"
  21. #include "XTPDatePickerDaysCollection.h"
  22. #include "XTPDatePickerItemDay.h"
  23. #include "XTPDatePickerItemMonth.h"
  24. #include "XTPDatePickerControl.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CXTPDatePickerDaysCollection
  32. CXTPDatePickerDaysCollection::CXTPDatePickerDaysCollection(CXTPDatePickerControl* pControl)
  33. : m_pControl(pControl)
  34. {
  35. }
  36. CXTPDatePickerDaysCollection::~CXTPDatePickerDaysCollection()
  37. {
  38. }
  39. void CXTPDatePickerDaysCollection::_InsertBlock(int nIndexInsert, long nDateBegin, long nDateEnd)
  40. {
  41. SELECTED_BLOCK block;
  42. block.nDateBegin = nDateBegin;
  43. block.nDateEnd = nDateEnd;
  44. m_arrSelectedBlocks.InsertAt(nIndexInsert, block);
  45. }
  46. void CXTPDatePickerDaysCollection::AddBlock(long nBegin, long nEnd)
  47. {
  48. int i = 0;
  49. int nCount = (int)m_arrSelectedBlocks.GetSize();
  50. if (nCount > 0)
  51. {
  52. long& nDateEnd = m_arrSelectedBlocks[nCount - 1].nDateEnd;
  53. if (nDateEnd == nBegin)
  54. {
  55. nDateEnd = nEnd + 1;
  56. m_pControl->_RedrawControl(FALSE);
  57. return;
  58. }
  59. if (nDateEnd < nBegin)
  60. {
  61. i = nCount;
  62. }
  63. }
  64. for (; i < nCount; i++)
  65. {
  66. long& nDateBegin = m_arrSelectedBlocks[i].nDateBegin;
  67. long& nDateEnd = m_arrSelectedBlocks[i].nDateEnd;
  68. if ((nDateBegin <= nBegin) && (nDateEnd > nEnd))
  69. {
  70. return;
  71. }
  72. if (nDateEnd == nBegin)
  73. {
  74. nDateEnd = nEnd + 1;
  75. if (i + 1 < nCount && m_arrSelectedBlocks[i + 1].nDateBegin == nDateEnd)
  76. {
  77. nDateEnd = m_arrSelectedBlocks[i + 1].nDateEnd;
  78. m_arrSelectedBlocks.RemoveAt(i + 1);
  79. }
  80. m_pControl->_RedrawControl(FALSE);
  81. return;
  82. }
  83. if (nDateBegin == nEnd + 1)
  84. {
  85. nDateBegin = nBegin;
  86. m_pControl->_RedrawControl(FALSE);
  87. return;
  88. }
  89. if (nDateBegin > nEnd)
  90. break;
  91. }
  92. _InsertBlock(i, nBegin, nEnd + 1);
  93. m_pControl->_RedrawControl(FALSE);
  94. }
  95. void CXTPDatePickerDaysCollection::Clear()
  96. {
  97. m_arrSelectedBlocks.RemoveAll();
  98. }
  99. void CXTPDatePickerDaysCollection::Add(const COleDateTime& dtDay)
  100. {
  101. AddBlock((long)dtDay, (long)dtDay);
  102. }
  103. void CXTPDatePickerDaysCollection::Remove(const COleDateTime& dtDay)
  104. {
  105. long nDate = (long)dtDay;
  106. for (int i = 0; i < (int)m_arrSelectedBlocks.GetSize(); i++)
  107. {
  108. long nDateBegin = m_arrSelectedBlocks[i].nDateBegin;
  109. long nDateEnd = m_arrSelectedBlocks[i].nDateEnd;
  110. if ((nDateBegin <= nDate) && (nDateEnd > nDate))
  111. {
  112. if (nDateBegin != nDate)
  113. {
  114. _InsertBlock(i, nDateBegin, nDate);
  115. i++;
  116. }
  117. if (nDateEnd - 1 != nDate)
  118. {
  119. _InsertBlock(i + 1, nDate + 1, nDateEnd);
  120. }
  121. m_arrSelectedBlocks.RemoveAt(i);
  122. return;
  123. }
  124. }
  125. }
  126. void CXTPDatePickerDaysCollection::Select(const COleDateTime& dtDay)
  127. {
  128. long nDate = (long)dtDay;
  129. if (m_arrSelectedBlocks.GetSize() == 1 && m_arrSelectedBlocks[0].nDateBegin ==
  130. m_arrSelectedBlocks[0].nDateEnd - 1 && m_arrSelectedBlocks[0].nDateBegin == nDate)
  131. {
  132. }
  133. else
  134. {
  135. Clear();
  136. Add(dtDay);
  137. }
  138. }
  139. void CXTPDatePickerDaysCollection::SelectRange(const COleDateTime& dtDayBegin, const COleDateTime& dtDayEnd)
  140. {
  141. long nBeginDate = (long)dtDayBegin;
  142. long nEndDate = (long)dtDayEnd;
  143. if (nBeginDate > nEndDate)
  144. {
  145. long nBlockBegin = nBeginDate;
  146. nBeginDate = nEndDate;
  147. nEndDate = nBlockBegin;
  148. }
  149. if (m_arrSelectedBlocks.GetSize() == 1 && m_arrSelectedBlocks[0].nDateBegin == nBeginDate &&
  150. m_arrSelectedBlocks[0].nDateEnd == nEndDate + 1)
  151. {
  152. return;
  153. }
  154. Clear();
  155. _InsertBlock(0, nBeginDate, nEndDate + 1);
  156. }
  157. BOOL CXTPDatePickerDaysCollection::Contains(const COleDateTime& dtDay) const
  158. {
  159. long nDay = (long)dtDay;
  160. int nCount = (int)m_arrSelectedBlocks.GetSize();
  161. if (nCount == 0)
  162. return FALSE;
  163. if (m_arrSelectedBlocks[0].nDateBegin > nDay)
  164. return FALSE;
  165. if (m_arrSelectedBlocks[nCount - 1].nDateEnd <= nDay)
  166. return FALSE;
  167. for (int i = 0; i < nCount; i++)
  168. {
  169. if ((m_arrSelectedBlocks[i].nDateBegin <= nDay) &&
  170. (m_arrSelectedBlocks[i].nDateEnd > nDay))
  171. {
  172. return TRUE;
  173. }
  174. }
  175. return FALSE;
  176. }
  177. BOOL CXTPDatePickerDaysCollection::GetMinMaxRange(COleDateTime& refMinRange, COleDateTime& refMaxRange) const
  178. {
  179. int nSelCount = (int)m_arrSelectedBlocks.GetSize();
  180. if (nSelCount == 0)
  181. return FALSE;
  182. refMinRange = (DATE)(double)m_arrSelectedBlocks[0].nDateBegin;
  183. refMaxRange = (DATE)(double)m_arrSelectedBlocks[nSelCount - 1].nDateEnd - 1;
  184. return TRUE;
  185. }
  186. int CXTPDatePickerDaysCollection::GetSelectedDaysCount()
  187. {
  188. int nCount = 0;
  189. for (int i = 0; i < (int)m_arrSelectedBlocks.GetSize(); i++)
  190. {
  191. nCount += m_arrSelectedBlocks[i].nDateEnd - m_arrSelectedBlocks[i].nDateBegin;
  192. }
  193. return nCount;
  194. }