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

对话框与窗口

开发平台:

Visual C++

  1. // XTShellTreeBase.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. #ifndef __XTSHELLTREEBASE_H__
  22. #define __XTSHELLTREEBASE_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER >= 1000
  25. #pragma once
  26. #endif // _MSC_VER >= 1000
  27. // -------------------------------------------------------------------
  28. // Summary:
  29. //     Enumeration used to determine folder or drive type.
  30. // Remarks:
  31. //     XTFindType type defines the constants used by the CXTShellTreeBase
  32. //     class to determine the type of object enumerated either folder or drive.
  33. // See Also:
  34. //     CXTFontListBox, CXTFontListBox::SetListStyle
  35. //
  36. // <KEYWORDS xtFindTypeDrive, xtFindTypeFolder>
  37. // -------------------------------------------------------------------
  38. enum XTFindType
  39. {
  40. xtFindTypeDrive,  // The object type is a drive.
  41. xtFindTypeFolder, // The object type is a folder.
  42. xtFindTypeRoot,   // The object type is a root folder
  43. xtFindTypeShare   // The object is a UNC share
  44. };
  45. //===========================================================================
  46. // Summary:
  47. //     CXTShellTreeBase is a multiple inheritance class derived from CXTTreeView
  48. //     and CXTShellPidl. It is used to create a CXTShellTreeBase class object.
  49. //===========================================================================
  50. class _XTP_EXT_CLASS CXTShellTreeBase : public CXTTreeBase, public CXTShellPidl
  51. {
  52. public:
  53. //-----------------------------------------------------------------------
  54. // Summary:
  55. //     Constructs a CXTShellTreeBase object
  56. //-----------------------------------------------------------------------
  57. CXTShellTreeBase();
  58. //-----------------------------------------------------------------------
  59. // Summary:
  60. //     Destroys a CXTShellTreeBase object, handles cleanup and deallocation
  61. //-----------------------------------------------------------------------
  62. virtual ~CXTShellTreeBase();
  63. protected:
  64. //-----------------------------------------------------------------------
  65. // Summary:
  66. //     This member function fills a branch of the TreeView control. Given
  67. //     the shell folder, it enumerates the subitems of this folder and adds
  68. //     the appropriate items to the tree.
  69. // Parameters:
  70. //     lpsf    - Pointer to the parent shell folder.
  71. //     lpifq   - Fully qualified item ID list to the item having items enumerated.
  72. //               This is the PIDL to the item identified by the 'lpsf' parameter.
  73. //     hParent - Parent tree node.
  74. // Returns:
  75. //     TRUE if successful, otherwise returns FALSE.
  76. //-----------------------------------------------------------------------
  77. virtual BOOL InitTreeViewItems(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent);
  78. //-----------------------------------------------------------------------
  79. // Summary:
  80. //     This member function gets the index for the normal and selected
  81. //     icons for the current item.
  82. // Parameters:
  83. //     lpifq    - Fully qualified item ID list for the current item.
  84. //     lptvitem - Pointer to the tree view item being added to the tree.
  85. //-----------------------------------------------------------------------
  86. virtual void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTV_ITEM lptvitem);
  87. public:
  88. //-----------------------------------------------------------------------
  89. // Summary:
  90. //     Call this member function to enable or disable the display of the
  91. //     shell context menu on right item click.
  92. // Parameters:
  93. //     bEnable - TRUE to display a context menu.
  94. //-----------------------------------------------------------------------
  95. void EnableContextMenu(BOOL bEnable);
  96. //-----------------------------------------------------------------------
  97. // Summary:
  98. //     Call this member to set root CSIDL folder.
  99. // Parameters:
  100. //     nRootFolder - Root folder of tree view.
  101. //-----------------------------------------------------------------------
  102. void SetRootFolder(int nRootFolder = CSIDL_DESKTOP);
  103. //-----------------------------------------------------------------------
  104. // Summary:
  105. //     Call this member to show all files instead of only folders
  106. // Parameters:
  107. //     bShowFiles - TRUE to show folder's files
  108. //-----------------------------------------------------------------------
  109. void ShowFiles(BOOL bShowFiles = TRUE);
  110. //-----------------------------------------------------------------------
  111. // Summary:
  112. //     Call this member function to determine the type of items included
  113. //     in the shell enumeration. The default is SHCONTF_FOLDERS | SHCONTF_NONFOLDERS.
  114. // Parameters:
  115. //     uFlags - Determines the type of items included in an enumeration. It
  116. //              can be one or more of the values listed in the Remarks section.
  117. // Remarks:
  118. //     Styles to be added or removed can be combined by using the bitwise
  119. //     OR (|) operator. It can be one or more of the following:<p/>
  120. //     * <b>SHCONTF_FOLDERS</b> Include items that are folders in
  121. //       the enumeration.
  122. //     * <b>SHCONTF_NONFOLDERS</b> Include items that are not folders
  123. //       in the enumeration.
  124. //     * <b>SHCONTF_INCLUDEHIDDEN</b> Include hidden items in the
  125. //       enumeration.
  126. //     * <b>SHCONTF_INIT_ON_FIRST_NEXT</b> IShellFolder::EnumObjects
  127. //       can return without validating the enumeration object. Validation
  128. //       can be postponed until the first call to IEnumIDList::Next.
  129. //       This flag is intended to be used when a user interface may be
  130. //       displayed prior to the first IEnumIDList::Next call. For a
  131. //       user interface to be presented, 'hwndOwner' must be set to a valid
  132. //       window handle.
  133. //     * <b>SHCONTF_NETPRINTERSRCH</b> The caller is looking for
  134. //       printer objects.
  135. //-----------------------------------------------------------------------
  136. void SetEnumFlags(UINT uFlags);
  137. //-----------------------------------------------------------------------
  138. // Summary:
  139. //     This member function obtains a handle to the system image list and
  140. //     attaches it to the tree control.
  141. // Returns:
  142. //     TRUE if successful, otherwise returns FALSE.
  143. //-----------------------------------------------------------------------
  144. virtual BOOL InitSystemImageLists();
  145. //-----------------------------------------------------------------------
  146. // Summary:
  147. //     This member function adds items to the tree view.
  148. //-----------------------------------------------------------------------
  149. virtual void PopulateTreeView();
  150. //-----------------------------------------------------------------------
  151. // Summary:
  152. //     This member function responds to a TVN_ITEMEXPANDING message in
  153. //     order to fill up subdirectories.
  154. // Parameters:
  155. //     pNMTreeView - Address of an NM_TREEVIEW struct.
  156. //-----------------------------------------------------------------------
  157. virtual void OnFolderExpanding(NM_TREEVIEW* pNMTreeView);
  158. //-----------------------------------------------------------------------
  159. // Summary:
  160. //     This member function displays the system popup menu for the selected
  161. //     item or folder.
  162. // Returns:
  163. //     A handle to the currently selected HTREEITEM.
  164. //-----------------------------------------------------------------------
  165. virtual HTREEITEM GetContextMenu();
  166. //-----------------------------------------------------------------------
  167. // Summary:
  168. //     This member function responds to a TVN_SELCHANGED message to retrieve
  169. //     the specified folder path.
  170. // Parameters:
  171. //     pNMTreeView   - Address of an NM_TREEVIEW struct.
  172. //     strFolderPath - Address of a CString object to receive the file system path.
  173. // Returns:
  174. //     TRUE if the folder path was found, otherwise returns FALSE.
  175. //-----------------------------------------------------------------------
  176. virtual BOOL OnFolderSelected(NM_TREEVIEW* pNMTreeView, CString& strFolderPath);
  177. //-----------------------------------------------------------------------
  178. // Summary:
  179. //     This member function retrieves the path of the currently selected
  180. //     tree item.
  181. // Parameters:
  182. //     strFolderPath - Address of a CString object to receive the file system path.
  183. // Returns:
  184. //     TRUE if successful, otherwise returns FALSE.
  185. //-----------------------------------------------------------------------
  186. virtual BOOL GetSelectedFolderPath(CString& strFolderPath);
  187. //-----------------------------------------------------------------------
  188. // Summary:
  189. //     This member function recursively searches the tree control beginning
  190. //     at 'hItem' to find the item specified by 'lplvid'. This is typically used when
  191. //     the user double clicks an item in the list view.
  192. // Parameters:
  193. //     hItem  - Handle to the tree item to search from.
  194. //     lplvid - Pointer to the list view item data.
  195. //     bRecursively - TURE to recursively search.
  196. // Returns:
  197. //     TRUE if successful, otherwise returns FALSE.
  198. //-----------------------------------------------------------------------
  199. virtual BOOL FindTreeItem(HTREEITEM hItem, XT_LVITEMDATA* lplvid, BOOL bRecursively = TRUE);
  200. //-----------------------------------------------------------------------
  201. // Summary:
  202. //     This member function is used to associate a CComboBox object with
  203. //     the control. Whenever the path changes, the combo is updated.
  204. // Parameters:
  205. //     pWnd - Points to the combo box that is associated with the tree.
  206. //-----------------------------------------------------------------------
  207. virtual void AssociateCombo(CWnd* pWnd);
  208. //-----------------------------------------------------------------------
  209. // Summary:
  210. //     This member function is called to initialize a branch of the shell
  211. //     tree.
  212. // Parameters:
  213. //     hItem  - Handle to a tree node.
  214. //     lptvid - Pointer to the list view item data.
  215. //-----------------------------------------------------------------------
  216. virtual void InitTreeNode(HTREEITEM hItem, XT_TVITEMDATA* lptvid);
  217. //-----------------------------------------------------------------------
  218. // Summary:
  219. //     This member function searches the tree for a specified folder.
  220. // Parameters:
  221. //     hItem         - Tree item to begin the search from.
  222. //     pABSPidl      - pidl we're looking to match
  223. // Returns:
  224. //     HTREEITEM of node in tree that resulted in a match.
  225. //-----------------------------------------------------------------------
  226. virtual HTREEITEM SearchTree(HTREEITEM hItem, LPCITEMIDLIST pABSPidl);
  227. //-----------------------------------------------------------------------
  228. // Summary:
  229. //     This member function will "tunnel" the tree to find the specified
  230. //     path. This will work only when the PopulateTreeView() method is used
  231. //     to populate the tree.
  232. // Parameters:
  233. //     strFindPath - Path to find.
  234. //-----------------------------------------------------------------------
  235. virtual BOOL TunnelTree(CString strFindPath);
  236. //-----------------------------------------------------------------------
  237. // Summary:
  238. //     This member function retrieves the path of a folder item, which
  239. //     does not have to be selected. Pass a CString object that will hold
  240. //     the folder path.
  241. // Parameters:
  242. //     hItem         - Tree item to get the path for.
  243. //     strFolderPath - Reference to a CString object to contain the folder path.
  244. // Returns:
  245. //     TRUE if the path is not in the file system (e.g.
  246. //     MyComputer); if none is selected, it returns FALSE.
  247. //-----------------------------------------------------------------------
  248. virtual BOOL GetFolderItemPath(HTREEITEM hItem, CString &strFolderPath);
  249. //-----------------------------------------------------------------------
  250. // Summary:
  251. //     This member function populates a tree based upon a path. You must
  252. //     call InitializeTree() before populating the tree for the first time.
  253. // Parameters:
  254. //     lpszPath - Path to populate.
  255. // See Also: InitializeTree()
  256. //-----------------------------------------------------------------------
  257. virtual void PopulateTree(LPCTSTR lpszPath);
  258. //-----------------------------------------------------------------------
  259. // Summary:
  260. //     Call this member function to initialize the shell tree control prior
  261. //     to calling PopulateTree.
  262. // Parameters:
  263. //     dwStyle - TVS_ style flags for tree control.
  264. // Returns:
  265. //     TRUE if successful, otherwise returns FALSE.
  266. // See Also: PopulateTree()
  267. //-----------------------------------------------------------------------
  268. virtual BOOL InitializeTree(DWORD dwStyle = TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
  269. //-----------------------------------------------------------------------
  270. // Summary:
  271. //     Used by the shell list control to handle a drag event.
  272. // Parameters:
  273. //     pNMTreeView - Points to a NM_TREEVIEW structure.
  274. //-----------------------------------------------------------------------
  275. virtual void BeginDrag(NM_TREEVIEW* pNMTreeView);
  276. //-----------------------------------------------------------------------
  277. // Summary:
  278. //     This member function is called to insert the Desktop as the root
  279. //     item in the shell tree control.
  280. // Parameters:
  281. //     nFolder - Root folder CSIDL to insert.
  282. // Returns:
  283. //     A handle to the desktop tree item if successful, otherwise NULL.
  284. //-----------------------------------------------------------------------
  285. virtual HTREEITEM InsertDesktopItem(int nFolder = CSIDL_DESKTOP);
  286. //-----------------------------------------------------------------------
  287. // Summary:
  288. //     Called after a user makes a new tree selection.
  289. // Remarks:
  290. //     This member function is called whenever a user makes a selection
  291. //     within the tree control to synchronize any shell list or shell
  292. //     combo boxes associated with the tree. You can override this member
  293. //     to provide additional functionality.
  294. // Parameters:
  295. //     hItem         - Handle to the newly selected tree item.
  296. //     strFolderPath - NULL terminated string representing the fully
  297. //                     qualified path to the selected tree item.
  298. //-----------------------------------------------------------------------
  299. virtual void SelectionChanged(HTREEITEM hItem, CString strFolderPath);
  300. protected:
  301. //-----------------------------------------------------------------------
  302. // Summary:
  303. //     This member function sets the shell attribute flags for the specified
  304. //     tree item.
  305. // Parameters:
  306. //     hItem        - Handle to HTREEITEM node.
  307. //     dwAttributes - Flags retrieved from SHELLFOLDER::GetAttributesOf.
  308. //-----------------------------------------------------------------------
  309. void SetAttributes(HTREEITEM hItem, DWORD dwAttributes);
  310. // -------------------------------------------------------------------------------------------
  311. // Summary:
  312. //     Parses a path for the next path component.
  313. // Parameters:
  314. //     pszPath -  Pointer to a NULL-terminated string with the path. Paths are
  315. //                delimited by backslashes or by the NULL at the end of the
  316. //                path.
  317. // Remarks:
  318. //     This member function parses a path for the next path component,
  319. //     not dependent on shell32.dll, and is a replacement for the windows
  320. //     API PathFindNextComponent.
  321. // Returns:
  322. //     A pointer to a NULL-terminated string with the next path component
  323. //     if successful, or NULL otherwise.
  324. // Example:
  325. //     The following example demonstrates using the XTFuncPathFindNextComponent function.
  326. // <code>
  327. // // Path to find the next part.
  328. // char buffer_1[ ] = "c:\\path1\\path2\\test";
  329. // char *lpStr1;
  330. // lpStr1 = buffer_1;
  331. //
  332. // cout << "Search a path for the next path component "
  333. //      << "after the root " << lpStr1 << endl;
  334. // cout << "Return the next path component: \""
  335. //      <<  XTFuncPathFindNextComponent(lpStr1) << "\"" << endl;
  336. //
  337. // cout << "\nSearch a path for the next path component "
  338. //      << "after the root \"c:\\path1\\path2\"" << endl;
  339. // cout << "Return the next path component: \""
  340. //      <<  XTFuncPathFindNextComponent("c:\\path1\\path2") << "\"" << endl;
  341. //
  342. // cout << "\nSearch a path for the next path component "
  343. //      << "after the root \"c:\\path1\"" << endl;
  344. // cout << "Return the next path component: \""
  345. //      <<  XTFuncPathFindNextComponent("c:\\path1") << "\"" << endl;
  346. //
  347. // OUTPUT:
  348. // ===========
  349. // Search a path for the next path component after the root c:\path1\path2\test
  350. // Return the next path component: "path1\path2\test"
  351. //
  352. // Search a path for the next path component after the root "c:\path1\path2"
  353. // Return the next path component: "path1\path2"
  354. //
  355. // Search a path for the next path component after the root "c:\path1"
  356. // Return the next path component: "path1"
  357. // </code>
  358. // -------------------------------------------------------------------------------------------
  359. CString PathFindNextComponent(const CString& pszPath);
  360. // -------------------------------------------------------------------------------------------
  361. // Summary:
  362. //     Sorts items in the control using the provided callback function.
  363. // Parameters:
  364. //     hParent - Parent item to sort
  365. // -------------------------------------------------------------------------------------------
  366. virtual void SortChildren(HTREEITEM hParent);
  367. protected:
  368. //{{AFX_CODEJOCK_PRIVATE
  369. //{{AFX_MSG(CXTShellTreeBase)
  370. afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
  371. afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
  372. afx_msg void OnDeleteTreeItem(NMHDR* pNMHDR, LRESULT* pResult);
  373. afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);
  374. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  375. afx_msg void OnPaint();
  376. //}}AFX_MSG
  377. //}}AFX_CODEJOCK_PRIVATE
  378. protected:
  379. UINT             m_uFlags;       // Flags indicating which items to include in the enumeration.
  380. bool             m_bTunneling;   // true if tree is currently traversing.
  381. BOOL             m_bContextMenu; // TRUE to display the shell context menu on right item click.
  382. CWnd*            m_pComboBox;    // CComboBox that is associated with this control. See AssociateCombo(...)
  383. CXTShellSettings m_shSettings;   // Contains SHELLFLAGSTATE info.
  384. int              m_nRootFolder;  // Root Folder CSIDL
  385. BOOL             m_bShowFiles;   // FALSE to show only directories
  386. };
  387. //////////////////////////////////////////////////////////////////////
  388. AFX_INLINE void CXTShellTreeBase::SetEnumFlags(UINT uFlags) {
  389. m_uFlags = uFlags;
  390. }
  391. AFX_INLINE void CXTShellTreeBase::EnableContextMenu(BOOL bEnable) {
  392. m_bContextMenu = bEnable;
  393. }
  394. AFX_INLINE void CXTShellTreeBase::SetRootFolder(int nRootFolder /*= CSIDL_DESKTOP*/) {
  395. m_nRootFolder = nRootFolder;
  396. }
  397. AFX_INLINE void CXTShellTreeBase::ShowFiles(BOOL bShowFiles /*= TRUE*/) {
  398. m_bShowFiles = bShowFiles;
  399. }
  400. // --------------------------------------------------------------------------------------
  401. // Summary:
  402. //     The DELCLATE_SHELLTREE_BASE class is a template class used by the
  403. //     CXTShellTreeView and CXTShellTreeCtrl class to declare a multiple
  404. //     inheritance base class so that both classes could share a common
  405. //     code base.
  406. // Parameters:
  407. //     ClassName -  Name of the object to be declared as the base class.
  408. //     Tree -       Existing class that this object will derive from.
  409. //     Base -       Existing shared class that this object will derive from.
  410. // Remarks:
  411. //     <i>Tree</i> must be an existing class that is derived from either <i>CTreeCtrl</i>
  412. //     or <i>CTreeView</i>.
  413. // Example:
  414. //     The following example demonstrates how to use DECLATE_SHELLTREE_BASE.
  415. // <code>
  416. // DECLATE_SHELLTREE_BASE(CXTShellTreeViewBase, CTreeView, CXTShellTreeBase)
  417. //
  418. // class _XTP_EXT_CLASS CXTShellTreeView : public CXTShellTreeViewBase
  419. // {
  420. // public:
  421. //     CXTShellTreeView();
  422. // };
  423. // </code>
  424. // --------------------------------------------------------------------------------------
  425. #define DECLATE_SHELLTREE_BASE(ClassName, Tree, Base)
  426. //{{AFX_CODEJOCK_PRIVATE
  427. #undef DECLATE_SHELLTREE_BASE
  428. #define DECLATE_SHELLTREE_BASE(ClassName, Tree, Base)
  429. DECLATE_TREE_BASE(Base##Tree, Tree, Base)
  430. class _XTP_EXT_CLASS ClassName : public Base##Tree
  431. {
  432. protected:
  433. void OnPaint() {
  434. Base::OnPaint();
  435. }   
  436. void OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) {
  437. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  438. BeginDrag(pNMTreeView);
  439. *pResult = 0;
  440. }
  441. void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) {
  442. Base::OnSelchanged(pNMHDR, pResult);
  443. }   
  444. void OnDeleteTreeItem(NMHDR* pNMHDR, LRESULT* pResult) {
  445. Base::OnDeleteTreeItem(pNMHDR, pResult);
  446. }   
  447. void OnRclick(NMHDR* pNMHDR, LRESULT* pResult) {
  448. Base::OnRclick(pNMHDR, pResult);
  449. }   
  450. void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) {
  451. Base::OnItemexpanding(pNMHDR, pResult);
  452. }
  453. };
  454. #define ON_SHELLTREE_REFLECT
  455. ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  456. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  457. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  458. ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)
  459. ON_NOTIFY_REFLECT(TVN_BEGINRDRAG, OnBeginDrag)
  460. ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteTreeItem)
  461. ON_TREECTRL_REFLECT
  462. //}}AFX_CODEJOCK_PRIVATE
  463. #endif // __XTSHELLTREEVIEW_H__