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.

382 lines
9.2 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1996-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // BasePSht.cpp
  7. //
  8. // Abstract:
  9. // Implementation of the CBasePropertySheet class.
  10. //
  11. // Author:
  12. // David Potter (davidp) August 31, 1996
  13. //
  14. // Revision History:
  15. //
  16. // Notes:
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "BasePSht.h"
  21. #include "ClusItem.h"
  22. #include "TraceTag.h"
  23. #include "BasePPag.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. /////////////////////////////////////////////////////////////////////////////
  30. // Global Variables
  31. /////////////////////////////////////////////////////////////////////////////
  32. #ifdef _DEBUG
  33. CTraceTag g_tagBasePropSheet(_T("UI"), _T("BASE PROP SHEET"), 0);
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CBasePropertySheet
  37. /////////////////////////////////////////////////////////////////////////////
  38. IMPLEMENT_DYNAMIC(CBasePropertySheet, CBaseSheet)
  39. /////////////////////////////////////////////////////////////////////////////
  40. // Message Maps
  41. /////////////////////////////////////////////////////////////////////////////
  42. BEGIN_MESSAGE_MAP(CBasePropertySheet, CBaseSheet)
  43. //{{AFX_MSG_MAP(CBasePropertySheet)
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. //++
  48. //
  49. // CBasePropertySheet::CBasePropertySheet
  50. //
  51. // Routine Description:
  52. // Constructor.
  53. //
  54. // Arguments:
  55. // pParentWnd [IN OUT] Parent window for this property sheet.
  56. // iSelectPage [IN] Page to show first.
  57. //
  58. // Return Value:
  59. // None.
  60. //
  61. //--
  62. /////////////////////////////////////////////////////////////////////////////
  63. CBasePropertySheet::CBasePropertySheet(
  64. IN OUT CWnd * pParentWnd,
  65. IN UINT iSelectPage
  66. )
  67. :
  68. CBaseSheet(pParentWnd, iSelectPage)
  69. {
  70. m_pci = NULL;
  71. } //*** CBasePropertySheet::CBaseSheet()
  72. /////////////////////////////////////////////////////////////////////////////
  73. //++
  74. //
  75. // CBasePropertySheet::~CBasePropertySheet
  76. //
  77. // Routine Description:
  78. // Destructor.
  79. //
  80. // Arguments:
  81. // None.
  82. //
  83. // Return Value:
  84. // None.
  85. //
  86. //--
  87. /////////////////////////////////////////////////////////////////////////////
  88. CBasePropertySheet::~CBasePropertySheet(void)
  89. {
  90. if (m_pci != NULL)
  91. m_pci->Release();
  92. } //*** CBasePropertySheet::~CBasePropertySheet()
  93. /////////////////////////////////////////////////////////////////////////////
  94. //++
  95. //
  96. // CBasePropertySheet::BInit
  97. //
  98. // Routine Description:
  99. // Initialize the property sheet.
  100. //
  101. // Arguments:
  102. // pci [IN OUT] Cluster item whose properties are to be displayed.
  103. // iimgIcon [IN] Index in the large image list for the image to use
  104. // as the icon on each page.
  105. //
  106. // Return Value:
  107. // TRUE Property sheet initialized successfully.
  108. // FALSE Error initializing property sheet.
  109. //
  110. //--
  111. /////////////////////////////////////////////////////////////////////////////
  112. BOOL CBasePropertySheet::BInit(
  113. IN OUT CClusterItem * pci,
  114. IN IIMG iimgIcon
  115. )
  116. {
  117. BOOL bSuccess = TRUE;
  118. CWaitCursor wc;
  119. ASSERT_VALID(pci);
  120. // Call the base class method.
  121. if (!CBaseSheet::BInit(iimgIcon))
  122. return FALSE;
  123. ASSERT(m_pci == NULL);
  124. m_pci = pci;
  125. pci->AddRef();
  126. try
  127. {
  128. // Set the object title.
  129. m_strObjTitle = Pci()->PszTitle();
  130. // Set the property sheet caption.
  131. SetCaption(StrObjTitle());
  132. // Add non-extension pages.
  133. {
  134. CBasePropertyPage ** ppages = Ppages();
  135. int cpages = Cpages();
  136. int ipage;
  137. ASSERT(ppages != NULL);
  138. ASSERT(cpages != 0);
  139. for (ipage = 0 ; ipage < cpages ; ipage++)
  140. {
  141. ASSERT_VALID(ppages[ipage]);
  142. ppages[ipage]->BInit(this);
  143. AddPage(ppages[ipage]);
  144. } // for: each page
  145. } // Add non-extension pages
  146. // Add extension pages.
  147. AddExtensionPages(Pci()->PlstrExtensions(), Pci());
  148. } // try
  149. catch (CException * pe)
  150. {
  151. pe->ReportError();
  152. pe->Delete();
  153. bSuccess = FALSE;
  154. } // catch: anything
  155. return bSuccess;
  156. } //*** CBasePropertySheet::BInit()
  157. /////////////////////////////////////////////////////////////////////////////
  158. //++
  159. //
  160. // CBasePropertySheet::DoModal
  161. //
  162. // Routine Description:
  163. // Display a modal property sheet.
  164. //
  165. // Arguments:
  166. // None.
  167. //
  168. // Return Value:
  169. // id Control the user pressed to dismiss the sheet.
  170. //
  171. //--
  172. /////////////////////////////////////////////////////////////////////////////
  173. INT_PTR CBasePropertySheet::DoModal(void)
  174. {
  175. INT_PTR id = IDCANCEL;
  176. // Don't display a help button.
  177. m_psh.dwFlags &= ~PSH_HASHELP;
  178. // Display the property sheet.
  179. id = CBaseSheet::DoModal();
  180. // Update the state.
  181. Trace(g_tagBasePropSheet, _T("DoModal: Calling UpdateState()"));
  182. Pci()->UpdateState();
  183. return id;
  184. } //*** CBasePropertySheet::DoModal()
  185. /////////////////////////////////////////////////////////////////////////////
  186. //++
  187. //
  188. // CBasePropertySheet::AddExtensionPages
  189. //
  190. // Routine Description:
  191. // Add extension pages to the sheet.
  192. //
  193. // Arguments:
  194. // plstrExtensions [IN] List of extension names (CLSIDs).
  195. // pci [IN OUT] Cluster item.
  196. //
  197. // Return Value:
  198. // None.
  199. //
  200. //--
  201. /////////////////////////////////////////////////////////////////////////////
  202. void CBasePropertySheet::AddExtensionPages(
  203. IN const CStringList * plstrExtensions,
  204. IN OUT CClusterItem * pci
  205. )
  206. {
  207. ASSERT_VALID(pci);
  208. // Add extension pages.
  209. if ((plstrExtensions != NULL)
  210. && (plstrExtensions->GetCount() > 0))
  211. {
  212. // Enclose the loading of the extension in a try/catch block so
  213. // that the loading of the extension won't prevent all pages
  214. // from being displayed.
  215. try
  216. {
  217. Ext().CreatePropertySheetPages(
  218. this,
  219. *plstrExtensions,
  220. pci,
  221. NULL,
  222. Hicon()
  223. );
  224. } // try
  225. catch (CException * pe)
  226. {
  227. pe->ReportError();
  228. pe->Delete();
  229. } // catch: CException
  230. catch (...)
  231. {
  232. } // catch: anything
  233. } // Add extension pages
  234. } //*** CBasePropertySheet::AddExtensionPages()
  235. /////////////////////////////////////////////////////////////////////////////
  236. //++
  237. //
  238. // CBasePropertySheet::HrAddPage
  239. //
  240. // Routine Description:
  241. // Add an extension page.
  242. //
  243. // Arguments:
  244. // hpage [IN OUT] Page to be added.
  245. //
  246. // Return Value:
  247. // TRUE Page added successfully.
  248. // FALSE Page not added.
  249. //
  250. //--
  251. /////////////////////////////////////////////////////////////////////////////
  252. HRESULT CBasePropertySheet::HrAddPage(IN OUT HPROPSHEETPAGE hpage)
  253. {
  254. HRESULT hr = ERROR_SUCCESS;
  255. ASSERT(hpage != NULL);
  256. if (hpage == NULL)
  257. return FALSE;
  258. // Add the page to the end of the list.
  259. try
  260. {
  261. Lhpage().AddTail(hpage);
  262. } // try
  263. catch (...)
  264. {
  265. hr = ERROR_NOT_ENOUGH_MEMORY;
  266. } // catch: anything
  267. return hr;
  268. } //*** CBasePropertySheet::HrAddPage()
  269. /////////////////////////////////////////////////////////////////////////////
  270. //++
  271. //
  272. // CBasePropertySheet::OnInitDialog
  273. //
  274. // Routine Description:
  275. // Handler for the WM_INITDIALOG message.
  276. //
  277. // Arguments:
  278. // None.
  279. //
  280. // Return Value:
  281. // TRUE Focus not set yet.
  282. // FALSE Focus already set.
  283. //
  284. //--
  285. /////////////////////////////////////////////////////////////////////////////
  286. BOOL CBasePropertySheet::OnInitDialog(void)
  287. {
  288. BOOL bFocusNotSet;
  289. bFocusNotSet = CBaseSheet::OnInitDialog();
  290. // Add all the extension pages.
  291. {
  292. POSITION pos;
  293. HPROPSHEETPAGE hpage;
  294. pos = Lhpage().GetHeadPosition();
  295. while (pos != NULL)
  296. {
  297. hpage = (HPROPSHEETPAGE) Lhpage().GetNext(pos);
  298. SendMessage(PSM_ADDPAGE, 0, (LPARAM) hpage);
  299. } // while: more pages to add
  300. } // Add all the extension pages
  301. return bFocusNotSet;
  302. } //*** CBasePropertySheet::OnInitDialog()
  303. /////////////////////////////////////////////////////////////////////////////
  304. //++
  305. //
  306. // CBasePropertySheet::SetCaption
  307. //
  308. // Routine Description:
  309. // Set the caption for the property sheet.
  310. //
  311. // Arguments:
  312. // pszTitle [IN] String to be included in the caption.
  313. //
  314. // Return Value:
  315. // None.
  316. //
  317. //--
  318. /////////////////////////////////////////////////////////////////////////////
  319. void CBasePropertySheet::SetCaption(IN LPCTSTR pszTitle)
  320. {
  321. CString strCaption;
  322. ASSERT(pszTitle != NULL);
  323. try
  324. {
  325. strCaption.FormatMessage(IDS_PROPSHEET_CAPTION, pszTitle);
  326. SetTitle(strCaption);
  327. } // try
  328. catch (CException * pe)
  329. {
  330. // Ignore the error.
  331. pe->Delete();
  332. } // catch: CException
  333. } //*** CBasePropertySheet::SetCaption()