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

对话框与窗口

开发平台:

Visual C++

  1. // XTDirWatcher.h : header file
  2. //
  3. // This file is a part of the XTREME CONTROLS 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(__XTDIRWATCHER_H__)
  22. #define __XTDIRWATCHER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. //===========================================================================
  28. // Summary:
  29. //     The CXTDirWatcher is a thread class that will monitor a specified
  30. //     path for file and directory changes to occur.
  31. // Remarks:
  32. //     Whenever an item is created, deleted or renamed the thread will send a notification to
  33. //     the its owner in the form of a XTWM_SHELL_NOTIFY message.  The
  34. //     WPARAM value for the notification will be set to SHN_XT_TREESELCHANGE
  35. //     if the folder list contents require updating or SHN_XT_CONTENTSCHANGED
  36. //     if the tree contents require updating.  The LPARAM value is set to
  37. //     the address of a XT_TVITEMDATA structure that contains information
  38. //     the path monitored.
  39. //
  40. // Example: To use CXTDirWatcher, add a CXTDirWatcher* m_pDirThread member
  41. //          to your class and instantiate a new thread using AfxBeginThread:
  42. //
  43. // <code>
  44. // // Start the directory monitoring thread.
  45. // m_pDirThread = (CXTDirWatcher*)AfxBeginThread(RUNTIME_CLASS(CXTDirWatcher),
  46. //     THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
  47. // </code>
  48. // You can then specify what directory you wish to monitor by calling SetFolderData
  49. // or SetFolderPath:
  50. // <code>
  51. // // Specify the folder to monitor.
  52. // m_pDirThread->SetFolderData(this, lpTVID);
  53. // m_pDirThread->ResumeThread();
  54. // </code>
  55. //
  56. //          You can add a message handler to the window receiving messages and handle your
  57. //          change event notifications.  The thread will send two notifications, the wParam indicates
  58. //          what event has occurred.  If wParam equal HN_XT_REFRESHFOLDER this indicates that the
  59. //          folder list has changed and needs to be updated.  If wParam equals SHN_XT_REFRESHTREE this
  60. //          indicates the folder tree has changed and needs to be updated.  The lParam value represents
  61. //          a pointer to a XT_TVITEMDATA structure for the folder:
  62. //
  63. // <code>
  64. // BEGIN_MESSAGE_MAP(CNotifyWnd, CWnd)
  65. //     //{{AFX_MSG_MAP(CNotifyWnd)
  66. //     //}}AFX_MSG_MAP
  67. //     ON_MESSAGE(XTWM_SHELL_NOTIFY, OnUpdateShell)
  68. // END_MESSAGE_MAP()
  69. //
  70. // LRESULT CNotifyWnd::OnUpdateShell(WPARAM wParam, LPARAM lParam)
  71. // {
  72. //     switch (wParam)
  73. //     {
  74. //         case SHN_XT_REFRESHFOLDER:
  75. //         case SHN_XT_REFRESHTREE:
  76. //         {
  77. //             // Directory monitory thread has issued an update notification,
  78. //             // refresh the list control.
  79. //             XT_TVITEMDATA*  lpTVID = (XT_TVITEMDATA*)lParam;
  80. //             ASSERT(lpTVID);
  81. //
  82. //             PopulateListView(lpTVID, lpTVID->lpsfParent);
  83. //             break;
  84. //         }
  85. //
  86. //         default:
  87. //             break;
  88. //     }
  89. //
  90. //     return 0;
  91. // }
  92. // </code>
  93. //
  94. //          When you are finished using the CXTDirWatcher thread, you will need to free the
  95. //          memory associated with the object. To do so you can use the SAFE_DELETE
  96. //          macro like so:
  97. //
  98. // <code>
  99. // SAFE_DELETE(m_pDirThread);
  100. // </code>
  101. //
  102. //          The CXTDirWatcher class is used internally by the CXTShellListCtrl and
  103. //          CXTShellListView classes to handle refreshing the list when a file or directory
  104. //          change occurs.
  105. //===========================================================================
  106. class _XTP_EXT_CLASS CXTDirWatcher : public CWinThread
  107. {
  108. DECLARE_DYNCREATE(CXTDirWatcher)
  109. public:
  110. //-----------------------------------------------------------------------
  111. // Summary:
  112. //     Constructs a CXTDirWatcher object
  113. //-----------------------------------------------------------------------
  114. CXTDirWatcher();
  115. protected:
  116. //-----------------------------------------------------------------------
  117. // Summary:
  118. //     Destroys a CXTDirWatcher object, handles cleanup and deallocation
  119. //-----------------------------------------------------------------------
  120. virtual ~CXTDirWatcher();
  121. public:
  122. //-----------------------------------------------------------------------
  123. // Summary:
  124. //     Call this member function to monitor the directory specified by strPath.
  125. // Parameters:
  126. //     pMainWnd       - Points to the window to receive change notifications.
  127. //     lpszFolderPath - Full path of directory to monitor.
  128. // Returns:
  129. //     TRUE if successful, otherwise returns FALSE.
  130. //-----------------------------------------------------------------------
  131. BOOL SetFolderPath(CWnd* pMainWnd, LPCTSTR lpszFolderPath);
  132. //-----------------------------------------------------------------------
  133. // Summary:
  134. //     Call this member function to retrieve the full path to the directory that
  135. //     is currently monitored.
  136. // Returns:
  137. //     A CString object representing the path monitored.
  138. //-----------------------------------------------------------------------
  139. CString GetFolderPath() const;
  140. //-----------------------------------------------------------------------
  141. // Summary:
  142. //     Call this member function to monitor the directory using a pointer
  143. //     to a XT_TVITEMDATA pointer.
  144. // Parameters:
  145. //     pMainWnd - Pointer to the window to receive update notifications.
  146. //     lpTVID   - Pointer to tree view item data.
  147. // Returns:
  148. //     TRUE if successful, otherwise returns FALSE.
  149. //-----------------------------------------------------------------------
  150. BOOL SetFolderData(CWnd* pMainWnd, XT_TVITEMDATA* lpTVID);
  151. // ----------------------------------------------------------------------
  152. // Summary:
  153. //     Constructs or retrieves XT_TVITEMDATA structure information.
  154. // Parameters:
  155. //     lpszFolderPath -  Full path to directory.
  156. //     lpTVID -          Reference to tree view item data.
  157. // Remarks:
  158. //     In the first version this member function is called to return the
  159. //     a pointer to a XT_TVITEMDATA structure for the directory that is
  160. //     currently monitored. In the second version the function constructs
  161. //     a XT_TVITEMDATA structure from the specified path.
  162. // Returns:
  163. //     In the first version a pointer to a XT_TVITEMDATA structure. In
  164. //     the second version TRUE if successful, otherwise FALSE.
  165. // ----------------------------------------------------------------------
  166. XT_TVITEMDATA* GetFolderData();
  167. BOOL GetFolderData(LPCTSTR lpszFolderPath, XT_TVITEMDATA& lpTVID); //<combine CXTDirWatcher::GetFolderData>
  168. //-----------------------------------------------------------------------
  169. // Summary:
  170. //     Call this member function to determine if the specified path
  171. //     is a valid directory name.
  172. // Parameters:
  173. //     lpszFolderPath - Full path to directory.
  174. // Returns:
  175. //     TRUE if the path is valid, otherwise returns FALSE.
  176. //-----------------------------------------------------------------------
  177. BOOL IsPathValid(LPCTSTR lpszFolderPath);
  178. void StopNotifications();
  179. public:
  180. //{{AFX_CODEJOCK_PRIVATE
  181. //{{AFX_VIRTUAL(CXTDirWatcher)
  182. virtual BOOL InitInstance();
  183. //}}AFX_VIRTUAL
  184. //}}AFX_CODEJOCK_PRIVATE
  185. protected:
  186. //-----------------------------------------------------------------------
  187. // Summary:
  188. //     This member function is called by the thread whenever the monitored
  189. //     directory list needs to be refreshed.
  190. //-----------------------------------------------------------------------
  191. virtual void RefreshFolder();
  192. //-----------------------------------------------------------------------
  193. // Summary:
  194. //     This member function is called by the thread whenever the monitored
  195. //     directory tree needs to be refreshed.
  196. //-----------------------------------------------------------------------
  197. virtual void RefreshTree();
  198. BOOL MonitorNotifications();
  199. BOOL WaitPathChangedEvent();
  200. protected:
  201. //{{AFX_CODEJOCK_PRIVATE
  202. DECLARE_MESSAGE_MAP()
  203. //{{AFX_MSG(CXTDirWatcher)
  204. //}}AFX_MSG
  205. //}}AFX_CODEJOCK_PRIVATE
  206. protected:
  207. HANDLE          m_dwMonitorEvents[4];   // Change event handles.
  208. CString         m_strFolderPath;        // Path that is monitored.
  209. XT_TVITEMDATA   m_tvid;                 // Tree view item data.
  210. };
  211. /////////////////////////////////////////////////////////////////////////////
  212. AFX_INLINE CString CXTDirWatcher::GetFolderPath() const {
  213. return m_strFolderPath;
  214. }
  215. AFX_INLINE XT_TVITEMDATA* CXTDirWatcher::GetFolderData() {
  216. return &m_tvid;
  217. }
  218. #endif // !defined(__XTDIRWATCHER_H__)