// XTPRibbonTab.h: interface for the CXTPRibbonTab class.
//
// This file is a part of the XTREME RIBBON 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(__XTPRIBBONTAB_H__)
#define __XTPRIBBONTAB_H__
//}}AFX_CODEJOCK_PRIVATE

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

class CXTPRibbonGroups;
class CXTPRibbonBar;
class CXTPRibbonGroup;
class CXTPRibbonTab;
class CXTPCommandBar;
class CXTPPropExchange;

#include "TabManager/XTPTabManager.h"


//-----------------------------------------------------------------------
// Summary:
//     Ribbon Tab context color
// Example:
// <code>
// pTab = pRibbonBar->AddTab(ID_TAB_CHARTFORMAT);
// pTab->SetContextTab(xtpRibbonTabContextColorGreen, ID_TAB_CONTEXTCHART);
// </code>
// See Also:
//     CXTPRibbonTab, CXTPRibbonTab::SetContextColor
//-----------------------------------------------------------------------
enum XTPRibbonTabContextColor
{
	xtpRibbonTabContextColorNone,           // Default color
	xtpRibbonTabContextColorBlue,           // Blue context color
	xtpRibbonTabContextColorYellow,         // Yellow context color
	xtpRibbonTabContextColorGreen,          // Green context color
	xtpRibbonTabContextColorRed,            // Red context color
	xtpRibbonTabContextColorPurple,         // Purple context color
	xtpRibbonTabContextColorCyan,           // Cyan context color
	xtpRibbonTabContextColorOrange          // Orange context color
};


//{{AFX_CODEJOCK_PRIVATE

// Context headers internal classes

class _XTP_EXT_CLASS CXTPRibbonTabContextHeader
{
public:
	CXTPRibbonTabContextHeader(CXTPRibbonTab* pFirstTab);

public:
	CXTPRibbonTab* m_pFirstTab;
	CXTPRibbonTab* m_pLastTab;
	CString m_strCaption;
	XTPRibbonTabContextColor m_color;
	CRect m_rcRect;
};


class _XTP_EXT_CLASS CXTPRibbonTabContextHeaders
{
public:
	CXTPRibbonTabContextHeaders();
	~CXTPRibbonTabContextHeaders();
public:
	void RemoveAll();
	int GetCount() const;
	void Add(CXTPRibbonTabContextHeader* pHeader);
	CXTPRibbonTabContextHeader* GetHeader(int nIndex) const;
	CXTPRibbonTabContextHeader* HitTest(CPoint pt) const;

protected:
	CArray<CXTPRibbonTabContextHeader*, CXTPRibbonTabContextHeader*> m_arrHeaders;
};
//}}AFX_CODEJOCK_PRIVATE


//===========================================================================
// Summary:
//     Represents a tab in the Ribbon Bar.
// Remarks:
//     Tabs in the Ribbon Bar are used to display different groups of items.
//     The CXTPRibbonBar.InsertTab method adds a new CXTPRibbonTab object to
//     the tabs collection of the Ribbon Bar.
//
//     Tabs in the Ribbon Bar contain one or more CXTPRibbonGroup objects.
//     Buttons, Popups, etc can then be added to the groups.
//
//     The CXTPRibbonBar::GetTabCount property can be used to determine the total number of
//     tabs that have been added.
// See Also: CXTPRibbonBar.InsertTab, CXTPRibbonBar::GetTabCount, CXTPRibbonBar::GetTab
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonTab : public CXTPTabManagerItem
{
	DECLARE_SERIAL(CXTPRibbonTab)
public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonTab object
	//-----------------------------------------------------------------------
	CXTPRibbonTab();

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

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Collection of CXTPRibbonGroup objects that have been added to
	//     the CXTPRibbonTab.
	// Remarks:
	//     A CXTPRibbonGroup is used to hold buttons, popups, edit controls,
	//     combo box controls, etc.  The group organizes the different
	//     types of controls in a CXTPRibbonTab so it is easy to see what functionality
	//     the controls should perform.  Groups are added to the
	//     Group collection using the AddGroup and InsertGroup methods.
	//     Groups are displayed in the order they are added.  This means
	//     the group with an Index of zero (0) will be displayed first to
	//     the far left, then to the immediate right will be the group
	//     with an Index of one (1), etc...
	//
	// Returns:
	//     Collection of CXTPRibbonGroup objects that have been added to
	//     the CXTPRibbonTab
	// See Also: CXTPRibbonGroups::GetAt, CXTPRibbonGroups::InsertAt, CXTPRibbonGroups::Add, CXTPRibbonGroups.GetCount
	//-----------------------------------------------------------------------
	CXTPRibbonGroups* GetGroups() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     The CXTPRibbonBar object the CXTPRibbonTab belongs to.
	// Returns:
	//     A pointer to the CXTPRibbonBar object the CXTPRibbonTab belongs to.
	//     This is the RibbonBar that the tab is displayed in.
	// See Also: CXTPRibbonBar
	//-----------------------------------------------------------------------
	CXTPRibbonBar* GetRibbonBar() const;

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

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to copy the tab.
	// Parameters:
	//     pRibbonTab   - Points to a source CXTPRibbonTab object
	//----------------------------------------------------------------------
	virtual void Copy(CXTPRibbonTab* pRibbonTab);

	//-----------------------------------------------------------------------
	// Summary:
	//     Adds a CXTPRibbonGroup to a CXTPRibbonTab.
	// Parameters:
	//     lpszCaption - Text to display in the group's title bar.
	//                   This in the group's caption.
	//     nID         - Identifier of group
	// Returns:
	//     Reference to the CXTPRibbonGroup object added to the CXTPRibbonTab's
	//     Groups Collection (CXTPRibbonTab::GetGroups).
	// See Also: CXTPRibbonGroup::SetCaption, CXTPRibbonGroup::SetCaption, CXTPRibbonTab, CXTPRibbonTab::GetGroups
	//-----------------------------------------------------------------------
	CXTPRibbonGroup* AddGroup(LPCTSTR lpszCaption);
	CXTPRibbonGroup* AddGroup(int nID); // <combine CXTPRibbonTab::AddGroup@LPCTSTR>

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to find group by its identifier
	// Parameters:
	//     nId - Identifier of group to be found
	// Returns:
	//     Pointer to CXTPRibbonGroup object with specified identifier
	// See Also: FindTab
	//-----------------------------------------------------------------------
	CXTPRibbonGroup* FindGroup(int nId) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to get tab color
	// Returns:
	//     XTPRibbonTabContextColor enumerator.
	// See Also: XTPRibbonTabContextColor
	//-----------------------------------------------------------------------
	XTPRibbonTabContextColor GetContextColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set tab color
	// Parameters:
	//     color - XTPRibbonTabContextColor enumerator.
	// See Also: XTPRibbonTabContextColor
	//-----------------------------------------------------------------------
	void SetContextColor(XTPRibbonTabContextColor color);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to get context tab header text
	// Returns:
	//     Context header text
	// See Also: SetContextCaption, SetContextColor
	//-----------------------------------------------------------------------
	CString GetContextCaption() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set context tab header text
	// Parameters:
	//     lpszContextCaption - new text to be set
	// See Also: GetContextCaption
	//-----------------------------------------------------------------------
	void SetContextCaption(LPCTSTR lpszContextCaption);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set context tab color and text
	// Parameters:
	//     color - Color to be set
	//     nContextID - Caption string identifier
	//     lpszContextCaption - Caption string
	// See Also: GetContextCaption, GetContextColor
	//-----------------------------------------------------------------------
	void SetContextTab(XTPRibbonTabContextColor color, int nContextID);
	void SetContextTab(XTPRibbonTabContextColor color, LPCTSTR lpszContextCaption = NULL); // <combine CXTPRibbonTab::SetContextTab@XTPRibbonTabContextColor@int>

	//-----------------------------------------------------------------------
	// Summary:
	//     Gets the tab's Id.
	// Remarks:
	//     The Id is used to identify the tab.
	// Returns:
	//     Integer containing the tab's identifier.
	// See Also: SetID
	//-----------------------------------------------------------------------
	int GetID() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set Identifier for the tab
	// Parameters:
	//     nId - The Id is used to identify the tab.
	// See Also: GetID
	//-----------------------------------------------------------------------
	void SetID(int nId);

	//-----------------------------------------------------------------------
	// Summary:
	//     Retrieve CXTPRibbonTabContextHeader pointer associated with the tab
	// Parameters:
	//     nId - The Id is used to identify the tab.
	// See Also: GetID
	//-----------------------------------------------------------------------
	CXTPRibbonTabContextHeader* GetContextHeader() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to hide or show the tab.
	// Parameters: bVisible - TRUE to show the tab, FALSE to hide the tab.
	// See Also: IsVisible
	//-----------------------------------------------------------------------
	virtual void SetVisible(BOOL bVisible);

	//-----------------------------------------------------------------------
	// 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:
	//     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;

protected:
	//-------------------------------------------------------------------------
	// Summary:
	//     This method is called before removing tab from Ribbon Tabs collection
	//-------------------------------------------------------------------------
	void OnRemoved();

	//-----------------------------------------------------------------------
	// Summary:
	//     Called by the framework to route and dispatch command messages
	//     and to handle the update of command user-interface objects.
	// Parameters:
	//     nID          - Contains the command ID.
	//     nCode        - Identifies the command notification code.
	//     pExtra       - Used according to the value of nCode.
	//     pHandlerInfo - If not NULL, OnCmdMsg fills in the pTarget and
	//                    pmf members of the pHandlerInfo structure instead
	//                    of dispatching the command. Typically, this parameter
	//                    should be NULL.
	// Returns:
	//     Nonzero if the message is handled; otherwise 0.
	//-----------------------------------------------------------------------
	BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);


protected:
	CXTPRibbonGroups* m_pGroups;            // Collection of CXTPRibbonGroup objects that have been added to
	                                        // the CXTPRibbonTab.
	CXTPRibbonBar* m_pRibbonBar;            // The CXTPRibbonBar object the CXTPRibbonTab belongs to.

	CXTPCommandBar* m_pParent;              // This is the RibbonBar that the tab is displayed in.
	int m_nId;                              // Identifier of the tab.
	XTPRibbonTabContextColor m_nContextColor;       // Context color
	CString m_strContextCaption;                    // Context caption
	CXTPRibbonTabContextHeader* m_pContextHeader;   // Context header
	CString m_strKeyboardTip;               // Keyboard tip

	friend class CXTPRibbonBar;
	friend class CXTPRibbonTabContextHeader;
	friend class CXTPRibbonTabPopupToolBar;
	friend class CXTPRibbonControlTab;
};

AFX_INLINE void CXTPRibbonTab::SetKeyboardTip(LPCTSTR lpszKeyboardTip) {
	m_strKeyboardTip = lpszKeyboardTip;
}
AFX_INLINE CString CXTPRibbonTab::GetKeyboardTip() const {
	return m_strKeyboardTip;
}

AFX_INLINE CXTPRibbonGroups* CXTPRibbonTab::GetGroups() const {
	return m_pGroups;
}
AFX_INLINE void CXTPRibbonTab::SetContextTab(XTPRibbonTabContextColor color, LPCTSTR lpszContextCaption) {
	m_nContextColor = color;
	m_strContextCaption = lpszContextCaption;
}
AFX_INLINE void CXTPRibbonTab::SetContextTab(XTPRibbonTabContextColor color, int nID) {
	m_nContextColor = color;
	if (nID != 0) VERIFY(m_strContextCaption.LoadString(nID));
}
AFX_INLINE int CXTPRibbonTab::GetID() const {
	return m_nId;
}
AFX_INLINE void CXTPRibbonTab::SetID(int nID) {
	m_nId = nID;
}
AFX_INLINE CString CXTPRibbonTab::GetContextCaption() const {
	return m_strContextCaption;
}
AFX_INLINE XTPRibbonTabContextColor CXTPRibbonTab::GetContextColor() const {
	return m_nContextColor;
}
AFX_INLINE void CXTPRibbonTab::SetContextColor(XTPRibbonTabContextColor color) {
	m_nContextColor = color;
}
AFX_INLINE void CXTPRibbonTab::SetContextCaption(LPCTSTR lpszContextCaption) {
	m_strContextCaption = lpszContextCaption;
}
AFX_INLINE CXTPRibbonTabContextHeader* CXTPRibbonTab::GetContextHeader() const {
	return m_pContextHeader;
}
AFX_INLINE CXTPCommandBar* CXTPRibbonTab::GetParent() const {
	return m_pParent;
}

#endif // !defined(__XTPRIBBONTAB_H__)
