// XTPRibbonPopups.cpp : implementation file
//
// 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/XTPToolTipContext.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPHookManager.h"
#include "Common/XTPColorManager.h"
#include "Common/XTPDrawHelpers.h"

#include "TabManager/XTPTabManager.h"

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

#include "CommandBars/XTPPaintManager.h"

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

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

#define IDSYS_SCROLL 17821


class CXTPRibbonScrollableBar::CControlGroupsScroll : public CXTPControlButton
{
public:
	CControlGroupsScroll(BOOL bScrollLeft)
	{
		SetFlags(xtpFlagSkipFocus | xtpFlagNoMovable);
		m_bScrollLeft = bScrollLeft;
	}

	void Draw(CDC* pDC)
	{
		GetParent()->GetPaintManager()->GetRibbonPaintManager()->DrawRibbonScrollButton(pDC, this, m_bScrollLeft);
	}

	BOOL IsCustomizeMovable() const
	{
		return FALSE;
	}

	void OnLButtonDown(CPoint point)
	{
		OnClick(FALSE, point);
	}

	virtual void OnClick(BOOL /*bKeyboard  = FALSE */, CPoint /*pt  = CPoint */)
	{
		if (GetKeyState(VK_LBUTTON) >= 0)
			return;

		m_bPressed = TRUE;

		CXTPRibbonScrollableBar* pScrollableBar = GetScrollableBar(m_pParent);

		pScrollableBar->OnGroupsScroll(m_bScrollLeft);

		int cmsTimer = GetDoubleClickTime() * 4 / 5;
		m_pParent->SetTimer(IDSYS_SCROLL, cmsTimer, NULL);
		BOOL bFirst = TRUE;

		m_pParent->SetCapture();

		while (::GetCapture() == m_pParent->GetSafeHwnd() && IsVisible())
		{
			MSG msg;

			if (!::GetMessage(&msg, NULL, 0, 0))
			{
				AfxPostQuitMessage((int)msg.wParam);
				break;
			}

			if (msg.message == WM_TIMER && msg.wParam == IDSYS_SCROLL)
			{
				pScrollableBar->OnGroupsScroll(m_bScrollLeft);

				if (bFirst)
				{
					cmsTimer = GetDoubleClickTime() / 10;
					m_pParent->SetTimer(IDSYS_SCROLL, cmsTimer, NULL);
				}
				bFirst = FALSE;
			}
			else if (msg.message == WM_LBUTTONUP)
			{
				break;
			}
			else
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}

		ReleaseCapture();
		m_pParent->KillTimer(IDSYS_SCROLL);

		m_bPressed = FALSE;
		if (!IsVisible()) m_bSelected = FALSE;
		RedrawParent(FALSE);
	}

protected:
	BOOL m_bScrollLeft;
};

CXTPRibbonBarMorePopupToolBar::CXTPRibbonBarMorePopupToolBar(CXTPRibbonBar* pRibbonBar)
{
	m_bTrackOnHover = FALSE;
	m_rcBorders = CRect(3, 3, 3, 3);
	m_pRibbonBar = pRibbonBar;
}

IMPLEMENT_DYNAMIC(CXTPRibbonBarMorePopupToolBar, CXTPPopupToolBar)

void CXTPRibbonBarMorePopupToolBar::FillCommandBarEntry(CDC* pDC)
{
	CXTPRibbonPaintManager* pPaintManager = GetPaintManager()->GetRibbonPaintManager();
	pPaintManager->FillMorePopupToolBarEntry(pDC, this);
}

CSize CXTPRibbonBarMorePopupToolBar::GetIconSize() const
{
	return m_pRibbonBar->GetIconSize();
}
CSize CXTPRibbonBarMorePopupToolBar::GetButtonSize() const
{
	return m_pRibbonBar->GetButtonSize();
}

CXTPRibbonScrollableBar::CXTPRibbonScrollableBar()
{
	m_pParent = NULL;
	m_pControlScrollGroupsLeft = NULL;
	m_pControlScrollGroupsRight = NULL;
	m_pHighlightedGroup = NULL;

	m_nGroupsScrollPos = 0;
}

void CXTPRibbonScrollableBar::InitScrollableBar(CXTPCommandBar* pParent)
{
	m_pControlScrollGroupsRight = pParent->GetControls()->Add(new CControlGroupsScroll(FALSE));
	m_pControlScrollGroupsLeft = pParent->GetControls()->Add(new CControlGroupsScroll(TRUE));
	m_nGroupsScrollPos = 0;
	m_pParent = pParent;
}

void CXTPRibbonScrollableBar::ShowScrollableRect(CXTPRibbonGroups* pGroups, CRect rc)
{
	int nGroupsScrollPos = pGroups->GetScrollPos();
	CRect rcGroups(GetGroupsRect());

	if (rc.left < 12 && m_pControlScrollGroupsLeft->IsVisible())
	{
		nGroupsScrollPos = nGroupsScrollPos + rc.left - 12;
		if (nGroupsScrollPos < 0) nGroupsScrollPos = 0;
	}
	else if (rc.right > rcGroups.right && m_pControlScrollGroupsRight->IsVisible())
	{
		nGroupsScrollPos = nGroupsScrollPos + rc.right - rcGroups.Width() + 12;
		if (nGroupsScrollPos < 0) nGroupsScrollPos = 0;
	}

	if (nGroupsScrollPos != m_nGroupsScrollPos)
	{
		m_nGroupsScrollPos = nGroupsScrollPos;
		pGroups->GetParentTab()->GetParent()->OnRecalcLayout();
	}
}

void CXTPRibbonScrollableBar::EnableGroupsScroll(BOOL bScrollLeft, BOOL bScrollRight)
{
	ASSERT(m_pControlScrollGroupsRight);
	ASSERT(m_pControlScrollGroupsLeft);
	if (!m_pControlScrollGroupsRight || !m_pControlScrollGroupsLeft)
		return;

	CRect rcGroups(GetGroupsRect());

	if (bScrollLeft)
	{
		m_pControlScrollGroupsLeft->SetHideFlag(xtpHideScroll, FALSE);
		m_pControlScrollGroupsLeft->SetRect(CRect(rcGroups.left - 1, rcGroups.top, rcGroups.left + 12, rcGroups.bottom));
	}
	else
	{
		m_pControlScrollGroupsLeft->SetHideFlag(xtpHideScroll, TRUE);
	}

	if (bScrollRight)
	{
		m_pControlScrollGroupsRight->SetHideFlag(xtpHideScroll, FALSE);
		m_pControlScrollGroupsRight->SetRect(CRect(rcGroups.right - 12, rcGroups.top, rcGroups.right + 1, rcGroups.bottom));
	}
	else
	{
		m_pControlScrollGroupsRight->SetHideFlag(xtpHideScroll, TRUE);
	}
}



//////////////////////////////////////////////////////////////////////////
// CXTPRibbonTabPopupToolBar

CXTPRibbonTabPopupToolBar::CXTPRibbonTabPopupToolBar(CXTPRibbonTab* pRibbonTab)
{

	InitScrollableBar(this);

	m_pRibbonBar = pRibbonTab->GetRibbonBar();
	m_pRibbonTab = (CXTPRibbonTab*)pRibbonTab->GetRuntimeClass()->CreateObject();

	m_pRibbonTab->m_pParent = this;
	m_pRibbonTab->m_pRibbonBar = m_pRibbonBar;

	m_pRibbonTab->Copy(pRibbonTab);

	m_pRibbonTab->SetRect(pRibbonTab->GetRect());

	m_bTrackOnHover = FALSE;
	SetFlags(xtpFlagSmartLayout);

	EnableAnimation(m_pRibbonBar->IsAnimationEnabled());
}

CXTPRibbonTabPopupToolBar::~CXTPRibbonTabPopupToolBar()
{
	m_pRibbonTab->OnRemoved();
	m_pRibbonTab->InternalRelease();
}

CRect CXTPRibbonTabPopupToolBar::GetGroupsRect() const
{
	return m_rcGroups;
}

void CXTPRibbonTabPopupToolBar::OnGroupsScroll(BOOL bScrollLeft)
{
	int nGroupsScrollPos = m_pRibbonTab->GetGroups()->GetScrollPos();

	SetPopuped(-1);
	HideKeyboardTips();

	if (bScrollLeft)
	{
		nGroupsScrollPos -= 40;
		if (nGroupsScrollPos < 0)
			nGroupsScrollPos = 0;
	}
	else
	{
		nGroupsScrollPos += 40;
	}

	if (nGroupsScrollPos != m_nGroupsScrollPos)
	{
		m_nGroupsScrollPos = nGroupsScrollPos;
		OnRecalcLayout();
	}
}

void CXTPRibbonTabPopupToolBar::EnsureVisible(CXTPControl* pControl)
{
	if (pControl->GetRibbonGroup() &&
		(m_pControlScrollGroupsLeft->IsVisible() || m_pControlScrollGroupsRight->IsVisible()))
	{
		ShowScrollableRect(m_pRibbonTab->GetGroups(), pControl->GetRect());
	}
}

void CXTPRibbonTabPopupToolBar::CreateKeyboardTips()
{
	CreateGroupKeyboardTips(m_pRibbonTab);
}

CSize CXTPRibbonTabPopupToolBar::CalcDynamicLayout(int, DWORD /*nMode*/)
{
	CRect rcRibbonBar;
	m_pRibbonBar->GetWindowRect(rcRibbonBar);

	CRect rcRibbonTab = m_pRibbonTab->GetRect();
	m_pRibbonBar->ClientToScreen(rcRibbonTab);

	CRect rcWork = XTPMultiMonitor()->GetWorkArea(rcRibbonTab);

	int nHeight = m_pRibbonBar->CalcGroupsHeight();
	int nWidth = rcRibbonBar.Width();

	m_ptPopup.y = m_rcExclude.bottom;
	m_ptPopup.x = rcRibbonBar.left;

	if (m_ptPopup.x < rcWork.left)
	{
		nWidth -= rcWork.left - m_ptPopup.x;
		m_ptPopup.x = rcWork.left;
	}

	if (m_ptPopup.x + nWidth > rcWork.right)
	{
		nWidth = rcWork.right - m_ptPopup.x - 4;
	}

	if (m_ptPopup.y + nHeight > rcWork.bottom)
	{
		m_ptPopup.y = m_rcExclude.top - nHeight;
	}

	CClientDC dc(this);
	CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));

	UpdateShortcuts();

	m_rcGroups.SetRect(0, 0, nWidth, nHeight);
	m_pRibbonTab->GetGroups()->CalcDynamicSize(&dc, m_rcGroups.Width(), LM_COMMIT,
		CRect(m_rcGroups.left + 4, m_rcGroups.top + 3, 6, 3));

	m_rcTearOffGripper.SetRectEmpty();


	return CSize(nWidth, nHeight);
}

void CXTPRibbonTabPopupToolBar::DrawCommandBar(CDC* pDC, CRect rcClipBox)
{
	CXTPRibbonPaintManager* pPaintManager = GetPaintManager()->GetRibbonPaintManager();

	pPaintManager->FillTabPopupToolBar(pDC, this);
	pPaintManager->FillGroupRect(pDC, m_pRibbonTab, m_rcGroups);
	pDC->SetBkMode(TRANSPARENT);

	CXTPRibbonGroups* pGroups = m_pRibbonTab->GetGroups();
	for (int i = 0; i < pGroups->GetCount(); i++)
	{
		CXTPRibbonGroup* pGroup = pGroups->GetAt(i);

		if (pGroup->IsVisible() && CRect().IntersectRect(rcClipBox, pGroup->GetRect()))
		{
			pGroup->Draw(pDC, rcClipBox);
		}
	}

	if (m_pControlScrollGroupsLeft->IsVisible())
	{
		m_pControlScrollGroupsLeft->Draw(pDC);
	}

	if (m_pControlScrollGroupsRight->IsVisible())
	{
		m_pControlScrollGroupsRight->Draw(pDC);
	}
}

CSize CXTPRibbonTabPopupToolBar::GetButtonSize() const
{
	return m_pRibbonBar->GetButtonSize();
}

CSize CXTPRibbonTabPopupToolBar::GetIconSize() const
{
	return m_pRibbonBar->GetIconSize();

}

CRect CXTPRibbonTabPopupToolBar::CalculatePopupRect(CPoint ptPopup, CSize sz)
{
	return CRect(ptPopup, sz);
}

CXTPRibbonGroup* CXTPRibbonTabPopupToolBar::HitTestGroup(CPoint point) const
{
	if (!m_rcGroups.PtInRect(point))
		return NULL;

	return m_pRibbonTab->GetGroups()->HitTest(point);
}

BOOL CXTPRibbonTabPopupToolBar::IsKeyboardCuesVisible() const
{
	return m_pRibbonBar->IsKeyboardCuesVisible();
}

void CXTPRibbonTabPopupToolBar::OnKeyboardTip(CXTPCommandBarKeyboardTip* pTip)
{
	CXTPControl* pControl = DYNAMIC_DOWNCAST(CXTPControl, pTip->m_pOwner);
	if (pControl)
	{

		if (pTip->m_bVisible == FALSE && pControl->GetHideFlags() == xtpHideWrap)
		{
			CXTPRibbonGroup* pGroup = pControl->GetRibbonGroup();
			if (pGroup && pGroup->GetControlGroupPopup())
			{
				EnsureVisible(pGroup->GetControlGroupPopup());
				pGroup->GetControlGroupPopup()->OnUnderlineActivate();

				int nIndex = pGroup->IndexOf(pControl);

				CXTPCommandBar* pPopupToolBar = pGroup->GetControlGroupPopup()->GetCommandBar();
				if (pPopupToolBar && pPopupToolBar->IsTrackingMode() && nIndex >= 0 &&
					nIndex < pPopupToolBar->GetControlCount())
				{
					pPopupToolBar->GetControl(nIndex)->OnUnderlineActivate();

				}
			}

			return;
		}

		if (pControl->IsVisible())
		{
			pControl->OnUnderlineActivate();
		}

		return;
	}
}

BEGIN_MESSAGE_MAP(CXTPRibbonTabPopupToolBar, CXTPPopupToolBar)
	//{{AFX_MSG_MAP(CXTPRibbonBar)
	ON_WM_MOUSEMOVE()
	ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CXTPRibbonScrollableBar::HighlightGroup(CXTPRibbonGroup* pHighlightedGroup)
{
	if (m_pHighlightedGroup)
	{
		CRect rcRedraw(m_pHighlightedGroup->GetRect());
		m_pHighlightedGroup = NULL;

		m_pParent->Redraw(rcRedraw);
	}

	m_pHighlightedGroup = pHighlightedGroup;

	if (m_pHighlightedGroup)
	{
		m_pParent->Redraw(m_pHighlightedGroup->GetRect());
	}
}

void CXTPRibbonTabPopupToolBar::OnMouseMove(UINT nFlags, CPoint point)
{
	CXTPCommandBars* pCommandBars = GetCommandBars ();
	CXTPMouseManager* pMouseManager = pCommandBars->GetMouseManager();

	BOOL bMouseLocked = pMouseManager->IsMouseLocked() || !pMouseManager->IsTopParentActive(m_hWnd)
		|| pMouseManager->IsTrackedLock(this) || m_nPopuped != -1;

	CXTPRibbonGroup* pHighlightedGroup = bMouseLocked || !m_pRibbonBar->GetRibbonPaintManager()->m_bHotTrackingGroups ?
		NULL : HitTestGroup(point);

	if (pHighlightedGroup != m_pHighlightedGroup)
	{
		HighlightGroup(pHighlightedGroup);

		if (m_pHighlightedGroup)
		{
			pMouseManager->TrackMouseLeave(*this);
		}
	}

	CXTPPopupToolBar::OnMouseMove(nFlags, point);
}

BOOL CXTPRibbonTabPopupToolBar::SetTrackingMode(int bMode, BOOL bSelectFirst, BOOL bKeyboard)
{
	HighlightGroup(NULL);

	return CXTPPopupToolBar::SetTrackingMode(bMode, bSelectFirst, bKeyboard);
}

void CXTPRibbonTabPopupToolBar::OnMouseLeave()
{
	HighlightGroup(NULL);

	CXTPPopupToolBar::OnMouseLeave();
}

BOOL CXTPRibbonTabPopupToolBar::ProcessSpecialKey(XTPSpecialKey key)
{
	if (key != xtpKeyEscape)
		HideKeyboardTips();

	if (CXTPRibbonScrollableBar::ProcessSpecialKey(key))
		return TRUE;

	if (key == xtpKeyEscape && !m_pRibbonBar->m_bKeyboardSelect)
	{
		GetCommandBars()->ClosePopups();
		return TRUE;
	}

	return CXTPPopupToolBar::ProcessSpecialKey(key);
}

INT_PTR CXTPRibbonTabPopupToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
	INT_PTR nHit = CXTPPopupToolBar::OnToolHitTest(point, pTI);
	if (nHit == -1)
		return -1;

	if (pTI != NULL && pTI->cbSize == sizeof(XTP_TOOLTIP_TOOLINFO_EX) && m_pToolTipContext
		&& m_pToolTipContext->IsShowTitleAndDescription())
	{
		XTP_TOOLTIP_CONTEXT* tc = ((XTP_TOOLTIP_TOOLINFO_EX*)pTI)->pToolInfo;
		if (tc && tc->pObject && ((CXTPControl*)tc->pObject)->GetRibbonGroup())
		{
			tc->rcExclude = m_rcGroups;
		}
	}

	return nHit;
}

IMPLEMENT_DYNAMIC(CXTPRibbonTabPopupToolBar, CXTPPopupToolBar)

CXTPRibbonScrollableBar* AFX_CDECL GetScrollableBar(CXTPCommandBar* pCommandBar)
{
	if (pCommandBar->IsRibbonBar())
		return (CXTPRibbonScrollableBar*)(CXTPRibbonBar*)(pCommandBar);

	if (pCommandBar->IsKindOf(RUNTIME_CLASS(CXTPRibbonTabPopupToolBar)))
		return (CXTPRibbonScrollableBar*)(CXTPRibbonTabPopupToolBar*)(pCommandBar);

	if (pCommandBar->IsKindOf(RUNTIME_CLASS(CXTPRibbonGroupPopupToolBar)))
		return (CXTPRibbonScrollableBar*)(CXTPRibbonGroupPopupToolBar*)(pCommandBar);

	return 0;
}


//////////////////////////////////////////////////////////////////////////
// CXTPRibbonGroupPopupToolBar

IMPLEMENT_XTP_COMMANDBAR(CXTPRibbonGroupPopupToolBar, CXTPPopupToolBar)

CXTPRibbonGroupPopupToolBar::CXTPRibbonGroupPopupToolBar(CXTPRibbonGroup* pRibbonGroup /*= NULL*/)
{
	if (!pRibbonGroup)
	{
		m_pRibbonBar = NULL;
		m_pRibbonGroup = NULL;
		m_pParentGroup = NULL;
		return;
	}
	m_pParent = this;
	m_pRibbonBar = pRibbonGroup->GetRibbonBar();
	m_pRibbonGroup = (CXTPRibbonGroup*)pRibbonGroup->GetRuntimeClass()->CreateObject();
	m_pRibbonGroup->m_pParent = this;
	m_pRibbonGroup->m_pRibbonBar = m_pRibbonBar;
	m_pParentGroup = pRibbonGroup;

	m_pRibbonGroup->OnGroupAdded();
	m_pRibbonGroup->Copy(pRibbonGroup);

	int nHeight = m_pRibbonBar->GetRibbonPaintManager()->GetGroupCaptionHeight();
	m_rcBorders.SetRect(2, 2, 3, nHeight + 1);

	m_bTrackOnHover = FALSE;
	SetFlags(xtpFlagSmartLayout);

	EnableAnimation(m_pRibbonBar->IsAnimationEnabled());
}

CXTPRibbonGroupPopupToolBar::~CXTPRibbonGroupPopupToolBar()
{
	m_pRibbonGroup->OnGroupRemoved();
	m_pRibbonGroup->InternalRelease();
}

CSize CXTPRibbonGroupPopupToolBar::CalcDynamicLayout(int, DWORD /*nMode*/)
{
	m_bDynamicLayout = TRUE;

	CClientDC dc(this);
	CXTPFontDC font(&dc, GetPaintManager()->GetCommandBarFont(this));

	UpdateShortcuts();

	int nGroupHeight = m_pRibbonBar->CalcGroupsHeight();

	m_pRibbonGroup->OnBeforeCalcSize(&dc);
	int nWidth = m_pRibbonGroup->OnCalcDynamicSize(&dc);
	m_pRibbonGroup->OnAdjustBorders(nWidth, CRect(0, 0, 0, 0));
	m_pRibbonGroup->OnAfterCalcSize();

	m_rcTearOffGripper.SetRectEmpty();

	m_bDynamicLayout = FALSE;

	return CSize(nWidth + m_rcBorders.left + m_rcBorders.right, nGroupHeight - 7);
}

void CXTPRibbonGroupPopupToolBar::DrawCommandBar(CDC* pDC, CRect rcClipBox)
{
	m_pRibbonBar->GetRibbonPaintManager()->FillGroupPopupToolBar(pDC, m_pRibbonGroup, this);

	m_pRibbonGroup->Draw(pDC, rcClipBox);
}

void CXTPRibbonGroupPopupToolBar::CreateKeyboardTips()
{
	if (!m_pParentGroup)
		return;

	CXTPRibbonTab* pSelectedTab = m_pParentGroup->GetParentTab();

	for (int i = 0; i < pSelectedTab->GetGroups()->GetCount(); i++)
	{
		CXTPRibbonGroup* pGroup = pSelectedTab->GetGroups()->GetAt(i);
		BOOL bVisible = pGroup->IsVisible() && m_pParentGroup == pGroup;

		if (bVisible)
		{
			pGroup = m_pRibbonGroup;
		}

		for (int j = 0; j < pGroup->GetCount(); j++)
		{
			CXTPControl* pControl = pGroup->GetAt(j);
			CreateControlKeyboardTips(pControl, NULL, bVisible);
		}

		if ((pGroup->GetControlGroupOption()->GetHideFlags() & xtpHideGeneric) == 0)
		{
			CreateControlKeyboardTips(pGroup->GetControlGroupOption(), NULL, bVisible);
		}

		CreateControlKeyboardTips(pGroup->GetControlGroupPopup(), _T("Z"), bVisible);
	}
}

CXTPRibbonGroup* CXTPRibbonGroupPopupToolBar::HitTestGroup(CPoint point) const
{
	if (m_pRibbonGroup && m_pRibbonGroup->GetRect().PtInRect(point))
		return m_pRibbonGroup;

	return NULL;
}


CSize CXTPRibbonGroupPopupToolBar::GetIconSize() const
{
	return m_pRibbonBar->GetIconSize();
}

CSize CXTPRibbonGroupPopupToolBar::GetButtonSize() const
{
	return m_pRibbonBar->GetButtonSize();
}

void CXTPRibbonGroupPopupToolBar::OnGroupsScroll(BOOL /*bScrollLeft*/)
{
}

CRect CXTPRibbonGroupPopupToolBar::GetGroupsRect() const
{
	return CXTPClientRect(this);
}

BOOL CXTPRibbonGroupPopupToolBar::ProcessSpecialKey(XTPSpecialKey key)
{
	if (key != xtpKeyEscape)
		HideKeyboardTips();

	if (CXTPRibbonScrollableBar::ProcessSpecialKey(key))
		return TRUE;

	return CXTPPopupToolBar::ProcessSpecialKey(key);
}


BEGIN_MESSAGE_MAP(CXTPRibbonGroupPopupToolBar, CXTPPopupToolBar)
	//{{AFX_MSG_MAP(CXTPRibbonBar)
	ON_WM_MOUSEMOVE()
	ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CXTPRibbonGroupPopupToolBar::OnMouseMove(UINT nFlags, CPoint point)
{
	CXTPCommandBars* pCommandBars = GetCommandBars ();
	CXTPMouseManager* pMouseManager = pCommandBars->GetMouseManager();

	BOOL bMouseLocked = pMouseManager->IsMouseLocked() || !pMouseManager->IsTopParentActive(m_hWnd)
		|| pMouseManager->IsTrackedLock(this) || m_nPopuped != -1;

	CXTPRibbonGroup* pHighlightedGroup = bMouseLocked || !m_pRibbonBar->GetRibbonPaintManager()->m_bHotTrackingGroups ?
		NULL : m_pRibbonGroup;

	if (pHighlightedGroup != m_pHighlightedGroup)
	{
		HighlightGroup(pHighlightedGroup);

		if (m_pHighlightedGroup)
		{
			pMouseManager->TrackMouseLeave(*this);
		}
	}

	CXTPPopupToolBar::OnMouseMove(nFlags, point);
}

BOOL CXTPRibbonGroupPopupToolBar::SetTrackingMode(int bMode, BOOL bSelectFirst, BOOL bKeyboard)
{
	HighlightGroup(NULL);

	return CXTPPopupToolBar::SetTrackingMode(bMode, bSelectFirst, bKeyboard);
}

void CXTPRibbonGroupPopupToolBar::OnMouseLeave()
{
	HighlightGroup(NULL);

	CXTPPopupToolBar::OnMouseLeave();
}

BOOL CXTPRibbonGroupPopupToolBar::IsKeyboardCuesVisible() const
{
	return m_pRibbonBar->IsKeyboardCuesVisible();
}