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