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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarMemoryDataProvider.h: interface for the CXTPCalendarMemoryDataProvider 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(_XTPCALENDARMEMORYDATAPROVIDER_H__)
  22. #define _XTPCALENDARMEMORYDATAPROVIDER_H__
  23. #if _MSC_VER > 1000
  24. #pragma once
  25. #endif // _MSC_VER > 1000
  26. //}}AFX_CODEJOCK_PRIVATE
  27. #include "XTPCalendarData.h"
  28. /////////////////////////////////////////////////////////////////////////////
  29. class CXTPCalendarEvent;
  30. class CXTPCalendarRecurrencePattern;
  31. //===========================================================================
  32. // Summary:
  33. //     Define events storage hash table size. Should be a prime number!
  34. //     like: 503, 1021, 1511, 2003, 3001, 4001, 5003, 6007, 8009, 12007,
  35. //     16001, 32003, 48017, 64007
  36. // See Also: CXTPCalendarData::EventsMapByID_T overview, CMap overview
  37. //===========================================================================
  38. #define XTP_EVENTS_STORAGE_HASH_TABLE_SIZE 4001
  39. //===========================================================================
  40. // Summary:
  41. //     This class implements an abstract representation of the data used
  42. //     in the XTPCalendarData class.
  43. // Remarks:
  44. //     This class is the implementation of the XTPCalendarData abstract
  45. //     class which represents a data portion of the Calendar control.
  46. //
  47. //          This class provides a memory storage implementation of the
  48. //          CXTPCalendarData class. It stores all elements using standard
  49. //          CXTPCalendarEvents array collection and provides fast search
  50. //          on it using search tree algorithms.
  51. //
  52. //          To use CXTPCalendarMemoryDataProvider you first construct an instance
  53. //          of CXTPCalendarDatabaseDataProvider object then use Open() member function
  54. //          to establish connection to the data source and initialize the object.
  55. //          Class provides a number of functions to manipulate events and events
  56. //          related data. After finishing working with data source you should call
  57. //          Close() member function to close connection, de-initialize the object
  58. //          and free unused resources.
  59. // See Also: CXTPCalendarData overview, CXTPCalendarEvents, CXTPCalendarEvent
  60. //===========================================================================
  61. class _XTP_EXT_CLASS CXTPCalendarMemoryDataProvider : public CXTPCalendarData
  62. {
  63. //{{AFX_CODEJOCK_PRIVATE
  64. DECLARE_DYNAMIC(CXTPCalendarMemoryDataProvider)
  65. //}}AFX_CODEJOCK_PRIVATE
  66. public:
  67. //-----------------------------------------------------------------------
  68. // Summary:
  69. //     Default constructor.
  70. // Remarks:
  71. //     Constructs a Data object. To establish a connection to a
  72. //     specified data source and initialize the object you must
  73. //     call Open() member function immediately after construction.
  74. // See Also: Open()
  75. //-----------------------------------------------------------------------
  76. CXTPCalendarMemoryDataProvider();
  77. //-----------------------------------------------------------------------
  78. // Summary:
  79. //     Default Destructor.
  80. // Remarks:
  81. //     Handles all deallocation.
  82. //-----------------------------------------------------------------------
  83. virtual ~CXTPCalendarMemoryDataProvider();
  84. //-----------------------------------------------------------------------
  85. // Summary:
  86. //     Call this member function to initialize a newly constructed
  87. //     Data object. Your data object must be created before you
  88. //     can call Open().
  89. // Returns:
  90. //     Boolean value represents succsess/failure result
  91. //-----------------------------------------------------------------------
  92. virtual BOOL Open();
  93. //-----------------------------------------------------------------------
  94. // Summary:
  95. //     Call this member function to create a file for storing memory
  96. //     data provider data.
  97. // Remarks:
  98. //     It will be opened by default.
  99. // Returns:
  100. //     TRUE is successful. FALSE otherwise.
  101. //-----------------------------------------------------------------------
  102. virtual BOOL Create();
  103. //-----------------------------------------------------------------------
  104. // Summary:
  105. //     This method saves data to the file.
  106. // Remarks:
  107. //     The most recent data from the data provider will be saved in
  108. //     the same file as before.
  109. // Returns:
  110. //     TRUE is successful. FALSE otherwise.
  111. //-----------------------------------------------------------------------
  112. virtual BOOL Save();
  113. //-----------------------------------------------------------------------
  114. // Summary:
  115. //     Call this member function to close the connection to a data source.
  116. //-----------------------------------------------------------------------
  117. virtual void Close();
  118. //-----------------------------------------------------------------------
  119. // Summary:
  120. //     Call this member function to get a collection of events for the specified date range.
  121. // Parameters:
  122. //     dtStartDay - A COleDateTime object without the time portion.
  123. //     dtEndDay - A COleDateTime object without the time portion.
  124. // Returns:
  125. //     A CXTPCalendarEvents pointer containing a collection of day events.
  126. // See Also: CXTPCalendarEvents
  127. //-----------------------------------------------------------------------
  128. virtual CXTPCalendarEventsPtr RetrieveEvents(COleDateTime dtStartDay, COleDateTime dtEndDay);
  129. //-----------------------------------------------------------------------
  130. // Summary:
  131. //     This method reads or writes data from or to an archive.
  132. // Parameters:
  133. //     ar - A CArchive object to serialize to or from.
  134. // Remarks:
  135. //     For the save case the most recent data from the data provider
  136. //     will be saved to archive.
  137. //     For the load case existing data is not removed from the data
  138. //     provider and a new data will be loaded from the specified
  139. //     archive and added to the existing data set.
  140. //     Call RemoveAllEvents() manually if you need a cleanup before load.
  141. //     For load and save operations _Load() and _Save() protected methods are used.
  142. //     Method can throw CArchiveException.
  143. // See Also: _Load(), _Save()
  144. //-----------------------------------------------------------------------
  145. virtual void Serialize(CArchive& ar);
  146. //-----------------------------------------------------------------------
  147. // Summary:
  148. //     This method reads or writes data from or to an storage.
  149. // Parameters:
  150. //     pPX - A CXTPPropExchange object to serialize to or from.
  151. // Remarks:
  152. //     For the save case the most recent data from the data provider
  153. //     will be saved to archive.
  154. //     For the load case existing data is not removed from the data
  155. //     provider and a new data will be loaded from the specified
  156. //     archive and added to the existing data set.
  157. //     Call RemoveAllEvents() manually if you need a cleanup before load.
  158. //     For load and save operations _Load() and _Save() protected methods are used.
  159. //     Method can throw CArchiveException.
  160. // See Also: _Load(), _Save()
  161. //-----------------------------------------------------------------------
  162. virtual void DoPropExchange(CXTPPropExchange* pPX);
  163. protected:
  164. //-----------------------------------------------------------------------
  165. // Summary:
  166. //     This method reads data from an archive.
  167. // Parameters:
  168. //     pPX - A CXTPPropExchange object to serialize to or from.
  169. // Remarks:
  170. //     The existing data is not removed from the data provider and
  171. //     a new data will be loaded from the specified archive and
  172. //     added to the existing data set.
  173. //     Call RemoveAllEvents() manually if you need a cleanup before load.
  174. //     Method can throw CArchiveException.
  175. // Returns:
  176. //     TRUE is successful. FALSE otherwise.
  177. // See Also: _Save(), Serialize()
  178. //-----------------------------------------------------------------------
  179. virtual BOOL _Load(CXTPPropExchange* pPX);
  180. //-----------------------------------------------------------------------
  181. // Summary:
  182. //     This method writes data to an archive.
  183. // Parameters:
  184. //     pPX - A CXTPPropExchange object to serialize to or from.
  185. // Remarks:
  186. //     The most recent data from the data provider will be saved to
  187. //     archive.
  188. //     Method can throw CArchiveException.
  189. // Returns:
  190. //     TRUE is successful. FALSE otherwise.
  191. // See Also: _Load(), Serialize()
  192. //-----------------------------------------------------------------------
  193. virtual BOOL _Save(CXTPPropExchange* pPX);
  194. //-----------------------------------------------------------------------
  195. // Summary:
  196. //     Retrieves day events for a specified day from the memory storage.
  197. // Parameters:
  198. //     dtDay - A specified day.
  199. // Remarks:
  200. //     This method retrieves all appointments for a specified day from
  201. //     the memory storage. It includes recurrence appointments occurrences,
  202. //     regular appointments for this day, multi day appointments which
  203. //     also have a part of this day.
  204. // Returns:
  205. //     A collection of events for a specified day.
  206. //-----------------------------------------------------------------------
  207. virtual CXTPCalendarEventsPtr   DoRetrieveDayEvents(COleDateTime dtDay);
  208. //-----------------------------------------------------------------------
  209. // Summary:
  210. //     Removes all events from the memory storage.
  211. // Remarks:
  212. //     This method removes all appointments from the memory storage.
  213. //-----------------------------------------------------------------------
  214. virtual void                    DoRemoveAllEvents();
  215. //-----------------------------------------------------------------------
  216. // Summary:
  217. //     Read event from the memory storage.
  218. // Parameters:
  219. //     dwEventID - Event ID of the read target.
  220. // Remarks:
  221. //     This method retrieves all data for a specified event.
  222. // Returns:
  223. //     A pointer to the new CXTPCalendarEvent object which fields
  224. //     are filled with a data from the corresponding memory storage.
  225. //-----------------------------------------------------------------------
  226. virtual CXTPCalendarEventPtr                DoRead_Event(DWORD dwEventID);
  227. //-----------------------------------------------------------------------
  228. // Summary:
  229. //     Read recurrence pattern from the memory storage
  230. // Parameters:
  231. //     dwPatternID - Pattern ID of the read target.
  232. // Remarks:
  233. //     This method retrieves all data for a specified recurrence pattern.
  234. // Returns:
  235. //     A pointer to the new CXTPCalendarRecurrencePatternPtr object which
  236. //     fields are filled with a data from the corresponding memory storage.
  237. //-----------------------------------------------------------------------
  238. virtual CXTPCalendarRecurrencePatternPtr    DoRead_RPattern(DWORD dwPatternID);
  239. //-----------------------------------------------------------------------
  240. // Summary:
  241. //     Creates a new event in the memory storage
  242. // Parameters:
  243. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  244. //              all data fields of a newly created record.
  245. //     rdwNewEventID - [out] EventID of a newly created record
  246. // Remarks:
  247. //     This method creates a memory data record corresponding with the
  248. //     specified event.
  249. // Returns:
  250. //     TRUE if event created successfully,
  251. //     FALSE in case of any error during the process.
  252. //-----------------------------------------------------------------------
  253. virtual BOOL DoCreate_Event (CXTPCalendarEvent* pEvent, DWORD& rdwNewEventID);
  254. //-----------------------------------------------------------------------
  255. // Summary:
  256. //     Updates event properties in the memory storage.
  257. // Parameters:
  258. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  259. //              all data fields of an event.
  260. // Remarks:
  261. //     This method updates a memory data record corresponding with the
  262. //     specified event.
  263. // Returns:
  264. //     TRUE if an event updated successfully,
  265. //     FALSE in case of any errors during the process.
  266. //-----------------------------------------------------------------------
  267. virtual BOOL DoUpdate_Event (CXTPCalendarEvent* pEvent);
  268. //-----------------------------------------------------------------------
  269. // Summary:
  270. //     Deletes an event from the memory storage.
  271. // Parameters:
  272. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  273. //              all data fields of an event.
  274. // Remarks:
  275. //     This method deletes a memory data record corresponding with the
  276. //     specified event.
  277. // Returns:
  278. //     TRUE if an event deleted successfully,
  279. //     FALSE in case of any errors during the process.
  280. //-----------------------------------------------------------------------
  281. virtual BOOL DoDelete_Event (CXTPCalendarEvent* pEvent);
  282. //-----------------------------------------------------------------------
  283. // Summary:
  284. //     Creates a new recurrence pattern in the memory storage
  285. // Parameters:
  286. //     pPattern - Pointer to the CXTPCalendarRecurrencePattern object which
  287. //                describes all data fields of a newly created memory record.
  288. //     rdwNewPatternID - [out] ID of a newly created memory record
  289. // Remarks:
  290. //     This method creates a memory data record corresponding with the
  291. //     specified recurrence pattern.
  292. // Returns:
  293. //     TRUE if recurrence pattern created successfully,
  294. //     FALSE in case of any error during the process.
  295. //-----------------------------------------------------------------------
  296. virtual BOOL DoCreate_RPattern  (CXTPCalendarRecurrencePattern* pPattern, DWORD& rdwNewPatternID);
  297. //-----------------------------------------------------------------------
  298. // Summary:
  299. //     Updates a recurrence pattern in the memory storage
  300. // Parameters:
  301. //     pPattern - Pointer to the CXTPCalendarRecurrencePattern object.
  302. // Remarks:
  303. //     This method updates a memory data record corresponding with the
  304. //     specified recurrence pattern.
  305. // Returns:
  306. //     TRUE if recurrence pattern updated successfully,
  307. //     FALSE in case of any error during the process.
  308. //-----------------------------------------------------------------------
  309. virtual BOOL DoUpdate_RPattern  (CXTPCalendarRecurrencePattern* pPattern);
  310. //-----------------------------------------------------------------------
  311. // Summary:
  312. //     Deletes a recurrence pattern from the memory storage
  313. // Parameters:
  314. //     pPattern - Pointer to the CXTPCalendarRecurrencePattern object
  315. //                which should be deleted.
  316. // Remarks:
  317. //     This method deletes a memory data record corresponding with the
  318. //     specified recurrence pattern.
  319. // Returns:
  320. //     TRUE if recurrence pattern deleted successfully,
  321. //     FALSE in case of any error during the process.
  322. //-----------------------------------------------------------------------
  323. virtual BOOL DoDelete_RPattern  (CXTPCalendarRecurrencePattern* pPattern);
  324. //-----------------------------------------------------------------------
  325. // Summary:
  326. //     This method implements Getting all events from the memory storage
  327. //     without generating recurrence occurrences.
  328. // Remarks:
  329. //     Simple events are included as is.
  330. //     For the recurrence events only master events are included,
  331. //     recurrence occurrences are not generated.
  332. // Returns:
  333. //     A CXTPCalendarEvents pointer containing a collection of
  334. //     all events.
  335. // See Also: GetAllEvents_raw()
  336. //-----------------------------------------------------------------------
  337. virtual CXTPCalendarEventsPtr DoGetAllEvents_raw();
  338. //-----------------------------------------------------------------------
  339. // Summary:
  340. //     Retrieves a collection of events expiring in the period from
  341. //     dtFrom during next spPeriod.
  342. // Parameters:
  343. //     dtFrom   - Start date and time of a specified period.
  344. //     spPeriod - A duration of a specified period.
  345. // Remarks:
  346. //     This method returns a collection of upcoming events.
  347. //     It is used by a reminders manager.
  348. // Returns:
  349. //     A CXTPCalendarEvents pointer containing a collection of
  350. //     upcoming events.
  351. // See Also:
  352. //     CXTPCalendarRemindersManager overview
  353. //-----------------------------------------------------------------------
  354. virtual CXTPCalendarEventsPtr DoGetUpcomingEvents(COleDateTime dtFrom, COleDateTimeSpan spPeriod);
  355. //-----------------------------------------------------------------------
  356. // Summary:
  357. //      This method is called by the calendar control framework when Time Zone is Changed.
  358. // Remarks:
  359. //      The data provider implementation may use this method to adjust its data for
  360. //      a new timezone.
  361. // Returns:
  362. //      TRUE if internal data changed and calendar must be re-populated, FALSE if this
  363. //      event is ignored (no data changed).
  364. //      Base implementation do nothing and returns FALSE.
  365. // See Also:
  366. //    CXTPTopLevelWndMsgNotifier, XTP_WM_TIME_ZONE_CHANGED
  367. //-----------------------------------------------------------------------
  368. virtual BOOL OnTimeZoneChanged() { return TRUE; };
  369. //{{AFX_CODEJOCK_PRIVATE
  370. private:
  371. typedef CMap<DWORD, DWORD, CXTPCalendarEvent*, CXTPCalendarEvent*> CMapIDtoEvent;
  372. // Digital Search Tree Node
  373. struct DSTNode {
  374. DSTNode();
  375. ~DSTNode();
  376. DSTNode* pLeft;
  377. DSTNode* pRight;
  378. void Mark(CXTPCalendarEvent* pEvent);
  379. void Unmark(CXTPCalendarEvent* pEvent);
  380. BOOL IsMarked(CXTPCalendarEvent* pEvent);
  381. void AppendAll(CMapIDtoEvent* pMapEvents);
  382. private:
  383. typedef CMap<CXTPCalendarEvent*,CXTPCalendarEvent*, BOOL, BOOL> EventsMap;
  384. EventsMap* m_pMapEvents;
  385. };
  386. // Digital Search Tree
  387. struct DST
  388. {
  389. DST();
  390. ~DST();
  391. void Insert(CXTPCalendarEvent* pEvent);
  392. void Remove(CXTPCalendarEvent* pEvent);
  393. void Clear();
  394. void SearchForEvents(DWORD dwStart, DWORD dwEnd, CXTPCalendarEvents* pEvents);
  395. private:
  396. // properties
  397. DSTNode* pHead;
  398. // temp data storage
  399. CMapIDtoEvent tmp_mapEvents;
  400. private:
  401. enum DSTScanType {
  402. dstScanMark,
  403. dstScanUnmark,
  404. dstScanFind
  405. };
  406. // methods
  407. void ScanRange(DSTNode* const pNode, const int nDepth,
  408. const DWORD dwMinValue, const DWORD dwMaxValue,
  409. const DWORD dwStart, const DWORD dwEnd,
  410. CXTPCalendarEvent* const pEvent, CMapIDtoEvent* pMapEvents,
  411. const DSTScanType eScanType);
  412. void MarkRange(CXTPCalendarEvent* pEvent, const DSTScanType eScanType);
  413. };
  414. private:
  415. BOOL IsProviderXML(BOOL bCheckXMLsupport, BOOL* pbXMLsupportError = NULL);
  416. CString GetXMLEncoding();
  417. DWORD _UniqueID_Event(DWORD dwID);
  418. DWORD _UniqueID_Patern(DWORD dwID);
  419. private:
  420. EventsMapByID_T<CXTPCalendarEvent>              m_EventsStorage;
  421. EventsMapByID_T<CXTPCalendarRecurrencePattern>  m_mapPatterns;
  422. DST m_tree;
  423. //---------------------------------------------------------------------------
  424. //CMap<DWORD, DWORD, BOOL, BOOL>  m_mapIsDayInCache;
  425. //}}AFX_CODEJOCK_PRIVATE
  426. };
  427. #endif // !defined(_XTPCALENDARMEMORYDATAPROVIDER_H__)