#include "windows.h"
#include <windowsx.h>
#include "fontedit.h"
#include "fcntl.h"
#include "stdio.h"

#define ATTRDIRLIST 0x4010      /* Include directories and drives in listbox */

/****************************************************************************/
/*              Shared Variables                                            */
/****************************************************************************/
extern LONG lSizeOfOldFontHeader;		/* Old font header type. */
extern FontHeaderType font;             /* Structure of Font File Header */
extern FontHeaderType fontBuffer;       /* temp structure of font file header */
CHAR szFontFileFull[FILENAMEMAX] = {"*.FNT"}; /* Name of Font File */
CHAR szFontFile[FILENAMEMAX] = {"*.FNT"}; /* Name of Font File */
CHAR szNewFile[FILENAMEMAX] = {"*.FNT"};  /* Name of New File */
extern CHAR szFaceName[];               /* Face Name of Font */
extern BOOL NewFile;                    /* flag indicating if file was opened
                                           by selecting NEW on menu */
extern CHAR *vrgsz[CSTRINGS];           /* string table */
extern BOOL fChanged;                   /* Note if we did anything */
extern INT swH;
extern BYTE iChar, jChar;

extern HWND hFont;                      /* Handle to Show window */
extern HWND hBox;                       /* Handle to Edit Window */
extern HDC hMemDC;                      /* Handle to Memory Display Context */

extern CHAR szAppName[];
extern INT iFontFormat;             /* format of font currently being edited */
extern DWORD cTable;                /* offset table size */
/****************************************************************************/
/*              Local Variables                                             */
/****************************************************************************/
WORD newCharSet;                  /* Temporary value of font.CharSet */
WORD newFamily;                   /* Temporary value of font.Family << 4 */
BOOL newFV;     /* Temporay value of Fixed/Variable flag */
WORD newItalic, newUnderline, newStrikeOut;
WORD newWeight;         /* Temporary value of font.Weight */
BOOL fMsgBoxUp; /* Bug Fix Hack explained in ReSizeProc */
/****************************************************************************/
/*              Local Functions                                             */
/****************************************************************************/

VOID SetCharSet(HWND hDial);
VOID SetFamily(HWND hDial);
VOID SetFixed(HWND hDial, BOOL fFV);
VOID SetWeight(HWND hDial);

/****************************************************************************
 * BOOL  APIENTRY HeaderProc(hDial, message, wParam, lParam)
 *
 * purpose : Dialog function which verifies and accepts inputs which may
 *           alter font's header information (font attributes)
 *
 * params  : Same as for all dialog functions
 *
 * side effects: may alter font attributes
 *
 ***************************************************************************/
BOOL  APIENTRY 
HeaderProc(
	HWND   hDial,
	WORD   message,
	WPARAM wParam,
	LPARAM lParam
	)
{
	FontHeaderType FAR * lpFont;
	BOOL fOk;               /* for GetDlgItemInt errors! */
	UINT i;

	UNREFERENCED_PARAMETER(lParam);
	
    lpFont = (FontHeaderType FAR *)&font;
    switch (message)
        {
    default:
        return FALSE;
    case WM_INITDIALOG:
        newCharSet = font.CharSet;
        SetCharSet(hDial);      /* Set OEM/ANSI buttons */

        newFamily = (WORD) (font.Family >> 4);   /* Working value */
        SetFamily(hDial);               /* Set Font Family */

        CheckDlgButton(hDial, ID_ITALIC, newItalic = font.Italic);
        CheckDlgButton(hDial, ID_UNDERLINE, newUnderline = font.Underline);
        CheckDlgButton(hDial, ID_STRIKEOUT, newStrikeOut = font.StrikeOut);

        SetDlgItemInt(hDial, ID_POINTS, lpFont->Points, FALSE);
        SetDlgItemInt(hDial, ID_VERT_RES, lpFont->VertRes, FALSE);
        SetDlgItemInt(hDial, ID_HORIZ_RES, lpFont->HorizRes, FALSE);
        SetDlgItemInt(hDial, ID_ASCENT, lpFont->Ascent, FALSE);
        SetDlgItemInt(hDial, ID_EXT_LEADING, lpFont->ExtLeading, FALSE);
        SetDlgItemInt(hDial, ID_INT_LEADING, lpFont->IntLeading, FALSE);
        SetDlgItemInt(hDial, ID_DEFAULT_CHAR,lpFont->DefaultChar , FALSE);
        SetDlgItemInt(hDial, ID_BREAK_CHAR, lpFont->BreakChar, FALSE);

        SetDlgItemText(hDial, ID_COPYRIGHT, lpFont->Copyright);
        SetDlgItemText(hDial, ID_FACE_NAME, (LPSTR)szFaceName);
        SetDlgItemText(hDial, ID_FONT_NAME, (LPSTR)szFontFile);
        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
            {
        case ID_ANSI:
            newCharSet = ANSI_CHARSET;
            SetCharSet(hDial);          /* Set OEM/ANSI buttons */
            break;
        case ID_SYMBOL:
            newCharSet = SYMBOL_CHARSET;
            SetCharSet(hDial);          /* Set OEM/ANSI buttons */
            break;
        case ID_OEM:
            newCharSet = OEM_CHARSET;
            SetCharSet(hDial);          /* Set OEM/ANSI buttons */
            break;
        case ID_UNKNOWN:
            newFamily = 0;
            SetFamily(hDial);
            break;
        case ID_ROMAN:
            newFamily = 1;
            SetFamily(hDial);
            break;
        case ID_SWISS:
            newFamily = 2;
            SetFamily(hDial);
            break;
        case ID_MODERN:
            newFamily = 3;
            SetFamily(hDial);
            break;
        case ID_SCRIPT:
            newFamily = 4;
            SetFamily(hDial);
            break;
        case ID_DECORATIVE:
            newFamily = 5;
            SetFamily(hDial);
            break;
        case ID_ITALIC:
            newItalic = (WORD) !newItalic;
            CheckDlgButton(hDial, ID_ITALIC, newItalic);
            break;
        case ID_UNDERLINE:
            newUnderline = (WORD) !newUnderline;
            CheckDlgButton(hDial, ID_UNDERLINE, newUnderline);
            break;
        case ID_STRIKEOUT:
            newStrikeOut = (WORD) !newStrikeOut;
            CheckDlgButton(hDial, ID_STRIKEOUT, newStrikeOut);
            break;
        case ID_CHAR_SET  :
            i = GetDlgItemInt(hDial, ID_CHAR_SET, (LPBOOL)&fOk, FALSE);
            if (fOk && (i < 256))
                {
                font.CharSet = (BYTE) (newCharSet = (WORD) i);
                CheckDlgButton(hDial, ID_ANSI, (WORD) (i == ANSI_CHARSET));
                CheckDlgButton(hDial, ID_SYMBOL, (WORD) (i == SYMBOL_CHARSET));
                CheckDlgButton(hDial, ID_OEM, (WORD) (i == OEM_CHARSET));
                }
            break;

        case IDOK:
            font.CharSet = (BYTE) newCharSet;
            font.Family = (BYTE) ((newFamily << 4) | (font.Family & 1));
            font.Italic = (BYTE) newItalic;
            font.Underline = (BYTE) newUnderline;
            font.StrikeOut = (BYTE) newStrikeOut;
            fChanged = TRUE;

            /* nominal point size */
            i = GetDlgItemInt(hDial, ID_POINTS, (LPBOOL)&fOk, FALSE);
            if (fOk)
                lpFont->Points = (WORD) i;
            else{
                ErrorBox(hDial, vszNomPtSizeNotOk);
                SetFocus(GetDlgItem(hDial, ID_POINTS));
                break;
                }
            /* nominal vertical resolution */
            i = GetDlgItemInt(hDial, ID_VERT_RES, (LPBOOL)&fOk, FALSE);
            if (fOk)
                lpFont->VertRes = (WORD) i;
            else{
                ErrorBox(hDial, vszNomVertResNotOk);
                SetFocus(GetDlgItem(hDial, ID_VERT_RES));
                break;
                }
            /* nominal horizontal resolution */
            i = GetDlgItemInt(hDial, ID_HORIZ_RES, (LPBOOL)&fOk, FALSE);
            if (fOk)
                lpFont->HorizRes = (WORD) i;
            else{
                ErrorBox(hDial, vszNomHorResNotOk);
                SetFocus(GetDlgItem(hDial, ID_HORIZ_RES));
                break;
                }
            /* font ascent */
            i = GetDlgItemInt(hDial, ID_ASCENT, (LPBOOL)&fOk, FALSE);
            if (fOk)
                {
                if (i <= font.PixHeight)
                    lpFont->Ascent = (WORD) i;
                else{
                    ErrorBox(hDial, vszAscentTooBig);
                    SetFocus(GetDlgItem(hDial, ID_ASCENT));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszAscentNotOk);
                SetFocus(GetDlgItem(hDial, ID_ASCENT));
                break;
                }
            /* font external leading */
            i = GetDlgItemInt(hDial, ID_EXT_LEADING, (LPBOOL)&fOk, FALSE);
            if (fOk)
                lpFont->ExtLeading = (WORD) i;
            else{
                ErrorBox(hDial, vszExtLeadNotOk);
                SetFocus(GetDlgItem(hDial, ID_EXT_LEADING));
                break;
                }
            /* font internal leading */
            i = GetDlgItemInt(hDial, ID_INT_LEADING, (LPBOOL)&fOk, FALSE);
            if (fOk)
                {
                if (i <= font.Ascent)
                    lpFont->IntLeading = (WORD) i;
                else{
                    ErrorBox(hDial, vszIntLeadTooBig);
                    SetFocus(GetDlgItem(hDial, ID_INT_LEADING));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszIntLeadNotOk);
                SetFocus(GetDlgItem(hDial, ID_INT_LEADING));
                break;
                }
            /* font character set */
            i = GetDlgItemInt(hDial, ID_CHAR_SET, (LPBOOL)&fOk, FALSE);
            if (fOk && i < 256)
                {
                font.CharSet = (BYTE) i;
                SetCharSet(hDial);
                }
            else{
                ErrorBox(hDial, vszCharSetOutOfBounds);
                SetFocus(GetDlgItem(hDial, ID_CHAR_SET));
                break;
                }
            /* font default char number */
            i = GetDlgItemInt(hDial, ID_DEFAULT_CHAR, (LPBOOL)&fOk, FALSE);

            if (fOk)
                {
                if ((i >= font.FirstChar) && (i <= font.LastChar))
                    lpFont->DefaultChar = (BYTE) i;
                else{
                    ErrorBox(hDial, vszDefCharOutsideFont);
                    SetFocus(GetDlgItem(hDial, ID_DEFAULT_CHAR));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszDefCharNotOk);
                SetFocus(GetDlgItem(hDial, ID_DEFAULT_CHAR));
                break;
                }
            /* break char number */
            i = GetDlgItemInt(hDial, ID_BREAK_CHAR, (LPBOOL)&fOk, FALSE);
            if (fOk)
                {
                if ((BYTE)i <= (font.LastChar - font.FirstChar))
                    lpFont->BreakChar = (BYTE) i;
                else{
                    ErrorBox(hDial, vszBreakCharOutsideFont);
                    SetFocus(GetDlgItem(hDial, ID_BREAK_CHAR));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszBreakCharNotOk);
                SetFocus(GetDlgItem(hDial, ID_BREAK_CHAR));
                break;
                }
            /* facename string */
            GetDlgItemText(hDial, ID_COPYRIGHT, lpFont->Copyright, 60);
            GetDlgItemText(hDial, ID_FACE_NAME, (LPSTR)szFaceName, szNamesMax);
            if (!lstrlen((LPSTR)szFaceName))
                {
                lstrcpy((LPSTR)szFaceName, (LPSTR)vszUnknown);
                ErrorBox(hDial, vszUnknownFace);
                }
            /* fall thru to enddialog */


        case IDCANCEL:
            EndDialog(hDial, wParam != IDCANCEL);
            break;

        default:
            break;
            }
        }
    return TRUE;
}

/****************************************************************************
 * char * VerifyHeaderContents()
 *
 * purpose: Checks if the Header information of the file just read makes
 *          sense. If not, returns an error message string to FontLoad
 *
 * params : none
 *
 * returns :char *szError : ptr to error string if error occurs
 *                          NULL otherwise
 *
 * side effects: none
 *
 ***************************************************************************/
CHAR * PASCAL 
VerifyHeaderContents(
	VOID
	)
{
     if (fontBuffer.Points > 999)
        return vszNomPtSizeNotOk;
     if (fontBuffer.VertRes > 999)
        return vszNomVertResNotOk;
     if (fontBuffer.HorizRes > 999)
        return vszNomHorResNotOk;
     if (fontBuffer.Ascent > fontBuffer.PixHeight)
        return vszAscentTooBig;
     if (fontBuffer.Ascent > 999)
        return vszAscentNotOk;
     if (fontBuffer.ExtLeading > 999)
        return vszExtLeadNotOk;
     if (fontBuffer.IntLeading > fontBuffer.Ascent)
        return vszIntLeadTooBig;
     if (fontBuffer.IntLeading > 999)
        return vszIntLeadNotOk;
     if (fontBuffer.LastChar > 255)
        return vszCharSetOutOfBounds;
     if (fontBuffer.DefaultChar > fontBuffer.FirstChar + (fontBuffer.LastChar - fontBuffer.FirstChar))
#if 0
          fontBuffer.DefaultChar = 0;
#else
        return vszDefCharOutsideFont;
#endif
     if (fontBuffer.DefaultChar > 255)
        return vszDefCharNotOk;
     if (fontBuffer.BreakChar > (fontBuffer.LastChar - fontBuffer.FirstChar))
        return vszBreakCharOutsideFont;
     if (fontBuffer.BreakChar > 255)
        return vszBreakCharNotOk;
     if (fontBuffer.PixHeight > 64) 
        return vszHeightOutOfBounds;
     if (fontBuffer.MaxWidth > 64)
        return vszMaxWidthOutOfBounds;
     if (fontBuffer.AvgWidth > 64)
        return vszAvgWidthOutOfBounds;
     if (iFontFormat == ID_FORMAT2)
        if (fontBuffer.BitsOffset > (DWORD)SEGMENT_SIZE)
            return vszBitsOffsetNotOk;
     return NULL;
}

/****************************************************************************
 * BOOL PASCAL Format20FileTooBig(iHeight, iWidth)
 *
 * purpose: Checks if the 2.0 font file size is within the 64k
 *          limit imposed by the 2.0 format offset table.( if file over
 *          size limit is saved  in 2.0 format, loss of information will
 *          result)
 *
 * params:  WORD iHeight : current height of font in pixels
 *          WORD iWidth  : current width of font in pixels
 *
 * returns: TRUE  : file too large
 *          FALSE : ok to save
 *
 * side effects: none
 *
 ***************************************************************************/
BOOL PASCAL 
Format20FileTooBig(
	WORD iHeight,
	WORD iWidth
	)
{
    if ((DWORD)lSizeOfOldFontHeader + (DWORD)cTable
         + (font.LastChar - font.FirstChar +1)
         * (((DWORD)iHeight * (DWORD)iWidth ) >> 3) >= WORD_LIMIT)
             return TRUE;
    return FALSE;
}

/****************************************************************************
 * BOOL  APIENTRY ReSizeProc(hDial, message, wParam, lParam)
 *
 * purpose : dialog fn. which verifies and accepts font resize (stretch,
 *           shrink...) input and calls the appropriate routine to perform
 *           the function. Also alters font weight attributes (bold, light,
 *           extra light...)
 *
 * params  : same as for all dialog functions
 *
 * side effects: alters header information regarding font dimensions and font
 *               weight
 *
 ***************************************************************************/
BOOL  APIENTRY 
ReSizeProc(
	HWND   hDial,
	WORD   message,
	WPARAM wParam,
	LPARAM lParam 
	)
{
	FontHeaderType FAR * lpFont;
	BOOL fOk;               /* for GetDlgItemInt errors! */
	UINT i;
	HMENU hMenu;
	static BOOL fFV; /* temporary fixed/var width flag */

	UNREFERENCED_PARAMETER(lParam);

    lpFont = (FontHeaderType FAR *)&font;
    switch (message)
        {
    case WM_INITDIALOG:
        fMsgBoxUp = FALSE;
        newWeight = (WORD) font.Weight;
        newFV = (BOOL) (font.Family & 1);
        fFV = newFV;
        SetFixed(hDial, fFV);   /* Set Fixed or Variable width */
        SetDlgItemInt(hDial, ID_PIX_HEIGHT, lpFont->PixHeight, FALSE);
        SetDlgItemInt(hDial, ID_FIRST_CHAR, lpFont->FirstChar, FALSE);
        SetDlgItemInt(hDial, ID_WIDTH, lpFont->MaxWidth, FALSE);
        SetDlgItemInt(hDial, ID_AVERAGE, lpFont->AvgWidth, FALSE);
        SetDlgItemInt(hDial, ID_LAST_CHAR, lpFont->LastChar, FALSE);
        SetWeight(hDial);
        SetFixed(hDial, fFV);
        break;

    case WM_COMMAND:
        switch (LOWORD(wParam))
            {
        case ID_THIN:
            newWeight = FW_THIN;
            SetWeight(hDial);
            break;
        case ID_EXTRALIGHT:
            newWeight = FW_EXTRALIGHT;
            SetWeight(hDial);
            break;
        case ID_LIGHT:
            newWeight = FW_LIGHT;
            SetWeight(hDial);
            break;
        case ID_NORMAL:
            newWeight = FW_NORMAL;
            SetWeight(hDial);
            break;
        case ID_MEDIUM:
            newWeight = FW_MEDIUM;
            SetWeight(hDial);
            break;
        case ID_BOLD:
            newWeight = FW_BOLD;
            SetWeight(hDial);
            break;
        case ID_SEMIBOLD:
            newWeight = FW_SEMIBOLD;
            SetWeight(hDial);
            break;
        case ID_EXTRABOLD:
            newWeight = FW_EXTRABOLD;
            SetWeight(hDial);
            break;
        case ID_HEAVY:
            newWeight = FW_HEAVY;
            SetWeight(hDial);
            break;

        case ID_FIXED:
            fFV = 0;
            SetFixed(hDial, fFV);
            break;
        case ID_VARIABLE:
            fFV = 1;
            SetFixed(hDial, fFV);
            break;

        case IDOK:
            fChanged = TRUE;
            font.Weight = newWeight;
            /* give warning if user attempts to change from variable to
               fixed width */
            if ((fFV == 0) && (newFV != 0))
                {
                fMsgBoxUp = TRUE;
                ErrorBox(hDial, vszNoVarToFixChange);
                fMsgBoxUp = FALSE;
                SetFocus(GetDlgItem(hDial, ID_VARIABLE));
                break;
                }
            else
                newFV = fFV;

            if (newFV && !(font.Family & 1))
                {
                font.PixWidth = 0;      /* All we need to do to make this */
                font.Family |= 1;       /* .. font variable width */
                }
            /* change height command */
            i = GetDlgItemInt(hDial, ID_PIX_HEIGHT, (LPBOOL)&fOk, FALSE);
            if (fOk && i && i < kBoxLim && i>0 )
                {
                    if (i != font.PixHeight){        /* Same size ? */
                        /* No: Resize body height */
                        if (!ResizeBody(font.WidthBytes, i)){
                            SetFocus(hDial);
                            break;
                        }
                    }
                }
            else{
                ErrorBox(hDial, vszHeightOutOfBounds);
                SetFocus(GetDlgItem(hDial, ID_PIX_HEIGHT));
                break;
                }

            /* change width command */
            i = GetDlgItemInt(hDial, ID_WIDTH, (LPBOOL)&fOk, FALSE);
            if (fOk && i < wBoxLim && i > 0){
                if (i != font.MaxWidth){
                    if (newFV){
                        if (!SpreadWidths(i)){
                            SetFocus(hDial);
                            break;        /* New Variable Widths */
                        }
                    }
                    else{
                        if (!ResizeWidths(i)){
                            SetFocus(hDial);
                            break;        /* New Fixed Widths */
                        }
                    }
                }
            }
            else{
                ErrorBox(hDial, vszWidthOutOfBounds);
                SetFocus(GetDlgItem(hDial, ID_WIDTH));
                break;
                }

            /* new first char command */
            i = GetDlgItemInt(hDial, ID_FIRST_CHAR, (LPBOOL)&fOk, FALSE);
            if (fOk)
                {
                if ((i <= font.LastChar) && (i <= font.DefaultChar))
                    {
                    if (i != font.FirstChar)
                        {
                        if (!NewFirstChar(i))
                            break;
                        iChar = jChar = (CHAR) i;
                        swH = 0;
                        ScrollFont();           /* Show front end */
                        }
                    }
                else{
                    ErrorBox(hDial, vszChar1MoreThanDChar);
                    SetFocus(GetDlgItem(hDial, ID_FIRST_CHAR));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszChar1NotOk);
                SetFocus(GetDlgItem(hDial, ID_FIRST_CHAR));
                break;
                }


            /* new last char command */
            i = GetDlgItemInt(hDial, ID_LAST_CHAR, (LPBOOL)&fOk, FALSE);
            if (fOk && i < 256)
                {
                if ((i >= font.FirstChar) && 
					(i >= font.DefaultChar))
                    {
                    if (i != font.LastChar)
                        {
                        if (!NewLastChar(i))
                            break;
                        iChar = jChar = (CHAR) i;
                        swH = 100;
                        ScrollFont();           /* Show back end */
                        }
                    }
                else{
                    ErrorBox(hDial, vszLastCharTooSmall);
                    SetFocus(GetDlgItem(hDial, ID_LAST_CHAR));
                    break;
                    }
                }
            else{
                ErrorBox(hDial, vszLastCharNotOk);
                SetFocus(GetDlgItem(hDial, ID_LAST_CHAR));
                break;
                }

            /* this is moved from SetFixed, since it should only be done
             * if idok pressed. */
            if (newFV)
                {  /* Enable "width" if variable-width font */
                hMenu = GetMenu(hBox);
                EnableMenuItem(hMenu, 4, MF_BYPOSITION | MF_ENABLED);
                DrawMenuBar(hBox);
                }

            /* fall thru to enddialog...*/

        case IDCANCEL:
            EndDialog(hDial, wParam != IDCANCEL);
            break;

        default:
            return FALSE;
            break;
            }  /* end switch wParam */

    default:
        return FALSE;
        } /* end switch message */

    return TRUE;
}

VOID
ErrorBox(
	HWND hWndparent,    
	CHAR * szMessage
	)
	/* Show Message Box */
{
    MessageBox(hWndparent, (LPSTR)szMessage, (LPSTR)szAppName,
                  MB_OK | MB_ICONASTERISK | MB_APPLMODAL);
}

/****************************************************************************
 * SetCharSet(hDial)
 *
 * purpose : Set ANSI/OEM dialog button and set the number in edit window
 *
 * param   : HWND hDial : handle to dialog box window
 *
 * returns : none
 *
 ***************************************************************************/
VOID
SetCharSet(
	HWND hDial
	)
{
    CheckDlgButton(hDial, ID_ANSI, (WORD) (newCharSet == ANSI_CHARSET));
    CheckDlgButton(hDial, ID_SYMBOL, (WORD) (newCharSet == SYMBOL_CHARSET));
    CheckDlgButton(hDial, ID_OEM, (WORD) (newCharSet == OEM_CHARSET));
    SetDlgItemInt(hDial,  ID_CHAR_SET, newCharSet, FALSE);
}

/****************************************************************************
 * SetFixed(hDial)
 *
 * purpose : Set fixed/variable dialog button
 *
 * params  : HWND hDial : handle to dialog box window
 *           BOOL fFV   : variable or fixed
 *
 * returns : none
 *
 ***************************************************************************/
VOID
SetFixed(
	HWND hDial,
	BOOL fFV
	)
{
    CheckDlgButton(hDial, ID_FIXED, (WORD)(fFV == 0));
    CheckDlgButton(hDial, ID_VARIABLE, (WORD)(fFV == 1));
    if (newFV)
        SetDlgItemText(hDial, ID_WIDTH_TEXT, (LPSTR)vszMaxWidth);
    else
        SetDlgItemText(hDial, ID_WIDTH_TEXT, (LPSTR)vszCharPixelWidth);
}

/****************************************************************************
 * SetWeight(hDial)
 *
 * purpose : Set font weight dialog button
 *
 * params  : HWND hDial : handle to dialog box window
 *
 * returns : none
 *
 ****************************************************************************/
VOID
SetWeight(
	HWND hDial
	)
{
    CheckDlgButton(hDial, ID_THIN, (WORD)(newWeight == FW_THIN));
    CheckDlgButton(hDial, ID_EXTRALIGHT, (WORD)(newWeight == FW_EXTRALIGHT));
    CheckDlgButton(hDial, ID_LIGHT, (WORD)(newWeight == FW_LIGHT));
    CheckDlgButton(hDial, ID_NORMAL, (WORD)(newWeight == FW_NORMAL));
    CheckDlgButton(hDial, ID_MEDIUM, (WORD)(newWeight == FW_MEDIUM));
    CheckDlgButton(hDial, ID_SEMIBOLD, (WORD)(newWeight == FW_SEMIBOLD));
    CheckDlgButton(hDial, ID_BOLD, (WORD)(newWeight == FW_BOLD));
    CheckDlgButton(hDial, ID_EXTRABOLD, (WORD)(newWeight == FW_EXTRABOLD));
    CheckDlgButton(hDial, ID_HEAVY, (WORD)(newWeight == FW_HEAVY));
}

/****************************************************************************
 * SetFamily(hDial)
 *
 * purpose : Set font family dialog button
 *
 * params  : HWND hDial : handle to dialog box window
 *
 * returns : none
 *
 ***************************************************************************/
VOID
SetFamily(
	HWND hDial
	)
{
    CheckDlgButton(hDial, ID_UNKNOWN, (WORD) (newFamily == 0));
    CheckDlgButton(hDial, ID_ROMAN, (WORD)(newFamily == 1));
    CheckDlgButton(hDial, ID_SWISS, (WORD)(newFamily == 2));
    CheckDlgButton(hDial, ID_MODERN, (WORD)(newFamily == 3));
    CheckDlgButton(hDial, ID_SCRIPT, (WORD)(newFamily == 4));
    CheckDlgButton(hDial, ID_DECORATIVE, (WORD) (newFamily == 5));
}
