// XTPReportColumn.h: interface for the CXTPReportColumn class.
//
// This file is a part of the XTREME REPORTCONTROL MFC class library.
// (c)1998-2011 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(__XTPREPORTCOLUMN_H__)
#define __XTPREPORTCOLUMN_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include "XTPReportDefines.h"

class CXTPReportGroups;
class CXTPReportRecordItemEditOptions;
class CXTPPropExchange;
class CXTPMarkupContext;
class CXTPMarkupUIElement;

//-----------------------------------------------------------------------
// Summary:
//      This enum defines the best fit mode.
//-----------------------------------------------------------------------
enum XTPReportColumnBestFitMode
{
	xtpColumnBestFitModeVisibleData = 0, // Fit by visible column data.
	xtpColumnBestFitModeAllData     = 1, // Fit by all column data.
};

//===========================================================================
// Summary:
//     Represents report column item with its properties and operations.
// Remarks:
//     You create object of CXTPReportColumn by calling a constructor and
//     provide all necessary parameters. Many of the parameters have default
//     values. Column has 3 properties that greatly influence its behavior:
//
//     bAutoSize - TRUE allows auto resizing of the width of columns when
//                 ReportControl's client area is resized by the user. If
//                 bAutoSize is set to FALSE, the column keeps its initial
//                 size
//
//     bSortable - Allows column to be sortable if it has value TRUE. If
//                 you set it to FALSE, you won't be able to sort records
//                 by their column
//
//     bVisible  - Determines if columns will draw by control or not. For
//                 example, if the column is dragged into FieldChooser,
//                 the column still exists in the columns list, but it
//                 becomes invisible.
// See Also: CXTPReportControl, CXTPReportColumns
//===========================================================================
class _XTP_EXT_CLASS CXTPReportColumn : public CXTPCmdTarget
{
	//{{AFX_CODEJOCK_PRIVATE
	friend class CXTPReportControl;
	friend class CXTPReportColumns;
	friend class CXTPReportHeader;
	friend class CXTPReportRows;
	friend class CXTPReportRow;
	friend class CXTPReportColumnOrder;
	//}}AFX_CODEJOCK_PRIVATE

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPReportColumn object.
	// Parameters:
	//     strName          - Column name.
	//     nItemIndex       - An index of the corresponding record item.
	//     nWidth           - An initial width of the created column.
	//     nMinWidth        - Minimal width of the column.
	//     nIconID          - Number of the corresponding icon in the image list.
	//     bAutoSize        - Is column resizable flag.
	//     bSortable        - Is column sortable flag.
	//     bVisible         - Is column visible flag.
	//     strInternalName  - Internal column name (to serialize colunm options).
	//     strDisplayName   - The display name(caption)of the column.
	// Remarks:
	//     There are 3 parameters that greatly influence a column's behavior:
	//     * <b>bAutoSize</b> TRUE allows auto resizing of width of columns when
	//           the ReportControl's client area is resized by the
	//           user. If bAutoSize is set to FALSE, the column
	//           keeps its initial size
	//     * <b>bSortable</b> Allows the column to be sortable if has value TRUE.
	//           If you set it to FALSE, you won't be able to sort
	//           records by their column
	//     * <b>bVisible</b>  Determines if columns will draw by control or not.
	//           For example if the column is dragged into FieldChooser,
	//           the column still exists in the columns list,
	//           but it becomes invisible.
	// Example:
	// <code>
	// #define COLUMN_ICON 1
	// #define COLUMN_MAIL_ICON 1
	//
	// CXTPReportControl wndReport;
	// wndReport.AddColumn(new CXTPReportColumn(COLUMN_ICON, _T("Message Class"), 18, FALSE, COLUMN_MAIL_ICON));
	// </code>
	//-----------------------------------------------------------------------
	CXTPReportColumn(int nItemIndex, LPCTSTR strName, int nWidth, BOOL bAutoSize = TRUE, int nIconID = XTP_REPORT_NOICON , BOOL bSortable = TRUE, BOOL bVisible = TRUE);
	CXTPReportColumn(int nItemIndex, LPCTSTR strDisplayName, LPCTSTR strInternalName, int nWidth, BOOL bAutoSize = TRUE, int nIconID = XTP_REPORT_NOICON , BOOL bSortable = TRUE, BOOL bVisible = TRUE);
	// <COMBINE CXTPReportColumn::CXTPReportColumn@int@LPCTSTR@int@BOOL@int@BOOL@BOOL>

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPReportColumn object, handles cleanup and deallocation
	//-----------------------------------------------------------------------
	virtual ~CXTPReportColumn();

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns current column header drag mode.
	// Remarks:
	//     ReportColumn may be moved (change order of columns, delete columns from
	//     header, move column to FieldChooser) using drag and drop. When column
	//     is moved, it is in Dragged mode. You use IsDragging() to determine if
	//     columns are in Dragged mode
	// Returns:
	//     TRUE if the column header is in dragging mode, FALSE otherwise.
	// See Also: IsAllowDragging
	//-----------------------------------------------------------------------
	BOOL IsDragging() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the last drawn column rect.
	// Remarks:
	//     Each time when the column is drawing, its rectangle is recalculated
	//     to fit in size after ReportControl resizing, Column resizing
	//     or moving, etc. You use GetRect() to get the latest rectangle sizes.
	// Returns:
	//     The client rectangle where the column was drawn last time.
	//-----------------------------------------------------------------------
	CRect GetRect() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns column width.
	// Remarks:
	//     Each time when the column is drawing, its rectangle is recalculated
	//     to fit in size after ReportControl resizing, Column resizing
	//     or moving, etc. You use GetWidth() to get the latest rectangle width.
	// Returns:
	//     The current column width in logical units.
	//-----------------------------------------------------------------------
	int GetWidth() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Calculates caption length.
	// Parameters:
	//     pDC - Device context to calculate width at.
	// Remarks:
	//     This function calculates caption text length in logical units
	//     using the given device context, current caption font, and string
	//     of text.
	// Returns:
	//     Caption length in pixels.
	//-----------------------------------------------------------------------
	int GetCaptionWidth(CDC* pDC);

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets column width.
	// Parameters:
	//     nNewWidth - New column width in pixels.
	// Remarks:
	//     This member function gives you possibility to change column width
	//     manually. To set initial width or set width for columns which
	//     AutoSize = FALSE.
	// Returns:
	//     Previous column width in pixels.
	//-----------------------------------------------------------------------
	int SetWidth(int nNewWidth);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns column indentation.
	// Returns:
	//     Previous column indentation in pixels.
	//-----------------------------------------------------------------------
	int GetIndent() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the index of the associated record item.
	// Returns:
	//     The index of the associated record item.
	//-----------------------------------------------------------------------
	int GetItemIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the index of the column.
	// Returns:
	//     The index of the column.
	//-----------------------------------------------------------------------
	int GetIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the index of the column among visible ones.
	// Returns:
	//     The visible index of the column.
	//-----------------------------------------------------------------------
	int GetVisibleIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the old index of the column among visible ones.
	// Returns:
	//     An integer value specifying the old visible index of the column.
	//-----------------------------------------------------------------------
	int GetOldVisibleIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the ID of the associated column header icon.
	// Remarks:
	//     Column can have an image that will be drawn on it. You use
	//     GetIconID() to get the current image id which passes to the
	//     column ID of the column. It must match to one of the ids in the
	//     imagelist
	// Returns:
	//     The ID of the associated column header icon.
	//-----------------------------------------------------------------------
	int GetIconID() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets the ID of the associated column header icon.
	// Remarks:
	//     Column can have an image that will be drawn on it. You use
	//     GetIconID() to get the current image id which passes to the
	//     column ID of the column. It must match to one of the ids in the
	//     image list
	// Parameters:
	//     nIconId - The ID of the associated column header icon.
	//-----------------------------------------------------------------------
	void SetIconID(int nIconId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the text caption for the column header.
	// Remarks:
	//     You use GetCaption() to get the current column caption.
	// Returns:
	//     The text caption for the column header.
	//-----------------------------------------------------------------------
	CString GetCaption() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change the column header caption.
	// Parameters:
	//     strCaption - String caption of the column.  Text displayed in the column header.
	//-----------------------------------------------------------------------
	void SetCaption(LPCTSTR strCaption);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change the column footer text.
	// Parameters:
	//     strFooter - String footer of the column.  Text displayed in the column footer.
	// Remarks
	//     Call CXTPReportControl::ShowFooter to show footer area.
	// See Also: GetFooterText, CXTPReportControl::ShowFooter
	//-----------------------------------------------------------------------
	void SetFooterText(LPCTSTR strFooter);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the footer text for the column.
	// Remarks:
	//     Use SetFooterText() to set the current footer text.
	// Returns:
	//     The text caption for the column footer.
	//-----------------------------------------------------------------------
	CString GetFooterText() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change the column footer font.
	// Parameters:
	//     pFont - Pointer to font object. May be NULL.
	// Remarks:
	//     The CXTPReportPaintManager::m_fontCaption is used as default footer
	//     font. If pFont is NULL the default font will be used.
	// See Also:
	//     GetFooterFont
	//-----------------------------------------------------------------------
	void SetFooterFont(CFont* pFont);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the footer font for the column.
	// Remarks:
	//     The CXTPReportPaintManager::m_fontCaption is used as default footer
	//     font.
	// Returns:
	//     The footer font for the column.
	// See Also:
	//     SetFooterFont
	//-----------------------------------------------------------------------
	CFont* GetFooterFont();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change is the right column footer divider
	//     visible.
	// Parameters:
	//     bSet - If TRUE divider is visible, FALSE - invisible.
	// Remarks:
	//     By default divider is visible.
	// See Also:
	//     GetDrawFooterDivider
	//-----------------------------------------------------------------------
	void SetDrawFooterDivider(BOOL bSet);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns is right column footer divider visible.
	// Remarks:
	//     By default divider is visible.
	// Returns:
	//     Is column footer divider visible.
	// See Also:
	//     SetDrawFooterDivider
	//-----------------------------------------------------------------------
	BOOL GetDrawFooterDivider();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change is the right column header divider
	//     visible.
	// Parameters:
	//     bSet - If TRUE divider is visible, FALSE - invisible.
	// Remarks:
	//     By default divider is visible.
	// See Also:
	//     GetDrawHeaderDivider
	//-----------------------------------------------------------------------
	void SetDrawHeaderDivider(BOOL bSet);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns is right column header divider visible.
	// Remarks:
	//     By default divider is visible.
	// Returns:
	//     Is column footer divider visible.
	// See Also:
	//     SetDrawHeaderDivider
	//-----------------------------------------------------------------------
	BOOL GetDrawHeaderDivider();

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the text tool tip for the column header.
	// Returns:
	//     The text tool tip for the column header.
	//-----------------------------------------------------------------------
	CString GetTooltip() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/change the column tool tip.
	// Parameters:
	//     lpszTooltip - Tool tip of the column
	//-----------------------------------------------------------------------
	void SetTooltip(LPCTSTR lpszTooltip);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current column header visibility mode.
	// Returns:
	//     TRUE if the column header is visible, FALSE otherwise.
	// See Also: SetVisible
	//-----------------------------------------------------------------------
	BOOL IsVisible() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets column visible mode (TRUE - visible, FALSE - invisible).
	// Parameters:
	//     bVisible - New column visible state.
	// Remarks:
	//     When you move a column to FieldChooser, it becomes invisible.
	//     To change visibility of column you use SetVisible(BOOL)
	// See Also: IsVisible
	//-----------------------------------------------------------------------
	void SetVisible(BOOL bVisible = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current column header filterability mode.
	// Returns:
	//     TRUE if the column header is filterable FALSE otherwise.
	// See Also: SetFiltrable
	//-----------------------------------------------------------------------
	BOOL IsFiltrable() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if group is highlighted
	// Returns:
	//     TRUE if group is highlighted
	//-----------------------------------------------------------------------
	BOOL IsHotTracking() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets column filterable mode (TRUE - filterable FALSE - not filterable
	// Parameters:
	//     bFiltrable - New column filterable state.
	// Returns:
	//     Previous column filterable state.
	// See Also: IsFiltrable
	//-----------------------------------------------------------------------
	BOOL SetFiltrable(BOOL bFiltrable = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns column allow resizing state.
	// Returns:
	//     TRUE if the column allows resizing, FALSE otherwise.
	// See Also: EnableResize
	//-----------------------------------------------------------------------
	BOOL IsResizable() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Enable/Disables the column's allow resizing mode.
	// Parameters:
	//     bIsResizable - TRUE if column will be resizable, FALSE otherwise.
	// See Also: IsResizable
	//-----------------------------------------------------------------------
	void EnableResize(BOOL bIsResizable);

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets minimal width value for column.
	// Parameters:
	//     nMinWidth - New column minimal width value.
	// Remarks:
	//     After you set the minimal width for the column, it cannot be
	//     resizable to less than minimal width.
	// Returns:
	//     Previous column minimal width value.
	// See Also: GetMinWidth
	//-----------------------------------------------------------------------
	int SetMinWidth(int nMinWidth);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current minimal column width.
	// Returns:
	//     Column minimal width value in pixels.
	// See Also: SetMinWidth
	//-----------------------------------------------------------------------
	int GetMinWidth() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets maximal width value for column.
	// Parameters:
	//     nMaxWidth - New column maximal width value.
	// Remarks:
	//     After you set the maximal width for the column, it cannot be
	//     resizable to more than maximal width.
	// Returns:
	//     Previous column maximal width value.
	// See Also: GetMaxWidth
	//-----------------------------------------------------------------------
	int SetMaxWidth(int nMaxWidth);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current maximal column width.
	// Returns:
	//     Column maximal width value in pixels.
	// See Also: SetMaxWidth
	//-----------------------------------------------------------------------
	int GetMaxWidth() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the column sortable flag.
	// Returns:
	//     TRUE if column is sortable, FALSE otherwise.
	// See Also: IsSorted, IsSortedIncreasing, IsSortedDecreasing
	//-----------------------------------------------------------------------
	BOOL IsSortable() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the column can be grouped.
	// Remarks:
	//     Not all columns allow for grouping. You use IsGroupable
	//     to determine if the column can be grouped.  I.e. Added
	//     to the "Group By" box.
	// Returns:
	//     TRUE if the column can be grouped, FALSE otherwise.
	//-----------------------------------------------------------------------
	BOOL IsGroupable() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this member to determine if the column has Expand / Collapse
	//     right icon (+/-).
	// Returns:
	//     TRUE if the column has +- right icon, FLASE else.
	// See also:
	//     m_bPlusMinus and SetPlusMinus(...)
	//-----------------------------------------------------------------------
	BOOL IsPlusMinus() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this member to see whether the column is expanded or not.
	// Returns:
	//     TRUE if the column is expanded and FALSE else.
	// See also:
	//     m_bExpanded and SetExpanded(...)
	//-----------------------------------------------------------------------
	BOOL IsExpanded() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the number next visual column.
	// Returns:
	//     An integer specifying the zero based index of the column.
	// See also:
	//     m_nNextVisualBlock and SetNextVisualBlock(...)
	//-----------------------------------------------------------------------
	int GetNextVisualBlock() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Determine is this column sortable when grouped by.
	// Remarks:
	//     TRUE by default. If FALSE - records will be grouped without sorting
	//     by this column (sort by other columns will be applied).
	// Returns:
	//     TRUE if the column is sortable when grouped by, FALSE otherwise.
	//-----------------------------------------------------------------------
	BOOL IsAutoSortWhenGrouped() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the column dragging allowance flag.
	// Returns:
	//     TRUE if the column can be dragged, FALSE otherwise.
	// See Also: IsDragging
	//-----------------------------------------------------------------------
	BOOL IsAllowDragging() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if the column is sorted in the increasing order.
	// Returns:
	//     TRUE if the column is sorted in increasing order, FALSE otherwise.
	// See Also: IsSorted, IsSortable, IsSortedDecreasing
	//-----------------------------------------------------------------------
	BOOL IsSortedIncreasing() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if the column is sorted in the decreasing order.
	// Returns:
	//     TRUE if the column is sorted in decreasing order, FALSE otherwise.
	// See Also: IsSorted, IsSortable, IsSortedIncreasing
	//-----------------------------------------------------------------------
	BOOL IsSortedDecreasing() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify that the column is sorted in the increasing order.
	// Parameters:
	//     bSortIncreasing - TRUE if the column should be sorted in increasing
	//                       order, FALSE otherwise.
	// See Also: IsSorted, IsSortable, IsSortedIncreasing, IsSortedDecreasing
	//-----------------------------------------------------------------------
	void SetSortIncreasing(BOOL bSortIncreasing);

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if the column is sorted.
	// Returns:
	//     TRUE if the column is sorted, FALSE otherwise.
	// Remarks:
	//     If the records list is sorted by given column IsSorted() returns
	//     TRUE, otherwise - FALSE
	// See Also: IsSortable, IsSortedIncreasing, IsSortedDecreasing
	//-----------------------------------------------------------------------
	BOOL IsSorted() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Makes/unmakes the current column as containing a tree inside.
	// Parameters:
	//     bIsTreeColumn - TRUE if this column contains tree items
	//                     (collapse/expand buttons) drawn inside,
	//                     FALSE otherwise.
	// See Also: IsTreeColumn
	//-----------------------------------------------------------------------
	void SetTreeColumn(BOOL bIsTreeColumn);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns TRUE if the current column contains tree.
	// Returns:
	//     TRUE if the current column contains tree items, FALSE otherwise.
	// See Also: SetTreeColumn
	//-----------------------------------------------------------------------
	BOOL IsTreeColumn() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes column data to/from the provided archive stream.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	virtual void DoPropExchange(CXTPPropExchange* pPX);

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets new Alignment value for column.
	// Parameters:
	//     nAlignment - New alignment value.
	//                  Possible alignment values: DT_LEFT, DT_CENTER, DT_RIGHT and DT_WORDBREAK.
	//                  See also DrawText() Format Flags.
	// Returns:
	//     Previous alignment column value.
	//-----------------------------------------------------------------------
	int SetAlignment(int nAlignment);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current alignment value for the column.
	// Returns:
	//     Current column alignment value.
	//     The result is one of the following: DT_LEFT, DT_CENTER, DT_RIGHT.
	//-----------------------------------------------------------------------
	int GetAlignment() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets new Alignment for column text.
	// Parameters:
	//     nAlignment - New alignment value.
	//                  Possible alignment values: DT_LEFT, DT_CENTER, DT_RIGHT and DT_WORDBREAK.
	//                  See also DrawText() Format Flags.
	//-----------------------------------------------------------------------
	void SetHeaderAlignment(int nAlignment);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current alignment for the column text.
	// Returns:
	//     Current column alignment value.
	//     The result is one of the following: DT_LEFT, DT_CENTER, DT_RIGHT.
	//-----------------------------------------------------------------------
	int GetHeaderAlignment() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets new Alignment for column footer.
	// Parameters:
	//     nAlignment - New alignment value.
	//                  Possible alignment values: DT_LEFT, DT_CENTER, DT_RIGHT and DT_WORDBREAK.
	//                  See also DrawText() Format Flags.
	//-----------------------------------------------------------------------
	void SetFooterAlignment(int nAlignment);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the current alignment value for the column footer.
	// Returns:
	//     Current column alignment value.
	//     The result is one of the following: DT_LEFT, DT_CENTER, DT_RIGHT.
	//-----------------------------------------------------------------------
	int GetFooterAlignment() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Checks if the column header should have the sort triangle drawn.
	// Returns:
	//     TRUE if the sort triangle should be drawn for this column,
	//     FALSE otherwise.
	//-----------------------------------------------------------------------
	BOOL HasSortTriangle() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to get the column auto size flag .
	// Returns:
	//     TRUE if the column is automatically sized.
	//-----------------------------------------------------------------------
	BOOL IsAutoSize() const;

	// Summary:
	//     Call this method to set the column auto sized.
	//Missing MFC function (presented in ActiveX version)
	// Parameters:
	//  bSet - BOOL flag
	//-----------------------------------------------------------------------
	void SetAutoSize(BOOL bSet);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the column can be sorted when
	//     the user clicks on the column header.
	// Parameters:
	//     bSortable - If TRUE, records can be sorted by this column by
	//                 clicking on the column header.  Each time the
	//                 column header is clicked the sort order will
	//                 toggle between ascending and descending.  by
	//                 default, bSortable is TRUE.
	//                 If FALSE, records can not be sorted by this column
	//                 by clicking on the column header.  The column can
	//                 still be sorted, but not by clicking on the column
	//                 header.  If you would like to sort the column when
	//                 bSortable is FALSE, then you can add the column to
	//                 the ReportControl's SortOrder, this will allow you
	//                 to keep a column sorted at all times.
	// See Also: SetGroupable
	//-----------------------------------------------------------------------
	void SetSortable(BOOL bSortable);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the column sortable when grouped by.
	// Parameters:
	//     bAutoSortWhenGrouped - Used to enable or disable Auto sorting for
	//                            grouped column.
	// Remarks:
	//     TRUE by default. If FALSE - records will be grouped without sorting
	//     by this column (sort by other columns will be applied).
	//-----------------------------------------------------------------------
	void SetAutoSortWhenGrouped(BOOL bAutoSortWhenGrouped);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the column can be grouped.
	// Parameters:
	//     bGroupable - If TRUE, the column can be added to the "Group By"
	//                  box and the contents of the ReportControl will be
	//                  grouped by the column.
	//                  If FALSE, the column can't be added to the "Group By" box.
	// See Also: SetSortable
	//-----------------------------------------------------------------------
	void SetGroupable(BOOL bGroupable);

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this function to set the column Expand / Collapse right icon (+/-)
	//     enabled or disabled.
	// Parameter:
	//     bPlusMinus - TRUE if the column should have +- right icon, FLASE else.
	// See also:
	//     m_bPlusMinus and IsPlusMinus(...)
	//-----------------------------------------------------------------------
	void SetPlusMinus(BOOL bPlusMinus);

	//-----------------------------------------------------------------------
	// Summary:
	//     Use this member to set the column's (+/-) icon to expanded state
	//     or not.
	// Parameter:
	//     bExpanded - TRUE if the column's (+/-) icon is to be expanded and
	//     FALSE else.
	// See also:
	//     m_bExpanded and IsExpanded(...)
	//-----------------------------------------------------------------------
	void SetExpanded(BOOL bExpanded);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the number next visual column.
	// Paramter:
	//     nNextVisualBlock - An integer specifying the zero based index of the column.
	// See also:
	//     m_nNextVisualBlock and GetNextVisualBlock(...)
	//-----------------------------------------------------------------------
	void SetNextVisualBlock(int nNextVisualBlock);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the column can be dragged.
	// Parameters:
	//     bAllowDrag - If TRUE, the column can be dragged with the mouse.
	//                  If FALSE, the dragging for this column is prohibited.
	// See Also: SetSortable, SetGroupable
	//-----------------------------------------------------------------------
	void SetAllowDrag(BOOL bAllowDrag);

	//-----------------------------------------------------------------------
	// Summary:
	//     Retrieves columns array
	// Returns:
	//     CXTPReportColumns object
	//-----------------------------------------------------------------------
	CXTPReportColumns* GetColumns() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Retrieved parent report control
	// Returns:
	//     Parent report control
	// See Also: GetColumns
	//-----------------------------------------------------------------------
	CXTPReportControl* GetControl() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the column header will appear in
	//     the field chooser when hidden or in the GroupBy Box.
	// Returns:
	//     TRUE is if the column header will be displayed in the field chooser when
	//     the column is hidden or in the GroupBy Box, FALSE if it will not.
	// See Also: SetShowInFieldChooser
	//-----------------------------------------------------------------------
	BOOL IsShowInFieldChooser() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the column will appear in
	//     the FieldChooser when the column is hidden or in the "Group By Box."
	// Parameters:
	//     bShow - TRUE is the column should be displayed in the field chooser
	//             when hidden, FALSE otherwise.
	// Remarks:
	//     When a column is hidden or added to the "Group By Box" it will be
	//     automatically added to the FieldChooser unless the ShowInFieldChooser
	//     property is set to FALSE.
	//     If you would like to have a hidden column that the user can not access
	//     and you enable the FieldChooser, then you will need to set the
	//     ShowInFieldChooser property to FALSE.  By default this property is TRUE.
	// See Also: IsShowInFieldChooser
	//-----------------------------------------------------------------------
	void SetShowInFieldChooser(BOOL bShow);

	//-----------------------------------------------------------------------
	// Summary:
	//     Retrieves CXTPReportRecordItemEditOptions.
	// Returns:
	//     Edit Options of column
	//-----------------------------------------------------------------------
	CXTPReportRecordItemEditOptions* GetEditOptions() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if an edit box is added for the items
	//     in the column.
	// Returns:
	//     TRUE is the items in the column are editable, FALSE if the items
	//     can not be edited.
	// See Also: SetEditable
	//-----------------------------------------------------------------------
	BOOL IsEditable() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether the CXTPReportRecordItem(s)
	//     in the column can be edited.  This will add an edit box to edit the item
	//     when the item is click/double-clicked.  This can be overridden for individual
	//     items if the CXTPReportRecordItem::SetEditable member is called.
	// Parameters:
	//     bEditable - TRUE is the items in the column are editable (an
	//                 edit box is added to edit the contents of the item).
	// See Also: IsEditable
	//-----------------------------------------------------------------------
	void SetEditable(BOOL bEditable = TRUE);

	//-----------------------------------------------------------------------
	// 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: CXTPReportHeader::AllowColumnRemove
	//-----------------------------------------------------------------------
	void AllowRemove(BOOL bAllow);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if column removing allowed.
	// Returns:
	//     TRUE is the items in the column removing allowed, FALSE otherwise.
	// See Also: AllowRemove
	//-----------------------------------------------------------------------
	BOOL IsAllowRemove() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns column print width.
	// Parameters:
	//  nTotalWidth - Total width in pixels.
	// Returns:
	//     The current column width in logical units for print mode.
	//-----------------------------------------------------------------------
	int GetPrintWidth(int nTotalWidth) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns internal column name which used in serialization to unique
	//     identify column rather than column index.
	// Returns:
	//     Internal column name string.
	//-----------------------------------------------------------------------
	const CString& GetInternalName() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Sets internal column name which used in serialization to unique
	//     identify column rather than column index.
	// Parameters:
	//     pcszName - LPCTSTR unique name
	//-----------------------------------------------------------------------
	void SetInternalName(LPCTSTR pcszName);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if vertical grid to be shown for header rows.
	// Returns:
	//     TRUE is vertical grid will be shown, FALSE otherwise.
	// See Also: SetDrawHeaderRowsVGrid
	//-----------------------------------------------------------------------
	BOOL GetDrawHeaderRowsVGrid() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if vertical grid to be shown for footer rows.
	// Returns:
	//     TRUE is vertical grid will be shown, FALSE otherwise.
	// See Also: SetDrawFooterRowsVGrid
	//-----------------------------------------------------------------------
	BOOL GetDrawFooterRowsVGrid() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether to show vertical grid for header rows.
	// Parameters:
	//     bDrawVGrid - TRUE to show vertical grid for header rows.
	// See Also: GetDrawHeaderRowsVGrid
	//-----------------------------------------------------------------------
	void SetDrawHeaderRowsVGrid(BOOL bDrawVGrid = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify whether to show vertical grid for footer rows.
	// Parameters:
	//     bDrawVGrid - TRUE to show vertical grid for footer rows.
	// See Also: GetDrawFooterRowsVGrid
	//-----------------------------------------------------------------------
	void SetDrawFooterRowsVGrid(BOOL bDrawVGrid = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to force this column to be visible.  This will cause
	//     the report control to scroll to this column.
	//-----------------------------------------------------------------------
	virtual void EnsureVisible();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine the column best fit mode.
	// Returns:
	//     nBestFitMode - the column best fit mode.
	// See Also: SetBestFitMode
	//-----------------------------------------------------------------------
	int GetBestFitMode() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to specify the column best fit mode.
	// Parameters:
	//     nMode - the column best fit mode.
	// See Also: GetBestFitMode
	//-----------------------------------------------------------------------
	void SetBestFitMode(int nMode);

//private:
	//{{AFX_CODEJOCK_PRIVATE
	int GetNormAlignment(int nAlignment) const;
	int GetBestFitWidth();
	//}}AFX_CODEJOCK_PRIVATE

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get markup UI element object.
	// Returns:
	//     pointer to CXTPMarkupUIElement
	//-----------------------------------------------------------------------
	CXTPMarkupUIElement* GetMarkupUIElement();

private:
	void _initData(int nItemIndex, LPCTSTR strDisplayName, LPCTSTR strInternalName, int nWidth, BOOL bAutoSize, int nIconID, BOOL bSortable, BOOL bVisible);

protected:
	CString m_strInternalName;          // Internal column name (to serialize colunm options).
	CString m_strName;                  // Column name.
	CString m_strTooltip;               // Column tooltip.
	int m_nItemIndex;                   // Column index.

	CString m_strFooterText;            // Column Footer Text.
	CFont   m_fontFooter;               // Column Footer font. If Font handle is NULL - the default font is used.
	BOOL    m_bDrawFooterDivider;       // If TRUE - draw footer column right divider.
	BOOL    m_bDrawHeaderDivider;       // If TRUE - draw header column right divider.

	BOOL m_bSortIncreasing;             // Stores column sort direction (used when m_bSortable is TRUE).
	BOOL m_bSortable;                   // Determines if the column could be sortable by.
	BOOL m_bGroupable;                  // Determines if the column could be grouped by.
	BOOL m_bAutoSortWhenGrouped;        // If TRUE this column will be sortable when grouped by, otherwise it will grouped without sorting by it (sort by  other columns wiil be applied).

	BOOL m_bPlusMinus;
	// Determines if the column have Expand / Collapse right icon (+/-).
	//See IsPlusMinus() and SetPlusMinus()

	BOOL m_bExpanded;
	// State of PlusMinus column

	int m_nNextVisualBlock;
	// Number of next visual columns to show or hide
	//see SetNextVisualBlock(...) and GetNextVisualBlock()

	BOOL m_bAllowDrag;                  // Allow/disallow dragging of the column
	BOOL m_bAllowRemove;                // TRUE to allow column remove

	CXTPReportColumns* m_pColumns;      // Stores a pointer to the parent columns collection.

	int m_nIconID;                      // Associated icon ID.
	BOOL m_bVisible;                    // Visible state.
	int m_nOldVisibleIndex;             // Visible index before Hide state.
	// Release 13.1

	BOOL m_bFiltrable;                  // Is filtering by this column allowed?.

	BOOL m_bIsResizable;                // Indicates if the column allows width resizing
	CRect m_rcColumn;                   // Saves rectangle where column was drawn last time.
	CRect m_rcGroupBy;                  // Saves rectangle where column was drawn in group box.
	int m_nMinWidth;                    // Minimal column width. It is not allowed to do it less then minimal.
	int m_nMaxWidth;                    // Maximal column width (if set as positive). It is not allowed to do it more then maximal.
	int m_nMaxItemWidth;                // Contains maximal width of the corresponding item drawn in the column.
	int m_nAlignment;                   // Alignment mode for column: DT_LEFT || DT_RIGHT || DT_CENTER

	int m_nHeaderAlignment;             // Alignment mode for column text: DT_LEFT || DT_RIGHT || DT_CENTER
	int m_nFooterAlignment;             // Alignment mode for column footer text: DT_LEFT || DT_RIGHT || DT_CENTER

	int m_nColumnAutoWidth;             // The column automatic width
	int m_nColumnStaticWidth;           // The user defined with.
	BOOL m_bAutoSize;                   // TRUE if column auto sized.

	BOOL m_bShowInFieldChooser;         // Indicates if column is shown in the field chooser when the column is hidden or in the GroupBy Box.
	BOOL m_bEditable;                   // Indicates whether an edit box should be added to the items in the column.
	BOOL m_bDrawHeaderRowsVGrid;        // Indicates whether to draw vertical grid for headers rows.
	BOOL m_bDrawFooterRowsVGrid;        // Indicates whether to draw vertical grid for footers rows.
	int m_nBestFitMode;                 // Best fit mode. See enum XTPReportColumnBestFitMode

	CXTPReportRecordItemEditOptions* m_pEditOptions;    // Edit options of the column
	CXTPMarkupUIElement* m_pMarkupUIElement;            // Store Markup Object

};

AFX_INLINE CString CXTPReportColumn::GetCaption() const
{
	return m_strName;
}

AFX_INLINE int CXTPReportColumn::GetIconID() const
{
	return m_nIconID;
}

AFX_INLINE void CXTPReportColumn::SetIconID(int nIconId)
{
	m_nIconID = nIconId;
}

AFX_INLINE BOOL CXTPReportColumn::IsFiltrable() const
{
	return m_bFiltrable;
}

AFX_INLINE BOOL CXTPReportColumn::IsResizable() const
{
	return m_bIsResizable;
}

AFX_INLINE void CXTPReportColumn::EnableResize(BOOL bIsResizable)
{
	m_bIsResizable = bIsResizable;
}

AFX_INLINE BOOL CXTPReportColumn::IsSortable() const
{
	return m_bSortable;
}

AFX_INLINE BOOL CXTPReportColumn::IsGroupable() const
{
	return m_bGroupable;
}

AFX_INLINE BOOL CXTPReportColumn::IsPlusMinus() const
{
	return m_bPlusMinus;
}

AFX_INLINE BOOL CXTPReportColumn::IsExpanded() const
{
	return m_bExpanded;
}

AFX_INLINE int CXTPReportColumn::GetNextVisualBlock() const
{
	return m_nNextVisualBlock;
}

AFX_INLINE BOOL CXTPReportColumn::IsAutoSortWhenGrouped() const
{
	return m_bAutoSortWhenGrouped;
}

AFX_INLINE BOOL CXTPReportColumn::IsAllowDragging() const
{
	return m_bAllowDrag;
}

AFX_INLINE BOOL CXTPReportColumn::IsAutoSize() const
{
	return m_bAutoSize;
}

AFX_INLINE void CXTPReportColumn::SetAutoSize(BOOL bSet)
{
	m_bAutoSize = bSet;
}

AFX_INLINE void CXTPReportColumn::SetSortable(BOOL bSortable)
{
	m_bSortable = bSortable;
}

AFX_INLINE void CXTPReportColumn::SetGroupable(BOOL bGroupable)
{
	m_bGroupable = bGroupable;
}

AFX_INLINE void CXTPReportColumn::SetAutoSortWhenGrouped(BOOL bAutoSortWhenGrouped)
{
	m_bAutoSortWhenGrouped = bAutoSortWhenGrouped;
}

AFX_INLINE void CXTPReportColumn::SetSortIncreasing(BOOL bSortIncreasing)
{
	m_bSortIncreasing = bSortIncreasing;
}

AFX_INLINE CXTPReportRecordItemEditOptions* CXTPReportColumn::GetEditOptions() const
{
	return m_pEditOptions;
}

AFX_INLINE BOOL CXTPReportColumn::IsEditable() const
{
	return m_bEditable;
}

AFX_INLINE void CXTPReportColumn::SetEditable(BOOL bEditable /*= TRUE*/)
{
	m_bEditable = bEditable;
}

AFX_INLINE void CXTPReportColumn::AllowRemove(BOOL bAllow)
{
	m_bAllowRemove = bAllow;
}

AFX_INLINE BOOL CXTPReportColumn::IsAllowRemove() const
{
	return m_bAllowRemove;
}

AFX_INLINE CString CXTPReportColumn::GetTooltip() const
{
	return m_strTooltip;
}

AFX_INLINE void CXTPReportColumn::SetTooltip(LPCTSTR lpszTooltip)
{
	m_strTooltip = lpszTooltip;
}

AFX_INLINE CString CXTPReportColumn::GetFooterText() const
{
	return m_strFooterText;
}

AFX_INLINE void CXTPReportColumn::SetHeaderAlignment(int nAlignment)
{
	m_nHeaderAlignment = nAlignment;
}

AFX_INLINE BOOL CXTPReportColumn::GetDrawFooterDivider()
{
	return m_bDrawFooterDivider;
}

AFX_INLINE BOOL CXTPReportColumn::GetDrawHeaderDivider()
{
	return m_bDrawHeaderDivider;
}

AFX_INLINE const CString& CXTPReportColumn::GetInternalName() const
{
	return m_strInternalName;
}

AFX_INLINE void CXTPReportColumn::SetInternalName(LPCTSTR pcszName)
{
	m_strInternalName = pcszName;
}

AFX_INLINE BOOL CXTPReportColumn::GetDrawHeaderRowsVGrid() const
{
	return m_bDrawHeaderRowsVGrid;
}

AFX_INLINE void CXTPReportColumn::SetDrawHeaderRowsVGrid(BOOL bDrawVGrid)
{
	m_bDrawHeaderRowsVGrid = bDrawVGrid;
}

AFX_INLINE BOOL CXTPReportColumn::GetDrawFooterRowsVGrid() const
{
	return m_bDrawFooterRowsVGrid;
}

AFX_INLINE void CXTPReportColumn::SetDrawFooterRowsVGrid(BOOL bDrawVGrid)
{
	m_bDrawFooterRowsVGrid = bDrawVGrid;
}

AFX_INLINE int CXTPReportColumn::GetBestFitMode() const
{
	return m_nBestFitMode;
}

AFX_INLINE void CXTPReportColumn::SetBestFitMode(int nMode)
{
	m_nBestFitMode = nMode;
}

AFX_INLINE CXTPMarkupUIElement* CXTPReportColumn::GetMarkupUIElement()
{
	return m_pMarkupUIElement;
}
#endif //#if !defined(__XTPREPORTCOLUMN_H__)
