You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
766 lines
19 KiB
C++
766 lines
19 KiB
C++
2 years ago
|
// 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();
|
||
|
}
|