windows-nt/Source/XPSP1/NT/admin/activec/conui/ftab.h
2020-09-26 16:20:57 +08:00

211 lines
7.9 KiB
C++

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 1999
*
* File: ftab.h
*
* Contents: Interface file for CFolderTab, CFolderTabView
*
* History: 06-May-99 vivekj Created
*
*--------------------------------------------------------------------------*/
#ifndef FTAB_H
#define FTAB_H
class CFolderTabMetrics
{
public:
CFolderTabMetrics();
int GetXOffset() const;
int GetXMargin() const;
int GetYMargin() const; // top/bottom text margin.
int GetYBorder() const; // top border thickness.
int GetTextHeight() const { return m_textHeight;}
int GetExtraYSpace() const;
int GetTabHeight() const;
int GetUpDownWidth() const;
int GetUpDownHeight()const;
void SetStyle(DWORD dwStyle) { m_dwStyle = dwStyle;}
void SetTextHeight(int textHeight){ m_textHeight = textHeight;}
protected:
DWORD m_dwStyle;
int m_textHeight; // height, in pixels, of the text in a rectangle.
};
/*+-------------------------------------------------------------------------*
* class CFolderTab
*
*
* PURPOSE: Encapsulates a single tab on the tab control
*
*+-------------------------------------------------------------------------*/
class CFolderTab : public CFolderTabMetrics
{
private:
CString m_sText; // tab text
CRect m_rect; // bounding rect
CRgn m_rgn; // polygon region to fill (trapezoid)
CLSID m_clsid;
CPoint m_rgPts[4];
void SetRgn(); // called by ComputeRgn() and SetWidth()
int ComputeRgn(CDC& dc, int x);
int Draw (CDC& dc, CFont& font, BOOL bSelected, bool bFocused);
int DrawTrapezoidal(CDC& dc, CFont& font, BOOL bSelected, bool bFocused);
BOOL HitTest(CPoint pt) { return m_rgn.PtInRegion(pt);}
const CRect& GetRect() const { return m_rect;}
void GetTrapezoid(const CRect& rc, CPoint* pts) const;
int GetWidth() const;
void SetWidth(int nWidth);
void Offset(const CPoint &point);
friend class CFolderTabView;
public:
CFolderTab();
CFolderTab(const CFolderTab &other);
CFolderTab &operator = (const CFolderTab &other);
void SetText(LPCTSTR lpszText) { m_sText = lpszText; }
LPCTSTR GetText() const { return m_sText;}
void SetClsid(const CLSID& clsid){ m_clsid = clsid;}
CLSID GetClsid() { return m_clsid;}
};
enum
{
FTN_TABCHANGED = 1
}; // notification: tab changed
struct NMFOLDERTAB : public NMHDR
{ // notification struct
int iItem; // item index
const CFolderTab* pItem; // ptr to data, if any
};
/*+-------------------------------------------------------------------------*
* CFolderTabView
*
*
* PURPOSE: Provides an Excel-like tab control
*
*+-------------------------------------------------------------------------*/
class CFolderTabView :
public CView,
public CFolderTabMetrics,
public CTiedObject
{
typedef CView BC;
typedef std::list<CFolderTab> CFolderTabList;
typedef CFolderTabList::iterator iterator;
protected:
CFolderTabList m_tabList; // array of CFolderTabs
int m_iCurItem; // current selected tab
CFont m_fontNormal; // current font, normal ntab
CFont m_fontSelected; // current font, selected tab
CView * m_pParentView;
bool m_bVisible;
bool m_fHaveFocus;
int m_sizeX;
int m_sizeY;
HWND m_hWndUpDown; // the up-down control
int m_nPos; // the first tab displayed
CComPtr<IAccessible> m_spTabAcc; // the CTabAccessible object
// helpers
void DrawTabs(CDC& dc, const CRect& rc);
void CreateFonts();
void DeleteFonts();
public:
CFolderTabView(CView *pParentView);
virtual ~CFolderTabView();
BOOL CreateFromStatic(UINT nID, CWnd* pParent);
virtual BOOL Create(DWORD dwWndStyle, const RECT& rc,
CWnd* pParent, UINT nID, DWORD dwFtabStyle=0);
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL OnCmdMsg( UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo );
void Layout (CRect& rectTotal, CRect& rectFTab);
CFolderTab &GetItem(int iPos);
int GetSelectedItem() { return m_iCurItem;}
int GetItemCount() { return m_tabList.size();}
int GetDesiredHeight() { return GetSystemMetrics(SM_CYHSCROLL);}
BOOL AddItem(LPCTSTR lpszText, const CLSID& clsid);
BOOL RemoveItem(int iPos);
void DeleteAllItems();
void RecomputeLayout();
int HitTest(CPoint pt);
int SelectItem(int iTab, bool bEnsureVisible = false);
int SelectItemByClsid(const CLSID& clsid);
void SetFonts(CFont& fontNormal, CFont& fontSelected);
void SetVisible(bool bVisible) {m_bVisible = bVisible;}
bool IsVisible() { return m_bVisible;}
public:
// *** IAccessible methods ***
SC Scget_accParent (IDispatch** ppdispParent);
SC Scget_accChildCount (long* pChildCount);
SC Scget_accChild (VARIANT varChildID, IDispatch ** ppdispChild);
SC Scget_accName (VARIANT varChildID, BSTR* pszName);
SC Scget_accValue (VARIANT varChildID, BSTR* pszValue);
SC Scget_accDescription (VARIANT varChildID, BSTR* pszDescription);
SC Scget_accRole (VARIANT varChildID, VARIANT *pvarRole);
SC Scget_accState (VARIANT varChildID, VARIANT *pvarState);
SC Scget_accHelp (VARIANT varChildID, BSTR* pszHelp);
SC Scget_accHelpTopic (BSTR* pszHelpFile, VARIANT varChildID, long* pidTopic);
SC Scget_accKeyboardShortcut (VARIANT varChildID, BSTR* pszKeyboardShortcut);
SC Scget_accFocus (VARIANT * pvarFocusChild);
SC Scget_accSelection (VARIANT * pvarSelectedChildren);
SC Scget_accDefaultAction (VARIANT varChildID, BSTR* pszDefaultAction);
SC ScaccSelect (long flagsSelect, VARIANT varChildID);
SC ScaccLocation (long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChildID);
SC ScaccNavigate (long navDir, VARIANT varStart, VARIANT * pvarEndUpAt);
SC ScaccHitTest (long xLeft, long yTop, VARIANT * pvarChildAtPoint);
SC ScaccDoDefaultAction (VARIANT varChildID);
SC Scput_accName (VARIANT varChildID, BSTR szName);
SC Scput_accValue (VARIANT varChildID, BSTR pszValue);
private:
void ShowUpDownControl(BOOL bShow);
void EnsureVisible(int iTab);
int ComputeRegion(CClientDC& dc);
int GetTotalTabWidth(CClientDC& dc);
SC ScFireAccessibilityEvent (DWORD dwEvent, LONG idObject);
SC ScValidateChildID (VARIANT &var);
SC ScValidateChildID (LONG id);
protected:
void Paint(bool bFocused);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg int OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINT message );
afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
afx_msg void OnHScroll(NMHDR *nmhdr, LRESULT *pRes);
afx_msg LRESULT OnGetObject(WPARAM wParam, LPARAM lParam);
DECLARE_DYNAMIC(CFolderTabView);
DECLARE_MESSAGE_MAP()
};
#endif // FTAB_H