// XTPRibbonTab.cpp: implementation of the CXTPRibbonTab class.
//
// This file is a part of the XTREME RIBBON MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "Common/XTPPropExchange.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPHookManager.h"

#include "TabManager/XTPTabManager.h"

#include "CommandBars/XTPCommandBarsDefines.h"
#include "CommandBars/XTPCommandBar.h"
#include "CommandBars/XTPToolBar.h"
#include "CommandBars/XTPMenuBar.h"
#include "CommandBars/XTPPopupBar.h"
#include "CommandBars/XTPControl.h"
#include "CommandBars/XTPControlButton.h"
#include "CommandBars/XTPControlPopup.h"


#include "XTPRibbonTab.h"
#include "XTPRibbonGroup.h"
#include "XTPRibbonGroups.h"
#include "XTPRibbonPopups.h"
#include "XTPRibbonBar.h"
#include "XTPRibbonControlTab.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


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

CXTPRibbonTabContextHeader::CXTPRibbonTabContextHeader(CXTPRibbonTab* pFirstTab)
{
	ASSERT(pFirstTab);
	if (!pFirstTab)
		return;
	m_pLastTab = m_pFirstTab = pFirstTab;
	m_color = pFirstTab->GetContextColor();
	m_strCaption = pFirstTab->GetContextCaption();
	m_rcRect.SetRectEmpty();
	pFirstTab->m_pContextHeader = this;
}

CXTPRibbonTabContextHeaders::CXTPRibbonTabContextHeaders()
{

}

CXTPRibbonTabContextHeaders::~CXTPRibbonTabContextHeaders()
{
	RemoveAll();
}
int CXTPRibbonTabContextHeaders::GetCount() const
{
	return (int)m_arrHeaders.GetSize();
}

CXTPRibbonTabContextHeader* CXTPRibbonTabContextHeaders::GetHeader(int nIndex) const
{
	return m_arrHeaders.GetAt(nIndex);
}

void CXTPRibbonTabContextHeaders::RemoveAll()
{
	for (int i = 0; i < GetCount(); i++)
	{
		delete m_arrHeaders[i];
	}
	m_arrHeaders.RemoveAll();
}

CXTPRibbonTabContextHeader* CXTPRibbonTabContextHeaders::HitTest(CPoint pt) const
{
	for (int i = 0; i < GetCount(); i++)
	{
		if (m_arrHeaders[i]->m_rcRect.PtInRect(pt))
			return m_arrHeaders[i];
	}
	return NULL;
}

void CXTPRibbonTabContextHeaders::Add(CXTPRibbonTabContextHeader* pHeader)
{
	m_arrHeaders.Add(pHeader);
}

IMPLEMENT_SERIAL(CXTPRibbonTab, CXTPTabManagerItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CXTPRibbonTab::CXTPRibbonTab()
{
	m_nId = 0;

	m_pGroups = new CXTPRibbonGroups;
	m_pGroups->m_pParentTab = this;

	m_nContextColor = xtpRibbonTabContextColorNone;

	m_pContextHeader = NULL;
	m_pRibbonBar = NULL;
	m_pParent = NULL;
}

CXTPRibbonTab::~CXTPRibbonTab()
{
	ASSERT(m_pGroups->GetCount() == 0);

	CMDTARGET_RELEASE(m_pGroups);
}

void CXTPRibbonTab::Copy(CXTPRibbonTab* pRibbonTab)
{
	m_strCaption = pRibbonTab->m_strCaption;
	m_nContextColor = pRibbonTab->m_nContextColor;
	m_strContextCaption= pRibbonTab->m_strContextCaption;
	m_nId = pRibbonTab->m_nId;
	m_bVisible = pRibbonTab->m_bVisible;
	m_strToolTip = pRibbonTab->m_strToolTip;

	if (m_pTabManager && pRibbonTab->IsSelected())
	{
		Select();
	}

	m_pGroups->Copy(pRibbonTab->m_pGroups);
}

void CXTPRibbonTab::OnRemoved()
{
	m_pGroups->RemoveAll();
}

CXTPRibbonBar* CXTPRibbonTab::GetRibbonBar() const
{
	return m_pRibbonBar;
}

CXTPRibbonGroup* CXTPRibbonTab::AddGroup(LPCTSTR lpszCaption)
{
	return GetGroups()->Add(lpszCaption);
}

CXTPRibbonGroup* CXTPRibbonTab::AddGroup(int nID)
{
	CString strCaption;
	if (!strCaption.LoadString(nID))
	{
	}

	if (strCaption.Find('\n') != -1)
	{
		CString strPrompt = strCaption;
		AfxExtractSubString(strCaption, strPrompt, 1);
	}

	return GetGroups()->Add(strCaption, nID);
}

void CXTPRibbonTab::SetVisible(BOOL bVisible)
{
	if (bVisible == IsVisible())
		return;

	CXTPTabManagerItem::SetVisible(bVisible);

	if (!bVisible && IsSelected())
	{
		CXTPTabManagerItem* pItem = GetTabManager()->FindNextFocusable(-1, +1);
		if (pItem)
		{
			pItem->Select();
		}
	}
}

CXTPRibbonGroup* CXTPRibbonTab::FindGroup(int nID) const
{
	for (int i = 0 ; i < m_pGroups->GetCount(); i++)
	{
		if (m_pGroups->GetAt(i)->GetID() == nID)
			return m_pGroups->GetAt(i);
	}
	return NULL;
}

void CXTPRibbonTab::DoPropExchange(CXTPPropExchange* pPX)
{
	if (pPX->IsLoading())
	{
		CXTPRibbonControlTab* pControlTab = ((CXTPRibbonControlTab*)pPX->m_pOwner);
		m_pRibbonBar = DYNAMIC_DOWNCAST(CXTPRibbonBar, pControlTab->GetParent());
		m_pTabManager = pControlTab;
		m_pParent = m_pRibbonBar;
	}

	PX_String(pPX, _T("Caption"), m_strCaption, _T(""));
	PX_String(pPX, _T("ToolTip"), m_strToolTip, _T(""));
	PX_Enum(pPX, _T("ContextColor"), m_nContextColor, xtpRibbonTabContextColorNone);
	PX_String(pPX, _T("ContextCaption"), m_strContextCaption, _T(""));
	PX_Int(pPX, _T("Id"), m_nId, 0);
	PX_Bool(pPX, _T("Visible"), m_bVisible, TRUE);

	if (pPX->IsStoring())
	{
		BOOL bSelected = IsSelected();
		PX_Bool(pPX, _T("Selected"), bSelected, FALSE);
	}
	else
	{
		BOOL bSelected = FALSE;
		PX_Bool(pPX, _T("Selected"), bSelected, 0);
		if (bSelected)
		{
			Select();
		}
	}


	CXTPPropExchangeSection secGroups(pPX->GetSection(_T("Groups")));
	m_pGroups->DoPropExchange(&secGroups);
}

BOOL CXTPRibbonTab::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	if (nCode == CN_EVENT && nID == XTP_CN_REDRAWPARENT)
	{
		GetRibbonBar()->Redraw(0, FALSE);
		return TRUE;
	}
	return CCmdTarget::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}