Annotation of mstools/samples/sdktools/dlgedit/status.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /****************************** Module Header *******************************
                     13: * Module Name: status.c
                     14: *
                     15: * Support for the Status window.
                     16: *
                     17: * Functions:
                     18: *
                     19: *    StatusDlgProc()
                     20: *    StatusApplyChanges()
                     21: *    StatusFillSymbolList()
                     22: *    StatusSetCoords()
                     23: *    StatusUpdate()
                     24: *    StatusSetEnable()
                     25: *    StatusInit()
                     26: *    StatusProcessCommand()
                     27: *    ValidateNewName()
                     28: *    ValidateNewID()
                     29: *    ApplyNewName()
                     30: *    ApplyNewID()
                     31: *    ApplyNewText()
                     32: *    StatusSetText()
                     33: *    StatusSetTextLabels()
                     34: *    StatusSetID()
                     35: *    StatusSetName()
                     36: *    StatusSetNameID()
                     37: *    StatusClearID()
                     38: *    StatusClearName()
                     39: *    StatusClear()
                     40: *    StatusShowFields()
                     41: *
                     42: * Comments:
                     43: *
                     44: ****************************************************************************/
                     45: 
                     46: #include "dlgedit.h"
                     47: #include "dlgfuncs.h"
                     48: #include "dlgextrn.h"
                     49: #include "dialogs.h"
                     50: 
                     51: 
                     52: STATICFN BOOL StatusInit(HWND hwnd);
                     53: STATICFN VOID StatusProcessCommand(HWND hwnd, INT idCtrl,
                     54:     INT NotifyCode);
                     55: STATICFN BOOL ValidateNewName(NPCTYPE npc, LPTSTR pszName,
                     56:     LPTSTR pszID, LPTSTR pszSym, PINT pidNew, BOOL *pfAddLabel);
                     57: STATICFN BOOL ValidateNewID(NPCTYPE npc, LPTSTR pszSym, LPTSTR pszID,
                     58:     PINT pidNew, BOOL *pfAddLabel);
                     59: STATICFN BOOL ApplyNewName(NPCTYPE npc, LPTSTR pszName,
                     60:     BOOL fAddLabel, LPTSTR pszSym, INT idNew);
                     61: STATICFN BOOL ApplyNewID(NPCTYPE npc, INT idNew, BOOL fAddLabel,
                     62:     LPTSTR pszSym);
                     63: STATICFN BOOL ApplyNewText(NPCTYPE npc, LPTSTR pszNewText);
                     64: STATICFN VOID StatusSetText(LPTSTR pszText, INT Type);
                     65: STATICFN VOID StatusSetTextLabels(INT Type, BOOL fIsOrd);
                     66: STATICFN VOID StatusSetID(INT id, BOOL fSymAlso);
                     67: STATICFN VOID StatusSetName(LPTSTR pszName, INT Type);
                     68: STATICFN VOID StatusSetNameID(INT id, INT Type);
                     69: STATICFN VOID StatusClearID(VOID);
                     70: STATICFN VOID StatusClearName(VOID);
                     71: STATICFN VOID StatusClear(VOID);
                     72: STATICFN VOID StatusShowFields(INT Type);
                     73: 
                     74: /*
                     75:  * TRUE if the user has changed the entry fields in the status window.
                     76:  * This will be reset to FALSE whenever new information is placed
                     77:  * into the fields.
                     78:  */
                     79: static BOOL gfStatusChanged = FALSE;
                     80: 
                     81: /*
                     82:  * These globals save the window positions of the upper and lower
                     83:  * combo boxes and edit controls.  This is used to position them
                     84:  * depending on what type of control is selected.
                     85:  */
                     86: static RECT grcTopCombo;
                     87: static RECT grcBottomCombo;
                     88: static RECT grcTopEdit;
                     89: static RECT grcBottomEdit;
                     90: 
                     91: 
                     92: 
                     93: /************************************************************************
                     94: * StatusDlgProc
                     95: *
                     96: * This is the dialog procedure for the Status ribbon window.
                     97: *
                     98: ************************************************************************/
                     99: 
                    100: DIALOGPROC StatusDlgProc(
                    101:     HWND hwnd,
                    102:     UINT msg,
                    103:     WPARAM wParam,
                    104:     LPARAM lParam)
                    105: {
                    106:     switch (msg) {
                    107:         case WM_INITDIALOG:
                    108:             return StatusInit(hwnd);
                    109: 
                    110:         case WM_PAINT:
                    111:             {
                    112:                 HDC hdc;
                    113:                 RECT rc;
                    114:                 PAINTSTRUCT ps;
                    115:                 HPEN hpenWindowFrame;
                    116: 
                    117:                 /*
                    118:                  * Draw our border lines.
                    119:                  */
                    120:                 GetClientRect(hwnd, &rc);
                    121:                 hdc = BeginPaint(hwnd, &ps);
                    122: 
                    123:                 SelectObject(hdc, GetStockObject(WHITE_PEN));
                    124:                 MoveToEx(hdc, rc.left, rc.top, NULL);
                    125:                 LineTo(hdc, rc.right, rc.top);
                    126: 
                    127:                 SelectObject(hdc, hpenDarkGray);
                    128:                 MoveToEx(hdc, rc.left, (rc.top + gcyStatus) - gcyBorder - 1, NULL);
                    129:                 LineTo(hdc, rc.right, (rc.top + gcyStatus) - gcyBorder - 1);
                    130: 
                    131:                 hpenWindowFrame = CreatePen(PS_SOLID, gcyBorder,
                    132:                         GetSysColor(COLOR_WINDOWFRAME));
                    133:                 SelectObject(hdc, hpenWindowFrame);
                    134:                 MoveToEx(hdc, rc.left, (rc.top + gcyStatus) - gcyBorder, NULL);
                    135:                 LineTo(hdc, rc.right, (rc.top + gcyStatus) - gcyBorder);
                    136: 
                    137:                 EndPaint(hwnd, &ps);
                    138:                 DeleteObject(hpenWindowFrame);
                    139:             }
                    140: 
                    141:             break;
                    142: 
                    143:         case WM_CTLCOLORDLG:
                    144:         case WM_CTLCOLORLISTBOX:
                    145:         case WM_CTLCOLORSTATIC:
                    146:             switch ((WORD)(msg - WM_CTLCOLORMSGBOX)) {
                    147:                 case CTLCOLOR_DLG:
                    148:                 case CTLCOLOR_LISTBOX:
                    149:                     return (BOOL)GetStockObject(LTGRAY_BRUSH);
                    150: 
                    151:                 case CTLCOLOR_STATIC:
                    152:                     SetBkColor((HDC)(wParam),
                    153:                             LIGHTGRAY);
                    154:                     return (BOOL)GetStockObject(LTGRAY_BRUSH);
                    155:             }
                    156: 
                    157:             return (BOOL)NULL;
                    158: 
                    159:         case WM_COMMAND:
                    160:             StatusProcessCommand(hwnd,
                    161:                     LOWORD(wParam),
                    162:                     HIWORD(wParam));
                    163:             break;
                    164: 
                    165:         default:
                    166:             return FALSE;
                    167:     }
                    168: 
                    169:     return FALSE;
                    170: }
                    171: 
                    172: 
                    173: 
                    174: /************************************************************************
                    175: * StatusInit
                    176: *
                    177: * Initializes the Status ribbon window.
                    178: *
                    179: * Arguments:
                    180: *     HWND hwnd = The window handle.
                    181: *
                    182: * Returns:
                    183: *     
                    184: * TRUE 
                    185: *
                    186: ************************************************************************/
                    187: 
                    188: STATICFN BOOL StatusInit(
                    189:     HWND hwnd)
                    190: {
                    191:     /*
                    192:      * Set this global right away.  Other routines that will be called
                    193:      * before CreateDialog returns depend on this global.
                    194:      */
                    195:     hwndStatus = hwnd;
                    196: 
                    197:     GetChildRect(GetDlgItem(hwnd, DID_STATUSSYM), &grcTopCombo);
                    198:     GetChildRect(GetDlgItem(hwnd, DID_STATUSSYMID), &grcTopEdit);
                    199:     GetChildRect(GetDlgItem(hwnd, DID_STATUSNAME), &grcBottomCombo);
                    200:     GetChildRect(GetDlgItem(hwnd, DID_STATUSNAMEID), &grcBottomEdit);
                    201: 
                    202:     SendDlgItemMessage(hwnd, DID_STATUSSYM, EM_LIMITTEXT, CCHTEXTMAX, 0L);
                    203:     SendDlgItemMessage(hwnd, DID_STATUSNAME, EM_LIMITTEXT, CCHTEXTMAX, 0L);
                    204:     SendDlgItemMessage(hwnd, DID_STATUSSYMID, EM_LIMITTEXT, CCHIDMAX, 0L);
                    205:     SendDlgItemMessage(hwnd, DID_STATUSNAMEID, EM_LIMITTEXT, CCHIDMAX, 0L);
                    206:     SendDlgItemMessage(hwnd, DID_STATUSTEXT, EM_LIMITTEXT, CCHTEXTMAX, 0L);
                    207: 
                    208:     StatusFillSymbolList(plInclude);
                    209:     StatusUpdate();
                    210:     StatusSetEnable();
                    211: 
                    212:     /*
                    213:      * Return TRUE so that the dialog manager does NOT set the focus
                    214:      * for me.  This prevents the status window from initially having
                    215:      * the focus when the editor is started.
                    216:      */
                    217:     return TRUE;
                    218: }
                    219: 
                    220: 
                    221: 
                    222: /************************************************************************
                    223: * StatusProcessCommand
                    224: *
                    225: * Function that processes commands sent to the status window.
                    226: *
                    227: * Arguments:
                    228: *   HWND hwnd        - The window handle.
                    229: *   INT idCtrl       - The id of the control the WM_COMMAND is for.
                    230: *   INT NotifyCode   - The control's notification code.
                    231: *
                    232: *
                    233: ************************************************************************/
                    234: 
                    235: STATICFN VOID StatusProcessCommand(
                    236:     HWND hwnd,
                    237:     INT idCtrl,
                    238:     INT NotifyCode)
                    239: {
                    240:     TCHAR szSym[CCHTEXTMAX];
                    241:     TCHAR szID[CCHIDMAX + 1];
                    242:     NPLABEL npLabel;
                    243:     INT id;
                    244:     INT nIndex;
                    245:     LPTSTR pszOldName;
                    246: 
                    247:     switch (idCtrl) {
                    248:         case DID_STATUSSYM:
                    249:             /*
                    250:              * Did the symbol edit field change and is
                    251:              * something selected?
                    252:              */
                    253:             if (gnpcSel && (NotifyCode == CBN_EDITCHANGE ||
                    254:                     NotifyCode == CBN_SELCHANGE)) {
                    255:                 /*
                    256:                  * Get the symbol and begin looking for it.
                    257:                  */
                    258:                 if (NotifyCode == CBN_EDITCHANGE) {
                    259:                     /*
                    260:                      * The edit field was typed into.  Get the
                    261:                      * new text from there.
                    262:                      */
                    263:                     GetDlgItemText(hwnd, DID_STATUSSYM, szSym, CCHTEXTMAX);
                    264:                 }
                    265:                 else {
                    266:                     /*
                    267:                      * A new string was selected from the list
                    268:                      * box.  Get it from the list box, because
                    269:                      * at this point the new text is not yet set
                    270:                      * into the edit control!
                    271:                      */
                    272:                     nIndex = (INT)SendDlgItemMessage(hwnd,
                    273:                             DID_STATUSSYM, CB_GETCURSEL, 0, 0L);
                    274: 
                    275:                     if (nIndex != CB_ERR)
                    276:                         SendDlgItemMessage(hwnd, DID_STATUSSYM, CB_GETLBTEXT,
                    277:                                 nIndex, (DWORD)szSym);
                    278:                     else
                    279:                         *szSym = CHAR_NULL;
                    280:                 }
                    281: 
                    282:                 /*
                    283:                  * Convert the symbol field to the associated id value,
                    284:                  * taking into account the special IDOK values, etc.
                    285:                  */
                    286:                 if (!LabelToID(szSym, &id)) {
                    287:                     /*
                    288:                      * The symbol was not found.
                    289:                      * If the symbol is not blank, and the
                    290:                      * id of the control is already taken
                    291:                      * by another label, fill the id field
                    292:                      * with the next available id.  Otherwise,
                    293:                      * fill the id field with the controls
                    294:                      * id value.  It is assumed here that the
                    295:                      * dialog cannot be selected if the symbol
                    296:                      * field was able to be changed.
                    297:                      */
                    298:                     if (*szSym && FindID(gnpcSel->id, plInclude))
                    299:                         id = NextID(NEXTID_CONTROL, plInclude, 0);
                    300:                     else
                    301:                         id = gnpcSel->id;
                    302:                 }
                    303: 
                    304:                 StatusSetID(id, FALSE);
                    305: 
                    306:                 gfStatusChanged = TRUE;
                    307:             }
                    308: 
                    309:             break;
                    310: 
                    311:         case DID_STATUSNAME:
                    312:             /*
                    313:              * Did the name edit field change and is
                    314:              * something selected?
                    315:              */
                    316:             if (gnpcSel && (NotifyCode == CBN_EDITCHANGE ||
                    317:                     NotifyCode == CBN_SELCHANGE)) {
                    318:                 /*
                    319:                  * Get the symbol and begin looking for it.
                    320:                  */
                    321:                 if (NotifyCode == CBN_EDITCHANGE) {
                    322:                     /*
                    323:                      * The edit field was typed into.  Get the
                    324:                      * new text from there.
                    325:                      */
                    326:                     GetDlgItemText(hwnd, DID_STATUSNAME, szSym, CCHTEXTMAX);
                    327:                 }
                    328:                 else {
                    329:                     /*
                    330:                      * A new string was selected from the list
                    331:                      * box.  Get it from the list box, because
                    332:                      * at this point the new text is not yet set
                    333:                      * into the edit control!
                    334:                      */
                    335:                     nIndex = (INT)SendDlgItemMessage(hwnd,
                    336:                             DID_STATUSNAME, CB_GETCURSEL, 0, 0L);
                    337: 
                    338:                     if (nIndex != CB_ERR)
                    339:                         SendDlgItemMessage(hwnd, DID_STATUSNAME, CB_GETLBTEXT,
                    340:                                 nIndex, (DWORD)szSym);
                    341:                     else
                    342:                         *szSym = CHAR_NULL;
                    343:                 }
                    344: 
                    345:                 /*
                    346:                  * Try and convert the name to an ordinal.
                    347:                  */
                    348:                 StrToNameOrd(szSym, (gnpcSel->pwcd->iType == W_DIALOG) ?
                    349:                         TRUE : FALSE);
                    350: 
                    351:                 /*
                    352:                  * Was the name converted to an ordinal?
                    353:                  */
                    354:                 if (IsOrd(szSym)) {
                    355:                     id = OrdID(szSym);
                    356:                 }
                    357:                 /*
                    358:                  * Is it an existing label?
                    359:                  */
                    360:                 else if (npLabel = FindLabel(szSym, plInclude)) {
                    361:                     id = npLabel->id;
                    362:                 }
                    363:                 else {
                    364:                     /*
                    365:                      * Get a pointer to the original name.
                    366:                      */
                    367:                     pszOldName = (gnpcSel->pwcd->iType == W_DIALOG) ?
                    368:                             gcd.pszDlgName : gnpcSel->text;
                    369: 
                    370:                     /*
                    371:                      * If the old name was originally an ordinal, and
                    372:                      * there was no corresponding label for it,
                    373:                      * assume that the user is trying to enter a
                    374:                      * define for it and leave it alone.  Otherwise,
                    375:                      * pick the next available id.  But if the user
                    376:                      * completely blanks out the field, leave it
                    377:                      * alone also (this is a benign case).
                    378:                      */
                    379:                     if (IsOrd(pszOldName) &&
                    380:                             (!*szSym || !FindID(OrdID(pszOldName), plInclude)))
                    381:                         id = OrdID(pszOldName);
                    382:                     else
                    383:                         id = NextID((gnpcSel->pwcd->iType == W_DIALOG) ?
                    384:                                 NEXTID_DIALOG : NEXTID_CONTROL, plInclude, 0);
                    385:                 }
                    386: 
                    387:                 StatusSetNameID(id, gnpcSel->pwcd->iType);
                    388: 
                    389:                 /*
                    390:                  * Change the labels to reflect that the entered name
                    391:                  * is an ID instead of a name.
                    392:                  */
                    393:                 StatusSetTextLabels(gnpcSel->pwcd->iType, TRUE);
                    394: 
                    395:                 gfStatusChanged = TRUE;
                    396:             }
                    397: 
                    398:             break;
                    399: 
                    400:         case DID_STATUSSYMID:
                    401:         case DID_STATUSNAMEID:
                    402:         case DID_STATUSTEXT:
                    403:             if (!gnpcSel)
                    404:                 break;
                    405: 
                    406:             if (NotifyCode == EN_CHANGE)
                    407:                 gfStatusChanged = TRUE;
                    408: 
                    409:             if (idCtrl == DID_STATUSNAMEID) {
                    410:                 GetDlgItemText(hwnd, DID_STATUSNAME, szSym, CCHTEXTMAX);
                    411:                 GetDlgItemText(hwnd, DID_STATUSNAMEID, szID, CCHIDMAX + 1);
                    412:                 StrToNameOrd(szSym, (gnpcSel->pwcd->iType == W_DIALOG) ?
                    413:                         TRUE : FALSE);
                    414: 
                    415:                 /*
                    416:                  * Change the labels to reflect whether the entered name
                    417:                  * is an ID or a name.  It is considered an id if the
                    418:                  * edit field has something in it, or if the name field
                    419:                  * is a valid label, or if the name field represents an
                    420:                  * ordinal (it is numeric).
                    421:                  */
                    422:                 StatusSetTextLabels(gnpcSel->pwcd->iType,
                    423:                         (IsOrd(szSym) || *szID ||
                    424:                         FindLabel(szSym, plInclude)) ? TRUE : FALSE);
                    425:             }
                    426: 
                    427:             break;
                    428: 
                    429:         case IDOK:
                    430:             if (StatusApplyChanges())
                    431:                 SetFocus(ghwndMain);
                    432: 
                    433:             break;
                    434: 
                    435:         case IDCANCEL:
                    436:             StatusUpdate();
                    437:             SetFocus(ghwndMain);
                    438:             break;
                    439:     }
                    440: }
                    441: 
                    442: 
                    443: 
                    444: /************************************************************************
                    445: * StatusApplyChanges
                    446: *
                    447: * Processes the Enter command from the "Status" bar window to apply
                    448: * the current value of the fields to the current control.
                    449: *
                    450: * Returns:
                    451: *
                    452: * TRUE is successful; otherwise, FALSE is returned.
                    453: *
                    454: ************************************************************************/
                    455: 
                    456: BOOL StatusApplyChanges(VOID)
                    457: {
                    458:     TCHAR szText[CCHTEXTMAX];
                    459:     TCHAR szSym[CCHTEXTMAX];
                    460:     TCHAR szName[CCHTEXTMAX];
                    461:     TCHAR szSymID[CCHIDMAX + 1];
                    462:     TCHAR szNameID[CCHIDMAX + 1];
                    463:     TCHAR szNameSym[CCHTEXTMAX];
                    464:     INT idSymNew;
                    465:     INT idNameNew;
                    466:     BOOL fAddSymLabel;
                    467:     BOOL fAddNameLabel;
                    468:     BOOL fSuccess = FALSE;
                    469: 
                    470:     /*
                    471:      * Quit if nothing is selected, or if nothing was changed.
                    472:      */
                    473:     if (!gnpcSel || !gfStatusChanged)
                    474:         return TRUE;
                    475: 
                    476:     idSymNew = gnpcSel->id;
                    477: 
                    478:     switch (gnpcSel->pwcd->iType) {
                    479:         case W_DIALOG:
                    480:             GetDlgItemText(hwndStatus, DID_STATUSNAME, szName, CCHTEXTMAX);
                    481:             GetDlgItemText(hwndStatus, DID_STATUSNAMEID, szNameID, CCHIDMAX + 1);
                    482:             GetDlgItemText(hwndStatus, DID_STATUSTEXT, szText, CCHTEXTMAX);
                    483:             if (!ValidateNewName(gnpcSel, szName, szNameID, szNameSym,
                    484:                     &idNameNew, &fAddNameLabel))
                    485:                 return FALSE;
                    486: 
                    487:             if (ApplyNewName(gnpcSel, szName, fAddNameLabel,
                    488:                     szNameSym, idNameNew) &&
                    489:                     ApplyNewText(gnpcSel, szText))
                    490:                 fSuccess = TRUE;
                    491: 
                    492:             break;
                    493: 
                    494:         case W_ICON:
                    495:             GetDlgItemText(hwndStatus, DID_STATUSNAME, szName, CCHTEXTMAX);
                    496:             GetDlgItemText(hwndStatus, DID_STATUSNAMEID, szNameID, CCHIDMAX + 1);
                    497:             GetDlgItemText(hwndStatus, DID_STATUSSYM, szSym, CCHTEXTMAX);
                    498:             GetDlgItemText(hwndStatus, DID_STATUSSYMID, szSymID, CCHIDMAX + 1);
                    499:             if (!ValidateNewName(gnpcSel, szName, szNameID, szNameSym,
                    500:                     &idNameNew, &fAddNameLabel) ||
                    501:                     !ValidateNewID(gnpcSel, szSym, szSymID,
                    502:                     &idSymNew, &fAddSymLabel))
                    503:                 return FALSE;
                    504: 
                    505:             if (ApplyNewID(gnpcSel, idSymNew, fAddSymLabel, szSym) &&
                    506:                     ApplyNewName(gnpcSel, szName, fAddNameLabel,
                    507:                     szNameSym, idNameNew))
                    508:                 fSuccess = TRUE;
                    509: 
                    510:             break;
                    511: 
                    512:         default:
                    513:             GetDlgItemText(hwndStatus, DID_STATUSSYM, szSym, CCHTEXTMAX);
                    514:             GetDlgItemText(hwndStatus, DID_STATUSSYMID, szSymID, CCHIDMAX + 1);
                    515:             GetDlgItemText(hwndStatus, DID_STATUSTEXT, szText, CCHTEXTMAX);
                    516:             if (!ValidateNewID(gnpcSel, szSym, szSymID, &idSymNew, &fAddSymLabel))
                    517:                 return FALSE;
                    518: 
                    519:             if (ApplyNewID(gnpcSel, idSymNew, fAddSymLabel, szSym) &&
                    520:                     ApplyNewText(gnpcSel, szText))
                    521:                 fSuccess = TRUE;
                    522: 
                    523:             break;
                    524:     }
                    525: 
                    526:     if (fSuccess) {
                    527:         ShowFileStatus(FALSE);
                    528:         StatusUpdate();
                    529:     }
                    530: 
                    531:     return fSuccess;
                    532: }
                    533: 
                    534: 
                    535: 
                    536: /************************************************************************
                    537: * ValidateNewName
                    538: *
                    539: * Validates the new name from the processing of the OK command
                    540: * from the Status ribbon window.
                    541: *
                    542: * The name is considered valid if it does not have any blanks in it,
                    543: * it is not already used by another dialog in the resource file, and
                    544: * it is not an empty string.
                    545: *
                    546: * Arguments:
                    547: *   NPCTYPE npc      - Pointer to the control.
                    548: *   LPTSTR pszName   - The new name.
                    549: *   LPTSTR pszID     - The ID.
                    550: *   LPTSTR pszSym    - The symbol.
                    551: *   PINT pidNew      - Where to return the new ID if successful.
                    552: *   BOOL *pfAddLabel - Set to TRUE if this symbol/id should be added
                    553: *                      to the include list.  Not touched otherwise.
                    554: *
                    555: * Returns:
                    556: *   TRUE if the new name is valid, FALSE otherwise.
                    557: *
                    558: ************************************************************************/
                    559: 
                    560: STATICFN BOOL ValidateNewName(
                    561:     NPCTYPE npc,
                    562:     LPTSTR pszName,
                    563:     LPTSTR pszID,
                    564:     LPTSTR pszSym,
                    565:     PINT pidNew,
                    566:     BOOL *pfAddLabel)
                    567: {
                    568:     NPLABEL npLabel;
                    569:     BOOL fIDEmpty = FALSE;
                    570:     BOOL fNameEmpty = FALSE;
                    571:     BOOL fAddLabel = FALSE;
                    572:     INT idNew;
                    573:     TCHAR szIDTemp[CCHIDMAX + 1];
                    574: 
                    575:     /*
                    576:      * Start by assuming that the label will NOT be added.
                    577:      */
                    578:     *pfAddLabel = FALSE;
                    579: 
                    580:     /*
                    581:      * Is the ID field non-blank?
                    582:      */
                    583:     if (*pszID) {
                    584:         /*
                    585:          * Is the id valid?
                    586:          */
                    587:         if (!IsValue(pszID)) {
                    588:             Message(MSG_BADSYMBOLID);
                    589:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAMEID));
                    590:             return FALSE;
                    591:         }
                    592: 
                    593:         idNew = valtoi(pszID);
                    594:     }
                    595:     else {
                    596:         /*
                    597:          * The id field is blank.
                    598:          */
                    599:         fIDEmpty = TRUE;
                    600:     }
                    601: 
                    602:     /*
                    603:      * Is the name field blank?
                    604:      */
                    605:     if (!(*pszName))
                    606:         fNameEmpty = TRUE;
                    607: 
                    608:     if (fNameEmpty) {
                    609:         if (fIDEmpty) {
                    610:             Message((npc->pwcd->iType == W_DIALOG) ?
                    611:                     MSG_NODLGNAME : MSG_NOICONNAME);
                    612:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAME));
                    613:             return FALSE;
                    614:         }
                    615:         else {
                    616:             WriteOrd((PORDINAL)pszName, idNew);
                    617:         }
                    618:     }
                    619:     else {
                    620:         /*
                    621:          * Error if there are imbedded blanks.
                    622:          */
                    623:         if (HasBlanks(pszName)) {
                    624:             Message((npc->pwcd->iType == W_DIALOG) ?
                    625:                     MSG_DLGNAMEHASBLANKS : MSG_ICONNAMEHASBLANKS);
                    626:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAME));
                    627:             return FALSE;
                    628:         }
                    629: 
                    630:         /*
                    631:          * Convert the name to an ordinal, if appropriate.
                    632:          */
                    633:         StrToNameOrd(pszName, (npc->pwcd->iType == W_DIALOG) ? TRUE : FALSE);
                    634: 
                    635:         /*
                    636:          * If the name was translated to an ordinal, we are done.
                    637:          * Otherwise, keep trying to figure out whether it is a
                    638:          * name or a define.
                    639:          */
                    640:         if (!IsOrd(pszName)) {
                    641:             /*
                    642:              * Is the name a symbol in the current include list?
                    643:              */
                    644:             if (npLabel = FindLabel(pszName, plInclude)) {
                    645:                 /*
                    646:                  * Yes.  If the id field was blank, just assume they
                    647:                  * wanted the corresponding id.
                    648:                  */
                    649:                 if (fIDEmpty)
                    650:                     idNew = npLabel->id;
                    651: 
                    652:                 /*
                    653:                  * If they somehow entered a valid define but tried to
                    654:                  * give it a different id value, show an error.
                    655:                  */
                    656:                 if (npLabel->id != idNew) {
                    657:                     Myitoa(npLabel->id, szIDTemp);
                    658:                     Message(MSG_IDSYMMISMATCH, szIDTemp);
                    659:                     SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAMEID));
                    660:                     return FALSE;
                    661:                 }
                    662: 
                    663:                 /*
                    664:                  * Make the name field into an ordinal.
                    665:                  */
                    666:                 WriteOrd((PORDINAL)pszName, idNew);
                    667:             }
                    668:             else {
                    669:                 /*
                    670:                  * The name was not found as a label.  Is the id field
                    671:                  * empty?
                    672:                  */
                    673:                 if (fIDEmpty) {
                    674:                     /*
                    675:                      * Since the id field is empty, we can assume that
                    676:                      * what they entered is a name (not a define)
                    677:                      * and we are done.
                    678:                      */
                    679:                 }
                    680:                 else {
                    681:                     /*
                    682:                      * At this point we know the name field is not empty,
                    683:                      * and there is an id entered along with it.  We also
                    684:                      * know that the name (which we can now assume is
                    685:                      * a symbol) is not already found in the include file.
                    686:                      * We will check it for validity, copy it to the
                    687:                      * pszSym buffer, translate the name to an ordinal
                    688:                      * and set a flag saying that the sym/id pair should
                    689:                      * be added to the include list.
                    690:                      */
                    691:                     if (!IsSymbol(pszName)) {
                    692:                         Message(MSG_BADSYMBOLID);
                    693:                         SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAME));
                    694:                         return FALSE;
                    695:                     }
                    696: 
                    697:                     /*
                    698:                      * Pass back the values.
                    699:                      */
                    700:                     lstrcpy(pszSym, pszName);
                    701:                     WriteOrd((PORDINAL)pszName, idNew);
                    702:                     *pidNew = idNew;
                    703: 
                    704:                     fAddLabel = TRUE;
                    705:                 }
                    706:             }
                    707:         }
                    708:     }
                    709: 
                    710:     /*
                    711:      * Inform caller whether they should add this id/symbol
                    712:      * as a label to the include list.
                    713:      */
                    714:     *pfAddLabel = fAddLabel;
                    715: 
                    716:     /*
                    717:      * Return success.
                    718:      */
                    719:     return TRUE;
                    720: }
                    721: 
                    722: 
                    723: 
                    724: /************************************************************************
                    725: * ValidateNewID
                    726: *
                    727: * Validates the new ID from the processing of the OK command from
                    728: * the Status ribbon window.  It will return the new id in *pidNew.
                    729: * Note that the control is not actually updated by this routine.  This
                    730: * is so that if other validations fail nothing will have been done to the
                    731: * control.  It is assumed that ApplyNewID will be called later to do
                    732: * the actual update of the control.
                    733: *
                    734: * Arguments:
                    735: *   NPCTYPE npc      = Pointer to the control.
                    736: *   LPTSTR pszSym    = The symbol.
                    737: *   LPTSTR pszID     = The ID.
                    738: *   PINT pidNew      = Where to return the new ID if successful.
                    739: *   BOOL *pfAddLabel = Set to TRUE if this symbol/id should be added
                    740: *                      to the include list.  Not touched otherwise.
                    741: *
                    742: * Returns:
                    743: *   TRUE if successful, FALSE otherwise.  If TRUE is returned and they
                    744: *   changed the id, the new id will have been placed in *pidNew.
                    745: *
                    746: ************************************************************************/
                    747: 
                    748: STATICFN BOOL ValidateNewID(
                    749:     NPCTYPE npc,
                    750:     LPTSTR pszSym,
                    751:     LPTSTR pszID,
                    752:     PINT pidNew,
                    753:     BOOL *pfAddLabel)
                    754: {
                    755:     NPLABEL npLabel;
                    756:     BOOL fIDEmpty = FALSE;
                    757:     BOOL fIDChanged = FALSE;
                    758:     BOOL fSymEmpty = FALSE;
                    759:     BOOL fSymChanged = FALSE;
                    760:     BOOL fAddLabel = FALSE;
                    761:     INT idNew;
                    762:     TCHAR szIDTemp[CCHIDMAX + 1];
                    763: 
                    764:     /*
                    765:      * Start by assuming that the label will NOT be added.
                    766:      */
                    767:     *pfAddLabel = FALSE;
                    768: 
                    769:     /*
                    770:      * If in translate mode, they cannot change the symbol or id,
                    771:      * and so it should not be validated.  Even if there was a
                    772:      * problem, they could not fix it.
                    773:      */
                    774:     if (gfTranslateMode)
                    775:         return TRUE;
                    776: 
                    777:     /*
                    778:      * Special case if they selected the "unused" label.
                    779:      * Blank out the symbol so it doesn't cause trouble
                    780:      * later, force the id to be zero, and then check if
                    781:      * the id was changed.
                    782:      */
                    783:     if (lstrcmp(pszSym, ids(IDS_UNUSED)) == 0) {
                    784:         pszSym = szEmpty;
                    785:         idNew = IDUNUSED;
                    786:         if (idNew != npc->id)
                    787:             fIDChanged = TRUE;
                    788:     }
                    789:     else if (lstrcmp(pszSym, ids(IDS_IDOK)) == 0 &&
                    790:             !FindLabel(ids(IDS_IDOK), plInclude)) {
                    791:         pszSym = szEmpty;
                    792:         idNew = IDOK;
                    793:         if (idNew != npc->id)
                    794:             fIDChanged = TRUE;
                    795:     }
                    796:     else if (lstrcmp(pszSym, ids(IDS_IDCANCEL)) == 0 &&
                    797:             !FindLabel(ids(IDS_IDCANCEL), plInclude)) {
                    798:         pszSym = szEmpty;
                    799:         idNew = IDCANCEL;
                    800:         if (idNew != npc->id)
                    801:             fIDChanged = TRUE;
                    802:     }
                    803:     /*
                    804:      * Is the ID field non-blank?
                    805:      */
                    806:     else if (*pszID) {
                    807:         /*
                    808:          * Is the id valid?
                    809:          */
                    810:         if (!IsValue(pszID)) {
                    811:             Message(MSG_BADSYMBOLID);
                    812:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYMID));
                    813:             return FALSE;
                    814:         }
                    815: 
                    816:         /*
                    817:          * Did they change the id value?
                    818:          */
                    819:         idNew = valtoi(pszID);
                    820:         if (idNew != npc->id)
                    821:             fIDChanged = TRUE;
                    822:     }
                    823:     else {
                    824:         /*
                    825:          * The id field is blank.  This implies they changed it.
                    826:          */
                    827:         fIDEmpty = TRUE;
                    828:         fIDChanged = TRUE;
                    829:     }
                    830: 
                    831:     /*
                    832:      * Is the symbol field blank?
                    833:      */
                    834:     if (!(*pszSym))
                    835:         fSymEmpty = TRUE;
                    836: 
                    837:     /*
                    838:      * Determine if they have changed the symbol.
                    839:      * Did the original id have a symbol associated with it?
                    840:      */
                    841:     if (npLabel = FindID(npc->id, plInclude)) {
                    842:         if (lstrcmp(npLabel->pszLabel, pszSym) != 0)
                    843:             fSymChanged = TRUE;
                    844:     }
                    845:     else {
                    846:         /*
                    847:          * Since the original id did not have a symbol, if they
                    848:          * have entered a symbol it is changed.
                    849:          */
                    850:         if (!fSymEmpty)
                    851:             fSymChanged = TRUE;
                    852:     }
                    853: 
                    854:     /*
                    855:      * Quit if nothing changed.
                    856:      */
                    857:     if (!fSymChanged && !fIDChanged)
                    858:         return TRUE;
                    859: 
                    860:     /*
                    861:      * Is the symbol field empty?
                    862:      */
                    863:     if (fSymEmpty) {
                    864:         /*
                    865:          * If the id field is empty also, return an error.
                    866:          */
                    867:         if (fIDEmpty) {
                    868:             Message(MSG_BADSYMBOLID);
                    869:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYMID));
                    870:             return FALSE;
                    871:         }
                    872:         else {
                    873:             /*
                    874:              * Otherwise, go on to the final test.  It doesn't matter
                    875:              * if this new id has a symbol or not.
                    876:              */
                    877:             goto CheckForDups;
                    878:         }
                    879:     }
                    880: 
                    881:     /*
                    882:      * At this point we know the symbol field is not empty.
                    883:      * Is it a valid symbol?
                    884:      */
                    885:     if (!IsSymbol(pszSym)) {
                    886:         Message(MSG_BADSYMBOLID);
                    887:         SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYM));
                    888:         return FALSE;
                    889:     }
                    890: 
                    891:     /*
                    892:      * Does this symbol already exist?
                    893:      */
                    894:     if (npLabel = FindLabel(pszSym, plInclude)) {
                    895:         /*
                    896:          * Since the symbol exists, if they blanked the id field
                    897:          * be friendly and assume they want the matching id value.
                    898:          */
                    899:         if (fIDEmpty)
                    900:             idNew = npLabel->id;
                    901: 
                    902:         /*
                    903:          * Does the id that is in the id field match the id of the
                    904:          * symbol they entered?
                    905:          */
                    906:         if (npLabel->id == idNew) {
                    907:             /*
                    908:              * Yes, go on to the final test.
                    909:              */
                    910:             goto CheckForDups;
                    911:         }
                    912:         else {
                    913:             /*
                    914:              * No, give them an error message saying that it has to.
                    915:              */
                    916:             Myitoa(npLabel->id, szIDTemp);
                    917:             Message(MSG_IDSYMMISMATCH, szIDTemp);
                    918:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYMID));
                    919:             return FALSE;
                    920:         }
                    921:     }
                    922:     else {
                    923:         /*
                    924:          * Since the symbol doesn't exist, if they left the id field
                    925:          * blank, assume they want the next available id.
                    926:          */
                    927:         if (fIDEmpty)
                    928:             idNew = NextID(NEXTID_CONTROL, plInclude, 0);
                    929: 
                    930:         /*
                    931:          * They should add this id/symbol as a label to the
                    932:          * include list.
                    933:          */
                    934:         fAddLabel = TRUE;
                    935:         goto CheckForDups;
                    936:     }
                    937: 
                    938: CheckForDups:
                    939:     /*
                    940:      * If the id changed, it is not the special "unused" id,
                    941:      * and it is a duplicate of another id, don't allow it.
                    942:      */
                    943:     if (idNew != npc->id && !IsUniqueID(idNew)) {
                    944:         Message(MSG_CTRLDUPID);
                    945:         SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYM));
                    946:         return FALSE;
                    947:     }
                    948:     else {
                    949:         /*
                    950:          * Pass back the new id value.
                    951:          */
                    952:         *pidNew = idNew;
                    953: 
                    954:         /*
                    955:          * Inform caller whether they should add this id/symbol
                    956:          * as a label to the include list.
                    957:          */
                    958:         *pfAddLabel = fAddLabel;
                    959: 
                    960:         /*
                    961:          * Return success.
                    962:          */
                    963:         return TRUE;
                    964:     }
                    965: }
                    966: 
                    967: 
                    968: 
                    969: /************************************************************************
                    970: * ApplyNewName
                    971: *
                    972: * Updates an icon control's or dialog's name with a new name.
                    973: *
                    974: * If fAddLabel is TRUE, pszSym is assumed to be a string that is
                    975: * the symbol to be added and idNew contains the value associated with
                    976: * it.  This will cause a new define to be added to the current include
                    977: * file.  In either event, pszName will contain either a new name or
                    978: * an ordinal that is to be the name.  For dialogs, the dialog name will
                    979: * be updated.  For icon controls, the icon's text is updated with the
                    980: * name/ordinal.
                    981: *
                    982: * Arguments:
                    983: *   NPCTYPE npc     = Pointer to the control.
                    984: *   LPTSTR pszName  = New name.  A string or ordinal.
                    985: *   BOOL fAddLabel  = TRUE if a new label for this id/name should be added.
                    986: *   LPTSTR pszSym   = The new symbol to add (only valid if fAddLabel is TRUE).
                    987: *   INT idNew       = The new ID (only valid if fAddLabel is TRUE).
                    988: *
                    989: * Returns:
                    990: *
                    991: * TRUE if successful; otherwise, FALSE is returned.
                    992: *
                    993: ************************************************************************/
                    994: 
                    995: STATICFN BOOL ApplyNewName(
                    996:     NPCTYPE npc,
                    997:     LPTSTR pszName,
                    998:     BOOL fAddLabel,
                    999:     LPTSTR pszSym,
                   1000:     INT idNew)
                   1001: {
                   1002:     LPTSTR psz;
                   1003: 
                   1004:     if (fAddLabel) {
                   1005:         /*
                   1006:          * Go ahead and quietly add the label for them.
                   1007:          */
                   1008:         if (AddLabel(pszSym, idNew, FPOS_MAX, 0, &plInclude,
                   1009:                 &plDelInclude, NULL, NULL)) {
                   1010:             /*
                   1011:              * Return the controls new id, update the status
                   1012:              * windows symbol combo box, mark the fact that
                   1013:              * we have changed the include file, and return
                   1014:              * success.
                   1015:              */
                   1016:             gfIncChged = TRUE;
                   1017:             StatusFillSymbolList(plInclude);
                   1018:         }
                   1019:         else {
                   1020:             /*
                   1021:              * An error occurred on the AddLabel.  The most likely
                   1022:              * cause of this is if they are trying to add a symbol
                   1023:              * with a duplicate id.
                   1024:              */
                   1025:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSNAMEID));
                   1026:             return FALSE;
                   1027:         }
                   1028:     }
                   1029: 
                   1030:     switch (npc->pwcd->iType) {
                   1031:         case W_ICON:
                   1032:             /*
                   1033:              * The resource name for an icon is stored in it's text.
                   1034:              */
                   1035:             ApplyNewText(npc, pszName);
                   1036:             break;
                   1037: 
                   1038:         case W_DIALOG:
                   1039:             /*
                   1040:              * We are done if the name was not changed.
                   1041:              */
                   1042:             if (NameOrdCmp(gcd.pszDlgName, pszName) == 0)
                   1043:                 break;
                   1044: 
                   1045:             /*
                   1046:              * Allocate room for the new name (it can be an ordinal!).
                   1047:              */
                   1048:             if (!(psz = MyAlloc(NameOrdLen(pszName))))
                   1049:                 return FALSE;
                   1050: 
                   1051:             NameOrdCpy(psz, pszName);
                   1052: 
                   1053:             if (gcd.pszDlgName)
                   1054:                 MyFree(gcd.pszDlgName);
                   1055: 
                   1056:             gcd.pszDlgName = psz;
                   1057: 
                   1058:             /*
                   1059:              * If the new name is an ordinal, update the base id of
                   1060:              * the dialog with it.
                   1061:              */
                   1062:             if (IsOrd(gcd.pszDlgName))
                   1063:                 gcd.npc->id = OrdID(gcd.pszDlgName);
                   1064: 
                   1065:             /*
                   1066:              * Finally, set the "changed" flag.
                   1067:              */
                   1068:             gfResChged = gfDlgChanged = TRUE;
                   1069: 
                   1070:             break;
                   1071:     }
                   1072: 
                   1073:     return TRUE;
                   1074: }
                   1075: 
                   1076: 
                   1077: 
                   1078: /************************************************************************
                   1079: * ApplyNewID
                   1080: *
                   1081: * Updates the control with the new id.
                   1082: *
                   1083: * Arguments:
                   1084: *   NPCTYPE npc    = Pointer to the control.
                   1085: *   INT idNew      = The ID.
                   1086: *   BOOL fAddLabel = TRUE if a new label for this id/symbol should be added.
                   1087: *   LPTSTR pszSym  = Symbol to add if fAddLabel is TRUE.
                   1088: *
                   1089: * Returns:
                   1090: *
                   1091: * TRUE if successful; otherwise, FALSE is returned.
                   1092: *
                   1093: ************************************************************************/
                   1094: 
                   1095: STATICFN BOOL ApplyNewID(
                   1096:     NPCTYPE npc,
                   1097:     INT idNew,
                   1098:     BOOL fAddLabel,
                   1099:     LPTSTR pszSym)
                   1100: {
                   1101:     if (fAddLabel) {
                   1102:         /*
                   1103:          * Go ahead and quietly add the label for them.
                   1104:          */
                   1105:         if (AddLabel(pszSym, idNew, FPOS_MAX, 0, &plInclude,
                   1106:                 &plDelInclude, NULL, NULL)) {
                   1107:             /*
                   1108:              * Return the controls new id, update the status
                   1109:              * windows symbol combo box, mark the fact that
                   1110:              * we have changed the include file, and return
                   1111:              * success.
                   1112:              */
                   1113:             gfIncChged = TRUE;
                   1114:             StatusFillSymbolList(plInclude);
                   1115:         }
                   1116:         else {
                   1117:             /*
                   1118:              * An error occurred on the AddLabel.  The most likely
                   1119:              * cause of this is if they are trying to add a symbol
                   1120:              * with a duplicate id.
                   1121:              */
                   1122:             SetFocus(GetDlgItem(hwndStatus, DID_STATUSSYMID));
                   1123:             return FALSE;
                   1124:         }
                   1125:     }
                   1126: 
                   1127:     /*
                   1128:      * Return if the id wasn't changed.
                   1129:      */
                   1130:     if (npc->id == idNew)
                   1131:         return TRUE;
                   1132: 
                   1133:     /*
                   1134:      * Update the controls id and set the resource changed flag.
                   1135:      */
                   1136:     npc->id = idNew;
                   1137:     gfResChged = gfDlgChanged = TRUE;
                   1138:     return TRUE;
                   1139: }
                   1140: 
                   1141: 
                   1142: 
                   1143: /************************************************************************
                   1144: * ApplyNewText
                   1145: *
                   1146: * Sets the new text from the processing of the OK command from
                   1147: * the Status ribbon window.  If the text was changed, the selected
                   1148: * control will have its text updated.
                   1149: *
                   1150: * Arguments:
                   1151: *   NPCTYPE npc       = Pointer to the control.
                   1152: *   LPTSTR pszNewText = The new text.
                   1153: *
                   1154: * Returns:
                   1155: *
                   1156: * TRUE if successful, FALSE otherwise.
                   1157: *
                   1158: ************************************************************************/
                   1159: 
                   1160: STATICFN BOOL ApplyNewText(
                   1161:     NPCTYPE npc,
                   1162:     LPTSTR pszNewText)
                   1163: {
                   1164:     INT cb;
                   1165:     LPTSTR psz;
                   1166: 
                   1167:     /*
                   1168:      * Did the text change?
                   1169:      */
                   1170:     if ((npc->text == NULL && *pszNewText) ||
                   1171:             (npc->text != NULL && NameOrdCmp(npc->text, pszNewText) != 0)) {
                   1172:         if (*pszNewText) {
                   1173:             cb = NameOrdLen(pszNewText);
                   1174: 
                   1175:             if (npc->text == NULL)
                   1176:                 psz = MyAlloc(cb);
                   1177:             else
                   1178:                 psz = MyRealloc(npc->text, cb);
                   1179: 
                   1180:             if (psz == NULL) {
                   1181:                 return FALSE;
                   1182:             }
                   1183:             else {
                   1184:                 NameOrdCpy(psz, pszNewText);
                   1185:                 npc->text = psz;
                   1186:             }
                   1187:         }
                   1188:         else {
                   1189:             if (npc->text) {
                   1190:                 MyFree(npc->text);
                   1191:                 npc->text = NULL;
                   1192:             }
                   1193:         }
                   1194: 
                   1195:         /*
                   1196:          * Change the text of the control, except for W_ICON controls
                   1197:          * because they have resource names.  In that case, we don't
                   1198:          * want to change the text of the actual control because
                   1199:          * the resource would probably not be found.
                   1200:          */
                   1201:         if (npc->pwcd->iType != W_ICON) {
                   1202:             SetWindowText(npc->hwnd, pszNewText);
                   1203: 
                   1204:             /*
                   1205:              * Redraw the control after the text changed.  This is
                   1206:              * necessary because changing the text probably caused
                   1207:              * the drag handles to get overwritten.
                   1208:              */
                   1209:             if (npc->pwcd->iType == W_DIALOG)
                   1210:                 /*
                   1211:                  * Redraw the frame, which just overwrote the drag
                   1212:                  * handles when the text was changed.
                   1213:                  */
                   1214:                 SetWindowPos(npc->hwnd, NULL, 0, 0, 0, 0,
                   1215:                         SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOMOVE |
                   1216:                         SWP_NOSIZE | SWP_NOZORDER);
                   1217:             else
                   1218:                 /*
                   1219:                  * Redraw the control(s).
                   1220:                  */
                   1221:                 RedrawSelection();
                   1222:         }
                   1223: 
                   1224:         gfResChged = gfDlgChanged = TRUE;
                   1225:     }
                   1226: 
                   1227:     return TRUE;
                   1228: }
                   1229: 
                   1230: 
                   1231: 
                   1232: /************************************************************************
                   1233: * StatusFillSymbolList
                   1234: *
                   1235: * This function fills the Symbol and Name combo boxes with
                   1236: * the given list of labels.
                   1237: *
                   1238: * Arguments:
                   1239: *   NPLABEL plHead - pointer to the list of labels.
                   1240: *
                   1241: ************************************************************************/
                   1242: 
                   1243: VOID StatusFillSymbolList(
                   1244:     NPLABEL plHead)
                   1245: {
                   1246:     NPLABEL npLabel;
                   1247:     HWND hwndSymCB;
                   1248:     HWND hwndNameCB;
                   1249:     HCURSOR hcurSave;
                   1250: 
                   1251:     hcurSave = SetCursor(hcurWait);
                   1252: 
                   1253:     /*
                   1254:      * Get the handles to the combo boxes and clear out all items.
                   1255:      */
                   1256:     hwndSymCB = GetDlgItem(hwndStatus, DID_STATUSSYM);
                   1257:     hwndNameCB = GetDlgItem(hwndStatus, DID_STATUSNAME);
                   1258:     SendMessage(hwndSymCB, CB_RESETCONTENT, 0, 0L);
                   1259:     SendMessage(hwndNameCB, CB_RESETCONTENT, 0, 0L);
                   1260: 
                   1261:     /*
                   1262:      * Fill the combo boxes with the items.
                   1263:      */
                   1264:     for (npLabel = plHead; npLabel; npLabel = npLabel->npNext) {
                   1265:         SendMessage(hwndSymCB, CB_ADDSTRING, 0, (DWORD)npLabel->pszLabel);
                   1266:         SendMessage(hwndNameCB, CB_ADDSTRING, 0, (DWORD)npLabel->pszLabel);
                   1267:     }
                   1268: 
                   1269:     /*
                   1270:      * Put some special entries into the symbol combo.  Note that we allow
                   1271:      * the user to have defined IDOK and IDCANCEL to be something else,
                   1272:      * in which case we will NOT add these special entries after all.
                   1273:      */
                   1274:     SendMessage(hwndSymCB, CB_ADDSTRING, 0, (DWORD)ids(IDS_UNUSED));
                   1275: 
                   1276:     if (!FindLabel(ids(IDS_IDOK), plInclude))
                   1277:         SendMessage(hwndSymCB, CB_ADDSTRING, 0, (DWORD)ids(IDS_IDOK));
                   1278: 
                   1279:     if (!FindLabel(ids(IDS_IDCANCEL), plInclude))
                   1280:         SendMessage(hwndSymCB, CB_ADDSTRING, 0, (DWORD)ids(IDS_IDCANCEL));
                   1281: 
                   1282:     SetCursor(hcurSave);
                   1283: }
                   1284: 
                   1285: 
                   1286: 
                   1287: /************************************************************************
                   1288: * StatusSetCoords
                   1289: *
                   1290: * This function sets the coordinates in the status display
                   1291: * to the given rectangle.
                   1292: *
                   1293: * Arguments:
                   1294: *    PRECT prc - coordinates.
                   1295: *
                   1296: ************************************************************************/
                   1297: 
                   1298: VOID StatusSetCoords(
                   1299:     PRECT prc)
                   1300: {
                   1301:     static INT xSave = 0x7FFF;
                   1302:     static INT ySave = 0x7FFF;
                   1303:     static INT cxSave = 0x7FFF;
                   1304:     static INT cySave = 0x7FFF;
                   1305:     static INT x2Save = 0x7FFF;
                   1306:     static INT y2Save = 0x7FFF;
                   1307:     TCHAR szBuf[CCHTEXTMAX];
                   1308: 
                   1309:     if (prc) {
                   1310:         if (prc->bottom - prc->top != cySave) {
                   1311:             /*
                   1312:              *  Save it for the next time.
                   1313:              */
                   1314:             cySave = prc->bottom - prc->top;
                   1315: 
                   1316:             wsprintf(szBuf, ids(IDS_CYFMTSTR), cySave);
                   1317:             SetDlgItemText(hwndStatus, DID_STATUSCY, szBuf);
                   1318:         }
                   1319: 
                   1320:         if (prc->right != x2Save || prc->bottom != y2Save) {
                   1321:             /*
                   1322:              *  Save them for the next time.
                   1323:              */
                   1324:             x2Save = prc->right;
                   1325:             y2Save = prc->bottom;
                   1326: 
                   1327:             wsprintf(szBuf, L"(%d, %d)", x2Save, y2Save);
                   1328:             SetDlgItemText(hwndStatus, DID_STATUSX2Y2, szBuf);
                   1329:         }
                   1330: 
                   1331:         if (prc->left != xSave || prc->top != ySave) {
                   1332:             /*
                   1333:              *  Save them for the next time.
                   1334:              */
                   1335:             xSave = prc->left;
                   1336:             ySave = prc->top;
                   1337: 
                   1338:             wsprintf(szBuf, L"(%d, %d)", xSave, ySave);
                   1339:             SetDlgItemText(hwndStatus, DID_STATUSXY, szBuf);
                   1340:         }
                   1341: 
                   1342:         if (prc->right - prc->left != cxSave) {
                   1343:             /*
                   1344:              *  Save it for the next time.
                   1345:              */
                   1346:             cxSave = prc->right - prc->left;
                   1347: 
                   1348:             wsprintf(szBuf, ids(IDS_CXFMTSTR), cxSave);
                   1349:             SetDlgItemText(hwndStatus, DID_STATUSCX, szBuf);
                   1350:         }
                   1351:     }
                   1352:     else {
                   1353:         /*
                   1354:          * Clear the fields.
                   1355:          */
                   1356:         SetDlgItemText(hwndStatus, DID_STATUSXY, szEmpty);
                   1357:         SetDlgItemText(hwndStatus, DID_STATUSX2Y2, szEmpty);
                   1358:         SetDlgItemText(hwndStatus, DID_STATUSCX, szEmpty);
                   1359:         SetDlgItemText(hwndStatus, DID_STATUSCY, szEmpty);
                   1360: 
                   1361:         /*
                   1362:          * Reset the cache variables so that the next "set" of
                   1363:          * the coords is sure to update the display fields.
                   1364:          */
                   1365:         xSave =
                   1366:         ySave =
                   1367:         cxSave =
                   1368:         cySave =
                   1369:         x2Save =
                   1370:         y2Save = 0x7FFF;
                   1371:     }
                   1372: }
                   1373: 
                   1374: 
                   1375: 
                   1376: /************************************************************************
                   1377: * StatusSetText
                   1378: *
                   1379: * This function sets the "Text" field in the status display
                   1380: * to the given text.
                   1381: *
                   1382: * Arguments:
                   1383: *   LPTSTR pszText - The text to display.  This can be NULL.
                   1384: *   INT Type       - Type of control.  One of the W_* constants.
                   1385: *
                   1386: ************************************************************************/
                   1387: 
                   1388: STATICFN VOID StatusSetText(
                   1389:     LPTSTR pszText,
                   1390:     INT Type)
                   1391: {
                   1392:     /*
                   1393:      * Protect against getting a null value.
                   1394:      */
                   1395:     if (!pszText)
                   1396:         pszText = szEmpty;
                   1397: 
                   1398:     /*
                   1399:      * If this is an icon control, set the name instead (the text
                   1400:      * of an icon is really a resource name).
                   1401:      */
                   1402:     if (Type == W_ICON)
                   1403:         StatusSetName(pszText, Type);
                   1404:     else
                   1405:         SetDlgItemText(hwndStatus, DID_STATUSTEXT, pszText);
                   1406: }
                   1407: 
                   1408: 
                   1409: 
                   1410: /************************************************************************
                   1411: * StatusSetTextLabels
                   1412: *
                   1413: * This function sets the labels of the descriptive text fields in
                   1414: * Status window based on the type of control that is selected.
                   1415: *
                   1416: * Arguments:
                   1417: *   INT Type    - Type of control.  One of the W_* constants.
                   1418: *   BOOL fIsOrd - TRUE if the name is an ordinal.  This is ignored
                   1419: *                 unless Type is W_DIALOG or W_ICON.
                   1420: *
                   1421: ************************************************************************/
                   1422: 
                   1423: STATICFN VOID StatusSetTextLabels(
                   1424:     INT Type,
                   1425:     BOOL fIsOrd)
                   1426: {
                   1427:     WORD ids1;
                   1428:     WORD ids2;
                   1429: 
                   1430:     switch (Type) {
                   1431:         case W_DIALOG:
                   1432:             ids1 = (WORD)(fIsOrd ? IDS_DLGIDLABEL : IDS_DLGNAMELABEL);
                   1433:             ids2 = IDS_CAPTIONLABEL;
                   1434:             break;
                   1435: 
                   1436:         case W_ICON:
                   1437:             ids1 = IDS_SYMBOLLABEL;
                   1438:             ids2 = (WORD)(fIsOrd ? IDS_ICONIDLABEL : IDS_ICONNAMELABEL);
                   1439:             break;
                   1440: 
                   1441:         default:
                   1442:             ids1 = IDS_SYMBOLLABEL;
                   1443:             ids2 = IDS_TEXTLABEL;
                   1444:             break;
                   1445:     }
                   1446: 
                   1447:     SetDlgItemText(hwndStatus, DID_STATUSLABEL1, ids(ids1));
                   1448:     SetDlgItemText(hwndStatus, DID_STATUSLABEL2, ids(ids2));
                   1449: }
                   1450: 
                   1451: 
                   1452: 
                   1453: /************************************************************************
                   1454: * StatusSetID
                   1455: *
                   1456: * Updates the id field of the given label.
                   1457: *
                   1458: * Arguments:
                   1459: *     INT id        = The id.
                   1460: *     BOOL fSymAlso = Find the corresponding label and update the
                   1461: *                     symbol field also.
                   1462: *
                   1463: ************************************************************************/
                   1464: 
                   1465: STATICFN VOID StatusSetID(
                   1466:     INT id,
                   1467:     BOOL fSymAlso)
                   1468: {
                   1469:     TCHAR szValue[CCHIDMAX + 1];
                   1470:     NPLABEL npLabel;
                   1471:     LPTSTR pszLabel;
                   1472: 
                   1473:     Myitoa(id, szValue);
                   1474:     SetDlgItemText(hwndStatus, DID_STATUSSYMID, szValue);
                   1475: 
                   1476:     if (fSymAlso) {
                   1477:         /*
                   1478:          * If a matching label is found, the text is used.
                   1479:          * Otherwise, if the id is zero, we use the "unused"
                   1480:          * label.  Otherwise, we just use an empty string.
                   1481:          */
                   1482:         if (npLabel = FindID(id, plInclude))
                   1483:             pszLabel = npLabel->pszLabel;
                   1484:         else if (id == IDUNUSED)
                   1485:             pszLabel = ids(IDS_UNUSED);
                   1486:         else if (id == IDOK && !FindLabel(ids(IDS_IDOK), plInclude))
                   1487:             pszLabel = ids(IDS_IDOK);
                   1488:         else if (id == IDCANCEL && !FindLabel(ids(IDS_IDCANCEL), plInclude))
                   1489:             pszLabel = ids(IDS_IDCANCEL);
                   1490:         else
                   1491:             pszLabel = szEmpty;
                   1492: 
                   1493:         SetDlgItemText(hwndStatus, DID_STATUSSYM, pszLabel);
                   1494:     }
                   1495: }
                   1496: 
                   1497: 
                   1498: 
                   1499: /************************************************************************
                   1500: * StatusSetName
                   1501: *
                   1502: * This function sets the "Res. Name" field in the status display
                   1503: * to the given text.
                   1504: *
                   1505: * Arguments:
                   1506: *
                   1507: *   LPTSTR pszName - The name to display.  NULL values and ordinals
                   1508: *                    are handled properly.
                   1509: *   INT Type       - Type of control.  One of the W_* constants.
                   1510: *
                   1511: ************************************************************************/
                   1512: 
                   1513: STATICFN VOID StatusSetName(
                   1514:     LPTSTR pszName,
                   1515:     INT Type)
                   1516: {
                   1517:     NPLABEL npLabel;
                   1518: 
                   1519:     /*
                   1520:      * Protect against getting a null value.
                   1521:      */
                   1522:     if (!pszName)
                   1523:         pszName = szEmpty;
                   1524: 
                   1525:     /*
                   1526:      * Does the name represent an ordinal?  If so, set the nameid
                   1527:      * field to the value and fill in the name field with the
                   1528:      * associated symbol, if there is one.
                   1529:      *
                   1530:      * Note that this does NOT produce a hex value in Hex Mode for
                   1531:      * dialog names, because rc.exe does not parse hex ordinals
                   1532:      * for dialog names.
                   1533:      */
                   1534:     if (IsOrd(pszName)) {
                   1535:         StatusSetNameID(OrdID(pszName), Type);
                   1536: 
                   1537:         if (npLabel = FindID(OrdID(pszName), plInclude))
                   1538:             pszName = npLabel->pszLabel;
                   1539:         else
                   1540:             pszName = szEmpty;
                   1541:     }
                   1542:     else {
                   1543:         SetDlgItemText(hwndStatus, DID_STATUSNAMEID, szEmpty);
                   1544:     }
                   1545: 
                   1546:     SetDlgItemText(hwndStatus, DID_STATUSNAME, pszName);
                   1547: }
                   1548: 
                   1549: 
                   1550: 
                   1551: /************************************************************************
                   1552: * StatusSetNameID
                   1553: *
                   1554: * This function sets the id edit field associated with the
                   1555: * "Res. Name" field in the status display
                   1556: *
                   1557: * Arguments:
                   1558: *
                   1559: *   INT id   - The id to set into the field.
                   1560: *   INT Type - Type of control.  One of the W_* constants.
                   1561: *
                   1562: ************************************************************************/
                   1563: 
                   1564: STATICFN VOID StatusSetNameID(
                   1565:     INT id,
                   1566:     INT Type)
                   1567: {
                   1568:     TCHAR szValue[CCHIDMAX + 1];
                   1569: 
                   1570:     /*
                   1571:      * If the current control is a dialog, do NOT produce a hex
                   1572:      * value, even if the hex mode is on.  RC.Exe doesn't recognize
                   1573:      * hex values for the dialog name as ordinals.
                   1574:      */
                   1575:     if (Type == W_DIALOG)
                   1576:         itoaw(id, szValue, 10);
                   1577:     else
                   1578:         Myitoa(id, szValue);
                   1579: 
                   1580:     SetDlgItemText(hwndStatus, DID_STATUSNAMEID, szValue);
                   1581: }
                   1582: 
                   1583: 
                   1584: 
                   1585: /************************************************************************
                   1586: * StatusClearID
                   1587: *
                   1588: * Clears the id of the status window..
                   1589: *
                   1590: ************************************************************************/
                   1591: 
                   1592: STATICFN VOID StatusClearID(VOID)
                   1593: {
                   1594:     SetDlgItemText(hwndStatus, DID_STATUSSYM, szEmpty);
                   1595:     SetDlgItemText(hwndStatus, DID_STATUSSYMID, szEmpty);
                   1596: }
                   1597: 
                   1598: 
                   1599: 
                   1600: /************************************************************************
                   1601: * StatusClearName
                   1602: *
                   1603: * Clears the name of the status window.
                   1604: *
                   1605: ************************************************************************/
                   1606: 
                   1607: STATICFN VOID StatusClearName(VOID)
                   1608: {
                   1609:     SetDlgItemText(hwndStatus, DID_STATUSNAME, szEmpty);
                   1610:     SetDlgItemText(hwndStatus, DID_STATUSNAMEID, szEmpty);
                   1611: }
                   1612: 
                   1613: 
                   1614: 
                   1615: /************************************************************************
                   1616: * StatusClear
                   1617: *
                   1618: * Clears the status window.
                   1619: *
                   1620: ************************************************************************/
                   1621: 
                   1622: STATICFN VOID StatusClear(VOID)
                   1623: {
                   1624:     StatusSetCoords(NULL);
                   1625:     StatusSetText(NULL, W_NOTHING);
                   1626:     StatusShowFields(W_NOTHING);
                   1627:     StatusClearID();
                   1628:     StatusClearName();
                   1629:     gfStatusChanged = FALSE;
                   1630: }
                   1631: 
                   1632: 
                   1633: 
                   1634: /************************************************************************
                   1635: * StatusUpdate
                   1636: *
                   1637: * Updates the status window to the current selection.
                   1638: *
                   1639: ************************************************************************/
                   1640: 
                   1641: VOID StatusUpdate(VOID)
                   1642: {
                   1643:     if (gnpcSel) {
                   1644:         StatusSetCoords(&gnpcSel->rc);
                   1645:         StatusSetText(gnpcSel->text, gnpcSel->pwcd->iType);
                   1646: 
                   1647:         if (gfDlgSelected)
                   1648:             StatusSetName(gcd.pszDlgName, W_DIALOG);
                   1649:         else
                   1650:             StatusSetID(gnpcSel->id, TRUE);
                   1651: 
                   1652:         StatusShowFields(gnpcSel->pwcd->iType);
                   1653: 
                   1654:         gfStatusChanged = FALSE;
                   1655:     }
                   1656:     else {
                   1657:         StatusClear();
                   1658:     }
                   1659: }
                   1660: 
                   1661: 
                   1662: 
                   1663: /************************************************************************
                   1664: * StatusShowFields
                   1665: *
                   1666: * This function shows and hides fields in the Status ribbon based on
                   1667: * whether the dialog is currently selected or not.  This is necessary
                   1668: * because dialogs have a name, whereas controls do not, and controls
                   1669: * have an id that dialogs do not have, etc.
                   1670: *
                   1671: * It will also call StatusSetTextLabels to set the text for the
                   1672: * descriptive labels in front of the fields.
                   1673: *
                   1674: * This function should be called whenever it is possible that the current
                   1675: * selection has been changed.
                   1676: *
                   1677: * Arguments:
                   1678: *   INT Type - Type of control that is selected (W_* constant).
                   1679: *
                   1680: ************************************************************************/
                   1681: 
                   1682: STATICFN VOID StatusShowFields(
                   1683:     INT Type)
                   1684: {
                   1685:     /*
                   1686:      * This static caches the type of the selected control.
                   1687:      */
                   1688:     static INT TypeSave = W_NOTHING;
                   1689: 
                   1690:     /*
                   1691:      * We only have special cases for the dialog and for icon controls.
                   1692:      * All other types are treated the same (we use W_CHECKBOX arbitrarily).
                   1693:      * This prevents some repainting when switching between controls that
                   1694:      * have the same layout of fields in the status window.
                   1695:      */
                   1696:     if (Type != W_DIALOG && Type != W_ICON)
                   1697:         Type = W_CHECKBOX;
                   1698: 
                   1699:     if (Type != TypeSave) {
                   1700:         switch (Type) {
                   1701:             case W_DIALOG:
                   1702:                 MoveWindow(GetDlgItem(hwndStatus, DID_STATUSNAME),
                   1703:                         grcTopCombo.left, grcTopCombo.top,
                   1704:                         grcTopCombo.right - grcTopCombo.left,
                   1705:                         grcTopCombo.bottom - grcTopCombo.top, TRUE);
                   1706:                 MoveWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID),
                   1707:                         grcTopEdit.left, grcTopEdit.top,
                   1708:                         grcTopEdit.right - grcTopEdit.left,
                   1709:                         grcTopEdit.bottom - grcTopEdit.top, TRUE);
                   1710: 
                   1711:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAME), SW_SHOW);
                   1712:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID), SW_SHOW);
                   1713:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSTEXT), SW_SHOW);
                   1714:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYM), SW_HIDE);
                   1715:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYMID), SW_HIDE);
                   1716: 
                   1717:                 StatusSetTextLabels(Type, IsOrd(gcd.pszDlgName));
                   1718: 
                   1719:                 break;
                   1720: 
                   1721:             case W_ICON:
                   1722:                 MoveWindow(GetDlgItem(hwndStatus, DID_STATUSNAME),
                   1723:                         grcBottomCombo.left, grcBottomCombo.top,
                   1724:                         grcBottomCombo.right - grcBottomCombo.left,
                   1725:                         grcBottomCombo.bottom - grcBottomCombo.top, TRUE);
                   1726:                 MoveWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID),
                   1727:                         grcBottomEdit.left, grcBottomEdit.top,
                   1728:                         grcBottomEdit.right - grcBottomEdit.left,
                   1729:                         grcBottomEdit.bottom - grcBottomEdit.top, TRUE);
                   1730: 
                   1731:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAME), SW_SHOW);
                   1732:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID), SW_SHOW);
                   1733:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSTEXT), SW_HIDE);
                   1734:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYM), SW_SHOW);
                   1735:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYMID), SW_SHOW);
                   1736: 
                   1737:                 StatusSetTextLabels(Type,
                   1738:                         gnpcSel->text ? IsOrd(gnpcSel->text) : FALSE);
                   1739: 
                   1740:                 break;
                   1741: 
                   1742:             default:
                   1743:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSTEXT), SW_SHOW);
                   1744:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYM), SW_SHOW);
                   1745:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSSYMID), SW_SHOW);
                   1746:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAME), SW_HIDE);
                   1747:                 ShowWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID), SW_HIDE);
                   1748: 
                   1749:                 StatusSetTextLabels(Type, FALSE);
                   1750: 
                   1751:                 break;
                   1752:         }
                   1753: 
                   1754:         TypeSave = Type;
                   1755:     }
                   1756: }
                   1757: 
                   1758: 
                   1759: 
                   1760: /************************************************************************
                   1761: * StatusSetEnable
                   1762: *
                   1763: * This routine sets the enable state of the editable controls in the
                   1764: * status window based on various state globals.
                   1765: *
                   1766: * The controls will be disabled on the following conditions:
                   1767: *
                   1768: *   1. Nothing is selected.
                   1769: *   2. We are in Test mode.
                   1770: *   3. One of the editors own dialogs is up (gfDisabled == TRUE).
                   1771: *
                   1772: * In addition, some controls will always be disabled if in Translate
                   1773: * mode, and the text field will be disabled if this control cannot
                   1774: * have text.
                   1775: *
                   1776: ************************************************************************/
                   1777: 
                   1778: VOID StatusSetEnable(VOID)
                   1779: {
                   1780:     BOOL fEnableText = TRUE;
                   1781:     BOOL fEnableSym = TRUE;
                   1782:     BOOL fEnableName = TRUE;
                   1783: 
                   1784:     if (!gnpcSel || gfTestMode || gfDisabled)
                   1785:         fEnableText = fEnableSym = fEnableName = FALSE;
                   1786: 
                   1787:     /*
                   1788:      * Disable the text field if this control cannot have text.
                   1789:      */
                   1790:     if (gnpcSel && !gnpcSel->pwcd->fHasText)
                   1791:         fEnableText = FALSE;
                   1792: 
                   1793:     /*
                   1794:      * If the dialog is selected and the style does not include
                   1795:      * a caption, disable the text field.
                   1796:      */
                   1797:     if (gfDlgSelected && (gnpcSel->flStyle & WS_CAPTION) != WS_CAPTION)
                   1798:         fEnableText = FALSE;
                   1799: 
                   1800:     /*
                   1801:      * Always disable the symbol and name fields if Translating.
                   1802:      */
                   1803:     if (gfTranslateMode)
                   1804:         fEnableSym = fEnableName = FALSE;
                   1805: 
                   1806:     EnableWindow(GetDlgItem(hwndStatus, DID_STATUSTEXT), fEnableText);
                   1807: 
                   1808:     EnableWindow(GetDlgItem(hwndStatus, DID_STATUSSYM), fEnableSym);
                   1809:     EnableWindow(GetDlgItem(hwndStatus, DID_STATUSSYMID), fEnableSym);
                   1810: 
                   1811:     EnableWindow(GetDlgItem(hwndStatus, DID_STATUSNAME), fEnableName);
                   1812:     EnableWindow(GetDlgItem(hwndStatus, DID_STATUSNAMEID), fEnableName);
                   1813: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.