Source code of Windows XP (NT5)
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.

463 lines
12 KiB

  1. #include "stdafx.h"
  2. #include "DomMigSI.h"
  3. #include "DomMigr.h"
  4. #include "Globals.h"
  5. #include "MultiSel.h"
  6. UINT CMultiSelectItemDataObject::s_cfMsObjTypes = 0; // MultiSelect clipformat
  7. UINT CMultiSelectItemDataObject::s_cfMsDataObjs = 0; // MultiSelect clipformat
  8. CMultiSelectItemDataObject::CMultiSelectItemDataObject()
  9. {
  10. m_objectDataArray.RemoveAll();
  11. m_ddStatusArray.RemoveAll();
  12. m_pParentItem = NULL;
  13. s_cfMsObjTypes = RegisterClipboardFormat(CCF_OBJECT_TYPES_IN_MULTI_SELECT);
  14. s_cfMsDataObjs = RegisterClipboardFormat(CCF_MULTI_SELECT_SNAPINS);
  15. m_bHasGroup = false;
  16. }
  17. CMultiSelectItemDataObject::~CMultiSelectItemDataObject()
  18. {
  19. for ( int i = 0; i < m_objectDataArray.GetSize(); i++ )
  20. {
  21. delete (CObjectData *)(m_objectDataArray[i]);
  22. }
  23. }
  24. DWORD CMultiSelectItemDataObject::GetItemCount()
  25. {
  26. return (DWORD)m_objectDataArray.GetSize();
  27. }
  28. HRESULT CMultiSelectItemDataObject::AddMultiSelectItem( CObjectData *pDataObject )
  29. {
  30. m_objectDataArray.Add(pDataObject);
  31. m_ddStatusArray.Add(DD_NONE);
  32. return S_OK;
  33. }
  34. void CMultiSelectItemDataObject::SetParentItem( CSnapInItem *pParentItem )
  35. {
  36. m_pParentItem = pParentItem;
  37. }
  38. CSnapInItem *CMultiSelectItemDataObject::GetParentItem()
  39. {
  40. return m_pParentItem;
  41. }
  42. void CMultiSelectItemDataObject::GetParentGuid(GUID *guid)
  43. {
  44. memcpy( guid, &m_parentGuid, sizeof( GUID ) );
  45. }
  46. void CMultiSelectItemDataObject::SetParentGuid(GUID *guid)
  47. {
  48. memcpy( &m_parentGuid, guid, sizeof( GUID ) );
  49. }
  50. CSnapInItem *CMultiSelectItemDataObject::GetSnapInItem(DWORD index)
  51. {
  52. if ( GetItemCount() <= index )
  53. return NULL;
  54. return ((CObjectData *)m_objectDataArray[index])->m_pItem;
  55. }
  56. BYTE CMultiSelectItemDataObject::GetDDStatus(DWORD index)
  57. {
  58. if ( GetItemCount() <= index )
  59. return DD_NONE;
  60. return m_ddStatusArray[index];
  61. }
  62. void CMultiSelectItemDataObject::SetDDStatus(DWORD index, BYTE status)
  63. {
  64. if ( GetItemCount() <= index )
  65. return;
  66. m_ddStatusArray[index] = status;
  67. }
  68. STDMETHODIMP CMultiSelectItemDataObject::GetDataHere(FORMATETC *pformatetc, STGMEDIUM *pmedium)
  69. {
  70. if ( NULL == pmedium )
  71. return E_POINTER;
  72. pmedium->pUnkForRelease = NULL; // by OLE spec
  73. HRESULT hr = DV_E_TYMED;
  74. // Make sure the type medium is HGLOBAL
  75. if (pmedium->tymed == TYMED_HGLOBAL )
  76. {
  77. if ( s_cfMsObjTypes == pformatetc->cfFormat )
  78. {
  79. // Create the stream on the hGlobal passed in
  80. CComPtr<IStream> spStream;
  81. hr = CreateStreamOnHGlobal(pmedium->hGlobal, FALSE, &spStream);
  82. if (SUCCEEDED(hr))
  83. {
  84. hr = DV_E_CLIPFORMAT;
  85. if (pformatetc->cfFormat == s_cfMsObjTypes)
  86. {
  87. DWORD objCount = (DWORD)m_objectDataArray.GetSize();
  88. spStream->Write( &objCount, sizeof(DWORD), NULL );
  89. for ( DWORD i = 0; i < objCount; i++ )
  90. {
  91. CSnapInItem* pItem;
  92. pItem = (CSnapInItem*)((CObjectData*)m_objectDataArray[i])->m_pItem;
  93. pItem->FillData( pItem->m_CCF_NODETYPE, spStream);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. return hr;
  100. }
  101. STDMETHODIMP CMultiSelectItemDataObject::GetData
  102. (
  103. FORMATETC *pformatetc, // [in] Pointer to the FORMATETC structure
  104. STGMEDIUM *pmedium // [out] Pointer to the STGMEDIUM structure
  105. )
  106. {
  107. HRESULT hr = DATA_E_FORMATETC;
  108. if( s_cfMsObjTypes == pformatetc->cfFormat )
  109. {
  110. HGLOBAL hMem = NULL;
  111. DWORD objCount = GetItemCount();
  112. ATLTRACE( L"CMultiSelectItemDataObject::GetData - asked for MultiSelect Object \n" );
  113. hMem = ::GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE, sizeof(GUID)*objCount + sizeof(DWORD));
  114. if( NULL == hMem )
  115. hr = STG_E_MEDIUMFULL;
  116. else
  117. {
  118. CComPtr<IStream> spStream;
  119. hr = CreateStreamOnHGlobal(hMem, FALSE, &spStream);
  120. if (SUCCEEDED(hr))
  121. {
  122. spStream->Write( &objCount, sizeof(DWORD), NULL );
  123. for ( DWORD i = 0; i < objCount; i++ )
  124. {
  125. CSnapInItem* pItem;
  126. pItem = (CSnapInItem*)((CObjectData*)m_objectDataArray[i])->m_pItem;
  127. pItem->FillData( pItem->m_CCF_NODETYPE, spStream);
  128. }
  129. pmedium->hGlobal = hMem; // StgMedium variables
  130. pmedium->tymed = TYMED_HGLOBAL;
  131. pmedium->pUnkForRelease = NULL;
  132. }
  133. }
  134. }
  135. ATLTRACE( L"CMultiSelectItemDataObject::GetData returned 0x%X \n", hr );
  136. return hr;
  137. } // end GetData()
  138. STDMETHODIMP CMultiSelectItemDataObject::QueryGetData(FORMATETC *pformatetc)
  139. {
  140. HRESULT hr = S_FALSE;
  141. if( (0 != s_cfMsObjTypes) && (s_cfMsObjTypes == pformatetc->cfFormat) )
  142. {
  143. hr = S_OK;
  144. }
  145. ATLTRACE( L"CMultiSelectItemDataObject::QueryGetData() called with ClipFormat 0x%X \n", pformatetc->cfFormat );
  146. return hr;
  147. }
  148. HRESULT CMultiSelectItemDataObject::OnNotify(CDomMigratorComponent *pComponent, MMC_NOTIFY_TYPE event, long arg, long param )
  149. {
  150. HRESULT hr = E_NOTIMPL;
  151. DWORD objCount = (DWORD)m_objectDataArray.GetSize();
  152. CComPtr<IConsole> spConsole;
  153. if ( 0 == objCount )
  154. return hr;
  155. spConsole = ((CDomMigratorComponent*)pComponent)->m_spConsole;
  156. switch (event)
  157. {
  158. case MMCN_SELECT:
  159. {
  160. bool bSelect = (HIWORD(arg) != 0 );
  161. if ( bSelect )
  162. {
  163. hr = OnSelect(spConsole);
  164. }
  165. break;
  166. }
  167. case MMCN_DELETE:
  168. //hr = OnDelete(spConsole);
  169. break;
  170. case MMCN_CUTORMOVE:
  171. hr = OnCutOrMove(spConsole);
  172. break;
  173. default:
  174. break;
  175. }
  176. return hr;
  177. }
  178. HRESULT CMultiSelectItemDataObject::OnCutOrMove( IConsole* pConsole )
  179. {
  180. HRESULT hr = S_OK;//E_NOTIMPL;
  181. DWORD objCount = (DWORD)m_objectDataArray.GetSize();
  182. if ( 0 == objCount )
  183. goto ret_exit;
  184. GUID itemParentGuid;
  185. GetParentGuid( &itemParentGuid );
  186. ret_exit:
  187. return hr;
  188. }
  189. HRESULT CMultiSelectItemDataObject::OnSelect(IConsole *pConsole)
  190. {
  191. HRESULT hr = S_OK;//E_NOTIMPL;
  192. DWORD objCount = (DWORD)m_objectDataArray.GetSize();
  193. if ( 0 == objCount )
  194. goto ret_exit;
  195. GUID itemParentGuid;
  196. GetParentGuid( &itemParentGuid );
  197. hr = OnSelectAllowDragDrop( pConsole );
  198. ret_exit:
  199. return hr;
  200. }
  201. HRESULT CMultiSelectItemDataObject::OnSelectAllowDragDrop(IConsole *pConsole)
  202. {
  203. HRESULT hr = S_OK;
  204. CComPtr<IConsoleVerb> pConsoleVerb;
  205. hr = pConsole->QueryConsoleVerb( &pConsoleVerb );
  206. if ( FAILED( hr ) )
  207. goto ret_exit;
  208. //
  209. // Enable the delete verb.
  210. //
  211. hr = pConsoleVerb->SetVerbState( MMC_VERB_DELETE, ENABLED, TRUE );
  212. if ( FAILED( hr ) )
  213. goto ret_exit;
  214. hr = pConsoleVerb->SetVerbState( MMC_VERB_DELETE, HIDDEN, TRUE );
  215. if ( FAILED( hr ) )
  216. goto ret_exit;
  217. //
  218. // Enable the copy verb.
  219. //
  220. hr = pConsoleVerb->SetVerbState( MMC_VERB_COPY, ENABLED, TRUE );
  221. if ( FAILED( hr ) )
  222. goto ret_exit;
  223. hr = pConsoleVerb->SetVerbState( MMC_VERB_COPY, HIDDEN, TRUE );
  224. if ( FAILED( hr ) )
  225. goto ret_exit;
  226. ret_exit:
  227. return hr;
  228. }
  229. SMMCDataObjects *CMultiSelectItemDataObject::ExtractMSDataObjects( LPDATAOBJECT lpDataObject )
  230. {
  231. HRESULT hr = S_OK;
  232. SMMCDataObjects *p = NULL;
  233. STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
  234. FORMATETC formatetc = { (CLIPFORMAT)s_cfMsDataObjs, NULL,
  235. DVASPECT_CONTENT, -1, TYMED_HGLOBAL
  236. };
  237. hr = lpDataObject->GetData(&formatetc, &stgmedium);
  238. if (FAILED(hr))
  239. goto ret_exit;
  240. p = reinterpret_cast<SMMCDataObjects*>(stgmedium.hGlobal);
  241. //ReleaseStgMedium(&stgmedium);
  242. ret_exit:
  243. return p;
  244. }
  245. HRESULT CMultiSelectItemDataObject::Command(long lCommandID,
  246. CSnapInObjectRootBase* pObj,
  247. DATA_OBJECT_TYPES type)
  248. {
  249. bool bHandled;
  250. return ProcessCommand(lCommandID, bHandled, pObj, type);
  251. }
  252. HRESULT CMultiSelectItemDataObject::AddMenuItems(LPCONTEXTMENUCALLBACK piCallback,
  253. long *pInsertionAllowed,
  254. DATA_OBJECT_TYPES type)
  255. {
  256. if ( m_bHasGroup )
  257. return S_OK;
  258. //ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::AddMenuItems\n"));
  259. //T* pT = static_cast<T*>(this);
  260. bool bIsExtension = false;
  261. if (!bIsExtension)
  262. /*pT->*/SetMenuInsertionFlags(true, pInsertionAllowed);
  263. UINT menuID = /*pT->*/GetMenuID();
  264. if (menuID == 0)
  265. return S_OK;
  266. HMENU hMenu = LoadMenu(_Module.GetResourceInstance(), MAKEINTRESOURCE(menuID));
  267. long insertionID;
  268. if (hMenu)
  269. {
  270. for (int i = 0; 1; i++)
  271. {
  272. HMENU hSubMenu = GetSubMenu(hMenu, i);
  273. if (hSubMenu == NULL)
  274. break;
  275. MENUITEMINFO menuItemInfo;
  276. memset(&menuItemInfo, 0, sizeof(menuItemInfo));
  277. menuItemInfo.cbSize = sizeof(menuItemInfo);
  278. switch (i)
  279. {
  280. case 0:
  281. if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP) )
  282. continue;
  283. insertionID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
  284. break;
  285. case 1:
  286. if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_NEW) )
  287. continue;
  288. if (bIsExtension)
  289. insertionID = CCM_INSERTIONPOINTID_3RDPARTY_NEW;
  290. else
  291. insertionID = CCM_INSERTIONPOINTID_PRIMARY_NEW;
  292. break;
  293. case 2:;
  294. if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_TASK) )
  295. continue;
  296. if (bIsExtension)
  297. insertionID = CCM_INSERTIONPOINTID_3RDPARTY_TASK;
  298. else
  299. insertionID = CCM_INSERTIONPOINTID_PRIMARY_TASK;
  300. break;
  301. case 3:;
  302. if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_VIEW) )
  303. continue;
  304. insertionID = CCM_INSERTIONPOINTID_PRIMARY_VIEW;
  305. break;
  306. default:
  307. {
  308. insertionID = 0;
  309. continue;
  310. }
  311. break;
  312. }
  313. menuItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
  314. menuItemInfo.fType = MFT_STRING;
  315. TCHAR szMenuText[128];
  316. for (int j = 0; 1; j++)
  317. {
  318. menuItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
  319. menuItemInfo.fType = MFT_STRING;
  320. menuItemInfo.cch = 128;
  321. menuItemInfo.dwTypeData = szMenuText;
  322. TCHAR szStatusBar[256];
  323. if (!GetMenuItemInfo(hSubMenu, j, TRUE, &menuItemInfo))
  324. break;
  325. if (menuItemInfo.fType != MFT_STRING)
  326. continue;
  327. /*pT->*/UpdateMenuState(menuItemInfo.wID, szMenuText, &menuItemInfo.fState);
  328. LoadString(_Module.GetResourceInstance(), menuItemInfo.wID, szStatusBar, 256);
  329. OLECHAR wszStatusBar[256];
  330. OLECHAR wszMenuText[128];
  331. USES_CONVERSION;
  332. ocscpy(wszMenuText, T2OLE(szMenuText));
  333. ocscpy(wszStatusBar, T2OLE(szStatusBar));
  334. CONTEXTMENUITEM contextMenuItem;
  335. contextMenuItem.strName = wszMenuText;
  336. contextMenuItem.strStatusBarText = wszStatusBar;
  337. contextMenuItem.lCommandID = menuItemInfo.wID;
  338. contextMenuItem.lInsertionPointID = insertionID;
  339. contextMenuItem.fFlags = menuItemInfo.fState;
  340. contextMenuItem.fSpecialFlags = 0;
  341. HRESULT hr = piCallback->AddItem(&contextMenuItem);
  342. ATLASSERT(SUCCEEDED(hr));
  343. }
  344. }
  345. DestroyMenu(hMenu);
  346. }
  347. if (!bIsExtension)
  348. /*pT->*/SetMenuInsertionFlags(true, pInsertionAllowed);
  349. return S_OK;
  350. }
  351. HRESULT CMultiSelectItemDataObject::OnVersionInfo(bool &bHandled, CSnapInObjectRootBase* pObj)
  352. {
  353. HRESULT hr=S_OK;
  354. /* CVersionInfoDlg dlg;
  355. dlg.DoModal();
  356. */ hr = S_OK;
  357. return hr;
  358. }
  359. HRESULT CMultiSelectItemDataObject::OnMoveMultipleObjs(bool &bHandled, CSnapInObjectRootBase* pObj)
  360. {
  361. HRESULT hr = S_OK;
  362. CComPtr<IConsole> pConsole;
  363. hr = GetConsoleFromCSnapInObjectRootBase(pObj, &pConsole);
  364. if (FAILED(hr))
  365. return hr;
  366. return hr;
  367. }