home *** CD-ROM | disk | FTP | other *** search
- /* SetNode */
- /* File nhcdev.c (node hint cdev) */
- /* ⌐1988 Jim Hamilton
- this file may be published everywhere, but no charge
- may be made for its use */
-
- #include "cdev.h"
- #include <OSUtil.h>
-
- #define REVBUT 2
- #define PFIELD 3
- #define MFIELD 4
-
- #define NODEFILL -4048
- #define ETFIELD 3
-
- #define ENTERKEY 3
- #define RETURNKEY '\r'
-
- struct cstor {
- Byte modemsave;
- Byte printersave;
- Byte modemset;
- Byte printerset;
- };
-
- pascal Handle
- main( message, item, numItems, CPanelID, ep, cdevStorage, CPDialog)
- register int message;
- int item;
- int numItems;
- int CPanelID;
- EventRecord *ep;
- Handle cdevStorage;
- DialogPtr CPDialog;
- {
- if (cdevStorage < (Handle) 2L && cdevStorage > (Handle) -2L)
- /* -1, 0, or 1 means error */
- return cdevStorage;
-
- switch( message) {
- case initDev: /* initialize */
- cdevStorage = NewHandle( sizeof( struct cstor));
- if (cdevStorage == 0L) /* no memory available */
- return cdevStorage;
-
- initfields( cdevStorage, CPDialog, numItems); /* initialize edittext fields */
- break;
-
- case hitDev:
- doHit( item, numItems, CPDialog, cdevStorage); /* handle event */
- break;
-
- case closeDev:
- DisposHandle( cdevStorage);
- cdevStorage = (Handle) 0L;
-
- case nulDev:
- break; /* do nothing on null events */
-
- case updateDev:
- break;
-
- case ActivDev:
- case deActDev:
- case keyEvtDev:
- break; /* Dialog Manager handles activates, key-downs */
-
- case macDev: /* this message is sent if softMask = $0000 and
- hardMask = $FFFF to determine whether to
- appear in the Control Panel's window */
- return (Handle) 1; /* yes, though this area is never executed */
- break;
- }
- return( cdevStorage);
- }
-
- initfields( cdevStorage, CPDialog, numItems) /* initialize edittext fields */
- struct cstor **cdevStorage;
- register DialogPtr CPDialog;
- int numItems;
- {
- register struct cstor *storage;
- unsigned char eftext[ 32];
- int dKind;
- Handle dItem;
- Rect dBox;
-
- /* lock and dereference handle */
- HLock( cdevStorage);
- storage = *cdevStorage;
-
- /* get node hints from PRAM copy */
- storage->modemsave = SysParam.aTalkA;
- storage->printersave = SysParam.aTalkB;
-
- /* set printer hint field */
- NumToString( (long) storage->printersave, eftext);
-
- GetDItem( CPDialog, PFIELD + numItems, &dKind, &dItem, &dBox);
- SetIText( dItem, eftext);
-
- /* set modem hint field */
- NumToString( (long) storage->modemsave, eftext);
-
- GetDItem( CPDialog, MFIELD + numItems, &dKind, &dItem, &dBox);
- SetIText( dItem, eftext);
-
- /* unlock handle */
- HUnlock( cdevStorage);
- }
-
- /* filterProc to accept digits only in modal dialog */
- pascal Boolean digits( dptr, evt, item)
- DialogPtr dptr;
- EventRecord *evt;
- int *item;
- {
- register char charcode;
-
- if (evt->what == keyDown) {
- charcode = (char) evt->message;
- if (charcode == RETURNKEY || charcode == ENTERKEY) {
- *item = OK;
- return( true);
- }
- if (charcode == '\t' || charcode == '\b')
- return( false);
- if (charcode >= 0x1c && charcode <= 0x1f) /* arrow keys */
- return( false);
- if (charcode >= '0' && charcode <= '9')
- return( false);
- else {
- *item = 0;
- return( true);
- }
- }
-
- return( false);
- }
-
- /* frameok draws the standard "default" frame around a button in dlg
- it assumes that the item is a button and that the current
- GrafPort is pointed by dlg (N.B.: there is no error checking)
- */
- frameok( dlg, itm)
- DialogPtr dlg;
- int itm;
- {
- int kind; Handle item; Rect box;
-
- GetDItem( dlg, itm, &kind, &item, &box);
- InsetRect( &box, -4, -4);
- PenSize( 3, 3);
- FrameRoundRect( &box, 16, 16);
- PenNormal();
- }
-
- doHit( item, numItems, CPDialog, cdevStorage)
- int item, numItems;
- DialogPtr CPDialog;
- struct cstor **cdevStorage;
- {
- register struct cstor *storage;
- unsigned char eftext[ 32];
- long temp;
- int dKind;
- Handle dItem;
- Rect dBox;
- DialogPtr modal;
- int itemHit;
- pascal Boolean digits();
-
- switch( item - numItems) {
- case REVBUT: /* revert to value at initDev */
- /* lock and dereference handle */
- HLock( cdevStorage);
- storage = *cdevStorage;
-
- /* set node hints in PRAM */
- SysParam.aTalkA = storage->modemset = storage->modemsave;
- SysParam.aTalkB = storage->printerset = storage->printersave;
- WriteParam();
-
- /* set printer hint field */
- NumToString( (long) storage->printersave, eftext);
-
- GetDItem( CPDialog, PFIELD + numItems, &dKind, &dItem, &dBox);
- SetIText( dItem, eftext);
- InvalRect( &dBox);
-
- /* set modem hint field */
- NumToString( (long) storage->modemsave, eftext);
-
- GetDItem( CPDialog, MFIELD + numItems, &dKind, &dItem, &dBox);
- SetIText( dItem, eftext);
- InvalRect( &dBox);
-
- /* unlock handle */
- HUnlock( cdevStorage);
-
- break;
-
- case PFIELD:
- case MFIELD:
- /* lock and dereference handle */
- HLock( cdevStorage);
- storage = *cdevStorage;
-
- GetDItem( CPDialog, item, &dKind, &dItem, &dBox);
- InvertRect( &dBox);
-
- /* get initial value */
- GetIText( dItem, eftext);
-
- if (item - numItems == PFIELD)
- ParamText( "\pprinter", 0L, 0L, 0L);
- else
- ParamText( "\pmodem", 0L, 0L, 0L);
-
- modal = GetNewDialog( NODEFILL, 0L, -1L);
-
- /* no need to save port, as it is guaranteed to be CPDialog */
- SetPort( modal);
-
- /* standard button highlight */
- frameok( modal, OK);
-
- GetDItem( modal, ETFIELD, &dKind, &dItem, &dBox);
- SetIText( dItem, eftext);
- SelIText( modal, ETFIELD, 0, 32767);
-
- for (itemHit = 0; itemHit == 0;) /* keep going until button hit */
- ModalDialog( digits, &itemHit);
- GetIText( dItem, eftext);
- GetDItem( CPDialog, item, &dKind, &dItem, &dBox);
- if (itemHit == OK) {
- SetIText( dItem, eftext);
-
- StringToNum( eftext, &temp);
- if (item - numItems == PFIELD)
- SysParam.aTalkB = storage->printerset = (Byte) temp & 0xff;
- else
- SysParam.aTalkA = storage->modemset = (Byte) temp & 0xff;
- WriteParam();
- }
-
- DisposDialog( modal);
- SetPort( CPDialog);
- InvalRect( &dBox);
-
- HUnlock( cdevStorage);
- break;
- }
- }