//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1999 - 1999
//
//  File:       controls.h
//
//--------------------------------------------------------------------------

// Controls.h
/////////////////////////////////////////////////////////////////////////////

#ifndef __CONTROLS_H__
#define __CONTROLS_H__
#pragma once

#include "conuiobservers.h"		// for CTreeViewObserver
#include <initguid.h>
#include <oleacc.h>

#ifdef DBG
extern CTraceTag tagToolbarAccessibility;
#endif


bool IsIgnorableButton (const TBBUTTON& tb);

class CRebarWnd;
class CAccel;
class CToolbarTrackerAuxWnd;

/////////////////////////////////////////////////////////////////////////////
// CDescriptionCtrl window

class CDescriptionCtrl : public CStatic, public CTreeViewObserver
{
// Construction
public:
    CDescriptionCtrl();

// Attributes
public:
    void SetSnapinText (const CString& strSnapinText);

    const CString& GetSnapinText () const
        { return (m_strSnapinText); }

    int GetHeight() const
        { return (m_cyRequired); }

	/*
	 * handlers for events fired to tree view observers
	 */
    virtual SC ScOnSelectedItemTextChanged (LPCTSTR pszNewText);

private:
    void CreateFont();
    void DeleteFont();

private:
    CString m_strConsoleText;
    CString m_strSnapinText;
    CFont   m_font;
    int     m_cxMargin;
    int     m_cyText;
    int     m_cyRequired;


// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CDescriptionCtrl)
    protected:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CDescriptionCtrl();

    // Generated message map functions
protected:
    //{{AFX_MSG(CDescriptionCtrl)
    afx_msg UINT OnNcHitTest(CPoint point);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
    afx_msg void OnDestroy();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	//}}AFX_MSG

    afx_msg void DrawItem(LPDRAWITEMSTRUCT lpdis);

    DECLARE_MESSAGE_MAP()

//Attributes
protected:

};

/////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////
// CToolBarCtrlBase window


/*+-------------------------------------------------------------------------*
 * CToolBarCtrlBase
 *
 * This class only exists to provide simple wrappers around new toolbar
 * control messages that the version of MFC we use doesn't support.  It
 * will be removed when MFC supports the new messages.
 *
 * If you need functionality other than that, derive a class from
 * CToolBarCtrlBase.
 *--------------------------------------------------------------------------*/

class CToolBarCtrlBase : public CToolBarCtrl
{
private:
    CImageList* GetImageList_(int msg);
    CImageList* SetImageList_(int msg, CImageList* pImageList, int idImageList = 0);

public:
    CImageList* GetImageList();
    CImageList* SetImageList(CImageList* pImageList, int idImageList = 0);
    CImageList* GetHotImageList();
    CImageList* SetHotImageList(CImageList* pImageList);
    CImageList* GetDisabledImageList();
    CImageList* SetDisabledImageList(CImageList* pImageList);

    /*
     * CToolBarCtrl::SetOwner doesn't return the previous parent
     * and doesn't handle a NULL owner
     */
    CWnd* SetOwner (CWnd* pwndNewOwner);

    void SetMaxTextRows(int iMaxRows);
    void SetButtonWidth(int cxMin, int cxMax);
    DWORD GetButtonSize(void);

    #if (_WIN32_IE >= 0x0400)
        int GetHotItem ();
        int SetHotItem (int iHot);
        CSize GetPadding ();
        CSize SetPadding (CSize size);
        bool GetButtonInfo (int iID, LPTBBUTTONINFO ptbbi);
        bool SetButtonInfo (int iID, LPTBBUTTONINFO ptbbi);
    #endif  // _WIN32_IE >= 0x0400
};


///////////////////////////////////////////////////////////////////////////
// CToolBarCtrlEx window

class CToolBarCtrlEx : public CToolBarCtrlBase
{
	typedef CToolBarCtrlBase BaseClass;

// Construction
public:
    CToolBarCtrlEx();

// Attributes
public:
    CSize GetBitmapSize(void);

// Operations
public:
    void Show(BOOL bShow, bool bAddToolbarInNewLine = false);
    bool IsBandVisible();
    int  GetBandIndex();
    void UpdateToolbarSize(void);
// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CToolBarCtrlEx)
    public:
    virtual BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
    virtual BOOL SetBitmapSize(CSize sz);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CToolBarCtrlEx();

// Overridables
    virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);


    // Generated message map functions
protected:
    //{{AFX_MSG(CToolBarCtrlEx)
    afx_msg LRESULT OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()


protected:
    CSize       m_sizeBitmap;
    CRebarWnd*  m_pRebar;
    int         m_cx;  // Current Width
    bool        m_fMirrored;

};

////////////////////////////////////////////////////////////////////////////
// CRebarWnd window

class CRebarWnd : public CWnd
{
// Construction
public:
    CRebarWnd();

// Attributes
public:

// Operations
public:
    CRect CalculateSize(CRect maxRect);

    LRESULT GetBarInfo(REBARINFO* prbi);
    LRESULT SetBarInfo(REBARINFO* prbi);
    LRESULT InsertBand(LPREBARBANDINFO lprbbi);
    LRESULT SetBandInfo(UINT uBand, LPREBARBANDINFO lprbbi);
    LRESULT GetBandInfo(UINT uBand, LPREBARBANDINFO lprbbi);
    LRESULT DeleteBand(UINT uBand);
    CWnd *  SetParent(CWnd* pwndParent);
    UINT GetBandCount ();
    UINT GetRowCount ();
    UINT GetRowHeight (UINT uRow);

    #if (_WIN32_IE >= 0x0400)
        int  HitTest (LPRBHITTESTINFO lprbht);
        BOOL GetRect (UINT uBand, LPRECT lprc);
        int IdToIndex (UINT uBandID);
        CWnd* GetToolTips ();
        void  SetToolTips (CWnd* pwndTips);
        COLORREF GetBkColor ();
        COLORREF SetBkColor (COLORREF clrBk);
        COLORREF GetTextColor ();
        COLORREF SetTextColor (COLORREF clrBack);
        LRESULT SizeToRect (LPRECT lprc);

        // for manual drag control
        // lparam == cursor pos
                // -1 means do it yourself.
                // -2 means use what you had saved before
        void BeginDrag (UINT uBand, CPoint point);
        void BeginDrag (UINT uBand, DWORD dwPos);
        void EndDrag ();
        void DragMove (CPoint point);
        void DragMove (DWORD dwPos);
        UINT GetBarHeight ();
        void MinimizeBand (UINT uBand);
        void MaximizeBand (UINT uBand, BOOL fIdeal = false);
        void GetBandBorders (UINT uBand, LPRECT lprc);
        LRESULT ShowBand (UINT uBand, BOOL fShow);
        LRESULT MoveBand (UINT uBandFrom, UINT uBandTo);
        CPalette* GetPalette ();
        CPalette* SetPalette (CPalette* ppal);
    #endif      // _WIN32_IE >= 0x0400

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CRebarWnd)
    public:
    virtual BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
    protected:
    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CRebarWnd();

    // Generated message map functions
protected:
    //{{AFX_MSG(CRebarWnd)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSysColorChange();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    //}}AFX_MSG
    afx_msg LRESULT OnSetRedraw(WPARAM, LPARAM);
    afx_msg void OnRebarAutoSize(NMHDR* pNotify, LRESULT* result);
    afx_msg void OnRebarHeightChange(NMHDR* pNotify, LRESULT* result);
    DECLARE_MESSAGE_MAP()

private:
    bool    m_fRedraw;
};


////////////////////////////////////////////////////////////////////////////
// CTabCtrlEx window


/*+-------------------------------------------------------------------------*
 * CTabCtrlEx
 *
 * This class only exists to provide simple wrappers around new tab
 * control messages that the version of MFC we use doesn't support.  It
 * will be removed when MFC supports the new messages.
 *
 * If you need functionality other than that, derive a class from
 * CTabCtrlEx.
 *--------------------------------------------------------------------------*/

class CTabCtrlEx : public CTabCtrl
{
public:
    void  DeselectAll (bool fExcludeFocus);
    bool  HighlightItem (UINT nItem, bool fHighlight);
    DWORD GetExtendedStyle ();
    DWORD SetExtendedStyle (DWORD dwExStyle, DWORD dwMask = 0);
    bool  GetUnicodeFormat ();
    bool  SetUnicodeFormat (bool fUnicode);
    void  SetCurFocus (UINT nItem);
    bool  SetItemExtra (UINT cbExtra);
    int   SetMinTabWidth (int cx);
};



/////////////////////////////////////////////////////////////////////////////
// CToolBar idle update through CToolCmdUIEx class

class CToolCmdUIEx : public CCmdUI        // class private to this file !
{
public: // re-implementations only
    virtual void Enable(BOOL bOn);
    virtual void SetCheck(int nCheck);
    virtual void SetText(LPCTSTR lpszText);
    void SetHidden(BOOL bHidden);
};



/////////////////////////////////////////////////////////////////////////////
// CMMCToolBarCtrlEx window

class CMMCToolBarCtrlEx : public CToolBarCtrlEx, public CTiedObject
{
    static const CAccel& GetTrackAccel();

    bool    m_fTrackingToolBar;
	bool	m_fFakeFocusApplied;	// have we send fake OBJ_FOCUS events?

// Construction
public:
    CMMCToolBarCtrlEx();

// Attributes
public:
    enum
    {
        ID_MTBX_NEXT_BUTTON = 0x5400,   // could be anything
        ID_MTBX_PREV_BUTTON,
        ID_MTBX_PRESS_HOT_BUTTON,
        ID_MTBX_END_TRACKING,

        ID_MTBX_FIRST = ID_MTBX_NEXT_BUTTON,
        ID_MTBX_LAST  = ID_MTBX_END_TRACKING,
    };

    bool IsTrackingToolBar () const
    {
        return (m_fTrackingToolBar);
    }


// Operations
public:
    virtual int GetFirstButtonIndex ();
    int GetNextButtonIndex (int nStartIndex, int nIncrement = 1);
    int GetPrevButtonIndex (int nStartIndex, int nIncrement = 1);

private:
    int GetNextButtonIndexWorker (int nStartIndex, int nIncrement, bool fAdvance);

protected:
    bool IsIgnorableButton (int nButtonIndex);

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMMCToolBarCtrlEx)
    public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CMMCToolBarCtrlEx();

    // Generated message map functions
protected:
    //{{AFX_MSG(CMMCToolBarCtrlEx)
    afx_msg void OnHotItemChange(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnDestroy();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	//}}AFX_MSG

    afx_msg void OnNextButton ();
    afx_msg void OnPrevButton ();
    afx_msg void OnPressHotButton ();
    DECLARE_MESSAGE_MAP()

public:
    afx_msg void BeginTracking ();
    afx_msg void EndTracking   ();

    virtual void BeginTracking2 (CToolbarTrackerAuxWnd* pAuxWnd);
    virtual void EndTracking2   (CToolbarTrackerAuxWnd* pAuxWnd);

	// *** IAccPropServer methods ***
	SC ScGetPropValue (
		const BYTE*			pIDString,
		DWORD				dwIDStringLen,
		MSAAPROPID			idProp,
		VARIANT *			pvarValue,
		BOOL *				pfGotProp);

protected:
	typedef std::vector<MSAAPROPID> PropIDCollection;

	/*
	 * Derived classes can override this to handle properties they support.
	 * The base class should always be called first.
	 */
	virtual SC ScGetPropValue (
		HWND				hwnd,		// I:accessible window
		DWORD				idObject,	// I:accessible object
		DWORD				idChild,	// I:accessible child object
		const MSAAPROPID&	idProp,		// I:property requested
		VARIANT&			varValue,	// O:returned property value
		BOOL&				fGotProp);	// O:was a property returned?

	virtual SC ScInsertAccPropIDs (PropIDCollection& v);

private:
	// Accessibility stuff
	SC ScInitAccessibility ();
	SC ScRestoreAccFocus ();

	CComPtr<IAccPropServices>	m_spAccPropServices;
	CComPtr<IAccPropServer>		m_spAccPropServer;
	PropIDCollection			m_vPropIDs;
};


#include "controls.inl"

#endif //__CONTROLS_H__