// XTPHyperLink.h interface for the CXTPHyperLink class.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2011 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(__XTPHYPERLINK_H__)
#define __XTPHYPERLINK_H__
//}}AFX_CODEJOCK_PRIVATE

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

//===========================================================================
// Summary:
//     CXTPHyperLink is a CStatic derived class. It is used to display a text
//     string that is used as a hyperlink control. The link's active, hover,
//     and selected color attributes are configurable.
//===========================================================================
class _XTP_EXT_CLASS CXTPHyperLink : public CStatic
{
	DECLARE_DYNAMIC(CXTPHyperLink)

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPHyperLink object.
	//-----------------------------------------------------------------------
	CXTPHyperLink();

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to enable or disable ShellExecute to be called
	//     for the URL that is specified for the hyperlink control.  If disabled,
	//     you can add a BN_CLICKED message handler to perform your own task when
	//     the link is clicked.
	// Parameters:
	//     bEnable - true to enable ShellExecute, false to disable.
	//-----------------------------------------------------------------------
	void EnableShellExecute(bool bEnable);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function sets the URL for the hyperlink control.
	// Parameters:
	//     lpszLink - A NULL terminated character string that
	//                represents the URL for the hyperlink.
	//-----------------------------------------------------------------------
	virtual void SetURL(LPCTSTR lpszLink);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function retrieves the URL for the hyperlink.
	// Returns:
	//     A CString object that represents the URL for the hyperlink control.
	//-----------------------------------------------------------------------
	virtual CString GetURL() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the RGB color values for the hyperlink text.
	// Parameters:
	//     clrLink    - An RGB value representing the color for the hyperlink text color.
	//     clrVisited - An RGB value representing the color for the hyperlink text color
	//                  when the mouse is hovering.
	//     clrHover   - An RGB value representing the color for the hyperlink text color
	//                  when the URL has been visited.
	//-----------------------------------------------------------------------
	virtual void SetColors(COLORREF clrLink, COLORREF clrVisited, COLORREF clrHover);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function retrieves the current hyperlink text color.
	// Returns:
	//     An RGB color value that represents the current hyperlink text color.
	//-----------------------------------------------------------------------
	virtual COLORREF GetLinkColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function retrieves the current hyperlink text color
	//     when the link has been activated.
	// Returns:
	//     An RGB color value that represents the current hyperlink text color when
	//     the link has been activated.
	//-----------------------------------------------------------------------
	virtual COLORREF GetVisitedColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function retrieves the current hyperlink text color
	//     when the mouse hovers over the hyperlink.
	// Returns:
	//     An RGB color value that represents the current hyperlink text color when
	//     the mouse hovers over the hyperlink.
	//-----------------------------------------------------------------------
	virtual COLORREF GetHoverColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will cause the control to display the hyperlink
	//     text color as visited.
	// Parameters:
	//     bVisited - A boolean flag that, when set to true, causes the control to
	//                display the hyperlink text color as visited.
	//-----------------------------------------------------------------------
	virtual void SetVisited(bool bVisited = true);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function checks to see if the user has visited the URL
	//     associated with the hyperlink.
	// Returns:
	//     true if the URL has been visited, otherwise returns false.
	//-----------------------------------------------------------------------
	virtual bool GetVisited() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the cursor to be displayed when the
	//     mouse hovers over the hyperlink control.
	// Parameters:
	//     hCursor - Handle of the cursor to be associated with the hyperlink control.
	//-----------------------------------------------------------------------
	virtual void SetLinkCursor(HCURSOR hCursor);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will get a handle to the current cursor associated
	//     with the hyperlink control.
	// Returns:
	//     A handle to the current cursor for the hyperlink control.
	//-----------------------------------------------------------------------
	virtual HCURSOR GetLinkCursor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will cause the hyperlink to display the text
	//     as underlined.  The default value is 'true.'
	// Parameters:
	//     bUnderline - A boolean flag that, when set to true, causes the control to
	//                  display the text as underlined.
	//-----------------------------------------------------------------------
	virtual void SetUnderline(bool bUnderline = true);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function checks to see if the hyperlink text is underlined.
	// Returns:
	//     true if the hyperlink text is underlined, otherwise returns false.
	//-----------------------------------------------------------------------
	virtual bool GetUnderline() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will set the background fill color for the hyperlink
	//     control. By default the hyperlink control uses the system color for COLOR_3DFACE.
	// Parameters:
	//     clrBack - An RGB value representing the background fill color.
	//-----------------------------------------------------------------------
	virtual void SetBackColor(COLORREF clrBack);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function will return the current background fill color for the
	//     hyperlink control.
	// Returns:
	//     A COLOREF value.
	//-----------------------------------------------------------------------
	virtual COLORREF GetBackColor() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called to execute the shell command associated
	//     with the current URL.
	// Parameters:
	//     lpszLink - Points to a null terminated string that represents the URL to
	//                jump to.  If NULL, the default URL is activated.
	//     nShowCmd - Display state for shell command associated with the URL.  The default
	//                is SW_SHOW.
	//     lpszParams - Points to a null terminated string that represents additional
	//                  parameters that are to be passed to the ShellExecute command.
	//     lpszDir - Points to a null terminated string that represents the default
	//               directory.
	// Returns:
	//     TRUE if SUCCESSFUL, otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual bool GotoURL(LPCTSTR lpszLink = NULL, int nShowCmd = SW_SHOW, LPCTSTR lpszParams = NULL, LPCTSTR lpszDir = NULL);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function checks to see if the hyperlink control is a
	//     text control.
	// Returns:
	//     true if the hyperlink control is a text control, otherwise returns false.
	//-----------------------------------------------------------------------
	virtual bool IsTextControl();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to enable or disable tooltips for the hyperlink
	//     control.
	// Parameters:
	//     bEnable - true to enable tooltips.
	//-----------------------------------------------------------------------
	void EnableToolTips(bool bEnable = true);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the tooltip text for the tooltip associated
	//     with the hyperlink control.
	// Parameters:
	//     lpszTipText - NULL terminated string that represents the new tooltip text to display.
	//-----------------------------------------------------------------------
	void SetTipText(LPCTSTR lpszTipText);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to determine if the hyperlink is currently hot.
	// Remarks:
	//     If the link is hot, the mouse pointer is positioned over the link.
	// Returns:
	//     TRUE if the hyperlink is currently hot.  FALSE otherwise.
	//-----------------------------------------------------------------------
	virtual bool IsLinkHot();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called by the CXTPHyperLink object to
	//     display a message box whenever an error occurs.
	// Parameters:
	//     iErrorNo - See the ShellExecute API for a list of error codes.
	//-----------------------------------------------------------------------
	virtual void ReportError(int iErrorNo);

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called by the CXTPHyperLink 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 by the CXTPHyperLink class to
	//     initialize the font that are used by the hyperlink control.
	// Returns:
	//     true if the font was successfully created, otherwise false.
	//-----------------------------------------------------------------------
	virtual bool InitFont();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called by the CXTPHyperLink class to
	//     initialize a font that are used by the hyperlink control.
	// Parameters:
	//     font       - Reference to the font to be created
	//     bUnderline - TRUE to create underline font
	// Returns:
	//     TRUE if the control was successfully initialized, otherwise FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL CreateFont(CFont& font, BOOL bUnderline);

//{{AFX_CODEJOCK_PRIVATE
	DECLARE_MESSAGE_MAP()

	//{{AFX_VIRTUAL(CXTPHyperLink)
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	virtual void PreSubclassWindow();
	protected:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

	//{{AFX_MSG(CXTPHyperLink)
	afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnPaint();
	afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg BOOL OnClicked();
	afx_msg LRESULT OnNcHitTest(CPoint point);
	afx_msg void OnKillFocus(CWnd* pOldWnd);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg UINT OnGetDlgCode();
	//}}AFX_MSG

//}}AFX_CODEJOCK_PRIVATE

protected:
	bool         m_bShellExec;       // true to cause the hyperlink to call ShellExecute for the specified URL.
	bool         m_bPreSubclassInit; // true when initializing from PreSubclassWindow.
	bool         m_bUnderline;       // Set to true for underlined text.
	bool         m_bMouseOver;       // Set to true when the cursor is hovering over the control.
	bool         m_bVisited;         // Set to true when the hyperlink has been activated.
	bool         m_bTipEnabled;      // Set to false to disable tooltips.
	CFont        m_font;             // Font used by hyperlink control.
	CString      m_strLink;          // String object that represents the URL for this control.
	CString      m_strTipText;       // String object that represents the tooltip text for this control.
	HCURSOR      m_hcurHand;         // Handle to the default cursor for this control.
	COLORREF     m_clrLink;          // An RGB value representing the color for the hyperlink text color.
	COLORREF     m_clrHover;         // An RGB value representing the color for the hyperlink text color when the mouse is hovering.
	COLORREF     m_clrVisited;       // An RGB value representing the color for the hyperlink text color when the URL has been visited.
	COLORREF     m_clrBack;          // An RGB value representing the background fill color for the hyperlink control.
	CToolTipCtrl m_toolTip;          // Tooltip to be displayed for the control.

};

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

AFX_INLINE CString CXTPHyperLink::GetURL() const {
	return m_strLink;
}
AFX_INLINE void CXTPHyperLink::SetColors(COLORREF clrLink, COLORREF clrVisited, COLORREF clrHover) {
	m_clrLink = clrLink; m_clrVisited = clrVisited; m_clrHover = clrHover; RedrawWindow();
}
AFX_INLINE COLORREF CXTPHyperLink::GetLinkColor() const {
	return m_clrLink;
}
AFX_INLINE COLORREF CXTPHyperLink::GetVisitedColor() const {
	return m_clrVisited;
}
AFX_INLINE COLORREF CXTPHyperLink::GetHoverColor() const {
	return m_clrHover;
}
AFX_INLINE void CXTPHyperLink::SetVisited(bool bVisited) {
	m_bVisited = bVisited; RedrawWindow();
}
AFX_INLINE bool CXTPHyperLink::GetVisited() const {
	return m_bVisited;
}
AFX_INLINE void CXTPHyperLink::SetLinkCursor(HCURSOR hCursor) {
	m_hcurHand = hCursor;
}
AFX_INLINE HCURSOR CXTPHyperLink::GetLinkCursor() const {
	return m_hcurHand;
}
AFX_INLINE void CXTPHyperLink::SetUnderline(bool bUnderline) {
	m_bUnderline = bUnderline; InitFont();
}
AFX_INLINE bool CXTPHyperLink::GetUnderline() const {
	return m_bUnderline;
}
AFX_INLINE bool CXTPHyperLink::IsTextControl() {
	return ((GetStyle() & 0xFF) <= SS_RIGHT) ? true : false;
}
AFX_INLINE void CXTPHyperLink::EnableShellExecute(bool bEnable) {
	m_bShellExec = bEnable;
}
AFX_INLINE void CXTPHyperLink::SetBackColor(COLORREF clrBack) {
	m_clrBack = clrBack; RedrawWindow();
}
AFX_INLINE COLORREF CXTPHyperLink::GetBackColor() const {
	return (m_clrBack == (COLORREF)-1) ? GetXtremeColor(COLOR_3DFACE) : m_clrBack;
}

#endif // #if !defined(__XTPHYPERLINK_H__)
