Annotation of mstools/samples/sdktools/dlgedit/status.c, revision 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.