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.

450 lines
12 KiB

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