1 //*******************************************************************************
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.
11 // For the latest updates to this code, check this site:
12 // http://www.masmex.com
15 // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
16 //*******************************************************************************
18 // URLTreeCtrl.cpp : implementation file
22 #include "UITreeCtrl.h"
23 #include "UIMessages.h"
24 #include "cbformats.h"
30 static char THIS_FILE[] = __FILE__;
33 /////////////////////////////////////////////////////////////////////////////
35 IMPLEMENT_DYNAMIC(CUITreeCtrl,CUIDragDropTree)
36 IMPLEMENT_DYNAMIC(CRefresh,CObject)
37 IMPLEMENT_DYNAMIC(CRefreshCategory,CRefresh)
40 CUITreeCtrl::CUITreeCtrl(bool bDragDrop)
41 : CUIDragDropTree(bDragDrop)
47 m_style = TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS;
54 CUITreeCtrl::~CUITreeCtrl()
58 void CUITreeCtrl::OnDeleteItemData(DWORD dwData)
63 void CUITreeCtrl::ItemPrePaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
65 *pResult = CDRF_DODEFAULT;
66 if (lptvcd->nmcd.dwDrawStage & CDDS_ITEM)
68 UINT state = GetItemState((HTREEITEM)lptvcd->nmcd.dwItemSpec,TVIS_SELECTED | TVIS_EXPANDED);
69 if ((state & TVIS_SELECTED))
71 if ((state & TVIS_SELECTED) && (state & TVIS_EXPANDED))
74 HTREEITEM hItem = (HTREEITEM)lptvcd->nmcd.dwItemSpec;
75 CUIListCtrlData* pData = GetListCtrlData(hItem);
78 *pResult = CDRF_NOTIFYPOSTPAINT;
79 if (pData->IsFontSet())
81 CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
82 CFont *pOldFont = pDC->SelectObject((CFont*)pData->GetFont());
83 m_hOrigFont = (HFONT)pOldFont;
84 *pResult |= CDRF_NEWFONT;
86 lptvcd->clrText = pData->GetTextColor();
87 lptvcd->clrTextBk = pData->GetBkColor();
90 void CUITreeCtrl::ItemPostPaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
92 CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
95 pDC->SelectObject(CFont::FromHandle(m_hOrigFont));
98 *pResult = CDRF_DODEFAULT;
101 bool CUITreeCtrl::EndLabelEdit(HTREEITEM hItem,LPCTSTR pszText)
106 UINT CUITreeCtrl::GetMenuID()
111 CWnd *CUITreeCtrl::GetMenuWnd()
116 void CUITreeCtrl::SetPopupID(UINT nID)
121 void CUITreeCtrl::SetPopupWnd(CWnd *pWnd)
126 bool CUITreeCtrl::DragDrop(CDD_OleDropTargetInfo *pInfo)
128 if (pInfo->GetDataObject() == NULL)
130 HTREEITEM hItem = pInfo->GetTreeItem();
131 if (pInfo->GetDropEffect() == DROPEFFECT_MOVE)
133 if (TransferItem(GetDragItem(),hItem))
135 DeleteItem(GetDragItem());
140 AfxMessageBox(_T("Copy not supported!"));
147 bool CUITreeCtrl::DragEnter(CDD_OleDropTargetInfo *pInfo)
152 bool CUITreeCtrl::DragLeave(CDD_OleDropTargetInfo *pInfo)
157 bool CUITreeCtrl::DragOver(CDD_OleDropTargetInfo *pInfo)
159 // possible non ole drag & drop
160 if (pInfo->GetDataObject() == NULL)
164 // ole drag and drop expects the dropeffect to be set
165 // any valid formats?
166 if (CWDClipboardData::Instance()->IsDataAvailable(pInfo->GetDataObject()))
169 FormatEtc.cfFormat = CWDClipboardData::Instance()->GetClipboardFormat(CWDClipboardData::e_cfFileGroupDesc);
170 FormatEtc.ptd = NULL;
171 FormatEtc.dwAspect = DVASPECT_CONTENT;
172 FormatEtc.lindex = -1;
173 FormatEtc.tymed = TYMED_HGLOBAL;
174 HRESULT hr = pInfo->GetDataObject()->m_lpDataObject->QueryGetData(&FormatEtc);
175 if ((pInfo->GetKeyboardState() & MK_SHIFT))
176 pInfo->SetDropEffect(DROPEFFECT_MOVE);
179 pInfo->SetDropEffect(DROPEFFECT_COPY);
182 pInfo->SetDropEffect(DROPEFFECT_COPY);
188 DROPEFFECT CUITreeCtrl::DoDragDrop(NM_TREEVIEW* pNMTreeView,COleDataSource *pOleDataSource)
190 // non ole drag and drop only within tree
191 CCF_String ccfText(GetItemText(pNMTreeView->itemNew.hItem));
192 CWDClipboardData::Instance()->SetData(pOleDataSource,&ccfText,CWDClipboardData::e_cfString);
193 return DROPEFFECT_ALL;
196 CRefresh *CUITreeCtrl::CreateRefreshObject(HTREEITEM hItem,LPARAM lParam)
198 return new CRefresh(hItem,lParam);
201 void CUITreeCtrl::UpdateEvent(LPARAM lHint,CObject *pHint)
203 GetParent()->SendMessage(WM_APP_UPDATE_ALL_VIEWS,(WPARAM)lHint,(LPARAM)pHint);
206 void CUITreeCtrl::UpdateCurrentSelection()
208 HTREEITEM hItem = GetSelectedItem();
211 SelectionChanged(hItem,GetItemData(hItem));
215 void CUITreeCtrl::DoubleClick(HTREEITEM hItem)
219 void CUITreeCtrl::SelectionChanged(HTREEITEM hItem,LPARAM lParam)
221 CRefresh *pRefresh = CreateRefreshObject(hItem,lParam);
223 UpdateEvent(HINT_TREE_SEL_CHANGED,pRefresh);
227 HTREEITEM CUITreeCtrl::AddAnItem(HTREEITEM hParent, LPCTSTR szText, LPARAM lParam, HTREEITEM hInsAfter,int iImage,int iSelImage, int nChildren)
232 TV_INSERTSTRUCT tvIns;
233 ZeroMemory(&tvI,sizeof(tvI));
234 ZeroMemory(&tvIns,sizeof(tvIns));
235 tvI.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
236 if (nChildren) // get the plus sign
238 tvI.mask |= TVIF_CHILDREN;
239 tvI.cChildren = nChildren;
241 tvI.pszText = (LPTSTR)szText;
242 tvI.cchTextMax = lstrlen(szText);
244 iImage = m_idxClosed;
248 tvI.iSelectedImage = iSelImage;
249 tvI.lParam = (LPARAM)GetNewListCtrlData(lParam,hParent);
251 tvIns.hInsertAfter = hInsAfter;
252 tvIns.hParent = hParent;
255 HTREEITEM hNewItem = InsertItem(&tvIns);
260 CUIListCtrlData *CUITreeCtrl::GetNewListCtrlData(DWORD dwData,HTREEITEM hParent)
262 CUIListCtrlData *pListCtrlData = new CUIListCtrlData;
263 pListCtrlData->SetExtData(dwData);
264 return pListCtrlData;
267 DWORD CUITreeCtrl::GetItemData(HTREEITEM hItem) const
271 const CUIListCtrlData* pData = GetListCtrlData(hItem);
273 return pData->GetExtData();
277 BOOL CUITreeCtrl::SetItemData(HTREEITEM hItem,DWORD dwData,bool bAutoDelete)
282 CUIListCtrlData* pData = GetListCtrlData(hItem);
285 pData->SetExtData(dwData);
286 pData->SetAutoDelete(bAutoDelete);
290 CUIListCtrlData *CUITreeCtrl::GetListCtrlData(HTREEITEM hItem) const
292 ((CUITreeCtrl*)this)->m_bMe = true;
293 CUIListCtrlData *pData = (CUIListCtrlData*)CTreeCtrl::GetItemData(hItem);
294 ((CUITreeCtrl*)this)->m_bMe = false;
297 ASSERT(pData->IsKindOf(RUNTIME_CLASS(CUIListCtrlData)));
301 void CUITreeCtrl::SetTextColor(HTREEITEM hItem,COLORREF TextColor)
303 CUIListCtrlData *pData = GetListCtrlData(hItem);
305 pData->SetTextColor(TextColor);
308 void CUITreeCtrl::SetBkColor(HTREEITEM hItem,COLORREF BkColor)
310 CUIListCtrlData *pData = GetListCtrlData(hItem);
312 pData->SetBkColor(BkColor);
315 void CUITreeCtrl::SetDefaultTextColor(HTREEITEM hItem)
317 CUIListCtrlData *pData = GetListCtrlData(hItem);
319 pData->SetDefaultTextColor();
322 void CUITreeCtrl::SetDefaultBkColor(HTREEITEM hItem)
324 CUIListCtrlData *pData = GetListCtrlData(hItem);
326 pData->SetDefaultBkColor();
329 void CUITreeCtrl::SetItemFont(HTREEITEM hItem,CFont *pFont)
331 CUIListCtrlData* pData = GetListCtrlData(hItem);
336 pData->SetFont(pFont);
339 void CUITreeCtrl::SetItemBold(HTREEITEM hItem,bool bBold)
341 CUIListCtrlData* pData = GetListCtrlData(hItem);
344 if (!pData->IsFontSet())
345 pData->SetFont(GetFont());
346 const CFont *pFont = pData->GetFont();
348 ((CFont*)pFont)->GetLogFont(&lf);
349 lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
351 font.CreateFontIndirect(&lf);
352 pData->SetFont(&font);
354 if (GetItemRect(hItem,&rect,FALSE))
356 InvalidateRect(rect);
361 HTREEITEM CUITreeCtrl::GetHitItem(CPoint *pt)
369 ScreenToClient(&pt1);
372 hItem = HitTest(cpt, &Flag);
373 if (hItem && ((Flag & TVHT_ONITEMLABEL) || (Flag & TVHT_ONITEMICON)))
382 void CUITreeCtrl::Refresh()
386 void CUITreeCtrl::DeleteKey(HTREEITEM hItem)
390 void CUITreeCtrl::GoBack(HTREEITEM hItem)
394 void CUITreeCtrl::ShowProperties(HTREEITEM hItem)
398 void CUITreeCtrl::ShowPopupMenu(HTREEITEM hItem,CPoint point)
400 UINT MenuID = GetMenuID();
403 CWnd *pWndMess = GetMenuWnd();
404 if (pWndMess == NULL)
407 VERIFY(menu.LoadMenu(MenuID));
408 CMenu* pPopup = menu.GetSubMenu(0);
409 ASSERT(pPopup != NULL);
410 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndMess);
413 BEGIN_MESSAGE_MAP(CUITreeCtrl, CUIDragDropTree)
414 //{{AFX_MSG_MAP(CUITreeCtrl)
415 ON_NOTIFY_REFLECT_EX(NM_DBLCLK, OnDblclk)
416 ON_NOTIFY_REFLECT_EX(NM_RETURN, OnReturn)
417 ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
418 ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw)
419 ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDED, OnItemExpanded)
420 ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDING, OnItemExpanding)
421 ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelchanged)
422 ON_NOTIFY_REFLECT_EX(TVN_ENDLABELEDIT, OnEndLabelEdit)
423 ON_NOTIFY_REFLECT_EX(TVN_DELETEITEM, OnDeleteItem)
424 ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydownFolder)
429 ON_MESSAGE(WM_APP_ON_PROPERTIES_KEY,OnAppPropertiesKey)
430 ON_MESSAGE(WM_APP_ON_DELETE_KEY,OnAppDeleteKey)
431 ON_MESSAGE(WM_APP_ON_CONTEXT_MENU_KEY,OnAppContextMenuKey)
432 ON_MESSAGE(WM_APP_ON_BACKSPACE_KEY,OnAppBackspaceKey)
433 ON_MESSAGE(WM_APP_ON_EDIT_KEY,OnAppEditKey)
434 ON_MESSAGE(WM_APP_ON_REFRESH_KEY,OnAppRefreshKey)
436 ON_MESSAGE(TVM_GETITEM,OnTVMGetItem)
437 ON_MESSAGE(TVM_SETITEM,OnTVMSetItem)
438 ON_MESSAGE(TVM_INSERTITEM,OnTVMInsertItem)
439 ON_MESSAGE(WM_APP_TIMER_SEL_CHANGE,OnTimerSelChange)
440 ON_MESSAGE(WM_APP_OLE_DD_DODRAGDROP, OnDDDoDragDrop)
441 ON_MESSAGE(WM_APP_OLE_DD_DROP, OnDragDrop)
442 ON_MESSAGE(WM_APP_OLE_DD_OVER, OnDragOver)
443 ON_MESSAGE(WM_APP_OLE_DD_ENTER, OnDragEnter)
444 ON_MESSAGE(WM_APP_OLE_DD_LEAVE, OnDragLeave)
447 /////////////////////////////////////////////////////////////////////////////
448 // CUITreeCtrl message handlers
449 BOOL CUITreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
451 LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)pNMHDR;
452 if(lptvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
454 *pResult = CDRF_NOTIFYITEMDRAW;
456 else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
458 ItemPrePaint(lptvcd,pResult);
460 else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
462 ItemPostPaint(lptvcd,pResult);
467 BOOL CUITreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
469 // TODO: Add your control notification handler code here
471 HTREEITEM hItem = GetHitItem(&point);
474 ClientToScreen(&point);
475 ShowPopupMenu(hItem,point);
480 BOOL CUITreeCtrl::OnDeleteItem(NMHDR* pNMHDR, LRESULT* pResult)
482 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
483 // TODO: Add your control notification handler code here
484 CUIListCtrlData* pData = (CUIListCtrlData*)pNMTreeView->itemOld.lParam;
485 if (!pData->GetAutoDelete())
486 OnDeleteItemData(pData->GetExtData());
491 LRESULT CUITreeCtrl::OnTVMGetItem(WPARAM wParam,LPARAM lParam)
493 LPTVITEM pitem = (LPTVITEM)lParam;
494 if (m_bMe == false && pitem->mask & TVIF_PARAM)
496 CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
499 pitem->lParam = pData->GetExtData();
500 pitem->mask &= ~TVIF_PARAM;
506 LRESULT CUITreeCtrl::OnTVMSetItem(WPARAM wParam,LPARAM lParam)
508 LPTVITEM pitem = (LPTVITEM)lParam;
509 if (m_bMe == false && pitem->mask & TVIF_PARAM)
511 CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
514 pData->SetExtData(pitem->lParam);
515 pitem->mask &= ~TVIF_PARAM;
521 LRESULT CUITreeCtrl::OnTVMInsertItem(WPARAM wParam,LPARAM lParam)
523 LPTVINSERTSTRUCT lpis = (LPTVINSERTSTRUCT)lParam;
524 if (m_bMe == false && lpis->item.mask & TVIF_PARAM)
526 lpis->item.lParam = (LPARAM)GetNewListCtrlData(lpis->item.lParam,lpis->hParent);
531 int CUITreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
533 if (CUIDragDropTree::OnCreate(lpCreateStruct) == -1)
538 // TODO: Add your specialized creation code here
542 UINT CUITreeCtrl::GetIconID()
544 return IDI_FOLDER_CLOSED;
547 UINT CUITreeCtrl::GetOpenIconID()
552 bool CUITreeCtrl::Expanding(NM_TREEVIEW *nmtvw)
557 bool CUITreeCtrl::Collapsing(NM_TREEVIEW *nmtvw)
562 void CUITreeCtrl::Init()
564 // Create the image list we will need
565 int nCxSmall = GetSystemMetrics(SM_CXSMICON);
566 int nCySmall = GetSystemMetrics(SM_CYSMICON);
567 m_ImageList.Create(nCxSmall,
569 TRUE, // list does not include masks
571 0 ); // list won't grow
572 UINT nIconID = GetIconID();
575 HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nIconID),RT_GROUP_ICON);
576 HICON hIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nIconID), IMAGE_ICON,
577 nCxSmall, nCySmall, 0 );
578 m_idxClosed = m_ImageList.Add(hIcon);
580 UINT nOpenIconID = GetOpenIconID();
583 HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nOpenIconID),RT_GROUP_ICON);
584 HICON hOpenIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nOpenIconID), IMAGE_ICON,
585 nCxSmall, nCySmall, 0 );
586 m_idxOpen = m_ImageList.Add(hOpenIcon);
588 // Associate the image list with the tree
589 SetImageList(&m_ImageList,TVSIL_NORMAL);
590 m_ImageList.SetBkColor(CLR_NONE);
591 ModifyStyle(0,m_style);
594 BOOL CUITreeCtrl::PreCreateWindow(CREATESTRUCT& cs)
596 // TODO: Add your specialized code here and/or call the base class
598 return CUIDragDropTree::PreCreateWindow(cs);
601 BOOL CUITreeCtrl::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
603 LPNMTVDISPINFO pDispInfo = (LPNMTVDISPINFO)pNMHDR;
604 if (pDispInfo->item.pszText)
605 *pResult = EndLabelEdit(pDispInfo->item.hItem,pDispInfo->item.pszText);
609 BOOL CUITreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
611 // TODO: Add your control notification handler code here
612 HTREEITEM hItem = GetSelectedItem();
617 BOOL CUITreeCtrl::OnReturn(NMHDR* pNMHDR, LRESULT* pResult)
619 // TODO: Add your control notification handler code here
620 OnDblclk(pNMHDR,pResult);
624 BOOL CUITreeCtrl::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
626 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
628 // TODO: Add your control notification handler code here
629 if (pNMTreeView->action == TVE_EXPAND)
631 Expanding(pNMTreeView);
633 else if (pNMTreeView->action == TVE_COLLAPSE)
635 Collapsing(pNMTreeView);
640 BOOL CUITreeCtrl::OnItemExpanded(NMHDR* pNMHDR, LRESULT* pResult)
642 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
643 // TODO: Add your control notification handler code here
644 /* if (pNMTreeView->action == TVE_EXPAND)
646 SetItemImage(pNMTreeView->itemNew.hItem,m_idxClosed,0);
648 else if (pNMTreeView->action == TVE_COLLAPSE)
650 SetItemImage(pNMTreeView->itemNew.hItem,m_idxOpen,0);
655 BOOL CUITreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
657 //VK_PRIOR 21 page up key
658 //VK_NEXT 22 page down key
660 //VK_HOME 24 home key
661 //VK_LEFT 25 left arrow key
662 //VK_UP 26 up arrow key
663 //VK_RIGHT 27 right arrow key
664 //VK_DOWN 28 down arrow key
666 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
667 // TODO: Add your control notification handler code here
668 if ((pNMTreeView->itemNew.state & TVIS_SELECTED))
670 if (pNMTreeView->action == TVC_BYMOUSE || pNMTreeView->action == TVC_UNKNOWN)
672 CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
675 ASSERT_KINDOF(CUIListCtrlData,pData);
676 SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
679 SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
681 else if (pNMTreeView->action == TVC_BYKEYBOARD)
683 CopyMemory(&m_NMTreeView,pNMTreeView,sizeof(NM_TREEVIEW));
684 if (m_vkeydown && m_IDTimer == 0)
686 TRACE0("Timer set\n");
687 m_IDTimer = SetTimer(2,100,NULL);
695 BOOL CUITreeCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
697 // TODO: Add your message handler code here and/or call default
698 return CUIDragDropTree::OnMouseWheel(nFlags, zDelta, pt);
701 BOOL CUITreeCtrl::PreTranslateMessage(MSG* pMsg)
703 // TODO: Add your specialized code here and/or call the base class
704 if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
706 if (pMsg->wParam == VK_F10 && (GetKeyState(VK_SHIFT) < 0))
708 PostMessage(WM_APP_ON_CONTEXT_MENU_KEY);
711 else if (pMsg->wParam == VK_BACK)
713 PostMessage(WM_APP_ON_BACKSPACE_KEY);
716 else if (pMsg->wParam == VK_F2)
718 PostMessage(WM_APP_ON_EDIT_KEY);
721 else if (pMsg->wParam == VK_F5)
723 PostMessage(WM_APP_ON_REFRESH_KEY);
726 else if (pMsg->wParam == VK_DELETE)
728 PostMessage(WM_APP_ON_DELETE_KEY);
731 else if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_RETURN)
733 PostMessage(WM_APP_ON_PROPERTIES_KEY);
738 return CUIDragDropTree::PreTranslateMessage(pMsg);
741 void CUITreeCtrl::OnKeydownFolder(NMHDR* pNMHDR, LRESULT* pResult)
743 TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
744 // TODO: Add your control notification handler code here
745 m_vkeydown = pTVKeyDown->wVKey;
749 LRESULT CUITreeCtrl::OnTimerSelChange(WPARAM wParam,LPARAM lParam)
751 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)&m_NMTreeView;
752 CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
755 ASSERT_KINDOF(CUIListCtrlData,pData);
756 SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
759 SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
763 void CUITreeCtrl::OnTimer( UINT nIDEvent )
765 CUIDragDropTree::OnTimer(nIDEvent);
766 if (nIDEvent == m_IDTimer)
770 SHORT sRet = GetAsyncKeyState(m_vkeydown);
773 KillTimer(m_IDTimer);
776 PostMessage(WM_APP_TIMER_SEL_CHANGE);
782 LRESULT CUITreeCtrl::OnDragDrop(WPARAM wParam,LPARAM lParam)
784 if (GetDragDrop() == false)
786 // get the info we need
787 CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
789 if (pInfo->GetDataObject() != NULL)
790 return DragDrop(pInfo) ? 1 : 0;
795 // user is currently over the tree view window
796 // return 1 if we are interested in the CB format
797 LRESULT CUITreeCtrl::OnDragOver(WPARAM wParam,LPARAM lParam)
799 if (GetDragDrop() == false)
801 CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
803 if (pInfo->GetDataObject() != NULL)
804 return DragOver(pInfo) ? 1 : 0;
809 LRESULT CUITreeCtrl::OnDragEnter(WPARAM wParam,LPARAM lParam)
811 if (GetDragDrop() == false)
813 CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
815 if (pInfo->GetDataObject() != NULL)
816 return DragEnter(pInfo) ? 1 : 0;
821 LRESULT CUITreeCtrl::OnDragLeave(WPARAM wParam,LPARAM lParam)
823 if (GetDragDrop() == false)
825 CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
827 if (pInfo->GetDataObject() != NULL)
828 return DragLeave(pInfo) ? 1 : 0;
833 // Drag and drop initiated
834 // Return 1 if processed
835 LRESULT CUITreeCtrl::OnDDDoDragDrop(WPARAM wParam,LPARAM lParam)
837 if (GetDragDrop() == false)
839 NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)wParam;
840 COleDataSource *pOleDataSource = (COleDataSource*)lParam;
841 ASSERT(pOleDataSource);
842 return DoDragDrop(pNMTreeView,pOleDataSource);
845 LRESULT CUITreeCtrl::OnAppPropertiesKey(WPARAM wParam, LPARAM lParam)
847 ShowProperties(GetSelectedItem());
851 LRESULT CUITreeCtrl::OnAppDeleteKey(WPARAM wParam, LPARAM lParam)
853 DeleteItem(GetSelectedItem());
857 LRESULT CUITreeCtrl::OnAppRefreshKey(WPARAM wParam, LPARAM lParam)
863 LRESULT CUITreeCtrl::OnAppEditKey(WPARAM wParam, LPARAM lParam)
865 EditLabel(GetSelectedItem());
869 LRESULT CUITreeCtrl::OnAppContextMenuKey(WPARAM wParam, LPARAM lParam)
872 GetItemRect(GetSelectedItem(),&rc,FALSE);
874 ShowPopupMenu(GetSelectedItem(),rc.CenterPoint());
878 LRESULT CUITreeCtrl::OnAppBackspaceKey(WPARAM wParam, LPARAM lParam)
880 GoBack(GetSelectedItem());