///////////////////////////////////////////////////////////////////////////// // Copyright (C) 1993-1999 Microsoft Corporation. All Rights Reserved. // // MODULE: dragdrop.h // // PURPOSE: Contains the definitions for all of Outlook Express's // Drag Drop code. // #pragma once class CStoreDlgCB; ///////////////////////////////////////////////////////////////////////////// // Data Formats, Types, and Clipboard Formats // typedef struct tagOEMESSAGES { FOLDERID idSource; MESSAGEIDLIST rMsgIDList; } OEMESSAGES; ///////////////////////////////////////////////////////////////////////////// // Drop Target Class // class CDropTarget : public IDropTarget { ///////////////////////////////////////////////////////////////////////// // Constructors and Destructor // public: CDropTarget(); ~CDropTarget(); ///////////////////////////////////////////////////////////////////////// // Initialization // HRESULT Initialize(HWND hwndOwner, FOLDERID idFolder); ///////////////////////////////////////////////////////////////////////// // IUnknown // STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); ///////////////////////////////////////////////////////////////////////// // IDropTarget // STDMETHODIMP DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); STDMETHODIMP DragLeave(void); STDMETHODIMP Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); private: ///////////////////////////////////////////////////////////////////////// // Utility Functions // BOOL _CheckRoundtrip(IDataObject *pDataObject); BOOL _ValidateDropType(CLIPFORMAT cf, IDataObject *pDataObject); DWORD _DragEffectFromFormat(IDataObject *pDataObject, DWORD dwEffectOk, CLIPFORMAT cf, DWORD grfKeyState); HRESULT _HandleDrop(IDataObject *pDataObject, DWORD dwEffect, CLIPFORMAT cf, DWORD grfKeyState); HRESULT _HandleFolderDrop(IDataObject *pDataObject); HRESULT _HandleMessageDrop(IDataObject *pDataObject, BOOL fMove); HRESULT _HandleHDrop(IDataObject *pDataObject, CLIPFORMAT cf, DWORD grfKeyState); HRESULT _InsertMessagesInStore(HDROP hDrop); HRESULT _CreateMessageFromDrop(HWND hwnd, IDataObject *pDataObject, DWORD grfKeyState); BOOL _IsValidOEFolder(IDataObject *pDataObject); BOOL _IsValidOEMessages(IDataObject *pDataObject); ///////////////////////////////////////////////////////////////////////// // Progress Dialog static INT_PTR CALLBACK _ProgDlgProcExt(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK _ProgDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL _OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); void _OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); void _SaveNextMessage(void); private: ///////////////////////////////////////////////////////////////////////// // Object Data // ULONG m_cRef; HWND m_hwndOwner; FOLDERID m_idFolder; IDataObject *m_pDataObject; CLIPFORMAT m_cf; BOOL m_fOutbox; // Progress Dialog Stuff HWND m_hwndDlg; HDROP m_hDrop; DWORD m_cFiles; DWORD m_iFileCur; IMessageFolder *m_pFolder; CStoreDlgCB *m_pStoreCB; }; ///////////////////////////////////////////////////////////////////////////// // Data Object Classes // class CBaseDataObject : public IDataObject { public: ///////////////////////////////////////////////////////////////////////// // Constructor and Destructor // CBaseDataObject(); virtual ~CBaseDataObject(); ///////////////////////////////////////////////////////////////////////// // IUnknown Interface // STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); ///////////////////////////////////////////////////////////////////////// // IDataObject Interface members // STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium) = 0; STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); STDMETHODIMP QueryGetData(LPFORMATETC pFE) = 0; STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut); STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium, BOOL fRelease); STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC** ppEnum); STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD advf, IAdviseSink* ppAdviseSink, LPDWORD pdwConnection); STDMETHODIMP DUnadvise(DWORD dwConnection); STDMETHODIMP EnumDAdvise(IEnumSTATDATA** ppEnumAdvise); ///////////////////////////////////////////////////////////////////////// // Utility Functions // protected: virtual HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt) = 0; ///////////////////////////////////////////////////////////////////////// // Object Attributes // private: ULONG m_cRef; // Object reference count protected: FORMATETC m_rgFormatEtc[10]; // Array of FORMATETC's we support ULONG m_cFormatEtc; // Number of elements in m_rgFormatEtc }; class CFolderDataObject : public CBaseDataObject { public: ///////////////////////////////////////////////////////////////////////// // Constructor and Destructor // CFolderDataObject(FOLDERID idFolder) : m_idFolder(idFolder), m_fBuildFE(0) {}; ~CFolderDataObject() {}; ///////////////////////////////////////////////////////////////////////// // IDataObject - Overridden from CBaseDataObject2 // STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); STDMETHODIMP QueryGetData(LPFORMATETC pFE); ///////////////////////////////////////////////////////////////////////// // Utility Functions // protected: HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt); HRESULT _RenderOEFolder(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); HRESULT _RenderTextOrShellURL(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); ///////////////////////////////////////////////////////////////////////// // Object Attributes // private: FOLDERID m_idFolder; BOOL m_fBuildFE; }; class CMessageDataObject : public CBaseDataObject { public: ///////////////////////////////////////////////////////////////////////// // Constructor and Destructor // CMessageDataObject(); ~CMessageDataObject(); HRESULT Initialize(LPMESSAGEIDLIST pMsgs, FOLDERID idSource); ///////////////////////////////////////////////////////////////////////// // IDataObject - Overridden from CBaseDataObject2 // STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); STDMETHODIMP QueryGetData(LPFORMATETC pFE); ///////////////////////////////////////////////////////////////////////// // Utility Functions // protected: HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt); HRESULT _LoadMessage(DWORD iMsg, IMimeMessage **ppMsg, LPWSTR pwszFileExt); HRESULT _RenderOEMessages(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); HRESULT _RenderFileContents(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); HRESULT _RenderFileGroupDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); ///////////////////////////////////////////////////////////////////////// // Object Attributes // private: LPMESSAGEIDLIST m_pMsgIDList; FOLDERID m_idSource; BOOL m_fBuildFE; BOOL m_fDownloaded; }; class CShortcutDataObject : public CBaseDataObject { public: ///////////////////////////////////////////////////////////////////////// // Constructor and Destructor // CShortcutDataObject(UINT iPos) : m_iPos(iPos), m_fBuildFE(0) {}; ~CShortcutDataObject() {}; ///////////////////////////////////////////////////////////////////////// // IDataObject - Overridden from CBaseDataObject2 // STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); STDMETHODIMP QueryGetData(LPFORMATETC pFE); ///////////////////////////////////////////////////////////////////////// // Utility Functions // private: HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt); HRESULT _RenderOEShortcut(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium); ///////////////////////////////////////////////////////////////////////// // Object Attributes // private: UINT m_iPos; BOOL m_fBuildFE; };