DragonNest/Third/XTToolkitPro/Source/ReportControl/XTPReportRow.h
2024-12-19 09:48:26 +08:00

708 lines
29 KiB
C++

// XTPReportRow.h: interface for the CXTPReportRow class.
//
// This file is a part of the XTREME REPORTCONTROL MFC class library.
// (c)1998-2008 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(__XTPREPORTROW_H__)
#define __XTPREPORTROW_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "XTPReportDefines.h"
class CXTPReportRecord;
class CXTPReportControl;
class CXTPReportTip;
class CXTPReportRecordItem;
class CXTPReportRows;
class CXTPReportColumn;
struct XTP_REPORTRECORDITEM_DRAWARGS;
struct XTP_REPORTRECORDITEM_METRICS;
struct XTP_REPORTRECORDITEM_CLICKARGS;
//-----------------------------------------------------------------------
// Summary:
// This enum defines body, header, and footer rows.
// See Also:
// CXTPReportRow::m_nRowType
//-----------------------------------------------------------------------
enum XTPReportRowType
{
xtpRowTypeBody = 0, // The row is in body rows collection.
xtpRowTypeHeader = 1, // The row is in Headers rows collection.
xtpRowTypeFooter = 2 // The row is in Footers rows collection.
};
//===========================================================================
// Summary:
// CXTPReportRow class represents an row of the report control
// window.
// Remarks:
// Each item has corresponding a CXTPReportRecord, and could have a list
// of sub-items associated with it. By clicking a Row item, the user
// can expand and collapse the associated list of sub-items.
//
// CXTPReportRow handles a behavior of report row. It processes
// user mouse and keyboard events, it also implements external control
// member functions. It is also handling drawing logic for the row.
//
// A collection of report row items is combined into CXTPReportRows
// and could be accessed via CXTPReportControl::GetRows() method.
// See Also:
// CXTPReportControl overview, CXTPReportRows, CXTPReportRecord,
// CXTPReportRecordItem, CXTPReportGroupRow
//===========================================================================
class _XTP_EXT_CLASS CXTPReportRow : public CXTPHeapObjectT<CCmdTarget, CXTPReportRowAllocator>
{
DECLARE_DYNAMIC(CXTPReportRow)
public:
//-----------------------------------------------------------------------
// Summary:
// A constructor of the CXTPReportRow object.
//-----------------------------------------------------------------------
CXTPReportRow();
//-----------------------------------------------------------------------
// Summary:
// Destroys CXTPReportRow object, handles cleanup and deallocation.
//-----------------------------------------------------------------------
virtual ~CXTPReportRow();
public:
//-----------------------------------------------------------------------
// Summary:
// This method is called for initial initialization of the row.
// Parameters:
// pRow - Row which settings will be copied for the row.
// pControl - Pointer to the parent report control.
// pRecord - Pointer to the record associated with the row.
//-----------------------------------------------------------------------
virtual void InitRow(CXTPReportRow* pRow);
virtual void InitRow(CXTPReportControl* pControl, CXTPReportRecord* pRecord);// <COMBINE CXTPReportRow::InitRow@CXTPReportRow*>
//-----------------------------------------------------------------------
// Summary:
// Get associated record.
// Returns:
// Associated list record with data.
// Example:
// <code>CXTPReportRecord* pRecord = pRow->GetRecord();</code>
// See Also: CXTPReportRecord overview
//-----------------------------------------------------------------------
virtual CXTPReportRecord* GetRecord() const;
//-----------------------------------------------------------------------
// Summary:
// Draws the row on the provided DC.
// Parameters:
// pDC - Pointer to control drawing context.
// rcRow - Coordinates of the rectangle for drawing this row.
// nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
// Remarks:
// Call this member function to draw an item. This function
// only prepares data for drawing and calls needed drawing functions
// from PaintManager.
//
// Thus if you wish to change the look of your report item, you must just
// provide your own implementation of PaintManager
// See Also: CXTPPaintManager
//-----------------------------------------------------------------------
virtual void Draw(CDC* pDC, CRect rcRow, int nLeftOffset);
//-----------------------------------------------------------------------
// Summary:
// Calculates height of the row depending on the provided DC.
// Parameters:
// pDC - Provided DC.
// nWidth - Row width.
// Remarks:
// Row height depends of many factors: provided device context,
// font to print text, visibility of rows items. GetHeight()
// takes into account all of them to get real height of Row.
// Returns:
// Returns height of the row in logical units.
//-----------------------------------------------------------------------
virtual int GetHeight(CDC* pDC, int nWidth);
//-----------------------------------------------------------------------
// Summary:
// Returns current row index in the view.
// Remarks:
// ReportControl draws row in some order. It depends of Index value
// You use GetIndex() to get current index value for particular row
// Returns:
// Current row index in the view.
//-----------------------------------------------------------------------
virtual int GetIndex() const;
//-----------------------------------------------------------------------
// Summary:
// Returns row focused state.
// Remarks:
// Call this member function if you want to determine whether
// this row is focused in the report control or not.
// Returns:
// TRUE if row is focused, FALSE otherwise.
// See Also: IsSelected
//-----------------------------------------------------------------------
virtual BOOL IsFocused() const;
//-----------------------------------------------------------------------
// Summary:
// Returns row selected state.
// Remarks:
// Call this member function if you want to determine whether
// this row is selected in the report control or not.
// Returns:
// TRUE if row is selected, FALSE otherwise.
// See Also: IsFocused
//-----------------------------------------------------------------------
virtual BOOL IsSelected() const;
//-----------------------------------------------------------------------
// Summary:
// Returns row expanded state.
// Remarks:
// Call this member function if you want to determine whether
// this row is expanded in the report control or not.
// Returns:
// TRUE if row is expanded, FALSE otherwise.
// See Also: SetExpanded
//-----------------------------------------------------------------------
virtual BOOL IsExpanded() const;
//-----------------------------------------------------------------------
// Summary:
// Sets row expanded state.
// Parameters:
// bExpanded - New row expanded state.
// Remarks:
// Call this member function if you want to expand or collapse
// this row.
// See Also: IsExpanded
//-----------------------------------------------------------------------
virtual void SetExpanded(BOOL bExpanded);
//-----------------------------------------------------------------------
// Summary:
// Call this member to select/set focus to the row. If multiple
// selection is enabled, then this row will be added to the selection.
// Parameters:
// bSelected - TRUE to select the row, FALSE to de-select the row.
//-----------------------------------------------------------------------
virtual void SetSelected(BOOL bSelected);
//-----------------------------------------------------------------------
// Summary:
// Call this member to select all child items of specified row.
//-----------------------------------------------------------------------
virtual void SelectChilds();
//-----------------------------------------------------------------------
// Summary:
// Determines if this row is a group row.
// Remarks:
// Call this member function if you want to determine whether
// this row is a group row or not.
// Returns:
// TRUE if it is a group row, FALSE otherwise.
//-----------------------------------------------------------------------
virtual BOOL IsGroupRow() const;
//-----------------------------------------------------------------------
// Summary:
// Determines which report item, if any, is at a specified position.
// Parameters:
// ptPoint - Point to test.
// pRectItem - Returns item rect.
// ppColumn - Returns a pointer to the column at tested position.
// Remarks:
// Call this member function to test a row contents at the
// specified position.
// Returns:
// The record item at the specified position, if any,
// or NULL otherwise.
//-----------------------------------------------------------------------
virtual CXTPReportRecordItem* HitTest(CPoint ptPoint, CRect* pRectItem = NULL, CXTPReportColumn** ppColumn = NULL) const;
//-----------------------------------------------------------------------
// Summary:
// Process mouse clicks. Called by the framework when the user
// has clicked the mouse button in the row area.
// Parameters:
// ptClicked - Position of the cursor, in screen coordinates,
// at the time of the mouse click.
// Remarks:
// Call this member function if you want a row to process
// a mouse button click message.
// You should provide the method with the coordinates of the
// mouse message to proceed.
// See Also: OnDblClick, OnMouseMove, OnContextMenu
//-----------------------------------------------------------------------
virtual void OnClick(CPoint ptClicked);
//-----------------------------------------------------------------------
// Summary:
// Processes mouse left button down clicks.
// Parameters:
// pClickArgs - structure which contains mouse click arguments
// See Also: OnLButtonUp, OnClick
//-----------------------------------------------------------------------
virtual BOOL OnLButtonDown(XTP_REPORTRECORDITEM_CLICKARGS* pClickArgs);
//-----------------------------------------------------------------------
// Summary:
// Processes mouse left button up clicks.
// Parameters:
// pClickArgs - structure which contains mouse click arguments
// See Also: OnLButtonDown, OnClick
//-----------------------------------------------------------------------
virtual BOOL OnLButtonUp(XTP_REPORTRECORDITEM_CLICKARGS* pClickArgs);
//-----------------------------------------------------------------------
// Summary:
// Process mouse double clicks. Called by the framework when
// the user has double-clicked the mouse button in the row area.
// Parameters:
// ptClicked - Position of the cursor, in screen coordinates,
// at the time of the mouse click.
// Remarks:
// Call this member function if you want a row to process
// a mouse button double click message.
// You should provide the method with the coordinates of the
// mouse message to proceed.
// See Also: OnClick, OnMouseMove, OnContextMenu
//-----------------------------------------------------------------------
virtual void OnDblClick(CPoint ptClicked);
//-----------------------------------------------------------------------
// 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 a row 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: OnClick, OnDblClick, OnContextMenu
//-----------------------------------------------------------------------
virtual void OnMouseMove(UINT nFlags, CPoint point);
//-----------------------------------------------------------------------
// 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 a row 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: OnClick, OnDblClick, OnMouseMove
//-----------------------------------------------------------------------
virtual void OnContextMenu(CPoint ptClick);
//-----------------------------------------------------------------------
// Summary:
// Shows a specified tooltip window at the specified position.
// Parameters:
// ptTip - A screen position to show tooltip at.
// pTipWnd - Pointer to the specified tooltip window.
// Remarks:
// Call this member function if you want to show a report
// tip window for this row.
// See Also: CXTPReportTip overview
//-----------------------------------------------------------------------
virtual void ShowToolTip(CPoint ptTip, CXTPReportTip* pTipWnd);
//-----------------------------------------------------------------------
// Summary:
// Returns a pointer to the parent report control.
// Remarks:
// Call this member function to retrieve a pointer to the
// CXTPReportControl which this item belongs to.
// Returns:
// A pointer to an associated report control object.
// See Also: CXTPReportControl overview
//-----------------------------------------------------------------------
CXTPReportControl* GetControl() const;
//-----------------------------------------------------------------------
// Summary:
// Returns the parent row of the current row.
// Remarks:
// When report rows are arranged as a tree view, this member
// function returns a pointer to the parent CXTPReportRow item.
// Returns:
// Pointer to the parent row if any, or NULL otherwise.
// See Also: HasParent, GetTreeDepth, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual CXTPReportRow* GetParentRow() const;
//-----------------------------------------------------------------------
// Summary:
// Returns the parent rows of the current row.
// Remarks:
// When report rows are arranged as a tree view, this member
// function returns a pointer to the parent CXTPReportRows item.
// Returns:
// Pointer to the parent rows if any, or NULL otherwise.
// See Also: HasParent, GetTreeDepth, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual CXTPReportRows* GetParentRows() const;
//-----------------------------------------------------------------------
// Summary:
// Returns a depth of this row in tree view.
// Remarks:
// When report rows are arranged as a tree view, this member
// function returns a depth level of the row, which means
// the number of parent elements for the row..
// Returns:
// A depth of this row in tree view in levels.
// See Also: GetParentRow, HasParent, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual int GetTreeDepth() const;
//-----------------------------------------------------------------------
// Summary:
// Determines if a row has a parent in tree view.
// Parameters:
// pRow - A row to check.
// Remarks:
// When report rows are arranged as a tree view, this member
// function calculates whether this row has a parent row or not.
// Returns:
// TRUE if specified row has a parent, FALSE otherwise.
// See Also:
// HasParent, GetParentRow, GetTreeDepth, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual BOOL HasParent(CXTPReportRow* pRow);
//-----------------------------------------------------------------------
// Summary:
// Returns a collection of this row children.
// Remarks:
// Call this member function to retrieve access to the collection
// of row children.
// Returns:
// CXTPReportRows collection of row children.
// See Also:
// CXTPReportRows overview, GetParentRow, HasParent, GetTreeDepth, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual CXTPReportRows* GetChilds();
//-----------------------------------------------------------------------
// Summary:
// Adds a child row to the current row.
// Parameters:
// pRow - Pointer to a child CXTPReportRow object.
// Remarks:
// Call this member function if you want to add a CXTPReportRow
// object as a child of current row in tree view mode.
// Returns:
// A pointer to the added CXTPReportRow object.
// See Also: GetParentRow, HasParent, GetTreeDepth, GetChilds
//-----------------------------------------------------------------------
virtual CXTPReportRow* AddChild(CXTPReportRow* pRow);
//-----------------------------------------------------------------------
// Summary:
// Determines if a row has children in tree view.
// Parameters:
// pRow - A row to check.
// Remarks:
// When report rows are arranged as a tree view, this member
// function calculates whether this row has children rows or not.
// Returns:
// TRUE if the specified row has children rows, FALSE otherwise.
// See Also:
// HasParent, GetParentRow, GetTreeDepth, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual BOOL HasChildren() const;
//-----------------------------------------------------------------------
// Summary:
// Returns the next sibling row of the current row.
// Remarks:
// When report rows are arranged as a tree view, this member
// function returns a pointer to the next CXTPReportRow item.
// Returns:
// Pointer to the next sibling row if any, or NULL otherwise.
// See Also: HasParent, GetTreeDepth, GetChilds, AddChild, HasChildren
//-----------------------------------------------------------------------
virtual CXTPReportRow* GetNextSiblingRow() const;
//-----------------------------------------------------------------------
// Summary:
// Sets coordinates of the collapse/expand button for this row.
// Parameters:
// rcCollapse - The rectangle in report window client coordinates.
// Remarks:
// Call this member function to setup the coordinates of the
// collapse/expand button for the row. Note that it could be
// different depending on the row tree depth.
// See Also: GetTreeDepth, GetRect
//-----------------------------------------------------------------------
virtual void SetCollapseRect(CRect rcCollapse);
//-----------------------------------------------------------------------
// Summary:
// Determines if preview item is visible.
// Remarks:
// Call this member function to determine whether preview item
// for this row is visible or not.
// Returns:
// TRUE if preview item is visible, FALSE otherwise.
// See Also: CXTPReportRecordItemPreview overview, CXTPReportRecord::GetItemPreview
//-----------------------------------------------------------------------
virtual BOOL IsPreviewVisible() const;
//-----------------------------------------------------------------------
// Summary:
// Determines if items are visible
// Returns:
// TRUE if items are visible
// See Also IsPreviewVisible
//-----------------------------------------------------------------------
virtual BOOL IsItemsVisible() const;
//-----------------------------------------------------------------------
// Summary:
// Returns coordinates of the row rectangle.
// Returns:
// Coordinates of the row rectangle in report window client coordinates.
// Remarks:
// Call this member function to determine the coordinates of
// the region where this row is drawn on the parent window.
// See Also: SetCollapseRect
//-----------------------------------------------------------------------
virtual CRect GetRect() const;
//-----------------------------------------------------------------------
// Summary:
// Returns drawing metrics for the row.
// Parameters:
// pDrawArgs - Pointer to the provided draw arguments
// structure for calculating metrics.
// pItemMetrics - Pointer to the metrics structure to fill.
// Remarks:
// Call this member function when you want to retrieve drawing metrics.
// See Also: XTP_REPORTRECORDITEM_DRAWARGS, XTP_REPORTRECORDITEM_METRICS
//-----------------------------------------------------------------------
virtual void GetItemMetrics(XTP_REPORTRECORDITEM_DRAWARGS* pDrawArgs, XTP_REPORTRECORDITEM_METRICS* pItemMetrics);
//-----------------------------------------------------------------------
// Summary:
// Call this member to determine the row depth level when row is a group row.
// Returns:
// Row depth level when row is a group row.
//-----------------------------------------------------------------------
virtual int GetGroupLevel() const;
//-----------------------------------------------------------------------
// Summary:
// Determines rectangle of specified item
// Parameters:
// pItem - Record Item
// Returns:
// Rectangle of the item.
//-----------------------------------------------------------------------
virtual CRect GetItemRect(CXTPReportRecordItem* pItem);
//-----------------------------------------------------------------------
// Summary:
// Call this member to determine if the row is the last tree row.
// Or is not part of a tree row.
// Returns:
// TRUE if the row is the last tree row. FALSE if the row is not
// part of a tree row or is not the last tree row.
//-----------------------------------------------------------------------
virtual BOOL IsLastTreeRow() const;
//-----------------------------------------------------------------------
// Summary:
// Call this member to force this row to be visible. This will cause
// the report control to scroll to this row. This is also called by
// CXTPReportControl::SetFocusedRow to make visible the newly focused row.
//-----------------------------------------------------------------------
virtual void EnsureVisible();
//-----------------------------------------------------------------------
// Summary:
// Draws the row (of header/footer records) on the provided DC.
// Parameters:
// pDC - Pointer to control drawing context.
// rcRow - Coordinates of the rectangle for drawing this row.
// nLeftOffset - Start drawing left offset in pixels (Horizontal scroll position).
// rcArea - Coordinates of the rectangle for drawing rows of header/footer records.
// Remarks:
// Call this member function to draw an item. This function
// only prepares data for drawing and calls needed drawing functions
// from PaintManager.
//
// Thus if you wish to change the look of your report item, you must just
// provide your own implementation of PaintManager
// See Also: CXTPPaintManager
//-----------------------------------------------------------------------
void DrawFixed(CDC* pDC, CRect rcRow, int nLeftOffset, CRect rcArea);
public:
//-----------------------------------------------------------------------
// Summary:
// This method is call to update rectangle of item
// Parameters:
// rcItem - Bounding Rectangle of item cell
// pColumn - Column to test for tree column
// See Also: CXTPReportColumn::IsTreeColumn
//-----------------------------------------------------------------------
virtual void ShiftTreeIndent(CRect& rcItem, CXTPReportColumn* pColumn) const;
//-----------------------------------------------------------------------
// Summary:
// Fill XTP_REPORTRECORDITEM_METRICS structure with drawing metrics
// Parameters:
// pColumn - Column of the item
// pItem - Item to be draen
// pMetrics - Output drawing metrics for the item
// See Also: GetItemMetrics
//-----------------------------------------------------------------------
virtual void FillMetrics(CXTPReportColumn* pColumn, CXTPReportRecordItem* pItem, XTP_REPORTRECORDITEM_METRICS* pMetrics);
//-----------------------------------------------------------------------
// 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);
//-----------------------------------------------------------------------
// Summary:
// Call this member to determine the row type: body, header, or footer.
// Returns:
// A value of enum XTPReportRowType.
//-----------------------------------------------------------------------
XTPReportRowType GetType() const;
protected:
//-----------------------------------------------------------------------
// Summary:
// Sets new row index in the view.
// Parameters:
// nNewIndex - New row numeric index.
// Remarks:
// Call this member function when you want to change the row
// position in the corresponding row collection.
//-----------------------------------------------------------------------
virtual void SetIndex(int nNewIndex);
//private:
//-----------------------------------------------------------------------
// Summary:
// Get the latest row index from the group specified.
// Parameters:
// pChilds - Children collection.
// Returns:
// Last row index in group.
//-----------------------------------------------------------------------
int GetLastChildRow(CXTPReportRows* pChilds) const;
protected:
CXTPReportRecord* m_pRecord; // Pointer to the associated CXTPReportRecord object.
CXTPReportControl* m_pControl; // Pointer to the parent report control.
int m_nIndex; // Item index.
CRect m_rcRow; // A rectangle where a row is to be drawn.
CRect m_rcCollapse; // A rectangle with coordinates of collapse/expand bitmap.
CXTPReportRow* m_pParentRow; // Pointer to the parent row in the tree.
CXTPReportRows* m_pParentRows; // Pointer to the parent rows in the tree.
int m_nRowLevel; // Row depth level in a tree.
int m_nGroupLevel; // Contains row depth level when row is a group row.
BOOL m_bVisible; // TRUE if this row should be visible, FALSE when row is hidden.
CXTPReportRows* m_pChilds; // A collection of row children.
BOOL m_bExpanded; // TRUE when row is expanded in a tree view, FALSE when row is collapsed.
int m_nPreviewHeight; // Height of the preview item of this row.
int m_nChildIndex; // Index of row inside parent rows.
XTPReportRowType m_nRowType; // Row type from XTPReportRowType
private:
//{{AFX_CODEJOCK_PRIVATE
friend class CXTPReportControl;
friend class CXTPReportSelectedRows;
friend class CXTPReportRows;
friend class CXTPReportRecordItem;
//}}AFX_CODEJOCK_PRIVATE
};
AFX_INLINE void CXTPReportRow::SetIndex(int nNewIndex) {
m_nIndex = nNewIndex;
}
AFX_INLINE CXTPReportRecord* CXTPReportRow::GetRecord() const{
return m_pRecord;
}
AFX_INLINE CXTPReportRow* CXTPReportRow::GetParentRow() const {
return m_pParentRow;
}
AFX_INLINE CXTPReportControl* CXTPReportRow::GetControl() const {
return m_pControl;
}
AFX_INLINE void CXTPReportRow::SetCollapseRect(CRect rcCollapse) {
m_rcCollapse = rcCollapse;
}
AFX_INLINE CRect CXTPReportRow::GetRect() const {
return m_rcRow;
}
AFX_INLINE int CXTPReportRow::GetGroupLevel() const {
return m_nGroupLevel;
}
AFX_INLINE CXTPReportRows* CXTPReportRow::GetParentRows() const {
return m_pParentRows;
}
AFX_INLINE XTPReportRowType CXTPReportRow::GetType() const {
return m_nRowType;
}
#endif //#if !defined(__XTPREPORTROW_H__)