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

对话框与窗口

开发平台:

Visual C++

  1. // XTShellListCtrl.cpp : implementation 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. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"
  22. #include "XTDefines.h"
  23. #include "XTVC50Helpers.h"
  24. #include "XTHeaderCtrl.h"
  25. #include "XTListCtrlView.h"
  26. #include "XTShellPidl.h"
  27. #include "XTShellSettings.h"
  28. #include "XTShellListBase.h"
  29. #include "XTShellListCtrlView.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTShellListView
  37. CXTShellListView::CXTShellListView()
  38. {
  39. ImplAttach(&GetListCtrl());
  40. }
  41. CXTShellListView::~CXTShellListView()
  42. {
  43. }
  44. IMPLEMENT_DYNCREATE(CXTShellListView, CListView)
  45. BEGIN_MESSAGE_MAP(CXTShellListView, CListView)
  46. ON_SHELLLIST_REFLECT()
  47. ON_MESSAGE(XTWM_SHELL_NOTIFY, OnUpdateShell)
  48. ON_WM_KEYDOWN()
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CXTShellListView message handlers
  52. void CXTShellListView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  53. {
  54. if (nChar == VK_RETURN)
  55. {
  56. int iIndex = GetListCtrl().GetNextItem(-1, LVNI_FOCUSED);
  57. if (iIndex >= 0)
  58. {
  59. CDocument* pDoc = GetDocument();
  60. pDoc->UpdateAllViews(this, SHN_XT_SELECTCHILD,
  61. (CObject*)GetListCtrl().GetItemData(iIndex));
  62. }
  63. }
  64. CXTShellListViewBase::OnKeyDown(nChar, nRepCnt, nFlags);
  65. }
  66. void CXTShellListView::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult)
  67. {
  68. int iIndex = GetDoubleClickedItem();
  69. if (iIndex >= 0)
  70. {
  71. CDocument* pDoc = GetDocument();
  72. pDoc->UpdateAllViews(this, SHN_XT_SELECTCHILD,
  73. (CObject*)GetListCtrl().GetItemData(iIndex));
  74. }
  75. *pResult = 0;
  76. }
  77. BOOL CXTShellListView::PreCreateWindow(CREATESTRUCT& cs)
  78. {
  79. if (!CXTShellListViewBase::PreCreateWindow(cs))
  80. return FALSE;
  81. cs.style |= LVS_REPORT | LVS_SHAREIMAGELISTS;
  82. return TRUE;
  83. }
  84. LRESULT CXTShellListView::OnUpdateShell(WPARAM wParam, LPARAM lParam)
  85. {
  86. UpdateList((int)wParam, (XT_TVITEMDATA*)lParam);
  87. return 0;
  88. }
  89. void CXTShellListView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* pHint)
  90. {
  91. UpdateList((int)lHint, (XT_TVITEMDATA*)pHint);
  92. }
  93. /////////////////////////////////////////////////////////////////////////////
  94. // CXTShellListCtrl
  95. CXTShellListCtrl::CXTShellListCtrl()
  96. {
  97. ImplAttach(this);
  98. m_bInitControl = true;
  99. m_pTreeCtrl = NULL;
  100. m_nNameColumnWidth = 200;
  101. }
  102. CXTShellListCtrl::~CXTShellListCtrl()
  103. {
  104. }
  105. BEGIN_MESSAGE_MAP(CXTShellListCtrl, CListCtrl)
  106. ON_SHELLLIST_REFLECT()
  107. ON_MESSAGE(XTWM_SHELL_NOTIFY, OnUpdateShell)
  108. ON_WM_KEYDOWN()
  109. END_MESSAGE_MAP()
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CXTShellListCtrl message handlers
  112. void CXTShellListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  113. {
  114. if (nChar == VK_RETURN)
  115. {
  116. int iIndex = GetNextItem(-1, LVNI_FOCUSED);
  117. if (iIndex >= 0 && m_pTreeCtrl != NULL)
  118. {
  119. m_pTreeCtrl->SendMessage(XTWM_SHELL_NOTIFY,
  120. (WPARAM)SHN_XT_SELECTCHILD, (LPARAM)(XT_LVITEMDATA*)GetItemData(iIndex));
  121. }
  122. }
  123. CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
  124. }
  125. void CXTShellListCtrl::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult)
  126. {
  127. int iIndex = GetDoubleClickedItem();
  128. if (iIndex >= 0 && m_pTreeCtrl != NULL)
  129. {
  130. m_pTreeCtrl->SendMessage(XTWM_SHELL_NOTIFY,
  131. (WPARAM)SHN_XT_SELECTCHILD, (LPARAM)(XT_LVITEMDATA*)GetItemData(iIndex));
  132. }
  133. *pResult = 0;
  134. }
  135. LRESULT CXTShellListCtrl::OnUpdateShell(WPARAM wParam, LPARAM lParam)
  136. {
  137. UpdateList((int)wParam, (XT_TVITEMDATA*)lParam);
  138. return 0;
  139. }
  140. /////////////////////////////////////////////////////////////////////////////
  141. // CXTShellListCtrlEx
  142. CXTShellListCtrlEx::CXTShellListCtrlEx()
  143. : m_pSyncWnd(0)
  144. {
  145. }
  146. CXTShellListCtrlEx::~CXTShellListCtrlEx()
  147. {
  148. }
  149. BEGIN_MESSAGE_MAP(CXTShellListCtrlEx, CXTShellListCtrl)
  150. //{{AFX_MSG_MAP(CXTShellListCtrlEx)
  151. ON_WM_LBUTTONDBLCLK()
  152. //}}AFX_MSG_MAP
  153. END_MESSAGE_MAP()
  154. /////////////////////////////////////////////////////////////////////////////
  155. // CXTShellListCtrlEx message handlers
  156. bool CXTShellListCtrlEx::BrowseToFolder(LPCTSTR lpszPath)
  157. {
  158. XT_TVITEMDATA lpTVID;
  159. LPITEMIDLIST  pidl;
  160. LPSHELLFOLDER pDesktopFolder;
  161. OLECHAR       szOleChar[MAX_PATH];
  162. ULONG         chEaten;
  163. ULONG         dwAttributes;
  164. HRESULT       hr;
  165. // Get a pointer to the Desktop's IShellFolder interface.
  166. if (SUCCEEDED(::SHGetDesktopFolder(&pDesktopFolder)))
  167. {
  168. // IShellFolder::ParseDisplayName requires the file name be in
  169. // Unicode.
  170. #if !defined(_UNICODE)
  171. ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszPath, -1,
  172. szOleChar, MAX_PATH);
  173. #else
  174. STRCPY_S(szOleChar, MAX_PATH, lpszPath);
  175. #endif
  176. // Convert the path to an ITEMIDLIST.
  177. hr = pDesktopFolder->ParseDisplayName(NULL, NULL, szOleChar,
  178. &chEaten, &pidl, &dwAttributes);
  179. if (SUCCEEDED(hr))
  180. {
  181. IShellFolder *psfMyFolder;
  182. lpTVID.lpi = lpTVID.lpifq = pidl;
  183. pDesktopFolder->BindToObject(lpTVID.lpifq, NULL,
  184. IID_IShellFolder, (LPVOID*)&psfMyFolder);
  185. lpTVID.lpsfParent = psfMyFolder;
  186. PopulateListView(&lpTVID, lpTVID.lpsfParent);
  187. m_strItemPath = lpszPath;
  188. pDesktopFolder->Release();
  189. return true;
  190. }
  191. pDesktopFolder->Release();
  192. }
  193. return false;
  194. }
  195. void CXTShellListCtrlEx::OnLButtonDblClk(UINT nFlags, CPoint point)
  196. {
  197. CXTShellListCtrl::OnLButtonDblClk(nFlags, point);
  198. int iItem = GetDoubleClickedItem();
  199. if (iItem >= 0)
  200. {
  201. XT_LVITEMDATA* lplvid = (XT_LVITEMDATA*)GetItemData(iItem);
  202. ASSERT(lplvid != NULL);
  203. if (!lplvid)
  204. return;
  205. if ((lplvid->ulAttribs & SFGAO_FOLDER) == SFGAO_FOLDER)
  206. {
  207. if (m_strItemPath.GetAt(m_strItemPath.GetLength() -1) != _T('\'))
  208. {
  209. m_strItemPath += _T('\');
  210. }
  211. m_strItemPath += GetItemText(iItem, 0);
  212. BrowseToFolder(m_strItemPath);
  213. if (m_pSyncWnd != 0)
  214. {
  215. m_pSyncWnd->SetWindowText(m_strItemPath);
  216. }
  217. }
  218. else
  219. {
  220. ShellOpenItem(lplvid);
  221. }
  222. }
  223. }