UITreeCtrl.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:22k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. // URLTreeCtrl.cpp : implementation file
  18. //
  19. #include "stdafx.h"
  20. #include "UITreeCtrl.h"
  21. #include "UIMessages.h"
  22. #include "cbformats.h"
  23. #include "UIres.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CUITreeCtrl
  31. IMPLEMENT_DYNAMIC(CUITreeCtrl,CUIDragDropTree)
  32. IMPLEMENT_DYNAMIC(CRefresh,CObject)
  33. IMPLEMENT_DYNAMIC(CRefreshCategory,CRefresh)
  34. CUITreeCtrl::CUITreeCtrl(bool bDragDrop) 
  35. : CUIDragDropTree(bDragDrop)
  36. {
  37. m_idxClosed= 0;
  38. m_idxOpen = 0; 
  39. m_vkeydown = 0;
  40. m_IDTimer = 0;
  41. m_style = TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT 
  42. | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP;
  43. m_PopupID = 0;
  44. m_pPopupWnd = NULL;
  45. m_hOrigFont = NULL;
  46. m_bMe = false;
  47. }
  48. CUITreeCtrl::~CUITreeCtrl()
  49. {
  50. }
  51. void CUITreeCtrl::OnDeleteItemData(DWORD dwData)
  52. {
  53. }
  54. void CUITreeCtrl::ItemPrePaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
  55. {
  56. *pResult = CDRF_DODEFAULT;
  57. if (lptvcd->nmcd.dwDrawStage & CDDS_ITEM)
  58. {
  59. UINT state = GetItemState((HTREEITEM)lptvcd->nmcd.dwItemSpec,TVIS_SELECTED | TVIS_EXPANDED);
  60. if ((state & TVIS_SELECTED))
  61. return;
  62. if ((state & TVIS_SELECTED) && (state & TVIS_EXPANDED))
  63. return;
  64. }
  65. HTREEITEM hItem = (HTREEITEM)lptvcd->nmcd.dwItemSpec;
  66. CUIListCtrlData* pData = GetListCtrlData(hItem);
  67. if (pData == NULL)
  68. return;
  69. *pResult = CDRF_NOTIFYPOSTPAINT;
  70. if (pData->IsFontSet())
  71. {
  72. CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
  73. CFont *pOldFont = pDC->SelectObject((CFont*)pData->GetFont());
  74. m_hOrigFont = (HFONT)pOldFont;
  75. *pResult |= CDRF_NEWFONT;
  76. }
  77. lptvcd->clrText = pData->GetTextColor();
  78. lptvcd->clrTextBk = pData->GetBkColor();
  79. }
  80. void CUITreeCtrl::ItemPostPaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
  81. {
  82. CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
  83. if (m_hOrigFont)
  84. {
  85. pDC->SelectObject(CFont::FromHandle(m_hOrigFont));
  86. m_hOrigFont = NULL;
  87. }
  88. *pResult = CDRF_DODEFAULT;
  89. }
  90. bool CUITreeCtrl::EndLabelEdit(HTREEITEM hItem,LPCTSTR pszText)
  91. {
  92. return false;
  93. }
  94. UINT CUITreeCtrl::GetMenuID()
  95. {
  96. return m_PopupID;
  97. }
  98. CWnd *CUITreeCtrl::GetMenuWnd()
  99. {
  100. return m_pPopupWnd;
  101. }
  102. void CUITreeCtrl::SetPopupID(UINT nID)
  103. {
  104. m_PopupID = nID;
  105. }
  106. void CUITreeCtrl::SetPopupWnd(CWnd *pWnd)
  107. {
  108. m_pPopupWnd = pWnd;
  109. }
  110. bool CUITreeCtrl::DragDrop(CDD_OleDropTargetInfo *pInfo)
  111. {
  112. if (pInfo->GetDataObject() == NULL)
  113. {
  114. HTREEITEM hItem = pInfo->GetTreeItem();
  115. if (pInfo->GetDropEffect() == DROPEFFECT_MOVE)
  116. {
  117. if (TransferItem(GetDragItem(),hItem))
  118. {
  119. DeleteItem(GetDragItem());
  120. }
  121. }
  122. else
  123. {
  124. AfxMessageBox(_T("Copy not supported!"));
  125. }
  126. return true;
  127. }
  128. return false;
  129. }
  130. bool CUITreeCtrl::DragEnter(CDD_OleDropTargetInfo *pInfo)
  131. {
  132. return false;
  133. }
  134. bool CUITreeCtrl::DragLeave(CDD_OleDropTargetInfo *pInfo)
  135. {
  136. return false;
  137. }
  138. bool CUITreeCtrl::DragOver(CDD_OleDropTargetInfo *pInfo)
  139. {
  140. // possible non ole drag & drop
  141. if (pInfo->GetDataObject() == NULL)
  142. {
  143. return true;
  144. }
  145. // ole drag and drop expects the dropeffect to be set
  146. // any valid formats?
  147. if (CWDClipboardData::Instance()->IsDataAvailable(pInfo->GetDataObject()))
  148. {
  149. FORMATETC FormatEtc;
  150. FormatEtc.cfFormat = CWDClipboardData::Instance()->GetClipboardFormat(CWDClipboardData::e_cfFileGroupDesc);
  151. FormatEtc.ptd = NULL;
  152. FormatEtc.dwAspect = DVASPECT_CONTENT;
  153. FormatEtc.lindex = -1;
  154. FormatEtc.tymed = TYMED_HGLOBAL;
  155. HRESULT hr = pInfo->GetDataObject()->m_lpDataObject->QueryGetData(&FormatEtc);
  156. if ((pInfo->GetKeyboardState() & MK_SHIFT))
  157. pInfo->SetDropEffect(DROPEFFECT_MOVE);
  158. else if (hr == S_OK)
  159. {
  160. pInfo->SetDropEffect(DROPEFFECT_COPY);
  161. }
  162. else
  163. pInfo->SetDropEffect(DROPEFFECT_COPY);
  164. return true;
  165. }
  166. return false;
  167. }
  168. DROPEFFECT CUITreeCtrl::DoDragDrop(NM_TREEVIEW* pNMTreeView,COleDataSource *pOleDataSource)
  169. {
  170. // non ole drag and drop only within tree
  171. CCF_String ccfText(GetItemText(pNMTreeView->itemNew.hItem));
  172. CWDClipboardData::Instance()->SetData(pOleDataSource,&ccfText,CWDClipboardData::e_cfString);
  173. return DROPEFFECT_ALL;
  174. }
  175. CRefresh *CUITreeCtrl::CreateRefreshObject(HTREEITEM hItem,LPARAM lParam)
  176. {
  177. return new CRefresh(hItem,lParam);
  178. }
  179. void CUITreeCtrl::UpdateEvent(LPARAM lHint,CObject *pHint)
  180. {
  181. GetParent()->SendMessage(WM_APP_UPDATE_ALL_VIEWS,(WPARAM)lHint,(LPARAM)pHint);
  182. }
  183. void CUITreeCtrl::UpdateCurrentSelection()
  184. {
  185. HTREEITEM hItem = GetSelectedItem();
  186. if (hItem)
  187. {
  188. SelectionChanged(hItem,GetItemData(hItem));
  189. }
  190. }
  191. void CUITreeCtrl::DoubleClick(HTREEITEM hItem)
  192. {
  193. }
  194. void CUITreeCtrl::SelectionChanged(HTREEITEM hItem,LPARAM lParam)
  195. {
  196. CRefresh *pRefresh = CreateRefreshObject(hItem,lParam);
  197. if (pRefresh)
  198. UpdateEvent(HINT_TREE_SEL_CHANGED,pRefresh);
  199. delete pRefresh;
  200. }
  201. HTREEITEM CUITreeCtrl::AddAnItem(HTREEITEM hParent, LPCTSTR szText, LPARAM lParam, HTREEITEM hInsAfter,int iImage,int iSelImage, int nChildren)
  202. {
  203. ASSERT_VALID(this);
  204. TV_ITEM tvI;
  205. TV_INSERTSTRUCT tvIns;
  206. ZeroMemory(&tvI,sizeof(tvI));
  207. ZeroMemory(&tvIns,sizeof(tvIns));
  208. tvI.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
  209. if (nChildren) // get the plus sign
  210. {
  211. tvI.mask |= TVIF_CHILDREN;
  212. tvI.cChildren = nChildren;
  213. }
  214. tvI.pszText = (LPTSTR)szText;
  215. tvI.cchTextMax = lstrlen(szText);
  216. if (iImage == 0)
  217. iImage = m_idxClosed;
  218. tvI.iImage = iImage;
  219. if (iSelImage == 0)
  220. iSelImage = iImage;
  221. tvI.iSelectedImage = iSelImage;
  222. tvI.lParam = (LPARAM)GetNewListCtrlData(lParam,hParent);
  223. tvIns.item = tvI;
  224. tvIns.hInsertAfter = hInsAfter;
  225. tvIns.hParent = hParent;
  226. m_bMe = true;
  227. HTREEITEM hNewItem = InsertItem(&tvIns);
  228. m_bMe = false;
  229. return hNewItem;
  230. }
  231. CUIListCtrlData *CUITreeCtrl::GetNewListCtrlData(DWORD dwData,HTREEITEM hParent)
  232. {
  233. CUIListCtrlData *pListCtrlData = new CUIListCtrlData;
  234. pListCtrlData->SetExtData(dwData); 
  235. return pListCtrlData;
  236. }
  237. DWORD CUITreeCtrl::GetItemData(HTREEITEM hItem) const
  238. {
  239. if (hItem == NULL)
  240. return 0;
  241. const CUIListCtrlData* pData = GetListCtrlData(hItem);
  242. if (pData)
  243. return pData->GetExtData();
  244. return 0;
  245. }
  246. BOOL CUITreeCtrl::SetItemData(HTREEITEM hItem,DWORD dwData,bool bAutoDelete)
  247. {
  248. ASSERT(hItem);
  249. if (hItem == NULL) 
  250. return FALSE;
  251. CUIListCtrlData* pData = GetListCtrlData(hItem);
  252. if (pData == NULL) 
  253. return FALSE;
  254. pData->SetExtData(dwData);
  255. pData->SetAutoDelete(bAutoDelete);
  256. return TRUE;
  257. }
  258. CUIListCtrlData *CUITreeCtrl::GetListCtrlData(HTREEITEM hItem) const
  259. {
  260. ((CUITreeCtrl*)this)->m_bMe = true;
  261. CUIListCtrlData *pData = (CUIListCtrlData*)CTreeCtrl::GetItemData(hItem);
  262. ((CUITreeCtrl*)this)->m_bMe = false;
  263. if (pData == NULL)
  264. return NULL;
  265. ASSERT(pData->IsKindOf(RUNTIME_CLASS(CUIListCtrlData)));
  266. return pData;
  267. }
  268. void CUITreeCtrl::SetTextColor(HTREEITEM hItem,COLORREF TextColor)
  269. {
  270. CUIListCtrlData *pData = GetListCtrlData(hItem);
  271. if (pData)
  272. pData->SetTextColor(TextColor);
  273. };
  274. void CUITreeCtrl::SetBkColor(HTREEITEM hItem,COLORREF BkColor)
  275. {
  276. CUIListCtrlData *pData = GetListCtrlData(hItem);
  277. if (pData)
  278. pData->SetBkColor(BkColor);
  279. }
  280. void CUITreeCtrl::SetDefaultTextColor(HTREEITEM hItem)
  281. {
  282. CUIListCtrlData *pData = GetListCtrlData(hItem);
  283. if (pData)
  284. pData->SetDefaultTextColor();
  285. };
  286. void CUITreeCtrl::SetDefaultBkColor(HTREEITEM hItem)
  287. {
  288. CUIListCtrlData *pData = GetListCtrlData(hItem);
  289. if (pData)
  290. pData->SetDefaultBkColor();
  291. }
  292. void CUITreeCtrl::SetItemFont(HTREEITEM hItem,CFont *pFont)
  293. {
  294. CUIListCtrlData* pData = GetListCtrlData(hItem);
  295. if (pData == NULL)
  296. return;
  297. ASSERT(pFont);
  298. if (pFont)
  299. pData->SetFont(pFont);
  300. }
  301. void CUITreeCtrl::SetItemBold(HTREEITEM hItem,bool bBold)
  302. {
  303. CUIListCtrlData* pData = GetListCtrlData(hItem);
  304. if (pData == NULL)
  305. return;
  306. if (!pData->IsFontSet())
  307. pData->SetFont(GetFont());
  308. const CFont *pFont = pData->GetFont();
  309. LOGFONT lf;
  310. ((CFont*)pFont)->GetLogFont(&lf);
  311. lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL; 
  312. CFont font;
  313. font.CreateFontIndirect(&lf);
  314. pData->SetFont(&font);
  315. CRect rect;
  316. if (GetItemRect(hItem,&rect,FALSE))
  317. {
  318. InvalidateRect(rect);
  319. UpdateWindow();
  320. }
  321. }
  322. HTREEITEM CUITreeCtrl::GetHitItem(CPoint *pt)
  323. {
  324. UINT Flag;
  325. HTREEITEM hItem;
  326. CPoint cpt;
  327. POINT pt1;
  328. GetCursorPos(&pt1);
  329. ScreenToClient(&pt1);
  330. cpt.x = pt1.x;
  331. cpt.y = pt1.y;
  332. hItem = HitTest(cpt, &Flag);
  333. if (hItem && ((Flag & TVHT_ONITEMLABEL) || (Flag & TVHT_ONITEMICON)))
  334. {
  335. if (pt)
  336. *pt = pt1;
  337. return hItem;
  338. }
  339. return NULL;
  340. }
  341. void CUITreeCtrl::Refresh()
  342. {
  343. }
  344. void CUITreeCtrl::DeleteKey(HTREEITEM hItem)
  345. {
  346. }
  347. void CUITreeCtrl::GoBack(HTREEITEM hItem)
  348. {
  349. }
  350. void CUITreeCtrl::ShowProperties(HTREEITEM hItem)
  351. {
  352. }
  353. void CUITreeCtrl::ShowPopupMenu(HTREEITEM hItem,CPoint point)
  354. {
  355. UINT MenuID = GetMenuID();
  356. if (MenuID == 0) 
  357. return;
  358. CWnd *pWndMess = GetMenuWnd();
  359. if (pWndMess == NULL)
  360. pWndMess = this;
  361. CMenu menu;
  362. VERIFY(menu.LoadMenu(MenuID));
  363. CMenu* pPopup = menu.GetSubMenu(0);
  364. ASSERT(pPopup != NULL);
  365. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndMess);
  366. }
  367. BEGIN_MESSAGE_MAP(CUITreeCtrl, CUIDragDropTree)
  368. //{{AFX_MSG_MAP(CUITreeCtrl)
  369. ON_NOTIFY_REFLECT_EX(NM_DBLCLK, OnDblclk)
  370. ON_NOTIFY_REFLECT_EX(NM_RETURN, OnReturn)
  371. ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
  372. ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw)
  373. ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDED, OnItemExpanded)
  374. ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDING, OnItemExpanding)
  375. ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelchanged)
  376. ON_NOTIFY_REFLECT_EX(TVN_ENDLABELEDIT, OnEndLabelEdit)
  377. ON_NOTIFY_REFLECT_EX(TVN_DELETEITEM, OnDeleteItem)
  378. ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydownFolder)
  379. ON_WM_MOUSEWHEEL()
  380. ON_WM_TIMER()
  381. ON_WM_CREATE()
  382. //}}AFX_MSG_MAP
  383. ON_MESSAGE(WM_APP_ON_PROPERTIES_KEY,OnAppPropertiesKey)
  384. ON_MESSAGE(WM_APP_ON_DELETE_KEY,OnAppDeleteKey)
  385. ON_MESSAGE(WM_APP_ON_CONTEXT_MENU_KEY,OnAppContextMenuKey)
  386. ON_MESSAGE(WM_APP_ON_BACKSPACE_KEY,OnAppBackspaceKey)
  387. ON_MESSAGE(WM_APP_ON_EDIT_KEY,OnAppEditKey)
  388. ON_MESSAGE(WM_APP_ON_REFRESH_KEY,OnAppRefreshKey)
  389. ON_MESSAGE(TVM_GETITEM,OnTVMGetItem)
  390. ON_MESSAGE(TVM_SETITEM,OnTVMSetItem)
  391. ON_MESSAGE(TVM_INSERTITEM,OnTVMInsertItem)
  392. ON_MESSAGE(WM_APP_TIMER_SEL_CHANGE,OnTimerSelChange)
  393. ON_MESSAGE(WM_APP_OLE_DD_DODRAGDROP, OnDDDoDragDrop)
  394. ON_MESSAGE(WM_APP_OLE_DD_DROP, OnDragDrop)
  395. ON_MESSAGE(WM_APP_OLE_DD_OVER, OnDragOver)
  396. ON_MESSAGE(WM_APP_OLE_DD_ENTER, OnDragEnter)
  397. ON_MESSAGE(WM_APP_OLE_DD_LEAVE, OnDragLeave)
  398. END_MESSAGE_MAP()
  399. /////////////////////////////////////////////////////////////////////////////
  400. // CUITreeCtrl message handlers
  401. BOOL CUITreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) 
  402. {
  403. LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)pNMHDR;
  404. if(lptvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
  405. {
  406. *pResult = CDRF_NOTIFYITEMDRAW;
  407. }
  408. else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
  409. {
  410. ItemPrePaint(lptvcd,pResult);
  411. }
  412. else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
  413. {
  414. ItemPostPaint(lptvcd,pResult);
  415. }
  416. return TRUE;
  417. }
  418. BOOL CUITreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  419. {
  420. // TODO: Add your control notification handler code here
  421. CPoint point;
  422. HTREEITEM hItem = GetHitItem(&point);
  423. if (hItem == NULL) 
  424. return FALSE;
  425. ClientToScreen(&point);
  426. ShowPopupMenu(hItem,point);
  427. *pResult = 0;
  428. return TRUE;
  429. }
  430. BOOL CUITreeCtrl::OnDeleteItem(NMHDR* pNMHDR, LRESULT* pResult) 
  431. {
  432. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  433. // TODO: Add your control notification handler code here
  434. CUIListCtrlData* pData = (CUIListCtrlData*)pNMTreeView->itemOld.lParam;
  435. if (!pData->GetAutoDelete())
  436. OnDeleteItemData(pData->GetExtData());
  437. delete pData;
  438. return TRUE;
  439. }
  440. LRESULT CUITreeCtrl::OnTVMGetItem(WPARAM wParam,LPARAM lParam)
  441. {
  442. LPTVITEM pitem = (LPTVITEM)lParam;
  443. if (m_bMe == false && pitem->mask & TVIF_PARAM)
  444. {
  445. CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
  446. if (pData)
  447. {
  448. pitem->lParam = pData->GetExtData();
  449. pitem->mask &= ~TVIF_PARAM;
  450. }
  451. }
  452. return Default();
  453. }
  454. LRESULT CUITreeCtrl::OnTVMSetItem(WPARAM wParam,LPARAM lParam)
  455. {
  456. LPTVITEM pitem = (LPTVITEM)lParam;
  457. if (m_bMe == false && pitem->mask & TVIF_PARAM)
  458. {
  459. CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
  460. if (pData)
  461. {
  462. pData->SetExtData(pitem->lParam);
  463. pitem->mask &= ~TVIF_PARAM;
  464. }
  465. }
  466. return Default();
  467. }
  468. LRESULT CUITreeCtrl::OnTVMInsertItem(WPARAM wParam,LPARAM lParam)
  469. {
  470. LPTVINSERTSTRUCT lpis = (LPTVINSERTSTRUCT)lParam;
  471. if (m_bMe == false && lpis->item.mask & TVIF_PARAM)
  472. {
  473. lpis->item.lParam = (LPARAM)GetNewListCtrlData(lpis->item.lParam,lpis->hParent);
  474. }
  475. return Default();
  476. }
  477. int CUITreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  478. {
  479. if (CUIDragDropTree::OnCreate(lpCreateStruct) == -1)
  480. return -1;
  481. Init();
  482. // TODO: Add your specialized creation code here
  483. return 0;
  484. }
  485. UINT CUITreeCtrl::GetIconID()
  486. {
  487. return IDI_FOLDER_CLOSED;
  488. }
  489. UINT CUITreeCtrl::GetOpenIconID()
  490. {
  491. return 0;
  492. }
  493. bool CUITreeCtrl::Expanding(NM_TREEVIEW *nmtvw)
  494. {
  495. return false;
  496. }
  497. bool CUITreeCtrl::Collapsing(NM_TREEVIEW *nmtvw)
  498. {
  499. return true;
  500. }
  501. void CUITreeCtrl::Init()
  502. {
  503. // Create the image list we will need
  504. int nCxSmall = GetSystemMetrics(SM_CXSMICON);
  505. int nCySmall = GetSystemMetrics(SM_CYSMICON);
  506. m_ImageList.Create(nCxSmall,
  507. nCySmall,
  508. TRUE, // list does not include masks
  509. 2,
  510. 0 ); // list won't grow
  511. /* UINT nIconID = GetIconID();
  512. if (nIconID)
  513. {
  514. HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nIconID),RT_GROUP_ICON);
  515. HICON hIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nIconID), IMAGE_ICON, 
  516. nCxSmall, nCySmall, 0 );
  517. m_idxClosed = m_ImageList.Add(hIcon);
  518. }
  519. UINT nOpenIconID = GetOpenIconID();
  520. if (nOpenIconID)
  521. {
  522. HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nOpenIconID),RT_GROUP_ICON);
  523. HICON hOpenIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nOpenIconID), IMAGE_ICON, 
  524. nCxSmall, nCySmall, 0 );
  525. m_idxOpen = m_ImageList.Add(hOpenIcon);
  526. }
  527. */
  528. // Associate the image list with the tree
  529. SetImageList(&m_ImageList,TVSIL_NORMAL);
  530. m_ImageList.SetBkColor(CLR_NONE);
  531. ModifyStyle(0,m_style);
  532. }
  533. BOOL CUITreeCtrl::PreCreateWindow(CREATESTRUCT& cs) 
  534. {
  535. // TODO: Add your specialized code here and/or call the base class
  536. cs.style |= m_style;
  537. return CUIDragDropTree::PreCreateWindow(cs);
  538. }
  539. BOOL CUITreeCtrl::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
  540. {
  541. LPNMTVDISPINFO pDispInfo = (LPNMTVDISPINFO)pNMHDR;
  542. if (pDispInfo->item.pszText)
  543. *pResult = EndLabelEdit(pDispInfo->item.hItem,pDispInfo->item.pszText);
  544. return TRUE;
  545. }
  546. BOOL CUITreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  547. {
  548. // TODO: Add your control notification handler code here
  549. HTREEITEM hItem = GetSelectedItem();
  550. DoubleClick(hItem);
  551. return TRUE;
  552. }
  553. BOOL CUITreeCtrl::OnReturn(NMHDR* pNMHDR, LRESULT* pResult) 
  554. {
  555. // TODO: Add your control notification handler code here
  556. OnDblclk(pNMHDR,pResult);
  557. return TRUE;
  558. }
  559. BOOL CUITreeCtrl::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult) 
  560. {
  561. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  562. CWaitCursor w;
  563. // TODO: Add your control notification handler code here
  564. if (pNMTreeView->action == TVE_EXPAND)
  565. {
  566. Expanding(pNMTreeView);
  567. }
  568. else if (pNMTreeView->action == TVE_COLLAPSE)
  569. {
  570. Collapsing(pNMTreeView);
  571. }
  572. return TRUE;
  573. }
  574. BOOL CUITreeCtrl::OnItemExpanded(NMHDR* pNMHDR, LRESULT* pResult) 
  575. {
  576. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  577. // TODO: Add your control notification handler code here
  578. /* if (pNMTreeView->action == TVE_EXPAND)
  579. {
  580. SetItemImage(pNMTreeView->itemNew.hItem,m_idxClosed,0);
  581. }
  582. else if (pNMTreeView->action == TVE_COLLAPSE)
  583. {
  584. SetItemImage(pNMTreeView->itemNew.hItem,m_idxOpen,0);
  585. }*/
  586. return TRUE;
  587. }
  588. BOOL CUITreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  589. {
  590. //VK_PRIOR 21 page up key  
  591. //VK_NEXT 22 page down key  
  592. //VK_END 23 end key  
  593. //VK_HOME 24 home key  
  594. //VK_LEFT 25 left arrow key  
  595. //VK_UP 26 up arrow key  
  596. //VK_RIGHT 27 right arrow key  
  597. //VK_DOWN 28 down arrow key  
  598. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  599. // TODO: Add your control notification handler code here
  600. if ((pNMTreeView->itemNew.state & TVIS_SELECTED)) 
  601. {
  602. if (pNMTreeView->action == TVC_BYMOUSE || pNMTreeView->action == TVC_UNKNOWN)
  603. {
  604. CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
  605. if (pData)
  606. {
  607. ASSERT_KINDOF(CUIListCtrlData,pData);
  608. SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
  609. }
  610. else
  611. SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
  612. }
  613. else if (pNMTreeView->action == TVC_BYKEYBOARD)
  614. {
  615. CopyMemory(&m_NMTreeView,pNMTreeView,sizeof(NM_TREEVIEW));
  616. if (m_vkeydown && m_IDTimer == 0)
  617. {
  618. TRACE0("Timer setn");
  619. m_IDTimer = SetTimer(2,100,NULL);
  620. }
  621. }
  622. }
  623. *pResult = 0;
  624. return TRUE;
  625. }
  626. BOOL CUITreeCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
  627. {
  628. // TODO: Add your message handler code here and/or call default
  629. return CUIDragDropTree::OnMouseWheel(nFlags, zDelta, pt);
  630. }
  631. BOOL CUITreeCtrl::PreTranslateMessage(MSG* pMsg) 
  632. {
  633. // TODO: Add your specialized code here and/or call the base class
  634. if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
  635. {
  636. if (pMsg->wParam == VK_F10 && (GetKeyState(VK_SHIFT) < 0))
  637. {
  638. PostMessage(WM_APP_ON_CONTEXT_MENU_KEY);
  639. return TRUE;
  640. }
  641. else if (pMsg->wParam == VK_BACK)
  642. {
  643. PostMessage(WM_APP_ON_BACKSPACE_KEY);
  644. return TRUE;
  645. }
  646. else if (pMsg->wParam == VK_F2)
  647. {
  648. PostMessage(WM_APP_ON_EDIT_KEY);
  649. return TRUE;
  650. }
  651. else if (pMsg->wParam == VK_F5)
  652. {
  653. PostMessage(WM_APP_ON_REFRESH_KEY);
  654. return TRUE;
  655. }
  656. else if (pMsg->wParam == VK_DELETE)
  657. {
  658. PostMessage(WM_APP_ON_DELETE_KEY);
  659. return TRUE;
  660. }
  661. else if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_RETURN)
  662. {
  663. PostMessage(WM_APP_ON_PROPERTIES_KEY);
  664. return TRUE;
  665. }
  666. }
  667. return CUIDragDropTree::PreTranslateMessage(pMsg);
  668. }
  669. void CUITreeCtrl::OnKeydownFolder(NMHDR* pNMHDR, LRESULT* pResult) 
  670. {
  671. TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  672. // TODO: Add your control notification handler code here
  673. m_vkeydown = pTVKeyDown->wVKey;
  674. *pResult = 0;
  675. }
  676. LRESULT CUITreeCtrl::OnTimerSelChange(WPARAM wParam,LPARAM lParam)
  677. {
  678. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)&m_NMTreeView;
  679. CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
  680. if (pData)
  681. {
  682. ASSERT_KINDOF(CUIListCtrlData,pData);
  683. SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
  684. }
  685. else
  686. SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
  687. return 1L;
  688. }
  689. void CUITreeCtrl::OnTimer( UINT nIDEvent )
  690. {
  691. CUIDragDropTree::OnTimer(nIDEvent);
  692. if (nIDEvent == m_IDTimer)
  693. {
  694. if (m_vkeydown)
  695. {
  696. SHORT sRet = GetAsyncKeyState(m_vkeydown);
  697. if (sRet >= 0)
  698. {
  699. KillTimer(m_IDTimer);
  700. m_IDTimer = 0;
  701. m_vkeydown = 0;
  702. PostMessage(WM_APP_TIMER_SEL_CHANGE);
  703. }
  704. }
  705. }
  706. }
  707. LRESULT CUITreeCtrl::OnDragDrop(WPARAM wParam,LPARAM lParam)
  708. {
  709. if (GetDragDrop() == false)
  710. return 1L;
  711. // get the info we need
  712. CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
  713. ASSERT(pInfo);
  714. if (pInfo->GetDataObject() != NULL)
  715. return DragDrop(pInfo) ? 1 : 0;
  716. else
  717. return 1;
  718. }
  719. // user is currently over the tree view window
  720. // return 1 if we are interested in the CB format
  721. LRESULT CUITreeCtrl::OnDragOver(WPARAM wParam,LPARAM lParam)
  722. {
  723. if (GetDragDrop() == false)
  724. return 1L;
  725. CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
  726. ASSERT(pInfo);
  727. if (pInfo->GetDataObject() != NULL)
  728. return DragOver(pInfo) ? 1 : 0;
  729. else
  730. return 1;
  731. }
  732. LRESULT CUITreeCtrl::OnDragEnter(WPARAM wParam,LPARAM lParam)
  733. {
  734. if (GetDragDrop() == false)
  735. return 1L;
  736. CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
  737. ASSERT(pInfo);
  738. if (pInfo->GetDataObject() != NULL)
  739. return DragEnter(pInfo) ? 1 : 0;
  740. else
  741. return 1;
  742. }
  743. LRESULT CUITreeCtrl::OnDragLeave(WPARAM wParam,LPARAM lParam)
  744. {
  745. if (GetDragDrop() == false)
  746. return 1L;
  747. CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
  748. ASSERT(pInfo);
  749. if (pInfo->GetDataObject() != NULL)
  750. return DragLeave(pInfo) ? 1 : 0;
  751. else
  752. return 1;
  753. }
  754. // Drag and drop initiated
  755. // Return 1 if processed
  756. LRESULT CUITreeCtrl::OnDDDoDragDrop(WPARAM wParam,LPARAM lParam)
  757. {
  758. if (GetDragDrop() == false)
  759. return 1L;
  760. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)wParam;
  761. COleDataSource *pOleDataSource = (COleDataSource*)lParam;
  762. ASSERT(pOleDataSource);
  763. return DoDragDrop(pNMTreeView,pOleDataSource);
  764. }
  765. LRESULT CUITreeCtrl::OnAppPropertiesKey(WPARAM wParam, LPARAM lParam)
  766. {
  767. ShowProperties(GetSelectedItem());
  768. return 1L;
  769. }
  770. LRESULT CUITreeCtrl::OnAppDeleteKey(WPARAM wParam, LPARAM lParam)
  771. {
  772. DeleteItem(GetSelectedItem());
  773. return 1L;
  774. }
  775. LRESULT CUITreeCtrl::OnAppRefreshKey(WPARAM wParam, LPARAM lParam)
  776. {
  777. Refresh();
  778. return 1L;
  779. }
  780. LRESULT CUITreeCtrl::OnAppEditKey(WPARAM wParam, LPARAM lParam)
  781. {
  782. EditLabel(GetSelectedItem());
  783. return 1L;
  784. }
  785. LRESULT CUITreeCtrl::OnAppContextMenuKey(WPARAM wParam, LPARAM lParam)
  786. {
  787. CRect rc;
  788. GetItemRect(GetSelectedItem(),&rc,FALSE);
  789. ClientToScreen(&rc);
  790. ShowPopupMenu(GetSelectedItem(),rc.CenterPoint());
  791. return 1L;
  792. }
  793. LRESULT CUITreeCtrl::OnAppBackspaceKey(WPARAM wParam, LPARAM lParam)
  794. {
  795. GoBack(GetSelectedItem());
  796. return 1L;
  797. }