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