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.

431 lines
11 KiB

  1. #ifndef NETNODE_H
  2. #define NETNODE_H
  3. #include <atlsnap.h>
  4. #include "resource.h"
  5. #include "DomMigSI.h"
  6. #include "DomMigr.h"
  7. #include "Globals.h"
  8. #include "HtmlHelp.h"
  9. #include "HelpID.h"
  10. #define MAX_COLUMNS 6
  11. extern CSnapInToolbarInfo m_toolBar;
  12. template <class T>
  13. class ATL_NO_VTABLE CNetNode : public CSnapInItemImpl<T>
  14. {
  15. public:
  16. //
  17. bool m_bExpanded;
  18. int m_iColumnWidth[MAX_COLUMNS];
  19. bool m_bIsDirty;
  20. bool m_bLoaded;
  21. //
  22. CPtrArray m_ChildArray;
  23. CComPtr<IControlbar> m_spControlBar;
  24. CNetNode()
  25. {
  26. // Image indexes may need to be modified depending on the images specific to
  27. // the snapin.
  28. memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM));
  29. m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM;
  30. m_scopeDataItem.displayname = MMC_CALLBACK;
  31. m_scopeDataItem.nImage = 0; // May need modification
  32. m_scopeDataItem.nOpenImage = 0; // May need modification
  33. m_scopeDataItem.lParam = (LPARAM) this;
  34. memset(&m_resultDataItem, 0, sizeof(RESULTDATAITEM));
  35. m_resultDataItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
  36. m_resultDataItem.str = MMC_CALLBACK;
  37. m_resultDataItem.nImage = 0; // May need modification
  38. m_resultDataItem.lParam = (LPARAM) this;
  39. //
  40. CoInitialize( NULL );
  41. m_bLoaded = false;
  42. m_bExpanded = false;
  43. m_iColumnWidth[0] = 400;
  44. m_iColumnWidth[1] = 0;
  45. m_iColumnWidth[2] = 0;
  46. SetClean();
  47. }
  48. ~CNetNode()
  49. {
  50. for ( int i = 0; i < m_ChildArray.GetSize(); i++ )
  51. {
  52. delete (T *)(m_ChildArray[i]);
  53. }
  54. CoUninitialize();
  55. }
  56. STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem)
  57. {
  58. if (pScopeDataItem->mask & SDI_STR)
  59. pScopeDataItem->displayname = m_bstrDisplayName;
  60. if (pScopeDataItem->mask & SDI_IMAGE)
  61. pScopeDataItem->nImage = m_scopeDataItem.nImage;
  62. if (pScopeDataItem->mask & SDI_OPENIMAGE)
  63. pScopeDataItem->nOpenImage = m_scopeDataItem.nOpenImage;
  64. if (pScopeDataItem->mask & SDI_PARAM)
  65. pScopeDataItem->lParam = m_scopeDataItem.lParam;
  66. if (pScopeDataItem->mask & SDI_STATE )
  67. pScopeDataItem->nState = m_scopeDataItem.nState;
  68. pScopeDataItem->cChildren = (int)m_ChildArray.GetSize();
  69. return S_OK;
  70. }
  71. STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem)
  72. {
  73. if (pResultDataItem->bScopeItem)
  74. {
  75. if (pResultDataItem->mask & RDI_STR)
  76. {
  77. pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol);
  78. }
  79. if (pResultDataItem->mask & RDI_IMAGE)
  80. {
  81. pResultDataItem->nImage = m_scopeDataItem.nImage;
  82. }
  83. if (pResultDataItem->mask & RDI_PARAM)
  84. {
  85. pResultDataItem->lParam = m_scopeDataItem.lParam;
  86. }
  87. return S_OK;
  88. }
  89. if (pResultDataItem->mask & RDI_STR)
  90. {
  91. pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol);
  92. }
  93. if (pResultDataItem->mask & RDI_IMAGE)
  94. {
  95. pResultDataItem->nImage = m_resultDataItem.nImage;
  96. }
  97. if (pResultDataItem->mask & RDI_PARAM)
  98. {
  99. pResultDataItem->lParam = m_resultDataItem.lParam;
  100. }
  101. if (pResultDataItem->mask & RDI_INDEX)
  102. {
  103. pResultDataItem->nIndex = m_resultDataItem.nIndex;
  104. }
  105. return S_OK;
  106. }
  107. HRESULT __stdcall Notify( MMC_NOTIFY_TYPE event,
  108. long arg,
  109. long param,
  110. IComponentData* pComponentData,
  111. IComponent* pComponent,
  112. DATA_OBJECT_TYPES type)
  113. {
  114. // Add code to handle the different notifications.
  115. // Handle MMCN_SHOW and MMCN_EXPAND to enumerate children items.
  116. // In response to MMCN_SHOW you have to enumerate both the scope
  117. // and result pane items.
  118. // For MMCN_EXPAND you only need to enumerate the scope items
  119. // Use IConsoleNameSpace::InsertItem to insert scope pane items
  120. // Use IResultData::InsertItem to insert result pane item.
  121. HRESULT hr = E_NOTIMPL;
  122. _ASSERTE(pComponentData != NULL || pComponent != NULL);
  123. CComPtr<IConsole> spConsole;
  124. CComQIPtr<IHeaderCtrl, &IID_IHeaderCtrl> spHeader;
  125. if (pComponentData != NULL)
  126. spConsole = ((CDomMigrator*)pComponentData)->m_spConsole;
  127. else
  128. {
  129. spConsole = ((CDomMigratorComponent*)pComponent)->m_spConsole;
  130. spHeader = spConsole;
  131. }
  132. switch (event)
  133. {
  134. case MMCN_REMOVE_CHILDREN:
  135. hr = S_OK;
  136. break;
  137. case MMCN_SHOW:
  138. {
  139. CComQIPtr<IResultData, &IID_IResultData> spResultData(spConsole);
  140. bool bShow = (arg != 0);
  141. hr = OnShow( bShow, spHeader, spResultData );
  142. break;
  143. }
  144. /* case MMCN_EXPANDSYNC:
  145. {
  146. MMC_EXPANDSYNC_STRUCT *pExpandStruct = ( MMC_EXPANDSYNC_STRUCT *)param;
  147. break;
  148. }
  149. */
  150. case MMCN_EXPAND:
  151. {
  152. m_bExpanded = true;
  153. m_scopeDataItem.ID = param;
  154. hr = OnExpand( spConsole );
  155. hr = S_OK;
  156. break;
  157. }
  158. case MMCN_ADD_IMAGES:
  159. {
  160. // Add Images
  161. IImageList* pImageList = (IImageList*) arg;
  162. hr = E_FAIL;
  163. // Load bitmaps associated with the scope pane
  164. // and add them to the image list
  165. // Loads the default bitmaps generated by the wizard
  166. // Change as required
  167. HBITMAP hBitmap16 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_TOOL_16));
  168. if (hBitmap16 != NULL)
  169. {
  170. HBITMAP hBitmap32 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_TOOL_32));
  171. if (hBitmap32 != NULL)
  172. {
  173. hr = pImageList->ImageListSetStrip((long*)hBitmap16,
  174. (long*)hBitmap32, 0, RGB(0, 128, 128));
  175. if (FAILED(hr))
  176. ATLTRACE(_T("IImageList::ImageListSetStrip failed\n"));
  177. DeleteObject(hBitmap16);
  178. DeleteObject(hBitmap32);
  179. }
  180. }
  181. break;
  182. }
  183. case MMCN_DBLCLICK:
  184. {
  185. hr = S_FALSE;
  186. break;
  187. }
  188. case MMCN_REFRESH:
  189. {
  190. hr = OnRefresh(spConsole);
  191. // ShowErrorMsg( spConsole, hr, _T("Refresh All Domains") );
  192. break;
  193. }
  194. case MMCN_SELECT:
  195. {
  196. //
  197. // Call our select handler.
  198. //
  199. bool bScope = (LOWORD(arg) != 0 );
  200. bool bSelect = (HIWORD(arg) != 0 );
  201. hr = OnSelect( bScope, bSelect, spConsole );
  202. break;
  203. }
  204. case MMCN_SNAPINHELP:
  205. {
  206. // break;
  207. }
  208. case MMCN_HELP :
  209. {
  210. // break;
  211. }
  212. case MMCN_CONTEXTHELP:
  213. {
  214. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  215. HWND mainHwnd;
  216. CComBSTR bstrTopic;
  217. HRESULT hr;
  218. IDisplayHelp * pHelp = NULL;
  219. ATLTRACE(_T("MMCN_SNAPINHELP\n"));
  220. spConsole->GetMainWindow( &mainHwnd );
  221. hr = spConsole->QueryInterface(IID_IDisplayHelp,(void**)&pHelp);
  222. if ( SUCCEEDED(hr) )
  223. {
  224. CString strTopic;
  225. strTopic.FormatMessage(IDS_HelpFileIntroTopic);
  226. if ( SUCCEEDED(hr) )
  227. {
  228. hr = pHelp->ShowTopic(strTopic.AllocSysString());
  229. if ( FAILED(hr) )
  230. {
  231. CString s;
  232. s.LoadString(IDS_FAILED);
  233. MessageBox(NULL,s,L"",MB_OK);
  234. }
  235. }
  236. else
  237. {
  238. CString s;
  239. s.LoadString(IDS_FAILED);
  240. MessageBox(NULL,s,L"",MB_OK);
  241. }
  242. pHelp->Release();
  243. }
  244. }
  245. return S_OK;
  246. default:
  247. break;
  248. }
  249. return hr;
  250. }
  251. virtual LPOLESTR GetResultPaneColInfo(int nCol)
  252. {
  253. if (nCol == 0)
  254. return m_bstrDisplayName;
  255. // TODO : Return the text for other columns
  256. return OLESTR("Override GetResultPaneColInfo");
  257. }
  258. // Message handler helpers
  259. HRESULT OnSelect( bool bScope, bool bSelect, IConsole* pConsole )
  260. {
  261. HRESULT hr=S_OK;
  262. if ( bSelect )
  263. {
  264. CComPtr<IConsoleVerb> spConsoleVerb;
  265. hr = pConsole->QueryConsoleVerb( &spConsoleVerb );
  266. if ( FAILED( hr ) )
  267. return hr;
  268. //
  269. // Enable the refresh verb.
  270. //
  271. hr = spConsoleVerb->SetVerbState( MMC_VERB_REFRESH, ENABLED, TRUE );
  272. if ( FAILED( hr ) )
  273. return hr;
  274. }
  275. return( hr );
  276. }
  277. virtual BOOL ShowInScopePane() { return TRUE; }
  278. virtual HRESULT OnExpand( IConsole *spConsole )
  279. {
  280. HRESULT hr=S_OK;
  281. CComQIPtr<IConsoleNameSpace, &IID_IConsoleNameSpace> spConsoleNameSpace(spConsole);
  282. //
  283. // Enumerate scope pane items
  284. //
  285. for (int i = 0; i < m_ChildArray.GetSize(); ++i)
  286. {
  287. if ( ((CNetNode*)m_ChildArray[i])->ShowInScopePane() )
  288. {
  289. hr = InsertNodeToScopepane(spConsoleNameSpace, (CNetNode*)m_ChildArray[i], m_scopeDataItem.ID );
  290. if (FAILED(hr))
  291. break;
  292. }
  293. }
  294. return hr;
  295. }
  296. virtual HRESULT OnShow( bool bShow, IHeaderCtrl *spHeader, IResultData *spResultData)
  297. {
  298. HRESULT hr=S_OK;
  299. if (bShow)
  300. { // show
  301. {
  302. CString cstr;
  303. CComBSTR text;
  304. cstr.Format(_T("%d subitem(s)"), m_ChildArray.GetSize() );
  305. text = (LPCTSTR)cstr;
  306. spResultData->SetDescBarText( BSTR(text) );
  307. }
  308. }
  309. else
  310. { // hide
  311. // save the column widths
  312. spHeader->GetColumnWidth(0, m_iColumnWidth);
  313. spHeader->GetColumnWidth(1, m_iColumnWidth + 1);
  314. spHeader->GetColumnWidth(2, m_iColumnWidth + 2);
  315. }
  316. hr = S_OK;
  317. return hr;
  318. }
  319. HRESULT OnRefresh(IConsole *spConsole)
  320. {
  321. HRESULT hr=S_OK;
  322. int i;
  323. if ( m_bExpanded )
  324. {
  325. // Refresh the children
  326. for ( i = 0; i < m_ChildArray.GetSize(); i++ )
  327. {
  328. hr = ((T *)m_ChildArray[i])->OnRefresh(spConsole);
  329. if ( FAILED(hr) )
  330. break;
  331. }
  332. }
  333. if ( FAILED(hr) )
  334. {
  335. ATLTRACE("CNetNode::OnRefresh failed, hr = %lx\n", hr );
  336. }
  337. return hr;
  338. }
  339. HRESULT OnGroupDDSetup(bool &bHandled, CSnapInObjectRootBase* pObj) { return S_OK; }
  340. HRESULT OnVersionInfo(bool &bHandled, CSnapInObjectRootBase* pObj) { return S_OK; }
  341. void UpdateMenuState( UINT id, LPTSTR pBuf, UINT *flags)
  342. {
  343. if ( id == ID_TASK_UNDO )
  344. {
  345. //if ( CanUndo(pBuf) )
  346. // *flags = MF_ENABLED;
  347. // else
  348. *flags = MF_GRAYED;
  349. }
  350. if ( id == ID_TASK_REDO )
  351. {
  352. // if ( CanRedo(pBuf) )
  353. // *flags = MF_ENABLED;
  354. // else
  355. *flags = MF_GRAYED;
  356. }
  357. }
  358. // IPersistStreamImpl
  359. HRESULT Load(IStream *pStm);
  360. HRESULT Save(IStream *pStm, BOOL fClearDirty);
  361. HRESULT GetSaveSizeMax(ULARGE_INTEGER *pcbSize);
  362. HRESULT Loaded()
  363. {
  364. if ( m_bLoaded )
  365. return S_OK;
  366. else
  367. return S_FALSE;
  368. }
  369. HRESULT IsDirty();
  370. void SetDirty()
  371. {
  372. m_bIsDirty = S_OK;
  373. }
  374. void SetClean()
  375. {
  376. m_bIsDirty = S_FALSE;
  377. }
  378. static CSnapInToolbarInfo* GetToolbarInfo()
  379. {
  380. return (CSnapInToolbarInfo*)&m_toolBar;
  381. }
  382. };
  383. #endif