[HAL]
[reactos.git] / reactos / base / shell / explorer / utility / treedroptarget.h
1 /**************************************************************************
2 THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
3 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
4 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
5 PARTICULAR PURPOSE.
6 Author: Leon Finker 01/2001
7 Modifications: removed ATL dependencies, Martin Fuchs 7/2003
8 **************************************************************************/
9
10 #include "dragdropimpl.h"
11
12 /// OLE drop target for tree controls
13 class TreeDropTarget : public IDropTargetImpl
14 {
15 public:
16 TreeDropTarget(HWND hTargetWnd) : IDropTargetImpl(hTargetWnd) {}
17
18 virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect)
19 {
20 if (pFmtEtc->cfFormat == CF_HDROP && medium.tymed == TYMED_HGLOBAL)
21 {
22 HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal);
23 if (hDrop != NULL)
24 {
25 TCHAR szFileName[MAX_PATH];
26
27 UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
28
29 for(UINT i = 0; i < cFiles; ++i)
30 {
31 DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
32
33 if (DROPEFFECT_COPY & *pdwEffect)
34 {
35 // copy the file or dir
36
37 ///@todo Add the code to handle Copy
38
39 }
40 else if (DROPEFFECT_MOVE & *pdwEffect)
41 {
42 // move the file or dir
43
44 ///@todo Add the code to handle Move
45
46 }
47 }
48 //DragFinish(hDrop); // base class calls ReleaseStgMedium
49 }
50 GlobalUnlock(medium.hGlobal);
51 }
52
53 TreeView_SelectDropTarget(m_hTargetWnd, NULL);
54
55 return true; //let base free the medium
56 }
57
58 virtual HRESULT STDMETHODCALLTYPE DragOver(
59 /* [in] */ DWORD grfKeyState,
60 /* [in] */ POINTL pt,
61 /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
62 {
63 TVHITTESTINFO hit;
64 hit.pt = (POINT&)pt;
65 ScreenToClient(m_hTargetWnd, &hit.pt);
66 hit.flags = TVHT_ONITEM;
67 HTREEITEM hItem = TreeView_HitTest(m_hTargetWnd,&hit);
68
69 if (hItem != NULL)
70 TreeView_SelectDropTarget(m_hTargetWnd, hItem);
71
72 return IDropTargetImpl::DragOver(grfKeyState, pt, pdwEffect);
73 }
74
75 virtual HRESULT STDMETHODCALLTYPE DragLeave(void)
76 {
77 TreeView_SelectDropTarget(m_hTargetWnd, NULL);
78
79 return IDropTargetImpl::DragLeave();
80 }
81 };