home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / µSim 1.1 / source / DoEditDialog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-25  |  4.5 KB  |  178 lines  |  [TEXT/CWIE]

  1. /*
  2. Copyright © 1993-1997 Fabrizio Oddone
  3. ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
  4. This source code is distributed as freeware:
  5. you may copy, exchange, modify this code.
  6. You may include this code in any kind of application: freeware,
  7. shareware, or commercial, provided that full credits are given.
  8. You may not sell or distribute this code for profit.
  9. */
  10.  
  11. #include    <Limits.h>
  12.  
  13. #include    "UtilsSys7.h"
  14. #include    "SimResIDs.h"
  15.  
  16. #include    "Globals.h"
  17. #include    "Animation.h"
  18. #include    "DoEditDialog.h"
  19. #include    "DoMenu.h"
  20. #include    "Main.h"
  21. #include    "MovableModal.h"
  22. #include    "Registers.h"
  23. #include    "SimUtils.h"
  24. #include    "Independents.h"
  25. #include    "Conversions.h"
  26.  
  27. #if defined(FabSystem7orlater)
  28.  
  29. #pragma segment Rare
  30.  
  31. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base);
  32. static void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit);
  33. static Boolean EditNumPreProcessKey(EventRecord *thEv, DialogPtr theD);
  34.  
  35. static short    lastChoice;
  36.  
  37.  
  38. /* DoEditDump: we shall edit a memory location */
  39.  
  40. Boolean DoEditDump(short *addr, short wordn)
  41. {
  42. Str27    tempStr0;
  43. Str15    tempStr1;
  44. short    newv;
  45. Boolean changed;
  46.  
  47. GetIndHString((StringPtr)&tempStr0, Get1Resource('STR#', kValueFollow), kAtMem);
  48. ShortToHexString(wordn, tempStr1);
  49. newv = EditValue(tempStr0, tempStr1, *addr, kPOP_HEX);
  50. if (changed = (newv != *addr))
  51.     *addr = newv;
  52. return changed;
  53. }
  54.  
  55. /* DoEditDialog: we shall edit a register or an internal processor part */
  56.  
  57. Boolean DoEditDialog(short item, short pclass, short base)
  58. {
  59. Str27    tempStr0;
  60. Str31    tempStr1;
  61. short *oldv;
  62. short    newv;
  63. Boolean changed;
  64.  
  65. GetIndHString((StringPtr)&tempStr0, Get1Resource('STR#', kValueFollow), kInThe);
  66. GetIndHString((StringPtr)&tempStr1, Get1Resource('STR#', pclass), item);
  67. oldv = pclass == kPART_NAMES ? &gParts[item] : &gRegs[item];
  68. newv = EditValue(tempStr0, tempStr1, *oldv, base);
  69. if (changed = (newv != *oldv)) {
  70.     *oldv = newv;
  71.     if (pclass == kPART_NAMES)
  72.         ChangedBox(item);
  73.     }
  74. return changed;
  75. }
  76.  
  77. enum {
  78. kItemEditValue = 3,
  79. kItemPopupBase
  80. };
  81.  
  82. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base)
  83. {
  84. Str255    EditStr;
  85. long    tempLong;
  86.  
  87. dialogItems    things[] = {{ ok, 0, 1L },
  88.                         { cancel, 0, 0L },
  89.                         { kItemEditValue, 0, 0L },
  90.                         { kItemPopupBase, 0, 0L },
  91.                         { 0, 0, 0L}
  92.                         };
  93.  
  94. things[kItemEditValue-1].refCon = (long)&EditStr;
  95. things[kItemPopupBase-1].refCon = base;
  96. tempLong = edit;
  97. lastChoice = base;
  98. ParamText(str0, str1, nil, nil);
  99. FromNumToString(EditStr, edit, base);
  100. //things[kItemEditValue-1].refCon = ;
  101.  
  102. if (HandleMovableModalDialog(things, gPrefs.remembWind ? &gPrefs.editValueTL : nil, nil, nil, nil, nil, EditUserProc,
  103.     AdjustMenus,
  104.     Handle_My_Menu,
  105.     DomyKeyEvent,
  106.     EditNumPreProcessKey,
  107.     nil,
  108.     DoUpdate,
  109.     DoActivate,
  110.     DoHighLevelEvent,
  111.     DoOSEvent,
  112.     DoIdle,
  113.     ULONG_MAX,
  114.     kDLOG_EDITVALUE) == ok) {
  115.     tempLong = 0L;
  116.     FromStringToNum((ConstStr255Param)&EditStr, &tempLong, lastChoice);
  117.     }
  118. return tempLong;
  119. }
  120.  
  121. void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit)
  122. {
  123. Str255    tempStr;
  124. Rect    tempRect;
  125. Handle    tempH;
  126. long    tempnum;
  127. short    null;
  128. short    newChoice;
  129.  
  130. if (itemHit == kItemPopupBase)
  131.     if ((newChoice = GetControlValue((ControlHandle)itemHandle)) != lastChoice) {
  132.         GetDialogItem(myDPtr, kItemEditValue, &null, &tempH, &tempRect);
  133.         GetDialogItemText(tempH, tempStr);
  134.         tempnum = 0L;
  135.         FromStringToNum((ConstStr255Param)&tempStr, &tempnum, lastChoice);
  136.         FromNumToString(tempStr, (short)tempnum, newChoice);
  137.         lastChoice = newChoice;
  138.         SetDialogItemText(tempH, tempStr);
  139.         SelectDialogItemText(myDPtr, kItemEditValue, 0, SHRT_MAX);
  140.         }
  141. }
  142.  
  143. Boolean EditNumPreProcessKey(EventRecord *thEv, DialogPtr theD)
  144. {
  145. short    iHit;
  146. unsigned char    keypressed;
  147. Boolean    result = true;
  148.  
  149. keypressed = CHARFROMMESSAGE(thEv->message);
  150. if (lastChoice != kPOP_TEXT) {
  151.     if ((keypressed >= 'a') && (keypressed <= 'z')) {
  152.         keypressed -= 'a' - 'A';    /* cambiare! */
  153.         CHARFROMMESSAGE(thEv->message) = keypressed;
  154.         }
  155.     iHit = ((DialogPeek)theD)->editField + 1;
  156.     if (keypressed >= 32 && ((thEv->modifiers & cmdKey) == 0)) {
  157.         switch( lastChoice ) {
  158.             case kPOP_DEC:    return( Munger((Handle)GetString(kSTR_DECALLOWED), 1L,
  159.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  160.                             break;
  161.             case kPOP_HEX:    return( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L,
  162.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  163.                             break;
  164.             case kPOP_OCT:    return( Munger((Handle)GetString(kSTR_OCTALLOWED), 1L,
  165.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  166.                             break;
  167.             case kPOP_BIN:    return( Munger((Handle)GetString(kSTR_BINALLOWED), 1L,
  168.                                     &keypressed, 1L, 0L, 0L) >= 0L );
  169.                             break;
  170.             }
  171.         }
  172.     }
  173. return result;
  174. }
  175.  
  176. #endif
  177.  
  178.