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.

447 lines
12 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1996-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // LCPrPage.cpp
  7. //
  8. // Abstract:
  9. // Implementation of the CListCtrlPairPage dialog template class.
  10. //
  11. // Author:
  12. // David Potter (davidp) August 12, 1996
  13. //
  14. // Revision History:
  15. //
  16. // Notes:
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "LCPrPage.h"
  21. #include "OLCPair.h"
  22. #include "HelpData.h" // for g_rghelpmap*
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CListCtrlPairPage
  30. /////////////////////////////////////////////////////////////////////////////
  31. IMPLEMENT_DYNCREATE(CListCtrlPairPage, CBasePropertyPage)
  32. /////////////////////////////////////////////////////////////////////////////
  33. // Message Maps
  34. BEGIN_MESSAGE_MAP(CListCtrlPairPage, CBasePropertyPage)
  35. //{{AFX_MSG_MAP(CListCtrlPairPage)
  36. ON_WM_CONTEXTMENU()
  37. //}}AFX_MSG_MAP
  38. END_MESSAGE_MAP()
  39. /////////////////////////////////////////////////////////////////////////////
  40. //++
  41. //
  42. // CListCtrlPairPage::CListCtrlPairPage
  43. //
  44. // Routine Description:
  45. // Constructor.
  46. //
  47. // Arguments:
  48. // None.
  49. //
  50. // Return Value:
  51. // None.
  52. //
  53. //--
  54. /////////////////////////////////////////////////////////////////////////////
  55. CListCtrlPairPage::CListCtrlPairPage(void)
  56. {
  57. CommonConstruct();
  58. } //*** CListCtrlPairPage::CListCtrlPairPage()
  59. /////////////////////////////////////////////////////////////////////////////
  60. //++
  61. //
  62. // CListCtrlPairPage::CListCtrlPairPage
  63. //
  64. // Routine Description:
  65. // Constructor.
  66. //
  67. // Arguments:
  68. // idd [IN] Resource ID for the dialog template.
  69. // pdwHelpMap [IN] Control-to-Help ID mapping array.
  70. // dwStyle [IN] Style:
  71. // LCPS_SHOW_IMAGES Show images to left of items.
  72. // LCPS_ALLOW_EMPTY Allow right list to be empty.
  73. // LCPS_ORDERED Ordered right list.
  74. // LCPS_CAN_BE_ORDERED List can be ordered (hides
  75. // Up/Down puttons if LCPS_ORDERED not specified).
  76. // pfnGetColumn [IN] Function pointer for getting column data.
  77. // pfnDisplayProps [IN] Function pointer for displaying properties.
  78. //
  79. // Return Value:
  80. // None.
  81. //
  82. //--
  83. /////////////////////////////////////////////////////////////////////////////
  84. CListCtrlPairPage::CListCtrlPairPage(
  85. IN UINT idd,
  86. IN const DWORD * pdwHelpMap,
  87. IN DWORD dwStyle,
  88. IN PFNLCPGETCOLUMN pfnGetColumn,
  89. IN PFNLCPDISPPROPS pfnDisplayProps
  90. )
  91. : CBasePropertyPage(idd, pdwHelpMap)
  92. {
  93. ASSERT(pfnGetColumn != NULL);
  94. ASSERT(pfnDisplayProps != NULL);
  95. CommonConstruct();
  96. m_dwStyle = dwStyle;
  97. m_pfnGetColumn = pfnGetColumn;
  98. m_pfnDisplayProps = pfnDisplayProps;
  99. } //*** CListCtrlPairPage::CListCtrlPairPage()
  100. /////////////////////////////////////////////////////////////////////////////
  101. //++
  102. //
  103. // CListCtrlPair::CommonConstruct
  104. //
  105. // Routine Description:
  106. // Common construction.
  107. //
  108. // Arguments:
  109. // None.
  110. //
  111. // Return Value:
  112. // None.
  113. //
  114. //--
  115. /////////////////////////////////////////////////////////////////////////////
  116. void CListCtrlPairPage::CommonConstruct(void)
  117. {
  118. m_plpobjRight = NULL;
  119. m_plpobjLeft = NULL;
  120. m_dwStyle = 0;
  121. m_pfnGetColumn = NULL;
  122. m_plcp = NULL;
  123. } //*** CListCtrlPairPage::CommonConstruct()
  124. /////////////////////////////////////////////////////////////////////////////
  125. //++
  126. //
  127. // CListCtrlPairPage::~CListCtrlPairPage
  128. //
  129. // Routine Description:
  130. // Destructor.
  131. //
  132. // Arguments:
  133. // None.
  134. //
  135. // Return Value:
  136. // None.
  137. //
  138. //--
  139. /////////////////////////////////////////////////////////////////////////////
  140. CListCtrlPairPage::~CListCtrlPairPage(void)
  141. {
  142. delete m_plcp;
  143. } //*** CListCtrlPairPage::~CListCtrlPairPage()
  144. /////////////////////////////////////////////////////////////////////////////
  145. //++
  146. //
  147. // CListCtrlPair::NAddColumn
  148. //
  149. // Routine Description:
  150. // Add a column to the list of columns displayed in each list control.
  151. //
  152. // Arguments:
  153. // idsText [IN] String resource ID for text to display on column.
  154. // nWidth [IN] Initial width of the column.
  155. //
  156. // Return Value:
  157. // icol Index of the column.
  158. //
  159. // Exceptions Thrown:
  160. // Any exceptions thrown by CArray::Add.
  161. //--
  162. /////////////////////////////////////////////////////////////////////////////
  163. int CListCtrlPairPage::NAddColumn(IN IDS idsText, IN int nWidth)
  164. {
  165. CListCtrlPair::CColumn col;
  166. ASSERT(idsText != 0);
  167. ASSERT(nWidth > 0);
  168. ASSERT(Plcp() == NULL);
  169. col.m_idsText = idsText;
  170. col.m_nWidth = nWidth;
  171. return (int)m_aColumns.Add(col);
  172. } //*** CListCtrlPair::NAddColumn()
  173. /////////////////////////////////////////////////////////////////////////////
  174. //++
  175. //
  176. // CListCtrlPairPage::DoDataExchange
  177. //
  178. // Routine Description:
  179. // Do data exchange between the dialog and the class.
  180. //
  181. // Arguments:
  182. // pDX [IN OUT] Data exchange object
  183. //
  184. // Return Value:
  185. // None.
  186. //
  187. //--
  188. /////////////////////////////////////////////////////////////////////////////
  189. void CListCtrlPairPage::DoDataExchange(CDataExchange * pDX)
  190. {
  191. CBasePropertyPage::DoDataExchange(pDX);
  192. Plcp()->DoDataExchange(pDX);
  193. //{{AFX_DATA_MAP(CListCtrlPairDlg)
  194. //}}AFX_DATA_MAP
  195. } //*** CListCtrlPairPage::DoDataExchange()
  196. /////////////////////////////////////////////////////////////////////////////
  197. //++
  198. //
  199. // CListCtrlPairPage::OnInitDialog
  200. //
  201. // Routine Description:
  202. // Handler for the WM_INITDIALOG message.
  203. //
  204. // Arguments:
  205. // None.
  206. //
  207. // Return Value:
  208. // TRUE Focus needs to be set.
  209. // FALSE Focus already set.
  210. //
  211. //--
  212. /////////////////////////////////////////////////////////////////////////////
  213. BOOL CListCtrlPairPage::OnInitDialog( void )
  214. {
  215. if ( BReadOnly() )
  216. {
  217. m_dwStyle |= LCPS_READ_ONLY;
  218. } // if: page is read only
  219. // Initialize the ListCtrlPair control.
  220. if ( BCanBeOrdered() )
  221. {
  222. m_plcp = new COrderedListCtrlPair(
  223. this,
  224. m_plpobjRight,
  225. m_plpobjLeft,
  226. m_dwStyle,
  227. m_pfnGetColumn,
  228. m_pfnDisplayProps
  229. );
  230. } // if: list can be ordered
  231. else
  232. {
  233. m_plcp = new CListCtrlPair(
  234. this,
  235. m_plpobjRight,
  236. m_plpobjLeft,
  237. m_dwStyle,
  238. m_pfnGetColumn,
  239. m_pfnDisplayProps
  240. );
  241. } // else: list cannot be ordered
  242. if ( m_plcp == NULL )
  243. {
  244. AfxThrowMemoryException();
  245. } // if: error allocating memory
  246. // Add columns if there are any.
  247. {
  248. int icol;
  249. for ( icol = 0 ; icol <= m_aColumns.GetUpperBound() ; icol++ )
  250. {
  251. Plcp()->NAddColumn( m_aColumns[ icol ].m_idsText, m_aColumns[ icol ].m_nWidth );
  252. } // for: each column
  253. } // Add columns if there are any
  254. CBasePropertyPage::OnInitDialog();
  255. Plcp()->OnInitDialog();
  256. return TRUE; // return TRUE unless you set the focus to a control
  257. // EXCEPTION: OCX Property Pages should return FALSE
  258. } //*** CListCtrlPairPage::OnInitDialog()
  259. /////////////////////////////////////////////////////////////////////////////
  260. //++
  261. //
  262. // CListCtrlPairPage::OnSetActive
  263. //
  264. // Routine Description:
  265. // Handler for the PSN_SETACTIVE message.
  266. //
  267. // Arguments:
  268. // None.
  269. //
  270. // Return Value:
  271. // TRUE Page successfully initialized.
  272. // FALSE Page not initialized.
  273. //
  274. //--
  275. /////////////////////////////////////////////////////////////////////////////
  276. BOOL CListCtrlPairPage::OnSetActive(void)
  277. {
  278. BOOL bSuccess;
  279. bSuccess = CBasePropertyPage::OnSetActive();
  280. if (bSuccess)
  281. bSuccess = Plcp()->OnSetActive();
  282. return bSuccess;
  283. } //*** CListCtrlPairPage::OnSetActive()
  284. /////////////////////////////////////////////////////////////////////////////
  285. //++
  286. //
  287. // CListCtrlPairPage::OnCmdMsg
  288. //
  289. // Routine Description:
  290. // Processes command messages. Attempts to pass them on to a selected
  291. // item first.
  292. //
  293. // Arguments:
  294. // nID [IN] Command ID.
  295. // nCode [IN] Notification code.
  296. // pExtra [IN OUT] Used according to the value of nCode.
  297. // pHandlerInfo [OUT] ???
  298. //
  299. // Return Value:
  300. // TRUE Message has been handled.
  301. // FALSE Message has NOT been handled.
  302. //
  303. //--
  304. /////////////////////////////////////////////////////////////////////////////
  305. BOOL CListCtrlPairPage::OnCmdMsg(
  306. UINT nID,
  307. int nCode,
  308. void * pExtra,
  309. AFX_CMDHANDLERINFO * pHandlerInfo
  310. )
  311. {
  312. BOOL bHandled;
  313. ASSERT(Plcp() != NULL);
  314. bHandled = Plcp()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  315. if (!bHandled)
  316. bHandled = CBasePropertyPage::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  317. return bHandled;
  318. } //*** CListCtrlPairPage::OnCmdMsg()
  319. /////////////////////////////////////////////////////////////////////////////
  320. //++
  321. //
  322. // CListCtrlPairPage::OnContextMenu
  323. //
  324. // Routine Description:
  325. // Handler for the WM_CONTEXTMENU method.
  326. //
  327. // Arguments:
  328. // pWnd Window in which the user right clicked the mouse.
  329. // point Position of the cursor, in screen coordinates.
  330. //
  331. // Return Value:
  332. // None.
  333. //
  334. //--
  335. /////////////////////////////////////////////////////////////////////////////
  336. void CListCtrlPairPage::OnContextMenu(CWnd * pWnd, CPoint point)
  337. {
  338. ASSERT(Plcp() != NULL);
  339. if (!Plcp()->OnContextMenu(pWnd, point))
  340. CBasePropertyPage::OnContextMenu(pWnd, point);
  341. } //*** CListCtrlPairPage::OnContextMenu()
  342. /////////////////////////////////////////////////////////////////////////////
  343. //++
  344. //
  345. // CListCtrlPairPage::SetLists
  346. //
  347. // Routine Description:
  348. // Set the lists for the list control pair.
  349. //
  350. // Arguments:
  351. // plpobjRight [IN OUT] List for the right list box.
  352. // plpobjLeft [IN] List for the left list box.
  353. //
  354. // Return Value:
  355. // None.
  356. //
  357. //--
  358. /////////////////////////////////////////////////////////////////////////////
  359. void CListCtrlPairPage::SetLists(
  360. IN OUT CClusterItemList * plpobjRight,
  361. IN const CClusterItemList * plpobjLeft
  362. )
  363. {
  364. if (plpobjRight != NULL)
  365. m_plpobjRight = plpobjRight;
  366. if (plpobjLeft != NULL)
  367. m_plpobjLeft = plpobjLeft;
  368. if (Plcp() != NULL)
  369. Plcp()->SetLists(plpobjRight, plpobjLeft);
  370. } //*** CListCtrlPairPage::SetLists()
  371. /////////////////////////////////////////////////////////////////////////////
  372. //++
  373. //
  374. // CListCtrlPairPage::SetLists
  375. //
  376. // Routine Description:
  377. // Set the lists for the list control pair where the right list should
  378. // not be modified.
  379. //
  380. // Arguments:
  381. // plpobjRight [IN] List for the right list box.
  382. // plpobjLeft [IN] List for the left list box.
  383. //
  384. // Return Value:
  385. // None.
  386. //
  387. //--
  388. /////////////////////////////////////////////////////////////////////////////
  389. void CListCtrlPairPage::SetLists(
  390. IN const CClusterItemList * plpobjRight,
  391. IN const CClusterItemList * plpobjLeft
  392. )
  393. {
  394. if (plpobjRight != NULL)
  395. m_plpobjRight = (CClusterItemList *) plpobjRight;
  396. if (plpobjLeft != NULL)
  397. m_plpobjLeft = plpobjLeft;
  398. m_dwStyle |= LCPS_DONT_OUTPUT_RIGHT_LIST;
  399. if (Plcp() != NULL)
  400. Plcp()->SetLists(plpobjRight, plpobjLeft);
  401. } //*** CListCtrlPairPage::SetLists()