home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / cdev / setnode.sit / nhcdev.c next >
C/C++ Source or Header  |  1988-02-14  |  6KB  |  255 lines

  1. /* SetNode */
  2. /* File nhcdev.c (node hint cdev) */
  3. /* ⌐1988 Jim Hamilton
  4.         this file may be published everywhere, but no charge
  5.         may be made for its use */
  6.  
  7. #include "cdev.h"
  8. #include <OSUtil.h>
  9.  
  10. #define REVBUT    2
  11. #define PFIELD    3
  12. #define    MFIELD    4
  13.  
  14. #define NODEFILL    -4048
  15. #define ETFIELD        3
  16.  
  17. #define ENTERKEY    3
  18. #define RETURNKEY    '\r'
  19.  
  20. struct cstor {
  21.     Byte modemsave;
  22.     Byte printersave;
  23.     Byte modemset;
  24.     Byte printerset;
  25. };
  26.  
  27. pascal Handle 
  28.     main( message, item, numItems, CPanelID, ep, cdevStorage, CPDialog)
  29. register int message;
  30. int item;
  31. int numItems;
  32. int CPanelID;
  33. EventRecord *ep;
  34. Handle cdevStorage;
  35. DialogPtr CPDialog;
  36. {
  37.     if (cdevStorage < (Handle) 2L && cdevStorage > (Handle) -2L)
  38.                                 /* -1, 0, or 1 means error */
  39.         return cdevStorage;
  40.     
  41.     switch( message) {
  42.     case initDev:    /* initialize */
  43.         cdevStorage = NewHandle( sizeof( struct cstor));
  44.         if (cdevStorage == 0L)        /* no memory available */
  45.             return cdevStorage;
  46.         
  47.         initfields( cdevStorage, CPDialog, numItems);    /* initialize edittext fields */
  48.         break;
  49.     
  50.     case hitDev:
  51.         doHit( item, numItems, CPDialog, cdevStorage);    /* handle event */
  52.         break;
  53.     
  54.     case closeDev:
  55.         DisposHandle( cdevStorage);
  56.         cdevStorage = (Handle) 0L;
  57.         
  58.     case nulDev:
  59.         break;            /* do nothing on null events */
  60.         
  61.     case updateDev:
  62.         break;
  63.     
  64.     case ActivDev:
  65.     case deActDev:
  66.     case keyEvtDev:
  67.         break;            /* Dialog Manager handles activates, key-downs */
  68.     
  69.     case macDev:        /* this message is sent if softMask = $0000 and
  70.                                 hardMask = $FFFF to determine whether to
  71.                                 appear in the Control Panel's window */
  72.         return (Handle) 1;    /* yes, though this area is never executed */
  73.         break;
  74.     }
  75.     return( cdevStorage);
  76. }
  77.  
  78. initfields( cdevStorage, CPDialog, numItems)    /* initialize edittext fields */
  79. struct cstor **cdevStorage;
  80. register DialogPtr CPDialog;
  81. int numItems;
  82. {
  83.     register struct cstor *storage;
  84.     unsigned char eftext[ 32];
  85.     int dKind;
  86.     Handle dItem;
  87.     Rect dBox;
  88.     
  89.     /* lock and dereference handle */
  90.     HLock( cdevStorage);
  91.     storage = *cdevStorage;
  92.     
  93.     /* get node hints from PRAM copy */
  94.     storage->modemsave = SysParam.aTalkA;
  95.     storage->printersave = SysParam.aTalkB;
  96.     
  97.     /* set printer hint field */
  98.     NumToString( (long) storage->printersave, eftext);
  99.     
  100.     GetDItem( CPDialog, PFIELD + numItems, &dKind, &dItem, &dBox);
  101.     SetIText( dItem, eftext);
  102.     
  103.     /* set modem hint field */
  104.     NumToString( (long) storage->modemsave, eftext);
  105.     
  106.     GetDItem( CPDialog, MFIELD + numItems, &dKind, &dItem, &dBox);
  107.     SetIText( dItem, eftext);
  108.     
  109.     /* unlock handle */
  110.     HUnlock( cdevStorage);
  111. }
  112.  
  113. /* filterProc to accept digits only in modal dialog */
  114. pascal Boolean digits( dptr, evt, item)
  115. DialogPtr    dptr;
  116. EventRecord    *evt;
  117. int            *item;
  118. {
  119.     register char    charcode;
  120.     
  121.     if (evt->what == keyDown) {
  122.         charcode = (char) evt->message;
  123.         if (charcode == RETURNKEY || charcode == ENTERKEY) {
  124.             *item = OK;
  125.             return( true);
  126.         }
  127.         if (charcode == '\t' || charcode == '\b')
  128.             return( false);
  129.         if (charcode >= 0x1c && charcode <= 0x1f)    /* arrow keys */
  130.             return( false);
  131.         if (charcode >= '0' && charcode <= '9')
  132.             return( false);
  133.         else {
  134.             *item = 0;
  135.             return( true);
  136.         }
  137.     }
  138.     
  139.     return( false);
  140. }
  141.  
  142. /* frameok draws the standard "default" frame around a button in dlg
  143.         it assumes that the item is a button and that the current 
  144.         GrafPort is pointed by dlg (N.B.: there is no error checking)
  145.         */
  146. frameok( dlg, itm)
  147. DialogPtr dlg;
  148. int itm;
  149. {
  150.     int kind;    Handle item;    Rect box;
  151.     
  152.     GetDItem( dlg, itm, &kind, &item, &box);
  153.     InsetRect( &box, -4, -4);
  154.     PenSize( 3, 3);
  155.     FrameRoundRect( &box, 16, 16);
  156.     PenNormal();
  157. }
  158.  
  159. doHit( item, numItems, CPDialog, cdevStorage)
  160. int item, numItems;
  161. DialogPtr CPDialog;
  162. struct cstor **cdevStorage;
  163. {
  164.     register struct cstor *storage;
  165.     unsigned char eftext[ 32];
  166.     long temp;
  167.     int dKind;
  168.     Handle dItem;
  169.     Rect dBox;
  170.     DialogPtr modal;
  171.     int itemHit;
  172.     pascal Boolean digits();
  173.     
  174.     switch( item - numItems) {
  175.     case REVBUT:    /* revert to value at initDev */
  176.         /* lock and dereference handle */
  177.         HLock( cdevStorage);
  178.         storage = *cdevStorage;
  179.         
  180.         /* set node hints in PRAM */
  181.         SysParam.aTalkA = storage->modemset = storage->modemsave;
  182.         SysParam.aTalkB = storage->printerset = storage->printersave;
  183.         WriteParam();
  184.         
  185.         /* set printer hint field */
  186.         NumToString( (long) storage->printersave, eftext);
  187.         
  188.         GetDItem( CPDialog, PFIELD + numItems, &dKind, &dItem, &dBox);
  189.         SetIText( dItem, eftext);
  190.         InvalRect( &dBox);
  191.         
  192.         /* set modem hint field */
  193.         NumToString( (long) storage->modemsave, eftext);
  194.         
  195.         GetDItem( CPDialog, MFIELD + numItems, &dKind, &dItem, &dBox);
  196.         SetIText( dItem, eftext);
  197.         InvalRect( &dBox);
  198.         
  199.         /* unlock handle */
  200.         HUnlock( cdevStorage);
  201.         
  202.         break;
  203.     
  204.     case PFIELD:
  205.     case MFIELD:
  206.         /* lock and dereference handle */
  207.         HLock( cdevStorage);
  208.         storage = *cdevStorage;
  209.         
  210.         GetDItem( CPDialog, item, &dKind, &dItem, &dBox);
  211.         InvertRect( &dBox);
  212.         
  213.         /* get initial value */
  214.         GetIText( dItem, eftext);
  215.         
  216.         if (item - numItems == PFIELD)
  217.             ParamText( "\pprinter", 0L, 0L, 0L);
  218.         else
  219.             ParamText( "\pmodem", 0L, 0L, 0L);
  220.         
  221.         modal = GetNewDialog( NODEFILL, 0L, -1L);
  222.         
  223.         /* no need to save port, as it is guaranteed to be CPDialog */
  224.         SetPort( modal);
  225.         
  226.         /* standard button highlight */
  227.         frameok( modal, OK);
  228.         
  229.         GetDItem( modal, ETFIELD, &dKind, &dItem, &dBox);
  230.         SetIText( dItem, eftext);
  231.         SelIText( modal, ETFIELD, 0, 32767);
  232.         
  233.         for (itemHit = 0; itemHit == 0;)    /* keep going until button hit */
  234.             ModalDialog( digits, &itemHit);
  235.         GetIText( dItem, eftext);
  236.         GetDItem( CPDialog, item, &dKind, &dItem, &dBox);
  237.         if (itemHit == OK) {
  238.             SetIText( dItem, eftext);
  239.             
  240.             StringToNum( eftext, &temp);
  241.             if (item - numItems == PFIELD)
  242.                 SysParam.aTalkB = storage->printerset = (Byte) temp & 0xff;
  243.             else
  244.                 SysParam.aTalkA = storage->modemset = (Byte) temp & 0xff;
  245.             WriteParam();
  246.         }
  247.         
  248.         DisposDialog( modal);
  249.         SetPort( CPDialog);
  250.         InvalRect( &dBox);
  251.         
  252.         HUnlock( cdevStorage);
  253.         break;
  254.     }
  255. }