OSDN Git Service

Change Progress.h to SysProgress.h because there are two progress.h file.
[tortoisegit/TortoiseGitJp.git] / src / Utils / DragDropImpl.h
1 // IDataObjectImpl.h: interface for the CIDataObjectImpl class.\r
2 /**************************************************************************\r
3    THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF\r
4    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO\r
5    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A\r
6    PARTICULAR PURPOSE.\r
7    Author: Leon Finker  1/2001\r
8 **************************************************************************/\r
9 #ifndef __DRAGDROPIMPL_H__\r
10 #define __DRAGDROPIMPL_H__\r
11 //#include <ShlDisp.h>\r
12 ///////////////////////////////////////////////////////////////////////////////////////////////\r
13 class CEnumFormatEtc : public IEnumFORMATETC\r
14 {\r
15    private:\r
16      ULONG           m_cRefCount;\r
17      CSimpleArray<FORMATETC>  m_pFmtEtc;\r
18      int           m_iCur;\r
19 \r
20    public:\r
21      CEnumFormatEtc(const CSimpleArray<FORMATETC>& ArrFE);\r
22          CEnumFormatEtc(const CSimpleArray<FORMATETC*>& ArrFE);\r
23      //IUnknown members\r
24      STDMETHOD(QueryInterface)(REFIID, void FAR* FAR*);\r
25      STDMETHOD_(ULONG, AddRef)(void);\r
26      STDMETHOD_(ULONG, Release)(void);\r
27 \r
28      //IEnumFORMATETC members\r
29      STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG FAR *);\r
30      STDMETHOD(Skip)(ULONG);\r
31      STDMETHOD(Reset)(void);\r
32      STDMETHOD(Clone)(IEnumFORMATETC FAR * FAR*);\r
33 };\r
34 \r
35 ///////////////////////////////////////////////////////////////////////////////////////////////\r
36 class CIDropSource : public IDropSource\r
37 {\r
38         long m_cRefCount;\r
39 public:\r
40         bool m_bDropped;\r
41 \r
42         CIDropSource::CIDropSource():m_cRefCount(0),m_bDropped(false) {}\r
43         //IUnknown\r
44     virtual HRESULT STDMETHODCALLTYPE QueryInterface(\r
45             /* [in] */ REFIID riid,\r
46             /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);        \r
47     virtual ULONG STDMETHODCALLTYPE AddRef( void);\r
48     virtual ULONG STDMETHODCALLTYPE Release( void);\r
49         //IDropSource\r
50     virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( \r
51         /* [in] */ BOOL fEscapePressed,\r
52         /* [in] */ DWORD grfKeyState);\r
53     \r
54     virtual HRESULT STDMETHODCALLTYPE GiveFeedback( \r
55         /* [in] */ DWORD dwEffect);\r
56 };\r
57 \r
58 ///////////////////////////////////////////////////////////////////////////////////////////////\r
59 class CIDataObject : public IDataObject//,public IAsyncOperation\r
60 {\r
61         CIDropSource* m_pDropSource;\r
62         long m_cRefCount;\r
63         CSimpleArray<FORMATETC*> m_ArrFormatEtc;\r
64     CSimpleArray<STGMEDIUM*> m_StgMedium;\r
65 public:\r
66         CIDataObject(CIDropSource* pDropSource);\r
67         ~CIDataObject();\r
68         void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);\r
69     //IUnknown\r
70     virtual HRESULT STDMETHODCALLTYPE QueryInterface(\r
71             /* [in] */ REFIID riid,\r
72             /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);        \r
73     virtual ULONG STDMETHODCALLTYPE AddRef( void);\r
74     virtual ULONG STDMETHODCALLTYPE Release( void);\r
75 \r
76         //IDataObject\r
77         virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( \r
78         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,\r
79         /* [out] */ STGMEDIUM __RPC_FAR *pmedium);\r
80     \r
81     virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere( \r
82         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,\r
83         /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);\r
84     \r
85     virtual HRESULT STDMETHODCALLTYPE QueryGetData( \r
86         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);\r
87     \r
88     virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( \r
89         /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,\r
90         /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);\r
91     \r
92     virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData( \r
93         /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,\r
94         /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,\r
95         /* [in] */ BOOL fRelease);\r
96     \r
97     virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc( \r
98         /* [in] */ DWORD dwDirection,\r
99         /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);\r
100     \r
101     virtual HRESULT STDMETHODCALLTYPE DAdvise( \r
102         /* [in] */ FORMATETC __RPC_FAR *pformatetc,\r
103         /* [in] */ DWORD advf,\r
104         /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,\r
105         /* [out] */ DWORD __RPC_FAR *pdwConnection);\r
106     \r
107     virtual HRESULT STDMETHODCALLTYPE DUnadvise( \r
108         /* [in] */ DWORD dwConnection);\r
109     \r
110     virtual HRESULT STDMETHODCALLTYPE EnumDAdvise( \r
111         /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);\r
112 \r
113         //IAsyncOperation\r
114     //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode( \r
115     //    /* [in] */ BOOL fDoOpAsync)\r
116         //{\r
117         //      return E_NOTIMPL;\r
118         //}\r
119     //\r
120     //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode( \r
121     //    /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)\r
122         //{\r
123         //      return E_NOTIMPL;\r
124         //}\r
125     //\r
126     //virtual HRESULT STDMETHODCALLTYPE StartOperation( \r
127     //    /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)\r
128         //{\r
129         //      return E_NOTIMPL;\r
130         //}\r
131     //\r
132     //virtual HRESULT STDMETHODCALLTYPE InOperation( \r
133     //    /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)\r
134         //{\r
135         //      return E_NOTIMPL;\r
136         //}\r
137     //\r
138     //virtual HRESULT STDMETHODCALLTYPE EndOperation( \r
139     //    /* [in] */ HRESULT hResult,\r
140     //    /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,\r
141     //    /* [in] */ DWORD dwEffects)\r
142         //{\r
143         //      return E_NOTIMPL;\r
144         //}\r
145 };\r
146 \r
147 ///////////////////////////////////////////////////////////////////////////////////////////////\r
148 class CIDropTarget : public IDropTarget\r
149 {\r
150         DWORD m_cRefCount;\r
151         bool m_bAllowDrop;\r
152         struct IDropTargetHelper *m_pDropTargetHelper;\r
153         CSimpleArray<FORMATETC> m_formatetc;\r
154         FORMATETC* m_pSupportedFrmt;\r
155 protected:\r
156         HWND m_hTargetWnd;\r
157 public:\r
158         \r
159         CIDropTarget(HWND m_hTargetWnd);\r
160         virtual ~CIDropTarget();\r
161         void AddSuportedFormat(FORMATETC& ftetc) { m_formatetc.Add(ftetc); }\r
162         \r
163         //return values: true - release the medium. false - don't release the medium \r
164         virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium,DWORD *pdwEffect, POINTL pt) = 0;\r
165 \r
166         virtual HRESULT STDMETHODCALLTYPE QueryInterface( \r
167                 /* [in] */ REFIID riid,\r
168                 /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);\r
169         virtual ULONG STDMETHODCALLTYPE AddRef( void) { ATLTRACE("CIDropTarget::AddRef\n"); return ++m_cRefCount; }\r
170         virtual ULONG STDMETHODCALLTYPE Release( void);\r
171 \r
172     bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);\r
173         virtual HRESULT STDMETHODCALLTYPE DragEnter(\r
174         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,\r
175         /* [in] */ DWORD grfKeyState,\r
176         /* [in] */ POINTL pt,\r
177         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);\r
178     virtual HRESULT STDMETHODCALLTYPE DragOver( \r
179         /* [in] */ DWORD grfKeyState,\r
180         /* [in] */ POINTL pt,\r
181         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);\r
182     virtual HRESULT STDMETHODCALLTYPE DragLeave( void);    \r
183     virtual HRESULT STDMETHODCALLTYPE Drop(\r
184         /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,\r
185         /* [in] */ DWORD grfKeyState,\r
186         /* [in] */ POINTL pt,\r
187         /* [out][in] */ DWORD __RPC_FAR *pdwEffect);\r
188 };\r
189 \r
190 class CDragSourceHelper\r
191 {\r
192         IDragSourceHelper* pDragSourceHelper;\r
193 public:\r
194         CDragSourceHelper()\r
195         {\r
196                 pDragSourceHelper = NULL;\r
197                 if(FAILED(CoCreateInstance(CLSID_DragDropHelper,\r
198                         NULL,\r
199                         CLSCTX_INPROC_SERVER,\r
200                         IID_IDragSourceHelper,\r
201                         (void**)&pDragSourceHelper)))\r
202                         pDragSourceHelper = NULL;\r
203         }\r
204         virtual ~CDragSourceHelper()\r
205         {\r
206                 if( pDragSourceHelper!= NULL )\r
207                 {\r
208                         pDragSourceHelper->Release();\r
209                         pDragSourceHelper=NULL;\r
210                 }\r
211         }\r
212     \r
213         // IDragSourceHelper\r
214     HRESULT InitializeFromBitmap(HBITMAP hBitmap, \r
215                 POINT& pt,      // cursor position in client coords of the window\r
216                 RECT& rc,       // selected item's bounding rect\r
217                 IDataObject* pDataObject,\r
218                 COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.\r
219                 )\r
220         {\r
221                 if(pDragSourceHelper == NULL)\r
222                         return E_FAIL;\r
223 \r
224                     SHDRAGIMAGE di;\r
225             BITMAP      bm;\r
226             GetObject(hBitmap, sizeof(bm), &bm);\r
227             di.sizeDragImage.cx = bm.bmWidth;\r
228             di.sizeDragImage.cy = bm.bmHeight;\r
229             di.hbmpDragImage = hBitmap;\r
230             di.crColorKey = crColorKey; \r
231             di.ptOffset.x = pt.x - rc.left;\r
232             di.ptOffset.y = pt.y - rc.top;\r
233         return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);\r
234         }\r
235     HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)\r
236         {               \r
237                 if(pDragSourceHelper == NULL)\r
238                         return E_FAIL;\r
239                 return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);\r
240         }\r
241 };\r
242 #endif //__DRAGDROPIMPL_H__