/****************************************************************************/
/*                                                                          */
/*                         Microsoft Confidential                           */
/*                                                                          */
/*                 Copyright (c) Microsoft Corp.  1987, 1990                */
/*                           All Rights Reserved                            */
/*                                                                          */
/****************************************************************************/
/****************************** Module Header *******************************
* Module Name: globals.c
*
* Contains global data for the dialog box editor.
*
* History:
*
****************************************************************************/

#include "dlgedit.h"
#include "dlgextrn.h"           /* Including this verifies they are synched.*/
#include "dlgfuncs.h"
#include "dialogs.h"
#include "dlghelp.h"

HANDLE ghInst;                  /* Application instance handle.         */
HMENU ghMenuMain;               /* Main menu handle.                    */
PRESLINK gprlHead = NULL;       /* Head of the linked list of resources.*/
CURRENTDLG gcd;                 /* Describes the current dialog.        */
HPEN hpenDarkGray;              /* A dark gray pen.                     */
HANDLE ghAccTable;              /* The accelerator table handle.        */
INT gMenuSelected = 0;          /* Currently selected menu item.        */
HBITMAP ghbmDragHandle = NULL;  /* Handle for the drag handle bitmap.   */
HBITMAP ghbmDragHandle2 = NULL; /* Handle for hollow drag handle bitmap.*/
HDC ghDCMem = NULL;             /* Memory DC for drawing bitmaps.       */
INT gCurTool = W_NOTHING;       /* Currently selected tool.             */
PWINDOWCLASSDESC gpwcdCurTool = NULL; /* Describes current tool.        */
BOOL gfToolLocked = FALSE;      /* TRUE if a tool is locked down.       */
PCUSTLINK gpclHead = NULL;      /* Head of custom control linked list.  */

/*
 * When the dialog editor displays one of its own dialogs, this value
 * will contain the resource id of it.  It is zero if there is not a
 * dialog up.
 */
INT gidCurrentDlg = 0;

/*
 * Ordinal for the icon control to display in the dialog.  It will be
 * initialized to one of the editor's own icons.
 */
ORDINAL gordIcon;

/*
 * Bitmap handles for the up and down W_NOTHING (pointer) tool bitmaps.
 */
HBITMAP ghbmPointerToolUp = NULL;
HBITMAP ghbmPointerToolDown = NULL;

/*-- Initialized "Preferences" Data ------------------------------------*/

/*
 * Initialization data structure.  This describes each profile entry
 * that is contained in the initialization file.
 */
INIENTRY gaie[] = {
    { L"fHexMode",      &gfHexMode,         FALSE,              0 },
    { L"fTranslateMode",&gfTranslateMode,   FALSE,              0 },
    { L"fShowToolbox",  &gfShowToolbox,     TRUE,               0 },
    { L"fUseNewKeywords",&gfUseNewKeywords, TRUE,               0 },
    { L"cxGrid",        &gcxGrid,           DEFCXGRID,          0 },
    { L"cyGrid",        &gcyGrid,           DEFCYGRID,          0 },
    { L"xMargin",       &gxMargin,          DEFXMARGIN,         0 },
    { L"yMargin",       &gyMargin,          DEFYMARGIN,         0 },
    { L"xSpace",        &gxSpace,           DEFXSPACE,          0 },
    { L"ySpace",        &gySpace,           DEFYSPACE,          0 },
    { L"xMinPushSpace", &gxMinPushSpace,    DEFXMINPUSHSPACE,   0 },
    { L"xMaxPushSpace", &gxMaxPushSpace,    DEFXMAXPUSHSPACE,   0 },
    { L"yPushSpace",    &gyPushSpace,       DEFYPUSHSPACE,      0 },
    { NULL,             NULL,               0,                  0 }
};

BOOL gfHexMode;                 /* TRUE if in "hex" mode.               */
BOOL gfTranslateMode;           /* TRUE if in "translate" mode.         */
BOOL gfShowToolbox;             /* TRUE if Toolbox is to be shown.      */
BOOL gfUseNewKeywords;          /* FALSE to only use "CONTROL" keyword. */
INT gcxGrid;                    /* Current X grid.                      */
INT gcyGrid;                    /* Current Y grid.                      */
INT gxMargin;                   /* Top/bottom margin.                   */
INT gyMargin;                   /* Left/right margin.                   */
INT gxSpace;                    /* Horizontal control spacing.          */
INT gySpace;                    /* Vertical control spacing.            */
INT gxMinPushSpace;             /* Minimum horizontal button spacing.   */
INT gxMaxPushSpace;             /* Maximum horizontal button spacing.   */
INT gyPushSpace;                /* Vertical button spacing.             */

TCHAR szAppPos[] = L"AppPos";   /* App window's position keyname.       */
TCHAR szTBPos[] = L"TBPos";     /* Toolbox window's position keyname.   */
TCHAR szCustomDLL[] = L"CustomDLL";/* Section name for DLL cust. cntls. */

/*-- Sundry Handles.----------------------------------------------------*/
HWND hwndStatus = NULL;         /* Status ribbon window handle.         */
HWND ghwndToolbox = NULL;       /* Toolbox window handle.               */
HWND ghwndTestDlg = NULL;       /* Handle of the Test Mode dialog.      */
HWND ghwndMain = NULL;          /* Main application window.             */
HWND ghwndSubClient = NULL;     /* The "fake" client area.              */
HWND ghwndTrackOver = NULL;     /* Window being tracked over.           */

/*-- Some System constants.---------------------------------------------*/
INT gcxSysChar;                 /* Pixel width of system font char box. */
INT gcySysChar;                 /* Pixel height of system font char box.*/
INT gcyBorder;                  /* System height of a border.           */
INT gcxPreDragMax;              /* Max X mouse move during pre-drag.    */
INT gcyPreDragMax;              /* Max Y mouse move during pre-drag.    */
INT gmsecPreDrag;               /* The milliseconds that pre-drag lasts.*/
INT gcyPixelsPerInch;           /* Vertical pixels/inch of system.      */
INT gcyStatus;                  /* Saves height of the status window.   */

/*-- Some state variables.----------------------------------------------*/
INT gState = STATE_NORMAL;      /* Has the editor "state" or mode.      */
BOOL gfResChged = FALSE;        /* Tell if RES has changed              */
BOOL gfIncChged = FALSE;        /* Tell if include has changed          */
BOOL gfDlgChanged = FALSE;      /* TRUE if current dialog has changed.  */
INT gcSelected = 0;             /* Count of selected windows.           */
BOOL gfTestMode = FALSE;        /* TRUE if in "test" mode.              */
BOOL gfDisabled = FALSE;        /* TRUE if editing is disabled for now. */
BOOL gfEditingDlg = FALSE;      /* TRUE means a dlg is picked to edit.  */
BOOL gfDlgSelected = FALSE;     /* TRUE if the dialog has the selection.*/

/*
 * Contains the window rectangle, in window units, for the "client"
 * area for the currently chosen dialog being edited.  This rectangle
 * is relative to the dialog box window.  The xLeft and yBottom fields
 * contain the offset from the window origin of the dialog box to the
 * origin of the "client" area.
 */
RECT grcDlgClient;

/*
 * Contains a rectangle that surrounds all the existing controls.  This
 * is used during tracking of the dialog to limit the minimum size that
 * the dialog can be sized to.
 */
RECT grcMinDialog;

/*
 * Contains the offset from the origin of the currently selected
 * control to the mouse pointer.  This is updated when a control
 * is clicked on and is used for dragging calculations.
 */
POINT gptCursorOffset;

/*
 * Contains the rectangle that surrounds the selected control(s).  This
 * rectangle is only valid if there are selected controls.
 */
RECT grcSelected;

/*
 * Contains the rectangle that surrounds the control(s) that are being
 * copied.  This is also used during a clipboard paste operation.  In
 * that case, it contains the rectangle that surrounds the control(s)
 * as they are defined in the res image.
 */
RECT grcCopy;

/*
 * These contain the current location of the tracking rectangle when
 * dragging a control.  The values for grcTrackDU are in Dialog Units
 * (DU's) and the values in grcTrackWin are in window units.  The
 * grcTrackWin values will only be valid if gfTrackRectShown is TRUE;
 */
RECT grcTrackDU;                /* Track rect in dialog units.          */
RECT grcTrackWin;               /* Track rect in window units.          */
BOOL gfTrackRectShown = FALSE;  /* TRUE if track rect is visible.       */
HDC ghDCTrack;                  /* Clip DC used when tracking.          */

/*
 * Contains the current drag handle that is being tracked.  This will
 * be one of the DRAG_* constants.
 */
INT gHandleHit = DRAG_CENTER;

/*
 * Contains the overhang that is allowed during the current tracking
 * operation.  This is used by various routines during dragging so
 * that limiting the tracking to the dialog boundaries works properly.
 * In actuality, this is only non-zero when a combo box control is
 * being drapped or dragged.  It will be the height of the listbox
 * portion of the combo.  This is how combos are allowed to extend
 * below the bottom of the dialog.
 */
INT gnOverHang;                 /* Maximum overhang during the drag.    */

/*
 * This pointer is either NULL, or else it points to a dialog resource.
 * It is used when copying dialogs/controls, either with the Duplicate
 * command or pasting from the clipboard.
 */
PRES gpResCopy;                 /* Copy of dialog/controls.             */

/*-- CTYPE linked lists.------------------------------------------------*/
NPCTYPE npcHead = NULL;         /* Linked List of controls.             */
INT cWindows = 0;               /* Number of Controls in pctype list.   */

/*
 * Pointer to the CTYPE structure for the currently selected control.
 * This will be NULL if there is no control selected.
 */
NPCTYPE gnpcSel = NULL;

/*-- Cursors used by editor.--------------------------------------------*/
HCURSOR hcurArrow = NULL;       /* Normal arrow cursor.                 */
HCURSOR hcurWait = NULL;        /* User Wait cursor, Hourglass.         */
HCURSOR hcurOutSel = NULL;      /* Outline selection cursor.            */
HCURSOR hcurMove = NULL;        /* System "Move" cursor.                */
HCURSOR hcurInsert = NULL;      /* Insert cursor for Order/Group dialog.*/
HCURSOR hcurDropTool = NULL;    /* Cursor for when dropping new ctrls.  */
HCURSOR hcurSizeNESW = NULL;    /* System sizing "NESW" cursor.         */
HCURSOR hcurSizeNS = NULL;      /* System sizing "NS" cursor.           */
HCURSOR hcurSizeNWSE = NULL;    /* System sizing "NWSE" cursor.         */
HCURSOR hcurSizeWE = NULL;      /* System sizing "WE" cursor.           */
HBITMAP hbmTabStop = NULL;      /* Bitmap for showing WS_TABSTOP style. */
HBITMAP hbmTabStopSel = NULL;   /* Selected version of the above.       */

/*-- Window Class Strings.----------------------------------------------*/
TCHAR szMainClass[] = L"DlgEdit";/* Application window class.           */
TCHAR szDragClass[] = L"Drag";  /* Class for drag handle windows.       */
TCHAR szSubClientClass[] =
    L"SubClient";               /* Short client area window class.      */
TCHAR szToolboxClass[] =
    L"Toolbox";                 /* Toolbox window class.                */
TCHAR szToolBtnClass[] =
    L"ToolBtn";                 /* Toolbox button window class.         */
TCHAR szCustomClass[] =
    L"DlgCustom";               /* Our custom emulator class.           */

/*-- Miscellaneous variables.-------------------------------------------*/
UINT fmtDlg;                    /* The Dialog Clipboard format          */
TCHAR szEmpty[] = L"";          /* An empty string.                     */
HHOOK ghhkMsgFilter;            /* Hook handle for message filter func. */

/*-- Buffers.-----------------------------------------------------------*/
TCHAR szFullResFile[CCHMAXPATH];    /* Full resource file name          */
LPTSTR pszResFile;                  /* Points to resource file name     */
TCHAR szFullIncludeFile[CCHMAXPATH];/* Full include file name           */
LPTSTR pszIncludeFile;              /* Points to include file name      */
TCHAR gszHelpFile[CCHMAXPATH];      /* Path to the help file.           */

/*
 * Write buffer and index into it.  This buffer is used by several
 * sections to write out the different files.  Note that only one
 * file can be written out at a time using these globals.
 */
TCHAR gachWriteBuffer[CCHFILEBUFFER];/* Buffer for written file data.   */
INT cbWritePos;                     /* Pointer into gachWriteBuffer.    */

/*-- Include Data.------------------------------------------------------*/
NPLABEL plInclude = NULL;       /* Pointer to Include data              */
NPLABEL plDelInclude = NULL;    /* Pointer to deleted includes          */

/*
 * Describes each window class.  Indexed by the W_ defined constants.
 * The define CCONTROLS needs to be updated if controls are added or
 * removed from this array.  Note that CCONTROLS does NOT count the
 * W_DIALOG type as a control, however.
 */
WINDOWCLASSDESC awcd[] = {
    /*
     * W_TEXT
     */
    {
        W_TEXT,
        WS_CHILD | WS_GROUP | WS_VISIBLE | SS_LEFT,
        WS_DISABLED,
        0,
        0,
        20, 8,
        IC_STATIC, NULL,
        FALSE, FALSE, TRUE, TRUE, TRUE,
        DID_TEXTSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_TEXTSTYLES, IDS_DEFTXTTEXT, NULL, NULL,
        IDBM_CTTEXT, NULL, NULL,
        IDBM_TUTEXT, NULL, IDBM_TDTEXT, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_EDIT
     */
    {
        W_EDIT,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT |
        ES_AUTOHSCROLL,
        WS_DISABLED,
        0,
        0,
        32, 12,
        IC_EDIT, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_EDITSTYLES, (WNDPROC)EditStylesDlgProc,
        HELPID_EDITSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTEDIT, NULL, NULL,
        IDBM_TUEDIT, NULL, IDBM_TDEDIT, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_GROUPBOX
     */
    {
        W_GROUPBOX,
        WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
        WS_DISABLED,
        0,
        0,
        48, 40,
        IC_BUTTON, NULL,
        FALSE, FALSE, TRUE, TRUE, FALSE,
        DID_GROUPBOXSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_GROUPBOXSTYLES, IDS_DEFTXTGROUP, NULL, NULL,
        IDBM_CTGROUP, NULL, NULL,
        IDBM_TUGROUP, NULL, IDBM_TDGROUP, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_PUSHBUTTON
     */
    {
        W_PUSHBUTTON,
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,
        WS_DISABLED,
        0,
        0,
        40, 14,
        IC_BUTTON, NULL,
        FALSE, FALSE, TRUE, TRUE, TRUE,
        DID_PUSHBUTTONSTYLES, (WNDPROC)PushButtonStylesDlgProc,
        HELPID_PUSHBUTTONSTYLES, IDS_DEFTXTPUSHBUTTON, NULL, NULL,
        IDBM_CTPUSH, NULL, NULL,
        IDBM_TUPUSH, NULL, IDBM_TDPUSH, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_CHECKBOX
     */
    {
        W_CHECKBOX,
        WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,
        WS_DISABLED,
        0,
        0,
        40, 10,
        IC_BUTTON, NULL,
        FALSE, FALSE, TRUE, TRUE, TRUE,
        DID_CHECKBOXSTYLES, (WNDPROC)CheckBoxStylesDlgProc,
        HELPID_CHECKBOXSTYLES, IDS_DEFTXTCHECKBOX, NULL, NULL,
        IDBM_CTCHECK, NULL, NULL,
        IDBM_TUCHECK, NULL, IDBM_TDCHECK, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_RADIOBUTTON
     */
    {
        W_RADIOBUTTON,
        WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
        WS_DISABLED,
        0,
        0,
        39, 10,
        IC_BUTTON, NULL,
        FALSE, FALSE, TRUE, TRUE, TRUE,
        DID_RADIOBUTTONSTYLES, (WNDPROC)RadioButtonStylesDlgProc,
        HELPID_RADIOBUTTONSTYLES, IDS_DEFTXTRADIOBUTTON, NULL, NULL,
        IDBM_CTRADIO, NULL, NULL,
        IDBM_TURADIO, NULL, IDBM_TDRADIO, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_COMBOBOX
     */
    {
        W_COMBOBOX,
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWN |
        CBS_SORT,
        WS_DISABLED | CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE |
        CBS_HASSTRINGS,
        CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS,
        0,
        48, 35,
        IC_COMBOBOX, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_COMBOBOXSTYLES, (WNDPROC)ComboBoxStylesDlgProc,
        HELPID_COMBOBOXSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTCOMBO, NULL, NULL,
        IDBM_TUCOMBO, NULL, IDBM_TDCOMBO, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_LISTBOX
     */
    {
        W_LISTBOX,
        WS_CHILD | WS_VISIBLE | LBS_STANDARD | WS_TABSTOP,
        WS_DISABLED | LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE |
        LBS_HASSTRINGS | LBS_NODATA,
        LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS |
        LBS_NODATA,
        0,
        48, 40,
        IC_LISTBOX, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_LISTBOXSTYLES, (WNDPROC)ListBoxStylesDlgProc,
        HELPID_LISTBOXSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTLIST, NULL, NULL,
        IDBM_TULIST, NULL, IDBM_TDLIST, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_HORZSCROLL
     */
    {
        W_HORZSCROLL,
        WS_CHILD | WS_VISIBLE | SBS_HORZ,
        WS_DISABLED,
        0,
        0,
        48, 0,
        IC_SCROLLBAR, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_HORZSCROLLSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_HORZSCROLLSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTHSCROL, NULL, NULL,
        IDBM_TUHSCROL, NULL, IDBM_TDHSCROL, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_VERTSCROLL
     */
    {
        W_VERTSCROLL,
        WS_CHILD | WS_VISIBLE | SBS_VERT,
        WS_DISABLED,
        0,
        0,
        0, 40,
        IC_SCROLLBAR, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_VERTSCROLLSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_VERTSCROLLSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTVSCROL, NULL, NULL,
        IDBM_TUVSCROL, NULL, IDBM_TDVSCROL, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_FRAME
     */
    {
        W_FRAME,
        WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
        WS_DISABLED,
        0,
        0,
        20, 16,
        IC_STATIC, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_FRAMESTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_FRAMESTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTFRAME, NULL, NULL,
        IDBM_TUFRAME, NULL, IDBM_TDFRAME, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_RECT
     */
    {
        W_RECT,
        WS_CHILD | WS_VISIBLE | SS_BLACKRECT,
        WS_DISABLED,
        0,
        0,
        20, 16,
        IC_STATIC, NULL,
        FALSE, FALSE, FALSE, TRUE, FALSE,
        DID_RECTSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_RECTSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTRECT, NULL, NULL,
        IDBM_TURECT, NULL, IDBM_TDRECT, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_ICON
     */
    {
        W_ICON,
        WS_CHILD | WS_VISIBLE | SS_ICON,
        WS_DISABLED,
        0,
        0,
        0, 0,
        IC_STATIC, NULL,
        FALSE, FALSE, TRUE, FALSE, FALSE,
        DID_ICONSTYLES, (WNDPROC)GenericStylesDlgProc,
        HELPID_ICONSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTICON, NULL, NULL,
        IDBM_TUICON, NULL, IDBM_TDICON, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_CUSTOM
     *
     * For Custom controls, we do not allow our emulator control
     * to be created with any other styles than the default ones
     * (WS_CHILD and WS_VISIBLE), but whatever styles the user
     * specifies are written out to the .res and .dlg files,
     * of course.
     */
    {
        W_CUSTOM,
        WS_CHILD | WS_VISIBLE,
        WS_DISABLED,
        0,
        0,
        40, 14,
        IC_CUSTOM, NULL,
        TRUE, FALSE, TRUE, TRUE, FALSE,
        DID_CUSTOMSTYLES, (WNDPROC)CustomStylesDlgProc,
        HELPID_CUSTOMSTYLES, IDS_NULL, NULL, NULL,
        IDBM_CTCUSTOM, NULL, NULL,
        IDBM_TUCUSTOM, NULL, IDBM_TDCUSTOM, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    },
    /*
     * W_DIALOG
     */
    {
        W_DIALOG,
        WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | WS_POPUP |
        DS_SETFONT,
        WS_DISABLED | DS_SYSMODAL | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
        WS_CHILD,
        DS_SYSMODAL,
        0,
        160, 100,
        IC_DIALOG, NULL,
        FALSE, FALSE, TRUE, TRUE, FALSE,
        DID_DIALOGSTYLES, (WNDPROC)DialogStylesDlgProc,
        HELPID_DIALOGSTYLES, IDS_DEFTXTDIALOG, NULL, NULL,
        0, NULL, NULL,
        0, NULL, 0, NULL,
        NULL, 0, NULL, NULL, NULL, 0
    }
};

/*
 * This table maps the BS_* style of a button control into its
 * appropriate W_* type that is used internally by the editor.
 * This table assumes that any value used to index into it is
 * masked by BS_ALL.
 */
INT rgmpiClsBtnType[] = {
    W_PUSHBUTTON,               /* BS_PUSHBUTTON                        */
    W_PUSHBUTTON,               /* BS_DEFPUSHBUTTON                     */
    W_CHECKBOX,                 /* BS_CHECKBOX                          */
    W_CHECKBOX,                 /* BS_AUTOCHECKBOX                      */
    W_RADIOBUTTON,              /* BS_RADIOBUTTON                       */
    W_CHECKBOX,                 /* BS_3STATE                            */
    W_CHECKBOX,                 /* BS_AUTO3STATE                        */
    W_GROUPBOX,                 /* BS_GROUPBOX                          */
    W_PUSHBUTTON,               /* BS_USERBUTTON                        */
    W_RADIOBUTTON,              /* BS_AUTORADIOBUTTON                   */
    W_PUSHBUTTON,               /* BS_PUSHBOX                           */
    W_PUSHBUTTON                /* BS_OWNERDRAW                         */
};

/* Map low word of Static Control Style to static type. */
/*
 * This table maps the SS_* style of a static control into its
 * appropriate W_* type that is used internally by the editor.
 * This table assumes that any value used to index into it is
 * masked by SS_ALL.
 */
INT rgmpiClsStcType[] = {
    W_TEXT,                     /* SS_LEFT                              */
    W_TEXT,                     /* SS_CENTER                            */
    W_TEXT,                     /* SS_RIGHT                             */
    W_ICON,                     /* SS_ICON                              */
    W_RECT,                     /* SS_BLACKRECT                         */
    W_RECT,                     /* SS_GREYRECT                          */
    W_RECT,                     /* SS_WHITERECT                         */
    W_FRAME,                    /* SS_BLACKFRAME                        */
    W_FRAME,                    /* SS_GRAYFRAME                         */
    W_FRAME,                    /* SS_WHITEFRAME                        */
    W_TEXT,                     /* SS_USERITEM                          */
    W_TEXT,                     /* SS_SIMPLE                            */
    W_TEXT                      /* SS_LEFTNOWORDWRAP                    */
};

/*
 * Following are the tables with the predefined RC keywords for each
 * class (IC_*).  These tables describe each keyword other than the
 * generic "CONTROL" keyword that is possible to use within a dialog
 * template.  The style describes the minimum bits that must be set
 * to define the keyword.  The mask allows a style to be specified
 * that must have certain bits OFF for a match to occur.  The default
 * styles flag specifies style bits that are implicitly turned on
 * when this keyword is specified in the dialog template in the .DLG
 * file.  These bits are checked against the style flag of the control
 * that we are trying to match and if any of these default bits are
 * NOT set for that control, we need to specify them in the .DLG file
 * with a "NOT" in front of them to explicitly turn them off.
 *
 * The "Has Text" flag is set to FALSE in those cases where the syntax
 * for the keyword does NOT include a text field, like "ICON" and
 * "LISTBOX".
 */

/*
 * Array of the predefined RC keywords for Button styles.
 */
static RCKEYWORD arckwdButton[] = {
    /*
     * RADIOBUTTON
     */
    {
        BS_RADIOBUTTON,
        BS_ALL,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYRADIOBUTTON, TRUE
    },
    /*
     * CHECKBOX
     */
    {
        BS_CHECKBOX,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYCHECKBOX, TRUE
    },
    /*
     * DEFPUSHBUTTON
     */
    {
        BS_DEFPUSHBUTTON,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYDEFPUSHBUTTON, TRUE
    },
    /*
     * PUSHBUTTON
     */
    {
        BS_PUSHBUTTON,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYPUSHBUTTON, TRUE
    },
    /*
     * GROUPBOX
     */
    {
        BS_GROUPBOX,
        BS_ALL,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYGROUPBOX, TRUE
    },
    /*
     * AUTO3STATE
     */
    {
        BS_AUTO3STATE,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYAUTO3STATE, TRUE
    },
    /*
     * AUTOCHECKBOX
     */
    {
        BS_AUTOCHECKBOX,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYAUTOCHECKBOX, TRUE
    },
    /*
     * AUTORADIOBUTTON
     */
    {
        BS_AUTORADIOBUTTON,
        BS_ALL,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYAUTORADIOBUTTON, TRUE
    },
    /*
     * STATE3
     */
    {
        BS_3STATE,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYSTATE3, TRUE
    },
    /*
     * USERBUTTON
     */
    {
        BS_USERBUTTON,
        BS_ALL,
        WS_CHILD | WS_VISIBLE | WS_TABSTOP,
        IDS_KEYUSERBUTTON, TRUE
    }
};

/*
 * Array of the predefined RC keywords for Edit control styles.
 */
static RCKEYWORD arckwdEdit[] = {
    /*
     * EDIT
     */
    {
        0L,
        0L,
        WS_CHILD | WS_VISIBLE | ES_LEFT | WS_TABSTOP | WS_BORDER,
        IDS_KEYEDITTEXT, FALSE
    }
};

/*
 * Array of the predefined RC keywords for Static styles.
 */
static RCKEYWORD arckwdStatic[] = {
    /*
     * ICON
     */
    {
        SS_ICON,
        SS_ALL,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYICON, TRUE
    },
    /*
     * RTEXT
     */
    {
        SS_RIGHT,
        SS_ALL,
        WS_CHILD | WS_GROUP | WS_VISIBLE,
        IDS_KEYRTEXT, TRUE
    },
    /*
     * CTEXT
     */
    {
        SS_CENTER,
        SS_ALL,
        WS_CHILD | WS_GROUP | WS_VISIBLE,
        IDS_KEYCTEXT, TRUE
    },
    /*
     * LTEXT
     */
    {
        SS_LEFT,
        SS_ALL,
        WS_CHILD | WS_GROUP | WS_VISIBLE,
        IDS_KEYLTEXT, TRUE
    }
};

/*
 * Array of the predefined RC keywords for ListBox styles.
 */
static RCKEYWORD arckwdLB[] = {
    /*
     * LISTBOX
     */
    {
        0L,
        0L,
        WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_NOTIFY,
        IDS_KEYLISTBOX, FALSE
    }
};

/*
 * Array of the predefined RC keywords for ComboBox styles.
 */
static RCKEYWORD arckwdComboBox[] = {
    /*
     * COMBOBOX
     */
    {
        0L,
        0L,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYCOMBOBOX, FALSE
    }
};

/*
 * Array of the predefined RC keywords for ScrollBar styles.
 */
static RCKEYWORD arckwdScrollBar[] = {
    /*
     * SCROLLBAR
     */
    {
        0L,
        0L,
        WS_CHILD | WS_VISIBLE,
        IDS_KEYSCROLLBAR, FALSE
    }
};


/*
 * Following are the Class Styles structures.  These tables define the
 * styles for the different window classes (IC_*).  The first element
 * is the style flag, followed by an optional style mask.  If the style
 * mask is zero, the style flag becomes the mask also.  This is often good
 * enough, but there are cases where the style depends on certain bits
 * being off, as well as certain bits being on, to definitively identify
 * a certain style.  An extreme example of this is the BS_PUSHBUTTON
 * style, which is actually zero (no bits are on).  The mask for this
 * style had to be set to include all four of the lower bits, or all
 * buttons would be incorrectly figured to have the BS_PUSHBUTTON style.
 * With the proper mask, only styles that have all four lower bits
 * OFF will be considered to have the BS_PUSHBUTTON style.
 */

/*
 * Button styles.
 */
static CLASSSTYLE acsButton[] = {
    {BS_PUSHBUTTON,         BS_ALL,     DID_BS_PUSHBUTTON           },
    {BS_DEFPUSHBUTTON,      BS_ALL,     DID_BS_DEFPUSHBUTTON        },
    {BS_CHECKBOX,           BS_ALL,     0                           },
    {BS_AUTOCHECKBOX,       BS_ALL,     0                           },
    {BS_RADIOBUTTON,        BS_ALL,     0                           },
    {BS_3STATE,             BS_ALL,     0                           },
    {BS_AUTO3STATE,         BS_ALL,     0                           },
    {BS_GROUPBOX,           BS_ALL,     0                           },
    {BS_USERBUTTON,         BS_ALL,     0                           },
    {BS_AUTORADIOBUTTON,    BS_ALL,     0                           },
    {BS_PUSHBOX,            BS_ALL,     0                           },
    {BS_OWNERDRAW,          BS_ALL,     DID_BS_OWNERDRAW            },
    {BS_LEFTTEXT,           0,          DID_BS_LEFTTEXT             }
};

/*
 * Scroll bar styles.
 */
static CLASSSTYLE acsSB[] = {
    {SBS_HORZ,              SBS_ALL,    0                           },
    {SBS_VERT,              SBS_ALL,    0                           },
    {SBS_TOPALIGN,          0,          0                           },
    {SBS_LEFTALIGN,         0,          0                           },
    {SBS_BOTTOMALIGN,       0,          0                           },
    {SBS_RIGHTALIGN,        0,          0                           },
    {SBS_SIZEBOXTOPLEFTALIGN, 0,        0                           },
    {SBS_SIZEBOXBOTTOMRIGHTALIGN, 0,    0                           },
    {SBS_SIZEBOX,           0,          0                           }
};

/*
 * Entry field styles.
 */
static CLASSSTYLE acsEdit[] = {
    {ES_LEFT,               ES_ALIGN,   DID_ES_LEFT                 },
    {ES_CENTER,             ES_ALIGN,   DID_ES_CENTER               },
    {ES_RIGHT,              ES_ALIGN,   DID_ES_RIGHT                },
    {ES_MULTILINE,          0,          DID_ES_MULTILINE            },
    {ES_UPPERCASE,          0,          DID_ES_UPPERCASE            },
    {ES_LOWERCASE,          0,          DID_ES_LOWERCASE            },
    {ES_PASSWORD,           0,          DID_ES_PASSWORD             },
    {ES_AUTOVSCROLL,        0,          DID_ES_AUTOVSCROLL          },
    {ES_AUTOHSCROLL,        0,          DID_ES_AUTOHSCROLL          },
    {ES_NOHIDESEL,          0,          DID_ES_NOHIDESEL            },
    {ES_OEMCONVERT,         0,          DID_ES_OEMCONVERT           },
    {ES_READONLY,           0,          DID_ES_READONLY             },
    {ES_WANTRETURN,         0,          DID_ES_WANTRETURN           }
};

/*
 * Static styles.
 */
static CLASSSTYLE acsStatic[] = {
    {SS_LEFT,               SS_ALL,     DID_SS_LEFT                 },
    {SS_CENTER,             SS_ALL,     DID_SS_CENTER               },
    {SS_RIGHT,              SS_ALL,     DID_SS_RIGHT                },
    {SS_ICON,               SS_ALL,     0                           },
    {SS_BLACKRECT,          SS_ALL,     DID_SS_BLACKRECT            },
    {SS_GRAYRECT,           SS_ALL,     DID_SS_GRAYRECT             },
    {SS_WHITERECT,          SS_ALL,     DID_SS_WHITERECT            },
    {SS_BLACKFRAME,         SS_ALL,     DID_SS_BLACKFRAME           },
    {SS_GRAYFRAME,          SS_ALL,     DID_SS_GRAYFRAME            },
    {SS_WHITEFRAME,         SS_ALL,     DID_SS_WHITEFRAME           },
    {SS_USERITEM,           SS_ALL,     DID_SS_USERITEM             },
    {SS_SIMPLE,             SS_ALL,     DID_SS_SIMPLE               },
    {SS_LEFTNOWORDWRAP,     SS_ALL,     DID_SS_LEFTNOWORDWRAP       },
    {SS_NOPREFIX,           0,          DID_SS_NOPREFIX             }
};

/*
 * List box styles.
 */
static CLASSSTYLE acsLB[] = {
    {LBS_NOTIFY,            0,          DID_LBS_NOTIFY              },
    {LBS_SORT,              0,          DID_LBS_SORT                },
    {LBS_NOREDRAW,          0,          DID_LBS_NOREDRAW            },
    {LBS_MULTIPLESEL,       0,          DID_LBS_MULTIPLESEL         },
    {LBS_OWNERDRAWFIXED,    0,          DID_LBS_OWNERDRAWFIXED      },
    {LBS_OWNERDRAWVARIABLE, 0,          DID_LBS_OWNERDRAWVARIABLE   },
    {LBS_HASSTRINGS,        0,          DID_LBS_HASSTRINGS          },
    {LBS_USETABSTOPS,       0,          DID_LBS_USETABSTOPS         },
    {LBS_NOINTEGRALHEIGHT,  0,          DID_LBS_NOINTEGRALHEIGHT    },
    {LBS_MULTICOLUMN,       0,          DID_LBS_MULTICOLUMN         },
    {LBS_WANTKEYBOARDINPUT, 0,          DID_LBS_WANTKEYBOARDINPUT   },
    {LBS_EXTENDEDSEL,       0,          DID_LBS_EXTENDEDSEL         },
    {LBS_DISABLENOSCROLL,   0,          DID_LBS_DISABLENOSCROLL     },
    {LBS_NODATA,            0,          DID_LBS_NODATA              }
};

/*
 * Combo Box styles.
 */
static CLASSSTYLE acsComboBox[] = {
    {CBS_SIMPLE,            CBS_ALL,    DID_CBS_SIMPLE              },
    {CBS_DROPDOWN,          CBS_ALL,    DID_CBS_DROPDOWN            },
    {CBS_DROPDOWNLIST,      CBS_ALL,    DID_CBS_DROPDOWNLIST        },
    {CBS_OWNERDRAWFIXED,    0,          DID_CBS_OWNERDRAWFIXED      },
    {CBS_OWNERDRAWVARIABLE, 0,          DID_CBS_OWNERDRAWVARIABLE   },
    {CBS_AUTOHSCROLL,       0,          DID_CBS_AUTOHSCROLL         },
    {CBS_OEMCONVERT,        0,          DID_CBS_OEMCONVERT          },
    {CBS_SORT,              0,          DID_CBS_SORT                },
    {CBS_HASSTRINGS,        0,          DID_CBS_HASSTRINGS          },
    {CBS_NOINTEGRALHEIGHT,  0,          DID_CBS_NOINTEGRALHEIGHT    },
    {CBS_DISABLENOSCROLL,   0,          DID_CBS_DISABLENOSCROLL     }
};

/*
 * Dialog styles.
 */
static CLASSSTYLE acsDialog[] = {
    {DS_ABSALIGN,           0,          DID_DS_ABSALIGN             },
    {DS_SYSMODAL,           0,          DID_DS_SYSMODAL             },
    {DS_LOCALEDIT,          0,          DID_DS_LOCALEDIT            },
    {DS_SETFONT,            0,          0                           },
    {DS_MODALFRAME,         0,          DID_DS_MODALFRAME           },
    {DS_NOIDLEMSG,          0,          DID_DS_NOIDLEMSG            },
    /*
     * The following two styles are the same bits as WS_GROUP and
     * WS_TABSTOP, so they must be in this table and there has
     * to be special case code for writing the appropriate string
     * out when writing dialog styles.
     */
    {WS_MINIMIZEBOX,        0,          DID_WS_MINIMIZEBOX          },
    {WS_MAXIMIZEBOX,        0,          DID_WS_MAXIMIZEBOX          }
};

/*
 * Window styles.
 */
static CLASSSTYLE acsWindow[] = {
    {WS_POPUP,              0,          DID_WS_POPUP                },
    {WS_CHILD,              0,          DID_WS_CHILD                },
    {WS_MINIMIZE,           0,          DID_WS_MINIMIZE             },
    {WS_VISIBLE,            0,          DID_WS_VISIBLE              },
    {WS_DISABLED,           0,          DID_WS_DISABLED             },
    {WS_CLIPSIBLINGS,       0,          DID_WS_CLIPSIBLINGS         },
    {WS_CLIPCHILDREN,       0,          DID_WS_CLIPCHILDREN         },
    {WS_MAXIMIZE,           0,          DID_WS_MAXIMIZE             },
    {WS_CAPTION,            WS_CAPTIONALL, DID_WS_CAPTION           },
    {WS_BORDER,             WS_CAPTIONALL, DID_WS_BORDER            },
    {WS_DLGFRAME,           WS_CAPTIONALL, DID_WS_DLGFRAME          },
    {WS_VSCROLL,            0,          DID_WS_VSCROLL              },
    {WS_HSCROLL,            0,          DID_WS_HSCROLL              },
    {WS_SYSMENU,            0,          DID_WS_SYSMENU              },
    {WS_THICKFRAME,         0,          DID_WS_THICKFRAME           },
    {WS_GROUP,              0,          DID_WS_GROUP                },
    {WS_TABSTOP,            0,          DID_WS_TABSTOP              }
};

/*
 * Resource Flags styles.
 */
static CLASSSTYLE acsResFlags[] = {
    {MMF_MOVEABLE,          0,          DID_MMF_MOVEABLE            },
    {MMF_PURE,              0,          DID_MMF_PURE                },
    {MMF_PRELOAD,           0,          DID_MMF_PRELOAD             },
    {MMF_DISCARDABLE,       0,          DID_MMF_DISCARDABLE         }
};

/*
 * Extended Styles.
 */
static CLASSSTYLE acsExStyle[] = {
    {WS_EX_DLGMODALFRAME,   0,          0                           },
    {0x0002 /*WS_EX_DRAGOBJECT*/, 0,    0                           },
    {WS_EX_NOPARENTNOTIFY,  0,          0                           },
    {WS_EX_TOPMOST,         0,          0                           },
    {WS_EX_ACCEPTFILES,     0,          0                           },
    {WS_EX_TRANSPARENT,     0,          0                           }
};


/*
 * Array of class style description structures.  These are indexed by
 * the IC_* constants and describe each class.  They contain pointers
 * to both the class styles array and the predefined keywords array
 * for each class.
 *
 * The last few entries are included in the table for convenience,
 * and are used to describe things like the various window (WS_*, WS_EX_*)
 * and resource memory flags (MMF_*) styles, although they don't exactly
 * map to an IC_* style that a control will have.
 */
CLASSSTYLEDESC acsd[] = {
    /*
     * IC_BUTTON
     */
    {
        IDS_WCBUTTON,
        acsButton, sizeof(acsButton) / sizeof(CLASSSTYLE), IDS_IC_BUTTON,
        arckwdButton, sizeof(arckwdButton) / sizeof(RCKEYWORD),
        ORDID_BUTTONCLASS
    },
    /*
     * IC_SCROLLBAR
     */
    {
        IDS_WCSCROLLBAR,
        acsSB, sizeof(acsSB) / sizeof(CLASSSTYLE), IDS_IC_SCROLLBAR,
        arckwdScrollBar, sizeof(arckwdScrollBar) / sizeof(RCKEYWORD),
        ORDID_SCROLLBARCLASS
    },
    /*
     * IC_EDIT
     */
    {
        IDS_WCEDIT,
        acsEdit, sizeof(acsEdit) / sizeof(CLASSSTYLE), IDS_IC_EDIT,
        arckwdEdit, sizeof(arckwdEdit) / sizeof(RCKEYWORD),
        ORDID_EDITCLASS
    },
    /*
     * IC_STATIC
     */
    {
        IDS_WCSTATIC,
        acsStatic, sizeof(acsStatic) / sizeof(CLASSSTYLE), IDS_IC_STATIC,
        arckwdStatic, sizeof(arckwdStatic) / sizeof(RCKEYWORD),
        ORDID_STATICCLASS
    },
    /*
     * IC_LISTBOX
     */
    {
        IDS_WCLISTBOX,
        acsLB, sizeof(acsLB) / sizeof(CLASSSTYLE), IDS_IC_LISTBOX,
        arckwdLB, sizeof(arckwdLB) / sizeof(RCKEYWORD),
        ORDID_LISTBOXCLASS
    },
    /*
     * IC_COMBOBOX
     */
    {
        IDS_WCCOMBOBOX,
        acsComboBox, sizeof(acsComboBox) / sizeof(CLASSSTYLE), IDS_IC_COMBOBOX,
        arckwdComboBox, sizeof(arckwdComboBox) / sizeof(RCKEYWORD),
        ORDID_COMBOBOXCLASS
    },
    /*
     * IC_CUSTOM
     */
    {
        IDS_WCCUSTOM,
        NULL, 0, 0,
        NULL, 0,
        0
    },
    /*
     * IC_DIALOG
     */
    {
        IDS_WCDIALOG,
        acsDialog, sizeof(acsDialog) / sizeof(CLASSSTYLE), IDS_IC_DIALOG,
        NULL, 0,
        0
    },
    /*
     * IC_WINDOW
     */
    {
        IDS_NULL,
        acsWindow, sizeof(acsWindow) / sizeof(CLASSSTYLE), IDS_IC_WINDOW,
        NULL, 0,
        0
    },
    /*
     * IC_RESFLAGS
     */
    {
        IDS_NULL,
        acsResFlags, sizeof(acsResFlags) / sizeof(CLASSSTYLE), 0,
        NULL, 0,
        0
    },
    /*
     * IC_EXSTYLE
     */
    {
        IDS_NULL,
        acsExStyle, sizeof(acsExStyle) / sizeof(CLASSSTYLE), IDS_IC_EXSTYLE,
        NULL, 0,
        0
    }
};

/*
 * Message box messages, for the Message() function.
 */
MESSAGEDATA gamdMessages[] = {
    { IDS_DELETEDIALOG,     MB_YESNO | MB_ICONEXCLAMATION       },
    { IDS_OUTOFMEMORY,      MB_OK | MB_ICONHAND                 },
    { IDS_CANTCREATE,       MB_OK | MB_ICONEXCLAMATION          },
    { IDS_SYMNOCHANGE,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_IDSYMMISMATCH,    MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CLOSING,          MB_YESNOCANCEL | MB_ICONEXCLAMATION },
    { IDS_BADRESFILE,       MB_OK | MB_ICONEXCLAMATION          },
    { IDS_INCLCLOSING,      MB_YESNOCANCEL | MB_ICONEXCLAMATION },
    { IDS_SYMEXISTS,        MB_OK | MB_ICONEXCLAMATION          },
    { IDS_BADSYMBOLID,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_LABELDUPID,       MB_OK | MB_ICONEXCLAMATION          },
    { IDS_SELECTFIRST,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CTRLDUPID,        MB_OK | MB_ICONEXCLAMATION          },
    { IDS_BADCUSTDLL,       MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NOCLIP,           MB_OK | MB_ICONEXCLAMATION          },
    { IDS_INTERNAL,         MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NOMOUSE,          MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NOINIT,           MB_OK | MB_ICONEXCLAMATION          },
    { IDS_GTZERO,           MB_OK | MB_ICONEXCLAMATION          },
    { IDS_ICONNAMEHASBLANKS,MB_OK | MB_ICONEXCLAMATION          },
    { IDS_IDUPIDS,          MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CREATECTRLERROR,  MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CANTOPENRES,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CONFIRMDISCARD,   MB_YESNO | MB_ICONEXCLAMATION       },
    { IDS_SYMNOTFOUND,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NOCLASS,          MB_OK | MB_ICONEXCLAMATION          },
    { IDS_POSITIVENUM,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_MEMERROR,         MB_OK | MB_ICONHAND                 },
    { IDS_DLGNAMEHASBLANKS, MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NODLGNAME,        MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CANTINITDLL,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_NOICONNAME,       MB_OK | MB_ICONEXCLAMATION          },
    { IDS_RESTOREDIALOG,    MB_YESNO | MB_ICONEXCLAMATION       },
    { IDS_ZEROPOINTSIZE,    MB_OK | MB_ICONEXCLAMATION          },
    { IDS_MINGTMAXSPACE,    MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CUSTCNTLINUSE,    MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CUSTALREADYLOADED,MB_OK | MB_ICONEXCLAMATION          },
    { IDS_CANTLOADDLL,      MB_OK | MB_ICONEXCLAMATION          },
    { IDS_DLLBADEXPORTS,    MB_OK | MB_ICONEXCLAMATION          },
    { IDS_DLLBADCOUNT,      MB_OK | MB_ICONEXCLAMATION          }
};

/*
 * Table that maps menu items to help context id's for them.
 */
HELPMAP gahmapMenu[] = {
    {MENU_NEWRES,               HELPID_FILE_NEWRES              },
    {MENU_OPEN,                 HELPID_FILE_OPEN                },
    {MENU_SAVE,                 HELPID_FILE_SAVE                },
    {MENU_SAVEAS,               HELPID_FILE_SAVEAS              },
    {MENU_SETINCLUDE,           HELPID_FILE_SETINCLUDE          },
    {MENU_NEWCUST,              HELPID_FILE_NEWCUST             },
    {MENU_OPENCUST,             HELPID_FILE_OPENCUST            },
    {MENU_REMCUST,              HELPID_FILE_REMCUST             },
    {MENU_EXIT,                 HELPID_FILE_EXIT                },

    {MENU_RESTOREDIALOG,        HELPID_EDIT_RESTOREDIALOG       },
    {MENU_CUT,                  HELPID_EDIT_CUT                 },
    {MENU_COPY,                 HELPID_EDIT_COPY                },
    {MENU_PASTE,                HELPID_EDIT_PASTE               },
    {MENU_DELETE,               HELPID_EDIT_DELETE              },
    {MENU_DUPLICATE,            HELPID_EDIT_DUPLICATE           },
    {MENU_SYMBOLS,              HELPID_EDIT_SYMBOLS             },
    {MENU_STYLES,               HELPID_EDIT_STYLES              },
    {MENU_SIZETOTEXT,           HELPID_EDIT_SIZETOTEXT          },
    {MENU_NEWDIALOG,            HELPID_EDIT_NEWDIALOG           },
    {MENU_SELECTDIALOG,         HELPID_EDIT_SELECTDIALOG        },

    {MENU_ALIGNLEFT,            HELPID_ARRANGE_ALIGNLEFT        },
    {MENU_ALIGNVERT,            HELPID_ARRANGE_ALIGNVERT        },
    {MENU_ALIGNRIGHT,           HELPID_ARRANGE_ALIGNRIGHT       },
    {MENU_ALIGNTOP,             HELPID_ARRANGE_ALIGNTOP         },
    {MENU_ALIGNHORZ,            HELPID_ARRANGE_ALIGNHORZ        },
    {MENU_ALIGNBOTTOM,          HELPID_ARRANGE_ALIGNBOTTOM      },
    {MENU_SPACEHORZ,            HELPID_ARRANGE_SPACEHORZ        },
    {MENU_SPACEVERT,            HELPID_ARRANGE_SPACEVERT        },
    {MENU_ARRSIZEWIDTH,         HELPID_ARRANGE_ARRSIZEWIDTH     },
    {MENU_ARRSIZEHEIGHT,        HELPID_ARRANGE_ARRSIZEHEIGHT    },
    {MENU_ARRPUSHBOTTOM,        HELPID_ARRANGE_ARRPUSHBOTTOM    },
    {MENU_ARRPUSHRIGHT,         HELPID_ARRANGE_ARRPUSHRIGHT     },
    {MENU_ORDERGROUP,           HELPID_ARRANGE_ORDERGROUP       },
    {MENU_ARRSETTINGS,          HELPID_ARRANGE_ARRSETTINGS      },

    {MENU_TESTMODE,             HELPID_OPTIONS_TESTMODE         },
    {MENU_HEXMODE,              HELPID_OPTIONS_HEXMODE          },
    {MENU_TRANSLATE,            HELPID_OPTIONS_TRANSLATE        },
    {MENU_USENEWKEYWORDS,       HELPID_OPTIONS_USENEWKEYWORDS   },
    {MENU_SHOWTOOLBOX,          HELPID_OPTIONS_SHOWTOOLBOX      },

    {MENU_CONTENTS,             HELPID_HELP_CONTENTS            },
    {MENU_SEARCH,               HELPID_HELP_SEARCH              },
    // No help for the About menu command.

    {0,                         0                               }
};

/*
 * Table that maps dialog ids to help context id's for them.
 */
HELPMAP gahmapDialog[] = {
    // No help for the About dialog.
    {DID_ARRSETTINGS,           HELPID_ARRSETTINGS              },
    {DID_CHECKBOXSTYLES,        HELPID_CHECKBOXSTYLES           },
    {DID_COMBOBOXSTYLES,        HELPID_COMBOBOXSTYLES           },
    {DID_CUSTOMSTYLES,          HELPID_CUSTOMSTYLES             },
    {DID_DIALOGSTYLES,          HELPID_DIALOGSTYLES             },
    {DID_EDITSTYLES,            HELPID_EDITSTYLES               },
    {DID_FRAMESTYLES,           HELPID_FRAMESTYLES              },
    {DID_GROUPBOXSTYLES,        HELPID_GROUPBOXSTYLES           },
    {DID_ORDERGROUP,            HELPID_ORDERGROUP               },
    {DID_HORZSCROLLSTYLES,      HELPID_HORZSCROLLSTYLES         },
    {DID_ICONSTYLES,            HELPID_ICONSTYLES               },
    {DID_LISTBOXSTYLES,         HELPID_LISTBOXSTYLES            },
    {DID_NEWCUST,               HELPID_NEWCUST                  },
    {DID_PUSHBUTTONSTYLES,      HELPID_PUSHBUTTONSTYLES         },
    {DID_RADIOBUTTONSTYLES,     HELPID_RADIOBUTTONSTYLES        },
    {DID_RECTSTYLES,            HELPID_RECTSTYLES               },
    {DID_REMCUST,               HELPID_REMCUST                  },
    {DID_SELECTDIALOG,          HELPID_SELECTDIALOG             },
    {DID_SYMBOLS,               HELPID_SYMBOLS                  },
    {DID_TEXTSTYLES,            HELPID_TEXTSTYLES               },
    {DID_VERTSCROLLSTYLES,      HELPID_VERTSCROLLSTYLES         },

    {DID_COMMONFILEOPENINCLUDE, HELPID_COMMONFILEOPENINCLUDE    },
    {DID_COMMONFILEOPENRES,     HELPID_COMMONFILEOPENRES        },
    {DID_COMMONFILESAVEINCLUDE, HELPID_COMMONFILESAVEINCLUDE    },
    {DID_COMMONFILESAVERES,     HELPID_COMMONFILESAVERES        },
    {DID_COMMONFILEOPENDLL,     HELPID_COMMONFILEOPENDLL        },

    {DID_TOOLBOX,               HELPID_TOOLBOX                  },
    {DID_STATUS,                HELPID_PROPERTIESBAR            },

    {0,                         0                               }
};


/*
 * Language and Sub Language tables.
 */

static SUBLANGTABLE aslNeutral[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_DEFAULT,      IDS_SUBLANG_DEFAULT,        IDS_SL_DEFAULT      }
};

static SUBLANGTABLE aslChinese[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_CHINESE_SIMPLIFIED, IDS_SUBLANG_CHINESE_SIMPLIFIED, IDS_SL_CHINESE_SIMPLIFIED   },
    { SUBLANG_CHINESE_TRADITIONAL, IDS_SUBLANG_CHINESE_TRADITIONAL, IDS_SL_CHINESE_TRADITIONAL  }
};

static SUBLANGTABLE aslDutch[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_DUTCH,        IDS_SUBLANG_DUTCH,          IDS_SL_DUTCH        },
    { SUBLANG_DUTCH_BELGIAN,IDS_SUBLANG_DUTCH_BELGIAN,  IDS_SL_DUTCH_BELGIAN}
};

static SUBLANGTABLE aslEnglish[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_ENGLISH_US,   IDS_SUBLANG_ENGLISH_US,     IDS_SL_ENGLISH_US   },
    { SUBLANG_ENGLISH_UK,   IDS_SUBLANG_ENGLISH_UK,     IDS_SL_ENGLISH_UK   },
    { SUBLANG_ENGLISH_AUS,  IDS_SUBLANG_ENGLISH_AUS,    IDS_SL_ENGLISH_AUS  },
    { SUBLANG_ENGLISH_CAN,  IDS_SUBLANG_ENGLISH_CAN,    IDS_SL_ENGLISH_CAN  }
};

static SUBLANGTABLE aslFrench[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_FRENCH,       IDS_SUBLANG_FRENCH,         IDS_SL_FRENCH       },
    { SUBLANG_FRENCH_BELGIAN, IDS_SUBLANG_FRENCH_BELGIAN, IDS_SL_FRENCH_BELGIAN  },
    { SUBLANG_FRENCH_CANADIAN, IDS_SUBLANG_FRENCH_CANADIAN, IDS_SL_FRENCH_CANADIAN },
    { SUBLANG_FRENCH_SWISS, IDS_SUBLANG_FRENCH_SWISS,   IDS_SL_FRENCH_SWISS }
};

static SUBLANGTABLE aslGerman[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_GERMAN,       IDS_SUBLANG_GERMAN,         IDS_SL_GERMAN       },
    { SUBLANG_GERMAN_SWISS, IDS_SUBLANG_GERMAN_SWISS,   IDS_SL_GERMAN_SWISS }
};

static SUBLANGTABLE aslItalian[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_ITALIAN,      IDS_SUBLANG_ITALIAN,        IDS_SL_ITALIAN      },
    { SUBLANG_ITALIAN_SWISS, IDS_SUBLANG_ITALIAN_SWISS, IDS_SL_ITALIAN_SWISS }
};

static SUBLANGTABLE aslNorwegian[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_NORWEGIAN_BOKMAL, IDS_SUBLANG_NORWEGIAN_BOKMAL, IDS_SL_NORWEGIAN_BOKMAL },
    { SUBLANG_NORWEGIAN_NYNORSK, IDS_SUBLANG_NORWEGIAN_NYNORSK, IDS_SL_NORWEGIAN_NYNORSK }
};

static SUBLANGTABLE aslPortuguese[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_PORTUGUESE,   IDS_SUBLANG_PORTUGUESE,     IDS_SL_PORTUGUESE   },
    { SUBLANG_PORTUGUESE_BRAZILIAN, IDS_SUBLANG_PORTUGUESE_BRAZILIAN, IDS_SL_PORTUGUESE_BRAZILIAN }
};

static SUBLANGTABLE aslSpanish[] = {
    { SUBLANG_NEUTRAL,      IDS_SUBLANG_NEUTRAL,        IDS_SL_NEUTRAL      },
    { SUBLANG_SPANISH,      IDS_SUBLANG_SPANISH,        IDS_SL_SPANISH      },
    { SUBLANG_SPANISH_MEXICAN, IDS_SUBLANG_SPANISH_MEXICAN, IDS_SL_SPANISH_MEXICAN },
    { SUBLANG_SPANISH_MODERN, IDS_SUBLANG_SPANISH_MODERN, IDS_SL_SPANISH_MODERN }
};


LANGTABLE gaLangTable[] = {
    { LANG_NEUTRAL,         IDS_LANG_NEUTRAL,           IDS_L_NEUTRAL,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_CHINESE,         IDS_LANG_CHINESE,           IDS_L_CHINESE,
        sizeof(aslChinese) / sizeof(SUBLANGTABLE), aslChinese },
    { LANG_CZECH,           IDS_LANG_CZECH,             IDS_L_CZECH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_DANISH,          IDS_LANG_DANISH,            IDS_L_DANISH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_DUTCH,           IDS_LANG_DUTCH,             IDS_L_DUTCH,
        sizeof(aslDutch) / sizeof(SUBLANGTABLE), aslDutch },
    { LANG_ENGLISH,         IDS_LANG_ENGLISH,           IDS_L_ENGLISH,
        sizeof(aslEnglish) / sizeof(SUBLANGTABLE), aslEnglish },
    { LANG_FINNISH,         IDS_LANG_FINNISH,           IDS_L_FINNISH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_FRENCH,          IDS_LANG_FRENCH,            IDS_L_FRENCH,
        sizeof(aslFrench) / sizeof(SUBLANGTABLE), aslFrench },
    { LANG_GERMAN,          IDS_LANG_GERMAN,            IDS_L_GERMAN,
        sizeof(aslGerman) / sizeof(SUBLANGTABLE), aslGerman },
    { LANG_GREEK,           IDS_LANG_GREEK,             IDS_L_GREEK,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_HUNGARIAN,       IDS_LANG_HUNGARIAN,         IDS_L_HUNGARIAN,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_ICELANDIC,       IDS_LANG_ICELANDIC,         IDS_L_ICELANDIC,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_ITALIAN,         IDS_LANG_ITALIAN,           IDS_L_ITALIAN,
        sizeof(aslItalian) / sizeof(SUBLANGTABLE), aslItalian },
    { LANG_JAPANESE,        IDS_LANG_JAPANESE,          IDS_L_JAPANESE,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_KOREAN,          IDS_LANG_KOREAN,            IDS_L_KOREAN,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_NORWEGIAN,       IDS_LANG_NORWEGIAN,         IDS_L_NORWEGIAN,
        sizeof(aslNorwegian) / sizeof(SUBLANGTABLE), aslNorwegian },
    { LANG_POLISH,          IDS_LANG_POLISH,            IDS_L_POLISH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_PORTUGUESE,      IDS_LANG_PORTUGUESE,        IDS_L_PORTUGUESE,
        sizeof(aslPortuguese) / sizeof(SUBLANGTABLE), aslPortuguese },
    { LANG_RUSSIAN,         IDS_LANG_RUSSIAN,           IDS_L_RUSSIAN,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_SLOVAK,          IDS_LANG_SLOVAK,            IDS_L_SLOVAK,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_SPANISH,         IDS_LANG_SPANISH,           IDS_L_SPANISH,
        sizeof(aslSpanish) / sizeof(SUBLANGTABLE), aslSpanish },
    { LANG_SWEDISH,         IDS_LANG_SWEDISH,           IDS_L_SWEDISH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral },
    { LANG_TURKISH,         IDS_LANG_TURKISH,           IDS_L_TURKISH,
        sizeof(aslNeutral) / sizeof(SUBLANGTABLE), aslNeutral }
};

INT gcLanguages = sizeof(gaLangTable) / sizeof(LANGTABLE);