// 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 "afxaccessibility.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 CMFCRibbonPanel;
class CMFCRibbonCmdUI;
class CMFCPopupMenu;
class CMFCRibbonButtonsGroup;
class CMFCRibbonPanelMenuBar;
class CMFCRibbonCommandsListBox;
class CMFCPopupMenu;
class CMFCRibbonQuickAccessToolBar;
class CMFCRibbonKeyTip;
// CMFCBaseAccessibleObject command target
class CMFCBaseAccessibleObject : public CCmdTarget
{
DECLARE_DYNAMIC(CMFCBaseAccessibleObject)
protected:
CAccessibilityData m_AccData;
public:
CMFCBaseAccessibleObject();
virtual ~CMFCBaseAccessibleObject();
public:
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(Accessible, IAccessible)
//IDispatch methods
STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo);
STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo);
STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid);
//IAccessible methods
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr);
STDMETHOD(get_accParent)(THIS_ IDispatch * FAR* ppdispParent);
STDMETHOD(get_accChildCount)(THIS_ long FAR* pChildCount);
STDMETHOD(get_accChild)(THIS_ VARIANT varChildIndex, IDispatch * FAR* ppdispChild);
STDMETHOD(get_accName)(THIS_ VARIANT varChild, BSTR* pszName);
STDMETHOD(get_accValue)(THIS_ VARIANT varChild, BSTR* pszValue);
STDMETHOD(get_accDescription)(THIS_ VARIANT varChild, BSTR FAR* pszDescription);
STDMETHOD(get_accRole)(THIS_ VARIANT varChild, VARIANT *pvarRole);
STDMETHOD(get_accState)(THIS_ VARIANT varChild, VARIANT *pvarState);
STDMETHOD(get_accHelp)(THIS_ VARIANT varChild, BSTR* pszHelp);
STDMETHOD(get_accHelpTopic)(THIS_ BSTR* pszHelpFile, VARIANT varChild, long* pidTopic);
STDMETHOD(get_accKeyboardShortcut)(THIS_ VARIANT varChild, BSTR* pszKeyboardShortcut);
STDMETHOD(get_accFocus)(THIS_ VARIANT FAR * pvarFocusChild);
STDMETHOD(get_accSelection)(THIS_ VARIANT FAR * pvarSelectedChildren);
STDMETHOD(get_accDefaultAction)(THIS_ VARIANT varChild, BSTR* pszDefaultAction);
STDMETHOD(accSelect)(THIS_ long flagsSelect, VARIANT varChild);
STDMETHOD(accLocation)(THIS_ long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild);
STDMETHOD(accNavigate)(THIS_ long navDir, VARIANT varStart, VARIANT * pvarEndUpAt);
STDMETHOD(accHitTest)(THIS_ long xLeft, long yTop, VARIANT * pvarChildAtPoint);
STDMETHOD(accDoDefaultAction)(THIS_ VARIANT varChild);
STDMETHOD(put_accName)(THIS_ VARIANT varChild, BSTR szName);
STDMETHOD(put_accValue)(THIS_ VARIANT varChild, BSTR pszValue);
END_INTERFACE_PART(Accessible)
public:
virtual HRESULT get_accParent(IDispatch **ppdispParent);
virtual HRESULT get_accChildCount(long *pcountChildren);
virtual HRESULT get_accChild(VARIANT varChild, IDispatch **ppdispChild);
virtual HRESULT get_accName(VARIANT varChild, BSTR *pszName);
virtual HRESULT get_accValue(VARIANT varChild, BSTR *pszValue);
virtual HRESULT get_accDescription(VARIANT varChild, BSTR *pszDescription);
virtual HRESULT get_accRole(VARIANT varChild, VARIANT *pvarRole);
virtual HRESULT get_accState(VARIANT varChild, VARIANT *pvarState);
virtual HRESULT get_accHelp(VARIANT varChild, BSTR *pszHelp);
virtual HRESULT get_accHelpTopic(BSTR *pszHelpFile, VARIANT varChild, long *pidTopic);
virtual HRESULT get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut);
virtual HRESULT get_accFocus(VARIANT *pvarChild);
virtual HRESULT get_accSelection(VARIANT *pvarChildren);
virtual HRESULT get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction);
virtual HRESULT accSelect(long flagsSelect, VARIANT varChild);
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 HRESULT put_accName(VARIANT varChild, BSTR szName);
virtual HRESULT put_accValue(VARIANT varChild, BSTR szValue);
virtual CWnd* GetParentWnd() const { return NULL; }
virtual BOOL OnSetAccData(long lVal);
virtual BOOL SetACCData(CWnd* pParent, CAccessibilityData& data);
};
class CMFCRibbonBaseElement : public CMFCBaseAccessibleObject
{
friend class CMFCRibbonPanel;
friend class CMFCRibbonBar;
friend class CMFCRibbonCmdUI;
friend class CMFCRibbonButtonsGroup;
friend class CMFCPopupMenu;
friend class CMFCRibbonPanelMenuBar;
friend class CMFCRibbonCategory;
friend class CMFCPopupMenuBar;
friend class CMFCRibbonQuickAccessToolBar;
friend class CMFCRibbonGallery;
friend class CMFCRibbonStatusBar;
friend class CMFCRibbonCommandsListBox;
friend class CMFCRibbonCollector;
friend class CMFCRibbonConstructor;
friend class CMFCRibbonApplicationButton;
friend class CMFCRibbonTabsGroup;
DECLARE_DYNAMIC(CMFCRibbonBaseElement)
// Construction
public:
CMFCRibbonBaseElement();
virtual ~CMFCRibbonBaseElement();
// Attributes
public:
enum RibbonElementLocation
{
RibbonElementNotInGroup,
RibbonElementSingleInGroup,
RibbonElementFirstInGroup,
RibbonElementLastInGroup,
RibbonElementMiddleInGroup,
};
enum RibbonImageType
{
RibbonImageLarge,
RibbonImageSmall
};
RibbonElementLocation GetLocationInGroup() const
{
return m_Location;
}
virtual void SetID(UINT nID);
UINT GetID() const { return m_nID; }
virtual void SetText(LPCTSTR lpszText);
LPCTSTR GetText() const { return m_strText; }
virtual void SetKeys(LPCTSTR lpszKeys, LPCTSTR lpszMenuKeys = NULL);
LPCTSTR GetKeys() const { return m_strKeys; }
LPCTSTR GetMenuKeys() const { return m_strMenuKeys; }
virtual void SetTextAlwaysOnRight(BOOL bSet = TRUE);
BOOL IsTextAlwaysOnRight() const { return m_bTextAlwaysOnRight; }
void SetRect(CRect rect) { m_rect = rect; }
CRect GetRect() const { return m_rect; }
DWORD_PTR GetData() const { return m_dwData; }
void SetData(DWORD_PTR dwData) { m_dwData = dwData; }
BOOL IsDefaultMenuLook() const { return m_bIsDefaultMenuLook; }
void SetDefaultMenuLook(BOOL bIsDefaultMenuLook = TRUE) { m_bIsDefaultMenuLook = bIsDefaultMenuLook; }
virtual CString GetToolTipText() const;
virtual CString GetDescription() const;
virtual void SetToolTipText(LPCTSTR lpszText);
virtual void SetDescription(LPCTSTR lpszText);
virtual BOOL IsHighlighted() const { return m_bIsHighlighted; }
virtual BOOL IsFocused() const { return m_bIsFocused; }
virtual BOOL IsPressed() const { return m_bIsPressed; }
virtual BOOL IsDisabled() const { return m_bIsDisabled; }
virtual BOOL IsChecked() const { return m_bIsChecked; }
virtual BOOL IsDroppedDown() const { return m_bIsDroppedDown; }
BOOL IsLargeMode() const { return !m_bCompactMode && !m_bIntermediateMode; }
BOOL IsCompactMode() const { return m_bCompactMode; }
BOOL IsIntermediateMode() const { return m_bIntermediateMode; }
BOOL IsVisible() const { return m_bIsVisible; }
void SetVisible(BOOL bIsVisible) { m_bIsVisible = bIsVisible; }
virtual BOOL IsAlwaysLargeImage() const { return m_bIsAlwaysLarge; }
virtual void SetCompactMode(BOOL bCompactMode = TRUE)
{
if(!bCompactMode)
{
if (m_bCompactMode)
{
if (HasIntermediateMode())
{
m_bIntermediateMode = TRUE;
m_bCompactMode = FALSE;
}
else
{
m_bIntermediateMode = FALSE;
m_bCompactMode = FALSE;
}
}
}
else
{
if (m_bCompactMode)
{
return;
}
if (m_bIntermediateMode)
{
if (HasCompactMode())
{
m_bCompactMode = TRUE;
m_bIntermediateMode = FALSE;
}
}
else
{
if (HasIntermediateMode())
{
m_bCompactMode = FALSE;
m_bIntermediateMode = TRUE;
}
}
}
}
virtual BOOL CanBeCompacted() const
{
if (IsAlwaysLargeImage() || m_bCompactMode)
{
return FALSE;
}
return m_bIntermediateMode ? HasCompactMode() : HasIntermediateMode();
}
virtual CSize GetSize(CDC* pDC)
{
return m_bIntermediateMode ?
GetIntermediateSize(pDC) :
m_bCompactMode ?
GetCompactSize(pDC) :
GetRegularSize(pDC);
}
virtual CSize GetRegularSize(CDC* pDC) = 0;
virtual CSize GetCompactSize(CDC* pDC) { return GetRegularSize(pDC); }
virtual CSize GetIntermediateSize(CDC* pDC) { return GetRegularSize(pDC); }
virtual BOOL HasLargeMode() const { return FALSE; }
virtual BOOL HasIntermediateMode() const { return TRUE; }
virtual BOOL HasCompactMode() const { return FALSE; }
virtual void SetInitialMode(BOOL bOneRow = FALSE)
{
m_bIntermediateMode = FALSE;
m_bCompactMode = FALSE;
if (m_pParentGroup != NULL || bOneRow)
{
if (HasCompactMode())
{
m_bCompactMode = TRUE;
}
else if (HasIntermediateMode())
{
m_bIntermediateMode = TRUE;
}
}
else
{
if (HasLargeMode())
{
}
else if (HasIntermediateMode())
{
m_bIntermediateMode = TRUE;
}
else
{
m_bIntermediateMode = FALSE;
}
}
}
virtual CSize GetImageSize(RibbonImageType /*type*/) const { return CSize(0, 0); }
virtual BOOL IsSeparator() const { return FALSE; }
virtual BOOL IsTabStop() const { return TRUE; }
BOOL IsShowGroupBorder() const { return m_bShowGroupBorder; }
virtual void DrawImage(CDC* /*pDC*/, RibbonImageType /*type*/, CRect /*rectImage*/) {}
virtual void OnAfterChangeRect(CDC* pDC);
virtual void OnShow(BOOL /*bShow*/) {}
virtual CMFCRibbonBaseElement* HitTest(CPoint point);
CMFCRibbonCategory* GetParentCategory() const { return m_pParent; }
virtual CMFCRibbonPanel* GetParentPanel() const;
virtual CWnd* GetParentWnd() const;
CMFCRibbonBar* GetParentRibbonBar() const { return m_pRibbonBar; }
virtual void SetParentRibbonBar(CMFCRibbonBar* pRibbonBar) { m_pRibbonBar = pRibbonBar; }
CMFCRibbonButtonsGroup* GetParentGroup() const { return m_pParentGroup; }
CMFCRibbonBar* GetTopLevelRibbonBar() const;
BOOL IsMenuMode() const;
virtual BOOL HasMenu() const { return FALSE; }
virtual void OnShowPopupMenu();
virtual BOOL CanBeAddedToQuickAccessToolBar() const;
BOOL IsQATMode() const { return m_bQuickAccessMode; }
virtual BOOL IsWholeRowHeight() const { return FALSE; }
virtual UINT GetNotifyID() { return m_nID; }
virtual BOOL IsAutoRepeatMode(int& /*nDelay*/ /* ms */) const { return FALSE; }
virtual BOOL OnAutoRepeat() { return FALSE; }
virtual BOOL StretchToWholeRow(CDC* pDC, int nHeight);
virtual BOOL OnDrawMenuImage(CDC* pDC, CRect rect)
{
DrawImage(pDC, RibbonImageSmall, rect);
return TRUE;
}
CMFCRibbonBaseElement* GetOriginal() const { return m_pOriginal; }
BOOL IsTabElement() const { return m_bIsTabElement; }
// Accessibility:
virtual HRESULT get_accParent(IDispatch **ppdispParent);
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 SetACCData(CWnd* pParent, CAccessibilityData& data);
virtual void OnAccDefaultAction();
///
/// Indicates whether the parent element has keyboard focus
///
/// TRUE if the ribbon element is focused; otherwise FALSE.
virtual BOOL HasFocus() const { return FALSE; }
// Overrides
public:
virtual void SetParentCategory(CMFCRibbonCategory* pParent);
virtual void CopyFrom(const CMFCRibbonBaseElement& src);
virtual void SetParentMenu(CMFCRibbonPanelMenuBar* pMenuBar);
virtual void SetOriginal(CMFCRibbonBaseElement* pOriginal);
virtual int AddToListBox(CMFCRibbonCommandsListBox* pWndListBox, BOOL bDeep);
virtual void OnDrawOnList(CDC* pDC, CString strText, int nTextOffset, CRect rect, BOOL bIsSelected, BOOL bHighlighted);
virtual void OnDraw(CDC* pDC) = 0;
virtual void OnCalcTextSize(CDC* /*pDC*/) {}
virtual void CleanUpSizes() {}
virtual BOOL CanBeStretched() {
return TRUE;
}
virtual BOOL CanBeStretchedHorizontally() { return FALSE; }
virtual void StretchHorizontally() { ASSERT(FALSE); }
virtual BOOL IsAlignByColumn() const { return TRUE; }
virtual void ClosePopupMenu();
virtual CMFCRibbonBaseElement* Find(const CMFCRibbonBaseElement* pElement);
virtual CMFCRibbonBaseElement* FindByID(UINT uiCmdID);
virtual CMFCRibbonBaseElement* FindByData(DWORD_PTR dwData);
virtual CMFCRibbonBaseElement* FindByOriginal(CMFCRibbonBaseElement* pOriginal);
virtual void UpdateTooltipInfo();
virtual BOOL OnAddToQAToolbar(CMFCRibbonQuickAccessToolBar& qat);
virtual UINT GetQuickAccessToolBarID() const { return m_nID; }
virtual void Redraw();
virtual void DestroyCtrl() {}
virtual CMFCRibbonBaseElement* GetPressed();
virtual CMFCRibbonBaseElement* GetDroppedDown();
virtual CMFCRibbonBaseElement* GetHighlighted();
virtual CMFCRibbonBaseElement* GetFocused();
virtual void OnDrawKeyTip(CDC* pDC, const CRect& rect, BOOL bIsMenu);
virtual CSize GetKeyTipSize(CDC* pDC);
virtual CRect GetKeyTipRect(CDC* /*pDC*/, BOOL /*bIsMenu*/) { return CRect(0, 0, 0, 0); }
virtual BOOL OnKey(BOOL bIsMenuKey);
virtual void AddToKeyList(CArray& arElems);
virtual BOOL OnMenuKey(UINT /*nUpperChar*/) { return FALSE; }
virtual void GetElementsByID(UINT uiCmdID, CArray& arElements);
virtual void GetElements(CArray & arElements)
{
arElements.Add(this);
}
virtual void GetVisibleElements(CArray& arElements);
virtual void OnRTLChanged(BOOL /*bIsRTL*/) {}
virtual BOOL IsShowTooltipOnBottom() const { return m_pRibbonBar == NULL; }
virtual void OnChangeMenuHighlight(CMFCRibbonPanelMenuBar* /*pPanelMenuBar*/, CMFCRibbonBaseElement* /*pHot*/) {}
virtual void NotifyHighlightListItem(int nIndex);
virtual BOOL IsGalleryIcon() const { return FALSE; }
virtual CMFCRibbonBaseElement* GetFirstTabStop()
{
if (IsTabStop() && !m_rect.IsRectEmpty())
{
return this;
}
return NULL;
}
virtual CMFCRibbonBaseElement* GetLastTabStop()
{
if (IsTabStop() && !m_rect.IsRectEmpty())
{
return this;
}
return NULL;
}
protected:
virtual void OnLButtonDown(CPoint point);
virtual void OnLButtonUp(CPoint /*point*/) {}
virtual void OnMouseMove(CPoint /*point*/) {}
virtual void OnLButtonDblClk(CPoint /*point*/) {}
virtual void OnHighlight(BOOL /*bHighlight*/) {}
virtual void OnSetFocus(BOOL /*bSet*/) {}
virtual void OnUpdateCmdUI(CMFCRibbonCmdUI* pCmdUI, CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
virtual BOOL NotifyControlCommand(BOOL bAccelerator, int nNotifyCode, WPARAM wParam, LPARAM lParam);
virtual BOOL ReplaceByID(UINT uiCmdID, CMFCRibbonBaseElement* pElem);
virtual void GetItemIDsList(CList& lstItems) const;
virtual void OnEnable(BOOL /*bEnable*/) {}
virtual void OnCheck(BOOL /*bCheck*/) {}
virtual int GetDropDownImageWidth() const;
virtual BOOL OnProcessKey(UINT /*nChar*/) { return FALSE; }
virtual BOOL IsCaptionButton() const { return FALSE; }
// Operations
public:
BOOL NotifyCommand(BOOL bWithDelay = FALSE);
void PostMenuCommand(UINT uiCmdId);
void EnableUpdateTooltipInfo(BOOL bEnable = TRUE);
void EnableTooltipInfoShortcut(BOOL bEnable = TRUE);
protected:
void SetDroppedDown(CMFCPopupMenu* pPopupMenu);
// Attributes
protected:
CString m_strText;
CString m_strKeys;
CString m_strMenuKeys;
CString m_strToolTip;
CString m_strDescription;
CRect m_rect;
CMFCRibbonBar* m_pRibbonBar;
CMFCRibbonCategory* m_pParent;
CMFCRibbonBaseElement* m_pOriginal;
CMFCRibbonButtonsGroup* m_pParentGroup;
CMFCRibbonPanelMenuBar* m_pParentMenu;
RibbonElementLocation m_Location;
CMFCPopupMenu* m_pPopupMenu;
DWORD_PTR m_dwData;
UINT m_nID;
int m_nRow;
int m_nImageOffset;
BOOL m_bTextAlwaysOnRight;
BOOL m_bDontNotify;
BOOL m_bCompactMode;
BOOL m_bIntermediateMode;
BOOL m_bFloatyMode;
BOOL m_bQuickAccessMode;
BOOL m_bIsHighlighted;
BOOL m_bIsFocused;
BOOL m_bIsPressed;
BOOL m_bIsDisabled;
BOOL m_bIsChecked;
BOOL m_bIsRadio;
BOOL m_bIsDroppedDown;
BOOL m_bShowGroupBorder;
BOOL m_bIsVisible;
BOOL m_bIsDefaultMenuLook;
BOOL m_bIsAlwaysLarge;
BOOL m_bDrawDefaultIcon;
BOOL m_bIsOnPaletteTop;
BOOL m_bOnBeforeShowItemMenuIsSent;
BOOL m_bEnableUpdateTooltipInfo;
BOOL m_bEnableTooltipInfoShortcut;
BOOL m_bIsTabElement;
};
class CMFCRibbonSeparator : public CMFCRibbonBaseElement
{
DECLARE_DYNCREATE(CMFCRibbonSeparator)
public:
CMFCRibbonSeparator(BOOL bIsHoriz = FALSE);
protected:
virtual BOOL IsSeparator() const { return TRUE; }
virtual BOOL IsTabStop() const { return FALSE; }
public:
virtual int AddToListBox(CMFCRibbonCommandsListBox* pWndListBox, BOOL bDeep);
BOOL IsHorizontal() const { return m_bIsHoriz; }
protected:
virtual void OnDraw(CDC* pDC);
virtual CSize GetRegularSize(CDC* pDC);
virtual void CopyFrom(const CMFCRibbonBaseElement& src);
virtual void OnDrawOnList(CDC* pDC, CString strText, int nTextOffset, CRect rect, BOOL bIsSelected, BOOL bHighlighted);
BOOL m_bIsHoriz;
};
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
// _ATLMFC_DISABLED_WARNINGS
#pragma warning(pop)