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.

516 lines
13 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1996-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // BaseWiz.cpp
  7. //
  8. // Description:
  9. // Implementation of the CBaseWizard class.
  10. //
  11. // Maintained By:
  12. // David Potter (davidp) July 23, 1996
  13. //
  14. // Revision History:
  15. //
  16. // Notes:
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "BaseWiz.h"
  21. #include "BaseWPag.h"
  22. #include "ClusItem.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CBaseWizard
  30. /////////////////////////////////////////////////////////////////////////////
  31. IMPLEMENT_DYNAMIC( CBaseWizard, CBaseSheet )
  32. /////////////////////////////////////////////////////////////////////////////
  33. // Message Maps
  34. BEGIN_MESSAGE_MAP( CBaseWizard, CBaseSheet )
  35. //{{AFX_MSG_MAP(CBaseWizard)
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP( )
  38. /////////////////////////////////////////////////////////////////////////////
  39. //++
  40. //
  41. // CBaseWizard::CBaseWizard
  42. //
  43. // Routine Description:
  44. // Constructor.
  45. //
  46. // Arguments:
  47. // nIDCaption [IN] String resource ID for the caption for the wizard.
  48. // pParentWnd [IN OUT] Parent window for this property sheet.
  49. // iSelectPage [IN] Page to show first.
  50. //
  51. // Return Value:
  52. // None.
  53. //
  54. //--
  55. /////////////////////////////////////////////////////////////////////////////
  56. CBaseWizard::CBaseWizard(
  57. IN UINT nIDCaption,
  58. IN OUT CWnd * pParentWnd,
  59. IN UINT iSelectPage
  60. )
  61. : CBaseSheet( nIDCaption, pParentWnd, iSelectPage )
  62. {
  63. m_pci = NULL;
  64. m_bNeedToLoadExtensions = TRUE;
  65. } //*** CBaseWizard::CBaseWizard( )
  66. /////////////////////////////////////////////////////////////////////////////
  67. //++
  68. //
  69. // CBaseWizard::BInit
  70. //
  71. // Routine Description:
  72. // Initialize the wizard.
  73. //
  74. // Arguments:
  75. // iimgIcon [IN] Index in the large image list for the image to use
  76. // as the icon on each page.
  77. //
  78. // Return Value:
  79. // TRUE Wizard initialized successfully.
  80. // FALSE Wizard not initialized successfully.
  81. //
  82. // Exceptions Thrown:
  83. // None.
  84. //
  85. //--
  86. /////////////////////////////////////////////////////////////////////////////
  87. BOOL CBaseWizard::BInit( IN IIMG iimgIcon )
  88. {
  89. BOOL bSuccess = TRUE;
  90. CWaitCursor wc;
  91. // Call the base class method.
  92. if ( ! CBaseSheet::BInit( iimgIcon ) )
  93. {
  94. return FALSE;
  95. } // if
  96. // Make this sheet a wizard.
  97. SetWizardMode( );
  98. // Add non-extension pages.
  99. try
  100. {
  101. // Add non-extension pages.
  102. {
  103. CWizPage * ppages = Ppages( );
  104. int cpages = Cpages( );
  105. int ipage;
  106. ASSERT( ppages != NULL );
  107. ASSERT( cpages != 0 );
  108. for ( ipage = 0 ; ipage < cpages ; ipage++ )
  109. {
  110. ASSERT_VALID( ppages[ ipage ].m_pwpage );
  111. ppages[ ipage ].m_pwpage->BInit( this );
  112. AddPage( ppages[ ipage ].m_pwpage );
  113. } // for: each page
  114. } // Add non-extension pages
  115. } // try
  116. catch ( CException * pe )
  117. {
  118. pe->ReportError( );
  119. pe->Delete( );
  120. bSuccess = FALSE;
  121. } // catch: anything
  122. return bSuccess;
  123. } //*** CBaseWizard::BInit( )
  124. /////////////////////////////////////////////////////////////////////////////
  125. //++
  126. //
  127. // CBaseWizard::DoModal
  128. //
  129. // Routine Description:
  130. // Display a modal wizard. Calls OnWizardFinish( ) or OnCancel( ) based
  131. // on what the user pressed to dismiss the wizard.
  132. //
  133. // Arguments:
  134. // None.
  135. //
  136. // Return Value:
  137. // id Control the user pressed to dismiss the wizard.
  138. //
  139. //--
  140. /////////////////////////////////////////////////////////////////////////////
  141. INT_PTR CBaseWizard::DoModal( void )
  142. {
  143. INT_PTR id;
  144. // Don't display a help button.
  145. m_psh.dwFlags &= ~PSH_HASHELP;
  146. // Display the property sheet.
  147. id = CBaseSheet::DoModal( );
  148. if ( id == ID_WIZFINISH )
  149. {
  150. OnWizardFinish( );
  151. } // if
  152. else if ( id == IDCANCEL )
  153. {
  154. OnCancel( );
  155. } // else
  156. return id;
  157. } //*** CBaseWizard::DoModal( )
  158. /////////////////////////////////////////////////////////////////////////////
  159. //++
  160. //
  161. // CBaseWizard::OnInitDialog
  162. //
  163. // Routine Description:
  164. // Handler for the WM_INITDIALOG message.
  165. //
  166. // Arguments:
  167. // None.
  168. //
  169. // Return Value:
  170. // TRUE Focus not set yet.
  171. // FALSE Focus already set.
  172. //
  173. //--
  174. /////////////////////////////////////////////////////////////////////////////
  175. BOOL CBaseWizard::OnInitDialog( void )
  176. {
  177. BOOL bFocusNotSet;
  178. // Call the base class method.
  179. bFocusNotSet = CBaseSheet::OnInitDialog( );
  180. // Remove the system menu.
  181. ModifyStyle( WS_SYSMENU, 0 );
  182. return bFocusNotSet;
  183. } //*** CBaseWizard::OnInitDialog( )
  184. /////////////////////////////////////////////////////////////////////////////
  185. //++
  186. //
  187. // CBaseWizard::OnWizardFinish
  188. //
  189. // Routine Description:
  190. // Called after the wizard has been dismissed when the Finish button
  191. // has been pressed.
  192. //
  193. // Arguments:
  194. // None.
  195. //
  196. // Return Value:
  197. // None.
  198. //
  199. //--
  200. /////////////////////////////////////////////////////////////////////////////
  201. void CBaseWizard::OnWizardFinish( void )
  202. {
  203. } //*** CBaseWizard::OnWizardFinish( )
  204. /////////////////////////////////////////////////////////////////////////////
  205. //++
  206. //
  207. // CBaseWizard::OnCancel
  208. //
  209. // Routine Description:
  210. // Called after the wizard has been dismissed when the Cancel button
  211. // has been pressed.
  212. //
  213. // Arguments:
  214. // None.
  215. //
  216. // Return Value:
  217. // None.
  218. //
  219. //--
  220. /////////////////////////////////////////////////////////////////////////////
  221. void CBaseWizard::OnCancel( void )
  222. {
  223. } //*** CBaseWizard::OnCancel( )
  224. /////////////////////////////////////////////////////////////////////////////
  225. //++
  226. //
  227. // CBaseWizard::LoadExtensions
  228. //
  229. // Routine Description:
  230. // Load extensions to the wizard. Unload existing extension pages
  231. // if necessary.
  232. //
  233. // Arguments:
  234. // pci [IN OUT] Cluster item.
  235. //
  236. // Return Value:
  237. // None.
  238. //
  239. //--
  240. /////////////////////////////////////////////////////////////////////////////
  241. void CBaseWizard::LoadExtensions(
  242. IN OUT CClusterItem * pci
  243. )
  244. {
  245. ASSERT_VALID( pci );
  246. if ( BNeedToLoadExtensions( ) )
  247. {
  248. // Remove previous extensions.
  249. {
  250. POSITION pos;
  251. pos = Lhpage( ).GetHeadPosition( );
  252. while ( pos != NULL )
  253. {
  254. SendMessage( PSM_REMOVEPAGE, 0, (LPARAM) Lhpage( ).GetNext( pos ) );
  255. } // while
  256. Lhpage( ).RemoveAll( );
  257. } // Remove previous extensions
  258. // Add extension pages.
  259. m_pci = pci;
  260. AddExtensionPages( Pci( )->PlstrExtensions( ), Pci( ) );
  261. m_bNeedToLoadExtensions = FALSE;
  262. // Set the last page's wizard button setting.
  263. {
  264. CWizPage * pwizpg = &Ppages( )[ Cpages( ) - 1 ];
  265. if ( Lhpage( ).GetCount( ) == 0 )
  266. {
  267. pwizpg->m_dwWizButtons &= ~PSWIZB_NEXT;
  268. pwizpg->m_dwWizButtons |= PSWIZB_FINISH;
  269. } // if: no pages added
  270. else
  271. {
  272. pwizpg->m_dwWizButtons |= PSWIZB_NEXT;
  273. pwizpg->m_dwWizButtons &= ~PSWIZB_FINISH;
  274. } // else: some pages were added
  275. } // Set the last page's wizard button setting
  276. } // if: extensions need to be loaded
  277. } //*** CBaseWizard::LoadExtensions( )
  278. /////////////////////////////////////////////////////////////////////////////
  279. //++
  280. //
  281. // CBaseWizard::AddExtensionPages
  282. //
  283. // Routine Description:
  284. // Add extension pages to the sheet.
  285. //
  286. // Arguments:
  287. // plstrExtensions [IN] List of extension names (CLSIDs).
  288. // pci [IN OUT] Cluster item.
  289. //
  290. // Return Value:
  291. // None.
  292. //
  293. //--
  294. /////////////////////////////////////////////////////////////////////////////
  295. void CBaseWizard::AddExtensionPages(
  296. IN const CStringList * plstrExtensions,
  297. IN OUT CClusterItem * pci
  298. )
  299. {
  300. ASSERT_VALID( pci );
  301. // Add extension pages.
  302. if ( ( plstrExtensions != NULL )
  303. && ( plstrExtensions->GetCount( ) > 0 ) )
  304. {
  305. // Enclose the loading of the extension in a try/catch block so
  306. // that the loading of the extension won't prevent all pages
  307. // from being displayed.
  308. try
  309. {
  310. Ext( ).CreateWizardPages(
  311. this,
  312. *plstrExtensions,
  313. pci,
  314. NULL,
  315. Hicon( )
  316. );
  317. } // try
  318. catch ( CException * pe )
  319. {
  320. pe->ReportError( );
  321. pe->Delete( );
  322. } // catch: CException
  323. catch ( ... )
  324. {
  325. } // catch: anything
  326. } // Add extension pages
  327. } //*** CBaseWizard::AddExtensionPages( )
  328. /////////////////////////////////////////////////////////////////////////////
  329. //++
  330. //
  331. // CBaseWizard::SetWizardButtons
  332. //
  333. // Routine Description:
  334. // Set the wizard buttons based on which page is asking.
  335. //
  336. // Arguments:
  337. // rwpage [IN] Page to set the buttons for.
  338. //
  339. // Return Value:
  340. // None.
  341. //
  342. //--
  343. /////////////////////////////////////////////////////////////////////////////
  344. void CBaseWizard::SetWizardButtons( IN const CBaseWizardPage & rwpage )
  345. {
  346. CWizPage * pwizpg;
  347. pwizpg = PwizpgFromPwpage( rwpage );
  348. if ( pwizpg != NULL )
  349. {
  350. SetWizardButtons( pwizpg->m_dwWizButtons );
  351. } // if: page was found
  352. } //*** CBaseWizard::SetWizardButtons( )
  353. /////////////////////////////////////////////////////////////////////////////
  354. //++
  355. //
  356. // CBaseWizard::EnableNext
  357. //
  358. // Routine Description:
  359. // Enables or disables the NEXT or FINISH button.
  360. //
  361. // Arguments:
  362. // bEnable [IN] TRUE = enable the button, FALSE = disable the button.
  363. //
  364. // Return Value:
  365. // None.
  366. //
  367. //--
  368. /////////////////////////////////////////////////////////////////////////////
  369. void CBaseWizard::EnableNext(
  370. IN const CBaseWizardPage & rwpage,
  371. IN BOOL bEnable /*=TRUE*/
  372. )
  373. {
  374. DWORD dwWizButtons;
  375. CWizPage * pwizpg;
  376. pwizpg = PwizpgFromPwpage( rwpage );
  377. if ( pwizpg != NULL )
  378. {
  379. dwWizButtons = pwizpg->m_dwWizButtons;
  380. if ( ! bEnable )
  381. {
  382. dwWizButtons &= ~( PSWIZB_NEXT | PSWIZB_FINISH );
  383. if ( pwizpg->m_dwWizButtons & PSWIZB_FINISH )
  384. {
  385. dwWizButtons |= PSWIZB_DISABLEDFINISH;
  386. } // if
  387. } // if: disabling the button
  388. SetWizardButtons( dwWizButtons );
  389. } // if: page was found
  390. } //*** CBaseWizard::EnableNext( )
  391. /////////////////////////////////////////////////////////////////////////////
  392. //++
  393. //
  394. // CBaseWizard::PwizpgFromPwpage
  395. //
  396. // Routine Description:
  397. // Find the CWizPage entry for the specified CBaseWizardPage.
  398. //
  399. // Arguments:
  400. // rwpage [IN] Page to search for.
  401. //
  402. // Return Value:
  403. // pwizpg Entry in the Ppages( ) array.
  404. //
  405. //--
  406. /////////////////////////////////////////////////////////////////////////////
  407. CWizPage * CBaseWizard::PwizpgFromPwpage( IN const CBaseWizardPage & rwpage )
  408. {
  409. int cwizpg = Cpages( );
  410. CWizPage * pwizpg = Ppages( );
  411. while ( cwizpg-- > 0 )
  412. {
  413. if ( pwizpg->m_pwpage == &rwpage )
  414. {
  415. return pwizpg;
  416. } // if
  417. pwizpg++;
  418. } // while: more pages in the list
  419. return NULL;
  420. } //*** CBaseWizard::PwizpgFromPwpage( )
  421. /////////////////////////////////////////////////////////////////////////////
  422. //++
  423. //
  424. // CBaseWizard::HrAddPage
  425. //
  426. // Routine Description:
  427. // Add an extension page.
  428. //
  429. // Arguments:
  430. // hpage [IN OUT] Page to be added.
  431. //
  432. // Return Value:
  433. // S_OK Page added successfully.
  434. // S_FALSE Page not added.
  435. //
  436. //--
  437. /////////////////////////////////////////////////////////////////////////////
  438. HRESULT CBaseWizard::HrAddPage( IN OUT HPROPSHEETPAGE hpage )
  439. {
  440. HRESULT hr = S_OK;
  441. ASSERT( hpage != NULL );
  442. if ( hpage == NULL )
  443. {
  444. return S_FALSE;
  445. } // if
  446. // Add the page to the wizard.
  447. try
  448. {
  449. // Add the page to the wizard.
  450. SendMessage( PSM_ADDPAGE, 0, (LPARAM) hpage );
  451. // Add the page to the end of the list.
  452. Lhpage( ).AddTail( hpage );
  453. } // try
  454. catch ( CMemoryException * pme )
  455. {
  456. hr = ERROR_NOT_ENOUGH_MEMORY;
  457. pme->Delete( );
  458. } // catch: anything
  459. return hr;
  460. } //*** CBaseWizard::HrAddPage( )