/*--------------------------------------------------------------------------* * * 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 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 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