// Tfont.h : interface of the CTfont class
//           This class takes text entry from the user.
//           It is derived from the CEdit class
/***************************************************************************/

#ifndef __Tfont_H__
#define __Tfont_H__

// TOOLBAAR CONSTANTS -- Bitmap Positions and Toolbar Positions

#define MAX_TBAR_ITEMS        12 // positions 0 through 11

#define BOLD_BMP_POS          0
#define ITALIC_BMP_POS        1
#define UNDERLINE_BMP_POS     2


#define VERTEDIT_BMP_POS      3
#define PEN_BMP_POS           4
#define EDITTEXT_BMP_POS      5
#define KEYBOARD_BMP_POS      6   // still wasting space in image
#define INS_SPACE_BMP_POS     7
#define BACKSPACE_BMP_POS     8
#define NEWLINE_BMP_POS       9

#define SHADOW_BMP_POS        -1  // don't exist currently

#define BOLD_TBAR_POS         0
#define ITALIC_TBAR_POS       1
#define UNDERLINE_TBAR_POS    2


#define VERTEDIT_TBAR_POS     3
#define SPACE_ONE             4
#define PEN_TBAR_TEXT_POS     5

#define INS_SPACE_TBAR_POS    5
#define BACKSPACE_TBAR_POS    6
#define NEWLINE_TBAR_POS      7
#define SPACE_TWO             8
#define EDITTEXT_TBAR_POS     9
#define SPACE_THREE          10
#define PEN_TBAR_PEN_POS     11

#define SHADOW_TBAR_POS       -1  // don't exist currently
#define KEYBOARD_TBAR_POS     -1  // don't exist currently

#define FONT_BMP_TXT_BORDER   2   // # pixels between font bmp (prn/tt) and text

#define UM_DELAYED_TOOLBAR   WM_USER + 900

// definde font types used by m_iFontType in CTfont class
#define TT_FONT             0x0001
#define TT_OPENTYPE_FONT    0x0002
#define PS_OPENTYPE_FONT    0x0004
#define TYPE1_FONT          0x0008
#define DEVICE_FONT         0x0010
#define RASTER_FONT         0x0020

#define NumCPic         5

class CTedit;    // forward reference for change/undo notification
//class CAttrEdit; // forward reference for setfont,...notification

/******************************************************************************/

class CTfontTbar : public CToolBar
    {
    private:

    protected: // create from serialization only

    DECLARE_DYNCREATE(CTfontTbar)

    protected:

    //{{AFX_MSG(CTfontTbar)
        // NOTE - the ClassWizard will add and remove member functions here.
        //    DO NOT EDIT what you see in these blocks of generated code !
        //  afx_msg void OnInsertObject();  // OLE support
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

    public:

    CTfontTbar(void);

    virtual ~CTfontTbar(void);
    BOOL    Create(CWnd* pcParentWnd, BOOL bShowPen = FALSE);
    };

/******************************************************************************/

class CTfontDlg : public CDialogBar
    {
    private:
    CPic          m_cPictures[NumCPic];
    int           m_Max_cx_FontType_BMP;
    void SetColorsInDC(HDC hdc, BOOL bInverted);
    protected: // create from serialization only

    DECLARE_DYNCREATE(CTfontDlg)

    protected:

    //{{AFX_MSG(CTfontDlg)
    afx_msg void OnRButtonDown ( UINT nFlags, CPoint point );
//
// MFC 4 - had to put the WM_DRAWITEM and WM_MEASUREITEM handlers here instead
// of CTfont. This dialog is the real parent of the owner-draw combobox, don't
// know how the old version worked with these handlers in CTfont.
//
    afx_msg void OnDrawItem    (int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
    afx_msg void OnMeasureItem (int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    afx_msg DWORD OnGetDefId   ( void );
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

    public:

    CTfontDlg(void);
    void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct, CString *pcStringText);
    virtual ~CTfontDlg(void);
    BOOL     Create(CWnd* pcParentWnd);
    };

/******************************************************************************/

class CCharSetDesc;
class CFontDesc;

/******************************************************************************/

class CTfont : public CMiniFrmWnd
    {
    private:

    int           m_iControlIDLastChange;
    int           m_iWeight;
    CFont         m_cCurrentFont;
    CString       m_cStrTypeFaceName;
    CString       m_cStrTypeFaceNamePrev;
    int           m_iPointSize;
    int           m_iPointSizePrev;

    CString       m_strFontName;
    int           m_iFontType;
    BYTE          m_nCharSet;
    BYTE          m_nCharSetPrev;

    BOOL          m_bBoldOn;
    BOOL          m_bItalicOn;
    BOOL          m_bUnderlineOn;

    BOOL          m_bVertEditOn;

    BOOL          m_bShadowOn;
    BOOL          m_bPenOn;

    CRect         m_cRectWindow;
    BOOL          m_bDisplayCText;
    BOOL          m_bInUpdate;

    class CTedit* m_pcTedit;
    CTfontDlg     m_cTfontDlg;
    CTfontTbar    *m_pcTfontTbar; // must be dynamic for changing buttons (delete/new)

    BYTE PickCharSet(CCharSetDesc *pCharSetDescList, int iCharSetSelection);

    void ResizeWindow(void);
    void ProcessNewTypeface(void);
    void UpdateEditControlFont(void);
    void FreeMemoryFromCBox(void);
    void OnTypeFaceComboBoxUpdate(void);
    void OnPointSizeComboBoxUpdate(void);

    void SaveToIniFile(void);
    void ReadFromIniFile(void);

    // was used for spin control to save point sizes,...
    //  CMapWordToPtr PointSizeMap;
    //  void EmptyMap(void);

    void RefreshFontList(void);

    int  EnumFontFace( ENUMLOGFONTEX*   lpEnumLogFont,
                       NEWTEXTMETRICEX* lpNewTextMetric,
                       int             iFontType );

    int  EnumFontSizes( LPENUMLOGFONT   lpEnumLogFont,
                        LPNEWTEXTMETRIC lpNewTextMetric,
                        int             iFontType );

    protected: // create from serialization only

    DECLARE_DYNCREATE(CTfont)

    //{{AFX_MSG(CTfont)
    afx_msg void OnTypefaceChange();
    afx_msg void OnPointSizeChange();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnDestroy();
    afx_msg void OnMove(int x, int y);
    afx_msg void OnClose();
    afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
        //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

    public:

    CTfont();
    CTfont( CTedit *pcTedit );
    ~CTfont(void);

    CWnd* GetFontSizeControl() { return ((m_cTfontDlg.GetSafeHwnd() == NULL)? NULL:
                                          m_cTfontDlg.GetDlgItem( IDC_POINTSIZE ) ); }

    CWnd* GetFontFaceControl() { return ((m_cTfontDlg.GetSafeHwnd() == NULL)? NULL:
                                          m_cTfontDlg.GetDlgItem( IDC_TYPEFACE ) ); }

    //MY AFX_MSG(CTfont)
    afx_msg void OnBold      ( void );
    afx_msg void OnItalic    ( void );
    afx_msg void OnUnderline ( void );

    afx_msg void OnVertEdit  ( void );
    afx_msg void OnVertEditUpdate  ( CCmdUI* pCmdUI );

    afx_msg void OnShadow    ( void );
    afx_msg void OnPen       ( void );
    afx_msg long OnDelayedPen( WPARAM wParam, LPARAM lParam );
    afx_msg void OnEditText  ( void );
    afx_msg void OnKeyboard  ( void );
    afx_msg void OnInsSpace  ( void );
    afx_msg void OnBackSpace ( void );
    afx_msg void OnNewLine   ( void );
    //MY AFX_MSG

    BOOL IsBoldOn      ( void ) { return m_bBoldOn;      }
    BOOL IsItalicOn    ( void ) { return m_bItalicOn;    }
    BOOL IsUnderlineOn ( void ) { return m_bUnderlineOn; }

    BOOL IsVertEditOn  ( void ) { return m_bVertEditOn;  }

    BOOL IsShadowOn    ( void ) { return m_bShadowOn;    }
    BOOL Create        ( CRect rectEditArea );
    void Undo          ( void );
    void RefreshToolBar( void );
    void GetFontInfo   ( int iFontSelection, BYTE nCharSetSelection);

    static int CALLBACK EnumFontFaceProc(ENUMLOGFONTEX* lpEnumLogFont,
                                         NEWTEXTMETRICEX* lpNewTextMetric,
                                          int iFontType, LPARAM lParam);
    static int CALLBACK EnumFontOneFaceProc(LPENUMLOGFONT lpEnumLogFont,
                                            LPNEWTEXTMETRIC lpNewTextMetric,
                                            int iFontType, LPARAM lParam);

    virtual WORD GetHelpOffset() {return 0;} // for now just return 0

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

    virtual void RecalcLayout(BOOL bNotify = TRUE);

    };

/***************************************************************************/

#endif // __Tfont_H__
