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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarEvents.cpp: implementation of the CXTPCalendarEvents 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 "XTPCalendarEvent.h"
  22. #include "XTPCalendarEvents.h"
  23. #include "XTPCalendarRecurrencePattern.h"
  24. #include "XTPCalendarUtils.h"
  25. #include "XTPCalendarData.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. IMPLEMENT_DYNAMIC(CXTPCalendarEvents, CCmdTarget)
  32. CXTPCalendarEvents::CXTPCalendarEvents()
  33. {
  34. }
  35. CXTPCalendarEvents::~CXTPCalendarEvents()
  36. {
  37. RemoveAll();
  38. }
  39. ////////////////////////////////////////////////////////////////////////////
  40. CXTPCalendarEvent* CXTPCalendarEvents::GetAt(int nIndex, BOOL bWithAddRef) const
  41. {
  42. CXTPCalendarEvent* pEvent = m_arEvents[nIndex];
  43. if (bWithAddRef && pEvent)
  44. {
  45. pEvent->InternalAddRef();
  46. }
  47. return pEvent;
  48. }
  49. void CXTPCalendarEvents::SetAt(int nIndex, CXTPCalendarEvent* pEvent, BOOL bWithAddRef)
  50. {
  51. if (bWithAddRef && pEvent)
  52. {
  53. pEvent->InternalAddRef();
  54. }
  55. CXTPCalendarEvent* pPrevEvent = m_arEvents[nIndex];
  56. if (pPrevEvent)
  57. {
  58. pPrevEvent->InternalRelease();
  59. }
  60. m_arEvents[nIndex] = pEvent;
  61. }
  62. void CXTPCalendarEvents::InsertAt(int nIndex, CXTPCalendarEvent* pEvent, BOOL bWithAddRef)
  63. {
  64. if (bWithAddRef && pEvent)
  65. {
  66. pEvent->InternalAddRef();
  67. }
  68. m_arEvents.InsertAt(nIndex, pEvent);
  69. }
  70. void CXTPCalendarEvents::Add(CXTPCalendarEvent* pNewEvent, BOOL bWithAddRef)
  71. {
  72. if (bWithAddRef && pNewEvent)
  73. {
  74. pNewEvent->InternalAddRef();
  75. }
  76. m_arEvents.Add(pNewEvent);
  77. }
  78. void CXTPCalendarEvents::Append(CXTPCalendarEvents* pEventsArray)
  79. {
  80. if (!pEventsArray)
  81. {
  82. ASSERT(FALSE);
  83. return;
  84. }
  85. int nCount = pEventsArray->GetCount();
  86. for (int nEvent = 0; nEvent < nCount; nEvent++)
  87. {
  88. CXTPCalendarEvent* pEvent = pEventsArray->GetAt(nEvent, FALSE);
  89. Add(pEvent, TRUE);
  90. }
  91. }
  92. void CXTPCalendarEvents::RemoveAt(int nIndex)
  93. {
  94. CXTPCalendarEvent* pEvent = GetAt(nIndex, FALSE);
  95. m_arEvents.RemoveAt(nIndex);
  96. if (pEvent)
  97. {
  98. pEvent->InternalRelease();
  99. }
  100. }
  101.  void CXTPCalendarEvents::RemoveAll()
  102.  {
  103. // cleanup
  104. int nCount = GetCount();
  105. for (int nEvent = 0; nEvent < nCount; nEvent++)
  106. {
  107. CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
  108. if (pEvent)
  109. {
  110. pEvent->InternalRelease();
  111. }
  112. }
  113. m_arEvents.RemoveAll();
  114. }
  115. int CXTPCalendarEvents::Find(DWORD dwEventID) const
  116. {
  117. int nCount = GetCount();
  118. for (int nEvent = 0; nEvent < nCount; nEvent++)
  119. {
  120. CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
  121. DWORD dwID = pEvent->GetEventID();
  122. if (dwID == dwEventID)
  123. {
  124. return nEvent;
  125. }
  126. }
  127. return -1;
  128. }
  129. CXTPCalendarEvent* CXTPCalendarEvents::FindEvent(DWORD dwEventID) const
  130. {
  131. CXTPCalendarEvent* pFEvent = NULL;
  132. int nFIndex = Find(dwEventID);
  133. if (nFIndex >= 0)
  134. {
  135. pFEvent = GetAt(nFIndex, FALSE);
  136. }
  137. return pFEvent;
  138. }
  139. int CXTPCalendarEvents::Find(CXTPCalendarEvent* pFEvent) const
  140. {
  141. int nCount = GetCount();
  142. for (int nEvent = 0; nEvent < nCount; nEvent++)
  143. {
  144. CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
  145. if (pEvent && pEvent->IsEqualIDs(pFEvent))
  146. {
  147. return nEvent;
  148. }
  149. }
  150. return -1;
  151. }
  152. CXTPCalendarEvent* CXTPCalendarEvents::FindEvent(CXTPCalendarEvent* pFEvent) const
  153. {
  154. CXTPCalendarEvent* pFindedEvent = NULL;
  155. int nFIndex = Find(pFEvent);
  156. if (nFIndex >= 0)
  157. {
  158. pFindedEvent = GetAt(nFIndex, FALSE);
  159. }
  160. return pFindedEvent;
  161. }
  162. void CXTPCalendarEvents::Sort(T_CompareFunc pCompareFunc)
  163. {
  164. typedef int (_cdecl *GENERICCOMPAREFUNC)(const void *, const void*);
  165. qsort(m_arEvents.GetData(), (size_t)m_arEvents.GetSize(), sizeof(CXTPCalendarEvent*), (GENERICCOMPAREFUNC)pCompareFunc);
  166. }
  167. int _cdecl CXTPCalendarEvents::CompareEvents_ForView(const CXTPCalendarEvent** ppEv1, const CXTPCalendarEvent** ppEv2)
  168. {
  169. if (*ppEv1 == NULL || *ppEv2 == NULL)
  170. {
  171. ASSERT(FALSE);
  172. return XTPCompare(*ppEv1, *ppEv2);
  173. }
  174. int nPeriodDays1 = (*ppEv1)->GetEventPeriodDays();
  175. int nPeriodDays2 = (*ppEv2)->GetEventPeriodDays();
  176. int nAllDayEvent1 = (*ppEv1)->IsAllDayEvent() ? 1 : 0;
  177. int nAllDayEvent2 = (*ppEv2)->IsAllDayEvent() ? 1 : 0;
  178. BOOL bIsMultidayEvent = (nAllDayEvent1 && nAllDayEvent2 || nPeriodDays1 > 1 && nPeriodDays2 > 1);
  179. int nCmp = 0;
  180. //---------------------------------------------------------------------------
  181. if (bIsMultidayEvent)
  182. {
  183. nCmp = XTPCompare((*ppEv1)->GetStartTime(), (*ppEv2)->GetStartTime());
  184. if (nCmp)
  185. {
  186. return nCmp;
  187. }
  188. }
  189. //---------------------------------------------------------------------------
  190. nCmp = XTPCompare(nPeriodDays2, nPeriodDays1);
  191. if (nCmp)
  192. {
  193. return nCmp;
  194. }
  195. nCmp = XTPCompare(nAllDayEvent2, nAllDayEvent1);
  196. if (nCmp)
  197. {
  198. return nCmp;
  199. }
  200. if (!bIsMultidayEvent)
  201. {
  202. nCmp = XTPCompare((*ppEv1)->GetStartTime(), (*ppEv2)->GetStartTime());
  203. if (nCmp)
  204. {
  205. return nCmp;
  206. }
  207. }
  208. nCmp = XTPCompare((*ppEv1)->GetDurationMinutes(), (*ppEv2)->GetDurationMinutes());
  209. if (nCmp)
  210. {
  211. return -nCmp;
  212. }
  213. //-----------------------------------------------------
  214. nCmp = XTPCompare((*ppEv1)->GetSubject(), (*ppEv2)->GetSubject());
  215. if (nCmp)
  216. {
  217. return nCmp;
  218. }
  219. //-----------------------------------------------------
  220. nCmp = CompareEvents_ByID(ppEv1, ppEv2);
  221. return nCmp;
  222. }
  223. int _cdecl CXTPCalendarEvents::CompareEvents_ByID(const CXTPCalendarEvent** ppEv1, const CXTPCalendarEvent** ppEv2)
  224. {
  225. if (*ppEv1 == NULL || *ppEv2 == NULL)
  226. {
  227. ASSERT(FALSE);
  228. return XTPCompare(*ppEv1, *ppEv2);
  229. }
  230. //-----------------------------------------------------
  231. DWORD dwID1 = (*ppEv1)->GetEventID();
  232. DWORD dwID2 = (*ppEv2)->GetEventID();
  233. int nCmp = XTPCompare(dwID1, dwID2);
  234. return nCmp;
  235. }
  236. void CXTPCalendarEvents::CloneEvents()
  237. {
  238. int nCount = GetCount();
  239. for (int i = 0; i < nCount; i++)
  240. {
  241. CXTPCalendarEvent* pEvOrig = GetAt(i, FALSE);
  242. CXTPCalendarEventPtr ptrEvClone = pEvOrig ? pEvOrig->CloneEvent() : NULL;
  243. if (ptrEvClone)
  244. {
  245. SetAt(i, ptrEvClone);
  246. }
  247. else
  248. {
  249. RemoveAt(i);
  250. }
  251. }
  252. }
  253. /////////////////////////////////////////////////////////////////////////////