update for HEAD-2003091401
[reactos.git] / subsys / system / explorer / utility / dragdropimpl.h
diff --git a/subsys/system/explorer/utility/dragdropimpl.h b/subsys/system/explorer/utility/dragdropimpl.h
new file mode 100644 (file)
index 0000000..249d65e
--- /dev/null
@@ -0,0 +1,263 @@
+// IDataObjectImpl.h: interface for the CIDataObjectImpl class.
+/**************************************************************************
+   THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
+   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+   PARTICULAR PURPOSE.
+   Author: Leon Finker  11/2000
+   Modifications: replaced ATL by STL, Martin Fuchs 7/2003
+**************************************************************************/
+
+#include <vector>
+using std::vector;
+
+
+typedef vector<FORMATETC> FormatArray;
+
+struct DataStorage {
+       FORMATETC*      _format;
+       STGMEDIUM*      _medium;
+};
+
+typedef vector<DataStorage> StorageArray;
+
+
+class EnumFormatEtcImpl : public IEnumFORMATETC
+{
+   private:
+     ULONG                     m_cRefCount;
+     FormatArray       m_pFmtEtc;
+     size_t                    m_iCur;
+
+   public:
+     EnumFormatEtcImpl(const FormatArray& ArrFE);
+        EnumFormatEtcImpl(const StorageArray& ArrFE);
+
+     //IUnknown members
+     STDMETHOD(QueryInterface)(REFIID, void**);
+     STDMETHOD_(ULONG, AddRef)(void);
+     STDMETHOD_(ULONG, Release)(void);
+
+     //IEnumFORMATETC members
+     STDMETHOD(Next)(ULONG, LPFORMATETC, ULONG*);
+     STDMETHOD(Skip)(ULONG);
+     STDMETHOD(Reset)(void);
+     STDMETHOD(Clone)(IEnumFORMATETC**);
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+class IDropSourceImpl : public IDropSource
+{
+       long m_cRefCount;
+public:
+       bool m_bDropped;
+
+       IDropSourceImpl::IDropSourceImpl() : m_cRefCount(0), m_bDropped(false) {}
+
+       //IUnknown
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(
+            /* [in] */ REFIID riid,
+            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);        
+    virtual ULONG STDMETHODCALLTYPE AddRef();
+    virtual ULONG STDMETHODCALLTYPE Release();
+
+       //IDropSource
+    virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( 
+        /* [in] */ BOOL fEscapePressed,
+        /* [in] */ DWORD grfKeyState);
+    
+    virtual HRESULT STDMETHODCALLTYPE GiveFeedback( 
+        /* [in] */ DWORD dwEffect);
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+class IDataObjectImpl : public IDataObject//,public IAsyncOperation
+{
+       IDropSourceImpl* m_pDropSource;
+       long m_cRefCount;
+
+       StorageArray    _storage;
+
+public:
+       IDataObjectImpl(IDropSourceImpl* pDropSource);
+       ~IDataObjectImpl();
+
+       void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
+
+    //IUnknown
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(
+            /* [in] */ REFIID riid,
+            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);        
+    virtual ULONG STDMETHODCALLTYPE AddRef();
+    virtual ULONG STDMETHODCALLTYPE Release();
+
+       //IDataObject
+       virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( 
+        /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
+        /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
+    
+    virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere( 
+        /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+        /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
+    
+    virtual HRESULT STDMETHODCALLTYPE QueryGetData( 
+        /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
+    
+    virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( 
+        /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
+        /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
+    
+    virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData( 
+        /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+        /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
+        /* [in] */ BOOL fRelease);
+    
+    virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc( 
+        /* [in] */ DWORD dwDirection,
+        /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
+    
+    virtual HRESULT STDMETHODCALLTYPE DAdvise( 
+        /* [in] */ FORMATETC __RPC_FAR *pformatetc,
+        /* [in] */ DWORD advf,
+        /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
+        /* [out] */ DWORD __RPC_FAR *pdwConnection);
+    
+    virtual HRESULT STDMETHODCALLTYPE DUnadvise( 
+        /* [in] */ DWORD dwConnection);
+    
+    virtual HRESULT STDMETHODCALLTYPE EnumDAdvise( 
+        /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
+
+       //IAsyncOperation
+    //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode( 
+    //    /* [in] */ BOOL fDoOpAsync)
+       //{
+       //      return E_NOTIMPL;
+       //}
+    //
+    //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode( 
+    //    /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
+       //{
+       //      return E_NOTIMPL;
+       //}
+    //
+    //virtual HRESULT STDMETHODCALLTYPE StartOperation( 
+    //    /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
+       //{
+       //      return E_NOTIMPL;
+       //}
+    //
+    //virtual HRESULT STDMETHODCALLTYPE InOperation( 
+    //    /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
+       //{
+       //      return E_NOTIMPL;
+       //}
+    //
+    //virtual HRESULT STDMETHODCALLTYPE EndOperation( 
+    //    /* [in] */ HRESULT hResult,
+    //    /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
+    //    /* [in] */ DWORD dwEffects)
+       //{
+       //      return E_NOTIMPL;
+       //}*/
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+class IDropTargetImpl : public IDropTarget
+{
+       DWORD m_cRefCount;
+       bool m_bAllowDrop;
+       IDropTargetHelper* m_pDropTargetHelper;
+
+       FormatArray m_formatetc;
+       FORMATETC* m_pSupportedFrmt;
+
+protected:
+       HWND m_hTargetWnd;
+
+public:
+       IDropTargetImpl(HWND m_hTargetWnd);
+       virtual ~IDropTargetImpl();
+       void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);}
+       
+       //return values: true - release the medium. false - don't release the medium 
+       virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0;
+
+       virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
+               /* [in] */ REFIID riid,
+               /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
+       virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;}
+       virtual ULONG STDMETHODCALLTYPE Release();
+
+    bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
+       virtual HRESULT STDMETHODCALLTYPE DragEnter(
+        /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+        /* [in] */ DWORD grfKeyState,
+        /* [in] */ POINTL pt,
+        /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+    virtual HRESULT STDMETHODCALLTYPE DragOver( 
+        /* [in] */ DWORD grfKeyState,
+        /* [in] */ POINTL pt,
+        /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+    virtual HRESULT STDMETHODCALLTYPE DragLeave();    
+    virtual HRESULT STDMETHODCALLTYPE Drop(
+        /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+        /* [in] */ DWORD grfKeyState,
+        /* [in] */ POINTL pt,
+        /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+};
+
+class DragSourceHelper
+{
+       IDragSourceHelper* pDragSourceHelper;
+
+public:
+       DragSourceHelper()
+       {
+               if (FAILED(CoCreateInstance(CLSID_DragDropHelper,
+                        NULL,
+                        CLSCTX_INPROC_SERVER,
+                        IID_IDragSourceHelper,
+                        (void**)&pDragSourceHelper)))
+                       pDragSourceHelper = NULL;
+       }
+
+       virtual ~DragSourceHelper()
+       {
+               if ( pDragSourceHelper!= NULL )
+               {
+                       pDragSourceHelper->Release();
+                       pDragSourceHelper=NULL;
+               }
+       }
+    
+       // IDragSourceHelper
+    HRESULT InitializeFromBitmap(HBITMAP hBitmap, 
+               POINT& pt,      // cursor position in client coords of the window
+               RECT& rc,       // selected item's bounding rect
+               IDataObject* pDataObject,
+               COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
+               )
+       {
+               if (pDragSourceHelper == NULL)
+                       return E_FAIL;
+
+                   SHDRAGIMAGE di;
+            BITMAP      bm;
+            GetObject(hBitmap, sizeof(bm), &bm);
+            di.sizeDragImage.cx = bm.bmWidth;
+            di.sizeDragImage.cy = bm.bmHeight;
+            di.hbmpDragImage = hBitmap;
+            di.crColorKey = crColorKey; 
+            di.ptOffset.x = pt.x - rc.left;
+            di.ptOffset.y = pt.y - rc.top;
+        return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
+       }
+
+    HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
+       {               
+               if (pDragSourceHelper == NULL)
+                       return E_FAIL;
+               return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
+       }
+};