// This MFC Library source code supports the Microsoft Office Fluent User Interface
// (the "Fluent UI") and is provided only as referential material to supplement the
// Microsoft Foundation Classes Reference and related electronic documentation
// included with the MFC C++ library software.
// License terms to copy, use or distribute the Fluent UI are available separately.
// To learn more about our Fluent UI licensing program, please visit
// http://go.microsoft.com/fwlink/?LinkId=238214.
//
// Copyright (C) Microsoft Corporation
// All rights reserved.
#pragma once
#include "afxcontrolbarutil.h"
#include "afxglobals.h"
#include "afxribbonbutton.h"
#include <__atlmfc_core.h>
#pragma warning(push)
#pragma warning(disable : _ATLMFC_DISABLED_WARNINGS)
#ifdef _AFX_PACKING
#pragma pack(push, _AFX_PACKING)
#endif
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
class CMFCRibbonCategory;
class CMFCRibbonBaseElement;
class CMFCRibbonPanel;
class CMFCRibbonGallery;
/*============================================================================*/
// CMFCRibbonLaunchButton
class CMFCRibbonLaunchButton : public CMFCRibbonButton
{
DECLARE_DYNCREATE(CMFCRibbonLaunchButton)
CMFCRibbonLaunchButton();
virtual void OnDraw(CDC* pDC);
virtual CSize GetRegularSize(CDC* pDC);
virtual void OnClick(CPoint point);
virtual CRect GetKeyTipRect(CDC* pDC, BOOL bIsMenu);
virtual BOOL SetACCData(CWnd* pParent, CAccessibilityData& data);
CMFCRibbonPanel* m_pParentPanel;
};
/*============================================================================*/
// CMFCRibbonDefaultPanelButton
class CMFCRibbonDefaultPanelButton : public CMFCRibbonButton
{
DECLARE_DYNCREATE(CMFCRibbonDefaultPanelButton)
friend class CMFCRibbonCategory;
CMFCRibbonDefaultPanelButton(CMFCRibbonPanel* pPanel = NULL);
virtual void OnDraw(CDC* pDC);
virtual void OnLButtonDown(CPoint point);
virtual void OnShowPopupMenu();
virtual BOOL SetACCData(CWnd* pParent, CAccessibilityData& data);
virtual CString GetToolTipText() const { return m_rect.IsRectEmpty() ? CString() : m_strText; }
virtual void OnClick(CPoint /*point*/) { OnShowPopupMenu(); }
virtual CSize GetImageSize(RibbonImageType /*type*/) const
{
CSize sizeIcon(16, 16);
if (GetGlobalData()->GetRibbonImageScale() != 1.)
{
sizeIcon.cx = (int)(.5 + GetGlobalData()->GetRibbonImageScale() * sizeIcon.cx);
sizeIcon.cy = (int)(.5 + GetGlobalData()->GetRibbonImageScale() * sizeIcon.cy);
}
return sizeIcon;
}
virtual BOOL IsDefaultPanelButton() const { return TRUE; }
virtual void DrawImage(CDC* pDC, RibbonImageType type, CRect rectImage);
virtual BOOL CanBeAddedToQuickAccessToolBar() const { return TRUE; }
virtual void CopyFrom(const CMFCRibbonBaseElement& s);
virtual void OnDrawOnList(CDC* pDC, CString strText, int nTextOffset, CRect rect, BOOL bIsSelected, BOOL bHighlighted);
virtual BOOL OnKey(BOOL bIsMenuKey);
virtual CMFCRibbonPanel* GetParentPanel() const { return m_pPanel; }
HICON m_hIcon;
CMFCRibbonPanel* m_pPanel;
};
/*============================================================================*/
// CMFCRibbonPanel
class CMFCRibbonPanel : public CMFCBaseAccessibleObject
{
DECLARE_DYNCREATE(CMFCRibbonPanel)
friend class CMFCRibbonCategory;
friend class CMFCRibbonPanelMenuBar;
friend class CMFCRibbonPanelMenu;
friend class CMFCRibbonBar;
friend class CMFCRibbonConstructor;
// Construction
protected:
CMFCRibbonPanel(LPCTSTR lpszName = NULL, HICON hIcon = NULL);
CMFCRibbonPanel(CMFCRibbonGallery* pPaletteButton);
virtual void CopyFrom(CMFCRibbonPanel& src);
void CommonInit(LPCTSTR lpszName = NULL, HICON hIcon = NULL);
public:
virtual ~CMFCRibbonPanel();
// Attributes:
public:
LPCTSTR GetName() const { return m_strName; }
CMFCRibbonButton& GetDefaultButton() { return m_btnDefault; }
void EnableLaunchButton(UINT uiCmdID, int nIconIndex = -1, LPCTSTR lpszKeys = NULL);
CMFCRibbonButton& GetLaunchButton() { return m_btnLaunch; }
BOOL IsHighlighted() const { return m_bIsHighlighted; }
BOOL IsCollapsed() const; BOOL IsMenuMode() const { return m_bMenuMode; }
virtual BOOL IsMainPanel() const { return FALSE; }
const CRect& GetRect() const { return m_rect; }
DWORD_PTR GetData() const { return m_dwData; }
void SetData(DWORD_PTR dwData) { m_dwData = dwData; }
CMFCRibbonCategory* GetParentCategory() const { return m_pParent; }
CMFCRibbonPanelMenuBar* GetParentMenuBar() const { return m_pParentMenuBar; }
CMFCRibbonBaseElement* GetParentButton() const;
BOOL IsJustifyColumns() const { return m_bJustifyColumns; }
void SetJustifyColumns(BOOL bSet = TRUE) { m_bJustifyColumns = bSet; }
void SetKeys(LPCTSTR lpszKeys);
int GetCaptionHeight() const { return m_rectCaption.Height(); }
BOOL IsCenterColumnVert() const { return m_bCenterColumnVert; }
void SetCenterColumnVert(BOOL bSet = TRUE) { m_bCenterColumnVert = bSet; }
///
/// Indicates whether the parent ribbon has Windows 7-style look (small rectangular application button)
///
/// TRUE if the parent ribbon has Windows 7-style look; otherwise FALSE.
BOOL IsWindows7Look() const;
// Operations
public:
virtual CMFCRibbonBaseElement* HitTest(CPoint point, BOOL bCheckPanelCaption = FALSE);
virtual int HitTestEx(CPoint point) const;
virtual int GetIndex(CMFCRibbonBaseElement* pElem) const;
virtual BOOL GetPreferedMenuLocation(CRect& /*rect*/) { return FALSE; }
BOOL HasElement(const CMFCRibbonBaseElement* pElem) const;
virtual void RecalcWidths(CDC* pDC, int nHeight);
virtual void Add(CMFCRibbonBaseElement* pElem);
virtual void AddSeparator();
virtual BOOL Insert(CMFCRibbonBaseElement* pElem, int nIndex);
virtual BOOL InsertSeparator(int nIndex);
CMFCRibbonButtonsGroup* AddToolBar(UINT uiToolbarResID, UINT uiColdResID = 0, UINT uiHotResID = 0, UINT uiDisabledResID = 0);
CMFCRibbonBaseElement* GetElement(int nIndex) const;
CMFCRibbonBaseElement* FindByID(UINT uiCmdID) const;
CMFCRibbonBaseElement* FindByData(DWORD_PTR dwData) const;
BOOL SetElementMenu(UINT uiCmdID, HMENU hMenu, BOOL bIsDefaultCommand = FALSE, BOOL bRightAlign = FALSE);
BOOL SetElementMenu(UINT uiCmdID, UINT uiMenuResID, BOOL bIsDefaultCommand = FALSE, BOOL bRightAlign = FALSE);
BOOL Replace(int nIndex, CMFCRibbonBaseElement* pElem);
BOOL ReplaceByID(UINT uiCmdID, CMFCRibbonBaseElement* pElem);
CMFCRibbonBaseElement* SetElementRTC(int nIndex, CRuntimeClass* pRTC);
CMFCRibbonBaseElement* SetElementRTCByID(UINT uiCmdID, CRuntimeClass* pRTC);
int GetCount() const;
BOOL Remove(int nIndex, BOOL bDelete = TRUE);
void RemoveAll();
void GetElements(CArray & arElements);
void GetItemIDsList(CList& lstItems) const;
void GetElementsByID(UINT uiCmdID, CArray& arElements);
///
/// Obtains an array of visible elements.
/// When the function returns this parameter contains an array of visible elements.
void GetVisibleElements(CArray& arElements);
CMFCRibbonBaseElement* GetDroppedDown() const;
CMFCRibbonBaseElement* GetHighlighted() const;
CMFCRibbonBaseElement* GetPressed() const;
///
/// Returns a focused element.
/// A pointer to a focused element or NULL.
CMFCRibbonBaseElement* GetFocused() const;
///
/// Sets focus to the specified Ribbon element.
/// A pointer to a Ribbon element that receives focus.
void SetFocused(CMFCRibbonBaseElement* pNewFocus);
CMFCRibbonPanelMenu* ShowPopup(CMFCRibbonDefaultPanelButton* pButton = NULL);
///
/// Scrolls the gallery to make the specified Ribbon element visible.
/// A pointer to a Ribbon element to show.
void MakeGalleryItemVisible(CMFCRibbonBaseElement* pItem);
///
/// Returns a bounding rectangle of Gallery element.
/// Size and position of Gallery element within this panel.
CRect GetGalleryRect();
// Overrides
public:
virtual BOOL OnKey(UINT nChar);
protected:
virtual int GetHeight(CDC* pDC) const;
virtual BOOL IsFixedSize() const { return FALSE; }
virtual void DoPaint(CDC* pDC);
virtual void Reposition(CDC* pDC, const CRect& rect);
virtual void RepositionMenu(CDC* pDC, const CRect& rect);
virtual void ReposPalette(CDC* pDC, const CRect& rect);
virtual void OnUpdateCmdUI(CMFCRibbonCmdUI* pCmdUI, CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
virtual BOOL NotifyControlCommand(BOOL bAccelerator, int nNotifyCode, WPARAM wParam, LPARAM lParam);
virtual void OnAfterChangeRect(CDC* pDC);
virtual void OnShow(BOOL bShow);
virtual void RedrawElement(CMFCRibbonBaseElement* pElem);
virtual void OnDrawMenuBorder(CDC* /*pDC*/, CMFCRibbonPanelMenuBar* /*pMenuBar*/) {}
virtual void OnRTLChanged(BOOL bIsRTL);
// Accessibility:
virtual HRESULT get_accParent(IDispatch **ppdispParent);
virtual HRESULT get_accChildCount(long *pcountChildren);
virtual HRESULT accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild);
virtual HRESULT accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt);
virtual HRESULT accHitTest(long xLeft, long yTop, VARIANT *pvarChild);
virtual HRESULT accDoDefaultAction(VARIANT varChild);
virtual BOOL OnSetAccData(long lVal);
virtual BOOL SetACCData(CWnd* pParent, CAccessibilityData& data);
// Operations
protected:
int GetMinWidth(CDC* pDC);
void CenterElementsInColumn(int nFirstInColumnIndex, int nLastInColumnIndex, int nCaptionHeight);
void JustifyElementsInColumn(int nFirstInColumnIndex, int nLastInColumnIndex);
CSize GetCaptionSize(CDC* pDC) const;
int CalcTotalWidth();
void ShowDefaultButton(CDC* pDC);
virtual void Highlight(BOOL bHighlight, CPoint point);
virtual CMFCRibbonBaseElement* MouseButtonDown(CPoint point);
virtual void MouseButtonUp(CPoint point);
void CancelMode();
CWnd* GetParentWnd() const;
CMFCRibbonBaseElement* GetFirstTabStop() const;
CMFCRibbonBaseElement* GetLastTabStop() const;
void CleanUpSizes();
void OnDrawPaletteMenu(CDC* pDC);
void ScrollPalette(int nScrollOffset, BOOL bIsDelta = FALSE);
CSize GetPaltteMinSize() const;
// Attributes
protected:
BOOL m_bShowCaption;
BOOL m_bForceCollpapse;
BOOL m_bIsHighlighted;
BOOL m_bIsCalcWidth;
BOOL m_bAlignByColumn;
BOOL m_bCenterColumnVert;
BOOL m_bMenuMode;
BOOL m_bIsDefaultMenuLook;
BOOL m_bFloatyMode;
BOOL m_bIsQATPopup;
BOOL m_bIsFirst;
BOOL m_bIsLast;
BOOL m_bJustifyColumns;
BOOL m_bSizeIsLocked;
BOOL m_bScrollDnAvailable;
BOOL m_bTruncateCaption;
BOOL m_bMouseIsDown;
int m_nCurrWidthIndex; // Index of the current width
int m_nFullWidth; // Full width
int m_nRows; // Rows number (m_bAlignByColumn == FALSE)
int m_nXMargin;
int m_nYMargin;
int m_nScrollOffset;
CRect m_rectCaption;
CRect m_rect; // Panel location
CRect m_rectMenuAreaTop;
CRect m_rectMenuAreaBottom;
CString m_strName; // Panel name
DWORD_PTR m_dwData; // User-defined data
CScrollBar* m_pScrollBar;
CMFCRibbonCategory* m_pParent; // Parent category
CMFCRibbonPanelMenuBar* m_pParentMenuBar; // Parent menu bar
CMFCRibbonGallery* m_pPaletteButton;
CMFCRibbonLaunchButton m_btnLaunch;
CMFCRibbonBaseElement* m_pHighlighted; // Highlighted
CMFCRibbonDefaultPanelButton m_btnDefault; // Default panel button
CMap m_mapNonOptWidths; // Optimized Width <-> Full Width
CArray m_arWidths; // All possible widths
CArray m_arElements;
AFX_IMPORT_DATA static UINT m_nNextPanelID;
};
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
// _ATLMFC_DISABLED_WARNINGS
#pragma warning(pop)