// XTPTaskDialogControls.h
//
// This file is a part of the XTREME TOOLKIT PRO 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(__XTPTASKLINKCTRL_H__)
#define __XTPTASKLINKCTRL_H__
//}}AFX_CODEJOCK_PRIVATE

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

//===========================================================================
// Summary:
//     CXTPTaskDialogLinkCtrl is a CStatic derived class that is used to
//     display a text block that contains clickable links.
//===========================================================================
class _XTP_EXT_CLASS CXTPTaskDialogLinkCtrl : public CStatic
{
public:
	//===========================================================================
	// Summary:
	//     LINKITEM is Used to set and retrieve information about a
	//     link item.
	// See Also:
	//     CXTPTaskDialogLinkCtrl::HitTest
	//===========================================================================
	struct LINKITEM
	{
		DWORD       nStart;     // Starting character position,
		int         nIndex;     // Character index of the character nearest the specified point.
		CString     strLabel;   // Specifies the execute string for the link.
		CString     strUrl;     // Specifies the display string for the link.

		CArray<RECT, RECT&> arrParts;
	};

	typedef CArray<LINKITEM*, LINKITEM*> CTaskLinkItemArray;

	DECLARE_DYNCREATE(CXTPTaskDialogLinkCtrl)

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

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

	// -----------------------------------------------------------------------
	// Summary:
	//     Call this member function to create a CXTPTaskDialogLinkCtrl text
	//     control. The control is used by CXTPTaskDialog to display a static
	//     text block that contains clickable link text.
	// Parameters:
	//     rect :        Specifies the edit control's size and position. Can
	//                   be a CRect object or RECT structure.
	//     strBuffer :   NULL terminated string that contains link text to be
	//                   displayed.
	//     pFont :       Specifies the font to be used with the text control.
	//     pParentWnd :  Specifies the edit control's parent window (usually a
	//                   CXTPTaskDialog). It must not be NULL.
	// Remarks:
	//     When specified strBuffer can contain links in the form:
	//     <code>
	//     \<CODE\>\<A HREF="executablestring"\>Hyperlink Text.\</A\>\</CODE\>
	//     </code>
	// Returns:
	//     Nonzero if initialization is successful; otherwise 0.
	// -----------------------------------------------------------------------
	virtual BOOL Create(const CRect& rect, CString& strBuffer, CFont* pFont, CWnd* pParentWnd);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the focused link.
	// Returns:
	//     The pointer of the currently focused link, otherwise NULL.
	//-----------------------------------------------------------------------
	LINKITEM* GetFocusedLink() const;

	// ---------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the focus to specified link
	// Parameters:
	//     iFocusItem :  The index of the focused item or \-1 to indicate no
	//                   focus.
	//
	// ---------------------------------------------------------------------
	void FocusItem(int iFocusItem);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to return the link information from
	//     the specified cursor position.
	// Parameters:
	//     pt - Client coordinates.
	// Returns:
	//     Returns Pointer on success, NULL on failure.
	//-----------------------------------------------------------------------
	LINKITEM* HitTest(CPoint pt) const;

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called to return the character index of
	//     the first link located after the index specified by iPos.
	// Parameters:
	//     strBuffer - NULL terminated string to search for link text.
	//     iPos      - Starting position to begin search from.
	// Returns:
	//     The LOWORD value contains the starting position of the first
	//     link text block found, the HIWORD value contains the number
	//     of characters in the link text.
	//-----------------------------------------------------------------------
	DWORD GetLinkPos(CString strBuffer, int iPos = 0);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called to extract link information from
	//     the specified string buffer and store it internally. The string is
	//     then reformatted to remove the link tag information.
	// Parameters:
	//     strBuffer - NULL terminated string to search for link text.
	// Returns:
	//     TRUE if link text was located, otherwise FALSE.
	//-----------------------------------------------------------------------
	BOOL ExtractLinks(CString& strBuffer);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the background color for the link
	//     control.
	// Parameters:
	//     crBack - RGB value representing the link control's background color.
	//-----------------------------------------------------------------------
	void SetBackColor(COLORREF crBack);
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the link control's background
	//     color.
	// Returns:
	//     RGB value representing the link control's background color.
	//-----------------------------------------------------------------------
	COLORREF GetBackColor() const;
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the text color for the link
	//     control.
	// Parameters:
	//     crText - RGB value representing the link control's text color.
	//-----------------------------------------------------------------------
	void SetTextColor(COLORREF crText);
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the link control's text
	//     color.
	// Returns:
	//     RGB value representing the link control's text color.
	//-----------------------------------------------------------------------
	COLORREF GetTextColor() const;
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to set the text link color for the link
	//     control.
	// Parameters:
	//     crTextLink - RGB value representing the link control's text link color.
	//-----------------------------------------------------------------------
	void SetTextLinkColor(COLORREF crTextLink);
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to retrieve the link control's text link
	//     color.
	// Returns:
	//     RGB value representing the link control's text link color.
	//-----------------------------------------------------------------------
	COLORREF GetTextLinkColor() const;

private:
	void DrawText(CDC* pDC, CRect rClient);
	void DrawTextPart(CDC* pDC, int&x, int&y, int nWidth, CString strBuffer, LINKITEM* pItem);
	int DrawTextPartText(CDC* pDC, CString strBuffer, int x, int y, LINKITEM* pItem);
	void RemoveAllLinks();



protected:
//{{AFX_CODEJOCK_PRIVATE
	DECLARE_MESSAGE_MAP()

	//{{AFX_VIRTUAL(CXTPTaskDialogLinkCtrl)
	BOOL PreCreateWindow(CREATESTRUCT& cs);
	void PreSubclassWindow();
	//}}AFX_VIRTUAL

	//{{AFX_MSG(CXTPTaskDialogLinkCtrl)
	afx_msg void OnPaint();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg LRESULT OnNcHitTest(CPoint /*point*/);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg UINT OnGetDlgCode();
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg LRESULT OnUpdateUIState(WPARAM wParam, LPARAM lParam);
	LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
	//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE

protected:
	int                         m_nFocused;         // Index of the currently focus link.
	CFont                       m_fontUL;           // Font used to render link text.
	CString                     m_strBuffer;        // Text buffer to be displayed in the control.
	HCURSOR                     m_hcurHand;         // Handle to text link cursor.
	COLORREF                    m_crBack;           // RGB background color value.
	COLORREF                    m_crText;           // RGB text color value.
	COLORREF                    m_crTextLink;       // RGB link text color value.
	CTaskLinkItemArray          m_arrLinks;         // Array of links for the display text.
	BOOL m_bPreSubclassWindow;
};


//===========================================================================
// CXTPTaskButtonTheme
//===========================================================================
class _XTP_EXT_CLASS CXTPTaskButtonTheme : public CXTPButtonTheme
{
public:
	CXTPTaskButtonTheme(BOOL bThemeReady);
	CXTPTaskButtonTheme();
	virtual void RefreshMetrics(CXTPButton* pButton);
	void SetTitleFont(CFont* FontTitle);
	CFont* GetTitleFont();

protected:
	virtual BOOL DrawButtonThemeBackground(CDC* pDC, CXTPButton* pButton);
	virtual BOOL DrawWinThemeBackground(CDC* pDC, CXTPButton* pButton);
	virtual void DrawButtonText(CDC* pDC, CXTPButton* pButton);
	virtual COLORREF GetTextColor(CXTPButton* pButton);
	virtual void GetButtonText(CXTPButton* pButton);
	virtual void DrawButtonIcon(CDC* pDC, CXTPButton* pButton);
	virtual void DrawButton(CDC* pDC, CXTPButton* pButton);

	CPoint GetTextPosition(CDC* pDC, CSize sizeText, CXTPButton* pButton);

	CFont* m_pFontTitle;
	CPoint m_ptMargin;
	CString m_strButton;
	CString m_strCaptText;
	CString m_strNoteText;
	CBitmap m_bmpBackClassic;
	CBitmap m_bmpBackThemed;
	CXTPPaintManagerColor m_crTextHilite;
	CXTPPaintManagerColor m_crBackSelected;
	CXTPPaintManagerColor m_crBorderActive;
	BOOL m_bThemeReady;
};

//===========================================================================
// CXTPTaskButtonThemeExpando
//===========================================================================
class _XTP_EXT_CLASS CXTPTaskButtonThemeExpando : public CXTPButtonTheme
{
public:
	CXTPTaskButtonThemeExpando();

	void DrawButton(CDC* pDC, CXTPButton* pButton);
};

//===========================================================================
// CXTPTaskDialogProgressCtrl
//===========================================================================
class _XTP_EXT_CLASS CXTPTaskDialogProgressCtrl : public CProgressCtrl
{
public:
	CXTPTaskDialogProgressCtrl();


protected:
	DECLARE_MESSAGE_MAP()

	//{{AFX_VIRTUAL(CXTPTaskDialogProgressCtrl)
	//}}AFX_VIRTUAL

	//{{AFX_MSG(CXTPTaskDialogProgressCtrl)
	afx_msg void OnPaint();
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg LRESULT OnStartMarquee(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnSetState(WPARAM wParam, LPARAM lParam);
	//}}AFX_MSG


protected:
	int m_nState;
	int m_nMarqueePos;
	UINT m_nMarqueeDelay;
	BOOL m_bMarquee;
};


AFX_INLINE void CXTPTaskDialogLinkCtrl::SetBackColor(COLORREF crBack) {
	m_crBack = crBack;
}
AFX_INLINE COLORREF CXTPTaskDialogLinkCtrl::GetBackColor() const {
	return m_crBack;
}
AFX_INLINE void CXTPTaskDialogLinkCtrl::SetTextColor(COLORREF crText) {
	m_crText = crText;
}
AFX_INLINE COLORREF CXTPTaskDialogLinkCtrl::GetTextColor() const {
	return m_crText;
}
AFX_INLINE void CXTPTaskDialogLinkCtrl::SetTextLinkColor(COLORREF crTextLink) {
	m_crTextLink = crTextLink;
}
AFX_INLINE COLORREF CXTPTaskDialogLinkCtrl::GetTextLinkColor() const {
	return m_crTextLink;
}



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

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(__XTPTASKLINKCTRL_H__)