// XTPControl.h : interface for the CXTPControl class.
//
// This file is a part of the XTREME COMMANDBARS 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(__XTPCONTROL_H__)
#define __XTPCONTROL_H__
//}}AFX_CODEJOCK_PRIVATE

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

#include "Common/XTPSystemHelpers.h"
#include "XTPCommandBarsDefines.h"

class CXTPControl;
class CXTPControls;
class CXTPCommandBar;
class CXTPImageManager;
class CXTPImageManagerIcon;
class CXTPPaintManager;
class CXTPPropExchange;
class CXTPRibbonGroup;
class CXTPCommandBarList;
class CXTPCommandBars;
struct XTP_COMMANDBARS_PROPEXCHANGE_PARAM;

class CXTPControlActions;

//===========================================================================
// Summary:
//     CXTPControlAction is a CCmdTarget derived class. It represents the single action of controls.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlAction : public CXTPCmdTarget
{
	DECLARE_DYNAMIC(CXTPControlAction)
protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlAction object
	// Parameters:
	//     pActions - Owner actions collection.
	//-----------------------------------------------------------------------
	CXTPControlAction(CXTPControlActions* pActions);

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the caption of the action.
	// Parameters:
	//     lpszCaption - Caption to be set.
	//     nIDCaption - Caption resource identifier.
	// See Also: SetPrompt, SetDescription, SetTooltip
	//-----------------------------------------------------------------------
	void SetCaption(LPCTSTR lpszCaption);
	void SetCaption(UINT nIDCaption);// <combine CXTPControl::SetCaption@LPCTSTR>

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's identifier.
	// Returns:
	//     The identifier of the control.
	//-----------------------------------------------------------------------
	int GetID() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's caption.
	// Returns:
	//     The caption of the control.
	//-----------------------------------------------------------------------
	CString GetCaption() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the description of the action.
	// Parameters:
	//     lpszDescription - Description to be set.
	// See Also: SetCaption, SetPrompt, SetTooltip
	//-----------------------------------------------------------------------
	void SetDescription(LPCTSTR lpszDescription);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to load a string from a STRINGTABLE resource
	//     to set the tooltip and description of a action.
	// Parameters:
	//     lpszPrompt -  String from resource file that contains the
	//                  tooltip and description of the item.  The Caption
	//                  will be set to use the tooltip text.  The tooltip
	//                  and description must be separated by "\n" if both
	//                  are included.  You can omit the description and
	//                  both the tooltip and description will be set to
	//                  the same value.
	// Remarks:
	//     Resource strings are in the format "Description\nToolTip".
	//
	//     Note: The caption is set to the value of the tooltip when this
	//           member is called.
	// See Also: SetCaption, SetDescription, SetTooltip
	//----------------------------------------------------------------------
	void SetPrompt(LPCTSTR lpszPrompt);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's description.
	// Returns:
	//     The description of the control.
	//-----------------------------------------------------------------------
	CString GetDescription() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the action icon's identifier.
	// Parameters:
	//     nId - Icon's identifier to be set.
	//-----------------------------------------------------------------------
	void SetIconId(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the icon's identifier.
	// Returns:
	//     An icon's identifier of the action.
	//-----------------------------------------------------------------------
	int GetIconId() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the action help identifier.
	// Parameters:
	//     nId - Help identifier to be set.
	//-----------------------------------------------------------------------
	void SetHelpId(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the help identifier.
	// Returns:
	//     Help identifier of the action.
	//-----------------------------------------------------------------------
	int GetHelpId() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to enable or disable the action.
	// Parameters:
	//     bEnabled - TRUE if the action is enabled.
	// See Also: GetEnabled, SetChecked
	//-----------------------------------------------------------------------
	void SetEnabled(BOOL bEnabled);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the action.
	// Returns:
	//     TRUE if the action is enabled; otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL GetEnabled() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to check the action.
	// Parameters:
	//     bChecked - TRUE if the action is checked.
	// See Also: GetChecked, SetEnabled
	//-----------------------------------------------------------------------
	void SetChecked(BOOL bChecked);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the action.
	// Returns:
	//     TRUE if the action is checked; otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL GetChecked() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the action is visible.
	// Returns:
	//     TRUE if the action is visible.
	//-----------------------------------------------------------------------
	BOOL IsVisible() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to change the state of the action.
	// Parameters:
	//     bVisible - TRUE if the action is visible.
	//-----------------------------------------------------------------------
	void SetVisible(BOOL bVisible);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method sets the 32-bit value associated with the action
	// Parameters:
	//     dwTag - Contains the new value to associate with the action.
	//-----------------------------------------------------------------------
	void SetTag(DWORD_PTR dwTag);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method retrieves the application-supplied 32-bit value
	//     associated with the action.
	// Returns:
	//     The 32-bit value associated with the action.
	//-----------------------------------------------------------------------
	DWORD_PTR GetTag() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to set the category of the action.
	// Parameters:
	//     lpszCategory - Category of the action.
	//----------------------------------------------------------------------
	void SetCategory(LPCTSTR lpszCategory);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the category of the action.
	// Returns:
	//     Category of the action.
	//----------------------------------------------------------------------
	CString GetCategory() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the tooltip of the action.
	// Parameters:
	//     lpszTooltip - Tooltip to be set.
	// See Also: SetCaption, SetDescription, SetPrompt
	//-----------------------------------------------------------------------
	void SetTooltip(LPCTSTR lpszTooltip);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's tooltip.
	// Returns:
	//     Tooltip of the control.
	//-----------------------------------------------------------------------
	CString GetTooltip() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the shortcut string to the action.
	// Parameters:
	//     lpszShortcutText - Shortcut to be set.
	//-----------------------------------------------------------------------
	void SetShortcutText(LPCTSTR lpszShortcutText);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's shortcut.
	// Returns:
	//     The shortcut of the control.
	//-----------------------------------------------------------------------
	CString GetShortcutText() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the keyboard tip to the action.
	// Parameters:
	//     lpszKeyboardTip - Keyboard tip to be set.
	//-----------------------------------------------------------------------
	void SetKeyboardTip(LPCTSTR lpszKeyboardTip);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the action's keyboard tip.
	// Returns:
	//     The  keyboard tip of the control.
	//-----------------------------------------------------------------------
	CString GetKeyboardTip() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set grayed-out text displayed in the edit and combo controls
	//     that displayed a helpful description of what the control is used for.
	// Parameters:
	//     lpszEditHint - Edit hint to be set
	//-----------------------------------------------------------------------
	void SetEditHint(LPCTSTR lpszEditHint);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get grayed-out text displayed in the edit and combo controls
	//     that displayed a helpful description of what the control is used for.
	// Returns:
	//     Edit hint of the control
	//-----------------------------------------------------------------------
	CString GetEditHint() const;

	//-----------------------------------------------------------------------
	// Input:   lpszKey - "String" version of the Id to be given to a command
	//                    in the CommandBars Designer
	// Summary: "String" version of the Id given to a command in the
	//          CommandBars Designer. (For use with CommandBars designed in
	//          the CommandBars Designer Studio)
	// Remarks: The key is the "string" version of the Id given to a command
	//          in the CommandBars Designer.  "String" version refers to the
	//          fact that a named constant is created in the designer, for
	//          example ID_FILE_NEW, can also be referenced buy the actual
	//          string "ID_FILE_NEW" which is stored in the key property.
	//          Use GetKey to retreive this key.
	//
	//          This can be useful for developers who have older
	//          applications that referenced controls by name rather than
	//          by an Id.
	//
	//          Steps needed to use the key:
	//
	//          1. In the Designer add all actions you need to the
	//             ActionLibrary pane ( and Save them).
	//
	//          Note:  The Actions Pane is a way to save and "Re-use" commands.  Always add controls to this library first so they can be re-used in other xcb or xml files.
	//          2. Now you need to drag the actions from the ActionLibrary
	//             pane to the Controls pane and then from the Controls pane
	//             to the Toolbars and Menus.
	//          3. In your code use GetKey property instead of the GetId.
	//
	// See Also: GetKey, m_strKey
	//-----------------------------------------------------------------------
	void SetKey(LPCTSTR lpszKey);

	//-----------------------------------------------------------------------
	// Summary: Gets the "string" version of the Id given to a command in the
	//          CommandBars Designer. (For use with CommandBars designed in
	//          the CommandBars Designer Studio)
	// Remarks: The key is the "string" version of the Id given to a command
	//          in the CommandBars Designer.  "String" version refers to the
	//          fact that a named constant is created in the designer, for
	//          example ID_FILE_NEW, can also be referenced buy the actual
	//          string "ID_FILE_NEW" which is stored in the key property.
	//          Use GetKey to retreive this key.
	//
	//          This can be useful for developers who have older
	//          applications that referenced controls by name rather than
	//          by an Id.
	//
	//          Steps needed to use the key:
	//
	//          1. In the Designer add all actions you need to the
	//             ActionLibrary pane ( and Save them).
	//
	//          Note:  The Actions Pane is a way to save and "Re-use" commands.  Always add controls to this library first so they can be re-used in other xcb or xml files.
	//          2. Now you need to drag the actions from the ActionLibrary
	//             pane to the Controls pane and then from the Controls pane
	//             to the Toolbars and Menus.
	//          3. In your code use GetKey property instead of the GetId.
	//
	// Returns: The "string" version of the Id given to a command in the
	//          CommandBars Designer.
	// See Also: SetKey
	//-----------------------------------------------------------------------
	CString GetKey() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get pointer to owner CommandBars
	// Returns:
	//     The pointer to CXTPCommandBars object
	//-----------------------------------------------------------------------
	CXTPCommandBars* GetCommandBars() const;

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get control associated with action
	// Parameters:
	//     nIndex - Index of control to retrieve
	// Returns:
	//     The pointer to CXTPCommandBars object
	//-----------------------------------------------------------------------
	CXTPControl* GetControl(int nIndex) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get number of controls associated with the action
	// Returns:
	//     Total number of controls associated with action
	//-----------------------------------------------------------------------
	int GetCount() const;

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to redraw all controls associated with actions
	//-----------------------------------------------------------------------
	void RedrawControls();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to reposition all controls associated with actions
	//-----------------------------------------------------------------------
	void RepositionControls();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes this object from or to an archive.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	void DoPropExchange(CXTPPropExchange* pPX);

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when new control attached to the Action
	// Parameters:
	//     pControl - Control to be attached
	// See Also: RemoveControl
	//-----------------------------------------------------------------------
	void AddControl(CXTPControl* pControl);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to remove control from actions list
	// Parameters:
	//     pControl - Control to be removed
	// See Also: AddControl
	//-----------------------------------------------------------------------
	void RemoveControl(CXTPControl* pControl);

	//-------------------------------------------------------------------------
	// Summary:
	//     This method called before action removed
	//-------------------------------------------------------------------------
	void OnRemoved();

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when property of action was changed
	// Parameters:
	//     nProperty - Property identifier
	// See Also: OnChanging
	//-----------------------------------------------------------------------
	void OnChanged(int nProperty);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when property of action is about to be changed
	// Parameters:
	//     nProperty - Property identifier
	// See Also:OnChanged
	//-----------------------------------------------------------------------
	void OnChanging(int nProperty);



public:
	CCmdTarget* m_pTarget;          // Parameter of action

protected:
	DWORD_PTR m_nTag;               // Action tag.
	int m_nId;                      // Identifier of the action.
	int m_nIconId;                  // Identifier of the action's image.
	int m_nHelpId;                  // Help identifier
	BOOL m_bEnabled;                // TRUE if the action is enabled.
	BOOL m_bChecked;                // TRUE if the action is checked.
	BOOL m_bVisible;                // TRUE if action is visible
	CString m_strCaption;           // Caption of the action.
	CString m_strTooltipText;       // Tooltip text.
	CString m_strDescriptionText;   // Description text.
	CString m_strCategory;          // Category of the action.
	CString m_strShortcutText;      // Shortcut text
	CString m_strEditHint;          // Edit Hint for Combo and Edit Controls
	CString m_strKeyboardTip;       // Keyboard tip
	CString m_strKey;               // Key

	CArray<CXTPControl*, CXTPControl*> m_arrControls;   // Associated controls
	CXTPControlActions* m_pActions; // Parent actions object

private:
	friend class CXTPControl;
	friend class CXTPControls;
	friend class CXTPControlActions;
};


AFX_INLINE void CXTPControlAction::SetShortcutText(LPCTSTR lpszShortcutText) {
	m_strShortcutText = lpszShortcutText;
}
AFX_INLINE CString CXTPControlAction::GetShortcutText() const {
	return m_strShortcutText;
}
AFX_INLINE void CXTPControlAction::SetDescription(LPCTSTR lpszDescription) {
	m_strDescriptionText = lpszDescription;
}
AFX_INLINE CString CXTPControlAction::GetDescription() const {
	return m_strDescriptionText;
}
AFX_INLINE CString CXTPControlAction::GetTooltip() const {
	return m_strTooltipText;
}
AFX_INLINE void CXTPControlAction::SetTooltip(LPCTSTR lpszTooltip) {
	m_strTooltipText = lpszTooltip;
}
AFX_INLINE CString CXTPControlAction::GetKey() const {
	return m_strKey;
}
AFX_INLINE void CXTPControlAction::SetKey(LPCTSTR lpszKey) {
	m_strKey = lpszKey;
}
AFX_INLINE CString CXTPControlAction::GetCaption() const {
	return m_strCaption.IsEmpty() ? m_strTooltipText : m_strCaption;
}
AFX_INLINE CString CXTPControlAction::GetEditHint() const {
	return m_strEditHint;
}
AFX_INLINE int CXTPControlAction::GetID () const {
	return m_nId;
}
AFX_INLINE void CXTPControlAction::SetIconId(int nId) {
	if (m_nIconId != nId) {m_nIconId = nId; RedrawControls();}
}
AFX_INLINE int CXTPControlAction::GetIconId() const {
	return m_nIconId <= 0 ? m_nId : m_nIconId;
}
AFX_INLINE void CXTPControlAction::SetHelpId(int nId) {
	m_nHelpId = nId;
}
AFX_INLINE int CXTPControlAction::GetHelpId() const {
	return m_nHelpId <= 0 ? m_nId : m_nHelpId;
}

AFX_INLINE void CXTPControlAction::SetEnabled(BOOL bEnabled) {
	if (m_bEnabled != bEnabled) {m_bEnabled = bEnabled; OnChanged(0); RedrawControls();}
}
AFX_INLINE BOOL CXTPControlAction::GetChecked() const {
	return m_bChecked;
}
AFX_INLINE void CXTPControlAction::SetChecked(BOOL bChecked) {
	if (m_bChecked != bChecked) {m_bChecked = bChecked; OnChanged(1); RedrawControls();}
}
AFX_INLINE BOOL CXTPControlAction::IsVisible() const {
	return m_bVisible;
}
AFX_INLINE void CXTPControlAction::SetVisible(BOOL bVisible) {
	if (m_bVisible != bVisible) { m_bVisible = bVisible; OnChanged(2); RepositionControls();}
}
AFX_INLINE void CXTPControlAction::SetCategory(LPCTSTR lpszCategory) {
	m_strCategory = lpszCategory;
}
AFX_INLINE CString CXTPControlAction::GetCategory() const {
	return m_strCategory;
}
AFX_INLINE void CXTPControlAction::SetTag(DWORD_PTR dwTag) {
	m_nTag = dwTag;
}
AFX_INLINE DWORD_PTR CXTPControlAction::GetTag() const {
	return m_nTag;
}
AFX_INLINE void CXTPControlAction::SetKeyboardTip(LPCTSTR lpszKeyboardTip) {
	m_strKeyboardTip = lpszKeyboardTip;
}
AFX_INLINE CString CXTPControlAction::GetKeyboardTip() const {
	return m_strKeyboardTip;
}



//===========================================================================
// Summary:
//     CXTPControlActions is a CCmdTarget derived class. It represents a collection
//     of the actions.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlActions : public CXTPCmdTarget
{
protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlActions object
	// Parameters:
	//     pCommandBars - Parent commandbars object
	//-----------------------------------------------------------------------
	CXTPControlActions(CXTPCommandBars* pCommandBars);

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to return the action at the specified index.
	// Parameters:
	//     nIndex - An integer index.
	// Returns:
	//     The CXTPControlAction pointer currently at this index.
	//-----------------------------------------------------------------------
	CXTPControlAction* GetAt(int nIndex) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the count of the actions
	// Returns:
	//     The count of the actions.
	//-----------------------------------------------------------------------
	int GetCount() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to find the specified action.
	// Parameters:
	//     nId        - The action's identifier.
	// Returns:
	//     Pointer to the CXTPControlAction object if successful; otherwise returns NULL.
	//-----------------------------------------------------------------------
	CXTPControlAction* FindAction(int nId) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to add a new action.
	// Parameters:
	//     nId        - Identifier of the control to be added.
	//     pAction    - Action to add
	// Returns:
	//     A pointer to the added action.
	//-----------------------------------------------------------------------
	CXTPControlAction* Add(int nId);
	CXTPControlAction* Add(int nId, CXTPControlAction* pAction); // <combine CXTPControlActions::Add@int>

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes this object from or to an archive.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	void DoPropExchange(CXTPPropExchange* pPX);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to remove all actions.
	//-----------------------------------------------------------------------
	void RemoveAll();

	//-----------------------------------------------------------------------
	// Input:   nId - Identifier of the control that has the action to be
	//                removed
	// Summary: Removes the action of a control by using the Id of the control
	//-----------------------------------------------------------------------
	void Remove(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to create actions using menu commands
	// Parameters:
	//     pMenu - Menu pointer to convert from
	//-----------------------------------------------------------------------
	void CreateFromMenu(CMenu* pMenu);

protected:


protected:

	//-----------------------------------------------------------------------
	// Input:   pAction - Reference to the action to add to the collection
	//                    of actions
	// Summary: Inserts an existing CXTPControlAction into the collection of
	//          actions
	//-----------------------------------------------------------------------
	void Insert(CXTPControlAction* pAction);

	//-----------------------------------------------------------------------
	// Input:   pAction - Reference to an action to be assigned a new Id
	//          nId - The action's new identifier
	// Summary: Sets or updates the control Id associated with an action
	//-----------------------------------------------------------------------
	void SetActionId(CXTPControlAction* pAction, int nId);


protected:
	CArray<CXTPControlAction*, CXTPControlAction*> m_arrActions;    // Actions array
	CXTPCommandBars* m_pCommandBars;        // Parent CommandBars object

	friend class CXTPCommandBars;
	friend class CXTPControlAction;
};

//===========================================================================
// Summary:
//     CXTPControl is a CCmdTarget derived class. It represents the parent
//     class for the command bar's controls.
//===========================================================================
class _XTP_EXT_CLASS CXTPControl : public CXTPCmdTarget, public CXTPAccessible
{
private:
	class CDocTemplateMap : public CMap<UINT, UINT, BOOL, BOOL>
	{
	public:
		void Copy(CDocTemplateMap& map);
	};


protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControl object
	//-----------------------------------------------------------------------
	CXTPControl();

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the style of the control.
	// Parameters:
	//     buttonStyle - The style to be set. Can be any of the values listed in the Remarks section.
	// Remarks:
	//     buttonStyle parameter can be one of the following:
	//         * <b>xtpButtonAutomatic</b> Indicates the default style.
	//         * <b>xtpButtonCaption</b> Indicates caption drawing only.
	//         * <b>xtpButtonIcon</b> Indicates icon drawing only.
	//         * <b>xtpButtonIconAndCaption</b> Indicates icon and caption drawing.
	//-----------------------------------------------------------------------
	void SetStyle(XTPButtonStyle buttonStyle);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's style.
	// Returns:
	//     The style of the control.
	//-----------------------------------------------------------------------
	XTPButtonStyle GetStyle()  const;

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the caption of the control.
	// Parameters:
	//     lpszCaption - Caption to be set.
	//     nIDCaption - Caption resource identifier.
	// See Also: SetPrompt, SetDescription, SetTooltip
	//-----------------------------------------------------------------------
	void SetCaption(LPCTSTR lpszCaption);
	void SetCaption(UINT nIDCaption);// <combine CXTPControl::SetCaption@LPCTSTR>

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's caption.
	// Returns:
	//     The caption of the control.
	//-----------------------------------------------------------------------
	virtual CString GetCaption() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the shortcut string to the control.
	// Parameters:
	//     lpszShortcutText - Shortcut to be set.
	//-----------------------------------------------------------------------
	void SetShortcutText(LPCTSTR lpszShortcutText);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's shortcut.
	// Returns:
	//     The shortcut of the control.
	//-----------------------------------------------------------------------
	CString GetShortcutText() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the description of the control.
	// Parameters:
	//     lpszDescription - Description to be set.
	// See Also: SetCaption, SetPrompt, SetTooltip
	//-----------------------------------------------------------------------
	void SetDescription(LPCTSTR lpszDescription);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's description.
	// Returns:
	//     The description of the control.
	//-----------------------------------------------------------------------
	virtual CString GetDescription() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the tooltip of the control.
	// Parameters:
	//     lpszTooltip - Tooltip to be set.
	// See Also: SetCaption, SetDescription, SetPrompt
	//-----------------------------------------------------------------------
	void SetTooltip(LPCTSTR lpszTooltip);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's tooltip.
	// Returns:
	//     Tooltip of the control.
	//-----------------------------------------------------------------------
	virtual CString GetTooltip() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the keyboard tip to the control.
	// Parameters:
	//     lpszKeyboardTip - Keyboard tip to be set.
	//-----------------------------------------------------------------------
	void SetKeyboardTip(LPCTSTR lpszKeyboardTip);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the keyboard tip.
	// Returns:
	//     The  keyboard tip of the control.
	//-----------------------------------------------------------------------
	CString GetKeyboardTip() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the parameter of the control.
	// Parameters:
	//     lpszParameter - Parameter to be set.
	// Remarks:
	//     This method sets CString value associated with the control, use SetTag to set numeric parameter.
	// See Also: SetTag, GetParameter
	//-----------------------------------------------------------------------
	void SetParameter(LPCTSTR lpszParameter);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's parameter.
	// Returns:
	//     The parameter of the control.
	// See Also: GetTag, SetParameter
	//-----------------------------------------------------------------------
	CString GetParameter() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the identifier of the control.
	// Parameters:
	//     nId - Identifier to be set.
	//-----------------------------------------------------------------------
	void SetID(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's identifier.
	// Returns:
	//     The identifier of the control.
	//-----------------------------------------------------------------------
	int GetID() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the index of the control.
	// Returns:
	//     The index of the control.
	//-----------------------------------------------------------------------
	long GetIndex() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the control icon's identifier.
	// Parameters:
	//     nId - Icon's identifier to be set.
	//-----------------------------------------------------------------------
	void SetIconId(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the icon's identifier.
	// Returns:
	//     An icon's identifier of the control.
	//-----------------------------------------------------------------------
	int GetIconId() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the control help identifier.
	// Parameters:
	//     nId - Help identifier to be set.
	//-----------------------------------------------------------------------
	void SetHelpId(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the help identifier.
	// Returns:
	//     Help identifier of the control.
	//-----------------------------------------------------------------------
	int GetHelpId() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to begin a new group using a separator.
	// Parameters:
	//     bBeginGroup - TRUE if the control starts a new group.
	//-----------------------------------------------------------------------
	virtual void SetBeginGroup(BOOL bBeginGroup);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the control has a separator.
	// Returns:
	//     TRUE if the control starts a new group; otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL GetBeginGroup() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to enable or disable the control.
	//     If the control does not have xtpFlagManualUpdate flag, you must call
	//     the Enable member of CCmdUI in the ON_UPDATE_COMMAND_UI handler.
	// Parameters:
	//     bEnabled - TRUE if the control is enabled.
	// See Also: GetEnabled, SetChecked
	//-----------------------------------------------------------------------
	virtual void SetEnabled(BOOL bEnabled);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the control.
	// Returns:
	//     TRUE if the control is enabled; otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL GetEnabled() const;


	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when control enable state was changed
	//-----------------------------------------------------------------------
	virtual void OnEnabledChanged();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to check the control.
	//     If the control does not have xtpFlagManualUpdate flag, you must call
	//     the SetCheck member of CCmdUI in the ON_UPDATE_COMMAND_UI handler.
	// Parameters:
	//     bChecked - TRUE if the control is checked.
	// See Also: GetChecked, SetEnabled
	//-----------------------------------------------------------------------
	virtual void SetChecked(BOOL bChecked);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the control.
	// Returns:
	//     TRUE if the control is checked; otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL GetChecked() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the control.
	// Returns:
	//     TRUE if the control is selected; otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual int GetSelected() const;


	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set focus to the control.
	// Parameters:
	//     bFocused - TRUE to set focus
	//-----------------------------------------------------------------------
	virtual void SetFocused(BOOL bFocused);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the focused state of the control.
	// Returns:
	//     TRUE if the control has focus; otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL IsFocused() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to press the control.
	// Parameters:
	//     bPressed - TRUE if the control is pressed.
	//-----------------------------------------------------------------------
	void SetPressed(BOOL bPressed);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the state of the control.
	// Returns:
	//     TRUE if the control is pressed; otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL GetPressed() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member is called to set the bounding rectangle of the control.
	// Parameters:
	//     rcControl - Bounding rectangle of the control.
	//-----------------------------------------------------------------------
	virtual void SetRect(CRect rcControl);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the bounding rectangle of the control.
	// Returns:
	//     The bounding rectangle of the control.
	//-----------------------------------------------------------------------
	CRect GetRect() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the parent command bar.
	// Returns:
	//     The parent command bar object.
	//-----------------------------------------------------------------------
	CXTPCommandBar* GetParent() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the control is visible.
	// Parameters:
	//     dwSkipFlags - combination of XTPControlHideFlags that can be ignored
	// Returns:
	//     TRUE if the control is visible.
	// See Also: XTPControlHideFlags, GetHideFlags
	//-----------------------------------------------------------------------
	virtual BOOL IsVisible(DWORD dwSkipFlags = 0) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the caption of the control is visible
	// Returns:
	//     TRUE if the caption is visible.
	//-----------------------------------------------------------------------
	virtual BOOL IsCaptionVisible() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to change the state of the control.
	// Parameters:
	//     bVisible - TRUE if the control is visible.
	//-----------------------------------------------------------------------
	void SetVisible(BOOL bVisible);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the parent controls collection.
	// Returns:
	//     A CXTPControls pointer to the parent controls.
	//-----------------------------------------------------------------------
	CXTPControls* GetControls() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's type
	// Returns:
	//     The type of the control. It can be one of the following:
	//         * <b>xtpControlButton</b> Indicates the control is simple button (CXTPControlButton)
	//         * <b>xtpControlPopup</b> Indicates the control is simple popup button. (CXTPControlPopup)
	//         * <b>xtpControlButtonPopup</b> Indicates the control is popup button with icon (CXTPControlPopup)
	//         * <b>xtpControlSplitButtonPopup</b> Indicates the control is split button popup.(CXTPControlPopup)
	//         * <b>xtpControlComboBox</b> Indicates the control is combo box (CXTPControlComboBox)
	//         * <b>xtpControlEdit</b> Indicates the control is edit control (CXTPControlEdit)
	//         * <b>xtpControlLabel</b> Indicates the control is label (CXTPControlLabel)
	//-----------------------------------------------------------------------
	XTPControlType GetType() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the flags of the control.
	// Parameters:
	//     dwFlags - control flags.
	// Remarks:
	//     Flags to be added or removed can be combined by using the bitwise
	//     OR (|) operator. It can be one or more of the following:
	//         * <b>xtpFlagRightAlign</b> Indicates the control is right aligned.
	//         * <b>xtpFlagSkipFocus</b> Indicates the control does not have focus.
	//         * <b>xtpFlagLeftPopup</b> Indicates the child bar should pop-up on the left.
	//         * <b>xtpFlagManualUpdate</b> Indicates the control is manually updated.
	//         * <b>xtpFlagNoMovable</b> Indicates the control's customization is disabled.
	//         * <b>xtpFlagControlStretched</b> Indicates the control is stretched in the parent command bar.
	// See Also: GetFlags, XTPControlFlags
	//-----------------------------------------------------------------------
	void SetFlags(DWORD dwFlags);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to retrieve control special flags.
	// Returns:
	//     Controls special flags.
	// See Also: SetFlags, XTPControlFlags
	//----------------------------------------------------------------------
	DWORD GetFlags() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This method sets the 32-bit value associated with the control.
	// Parameters:
	//     dwTag - Contains the new value to associate with the control.
	//-----------------------------------------------------------------------
	void SetTag(DWORD_PTR dwTag);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method retrieves the application-supplied 32-bit value
	//     associated with the control.
	// Returns:
	//     The 32-bit value associated with the control.
	//-----------------------------------------------------------------------
	DWORD_PTR GetTag() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to compare controls.
	// Parameters:
	//     pOther - The control need compare with.
	// Returns:
	//     TRUE if the controls are identical.
	//-----------------------------------------------------------------------
	virtual BOOL Compare(CXTPControl* pOther);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the child command bar.
	// Returns:
	//     A pointer to the child command bar.
	//-----------------------------------------------------------------------
	virtual CXTPCommandBar* GetCommandBar() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member function to enable or disable closing of the
	//     sub menus when a control is clicked in the menu.
	// Parameters:
	//     bCloseOnClick - TRUE if the sub menu will close when a control
	//                     is clicked, FALSE if the menu will remain open
	//                     after a control is clicked.
	// See Also: GetCloseSubMenuOnClick
	//----------------------------------------------------------------------
	void SetCloseSubMenuOnClick(BOOL bCloseOnClick);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine if sub menus will close
	//     as soon as a control is clicked.
	// Returns:
	//     TRUE if the sub menu will close when a control is clicked, FALSE
	//     if the menu will remain open after a control is clicked.
	// See Also: SetCloseSubMenuOnClick
	//----------------------------------------------------------------------
	BOOL GetCloseSubMenuOnClick() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to make button send WM_COMMAND messages while it pressed by user
	// Parameters:
	//     nExecuteOnPressInterval - Ms delay between each message.
	// See Also: GetExecuteOnPressInterval
	//-----------------------------------------------------------------------
	void SetExecuteOnPressInterval(int nExecuteOnPressInterval);

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if SetExecuteOnPressInterval was called
	//-----------------------------------------------------------------------
	int GetExecuteOnPressInterval() const;

	//-----------------------------------------------------------------------
	// Summary: Returns the ribbon group the control belongs to.
	// Returns: If the control belongs to a ribbon group, then the CXTPRibbonGroup
	//          that the control belongs to is returned.  If the control does not
	//          belong to a ribbon group NULL is returned.
	// See Also: CXTPRibbonBar::RebuildControls
	//-----------------------------------------------------------------------
	CXTPRibbonGroup* GetRibbonGroup() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if control need to draw its background
	// Returns:
	//     TRUE if paint manager must skip filling background of control
	//-----------------------------------------------------------------------
	virtual BOOL IsTransparent() const { return FALSE;}

public:

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to hide the control.
	// Parameters:
	//     bHide - TRUE to set hide state.
	//----------------------------------------------------------------------
	void SetHideWrap(BOOL bHide);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to hide the control.
	// Parameters:
	//     dwFlags - Reasons to hide.
	// Remarks:
	//     HideFlags will tell how a control was hidden if it is hidden
	//     or why it is not visible.  Most of these flags are read only
	//     and should not be set be the developer.
	//     There is only one situation where you should set these flags
	//     manually.  The xtpHideCustomize is the only flag that should
	//     ever be manually set. you would do this when you want the
	//     control to initially be hidden but still exist in customize
	//     popup of toolbar.  This will cause the control to appear in
	//     the Add and Remove Buttons popup without a check mark indicating
	//     that it is currently hidden.  This flag will automatically
	//     be set when a command is hidden this way.
	// See Also: XTPControlHideFlags
	//----------------------------------------------------------------------
	virtual void SetHideFlags(DWORD dwFlags);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to set/remove hide flags.
	// Parameters:
	//     dwFlag - XTPControlHideFlags type of flag to be set/remove
	//     bSet   - TRUE to set flag; FALSE to remove.
	// Remarks:
	//     SetHideFlag will tell how a control was hidden if it is hidden
	//     or why it is not visible.  Most of these flags are read only
	//     and should not be set be the developer.
	// Returns:
	//     TRUE if flags was changed
	// See Also: XTPControlHideFlags, SetHideFlags
	//----------------------------------------------------------------------
	BOOL SetHideFlag(XTPControlHideFlags dwFlag, BOOL bSet);


	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve hidden flags.
	// Returns:
	//     Flags of the control visibility.
	// Remarks:
	//     HideFlags will tell how a control was hidden if it is hidden
	//     or why it is not visible.  Most of these flags are read only
	//     and should not be set be the developer.
	//     There is only one situation where you should set these flags
	//     manually.  The xtpHideCustomize is the only flag that should
	//     ever be manually set. you would do this when you want the
	//     control to initially be hidden but still exist in customize
	//     popup of toolbar.  This will cause the control to appear in
	//     the Add and Remove Buttons popup without a check mark indicating
	//     that it is currently hidden.  This flag will automatically
	//     be set when a command is hidden this way.
	// See Also: XTPControlHideFlags
	//----------------------------------------------------------------------
	DWORD GetHideFlags() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the position of the control's row.
	// Returns:
	//     Bounding rectangle of the control's row.
	//----------------------------------------------------------------------
	CRect GetRowRect() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve if the control is wrapped.
	// Returns:
	//     TRUE if the control is wrapped; otherwise returns FALSE
	// See Also: SetWrap
	//----------------------------------------------------------------------
	BOOL GetWrap() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to set the row of the control.
	// Parameters:
	//     rcRow - Rectangle of the control's row.
	//----------------------------------------------------------------------
	void SetRowRect(CRect rcRow);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the wrap.
	// Parameters:
	//     bWrap - TRUE to set wrap.
	// See Also: GetWrap
	//----------------------------------------------------------------------
	void SetWrap(BOOL bWrap);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to retrieve if the control is expanded.
	// Returns:
	//     TRUE if the control is expanded; otherwise returns FALSE
	//----------------------------------------------------------------------
	BOOL GetExpanded() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the mouse pointer is over
	//     the control.
	// Returns:
	//     TRUE if the mouse cursor is over the control; otherwise returns
	//     FALSE
	//----------------------------------------------------------------------
	BOOL IsCursorOver() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when the control is executed.
	//----------------------------------------------------------------------
	virtual void OnExecute();

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called before recalculating the parent command
	//     bar size to calculate the dimensions of the control.
	// Parameters:
	//     dwMode - Flags used to determine the height and width of the
	//              dynamic command bar. See Remarks section for a list of
	//              values.
	// Remarks:
	//     The following predefined flags are used to determine the height and
	//     width of the dynamic command bar. Use the bitwise-OR (|) operator to
	//     combine the flags.<p/>
	//
	//     * <b>LM_STRETCH</b> Indicates whether the command bar should be
	//                stretched to the size of the frame. Set if the bar is
	//                not a docking bar (not available for docking). Not set
	//                when the bar is docked or floating (available for
	//                docking). If set, LM_STRETCH returns dimensions based
	//                on the LM_HORZ state. LM_STRETCH works similarly to
	//                the the bStretch parameter used in CalcFixedLayout;
	//                see that member function for more information about
	//                the relationship between stretching and orientation.
	//     * <b>LM_HORZ</b> Indicates that the bar is horizontally or
	//                vertically oriented. Set if the bar is horizontally
	//                oriented, and if it is vertically oriented, it is not
	//                set. LM_HORZ works similarly to the the bHorz
	//                parameter used in CalcFixedLayout; see that member
	//                function for more information about the relationship
	//                between stretching and orientation.
	//     * <b>LM_MRUWIDTH</b> Most Recently Used Dynamic Width. Uses the
	//                remembered most recently used width.
	//     * <b>LM_HORZDOCK</b> Horizontal Docked Dimensions. Returns the
	//                dynamic size with the largest width.
	//     * <b>LM_VERTDOCK</b> Vertical Docked Dimensions. Returns the dynamic
	//                size with the largest height.
	//     * <b>LM_COMMIT</b> Resets LM_MRUWIDTH to current width of
	//                floating command bar.
	//
	//     The framework calls this member function to calculate the dimensions
	//     of a dynamic command bar.<p/>
	//
	//     Override this member function to provide your own layout in classes
	//     you derive from CXTPControl. XTP classes derived from CXTPControl,
	//     such as CXTPControlComboBox, override this member function to provide
	//     their own implementation.
	// See Also:
	//     CXTPControlComboBox, CXTPControlCustom, CXTPControlEdit,
	//     CXTPControlWindowList, CXTPControlWorkspaceActions, CXTPControlToolbars,
	//     CXTPControlOleItems, CXTPControlRecentFileList, CXTPControlSelector,
	//     CXTPControlListBox
	//----------------------------------------------------------------------
	virtual void OnCalcDynamicSize(DWORD dwMode);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to redraw the parent command bar.
	//----------------------------------------------------------------------
	void DelayRedrawParent();

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to recalculate the parent command bar size.
	//----------------------------------------------------------------------
	void DelayLayoutParent();

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to set the category of the control.
	// Parameters:
	//     lpszCategory - Category of the control.
	//----------------------------------------------------------------------
	void SetCategory(LPCTSTR lpszCategory);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the category of the control.
	// Returns:
	//     Category of the control.
	//----------------------------------------------------------------------
	CString GetCategory() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the image manager.
	// Returns:
	//     A pointer to a CXTPImageManager object.
	//----------------------------------------------------------------------
	CXTPImageManager* GetImageManager() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the paint manager.
	// Returns:
	//     A pointer to a CXTPPaintManager object.
	//----------------------------------------------------------------------
	CXTPPaintManager* GetPaintManager() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the image of the control.
	// Parameters:
	//     nWidth - Width of the image to retrieve.
	// Returns:
	//     A pointer to a CXTPImageManagerIcon object.
	//----------------------------------------------------------------------
	virtual CXTPImageManagerIcon* GetImage(int nWidth = 16) const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to assign a document template to the control.
	//     Assigned control will be shown only when the child MDI window is activated
	//     with the assigned document template.
	// Parameters:
	//     nIDResource - document template identifier.
	// See Also: AssignDocTemplate
	//----------------------------------------------------------------------
	void AssignDocTemplate(UINT nIDResource);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to exclude the document template from control.
	//     Control will be shown only when the child MDI window is activated
	//     with the document template different from excluded.
	// Parameters:
	//     nIDResource - document template identifier.
	// See Also: ExcludeDocTemplate
	//----------------------------------------------------------------------
	void ExcludeDocTemplate(UINT nIDResource);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve if control is default menu item.
	// Returns:
	//     TRUE if control is default menu item.
	// See Also: SetItemDefault
	//----------------------------------------------------------------------
	BOOL IsItemDefault()  const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to set the default menu item.
	// Parameters:
	//     bDefault - TRUE to set control default menu item.
	// Remarks:
	//     A default menu item will appear in bold text.
	// See Also: IsItemDefault
	//----------------------------------------------------------------------
	void SetItemDefault(BOOL bDefault);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to determine if control is temporary.
	//     Temporary controls will not be saved to the system registry when
	//     the application is closed (If the CommandBars layout is saved).
	// Returns:
	//     TRUE if control is temporary.
	//----------------------------------------------------------------------
	BOOL IsTemporary() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to reset the icon and caption of a control
	//     to its default settings before it was customized by the user.
	// Remarks:
	//     The caption and icon of a control is customized while in customization
	//     mode.
	// See Also:
	//     SetCustomIcon, m_strCustomCaption
	//----------------------------------------------------------------------
	void Reset();

	//----------------------------------------------------------------------
	// Summary:
	//     Call this member to load a string from a STRINGTABLE resource
	//     to set the tooltip and description of a control.
	// Parameters:
	//     lpszPrompt -  String from resource file that contains the
	//                  tooltip and description of the item.  The Caption
	//                  will be set to use the tooltip text.  The tooltip
	//                  and description must be separated by "\n" if both
	//                  are included.  You can omit the description and
	//                  both the tooltip and description will be set to
	//                  the same value.
	// Remarks:
	//     Resource strings are in the format "Description\nToolTip".
	//
	//     Note: The caption is set to the value of the tooltip when this
	//           member is called.
	// See Also: SetCaption, SetDescription, SetTooltip
	//----------------------------------------------------------------------
	void SetPrompt(LPCTSTR lpszPrompt);

	// -------------------------------------------------------------------
	// Summary:
	//     Call this member to retrieve CXTPControl from CCmdUI structure.
	// Parameters:
	//     pCmdUI :  Address of a CCmdUI structure.
	// Returns:
	//     CXTPControl from CCmdUI structure.
	// -------------------------------------------------------------------
	static CXTPControl* AFX_CDECL FromUI(CCmdUI* pCmdUI);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set a custom icon to this control.
	// Parameters:
	//     hIcon - HICON object containing icon to set to control.
	// See Also: Reset
	//-----------------------------------------------------------------------
	void SetCustomIcon(HICON hIcon);

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes this object from or to an archive.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	virtual void DoPropExchange(CXTPPropExchange* pPX);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when the user activate control using its underline.
	//----------------------------------------------------------------------
	virtual void OnUnderlineActivate();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the control's popup state.
	// Returns:
	//     TRUE if the control is a popup.
	//-----------------------------------------------------------------------
	virtual BOOL GetPopuped() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to redraw the parent command bar.
	// Parameters:
	//     bAnimate - TRUE to animate changes
	//----------------------------------------------------------------------
	void RedrawParent(BOOL bAnimate = TRUE);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to sent message code to parent site window.
	// Parameters:
	//     code - Message to be sent.
	//     pNM - Structure that is passed as a parameter in the CBN_XTP_EXECUTE message.
	//     pSite - Parent window of commandbar.
	// Returns:
	//     Results.
	//----------------------------------------------------------------------
	LRESULT NotifySite(UINT code);
	LRESULT NotifySite(UINT code, NMXTPCONTROL* pNM); // <combine CXTPControl::NotifySite@UINT>
	LRESULT NotifySite(CWnd* pSite, UINT code, NMXTPCONTROL* pNM); // <combine CXTPControl::NotifySite@UINT>

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to manually assign action for control.
	// Parameters:
	//     pAction - Action to assign.
	// See Also:
	//     CXTPControlAction, GetAction
	//----------------------------------------------------------------------
	virtual void SetAction(CXTPControlAction* pAction);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve action associated with control
	// See Also:
	//     CXTPControlAction, SetAction
	//----------------------------------------------------------------------
	CXTPControlAction* GetAction() const;


	//-------------------------------------------------------------------------
	// Summary:
	//     This method is called when paint manager theme was changed
	//-------------------------------------------------------------------------
	virtual void OnThemeChanged();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the width of the control
	// Parameters:
	//     nWidth - The width of the control
	//-----------------------------------------------------------------------
	virtual void SetWidth(int nWidth);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the height of the control
	// Parameters:
	//     nHeight - The height of the control
	//-----------------------------------------------------------------------
	virtual void SetHeight(int nHeight);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the width of the control
	// Returns:
	//     Width of the control in pixels
	// See Also: GetHeight
	//-----------------------------------------------------------------------
	int GetWidth() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to get the height of the control
	// Returns:
	//     Height of the control in pixels
	// See Also: GetWidth
	//-----------------------------------------------------------------------
	int GetHeight() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine if control has Vista DWM transparent area
	//-----------------------------------------------------------------------
	BOOL HasDwmCompositedRect() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the size of the command bar button.
	// Returns:
	//     The width and height values of the command bar button.
	//-----------------------------------------------------------------------
	virtual CSize GetButtonSize() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to get the size of a toolbar icon.
	// See Also:
	//     GetButtonSize
	//-----------------------------------------------------------------------
	virtual CSize GetIconSize() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the size of a icon for individual control.
	// Parameters:
	//     szIcon   - Desired size of icon.
	// See Also:
	//     GetIconSize, GetButtonSize
	//-----------------------------------------------------------------------
	void SetIconSize(CSize szIcon);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to copy the control.
	// Parameters:
	//     pControl   - Points to a source CXTPControl object.
	//     bRecursive - TRUE to copy recursively.
	//----------------------------------------------------------------------
	virtual void Copy(CXTPControl* pControl, BOOL bRecursive = FALSE);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when the user clicks the control.
	// Parameters:
	//     bKeyboard - TRUE if the control is selected using the keyboard.
	//     pt        - Mouse cursor position.
	//----------------------------------------------------------------------
	virtual void OnClick(BOOL bKeyboard = FALSE, CPoint pt = CPoint(0, 0));

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine if control can be reposition in customize mode.
	// See Also:
	//     xtpFlagNoMovable
	//----------------------------------------------------------------------
	virtual BOOL IsCustomizeMovable() const;

protected:

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to check if control accept focus
	// See Also: SetFocused, IsFocused
	//----------------------------------------------------------------------
	virtual BOOL IsFocusable() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to assign the order of the control in
	//     the controls list.
	// Parameters:
	//     nIndex - Index of the control.
	//----------------------------------------------------------------------
	void SetIndex(int nIndex) { m_nIndex = nIndex; }

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to assign expanded state to the control.
	// Parameters:
	//     bExpanded - TRUE if the control is expanded.
	//----------------------------------------------------------------------
	void SetExpanded(BOOL bExpanded);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when a non-system key is pressed.
	// Parameters:
	//     nChar - Specifies the virtual key code of the given key.
	//     lParam   - Specifies additional message-dependent information.
	// Returns:
	//     TRUE if key handled, otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnHookKeyDown(UINT nChar, LPARAM lParam);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when user rotates the mouse wheel.
	// Parameters:
	//     nFlags - Indicates whether various virtual keys are down.
	//     zDelta - Indicates distance rotated.
	//     point  - Specifies the x- and y coordinate of the cursor.
	// Returns:
	//     TRUE if key handled, otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnHookMouseWheel(UINT nFlags, short zDelta, CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to assign a parent command bar object.
	// Parameters:
	//     pParent - Points to a CXTPCommandBar object
	//----------------------------------------------------------------------
	virtual void SetParent(CXTPCommandBar* pParent) { m_pParent = pParent;}

	//----------------------------------------------------------------------
	// Summary:
	//     The ScreenToClient function converts the screen coordinates
	//     of a specified point on the screen
	// Parameters:
	//     point - Pointer to a CPoint object that specifies the screen
	//     coordinates to be converted.
	//----------------------------------------------------------------------
	void ScreenToClient(CPoint* point);

	//----------------------------------------------------------------------
	// Summary:
	//     This helper method is called when the user clicks to the toolbar's
	//     button.
	// Parameters:
	//     rcActiveRect - Rectangle of the control.
	//----------------------------------------------------------------------
	void ClickToolBarButton(CRect rcActiveRect = CRect(0, 0, 0, 0));

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to popup the control.
	// Parameters:
	//     bPopup - TRUE to set popup.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnSetPopup(BOOL bPopup);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user releases the left mouse button.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual void OnLButtonUp(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user presses the left mouse button down.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual void OnLButtonDown(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user press the right mouse button.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual BOOL OnRButtonDown(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user releases the right mouse button.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual BOOL OnRButtonUp(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user double-clicks the left mouse button.
	// Parameters:
	//     point - Specifies the x- and y coordinates of the cursor.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnLButtonDblClk(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the mouse cursor moves.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual void OnMouseMove(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     Called after the mouse hovers over the control.
	//----------------------------------------------------------------------
	virtual void OnMouseHover();

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when the control becomes selected.
	// Parameters:
	//     bSelected - TRUE if the control becomes selected.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnSetSelected(int bSelected);

	//----------------------------------------------------------------------
	// Summary:
	//     Call this method to determine if command bars is in customize
	//     mode.
	// Returns:
	//     TRUE if command bars is in Customize mode; otherwise returns
	//     FALSE
	//----------------------------------------------------------------------
	BOOL IsCustomizeMode() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user starts to drag the control in customize mode.
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	// See Also: IsCustomizeMode, CustomizeStartResize
	//----------------------------------------------------------------------
	virtual void CustomizeStartDrag(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called when user starts resize control in customize mode
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	// Returns:
	//     TRUE if control process this event.
	// See Also: IsCustomizeMode, CustomizeStartDrag, GetCustomizeMinWidth
	//----------------------------------------------------------------------
	virtual BOOL CustomizeStartResize(CPoint point);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user moves the mouse over the
	//     control.
	// Parameters:
	//     pDataObject - Points to a CXTPControl object
	//     point       - Mouse position.
	//     dropEffect  - DROPEFFECT enumerator.
	//----------------------------------------------------------------------
	virtual void OnCustomizeDragOver(CXTPControl* pDataObject, CPoint point, DROPEFFECT& dropEffect);

	//----------------------------------------------------------------------
	// Summary:
	//     This member checks if the user can drop the control.
	// Parameters:
	//     pCommandBar - Points to a CXTPCommandBar object
	//     point       - Mouse position.
	//     dropEffect  - DROPEFFECT enumerator.
	// Returns:
	//     TRUE if successful, otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint point, DROPEFFECT& dropEffect);

	//----------------------------------------------------------------------
	// Summary:
	//     This member checks if the user can resize control.
	// Returns:
	//     TRUE if resize available.
	//----------------------------------------------------------------------
	virtual BOOL IsCustomizeResizeAllow() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Retrieves available minimum width of control.
	// Remarks:
	//     This method is called in CustomizeStartResize to retrieve dimension of available rectangles
	//     of resized control.
	// Returns:
	//     Returns zero by default.
	// See Also: CXTPControlComboBox::GetCustomizeMinWidth, CXTPControlEdit::GetCustomizeMinWidth
	//----------------------------------------------------------------------
	virtual int GetCustomizeMinWidth() const;

	//----------------------------------------------------------------------
	// Summary:
	//     Retrieves available minimum height of the control.
	// Remarks:
	//     This method is called in CustomizeStartResize to retrieve dimension of available rectangles
	//     of resized control.
	// Returns:
	//     Returns zero by default.
	// See Also: CXTPControlComboBox::GetCustomizeMinHeight, CXTPControlEdit::GetCustomizeMinHeight
	//----------------------------------------------------------------------
	virtual int GetCustomizeMinHeight() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the mouse cursor moves in customized mode
	// Parameters:
	//     point - Specifies the x- and y coordinate of the cursor.
	//----------------------------------------------------------------------
	void OnCustomizeMouseMove(CPoint point);

	//-------------------------------------------------------------------------
	// Summary:
	//     This virtual method is called in idle-time processing
	//-------------------------------------------------------------------------
	virtual void OnIdleUpdate();

	//-------------------------------------------------------------------------
	// Summary:
	//     This method is called when control was removed from parent controls collection
	//-------------------------------------------------------------------------
	virtual void OnRemoved();

	//-----------------------------------------------------------------------
	// Input:   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.
	// Summary: The framework calls this member function to determine
	//          whether a point is in the bounding rectangle of the
	//          specified tool.
	// 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;

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called from LoadCommandBars
	//     to restore controls and its child commandbars
	// Parameters:
	//     pCommandBarList - CommandBars collection contains all commandbars was restored
	// See Also: GenerateCommandBarList
	//-----------------------------------------------------------------------
	virtual void RestoreCommandBarList(CXTPCommandBarList* pCommandBarList);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called from SaveCommandBars
	//     to save all child commandbars
	// Parameters:
	//      nID - Current Identifier counter
	//      pCommandBarList - List of saved commandbars
	//      pParam - Serialize parameters.
	// See Also: RestoreCommandBarList
	//-----------------------------------------------------------------------
	virtual void GenerateCommandBarList(DWORD& nID, CXTPCommandBarList* pCommandBarList, XTP_COMMANDBARS_PROPEXCHANGE_PARAM* pParam);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when action property was changed
	// Parameters:
	//     nProperty - Property of the action
	// See Also: OnActionChanging
	//-----------------------------------------------------------------------
	virtual void OnActionChanged(int nProperty);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when action property is about to be changed
	// Parameters:
	//     nProperty - Property of the action
	// See Also: OnActionChanged
	//-----------------------------------------------------------------------
	virtual void OnActionChanging(int nProperty);

protected:

	//-------------------------------------------------------------------------
	// Summary: This method is called when the control's caption is changed
	//-------------------------------------------------------------------------
	virtual void OnCaptionChanged();

protected:
//{{AFX_CODEJOCK_PRIVATE
	virtual HRESULT GetAccessibleParent(IDispatch** ppdispParent);
	virtual HRESULT GetAccessibleDescription(VARIANT varChild, BSTR* pszDescription);
	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();
	virtual HRESULT GetAccessibleDefaultAction(VARIANT varChild, BSTR* pszDefaultAction);
	virtual HRESULT AccessibleDoDefaultAction(VARIANT varChild);
	virtual HRESULT AccessibleSelect(long flagsSelect, VARIANT varChild);
	virtual HRESULT GetAccessibleKeyboardShortcut(VARIANT /*varChild*/, BSTR* /*pszKeyboardShortcut*/);

	DECLARE_INTERFACE_MAP()

	virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);

//}}AFX_CODEJOCK_PRIVATE

private:
	void OnInvertTracker(CDC* pDC, CRect rect);
	BOOL NeedPressOnExecute() const;

protected:
	DWORD_PTR m_nTag;               // Control tag.
	int m_nIndex;                   // Index of the control.
	int m_nId;                      // Identifier of the control.
	int m_nIconId;                  // Identifier of the control's image.
	int m_nHelpId;                  // Help identifier
	int m_nCustomIconId;            // Identifier of the control's custom image.
	BOOL m_bWrap;                   // TRUE if the control is wrapped.
	BOOL m_bBeginGroup;             // TRUE if the control starts new group.
	BOOL m_bEnabled;                // TRUE if the control is enabled.
	BOOL m_bChecked;                // TRUE if the control is checked.
	BOOL m_bSelected;               // TRUE if the control is selected.
	BOOL m_bPressed;                // TRUE if the control is pushed.
	BOOL m_bTemporary;              // TRUE if the control is temporary.
	CRect m_rcRow;                  // Bounding rectangle of the control's row.
	CRect m_rcControl;              // Bounding rectangle of the control.
	DWORD m_dwHideFlags;            // Hidden flags.
	DWORD m_dwFlags;                // Flags of the control.
	CString m_strCaption;           // Caption of the control.
	CString m_strCustomCaption;     // User defined caption.
	CString m_strShortcutText;      // Shortcut text.
	CString m_strShortcutTextAuto;  // Shortcut text.
	CString m_strTooltipText;       // Tooltip text.
	CString m_strDescriptionText;   // Description text.
	CString m_strParameter;         // Parameter text.
	CString m_strKeyboardTip;       // Keyboard tip
	CXTPControls* m_pControls;      // Parent control collection
	XTPControlType m_controlType;   // Type of the control.
	CXTPCommandBar* m_pParent;      // The Parent command bar.
	BOOL m_bExpanded;               // TRUE if the control is expanded.

	CString m_strCategory;          // Category of the control.
	BOOL m_bDefaultItem;            // TRUE if the item is default popup item;

	CDocTemplateMap m_mapDocTemplatesAssigned;  // Assigned templates.
	CDocTemplateMap m_mapDocTemplatesExcluded;  // Excluded templates.

	XTPButtonStyle m_buttonStyle;   // Button Style.
	XTPButtonStyle m_buttonCustomStyle;         // User defined style of button.
	XTPButtonStyle m_buttonRibbonStyle;         // User defined style of button.

	BOOL m_bCloseSubMenuOnClick;        // TRUE is sub-menus are closed as soon as a control is clicked.
	CXTPRibbonGroup* m_pRibbonGroup;    // Ribbon group of control

	CXTPControlAction* m_pAction;       // Action of the control.
	int m_nWidth;                       // Width of the control.
	int m_nHeight;                      // Height of the control.

	int m_nExecuteOnPressInterval;      // Delay between each message when control is pressed.

	CSize m_szIcon;         // The size of the icon used for the control.


private:

	DECLARE_XTP_CONTROL(CXTPControl)

	friend class CXTPControls;
	friend class CXTPCommandBar;
	friend class CXTPToolBar;
	friend class CXTPPopupBar;
	friend class CXTPCustomizeSheet;
	friend class CXTPCustomizeDropSource;
	friend class CXTPRibbonGroup;
	friend class CXTPRibbonGroups;
	friend class CXTPRibbonBar;
	friend class CXTPRibbonControls;
	friend class CXTPControlAction;
	friend class CXTPRibbonQuickAccessControls;
};

//////////////////////////////////////////////////////////////////////////


AFX_INLINE long CXTPControl::GetIndex() const {
	return m_nIndex;
}
AFX_INLINE void CXTPControl::SetShortcutText(LPCTSTR lpszShortcutText) {
	m_strShortcutText = lpszShortcutText;
}
AFX_INLINE CString CXTPControl::GetShortcutText() const {
	return !m_strShortcutText.IsEmpty() ? m_strShortcutText :
	m_pAction && !m_pAction->GetShortcutText().IsEmpty()  ? m_pAction->GetShortcutText() : m_strShortcutTextAuto;
}
AFX_INLINE void CXTPControl::SetDescription(LPCTSTR lpszDescription) {
	m_strDescriptionText = lpszDescription;
}
AFX_INLINE CString CXTPControl::GetDescription() const {
	return !m_strDescriptionText.IsEmpty() ? m_strDescriptionText : m_pAction ? m_pAction->GetDescription() : _T("");
}
AFX_INLINE CString CXTPControl::GetTooltip() const {
	return !m_strTooltipText.IsEmpty() ? m_strTooltipText : m_pAction ? m_pAction->GetTooltip() : _T("");
}
AFX_INLINE void CXTPControl::SetTooltip(LPCTSTR lpszTooltip) {
	m_strTooltipText = lpszTooltip;
}
AFX_INLINE CString CXTPControl::GetCaption() const {
	return !m_strCustomCaption.IsEmpty() ? m_strCustomCaption : !m_strCaption.IsEmpty() ? m_strCaption : m_pAction ? m_pAction->GetCaption() : _T("");
}
AFX_INLINE void CXTPControl::SetParameter(LPCTSTR lpszParameter) {
	m_strParameter = lpszParameter;
}
AFX_INLINE CString CXTPControl::GetParameter() const {
	return m_strParameter;
}
AFX_INLINE int CXTPControl::GetID () const {
	return m_nId;
}
AFX_INLINE void CXTPControl::SetIconId(int nId) {
	if (m_nIconId != nId) {m_nIconId = nId; RedrawParent(FALSE);}
}
AFX_INLINE int CXTPControl::GetIconId() const {
	return m_nCustomIconId != 0 ? m_nCustomIconId : m_nIconId > 0 ? m_nIconId : m_pAction ? m_pAction->GetIconId() : m_nId;
}
AFX_INLINE void CXTPControl::SetHelpId(int nId) {
	m_nHelpId = nId;
}
AFX_INLINE int CXTPControl::GetHelpId() const {
	return m_nHelpId > 0 ? m_nHelpId : m_pAction ? m_pAction->GetHelpId() : m_nId;
}
AFX_INLINE void CXTPControl::SetBeginGroup(BOOL bBeginGroup) {
	if (m_bBeginGroup != bBeginGroup) {m_bBeginGroup = bBeginGroup; DelayLayoutParent();}
}
AFX_INLINE BOOL CXTPControl::GetBeginGroup() const {
	return m_bBeginGroup;
}
AFX_INLINE void CXTPControl::OnEnabledChanged() {

}
AFX_INLINE void CXTPControl::SetEnabled(BOOL bEnabled) {
	if (m_bEnabled != bEnabled) {m_bEnabled = bEnabled; OnEnabledChanged(); RedrawParent();}
}
AFX_INLINE BOOL CXTPControl::GetChecked() const {
	return m_bChecked == -1 && m_pAction ? m_pAction->GetChecked() : m_bChecked;
}
AFX_INLINE void CXTPControl::SetChecked(BOOL bChecked) {
	if (m_bChecked != bChecked) {m_bChecked = bChecked; RedrawParent();}
}
AFX_INLINE int CXTPControl::GetSelected() const {
	return m_bSelected;
}
AFX_INLINE BOOL CXTPControl::GetPressed() const {
	return m_bPressed;
}
AFX_INLINE void CXTPControl::SetPressed(BOOL bPressed) {
	m_bPressed = bPressed;
}
AFX_INLINE void CXTPControl::SetRect(CRect rcControl) {
	m_rcControl = rcControl;
}
AFX_INLINE CRect CXTPControl::GetRect() const {
	return m_rcControl;
}
AFX_INLINE CXTPCommandBar* CXTPControl::GetParent() const {
	return m_pParent;
}
AFX_INLINE BOOL CXTPControl::IsVisible(DWORD dwSkipFlags) const {
	if (m_pAction && !m_pAction->IsVisible()) return FALSE;
	return (m_dwHideFlags & ~dwSkipFlags) == xtpNoHide;
}
AFX_INLINE void CXTPControl::SetHideFlags(DWORD dwFlags) {
	m_dwHideFlags = dwFlags;
}
AFX_INLINE BOOL CXTPControl::SetHideFlag(XTPControlHideFlags dwFlag, BOOL bHide) {
	DWORD dwHideFlags = m_dwHideFlags;
	if (bHide) SetHideFlags (m_dwHideFlags | dwFlag); else SetHideFlags(m_dwHideFlags & ~dwFlag);
	return dwHideFlags != m_dwHideFlags;
}

AFX_INLINE void CXTPControl::SetHideWrap(BOOL bHide) {
	SetHideFlag(xtpHideWrap, bHide);
}
AFX_INLINE DWORD CXTPControl::GetHideFlags() const {
	return m_dwHideFlags;
}
AFX_INLINE CRect CXTPControl::GetRowRect() const {
	return m_rcRow;
}
AFX_INLINE void CXTPControl::SetRowRect(CRect rcRow) {
	m_rcRow = rcRow;
}
AFX_INLINE BOOL CXTPControl::GetWrap() const {
	return m_bWrap;
}
AFX_INLINE void CXTPControl::SetWrap(BOOL bWrap) {
	m_bWrap = bWrap;
}
AFX_INLINE CXTPControls* CXTPControl::GetControls() const {
	return m_pControls;
}

AFX_INLINE BOOL CXTPControl::IsTemporary() const {
	return m_bTemporary;
}
AFX_INLINE XTPControlType CXTPControl::GetType() const {
	return m_controlType;
}
AFX_INLINE BOOL CXTPControl::GetExpanded() const {
	return m_bExpanded;
}
AFX_INLINE void CXTPControl::SetCategory(LPCTSTR lpszCategory) {
	m_strCategory = lpszCategory;
}
AFX_INLINE CString CXTPControl::GetCategory() const {
	return !m_strCategory.IsEmpty() ? m_strCategory : m_pAction ? m_pAction->GetCategory() : _T("");
}
AFX_INLINE void CXTPControl::SetTag(DWORD_PTR dwTag) {
	m_nTag = dwTag;
}
AFX_INLINE DWORD_PTR CXTPControl::GetTag() const {
	return m_nTag;
}
AFX_INLINE void CXTPControl::AssignDocTemplate(UINT nIDResource) {
	m_mapDocTemplatesAssigned.SetAt(nIDResource, TRUE);
}
AFX_INLINE void CXTPControl::ExcludeDocTemplate(UINT nIDResource) {
	m_mapDocTemplatesExcluded.SetAt(nIDResource, TRUE);
}
AFX_INLINE void CXTPControl::OnClick(BOOL /*bKeyboard = FALSE*/, CPoint /*pt = CPoint(0, 0)*/) {
}
AFX_INLINE void CXTPControl::SetStyle(XTPButtonStyle buttonStyle) {
	if (m_buttonStyle != buttonStyle)
	{
		m_buttonStyle = buttonStyle;
		DelayLayoutParent();
	}
}
AFX_INLINE CXTPCommandBar* CXTPControl::GetCommandBar() const {
	return NULL;
}
AFX_INLINE void CXTPControl::SetCloseSubMenuOnClick(BOOL bCloseOnClick) {
	m_bCloseSubMenuOnClick = bCloseOnClick;
}

AFX_INLINE BOOL CXTPControl::GetCloseSubMenuOnClick() const {
	return m_bCloseSubMenuOnClick;
}
AFX_INLINE int CXTPControl::GetCustomizeMinWidth() const {
	return 0;
}
AFX_INLINE int CXTPControl::GetCustomizeMinHeight() const {
	return 0;
}
AFX_INLINE void CXTPControl::SetWidth(int nWidth) {
	if (m_nWidth != nWidth) {
		m_nWidth = nWidth;
		DelayLayoutParent();
	}
}
AFX_INLINE void CXTPControl::SetHeight(int nHeight) {
	if (m_nHeight != nHeight) {
		m_nHeight = nHeight;
		DelayLayoutParent();
	}
}
AFX_INLINE BOOL CXTPControl::OnHookKeyDown(UINT /*nChar*/, LPARAM /*lParam*/) {
	return FALSE;
}
AFX_INLINE BOOL CXTPControl::OnSetPopup(BOOL /*bPopup*/) {
	return FALSE;
}
AFX_INLINE void CXTPControl::OnLButtonUp(CPoint /*point*/) {
}
AFX_INLINE BOOL CXTPControl::OnRButtonDown(CPoint /*point*/) {
	return FALSE;
}
AFX_INLINE BOOL CXTPControl::OnRButtonUp(CPoint /*point*/) {
	return FALSE;
}
AFX_INLINE void CXTPControl::OnMouseMove(CPoint /*point*/) {
}
AFX_INLINE BOOL CXTPControl::IsFocusable() const {
	return FALSE;
}
AFX_INLINE void CXTPControl::SetFocused(BOOL /*bFocused*/) {
}
AFX_INLINE BOOL CXTPControl::IsFocused() const{
	return FALSE;
}
AFX_INLINE void CXTPControl::OnCalcDynamicSize(DWORD /*dwMode*/) {
}

AFX_INLINE CXTPRibbonGroup* CXTPControl::GetRibbonGroup() const {
	return m_pRibbonGroup;
}
AFX_INLINE BOOL CXTPControl::OnHookMouseWheel(UINT /*nFlags*/, short /*zDelta*/, CPoint /*pt*/) {
	return FALSE;
}
AFX_INLINE BOOL CXTPControl::GetPopuped() const {
	return FALSE;
}
AFX_INLINE void CXTPControl::OnIdleUpdate() {

}
AFX_INLINE CXTPControlAction* CXTPControl::GetAction() const {
	return m_pAction;
}
AFX_INLINE void CXTPControl::OnThemeChanged() {

}
AFX_INLINE int CXTPControl::GetWidth() const {
	return m_nWidth;
}
AFX_INLINE int CXTPControl::GetHeight() const {
	return m_nHeight;
}
AFX_INLINE void CXTPControl::OnActionChanging(int /*nProperty*/) {

}
AFX_INLINE void CXTPControl::SetExecuteOnPressInterval(int nExecuteOnPressInterval) {
	m_nExecuteOnPressInterval = nExecuteOnPressInterval;
}
AFX_INLINE int CXTPControl::GetExecuteOnPressInterval() const {
	return m_nExecuteOnPressInterval;
}
AFX_INLINE void CXTPControl::SetKeyboardTip(LPCTSTR lpszKeyboardTip) {
	m_strKeyboardTip = lpszKeyboardTip;
}
AFX_INLINE CString CXTPControl::GetKeyboardTip() const {
	return !m_strKeyboardTip.IsEmpty() ? m_strKeyboardTip : m_pAction ? m_pAction->GetKeyboardTip() : _T("");
}
AFX_INLINE INT_PTR CXTPControl::OnToolHitTest(CPoint /*point*/, TOOLINFO* /*pTI*/) const {
	return -1;
}
AFX_INLINE void CXTPControl::SetIconSize(CSize szIcon) {
	m_szIcon = szIcon; RedrawParent(FALSE);
}
AFX_INLINE void CXTPControl::OnCaptionChanged() {

}

#endif // #if !defined(__XTPCONTROL_H__)
