// XTButton.h : interface for the CXTButton class.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTBUTTON_H__)
#define __XTBUTTON_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// forwards
class CXTThemeManager;
class CXTButtonTheme;
class CXTPImageManagerIcon;
class CXTPImageManagerIconHandle;


// ---------------------------------------------------------------------
// Summary:
//     CXTButton is a CButton derived class. It is used to create
//     flat style and image buttons. This control has several features
//     including flat, semi-flat, and three dimensional borders.
// ---------------------------------------------------------------------
class _XTP_EXT_CLASS CXTButton : public CButton, public CXTThemeManagerStyleHostBase
{
	DECLARE_DYNAMIC(CXTButton)
	DECLARE_THEME_HOST(CXTButton)
	DECLARE_THEME_REFRESH(CXTButton)

public:
	// ----------------------------------------
	// Summary:
	//     Constructs a CXTButton object
	// Parameters:
	//     pThemeFactoryClass - Factory runtime class associated with this class
	// ----------------------------------------
	CXTButton(CRuntimeClass* pThemeFactoryClass = NULL);

	// -----------------------------------------------------------
	// Summary:
	//     Destroys a CXTButton object, handles cleanup and
	//     deallocation
	// -----------------------------------------------------------
	virtual ~CXTButton();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Sets the highlight state for the button control.
	// Parameters:
	//     bChecked - Specifies whether the button is to be checked. TRUE
	//                will check the button. FALSE will uncheck it.
	// Remarks:
	//     This member function sets the highlighting state of a button
	//     control. This is the same as its CButton counterpart, except
	//     the m_bChecked flag is set.  This is done because MFC does not
	//     recognize the button as being checked unless it is a radio or
	//     check box.
	//-----------------------------------------------------------------------
	void SetStateX(BOOL bChecked);

	// ------------------------------------------------------------------------
	// Summary:
	//     Sets the highlight state for the button control.
	// Parameters:
	//     bChecked -  Specifies whether the button is to be checked. TRUE will
	//                 check the button. FALSE will uncheck it.
	// Remarks:
	//     This member function sets the highlighting state of the button
	//     control. This is the same as its CButton counterpart, except the
	//     m_bChecked flag is set. This is done because MFC does not recognize
	//     the button as being checked unless it is a radio or check box.
	// ------------------------------------------------------------------------
	void SetChecked(BOOL bChecked);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the gap between the button's edge
	//     and the image.
	// Parameters:
	//     nGap - Amount in pixels of the gap between the button edge and
	//            the image.
	// Returns:
	//     The previous border gap value.
	//-----------------------------------------------------------------------
	int SetBorderGap(int nGap);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the gap between the button's text
	//     and the image.
	// Parameters:
	//     nGap - Amount in pixels of the gap between the button text and
	//            the image.
	// Returns:
	//     The previous border gap value.
	//-----------------------------------------------------------------------
	int SetImageGap(int nGap);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the normal and hot state icons for
	//     the push button.
	// Parameters:
	//     size           - CSize object that represents the size of the icon.
	//     hIcon          - Handle to the normal icon.
	//     pIcon          - Handle to the normal icon.
	//     hIconHandle    - Handle to the normal icon.
	//     hIconHot       - Handle to the hot icon.
	//     hIconHotHandle - Handle to the hot icon.
	//     nID            - Resource ID for the normal icon.
	//     nHotID         - Resource ID for the pressed icon.
	//     lpszID         - Resource string ID for the normal icon.
	//     lpszHotID      - Resource string ID for the hot icon.
	//     bRedraw        - Specifies whether the button is to be redrawn. A
	//                      nonzero value redraws the button. A zero value does
	//                      not redraw the button. The button is redrawn by default.
	// Returns:
	//     TRUE if successful, otherwise returns FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL SetIcon(CSize size, HICON hIcon, HICON hIconHot = NULL, BOOL bRedraw = TRUE);
	virtual BOOL SetIcon(CSize size, UINT nID, UINT nHotID = 0, BOOL bRedraw = TRUE);                //<COMBINE CXTButton::SetIcon@CSize@HICON@HICON@BOOL>
	virtual BOOL SetIcon(CSize size, LPCTSTR lpszID, LPCTSTR lpszHotID = NULL, BOOL bRedraw = TRUE); //<COMBINE CXTButton::SetIcon@CSize@HICON@HICON@BOOL>
	virtual BOOL SetIcon(CSize size, const CXTPImageManagerIconHandle& hIconHandle, const CXTPImageManagerIconHandle& hIconHotHandle, BOOL bRedraw = TRUE); //<COMBINE CXTButton::SetIcon@CSize@HICON@HICON@BOOL>
	BOOL SetIcon(CSize size, CXTPImageManagerIcon* pIcon, BOOL bRedraw = TRUE);//<COMBINE CXTButton::SetIcon@CSize@HICON@HICON@BOOL>

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the bitmap associated with the
	//     button.
	// Parameters:
	//     size    - CSize object that represents the size of the bitmap.
	//     nID     - Resource ID for the bitmap.
	//     bRedraw - Specifies whether the button is to be redrawn. A nonzero
	//               value redraws the button. A zero value does not redraw
	//               the button. The button is redrawn by default.
	// Returns:
	//     TRUE if successful, otherwise returns FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL SetBitmap(CSize size, UINT nID, BOOL bRedraw = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the XY location of the text and image
	//     that is displayed on the push button.
	// Parameters:
	//     ptImage - XY location of the image displayed on the button.
	//     ptText  - XY location of the text displayed on the button.
	//     bRedraw - Specifies whether the button is to be redrawn. A nonzero
	//               value redraws the button. A zero value does not redraw
	//               the button. The button is redrawn by default.
	// Returns:
	//     TRUE if successful, otherwise returns FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL SetTextAndImagePos(CPoint ptImage, CPoint ptText, BOOL bRedraw = TRUE);

	// ----------------------------------------------------------------------------
	// Summary:
	//     This member function will set the display style for the button.
	// Parameters:
	//     dwxStyle -  Specifies the button style. The button style can be defined
	//                 as one or more of the styles listed in the Remarks section.
	//     bRedraw -   Specifies whether the button is to be redrawn. A nonzero value
	//                 redraws the button. A zero value does not redraw the button.
	//                 The button is redrawn by default.
	// Remarks:
	//     The CXTButton can be set to use one or more of the following
	//     styles:
	//     * <b>BS_XT_FLAT</b> Draws the button flat without any borders.
	//     * <b>BS_XT_SEMIFLAT</b> Draws the button with a thin 3D
	//           border.
	//     * <b>BS_XT_TWOROWS</b> Draws images and text that are
	//           centered.
	//     * <b>BS_XT_SHOWFOCUS</b> Draws a focus rect when the button
	//           has input focus.
	//     * <b>BS_XT_HILITEPRESSED</b> Highlights the button when
	//           pressed.
	//     * <b>BS_XT_XPFLAT</b> Draws a flat button using Office XP
	//           themes.
	//     * <b>BS_XT_FLAT_ANY</b> Same as (BS_XT_FLAT | BS_XT_SEMIFLAT)
	//     * <b>BS_XT_WINXP_COMPAT</b> Uses Windows XP themes if
	//           available. This setting overrides BS_XT_FLAT and BS_XT_SEMIFLAT,
	//           but <i>does not</i> override BS_XT_XPFLAT.
	// Returns:
	//     The previous style that was set.
	// See Also:
	//     GetXButtonStyle
	// ----------------------------------------------------------------------------
	virtual DWORD SetXButtonStyle(DWORD dwxStyle, BOOL bRedraw = TRUE);

	//-----------------------------------------------------------------------
	// Summary:
	//     This function returns only the BS_XT_ style values, not any of the
	//     other window styles.
	// Returns:
	//     The button styles for this CXTButton object.
	//-----------------------------------------------------------------------
	virtual DWORD GetXButtonStyle();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine the gap between the
	//     button image and the button's edge.
	// Returns:
	//     The amount in pixels between the button image and border.
	//-----------------------------------------------------------------------
	int GetBorderGap() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine the gap between the
	//     button text and the image.
	// Returns:
	//     The amount in pixels between the button text and image displayed.
	//-----------------------------------------------------------------------
	int GetImageGap() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine if the button should
	//     display highlights on mouse over.
	// Returns:
	//     TRUE if the button display highlights on mouse over, otherwise
	//     returns FALSE.
	//-----------------------------------------------------------------------
	BOOL GetHilite() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine if the user has defined
	//     specific locations for text and image display.
	// Returns:
	//     TRUE if the user has defined text and image display location.
	//-----------------------------------------------------------------------
	BOOL GetUserPosition() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to determine if the checked state has
	//     been defined for the button control.
	// Returns:
	//     TRUE if the checked state is defined for the button control,
	//     otherwise returns FALSE.
	//-----------------------------------------------------------------------
	BOOL GetChecked() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the normal icon image
	//     used by the button control.
	// Returns:
	//     A handle to a HICON object.
	//-----------------------------------------------------------------------
	HICON GetNormalIcon();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the selected icon image
	//     used by the button control.
	// Returns:
	//     A handle to a HICON object.
	//-----------------------------------------------------------------------
	HICON GetSelectedIcon();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the disabled bitmap
	//     used by the button control.
	// Returns:
	//     A handle to a HBITMAP object.
	//-----------------------------------------------------------------------
	HBITMAP GetDisabledBitmap() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the size of the image
	//     displayed for the button control.
	// Returns:
	//     A CSize object.
	//-----------------------------------------------------------------------
	CSize GetImageSize() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the x-y location of the
	//     top left corner where the button image is displayed.
	// Returns:
	//     A CPoint object.
	//-----------------------------------------------------------------------
	CPoint GetImagePoint() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the x-y location of the
	//     top left corner where text is displayed.
	// Returns:
	//     A CPoint object.
	//-----------------------------------------------------------------------
	CPoint GetTextPoint() const;

	//--------------------------------------------------------------------
	// Summary:
	//     This member function is called to check if the button control
	//     is using a theme.
	// Returns:
	//     TRUE if a theme is used, otherwise FALSE.
	//--------------------------------------------------------------------
	virtual BOOL IsThemeValid() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return a pointer to the image
	//     manager for the button control.
	// Returns:
	//     A pointer to a CXTPImageManagerIcon object.
	//-----------------------------------------------------------------------
	CXTPImageManagerIcon* GetIcon() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This method will allow the user to define the default colors for the
	//     background shadow and highlight colors for the button.
	// Parameters:
	//     clr3DFace    - An RGB value that represents the user defined
	//                    face color for three dimensional display elements.
	//     clr3DHilight - An RGB value that represents the user defined
	//                    highlight color for three dimensional display
	//                    elements (edges facing the light source.)
	//     clr3DShadow  - An RGB value that represents the user defined
	//                    shadow color for three dimensional display
	//                    elements (edges facing away from the light source).
	//     clrBtnText   - An RGB value that represents the user defined
	//                    text color on push buttons.
	//-----------------------------------------------------------------------
	virtual void SetAlternateColors(COLORREF clr3DFace, COLORREF clr3DHilight, COLORREF clr3DShadow, COLORREF clrBtnText);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the default face color for the button.
	// Parameters:
	//     clrFace - An RGB value that represents the user defined face color.
	//-----------------------------------------------------------------------
	virtual void SetColorFace(COLORREF clrFace);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function gets the current face color.
	// Returns:
	//     An RGB value that represents the current face color.
	//-----------------------------------------------------------------------
	virtual COLORREF GetColorFace();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the default highlight color for the button.
	// Parameters:
	//     clrHilite - An RGB value that represents the user defined highlight color.
	//-----------------------------------------------------------------------
	virtual void SetColorHilite(COLORREF clrHilite);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the default shadow color for the button.
	// Parameters:
	//     clrShadow - An RGB value that represents the user defined shadow color.
	//-----------------------------------------------------------------------
	virtual void SetColorShadow(COLORREF clrShadow);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the default text color for the button.
	// Parameters:
	//     clrText - An RGB value that represents the user defined text color.
	//-----------------------------------------------------------------------
	virtual void SetColorText(COLORREF clrText);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the colors for the BS_XT_XPFLAT mode.
	// Parameters:
	//     clrBorder    - An RGB value that represents the user defined
	//                    border color for the flat button.
	//     clrHighlight - An RGB value that represents the user defined
	//                    highlight color for the flat button.
	//     clrPressed   - An RGB value that represents the user defined
	//                    color for when the flat button is pressed.
	//-----------------------------------------------------------------------
	virtual void SetXPFlatColors(COLORREF clrBorder, COLORREF clrHighlight, COLORREF clrPressed);

	//-----------------------------------------------------------------------
	// Summary:
	//     This function toggles the image display for the button on or off.
	//-----------------------------------------------------------------------
	virtual void ResetImage();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the font for the button control.
	// Parameters:
	//     pFont - Points to a valid CFont object.
	// Returns:
	//     A pointer to the previously set font for the button control.
	//-----------------------------------------------------------------------
	virtual CFont* SetFontEx(CFont* pFont);

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns the button styles for this object. This function returns only the BS_ style values, not any of the other window styles.
	// Returns: Returns BS_ style for this button.
	//-----------------------------------------------------------------------
	BYTE GetButtonStyle() const;

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called by the CXTButton class to
	//     perform initialization when the window is created or sub-classed.
	// Returns:
	//     TRUE if the window was successfully initialized, otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual bool Init();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called to free all associated GDI resources
	//     that have been allocated.
	//-----------------------------------------------------------------------
	virtual void CleanUpGDI();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the button's text minus the '&'.
	// Parameters:
	//     bRemoveAmpersand - TRUE to remove the '&' used for mnemonics.
	// Returns:
	//     A CString object that represents the button's text.
	//-----------------------------------------------------------------------
	virtual CString GetButtonText(BOOL bRemoveAmpersand);


protected:
//{{AFX_CODEJOCK_PRIVATE
	DECLARE_MESSAGE_MAP()

	//{{AFX_VIRTUAL(CXTButton)
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	virtual void PreSubclassWindow();
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

	virtual void OnDraw(CDC* pDC);

	//{{AFX_MSG(CXTButton)
	afx_msg UINT OnGetDlgCode();
	afx_msg LRESULT OnSetStyle(WPARAM wParam, LPARAM lParam);

	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg void OnPaint();
	afx_msg LRESULT OnSetState(WPARAM wParam, LPARAM lParam);
	afx_msg void OnMouseLeave();
	afx_msg void OnInvalidate();
	afx_msg LRESULT OnDefaultAndInvalidate(WPARAM, LPARAM);
	afx_msg LRESULT OnUpdateUIState(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnPrintClient(WPARAM wParam, LPARAM lParam);

	//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE

protected:

	int                   m_nBorderGap;        // Gap between the button edge and the image.
	int                   m_nImageGap;         // Gap between the button text and the image.
	bool                  m_bPreSubclassInit;  // true when initializing from PreSubclassWindow.
	BOOL                  m_bUserPosition;     // TRUE if the user has defined the XY coordinates for the image and text.
	BOOL                  m_bChecked;          // TRUE if the button is checked.
	DWORD                 m_dwxStyle;          // The style of the button, see SetXButtonStyle.
	CSize                 m_sizeImage;         // Initial size of the button.
	CPoint                m_ptImage;           // XY location of the button image.
	CPoint                m_ptText;            // XY location of the button text.
	CXTPImageManagerIcon* m_pIcon;             // Multiple state icon manager converts icon to different states.

protected:
	BOOL m_bHot;            // TRUE if mouse under button
	BOOL m_bPushed;         // TRUE if button was pressed
	BOOL m_bOwnerDraw;      // TRUE if button has BS_OWNERDRAW style
};

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

AFX_INLINE int CXTButton::SetImageGap(int nGap) {
	int nOldGap = m_nImageGap; m_nImageGap = nGap; return nOldGap;
}
AFX_INLINE int CXTButton::SetBorderGap(int nGap) {
	int nOldGap = m_nBorderGap; m_nBorderGap = nGap; return nOldGap;
}
AFX_INLINE DWORD CXTButton::GetXButtonStyle() {
	ASSERT(::IsWindow(m_hWnd)); return m_dwxStyle;
}
AFX_INLINE void CXTButton::SetStateX(BOOL bChecked) {
	m_bChecked = bChecked; if (GetSafeHwnd()) Invalidate(FALSE);
}
AFX_INLINE void CXTButton::SetChecked(BOOL bChecked) {
	m_bChecked = bChecked; if (GetSafeHwnd()) Invalidate(FALSE);
}
AFX_INLINE int CXTButton::GetBorderGap() const {
	return m_nBorderGap;
}
AFX_INLINE int CXTButton::GetImageGap() const {
	return m_nImageGap;
}
AFX_INLINE BOOL CXTButton::GetHilite() const {
	return m_bHot || (::GetCapture() == m_hWnd);
}
AFX_INLINE BOOL CXTButton::GetUserPosition() const {
	return m_bUserPosition;
}

AFX_INLINE BOOL CXTButton::GetChecked() const {
	return m_bChecked;
}

#ifndef ODS_NOACCEL
#define ODS_NOACCEL         0x0100
#endif

#ifndef ODS_NOFOCUSRECT
#define ODS_NOFOCUSRECT     0x0200
#endif


const DWORD BS_XT_FLAT             = 0x0001;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_SEMIFLAT         = 0x0002;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_FLAT_ANY         = 0x0003;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_TWOROWS          = 0x0004;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_SHOWFOCUS        = 0x0010;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_HILITEPRESSED    = 0x0020;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_XPFLAT           = 0x0040;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>
const DWORD BS_XT_WINXP_COMPAT     = 0x1000;  //<ALIAS CXTButton::SetXButtonStyle@DWORD@BOOL>

#endif // #if !defined(__XTBUTTON_H__)