You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1027 lines
44 KiB
C++
1027 lines
44 KiB
C++
// XTPReportHeader.h: interface for the CXTPReportHeader class.
|
|
//
|
|
// This file is a part of the XTREME REPORTCONTROL MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
#if !defined(__XTPREPORTHEADER_H__)
|
|
#define __XTPREPORTHEADER_H__
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
class CXTPPropExchange;
|
|
|
|
class CXTPReportColumn;
|
|
class CXTPReportColumns;
|
|
class CXTPReportControl;
|
|
class CXTPReportSubListControl;
|
|
class CXTPReportFilterEditControl;
|
|
class CXTPReportHeaderDropWnd;
|
|
class CXTPReportHeaderDragWnd;
|
|
class CXTPReportPaintManager;
|
|
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
//===========================================================================
|
|
struct XTP_NM_REPORTSCROLL : public NMHDR
|
|
{
|
|
int nSection; // Index of the section
|
|
int nPosition; // New scroll position
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
//===========================================================================
|
|
struct XTP_NM_REPORTGIVEFEEDBACK : public NMHDR
|
|
{
|
|
DROPEFFECT dropEffect;
|
|
BOOL bDragStarted;
|
|
};
|
|
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// This structure is sent to Main window in a WM_NOTIFY message after
|
|
// column is resized.
|
|
// See Also:
|
|
// CXTPReportHeader::ResizeColumn, CXTPReportHeader::AdjustColumnsWidth,
|
|
// XTP_NM_REPORT_COLUMNWIDTHCHANGED.
|
|
//===========================================================================
|
|
struct XTP_NM_REPORTCOLUMNRESIZE
|
|
{
|
|
NMHDR hdr; // Standard structure, containing information about a notification message.
|
|
CXTPReportColumn* pColumn; // Resized column.
|
|
int nPrevWidth; // Previous width.
|
|
int nNewWidth; // New width.
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// This structure is sent to Main window in a WM_NOTIFY message after
|
|
// columns order or group order is changed.
|
|
// See Also:
|
|
// CXTPReportHeader::OnColumnsChanged, XTP_NM_REPORT_COLUMNORDERCHANGED,
|
|
// XTP_NM_REPORT_GROUPORDERCHANGED.
|
|
//===========================================================================
|
|
struct XTP_NM_REPORTCOLUMNORDERCHANGED
|
|
{
|
|
NMHDR hdr; // Standard structure, containing information about a notification message.
|
|
CXTPReportColumn* pColumn; // Affected column.
|
|
int nReason; // Change reason.
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// Enumeration of OnColumnsChanged event reasons.
|
|
// Remarks:
|
|
// See Also: CXTPReportHeader::OnColumnsChanged
|
|
//
|
|
// <KEYWORDS >
|
|
//===========================================================================
|
|
enum XTPReportColumnOrderChangedReason
|
|
{
|
|
xtpReportColumnChangeOther = 0x0000, // Neither column order nor group order is changed.
|
|
xtpReportColumnOrderChanged = 0x0001, // Column order changed.
|
|
xtpReportColumnGroupOrderChanged = 0x0002, // Group order changed.
|
|
xtpReportColumnOrderChangedMask = 0x000F, // A mask for order change flags.
|
|
|
|
xtpReportColumnAdded = 0x0010, // A column is added to the column list.
|
|
xtpReportColumnRemoved = 0x0020, // A column is removed from the column list.
|
|
xtpReportColumnPropExchange = 0x0040, // The column properties changed during properties exchange procedure.
|
|
xtpReportColumnCaptionChanged = 0x0080, // The column caption is changed.
|
|
xtpReportColumnWidthChanged = 0x0100, // The column width is changed.
|
|
xtpReportColumnShown = 0x0200, // A column visibility property is changed to "visible".
|
|
xtpReportColumnHidden = 0x0400, // A column visibility property is changed to "hidden".
|
|
xtpReportColumnMoved = 0x0800, // A column is moved.
|
|
xtpReportColumnAddedToGroupby = 0x1000, // A column is added to the GroupBy box.
|
|
xtpReportColumnRemovedFromGroupby = 0x2000, // A column is removed from the GroupBy box.
|
|
xtpReportColumnAddedToFieldChooser = 0x4000, // A column is added to the Field Chooser.
|
|
xtpReportColumnRemovedFromFieldChooser = 0x8000, // A column is removed from the Field Chooser.
|
|
xtpReportColumnChangeMask = 0xFFF0, // A mask for column change flags.
|
|
};
|
|
|
|
|
|
enum XTPReportColumnDirection
|
|
{
|
|
xtpReportColumnDirectionLeft = -1,
|
|
xtpReportColumnDirectionRight = +1
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// A report header is a part of the report window positioned above
|
|
// columns of text or numbers. It contains a title for each column,
|
|
// and it can be divided into parts. The user can drag the dividers
|
|
// that separate the parts to set the width of each column.
|
|
// Remarks:
|
|
// This class is responsible for header drawing on a report window,
|
|
// processing user events, and changing header properties.
|
|
//
|
|
// Functionality of the header includes the following:
|
|
// * Header self-drawing.
|
|
// * Header item custom ordering.
|
|
// * Header item drag and drop, for the reordering of header items.
|
|
// * Sorting report rows with mouse click on column header.
|
|
// * Filtering of the report row items using associated CXTPReportFilterEditControl.
|
|
// * Header items choosing using associated filed chooser control: CXTPReportSubListControl.
|
|
// * Group By area support containing the order of grouped columns.
|
|
//
|
|
// See Also: CXTPReportControl, CXTPReportColumn, CXTPReportSubListControl
|
|
//===========================================================================
|
|
class _XTP_EXT_CLASS CXTPReportHeader : public CXTPCmdTarget, public CXTPAccessible
|
|
{
|
|
DECLARE_INTERFACE_MAP()
|
|
friend class CXTPReportSubListControl;
|
|
friend class CXTPReportControl;
|
|
friend class CXTPReportColumn;
|
|
friend class CXTPReportHeaderDragWnd;
|
|
public:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Constructs a CXTPReportHeader object.
|
|
// Parameters:
|
|
// pColumns - Pointer to associated columns array.
|
|
// pControl - Pointer to the parent report control.
|
|
// Example:
|
|
// <code>
|
|
// // Declare a local CXTPReportHeader object.
|
|
// CXTPReportHeader myHeader;
|
|
//
|
|
// // Declare a dynamic CXTPReportHeader object.
|
|
// CXTPReportHeader* pmyHeader = new CXTPReportHeader;
|
|
// </code>
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportHeader(CXTPReportControl* pControl, CXTPReportColumns* pColumns);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Destroys CXTPReportHeader object. Performs cleanup operations.
|
|
//-----------------------------------------------------------------------
|
|
virtual ~CXTPReportHeader();
|
|
|
|
protected:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Draws columns header on the provided DC.
|
|
// Parameters:
|
|
// pDC - Pointer to the destination device context.
|
|
// rcHeader - Reference to the rectangle in which the header is drawn.
|
|
// nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
|
|
// Remarks:
|
|
// Call this function to draw the header on the provided
|
|
// device context. Note that it does not contain Group By area.
|
|
// See Also: DrawGroupByControl
|
|
//-----------------------------------------------------------------------
|
|
virtual void Draw(CDC* pDC, CRect rcHeader, int nLeftOffset);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Draws Group By area on the provided DC.
|
|
// Parameters:
|
|
// pDC - Pointer to the destination device context.
|
|
// rcGroupBy - Reference to the rectangle of the Group By area.
|
|
// Remarks:
|
|
// Call this function to draw the header on the provided
|
|
// device context. Note that it does not contain Group By area.
|
|
// See Also: Draw
|
|
//-----------------------------------------------------------------------
|
|
virtual void DrawGroupByControl(CDC* pDC, CRect& rcGroupBy);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Draws columns footer on the provided DC.
|
|
// Parameters:
|
|
// pDC - Pointer to the destination device context.
|
|
// rcFooter - Reference to the rectangle in which the footer is drawn.
|
|
// nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
|
|
// Remarks:
|
|
// Call this function to draw the footer on the provided
|
|
// device context.
|
|
// See Also: Draw
|
|
//-----------------------------------------------------------------------
|
|
virtual void DrawFooter(CDC* pDC, CRect& rcFooter, int nLeftOffset);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Processes mouse left button down clicks.
|
|
// Parameters:
|
|
// ptClick - Point coordinates where the message was fired from.
|
|
// Remarks:
|
|
// Call this member function if you want Report Header to process
|
|
// a mouse left button down message. You should provide the method
|
|
// with the coordinates of the mouse message to proceed.
|
|
// See Also: OnLButtonUp, OnContextMenu, OnMouseMove
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnLButtonDown(CPoint ptClick);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Processes mouse left button double-clicks .
|
|
// Parameters:
|
|
// ptDblClick - Point coordinates where the message was fired from.
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnLButtonDblClk(CPoint ptDblClick);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Process mouse left button up clicks.
|
|
// Parameters:
|
|
// nFlags - Indicates whether various virtual keys are down.
|
|
// ptClick - Point coordinates where the message was fired from.
|
|
// Remarks:
|
|
// Call this member function if you want Report Header to process
|
|
// a mouse left button up message. You should provide the method
|
|
// with the coordinates of the mouse message to proceed and a flag
|
|
// showing which of virtual keys were down.
|
|
// See Also: OnLButtonDown, OnContextMenu, OnMouseMove
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnLButtonUp(UINT nFlags, CPoint ptClick);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Process context menu. Called by the framework when the user
|
|
// has clicked the right mouse button (right clicked) in the window.
|
|
// Parameters:
|
|
// ptClick - Position of the cursor, in screen coordinates,
|
|
// at the time of the mouse click.
|
|
// Remarks:
|
|
// Call this member function if you want Report Header to process
|
|
// a mouse right button down (context menu call) message.
|
|
// You should provide the method with the coordinates of the
|
|
// mouse message to proceed.
|
|
// See Also: OnLButtonDown, OnLButtonUp, OnMouseMove
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnContextMenu(CPoint ptClick);
|
|
|
|
// Summary:
|
|
// Returns the currently used control's Paint Manager.
|
|
// Remarks:
|
|
// Call this member function to get the paint manager object used
|
|
// for drawing a report control window.
|
|
// Returns:
|
|
// Pointer to the paint manager object.
|
|
// See Also: CXTPReportPaintManager overview
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportPaintManager* GetPaintManager() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Process mouse moving.
|
|
// Parameters:
|
|
// nFlags - Indicates whether various virtual keys are down.
|
|
// point - Point coordinates where the message was fired from.
|
|
// Remarks:
|
|
// Call this member function if you want Report Header to process
|
|
// a mouse move message. You should provide the method with the
|
|
// coordinates of the mouse message to proceed and a flag
|
|
// showing which of virtual keys were down.
|
|
// See Also: OnLButtonDown, OnLButtonUp, OnContextMenu
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnMouseMove(UINT nFlags, CPoint point);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Reads or writes configuration to/from the provided archive stream.
|
|
// Parameters:
|
|
// pPX - A CXTPPropExchange object to serialize to or from.
|
|
//----------------------------------------------------------------------
|
|
virtual void DoPropExchange(CXTPPropExchange* pPX);
|
|
|
|
public:
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Determines if dragging the header now.
|
|
// Remarks:
|
|
// When user starts dragging a row, Report Header enters a dragging
|
|
// loop and processes each message in the specific way.
|
|
// Using this function you can determine if we are in such a dragging
|
|
// loop or not.
|
|
// Returns:
|
|
// TRUE when dragging, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsDragHeader() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Allows/disallows column removing.
|
|
// Parameters:
|
|
// bAllow - TRUE for allowing column removing, FALSE for disallowing.
|
|
// Remarks:
|
|
// Usually user is allowed to remove a column using mouse drag and drop.
|
|
// Using this member function, you can change the user's permissions
|
|
// force allowing or disallowing of column removing.
|
|
// See Also: IsAllowColumnRemove, CXTPReportColumn::AllowColumnRemove
|
|
//-----------------------------------------------------------------------
|
|
void AllowColumnRemove(BOOL bAllow);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns the current column removing allowance.
|
|
// Remarks:
|
|
// Call this member function to determine whether the user is allowed
|
|
// to remove the column using drag and drop or not.
|
|
// Returns:
|
|
// TRUE when column removing is allowed, FALSE otherwise.
|
|
// See Also: AllowColumnRemove
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsAllowColumnRemove() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Allows/disallows column reordering.
|
|
// Parameters:
|
|
// bAllow - TRUE for allowing column reordering, FALSE for disallowing.
|
|
// Remarks:
|
|
// Usually user is allowed to reorder a column using mouse drag and drop.
|
|
// Using this member function, you can change the user's permissions
|
|
// and force allowing or disallowing of column reordering.
|
|
// See Also: IsAllowColumnReorder
|
|
//-----------------------------------------------------------------------
|
|
void AllowColumnReorder(BOOL bAllow);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns the current column reordering allowance.
|
|
// Remarks:
|
|
// Call this member function to determine whether the user is allowed
|
|
// to reorder the column using drag and drop or not.
|
|
// Returns:
|
|
// TRUE when column reordering is allowed, FALSE otherwise.
|
|
// See Also: AllowColumnReorder
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsAllowColumnReorder() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Allows/disallows column resizing.
|
|
// Parameters:
|
|
// bAllow - TRUE for allowing column resizing, FALSE for disallowing.
|
|
// Remarks:
|
|
// Usually the user is allowed to resize column using mouse drag and drop.
|
|
// Using this member function you can change user's permissions
|
|
// and force allowing or disallowing of column resizing.
|
|
// See Also: IsAllowColumnResize
|
|
//-----------------------------------------------------------------------
|
|
void AllowColumnResize(BOOL bAllow);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns current column resizing allowance.
|
|
// Remarks:
|
|
// Call this member function to determine whether the user is allowed
|
|
// to resize a column using drag and drop or not.
|
|
// Returns:
|
|
// TRUE when column resizing is allowed, FALSE otherwise.
|
|
// See Also: AllowColumnResize
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsAllowColumnResize() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets show items in groups mode.
|
|
// Parameters:
|
|
// bShowInGroups - TRUE for show items in groups, FALSE otherwise.
|
|
// Remarks:
|
|
// Using this member function you can change Report Header
|
|
// showing items in groups mode.
|
|
// See Also: IsShowItemsInGroups
|
|
//-----------------------------------------------------------------------
|
|
void ShowItemsInGroups(BOOL bShowInGroups);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns current show items in groups mode.
|
|
// Remarks:
|
|
// Using this member function you can retrieve current
|
|
// showing items in groups mode.
|
|
// Returns:
|
|
// TRUE when items are shown in groups, FALSE otherwise.
|
|
// See Also: ShowItemsInGroups
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsShowItemsInGroups() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets allowing column sorting mode.
|
|
// Parameters:
|
|
// bAllow - TRUE for allowing, FALSE for disallowing.
|
|
// Remarks:
|
|
// Using this member function you can allow or disallow sorting
|
|
// columns by mouse.
|
|
// See Also: IsAllowColumnSort
|
|
//-----------------------------------------------------------------------
|
|
void AllowColumnSort(BOOL bAllow);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns current allowing column sorting mode.
|
|
// Remarks:
|
|
// Using this member function you can retrieve the current
|
|
// allowing column sorting mode.
|
|
// Returns:
|
|
// TRUE when column sorting is allowed, FALSE otherwise.
|
|
// See Also: AllowColumnSort
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsAllowColumnSort() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to retrieve the next visible column.
|
|
// Parameters:
|
|
// nIndex - Position of a column in the array of columns to start from.
|
|
// nDirection - The direction to move (left or right) in the array, starting and nIndex.
|
|
// Returns:
|
|
// A pointer to the next visible column.
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPReportColumn* GetNextVisibleColumn(int nIndex, int nDirection);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Finds a column from point.
|
|
// Parameters:
|
|
// ptPoint - A point to test in report control client coordinates.
|
|
// Remarks:
|
|
// Call this member function if you want to retrieve a pointer to a
|
|
// column in the specified position.
|
|
// Returns:
|
|
// A pointer to the column placed at the specified position, if any,
|
|
// or NULL otherwise.
|
|
// See Also: CXTPReportControl::HitTest, CXTPReportRow::HitTest
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPReportColumn* HitTest(CPoint ptPoint) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Calculates index of where to insert a column nearest to the provided point.
|
|
// Parameters:
|
|
// ptPoint - Point coordinates to test
|
|
// Returns:
|
|
// Header column index.
|
|
//-----------------------------------------------------------------------
|
|
virtual int FindHeaderColumn(CPoint ptPoint) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Calculates index of where to insert a column nearest to the provided point.
|
|
// Parameters:
|
|
// ptPoint - Point coordinates to test.
|
|
// bExactSearch - TRUE when search by exact position,
|
|
// FALSE when searching average value.
|
|
// Returns:
|
|
// GroupBy column position.
|
|
//-----------------------------------------------------------------------
|
|
virtual int FindGroupByColumn(CPoint ptPoint, BOOL bExactSearch = FALSE) const;
|
|
|
|
//private:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Finds header column index by provided point.
|
|
// Parameters:
|
|
// ptPoint - A point to test in report control window client coordinates.
|
|
// Returns:
|
|
// An index of the found column in the header column array, if found,
|
|
// or -1 if column was not found.
|
|
//-----------------------------------------------------------------------
|
|
virtual int HitTestHeaderColumnIndex(CPoint ptPoint) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Checks if the provided point is over column resize area.
|
|
// Parameters:
|
|
// ptPoint - Point coordinates to test
|
|
// Returns:
|
|
// A pointer to column for resize, or NULL if point is not over any column resize area.
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportColumn* MouseOverColumnResizeArea(CPoint ptPoint);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Get current scroll information for full columns scroll mode and the helper
|
|
// information to scroll left or right.
|
|
// Parameters:
|
|
// rpPrev - [out] A reference to store next column to scroll left.
|
|
// NULL is returned if current position is on last left column.
|
|
// rpCurr - [out] A reference to store current column (first visible column on the left).
|
|
// rpNext - [out] A reference to store next column to scroll right.
|
|
// NULL is returned if current position is on last right column.
|
|
// rnScrollPos - [out] A reference to store current scrollBar position.
|
|
// rnScrollMax - [out] A reference to store scrollBar positions count.
|
|
// Returns:
|
|
// A freezed columns width in pixels.
|
|
//-----------------------------------------------------------------------
|
|
int GetFullColScrollInfo(CXTPReportColumn*& rpPrev, CXTPReportColumn*& rpCurr, CXTPReportColumn*& rpNext,
|
|
int& rnScrollPos, int& rnScrollMax) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Checks if the provided point is over column resize area.
|
|
// Parameters:
|
|
// nTotalWidth - Total width of the header area in pixels.
|
|
// nFirstIndex - Index of a column to start adjusting from.
|
|
// Remarks:
|
|
// Call this member function when you want to adjust the width of
|
|
// columns in reaction to any specific event.
|
|
// For example, this member function is called by the framework
|
|
// when changing the report control size (WM_SIZE), and when
|
|
// changing a size of any column by mouse dragging.
|
|
// See Also: ResizeColumn, GetMaxAvailWidth
|
|
//-----------------------------------------------------------------------
|
|
void AdjustColumnsWidth(int nTotalWidth, int nFirstIndex = 0);
|
|
|
|
protected:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Starts column header dragging mode.
|
|
// Parameters:
|
|
// pColumn - Pointer to the column, which is entering in dragging mode.
|
|
// bHeader - TRUE when starting dragging for column header items,
|
|
// FALSE when starting dragging for Group By column items.
|
|
// Remarks:
|
|
// Usually this method is called internally in a reaction to any
|
|
// specific user actions. For example when a user starts dragging
|
|
// header by mouse.
|
|
// See Also: GetDraggingColumn, CancelMouseMode
|
|
//-----------------------------------------------------------------------
|
|
void StartDragging(CXTPReportColumn* pColumn, BOOL bHeader = FALSE);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Resizes a provided column to a specific new width.
|
|
// Parameters:
|
|
// pColumn - Pointer to a column to resize.
|
|
// nWidth - New column width in pixels.
|
|
// Remarks:
|
|
// This method resizes a provided column to a specific new width,
|
|
// and adjusts the width of other columns in correspondence with
|
|
// the new one.
|
|
// See Also: AdjustColumnsWidth, GetMaxAvailWidth
|
|
//-----------------------------------------------------------------------
|
|
void ResizeColumn(CXTPReportColumn* pColumn, int nWidth);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Resets any mouse mode to xtpMouseNothing.
|
|
// Remarks:
|
|
// Usually this member function is called when finishing
|
|
// dragging or resizing columns. It performs all
|
|
// necessary cleanup and resets mouse mode to xtpMouseNothing.
|
|
// See Also: StartDragging
|
|
//-----------------------------------------------------------------------
|
|
void CancelMouseMode();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns maximum available width for the column.
|
|
// Parameters:
|
|
// pColumn - Pointer to the column to check.
|
|
// Remarks:
|
|
// Calculates maximum possible width for the column depending
|
|
// on the width and modes for other columns.
|
|
// Returns:
|
|
// Maximum available width for the column in pixels.
|
|
// See Also: AdjustColumnsWidth, ResizeColumn
|
|
//-----------------------------------------------------------------------
|
|
int GetMaxAvailWidth(CXTPReportColumn* pColumn);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets a divider between columns.
|
|
// Parameters:
|
|
// nIndex - An index of the column to set hot divider before.
|
|
// bHeader - TRUE if you want to set hot divider in columns header,
|
|
// FALSE to set it between on Group By area items.
|
|
// Remarks:
|
|
// When dragging columns, call this member function to show a
|
|
// hot divider (red arrows by default) between columns as a target
|
|
// dropping a currently dragging one.
|
|
// Returns:
|
|
// An index of the column before which a hot divider was shown.
|
|
//-----------------------------------------------------------------------
|
|
int SetHotDivider(int nIndex, BOOL bHeader = TRUE);
|
|
|
|
public:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns a column, which is dragging at the moment.
|
|
// Remarks:
|
|
// Call this member function if you want to retrieve a pointer
|
|
// to the currently dragging column.
|
|
// Returns:
|
|
// A pointer to the dragging column if the control is in
|
|
// dragging mode, or NULL otherwise.
|
|
// Example: <code>CXTPReportColumn* pColumn = GetDraggingColumn();</code>
|
|
// See Also: StartDragging, GetResizingColumn,
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportColumn* GetDraggingColumn() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns a column, which is resizing at the moment.
|
|
// Remarks:
|
|
// Call this member function if you want to retrieve a pointer
|
|
// to the currently resizing column.
|
|
// Returns:
|
|
// A pointer to the resizing column if the control is in
|
|
// resizing mode, or NULL otherwise.
|
|
// Example: <code>CXTPReportColumn* pColumn = GetResizingColumn();</code>
|
|
// See Also: StartDragging, GetDraggingColumn
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportColumn* GetResizingColumn() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets associated Field chooser list control.
|
|
// Parameters:
|
|
// pSubList - Pointer to the field chooser list box control.
|
|
// Remarks:
|
|
// You should call this member function to assign the user's custom
|
|
// List control as report control Field chooser control.
|
|
// After assigning, the framework will automatically be processing
|
|
// all windows messages from the control.
|
|
// Returns:
|
|
// TRUE if successful; otherwise FALSE.
|
|
// Example:
|
|
// <code>
|
|
// // CXTPReportControl wndReport;
|
|
// // CXTPReportSubListControl wndSubList;
|
|
// wndReport.GetColumns()->GetReportHeader()->SetSubListCtrl(&wndSubList);
|
|
// </code>
|
|
// See Also: CXTPReportSubListControl overview, SetFilterEditCtrl
|
|
//-----------------------------------------------------------------------
|
|
BOOL SetSubListCtrl(CXTPReportSubListControl* pSubList);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Retrieves Pointer to the field chooser
|
|
// Returns:
|
|
// Pointer to the field chooser list box control.
|
|
// See Also: SetSubListCtrl
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportSubListControl* GetSubListCtrl() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets associated filter edit control.
|
|
// Parameters:
|
|
// pFilterEdit - Pointer to the user's filter edit control.
|
|
// Remarks:
|
|
// You should call this member function to assign the user's custom
|
|
// edit box control as report control filter edit control.
|
|
// After assigning, the framework will automatically be processing
|
|
// all windows messages for the control.
|
|
// Returns:
|
|
// TRUE if successful; otherwise FALSE.
|
|
// Example:
|
|
// <code>
|
|
// CXTPReportControl wndReport;
|
|
// CXTPReportFilterEditControl wndFilterEdit;
|
|
// wndReport.GetReportHeader()->SetFilterEditCtrl(&wndFilterEdit);
|
|
// </code>
|
|
// See Also: CXTPReportFilterEditControl overview, GetFilterEditCtrl, SetSubListCtrl
|
|
//-----------------------------------------------------------------------
|
|
BOOL SetFilterEditCtrl(CXTPReportFilterEditControl* pFilterEdit);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns the associated Filter edit control.
|
|
// Remarks:
|
|
// Call this member function to retrieve a pointer to the
|
|
// associated filter edit control.
|
|
// Returns:
|
|
// A pointer to the associated filter edit control.
|
|
// See Also: CXTPReportFilterEditControl overview, SetFilterEditCtrl
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportFilterEditControl* GetFilterEditCtrl() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns the Group By area height.
|
|
// Remarks:
|
|
// Calculates Group By area height depending on the number of
|
|
// items contained inside.
|
|
// Returns:
|
|
// A Group By area height in pixels.
|
|
//-----------------------------------------------------------------------
|
|
int GetGroupByHeight() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Fits the provided column width to the longest column item width.
|
|
// Parameters:
|
|
// pColumn - A column to fit width.
|
|
// Remarks:
|
|
// Call this method to adjust column width to the width of the
|
|
// widest column item.
|
|
//-----------------------------------------------------------------------
|
|
void BestFit(CXTPReportColumn* pColumn);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Checks a column for its position in report header.
|
|
// Parameters:
|
|
// pColumn - A pointer to the column to check.
|
|
// Returns:
|
|
// TRUE if a provided column is the last visible column in a report
|
|
// header, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsLastVisibleColumn(CXTPReportColumn* pColumn) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Checks a column for its position in report header.
|
|
// Parameters:
|
|
// pColumn - A pointer to the column to check.
|
|
// Returns:
|
|
// TRUE if a provided column is the last resizable column in a report
|
|
// header, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsLastResizebleColumn(CXTPReportColumn* pColumn) const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns an indent for report rows by 1 tree level.
|
|
// Remarks:
|
|
// Call this member function to retrieve an indent for 1 level
|
|
// of tree depth for the report control in tree mode.
|
|
// Returns:
|
|
// An indent by one level in pixels.
|
|
//-----------------------------------------------------------------------
|
|
int GetIndentLevel() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Updates header settings after any changes.
|
|
// Parameters:
|
|
// nReason - event reason.
|
|
// pColumn - affected column.
|
|
// Remarks:
|
|
// Call this member function if you want to automatically
|
|
// adjust columns widths and redraw report control depending
|
|
// on current columns settings.
|
|
// See Also: XTPReportColumnOrderChangedReason
|
|
//-----------------------------------------------------------------------
|
|
virtual void OnColumnsChanged(int nReason, CXTPReportColumn* pColumn);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Retrieves parent Report Control
|
|
// Returns:
|
|
// CXTPReportControl pointer
|
|
//-----------------------------------------------------------------------
|
|
CXTPReportControl* GetControl() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to specify if AutoColumnSizing should be used.
|
|
// Parameters:
|
|
// bAutoColumnSizing - If TRUE, all columns are sized to fill the
|
|
// entire width of the ReportControl. When the
|
|
// ReportControl is resized, the Columns will
|
|
// automatically be resized to fit the new size
|
|
// of the RepotControl.
|
|
// If FALSE, the columns will use the width they
|
|
// were assigned when they were created, or whatever
|
|
// value is stored in the columns width property.
|
|
// The columns widths my occupy more or less that
|
|
// the total width of the ReportControl. If the
|
|
// total width of the columns exceeds the width
|
|
// of the ReportControl, then those columns will not
|
|
// be visible. When the ReportControl is resized,
|
|
// the size of the columns will not be effected.
|
|
//-----------------------------------------------------------------------
|
|
void SetAutoColumnSizing(BOOL bAutoColumnSizing);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to determine if AutoColumnSizing is currently used.
|
|
// Returns:
|
|
// TRUE is AutoColumnSizing is used, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL IsAutoColumnSizing() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to determine m_bForceLayoutAdjustment flag.
|
|
// Returns:
|
|
// TRUE if the operation is successful, FALSE else.
|
|
//-----------------------------------------------------------------------
|
|
BOOL ForceLayoutAdjustment() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to retrieve the total width of the header (total combined column widths).
|
|
// Returns:
|
|
// The total combined column widths, which make up the header width.
|
|
//-----------------------------------------------------------------------
|
|
int GetWidth() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to set the last column expand.
|
|
// Parameters:
|
|
// bLastColumnExpand - To set last colum expand or not.
|
|
// bLastColumnExpandKeep - Not used currently.
|
|
//-----------------------------------------------------------------------
|
|
void SetLastColumnExpand(BOOL bLastColumnExpand, BOOL bLastColumnExpandKeep);
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to get maximum column width for all columns.
|
|
// Returns:
|
|
// m_nMaxColumnWidth - Maximum column width
|
|
//-----------------------------------------------------------------------
|
|
int GetMaxColumnWidth() const;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member to set maximum column width for all columns.
|
|
// Call pColumn->SetMaxWidth to set maximumn width for individual column
|
|
// Parameters:
|
|
// nMaxColumnWidth - Maximum column width
|
|
//-----------------------------------------------------------------------
|
|
void SetMaxColumnWidth(int nMaxColumnWidth);
|
|
|
|
protected:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// The framework calls this member function to determine whether a
|
|
// point is in the bounding rectangle of the specified tool.
|
|
// Parameters:
|
|
// point - Specifies the x- and y-coordinate of the cursor. These
|
|
// coordinates are always relative to the upper-left corner of the window
|
|
// pTI - A pointer to a TOOLINFO structure.
|
|
// Returns:
|
|
// If the tooltip control was found, the window control ID. If
|
|
// the tooltip control was not found, -1.
|
|
//-----------------------------------------------------------------------
|
|
virtual INT_PTR OnToolHitTest(CPoint point, TOOLINFO* pTI) const;
|
|
|
|
//private:
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
void TrackColumn(CXTPReportColumn* pColumn, CPoint pt);
|
|
void DestroyDropWnd();
|
|
void SetHotTrackingColumn(CXTPReportColumn* pColumn);
|
|
CXTPReportColumn* GetHotTrackingColumn() const;
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
|
|
protected:
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
// System accessibility support.
|
|
virtual HRESULT GetAccessibleParent(IDispatch** ppdispParent);
|
|
virtual HRESULT GetAccessibleChildCount(long* pcountChildren);
|
|
virtual HRESULT GetAccessibleChild(VARIANT varChild, IDispatch** ppdispChild);
|
|
virtual HRESULT GetAccessibleName(VARIANT varChild, BSTR* pszName);
|
|
virtual HRESULT GetAccessibleRole(VARIANT varChild, VARIANT* pvarRole);
|
|
virtual HRESULT AccessibleLocation(long *pxLeft, long *pyTop, long *pcxWidth, long* pcyHeight, VARIANT varChild);
|
|
virtual HRESULT AccessibleHitTest(long xLeft, long yTop, VARIANT* pvarChild);
|
|
virtual HRESULT GetAccessibleState(VARIANT varChild, VARIANT* pvarState);
|
|
virtual CCmdTarget* GetAccessible();
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
|
|
protected:
|
|
CXTPReportColumns* m_pColumns; // Contains associated columns list.
|
|
CXTPReportControl* m_pControl; // Pointer to the parent Report control.
|
|
|
|
int m_nDropIndex; // Item index of the column to drop to.
|
|
int m_nVisIndex; // Item visual index of the column to drag from.
|
|
// Release 13.1
|
|
CXTPReportHeaderDropWnd* m_pDropWnd; // Column drop window.
|
|
CXTPReportHeaderDragWnd* m_pDragWnd; // Column drag window.
|
|
|
|
HCURSOR m_hDontDropCursor; // Handler of user's Don't Drop cursor.
|
|
|
|
CXTPReportColumn* m_pDragColumn; // Dragging column.
|
|
CXTPReportColumn* m_pResizeColumn; // Resizing column.
|
|
CXTPReportColumn* m_pHotTrackingColumn; // Hot column
|
|
BOOL m_bDragHeader; // Determines whether control is in header dragging mode or group by dragging mode.
|
|
BOOL m_bDragGroupBox; // Determines whether control is in group box dragging mode.
|
|
|
|
CXTPReportSubListControl* m_pSubList; // Field chooser list control.
|
|
CXTPReportFilterEditControl* m_pFilterEdit; // Filter edit control
|
|
|
|
CRect m_rcGroupBy; // Group By area coordinates.
|
|
CRect m_rcHeader; // Header coordinates.
|
|
CPoint m_ptMouse; // Stores mouse coordinates for processing when required (resizing, etc).
|
|
|
|
HCURSOR m_hResizeCursor; // Handler of user's Resizing cursor.
|
|
|
|
BOOL m_bAllowColumnRemove; // FALSE if columns removing is not allowed.
|
|
BOOL m_bAllowColumnResize; // FALSE if columns resizing is not allowed.
|
|
BOOL m_bAllowColumnReorder; // FALSE if columns reordering is not allowed.
|
|
BOOL m_bAllowColumnSort; // FALSE if columns sorting is not allowed.
|
|
|
|
BOOL m_bAutoColumnSizing; // TRUE if AutoColumnSizing should be used.
|
|
int m_nResizeCaptureRange; // Distance around column divider where column re-sizer is shown.
|
|
int m_nIndentLevel; // Width indent at the left of the column.
|
|
BOOL m_bShowItemsInGroups; // TRUE when showing items in groups, FALSE when grouping is not used.
|
|
int m_nHeaderWidth; // The combined width of all the visible column headers.
|
|
int m_nForceLayoutAdjustment;
|
|
//internal flag to Force Layout Adjustment (and also show scrollbar) if positive
|
|
|
|
BOOL m_bLastColumnExpand; // Tells whether the last column expand or not.
|
|
BOOL m_bLastColumnExpandKeep;//Not used currently.
|
|
|
|
int m_nMaxColumnWidth; // Custom maximum column width
|
|
|
|
//private:
|
|
enum ReportDraggingMode
|
|
{
|
|
dragNothing = 0, // User is dragging nothing.
|
|
dragOutTarget = 1, // User is dragging an item outside the drop target.
|
|
dragInHeader = 2, // User is dragging an item inside header
|
|
dragInGroupBox = 4, // User is dragging an item inside group box
|
|
dragInTarget = 6, // User is dragging an item inside the drop target.
|
|
dragFieldChooser = 8 // User is dragging an item inside field chooser.
|
|
} m_dragMode; // Column dragging mode.
|
|
|
|
public:
|
|
static int s_nMinAutoScrollStep; // Minimal horizontal autoscrolling step in pixels.
|
|
|
|
static BOOL s_bShowItemsInGroupsPXDefault; // Store default value of m_bShowItemsInGroups member for serialization (PropExchange).
|
|
static BOOL s_bSendContextMenuForWholeHeaderArea; // If set as TRUE report control send ContextMenu event for clicks on whole header area (not only for columns) rectangles.
|
|
|
|
BOOL m_bHideColumnAfterGroupBoxDrop; //Tell whether to hide the column after group box drop.
|
|
};
|
|
|
|
|
|
AFX_INLINE CXTPReportFilterEditControl* CXTPReportHeader::GetFilterEditCtrl() const {
|
|
return m_pFilterEdit;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsDragHeader() const {
|
|
return m_bDragHeader;
|
|
}
|
|
AFX_INLINE int CXTPReportHeader::GetIndentLevel()const {
|
|
return m_nIndentLevel;
|
|
}
|
|
AFX_INLINE void CXTPReportHeader::AllowColumnRemove(BOOL bAllow) {
|
|
m_bAllowColumnRemove = bAllow;
|
|
}
|
|
AFX_INLINE void CXTPReportHeader::AllowColumnResize(BOOL bAllow) {
|
|
m_bAllowColumnResize = bAllow;
|
|
}
|
|
AFX_INLINE void CXTPReportHeader::AllowColumnReorder(BOOL bAllow) {
|
|
m_bAllowColumnReorder = bAllow;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnRemove() const {
|
|
return m_bAllowColumnRemove;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnReorder() const {
|
|
return m_bAllowColumnReorder;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnResize() const {
|
|
return m_bAllowColumnResize;
|
|
}
|
|
AFX_INLINE void CXTPReportHeader::AllowColumnSort(BOOL bAllow) {
|
|
m_bAllowColumnSort = bAllow;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsAllowColumnSort() const {
|
|
return m_bAllowColumnSort;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsShowItemsInGroups() const {
|
|
return m_bShowItemsInGroups;
|
|
}
|
|
AFX_INLINE CXTPReportControl* CXTPReportHeader::GetControl() const {
|
|
return m_pControl;
|
|
}
|
|
AFX_INLINE CXTPReportSubListControl* CXTPReportHeader::GetSubListCtrl() const {
|
|
return m_pSubList;
|
|
}
|
|
AFX_INLINE int CXTPReportHeader::GetWidth() const {
|
|
return m_nHeaderWidth;
|
|
}
|
|
AFX_INLINE BOOL CXTPReportHeader::IsAutoColumnSizing() const {
|
|
return m_bAutoColumnSizing;
|
|
}
|
|
AFX_INLINE int CXTPReportHeader::ForceLayoutAdjustment() const {
|
|
return m_nForceLayoutAdjustment;
|
|
}
|
|
AFX_INLINE void CXTPReportHeader::SetMaxColumnWidth(int nMaxColumnWidth) {
|
|
m_nMaxColumnWidth = nMaxColumnWidth;
|
|
}
|
|
AFX_INLINE int CXTPReportHeader::GetMaxColumnWidth() const {
|
|
return m_nMaxColumnWidth;
|
|
}
|
|
|
|
#endif //#if !defined(__XTPREPORTHEADER_H__)
|