// XTPControlComboBoxExt.h
//
// This file is a part of the XTREME COMMANDBARS 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(__XTPCONTROLCOMBOBOXEXT_H__)
#define __XTPCONTROLCOMBOBOXEXT_H__
//}}AFX_CODEJOCK_PRIVATE

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


//-----------------------------------------------------------------------
// Summary:
//     The XTP_FN_SETFORMAT notification sent by CXTPControlFontComboBox to set current RichEdit selection format
// Example:
//     Here is an example of how an application would process the XTP_FN_SETFORMAT
//     message.
// <code>
// BEGIN_MESSAGE_MAP(CApplicationView, CRichEditView)
//     //{{AFX_MSG_MAP(CApplicationView)
//     ON_NOTIFY(XTP_FN_SETFORMAT, ID_EDIT_SIZE, OnSetCharFormat)
//     //}}AFX_MSG_MAP
// END_MESSAGE_MAP()
//
// void CApplicationView::OnSetCharFormat(NMHDR* pNMHDR, LRESULT* pResult)
// {
//     CHARFORMAT& cf = ((NMXTPCHARHDR*)pNMHDR)->cf;
//     SetCharFormat(cf);
//     *pResult = 1;
// }
// </code>
// See Also: XTP_FN_GETFORMAT, CXTPControlFontComboBox
//-----------------------------------------------------------------------
const UINT XTP_FN_SETFORMAT    = 0x1000;

//-----------------------------------------------------------------------
// Summary:
//     The XTP_FN_GETFORMAT notification sent by CXTPControlFontComboBox to get current RichEdit selection format
// Example:
//     Here is an example of how an application would process the XTP_FN_GETFORMAT
//     message.
// <code>
// BEGIN_MESSAGE_MAP(CApplicationView, CRichEditView)
//     //{{AFX_MSG_MAP(CApplicationView)
//     ON_NOTIFY(XTP_FN_GETFORMAT, ID_EDIT_SIZE, OnGetCharFormat)
//     //}}AFX_MSG_MAP
// END_MESSAGE_MAP()
//
// void CApplicationView::OnGetCharFormat(NMHDR* pNMHDR, LRESULT* pResult)
// {
//     CHARFORMAT& cf = ((NMXTPCHARHDR*)pNMHDR)->cf;
//     cf = GetCharFormatSelection();
//     *pResult = 1;
// }
// </code>
// See Also: XTP_FN_SETFORMAT, CXTPControlFontComboBox
//-----------------------------------------------------------------------
const UINT XTP_FN_GETFORMAT    = 0x1001;


//-----------------------------------------------------------------------
// Summary:
//     Structure used as parameter for XTP_FN_SETFORMAT and XTP_FN_GETFORMAT messages.
// Example: See Example of XTP_FN_SETFORMAT
// See Also: XTP_FN_SETFORMAT, XTP_FN_GETFORMAT, CXTPControlFontComboBox
//-----------------------------------------------------------------------
struct NMXTPCHARHDR : public NMXTPCONTROL
{
//{{AFX_CODEJOCK_PRIVATE
	//-------------------------------------------------------------------------
	// Summary:
	//     Constructs a NMXTPCHARHDR object
	//-------------------------------------------------------------------------
	NMXTPCHARHDR() {cf.cbSize = sizeof(CHARFORMAT);}
//}}AFX_CODEJOCK_PRIVATE


	CHARFORMAT cf;          // Character formatting in a rich edit control.
};


//===========================================================================
// Summary:
//     CXTPControlSizeComboBox is a CXTPControlComboBox derived class. It
//     represents the size picker.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlSizeComboBox : public CXTPControlComboBox
{
	DECLARE_XTP_CONTROL(CXTPControlSizeComboBox)

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlSizeComboBox object
	//-----------------------------------------------------------------------
	CXTPControlSizeComboBox();

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set the current size.
	// Parameters:
	//     nTwips - Size, in twips, to be set
	//-----------------------------------------------------------------------
	void SetTwipSize(int nTwips);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to convert string to twip size
	// Parameters:
	//     lpszText - String contains twips number
	//-----------------------------------------------------------------------
	static int AFX_CDECL GetTwipSize(LPCTSTR lpszText);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to convert twips to string
	// Parameters:
	//     nTwips - twips number to convert
	//-----------------------------------------------------------------------
	static CString AFX_CDECL TwipsToPointString(int nTwips);

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to popup the control.
	// Parameters:
	//     bPopup - TRUE to set popup.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE.
	//-----------------------------------------------------------------------
	virtual BOOL OnSetPopup(BOOL bPopup);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the current user selected size.
	// Returns:
	//     The current size.
	//-----------------------------------------------------------------------
	int GetTwipSize() const;


	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when the control is executed.
	//-----------------------------------------------------------------------
	virtual void OnExecute();

private:
	void EnumFontSizes(CDC& dc, LPCTSTR pFontName);

	static BOOL CALLBACK AFX_EXPORT EnumSizeCallBack(LOGFONT FAR* /*lplf*/,
		LPNEWTEXTMETRIC lpntm, int FontType, LPVOID lpv);

	void InsertSize(int nSize);

private:
	int m_nLogVert;
	int m_nTwipsLast;
};

//===========================================================================
// Summary:
//     CXTPControlFontComboBoxList is a CXTPControlComboBoxList derived
//     class. It represents the font picker popup.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlFontComboBoxList : public CXTPControlComboBoxList
{
	DECLARE_XTP_COMMANDBAR(CXTPControlFontComboBoxList)

public:
//{{AFX_CODEJOCK_PRIVATE
	class _XTP_EXT_CLASS CFontDesc
	{
	public:
		CFontDesc(LPCTSTR lpszName, LPCTSTR lpszScript, BYTE nCharSet,
			BYTE nPitchAndFamily, DWORD dwFlags);
		CString m_strName;
		CString m_strScript;
		BYTE m_nCharSet;
		BYTE m_nPitchAndFamily;
		DWORD m_dwFlags;
	};

	class _XTP_EXT_CLASS CFontDescHolder
	{
	public:
		static BOOL CALLBACK AFX_EXPORT EnumFamScreenCallBack(
			ENUMLOGFONT* pelf, NEWTEXTMETRICEX* /*lpntm*/, int FontType,
			LPVOID pThis);

		static BOOL CALLBACK AFX_EXPORT EnumFamScreenCallBackEx(
			ENUMLOGFONTEX* pelf, NEWTEXTMETRICEX* /*lpntm*/, int FontType,
			LPVOID pThis);

		void AddFont(ENUMLOGFONT* pelf, DWORD dwType, LPCTSTR lpszScript = NULL);

		void EnumFontFamilies();

		~CFontDescHolder()
		{
			for (int i = 0; i < m_arrayFontDesc.GetSize(); i++)
				delete m_arrayFontDesc[i];

		}
	public:
		CArray<CFontDesc*, CFontDesc*> m_arrayFontDesc;
	};
//}}AFX_CODEJOCK_PRIVATE

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads or writes this object from or to an archive.
	// Parameters:
	//     pPX - A CXTPPropExchange object to serialize to or from.
	//----------------------------------------------------------------------
	virtual void DoPropExchange(CXTPPropExchange* pPX);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to make a copy of the command bar.
	// Parameters:
	//     pCommandBar - Command bar needed to be copied.
	//     bRecursive - TRUE to copy recursively.
	//-----------------------------------------------------------------------
	void Copy(CXTPCommandBar* pCommandBar, BOOL bRecursive = FALSE);

	//-----------------------------------------------------------------------
	// Summary:
	//     Creates a list box.
	//-----------------------------------------------------------------------
	void CreateListBox();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to add all fonts to list.
	// Parameters:
	//     dwStyleListBox - Flags to be used in EnumFontFamiliesEx. Currently not supported.
	//-----------------------------------------------------------------------
	void EnumFontFamiliesEx(BOOL dwStyleListBox = 1);

protected:
	DWORD m_dwStyleListBox;     // Style of the control.

private:
	friend class CXTPControlFontComboBox;

};

//===========================================================================
// Summary:
//     CXTPControlFontComboBox is a CXTPControlComboBox derived class. It
//     represents the font picker control.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlFontComboBox : public CXTPControlComboBox
{
	DECLARE_XTP_CONTROL(CXTPControlFontComboBox)

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlFontComboBox object
	// Parameters:
	//     dwStyleListBox - Flags to be used in list box. Currently not supported, must be default.
	//-----------------------------------------------------------------------
	CXTPControlFontComboBox(DWORD dwStyleListBox = 1);

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set current font of the picker.
	// Parameters:
	//     cf - CHARFORMAT structure contains information about character
	//          formatting in a rich edit control.
	//-----------------------------------------------------------------------
	void SetCharFormat(CHARFORMAT& cf);

protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when the control is executed.
	//-----------------------------------------------------------------------
	virtual void OnExecute();

};


#endif //#if !defined(__XTPCONTROLCOMBOBOXEXT_H__)
