XTPReportHeader.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:38k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportHeader.h: interface for the CXTPReportHeader class.
  2. //
  3. // This file is a part of the XTREME REPORTCONTROL MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPREPORTHEADER_H__)
  22. #define __XTPREPORTHEADER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. class CXTPPropExchange;
  28. class CXTPReportColumn;
  29. class CXTPReportColumns;
  30. class CXTPReportControl;
  31. class CXTPReportSubListControl;
  32. class CXTPReportFilterEditControl;
  33. class CXTPReportHeaderDropWnd;
  34. class CXTPReportHeaderDragWnd;
  35. class CXTPReportPaintManager;
  36. //===========================================================================
  37. // Summary:
  38. //     This structure is sent to Main window in a WM_NOTIFY message after
  39. //     column is resized.
  40. // See Also:
  41. //     CXTPReportHeader::ResizeColumn, CXTPReportHeader::AdjustColumnsWidth,
  42. //     XTP_NM_REPORT_COLUMNWIDTHCHANGED.
  43. //===========================================================================
  44. struct XTP_NM_REPORTCOLUMNRESIZE
  45. {
  46. NMHDR hdr;                 // Standard structure, containing information about a notification message.
  47. CXTPReportColumn* pColumn; // Resized column.
  48. int nPrevWidth;            // Previous width.
  49. int nNewWidth;             // New width.
  50. };
  51. //===========================================================================
  52. // Summary:
  53. //     A report header is a part of the report window positioned above
  54. //     columns of text or numbers. It contains a title for each column,
  55. //     and it can be divided into parts. The user can drag the dividers
  56. //     that separate the parts to set the width of each column.
  57. // Remarks:
  58. //     This class is responsible for header drawing on a report window,
  59. //     processing user events, and changing header properties.
  60. //
  61. //     Functionality of the header includes the following:
  62. //     * Header self-drawing.
  63. //     * Header item custom ordering.
  64. //     * Header item drag and drop, for the reordering of header items.
  65. //     * Sorting report rows with mouse click on column header.
  66. //     * Filtering of the report row items using associated CXTPReportFilterEditControl.
  67. //     * Header items choosing using associated filed chooser control: CXTPReportSubListControl.
  68. //     * Group By area support containing the order of grouped columns.
  69. //
  70. // See Also: CXTPReportControl, CXTPReportColumn, CXTPReportSubListControl
  71. //===========================================================================
  72. class _XTP_EXT_CLASS CXTPReportHeader : public CXTPCmdTarget
  73. {
  74. friend class CXTPReportSubListControl;
  75. friend class CXTPReportControl;
  76. friend class CXTPReportColumn;
  77. friend class CXTPReportHeaderDragWnd;
  78. public:
  79. //-----------------------------------------------------------------------
  80. // Summary:
  81. //     Constructs a CXTPReportHeader object.
  82. // Parameters:
  83. //     pColumns - Pointer to associated columns array.
  84. //     pControl - Pointer to the parent report control.
  85. // Example:
  86. // <code>
  87. // // Declare a local CXTPReportHeader object.
  88. // CXTPReportHeader  myHeader;
  89. //
  90. // // Declare a dynamic CXTPReportHeader object.
  91. // CXTPReportHeader* pmyHeader = new CXTPReportHeader;
  92. // </code>
  93. //-----------------------------------------------------------------------
  94. CXTPReportHeader(CXTPReportControl* pControl, CXTPReportColumns* pColumns);
  95. //-----------------------------------------------------------------------
  96. // Summary:
  97. //     Destroys CXTPReportHeader object. Performs cleanup operations.
  98. //-----------------------------------------------------------------------
  99. virtual ~CXTPReportHeader();
  100. protected:
  101. //-----------------------------------------------------------------------
  102. // Summary:
  103. //     Draws columns header on the provided DC.
  104. // Parameters:
  105. //     pDC      - Pointer to the destination device context.
  106. //     rcHeader - Reference to the rectangle in which the header is drawn.
  107. //     nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
  108. // Remarks:
  109. //     Call this function to draw the header on the provided
  110. //     device context. Note that it does not contain Group By area.
  111. // See Also: DrawGroupByControl
  112. //-----------------------------------------------------------------------
  113. virtual void Draw(CDC* pDC, CRect rcHeader, int nLeftOffset);
  114. //-----------------------------------------------------------------------
  115. // Summary:
  116. //     Draws Group By area on the provided DC.
  117. // Parameters:
  118. //     pDC       - Pointer to the destination device context.
  119. //     rcGroupBy - Reference to the rectangle of the Group By area.
  120. // Remarks:
  121. //     Call this function to draw the header on the provided
  122. //     device context. Note that it does not contain Group By area.
  123. // See Also: Draw
  124. //-----------------------------------------------------------------------
  125. virtual void DrawGroupByControl(CDC* pDC, CRect& rcGroupBy);
  126. //-----------------------------------------------------------------------
  127. // Summary:
  128. //     Draws columns footer on the provided DC.
  129. // Parameters:
  130. //     pDC      - Pointer to the destination device context.
  131. //     rcFooter - Reference to the rectangle in which the footer is drawn.
  132. //     nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
  133. // Remarks:
  134. //     Call this function to draw the footer on the provided
  135. //     device context.
  136. // See Also: Draw
  137. //-----------------------------------------------------------------------
  138. virtual void DrawFooter(CDC* pDC, CRect& rcFooter, int nLeftOffset);
  139. //-----------------------------------------------------------------------
  140. // Summary:
  141. //     Processes mouse left button down clicks.
  142. // Parameters:
  143. //     ptClick - Point coordinates where the message was fired from.
  144. // Remarks:
  145. //     Call this member function if you want Report Header to process
  146. //     a mouse left button down message. You should provide the method
  147. //     with the coordinates of the mouse message to proceed.
  148. // See Also: OnLButtonUp, OnContextMenu, OnMouseMove
  149. //-----------------------------------------------------------------------
  150. virtual void OnLButtonDown(CPoint ptClick);
  151. //-----------------------------------------------------------------------
  152. // Summary:
  153. //     Processes mouse left button double-clicks .
  154. // Parameters:
  155. //     ptDblClick - Point coordinates where the message was fired from.
  156. //-----------------------------------------------------------------------
  157. virtual void OnLButtonDblClk(CPoint ptDblClick);
  158. //-----------------------------------------------------------------------
  159. // Summary:
  160. //     Process mouse left button up clicks.
  161. // Parameters:
  162. //     nFlags  - Indicates whether various virtual keys are down.
  163. //     ptClick - Point coordinates where the message was fired from.
  164. // Remarks:
  165. //     Call this member function if you want Report Header to process
  166. //     a mouse left button up message. You should provide the method
  167. //     with the coordinates of the mouse message to proceed and a flag
  168. //     showing which of virtual keys were down.
  169. // See Also: OnLButtonDown, OnContextMenu, OnMouseMove
  170. //-----------------------------------------------------------------------
  171. virtual void OnLButtonUp(UINT nFlags, CPoint ptClick);
  172. //-----------------------------------------------------------------------
  173. // Summary:
  174. //     Process context menu. Called by the framework when the user
  175. //     has clicked the right mouse button (right clicked) in the window.
  176. // Parameters:
  177. //     ptClick - Position of the cursor, in screen coordinates,
  178. //               at the time of the mouse click.
  179. // Remarks:
  180. //     Call this member function if you want Report Header to process
  181. //     a mouse right button down (context menu call) message.
  182. //     You should provide the method with the coordinates of the
  183. //     mouse message to proceed.
  184. // See Also: OnLButtonDown, OnLButtonUp, OnMouseMove
  185. //-----------------------------------------------------------------------
  186. virtual void OnContextMenu(CPoint ptClick);
  187. // Summary:
  188. //     Returns the currently used control's Paint Manager.
  189. // Remarks:
  190. //     Call this member function to get the paint manager object used
  191. //     for drawing a report control window.
  192. // Returns:
  193. //     Pointer to the paint manager object.
  194. // See Also: CXTPReportPaintManager overview
  195. //-----------------------------------------------------------------------
  196. CXTPReportPaintManager* GetPaintManager() const;
  197. //-----------------------------------------------------------------------
  198. // Summary:
  199. //     Process mouse moving.
  200. // Parameters:
  201. //     nFlags - Indicates whether various virtual keys are down.
  202. //     point  - Point coordinates where the message was fired from.
  203. // Remarks:
  204. //     Call this member function if you want Report Header to process
  205. //     a mouse move message. You should provide the method with the
  206. //     coordinates of the mouse message to proceed and a flag
  207. //     showing which of virtual keys were down.
  208. // See Also: OnLButtonDown, OnLButtonUp, OnContextMenu
  209. //-----------------------------------------------------------------------
  210. virtual void OnMouseMove(UINT nFlags, CPoint point);
  211. //-----------------------------------------------------------------------
  212. // Summary:
  213. //     Reads or writes configuration to/from the provided archive stream.
  214. // Parameters:
  215. //     pPX - A CXTPPropExchange object to serialize to or from.
  216. //----------------------------------------------------------------------
  217. virtual void DoPropExchange(CXTPPropExchange* pPX);
  218. public:
  219. //-----------------------------------------------------------------------
  220. // Summary:
  221. //     Determines if dragging the header now.
  222. // Remarks:
  223. //     When user starts dragging a row, Report Header enters a dragging
  224. //     loop and processes each message in the specific way.
  225. //     Using this function you can determine if we are in such a dragging
  226. //     loop or not.
  227. // Returns:
  228. //     TRUE when dragging, FALSE otherwise.
  229. //-----------------------------------------------------------------------
  230. BOOL IsDragHeader() const;
  231. //-----------------------------------------------------------------------
  232. // Summary:
  233. //     Allows/disallows column removing.
  234. // Parameters:
  235. //     bAllow - TRUE for allowing column removing, FALSE for disallowing.
  236. // Remarks:
  237. //     Usually user is allowed to remove a column using mouse drag and drop.
  238. //     Using this member function, you can change the user's permissions
  239. //     force allowing or disallowing of column removing.
  240. // See Also: IsAllowColumnRemove, CXTPReportColumn::AllowColumnRemove
  241. //-----------------------------------------------------------------------
  242. void AllowColumnRemove(BOOL bAllow);
  243. //-----------------------------------------------------------------------
  244. // Summary:
  245. //     Returns the current column removing allowance.
  246. // Remarks:
  247. //     Call this member function to determine whether the user is allowed
  248. //     to remove the column using drag and drop or not.
  249. // Returns:
  250. //     TRUE when column removing is allowed, FALSE otherwise.
  251. // See Also: AllowColumnRemove
  252. //-----------------------------------------------------------------------
  253. BOOL IsAllowColumnRemove() const;
  254. //-----------------------------------------------------------------------
  255. // Summary:
  256. //     Allows/disallows column reordering.
  257. // Parameters:
  258. //     bAllow - TRUE for allowing column reordering, FALSE for disallowing.
  259. // Remarks:
  260. //     Usually user is allowed to reorder a column using mouse drag and drop.
  261. //     Using this member function, you can change the user's permissions
  262. //     and force allowing or disallowing of column reordering.
  263. // See Also: IsAllowColumnReorder
  264. //-----------------------------------------------------------------------
  265. void AllowColumnReorder(BOOL bAllow);
  266. //-----------------------------------------------------------------------
  267. // Summary:
  268. //     Returns the current column reordering allowance.
  269. // Remarks:
  270. //     Call this member function to determine whether the user is allowed
  271. //     to reorder the column using drag and drop or not.
  272. // Returns:
  273. //     TRUE when column reordering is allowed, FALSE otherwise.
  274. // See Also: AllowColumnReorder
  275. //-----------------------------------------------------------------------
  276. BOOL IsAllowColumnReorder() const;
  277. //-----------------------------------------------------------------------
  278. // Summary:
  279. //     Allows/disallows column resizing.
  280. // Parameters:
  281. //     bAllow - TRUE for allowing column resizing, FALSE for disallowing.
  282. // Remarks:
  283. //     Usually the user is allowed to resize column using mouse drag and drop.
  284. //     Using this member function you can change user's permissions
  285. //     and force allowing or disallowing of column resizing.
  286. // See Also: IsAllowColumnResize
  287. //-----------------------------------------------------------------------
  288. void AllowColumnResize(BOOL bAllow);
  289. //-----------------------------------------------------------------------
  290. // Summary:
  291. //     Returns current column resizing allowance.
  292. // Remarks:
  293. //     Call this member function to determine whether the user is allowed
  294. //     to resize a column using drag and drop or not.
  295. // Returns:
  296. //     TRUE when column resizing is allowed, FALSE otherwise.
  297. // See Also: AllowColumnResize
  298. //-----------------------------------------------------------------------
  299. BOOL IsAllowColumnResize() const;
  300. //-----------------------------------------------------------------------
  301. // Summary:
  302. //     Sets show items in groups mode.
  303. // Parameters:
  304. //     bShowInGroups - TRUE for show items in groups, FALSE otherwise.
  305. // Remarks:
  306. //     Using this member function you can change Report Header
  307. //     showing items in groups mode.
  308. // See Also: IsShowItemsInGroups
  309. //-----------------------------------------------------------------------
  310. void ShowItemsInGroups(BOOL bShowInGroups);
  311. //-----------------------------------------------------------------------
  312. // Summary:
  313. //     Returns current show items in groups mode.
  314. // Remarks:
  315. //     Using this member function you can retrieve current
  316. //     showing items in groups mode.
  317. // Returns:
  318. //     TRUE when items are shown in groups, FALSE otherwise.
  319. // See Also: ShowItemsInGroups
  320. //-----------------------------------------------------------------------
  321. BOOL IsShowItemsInGroups() const;
  322. //-----------------------------------------------------------------------
  323. // Summary:
  324. //     Sets allowing column sorting mode.
  325. // Parameters:
  326. //     bAllow - TRUE for allowing, FALSE for disallowing.
  327. // Remarks:
  328. //     Using this member function you can allow or disallow sorting
  329. //     columns by mouse.
  330. // See Also: IsAllowColumnSort
  331. //-----------------------------------------------------------------------
  332. void AllowColumnSort(BOOL bAllow);
  333. //-----------------------------------------------------------------------
  334. // Summary:
  335. //     Returns current allowing column sorting mode.
  336. // Remarks:
  337. //     Using this member function you can retrieve the current
  338. //     allowing column sorting mode.
  339. // Returns:
  340. //     TRUE when column sorting is allowed, FALSE otherwise.
  341. // See Also: AllowColumnSort
  342. //-----------------------------------------------------------------------
  343. BOOL IsAllowColumnSort() const;
  344. //-----------------------------------------------------------------------
  345. // Summary:
  346. //     Call this member to retrieve the next visible column.
  347. // Parameters:
  348. //     nIndex     - Position of a column in the array of columns to start from.
  349. //     nDirection - The direction to move (left or right) in the array, starting and nIndex.
  350. // Returns:
  351. //     A pointer to the next visible column.
  352. //-----------------------------------------------------------------------
  353. virtual CXTPReportColumn* GetNextVisibleColumn(int nIndex, int nDirection);
  354. //-----------------------------------------------------------------------
  355. // Summary:
  356. //     Finds a column from point.
  357. // Parameters:
  358. //     ptPoint - A point to test in report control client coordinates.
  359. // Remarks:
  360. //     Call this member function if you want to retrieve a pointer to a
  361. //     column in the specified position.
  362. // Returns:
  363. //     A pointer to the column placed at the specified position, if any,
  364. //     or NULL otherwise.
  365. // See Also: CXTPReportControl::HitTest, CXTPReportRow::HitTest
  366. //-----------------------------------------------------------------------
  367. virtual CXTPReportColumn* HitTest(CPoint ptPoint) const;
  368. //-----------------------------------------------------------------------
  369. // Summary:
  370. //     Calculates index of where to insert a column nearest to the provided point.
  371. // Parameters:
  372. //     ptPoint - Point coordinates to test
  373. // Returns:
  374. //     Header column index.
  375. //-----------------------------------------------------------------------
  376. virtual int FindHeaderColumn(CPoint ptPoint) const;
  377. //-----------------------------------------------------------------------
  378. // Summary:
  379. //     Calculates index of where to insert a column nearest to the provided point.
  380. // Parameters:
  381. //     ptPoint      - Point coordinates to test.
  382. //     bExactSearch - TRUE when search by exact position,
  383. //                    FALSE when searching average value.
  384. // Returns:
  385. //     GroupBy column position.
  386. //-----------------------------------------------------------------------
  387. virtual int FindGroupByColumn(CPoint ptPoint, BOOL bExactSearch = FALSE) const;
  388. //private:
  389. //-----------------------------------------------------------------------
  390. // Summary:
  391. //     Finds header column index by provided point.
  392. // Parameters:
  393. //     ptPoint - A point to test in report control window client coordinates.
  394. // Returns:
  395. //     An index of the found column in the header column array, if found,
  396. //     or -1 if column was not found.
  397. //-----------------------------------------------------------------------
  398. virtual int HitTestHeaderColumnIndex(CPoint ptPoint) const;
  399. //-----------------------------------------------------------------------
  400. // Summary:
  401. //     Checks if the provided point is over column resize area.
  402. // Parameters:
  403. //     ptPoint - Point coordinates to test
  404. // Returns:
  405. //     A pointer to column for resize, or NULL if point is not over any column resize area.
  406. //-----------------------------------------------------------------------
  407. CXTPReportColumn* MouseOverColumnResizeArea(CPoint ptPoint);
  408. //-----------------------------------------------------------------------
  409. // Summary:
  410. //      Get current scroll information for full columns scroll mode and the helper
  411. //      information to scroll left or right.
  412. // Parameters:
  413. //      rpPrev      - [out] A reference to store next column to scroll left.
  414. //                          NULL is returned if current position is on last left column.
  415. //      rpCurr      - [out] A reference to store current column (first visible column on the left).
  416. //      rpNext      - [out] A reference to store next column to scroll right.
  417. //                          NULL is returned if current position is on last right column.
  418. //      rnScrollPos - [out] A reference to store current scrollBar position.
  419. //      rnScrollMax - [out] A reference to store scrollBar positions count.
  420. // Returns:
  421. //      A freezed columns width in pixels.
  422. //-----------------------------------------------------------------------
  423. int GetFulColScrollInfo(CXTPReportColumn*& rpPrev, CXTPReportColumn*& rpCurr, CXTPReportColumn*& rpNext,
  424. int& rnScrollPos, int& rnScrollMax) const;
  425. protected:
  426. //-----------------------------------------------------------------------
  427. // Summary:
  428. //     Checks if the provided point is over column resize area.
  429. // Parameters:
  430. //     nTotalWidth - Total width of the header area in pixels.
  431. //     nFirstIndex - Index of a column to start adjusting from.
  432. // Remarks:
  433. //     Call this member function when you want to adjust the width of
  434. //     columns in reaction to any specific event.
  435. //     For example, this member function is called by the framework
  436. //     when changing the report control size (WM_SIZE), and when
  437. //     changing a size of any column by mouse dragging.
  438. // See Also: ResizeColumn, GetMaxAvailWidth
  439. //-----------------------------------------------------------------------
  440. void AdjustColumnsWidth(int nTotalWidth, int nFirstIndex = 0);
  441. //-----------------------------------------------------------------------
  442. // Summary:
  443. //     Starts column header dragging mode.
  444. // Parameters:
  445. //     pColumn - Pointer to the column, which is entering in dragging mode.
  446. //     bHeader - TRUE when starting dragging for column header items,
  447. //               FALSE when starting dragging for Group By column items.
  448. // Remarks:
  449. //     Usually this method is called internally in a reaction to any
  450. //     specific user actions. For example when a user starts dragging
  451. //     header by mouse.
  452. // See Also: GetDraggingColumn, CancelMouseMode
  453. //-----------------------------------------------------------------------
  454. void StartDragging(CXTPReportColumn* pColumn, BOOL bHeader = FALSE);
  455. //-----------------------------------------------------------------------
  456. // Summary:
  457. //     Resizes a provided column to a specific new width.
  458. // Parameters:
  459. //     pColumn - Pointer to a column to resize.
  460. //     nWidth  - New column width in pixels.
  461. // Remarks:
  462. //     This method resizes a provided column to a specific new width,
  463. //     and adjusts the width of other columns in correspondence with
  464. //     the new one.
  465. // See Also: AdjustColumnsWidth, GetMaxAvailWidth
  466. //-----------------------------------------------------------------------
  467. void ResizeColumn(CXTPReportColumn* pColumn, int nWidth);
  468. //-----------------------------------------------------------------------
  469. // Summary:
  470. //     Resets any mouse mode to xtpMouseNothing.
  471. // Remarks:
  472. //     Usually this member function is called when finishing
  473. //     dragging or resizing columns. It performs all
  474. //     necessary cleanup and resets mouse mode to xtpMouseNothing.
  475. // See Also: StartDragging
  476. //-----------------------------------------------------------------------
  477. void CancelMouseMode();
  478. //-----------------------------------------------------------------------
  479. // Summary:
  480. //     Returns maximum available width for the column.
  481. // Parameters:
  482. //     pColumn - Pointer to the column to check.
  483. // Remarks:
  484. //     Calculates maximum possible width for the column depending
  485. //     on the width and modes for other columns.
  486. // Returns:
  487. //     Maximum available width for the column in pixels.
  488. // See Also: AdjustColumnsWidth, ResizeColumn
  489. //-----------------------------------------------------------------------
  490. int GetMaxAvailWidth(CXTPReportColumn* pColumn);
  491. //-----------------------------------------------------------------------
  492. // Summary:
  493. //     Sets a divider between columns.
  494. // Parameters:
  495. //     nIndex  - An index of the column to set hot divider before.
  496. //     bHeader - TRUE if you want to set hot divider in columns header,
  497. //               FALSE to set it between on Group By area items.
  498. // Remarks:
  499. //     When dragging columns, call this member function to show a
  500. //     hot divider (red arrows by default) between columns as a target
  501. //     dropping a currently dragging one.
  502. // Returns:
  503. //     An index of the column before which a hot divider was shown.
  504. //-----------------------------------------------------------------------
  505. int SetHotDivider(int nIndex, BOOL bHeader = TRUE);
  506. public:
  507. //-----------------------------------------------------------------------
  508. // Summary:
  509. //     Returns a column, which is dragging at the moment.
  510. // Remarks:
  511. //     Call this member function if you want to retrieve a pointer
  512. //     to the currently dragging column.
  513. // Returns:
  514. //     A pointer to the dragging column if the control is in
  515. //     dragging mode, or NULL otherwise.
  516. // Example: <code>CXTPReportColumn* pColumn = GetDraggingColumn();</code>
  517. // See Also: StartDragging, GetResizingColumn,
  518. //-----------------------------------------------------------------------
  519. CXTPReportColumn* GetDraggingColumn() const;
  520. //-----------------------------------------------------------------------
  521. // Summary:
  522. //     Sets associated Field chooser list control.
  523. // Parameters:
  524. //     pSubList - Pointer to the field chooser list box control.
  525. // Remarks:
  526. //     You should call this member function to assign the user's custom
  527. //     List control as report control Field chooser control.
  528. //     After assigning, the framework will automatically be processing
  529. //     all windows messages from the control.
  530. // Returns:
  531. //     TRUE if successful; otherwise FALSE.
  532. // Example:
  533. // <code>
  534. // // CXTPReportControl wndReport;
  535. // // CXTPReportSubListControl wndSubList;
  536. // wndReport.GetColumns()->GetReportHeader()->SetSubListCtrl(&wndSubList);
  537. // </code>
  538. // See Also: CXTPReportSubListControl overview, SetFilterEditCtrl
  539. //-----------------------------------------------------------------------
  540. BOOL SetSubListCtrl(CXTPReportSubListControl* pSubList);
  541. //-----------------------------------------------------------------------
  542. // Summary:
  543. //     Retrieves Pointer to the field chooser
  544. // Returns:
  545. //     Pointer to the field chooser list box control.
  546. // See Also: SetSubListCtrl
  547. //-----------------------------------------------------------------------
  548. CXTPReportSubListControl* GetSubListCtrl() const;
  549. //-----------------------------------------------------------------------
  550. // Summary:
  551. //     Sets associated filter edit control.
  552. // Parameters:
  553. //     pFilterEdit - Pointer to the user's filter edit control.
  554. // Remarks:
  555. //     You should call this member function to assign the user's custom
  556. //     edit box control as report control filter edit control.
  557. //     After assigning, the framework will automatically be processing
  558. //     all windows messages for the control.
  559. // Returns:
  560. //     TRUE if successful; otherwise FALSE.
  561. // Example:
  562. // <code>
  563. // CXTPReportControl wndReport;
  564. // CXTPReportFilterEditControl wndFilterEdit;
  565. // wndReport.GetReportHeader()->SetFilterEditCtrl(&wndFilterEdit);
  566. // </code>
  567. // See Also: CXTPReportFilterEditControl overview, GetFilterEditCtrl, SetSubListCtrl
  568. //-----------------------------------------------------------------------
  569. BOOL SetFilterEditCtrl(CXTPReportFilterEditControl* pFilterEdit);
  570. //-----------------------------------------------------------------------
  571. // Summary:
  572. //     Returns the associated Filter edit control.
  573. // Remarks:
  574. //     Call this member function to retrieve a pointer to the
  575. //     associated filter edit control.
  576. // Returns:
  577. //     A pointer to the associated filter edit control.
  578. // See Also: CXTPReportFilterEditControl overview, SetFilterEditCtrl
  579. //-----------------------------------------------------------------------
  580. CXTPReportFilterEditControl* GetFilterEditCtrl() const;
  581. //-----------------------------------------------------------------------
  582. // Summary:
  583. //     Returns the Group By area height.
  584. // Remarks:
  585. //     Calculates Group By area height depending on the number of
  586. //     items contained inside.
  587. // Returns:
  588. //     A Group By area height in pixels.
  589. //-----------------------------------------------------------------------
  590. int GetGroupByHeight() const;
  591. //-----------------------------------------------------------------------
  592. // Summary:
  593. //     Fits the provided column width to the longest column item width.
  594. // Parameters:
  595. //     pColumn - A column to fit width.
  596. // Remarks:
  597. //     Call this method to adjust column width to the width of the
  598. //     widest column item.
  599. //-----------------------------------------------------------------------
  600. void BestFit(CXTPReportColumn* pColumn);
  601. //-----------------------------------------------------------------------
  602. // Summary:
  603. //     Checks a column for its position in report header.
  604. // Parameters:
  605. //     pColumn - A pointer to the column to check.
  606. // Returns:
  607. //     TRUE if a provided column is the last visible column in a report
  608. //     header, FALSE otherwise.
  609. //-----------------------------------------------------------------------
  610. BOOL IsLastVisibleColumn(CXTPReportColumn* pColumn) const;
  611. //-----------------------------------------------------------------------
  612. // Summary:
  613. //     Checks a column for its position in report header.
  614. // Parameters:
  615. //     pColumn - A pointer to the column to check.
  616. // Returns:
  617. //     TRUE if a provided column is the last resizable column in a report
  618. //     header, FALSE otherwise.
  619. //-----------------------------------------------------------------------
  620. BOOL IsLastResizebleColumn(CXTPReportColumn* pColumn) const;
  621. //-----------------------------------------------------------------------
  622. // Summary:
  623. //     Returns an indent for report rows by 1 tree level.
  624. // Remarks:
  625. //     Call this member function to retrieve an indent for 1 level
  626. //     of tree depth for the report control in tree mode.
  627. // Returns:
  628. //     An indent by one level in pixels.
  629. //-----------------------------------------------------------------------
  630. int GetIndentLevel() const;
  631. //-----------------------------------------------------------------------
  632. // Summary:
  633. //     Updates header settings after any changes.
  634. // Parameters:
  635. //     bGroupOrderChanged - flag indicating whether the group order has been changed or not.
  636. // Remarks:
  637. //     Call this member function if you want to automatically
  638. //     adjust columns widths and redraw report control depending
  639. //     on current columns settings.
  640. //-----------------------------------------------------------------------
  641. virtual void OnColumnsChanged(BOOL bGroupOrderChanged = FALSE);
  642. //-----------------------------------------------------------------------
  643. // Summary:
  644. //     Retrieves parent Report Control
  645. // Returns:
  646. //     CXTPReportControl pointer
  647. //-----------------------------------------------------------------------
  648. CXTPReportControl* GetControl() const;
  649. //-----------------------------------------------------------------------
  650. // Summary:
  651. //     Call this member to specify if AutoColumnSizing should be used.
  652. // Parameters:
  653. //     bAutoColumnSizing - If TRUE, all columns are sized to fill the
  654. //                         entire width of the ReportControl.  When the
  655. //                         ReportControl is resized, the Columns will
  656. //                         automatically be resized to fit the new size
  657. //                         of the RepotControl.
  658. //                         If FALSE, the columns will use the width they
  659. //                         were assigned when they were created, or whatever
  660. //                         value is stored in the columns width property.
  661. //                         The columns widths my occupy more or less that
  662. //                         the total width of the ReportControl.  If the
  663. //                         total width of the columns exceeds the width
  664. //                         of the ReportControl, then those columns will not
  665. //                         be visible.  When the ReportControl is resized,
  666. //                         the size of the columns will not be effected.
  667. //-----------------------------------------------------------------------
  668. void SetAutoColumnSizing(BOOL bAutoColumnSizing);
  669. //-----------------------------------------------------------------------
  670. // Summary:
  671. //     Call this member to determine if AutoColumnSizing is currently used.
  672. // Returns:
  673. //     TRUE is AutoColumnSizing is used, FALSE otherwise.
  674. //-----------------------------------------------------------------------
  675. BOOL IsAutoColumnSizing() const;
  676. //-----------------------------------------------------------------------
  677. // Summary:
  678. //     Call this member to retrieve the total width of the header (total combined column widths).
  679. // Returns:
  680. //     The total combined column widths, which make up the header width.
  681. //-----------------------------------------------------------------------
  682. int GetWidth() const;
  683. protected:
  684. //-----------------------------------------------------------------------
  685. // Summary:
  686. //     The framework calls this member function to determine whether a
  687. //     point is in the bounding rectangle of the specified tool.
  688. // Parameters:
  689. //     point - Specifies the x- and y-coordinate of the cursor. These
  690. //             coordinates are always relative to the upper-left corner of the window
  691. //     pTI   - A pointer to a TOOLINFO structure.
  692. // Returns:
  693. //     If the tooltip control was found, the window control ID. If
  694. //     the tooltip control was not found, -1.
  695. //-----------------------------------------------------------------------
  696. virtual INT_PTR OnToolHitTest(CPoint point, TOOLINFO* pTI) const;
  697. //private:
  698. //{{AFX_CODEJOCK_PRIVATE
  699. void TrackColumn(CXTPReportColumn* pColumn, CPoint pt);
  700. void DestroyDropWnd();
  701. void SetHotTrackingColumn(CXTPReportColumn* pColumn);
  702. CXTPReportColumn* GetHotTrackingColumn() const;
  703. //}}AFX_CODEJOCK_PRIVATE
  704. protected:
  705. CXTPReportColumns* m_pColumns;  // Contains associated columns list.
  706. CXTPReportControl* m_pControl;  // Pointer to the parent Report control.
  707. int m_nDropIndex;                           // Item index of the column to drop to.
  708. CXTPReportHeaderDropWnd* m_pDropWnd;        // Column drop window.
  709. CXTPReportHeaderDragWnd* m_pDragWnd;        // Column drag window.
  710. HCURSOR m_hDontDropCursor;                  // Handler of user's Don't Drop cursor.
  711. CXTPReportColumn* m_pDragColumn;            // Dragging column.
  712. CXTPReportColumn* m_pHotTrackingColumn;     // Hot column
  713. BOOL m_bDragHeader;                         // Determines whether control is in header dragging mode or group by dragging mode.
  714. BOOL m_bDragGroupBox;                       // Determines whether control is in group box dragging mode.
  715. CXTPReportSubListControl* m_pSubList;       // Field chooser list control.
  716. CXTPReportFilterEditControl* m_pFilterEdit; // Filter edit control
  717. CRect m_rcGroupBy;      // Group By area coordinates.
  718. CRect m_rcHeader;       // Header coordinates.
  719. CPoint m_ptMouse;       // Stores mouse coordinates for processing when required (resizing, etc).
  720. HCURSOR m_hResizeCursor;    // Handler of user's Resizing cursor.
  721. BOOL m_bAllowColumnRemove;  // FALSE if columns removing is not allowed.
  722. BOOL m_bAllowColumnResize;  // FALSE if columns resizing is not allowed.
  723. BOOL m_bAllowColumnReorder; // FALSE if columns reordering is not allowed.
  724. BOOL m_bAllowColumnSort;    // FALSE if columns sorting is not allowed.
  725. BOOL m_bAutoColumnSizing;   // TRUE if AutoColumnSizing should be used.
  726. int m_nResizeCaptureRange;  // Distance around column divider where column re-sizer is shown.
  727. int m_nIndentLevel;         // Width indent at the left of the column.
  728. BOOL m_bShowItemsInGroups;  // TRUE when showing items in groups, FALSE when grouping is not used.
  729. int m_nHeaderWidth;         // The combined width of all the visible column headers.
  730. //private:
  731. enum ReportDraggingMode
  732. {
  733. dragNothing      = 0,    // User is dragging nothing.
  734. dragOutTarget    = 1,    // User is dragging an item outside the drop target.
  735. dragInHeader     = 2,    // User is dragging an item inside header
  736. dragInGroupBox   = 4,    // User is dragging an item inside group box
  737. dragInTarget     = 6,    // User is dragging an item inside the drop target.
  738. dragFieldChooser = 8     // User is dragging an item inside field chooser.
  739. } m_dragMode;                   // Column dragging mode.
  740. public:
  741. static int s_nMinAutoScrollStep; // Minimal horizontal autoscrolling step in pixels.
  742. static BOOL s_bShowItemsInGroupsPXDefault; // Store default value of m_bShowItemsInGroups member for serialization (PropExchange).
  743. static BOOL s_bSendContextMenuForWholeHeaderArea;  // If set as TRUE report control send ContextMenu event for clicks on whole header area (not only for columns) rectangles.
  744. };
  745. AFX_INLINE CXTPReportFilterEditControl* CXTPReportHeader::GetFilterEditCtrl() const {
  746. return m_pFilterEdit;
  747. }
  748. AFX_INLINE BOOL CXTPReportHeader::IsDragHeader() const{
  749. return m_bDragHeader;
  750. }
  751. AFX_INLINE int CXTPReportHeader::GetIndentLevel()const {
  752. return m_nIndentLevel;
  753. }
  754. AFX_INLINE void CXTPReportHeader::AllowColumnRemove(BOOL bAllow) {
  755. m_bAllowColumnRemove = bAllow;
  756. }
  757. AFX_INLINE void CXTPReportHeader::AllowColumnResize(BOOL bAllow) {
  758. m_bAllowColumnResize = bAllow;
  759. }
  760. AFX_INLINE void CXTPReportHeader::AllowColumnReorder(BOOL bAllow) {
  761. m_bAllowColumnReorder = bAllow;
  762. }
  763. AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnRemove() const{
  764. return m_bAllowColumnRemove;
  765. }
  766. AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnReorder() const {
  767. return m_bAllowColumnReorder;
  768. }
  769. AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnResize() const{
  770. return m_bAllowColumnResize;
  771. }
  772. AFX_INLINE void CXTPReportHeader::AllowColumnSort(BOOL bAllow) {
  773. m_bAllowColumnSort = bAllow;
  774. }
  775. AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnSort() const{
  776. return m_bAllowColumnSort;
  777. }
  778. AFX_INLINE BOOL CXTPReportHeader::IsShowItemsInGroups() const{
  779. return m_bShowItemsInGroups;
  780. }
  781. AFX_INLINE CXTPReportControl* CXTPReportHeader::GetControl() const{
  782. return m_pControl;
  783. }
  784. AFX_INLINE CXTPReportSubListControl* CXTPReportHeader::GetSubListCtrl() const {
  785. return m_pSubList;
  786. }
  787. AFX_INLINE int CXTPReportHeader::GetWidth() const {
  788. return m_nHeaderWidth;
  789. }
  790. AFX_INLINE BOOL CXTPReportHeader::IsAutoColumnSizing() const {
  791. return m_bAutoColumnSizing;
  792. }
  793. #endif //#if !defined(__XTPREPORTHEADER_H__)