Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
9.0 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Copyright (C) 1993-1999 Microsoft Corporation. All Rights Reserved.
  3. //
  4. // MODULE: dragdrop.h
  5. //
  6. // PURPOSE: Contains the definitions for all of Outlook Express's
  7. // Drag Drop code.
  8. //
  9. #pragma once
  10. class CStoreDlgCB;
  11. /////////////////////////////////////////////////////////////////////////////
  12. // Data Formats, Types, and Clipboard Formats
  13. //
  14. typedef struct tagOEMESSAGES {
  15. FOLDERID idSource;
  16. MESSAGEIDLIST rMsgIDList;
  17. } OEMESSAGES;
  18. /////////////////////////////////////////////////////////////////////////////
  19. // Drop Target Class
  20. //
  21. class CDropTarget : public IDropTarget
  22. {
  23. /////////////////////////////////////////////////////////////////////////
  24. // Constructors and Destructor
  25. //
  26. public:
  27. CDropTarget();
  28. ~CDropTarget();
  29. /////////////////////////////////////////////////////////////////////////
  30. // Initialization
  31. //
  32. HRESULT Initialize(HWND hwndOwner, FOLDERID idFolder);
  33. /////////////////////////////////////////////////////////////////////////
  34. // IUnknown
  35. //
  36. STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj);
  37. STDMETHODIMP_(ULONG) AddRef(void);
  38. STDMETHODIMP_(ULONG) Release(void);
  39. /////////////////////////////////////////////////////////////////////////
  40. // IDropTarget
  41. //
  42. STDMETHODIMP DragEnter(IDataObject *pDataObject, DWORD grfKeyState,
  43. POINTL pt, DWORD *pdwEffect);
  44. STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  45. STDMETHODIMP DragLeave(void);
  46. STDMETHODIMP Drop(IDataObject *pDataObject, DWORD grfKeyState,
  47. POINTL pt, DWORD *pdwEffect);
  48. private:
  49. /////////////////////////////////////////////////////////////////////////
  50. // Utility Functions
  51. //
  52. BOOL _CheckRoundtrip(IDataObject *pDataObject);
  53. BOOL _ValidateDropType(CLIPFORMAT cf, IDataObject *pDataObject);
  54. DWORD _DragEffectFromFormat(IDataObject *pDataObject, DWORD dwEffectOk, CLIPFORMAT cf, DWORD grfKeyState);
  55. HRESULT _HandleDrop(IDataObject *pDataObject, DWORD dwEffect, CLIPFORMAT cf, DWORD grfKeyState);
  56. HRESULT _HandleFolderDrop(IDataObject *pDataObject);
  57. HRESULT _HandleMessageDrop(IDataObject *pDataObject, BOOL fMove);
  58. HRESULT _HandleHDrop(IDataObject *pDataObject, CLIPFORMAT cf, DWORD grfKeyState);
  59. HRESULT _InsertMessagesInStore(HDROP hDrop);
  60. HRESULT _CreateMessageFromDrop(HWND hwnd, IDataObject *pDataObject, DWORD grfKeyState);
  61. BOOL _IsValidOEFolder(IDataObject *pDataObject);
  62. BOOL _IsValidOEMessages(IDataObject *pDataObject);
  63. /////////////////////////////////////////////////////////////////////////
  64. // Progress Dialog
  65. static INT_PTR CALLBACK _ProgDlgProcExt(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  66. INT_PTR CALLBACK _ProgDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  67. BOOL _OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
  68. void _OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
  69. void _SaveNextMessage(void);
  70. private:
  71. /////////////////////////////////////////////////////////////////////////
  72. // Object Data
  73. //
  74. ULONG m_cRef;
  75. HWND m_hwndOwner;
  76. FOLDERID m_idFolder;
  77. IDataObject *m_pDataObject;
  78. CLIPFORMAT m_cf;
  79. BOOL m_fOutbox;
  80. // Progress Dialog Stuff
  81. HWND m_hwndDlg;
  82. HDROP m_hDrop;
  83. DWORD m_cFiles;
  84. DWORD m_iFileCur;
  85. IMessageFolder *m_pFolder;
  86. CStoreDlgCB *m_pStoreCB;
  87. };
  88. /////////////////////////////////////////////////////////////////////////////
  89. // Data Object Classes
  90. //
  91. class CBaseDataObject : public IDataObject
  92. {
  93. public:
  94. /////////////////////////////////////////////////////////////////////////
  95. // Constructor and Destructor
  96. //
  97. CBaseDataObject();
  98. virtual ~CBaseDataObject();
  99. /////////////////////////////////////////////////////////////////////////
  100. // IUnknown Interface
  101. //
  102. STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv);
  103. STDMETHODIMP_(ULONG) AddRef();
  104. STDMETHODIMP_(ULONG) Release();
  105. /////////////////////////////////////////////////////////////////////////
  106. // IDataObject Interface members
  107. //
  108. STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium) = 0;
  109. STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  110. STDMETHODIMP QueryGetData(LPFORMATETC pFE) = 0;
  111. STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut);
  112. STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium,
  113. BOOL fRelease);
  114. STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC** ppEnum);
  115. STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD advf,
  116. IAdviseSink* ppAdviseSink, LPDWORD pdwConnection);
  117. STDMETHODIMP DUnadvise(DWORD dwConnection);
  118. STDMETHODIMP EnumDAdvise(IEnumSTATDATA** ppEnumAdvise);
  119. /////////////////////////////////////////////////////////////////////////
  120. // Utility Functions
  121. //
  122. protected:
  123. virtual HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt) = 0;
  124. /////////////////////////////////////////////////////////////////////////
  125. // Object Attributes
  126. //
  127. private:
  128. ULONG m_cRef; // Object reference count
  129. protected:
  130. FORMATETC m_rgFormatEtc[10]; // Array of FORMATETC's we support
  131. ULONG m_cFormatEtc; // Number of elements in m_rgFormatEtc
  132. };
  133. class CFolderDataObject : public CBaseDataObject
  134. {
  135. public:
  136. /////////////////////////////////////////////////////////////////////////
  137. // Constructor and Destructor
  138. //
  139. CFolderDataObject(FOLDERID idFolder) : m_idFolder(idFolder), m_fBuildFE(0) {};
  140. ~CFolderDataObject() {};
  141. /////////////////////////////////////////////////////////////////////////
  142. // IDataObject - Overridden from CBaseDataObject2
  143. //
  144. STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  145. STDMETHODIMP QueryGetData(LPFORMATETC pFE);
  146. /////////////////////////////////////////////////////////////////////////
  147. // Utility Functions
  148. //
  149. protected:
  150. HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt);
  151. HRESULT _RenderOEFolder(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  152. HRESULT _RenderTextOrShellURL(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  153. /////////////////////////////////////////////////////////////////////////
  154. // Object Attributes
  155. //
  156. private:
  157. FOLDERID m_idFolder;
  158. BOOL m_fBuildFE;
  159. };
  160. class CMessageDataObject : public CBaseDataObject
  161. {
  162. public:
  163. /////////////////////////////////////////////////////////////////////////
  164. // Constructor and Destructor
  165. //
  166. CMessageDataObject();
  167. ~CMessageDataObject();
  168. HRESULT Initialize(LPMESSAGEIDLIST pMsgs, FOLDERID idSource);
  169. /////////////////////////////////////////////////////////////////////////
  170. // IDataObject - Overridden from CBaseDataObject2
  171. //
  172. STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  173. STDMETHODIMP QueryGetData(LPFORMATETC pFE);
  174. /////////////////////////////////////////////////////////////////////////
  175. // Utility Functions
  176. //
  177. protected:
  178. HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt);
  179. HRESULT _LoadMessage(DWORD iMsg, IMimeMessage **ppMsg, LPWSTR pwszFileExt);
  180. HRESULT _RenderOEMessages(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  181. HRESULT _RenderFileContents(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  182. HRESULT _RenderFileGroupDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  183. /////////////////////////////////////////////////////////////////////////
  184. // Object Attributes
  185. //
  186. private:
  187. LPMESSAGEIDLIST m_pMsgIDList;
  188. FOLDERID m_idSource;
  189. BOOL m_fBuildFE;
  190. BOOL m_fDownloaded;
  191. };
  192. class CShortcutDataObject : public CBaseDataObject
  193. {
  194. public:
  195. /////////////////////////////////////////////////////////////////////////
  196. // Constructor and Destructor
  197. //
  198. CShortcutDataObject(UINT iPos) : m_iPos(iPos), m_fBuildFE(0) {};
  199. ~CShortcutDataObject() {};
  200. /////////////////////////////////////////////////////////////////////////
  201. // IDataObject - Overridden from CBaseDataObject2
  202. //
  203. STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  204. STDMETHODIMP QueryGetData(LPFORMATETC pFE);
  205. /////////////////////////////////////////////////////////////////////////
  206. // Utility Functions
  207. //
  208. private:
  209. HRESULT _BuildFormatEtc(LPFORMATETC *ppFE, ULONG *pcElt);
  210. HRESULT _RenderOEShortcut(LPFORMATETC pFE, LPSTGMEDIUM pStgMedium);
  211. /////////////////////////////////////////////////////////////////////////
  212. // Object Attributes
  213. //
  214. private:
  215. UINT m_iPos;
  216. BOOL m_fBuildFE;
  217. };