home *** CD-ROM | disk | FTP | other *** search
- /*
- * pref.c - routines to handle preferences dialog
- */
-
- #include "RevRdist.h"
- #include <TransSkelProto.h>
-
- static Boolean cancelled;
- static Boolean prefAltered = 0;
-
- static Integer curItem = 0; /* current editText field */
-
- /*
- * Special keycodes
- */
- #define ENTER 0x03
- #define BACKSPACE 0x08
- #define TAB 0x09
- #define RETURN 0x0d
- #define CLEAR 0x1b
-
- /*
- * prefinfo - mapping among preference resource id's, Prefs[].p[] indexes,
- * and preferences dialog item numbers.
- * Note that not all values apply to all entries.
- */
- static struct prefinfo
- {
- Integer p_id; /* Resource ID of preference */
- Integer p_in; /* Item number in dialog */
- StringPtr p_nm; /* Name of resource */
- } pi[] = {
- { STR_ZONE, PRF_ZONE, 0 } /* PS_ZONE */
- ,{ STR_SRVR, PRF_SRVR, 0 } /* PS_SRVR */
- ,{ STR_USER, PRF_USER, 0 } /* PS_USER */
- ,{ STR_PASS, PRF_PASS, 0 } /* PS_PASS */
- ,{ STR_DISTF, PRF_DISTF, 0 } /* PS_DISTF */
- ,{ STR_MASTF, PRF_MASTF, 0 } /* PS_MASTF */
- ,{ STR_JUNKF, PRF_JUNKF, 0 } /* PS_JUNKF */
- ,{ JUNK_PARM, 0, 0 } /* PS_MAX & Junking info */
- ,{ TIME_INTERVAL, PRF_INTERVAL, 0 } /* PS_TIME */
- ,{ 0, PRF_JMIN, 0 } /* split-out parts of junk info */
- ,{ 0, PRF_JMAX, 0 }
- ,{ 0, PRF_DMIN, 0 }
- };
-
- #define PICOUNT (sizeof pi / sizeof (struct prefinfo))
-
- /*
- * Options to setPref()
- */
- enum sp_action
- {
- SP_WORKTODIALOG /* copy P_WORK to dialog */
- ,SP_DIALOGTOWORK /* copy dialog values to P_WORK */
- ,SP_CHECKONLY /* check if dialog and P_WORK differ */
- };
-
- static void prefEvent (Integer, EventRecord *);
- static void prefClose (void);
- static void prefClobber (void);
- static void prefDoActivate (Integer);
- static OSErr prefOpen (void);
- static void prefSetLong (Integer, Longint);
- static void prefSetText (Integer, StringHandle);
- static pascal Boolean prefSFGfilter (ParmBlkPtr);
- static OSErr prefWrite (void);
- static void edittext (Integer, Integer, Integer);
- static void setPref (enum sp_action);
-
-
-
- /*
- *=========================================================================
- * doPref () - start up preferences dialog
- * exit: PrefDialog set
- *=========================================================================
- */
- void
- doPref ()
- {
-
- cancelled = false;
- if (Flags & DB_LOCKED)
- return;
- if (PrefDialog)
- {
- SelectWindow ((WindowPtr) PrefDialog);
- }
- else
- {
- PrefDialog =
- GetNewDialog (RSRC_BASE+WIND_PREF, nil, (WindowPtr) -1L);
- if (PrefDialog == nil)
- return;
- SkelDialog (PrefDialog, prefEvent, prefClose, prefClobber);
- setPref (SP_WORKTODIALOG);
- }
- ShowWindow ((WindowPtr) PrefDialog);
- }
-
-
-
- /*
- *=========================================================================
- * prefClobber () - get rid of the preferences dialog resources
- *=========================================================================
- */
- void
- prefClobber ()
- {
- if (PrefDialog)
- DisposDialog (PrefDialog);
- PrefDialog = nil;
- }
-
-
- /*
- *=========================================================================
- * prefClose () - exit the preferences dialog
- * entry: cancelled true if dialog closed via cancel button
- * exit: preferences (possibly) set based on final values in dialog
- *=========================================================================
- */
- void
- prefClose ()
- {
-
- if (! cancelled)
- {
- setPref (SP_DIALOGTOWORK);
- prefDoFMenu (FILE_CLOSE);
- if (cancelled)
- return;
- }
- prefDoActivate (0);
- cancelled = false;
- SkelRmveDlog (PrefDialog);
- }
-
-
- /*
- *=========================================================================
- * prefDoActivate (flag) - handle activate/deactivate events
- * entry: flag <> 0 if activate, 0 for deactivate
- *=========================================================================
- */
- static
- void
- prefDoActivate (flag)
- Integer flag;
- {
- MenuHandle m; /* handle for File menu */
-
- if (Flags & DB_LOCKED)
- flag = 0;
- m = GetMHandle (2); /* enable/disable file-related items */
- if (m)
- {
- if (flag)
- {
- EnableItem (m, FILE_OPEN);
- EnableItem (m, FILE_SAVE);
- EnableItem (m, FILE_SAVEAS);
- }
- else
- {
- DisableItem (m, FILE_OPEN);
- DisableItem (m, FILE_SAVE);
- DisableItem (m, FILE_SAVEAS);
- }
- }
- m = GetMHandle (3);
- if (m)
- {
- if (flag) /* enable/disable Edit menu */
- EnableItem (m, 0);
- else
- DisableItem (m, 0);
- DrawMenuBar ();
- }
- }
-
-
- /*
- *=========================================================================
- * prefDoFMenu (itemNo) - handle File menu for preferences
- * entry: item = selected item number
- *=========================================================================
- */
-
- void
- prefDoFMenu (itemNo)
- Integer itemNo;
- {
- cnode_t * cn; /* ptr to fi->f_info */
- OSErr error;
- file_info_t * fi; /* ptr to prefs file info */
- Integer i; /* temp */
- prefs_t * pw; /* ptr to working prefs */
- prefs_t * pf; /* ptr to file prefs */
- Integer ref; /* refNum for prefs file */
- Boolean savemod; /* initial value of p_modified */
- StringHandle sh; /* handle to prompt, etc */
- Boolean wasset; /* previous value of f_set */
- Point where; /* for SF package */
- CInfoPBRec cb;
- SFReply reply;
- Str255 s; /* string temp */
- SFTypeList sftypes;
-
- if (!PrefDialog)
- return;
- fi = &File_list[FL_PREF];
- cn = &fi->f_info;
- pw = &Prefs[P_WORK];
- pf = &Prefs[P_FILE];
- wasset = fi->f_set;
- cancelled = false;
- Clue0 = (SP)"\pdoPrefMenu";
- where.h = 100; where.v = 100;
-
- switch (itemNo)
- {
- case FILE_SAVEAS:
- fi = &File_list[FL_TEMP];
- cn = &fi->f_info;
- freeInfo (fi);
- GetWTitle (PrefDialog, s);
- if (s[0] < sizeof (cn->name))
- COPYPS (s, cn->name);
- pw->p_modified = true;
-
- /* fall into */
- case FILE_SAVE:
- if (! wasset)
- pw->p_modified = true; /* force writing */
- setPref (SP_DIALOGTOWORK); /* copy values from dialog to work */
- prefMerge (P_FILE, false); /* copy from work to file */
- if (pw->p_modified)
- {
- /*
- * Even if we think we know about a file, check that it
- * is still there, since the user might delete it while
- * we aren't looking
- */
- if (fi->f_set)
- {
- error = getInfo (cn->name, fi->f_vol, cn->parID, cn);
- if (error ||
- (cn->in.f.finfo.fdCreator != CREATOR &&
- cn->in.f.finfo.fdType != TYPE_CONT))
- {
- fi->f_set = 0;
- fi->f_vol = 0;
- }
- }
- if (!fi->f_set && cn->name[0] == 0)
- {
- sh = (StringHandle) GetResource ('STR ', STR_PREFS);
- if (**sh < sizeof (cn->name))
- COPYPS (*sh, cn->name);
- ReleaseResource ((Handle) sh);
- }
- while (!fi->f_set)
- {
- /*
- * Keep trying to save until succeed or user cancels
- */
- sh = (StringHandle) GetResource ('STR ', STR_PSAVE);
- HLock ((Handle) sh);
- SFPutFile (where, *sh, cn->name, (ProcPtr) 0,
- &reply);
- HUnlock ((Handle) sh);
- ReleaseResource ((Handle) sh);
- if (reply.good == false)
- {
- cancelled = true;
- break;
- }
- SetVol (nil, reply.vRefNum);
- CreateResFile (reply.fName);
- error = ResError ();
- if (error)
- {
- if (error != dupFNErr)
- {
- syserr:
- ClueID = error;
- panic (false, E_FILE, reply.fName, nil);
- if (Quit)
- {
- Quit = false;
- break;
- }
- continue;
- }
- fi->f_vol = reply.vRefNum;
- error = getInfoByPath (reply.fName, fi);
- if (error)
- goto syserr;
- if (cn->in.f.finfo.fdCreator != CREATOR &&
- cn->in.f.finfo.fdType != TYPE_CONT)
- {
- panic (true, E_TYPE, reply.fName, nil);
- Quit = false;
- continue;
- }
- }
- else
- {
- /*
- * If we created it, we need to set its finder info
- */
- ZERO (cb);
- cb.hFileInfo.ioNamePtr = reply.fName;
- cb.hFileInfo.ioVRefNum = reply.vRefNum;
- if (error = PBGetCatInfo (&cb, false))
- goto syserr;
- cb.hFileInfo.ioDirID = 0;
- cb.hFileInfo.ioFlFndrInfo.fdType = TYPE_PREF;
- cb.hFileInfo.ioFlFndrInfo.fdCreator = CREATOR;
- if (error = PBSetCatInfo (&cb, false))
- goto syserr;
- fi->f_vol = reply.vRefNum;
- if (error = getInfoByPath (reply.fName, fi))
- goto syserr;
- }
- } /* end while */
- if (!fi->f_set)
- break;
- /*
- * Finally, open the file
- */
- sh = fi->f_path;
- HLock ((Handle) sh);
- ref = OpenRFPerm(*sh, fi->f_vol, fsRdWrPerm);
- HUnlock ((Handle) sh);
- if (ref == -1)
- {
- ClueID = ResError ();
- panic (true, E_FILE, cn->name, nil);
- pw->p_modified = true;
- Quit = false;
- cancelled = true;
- break;
- }
- fi->f_ref = ref;
- error = prefWrite ();
- CloseResFile (ref);
- fi->f_ref = 0;
- if (error)
- {
- ClueID = error;
- panic (true, E_SYS, (SP)"\pprefWrite", nil);
- Quit = false;
- pw->p_modified = true;
- pf->p_modified = true;
- cancelled = true;
- break;
- }
- pw->p_modified = false;
- if (fi == &File_list[FL_TEMP])
- {
- /*
- * If we used FL_TEMP, copy to FL_PREF and zap FL_TEMP
- */
- freeInfo (&File_list[FL_PREF]);
- File_list[FL_PREF] = *fi;
- ZEROAT (fi);
- fi = &File_list[FL_PREF];
- cn = &fi->f_info;
- }
- SetWTitle (PrefDialog, cn->name);
- } /* end if modified */
- break;
-
- case FILE_OPEN:
- case FILE_CLOSE:
- /*
- * Check if we should save changes before closing
- */
- savemod = pw->p_modified;
- if (pw->p_modified || (setPref (SP_CHECKONLY), pw->p_modified))
- {
- pw->p_modified = savemod;
- GetWTitle (PrefDialog, s);
- ParamText (s, nil, nil, nil);
- i = CautionAlert (RSRC_BASE+ALERT_SAVE, nil);
- if (i == SAVE_CANCEL)
- {
- cancelled = true;
- break;
- }
- if (i == SAVE_YES)
- {
- prefDoFMenu (FILE_SAVE);
- if (cancelled)
- break;
- }
- }
- pw->p_modified = false;
- pf->p_modified = false;
- if (fi->f_set && fi->f_ref)
- CloseResFile (fi->f_ref);
- fi->f_ref = 0;
- fi->f_set = false;
- if (itemNo != FILE_OPEN)
- break;
-
- /*
- * Continue with opening file
- */
- sftypes[0] = TYPE_PREF;
- sftypes[1] = TYPE_CONT;
- sftypes[2] = 'APPL';
- SFGetFile (where, (SP)"", (FilterProc)prefSFGfilter, 3, &sftypes,
- (ProcPtr)nil, &reply);
- if (reply.good == false)
- break;
- fi->f_vol = reply.vRefNum;
- error = getInfoByPath (reply.fName, fi);
- if (!error)
- error = prefFFetch (fi);
- if (!error)
- {
- prefMerge (P_WORK, false);
- setPref (SP_WORKTODIALOG);
- }
- if (error)
- {
- ClueID = error;
- panic (false, E_FILE, reply.fName, nil);
- Quit = false;
- fi->f_set = false;
- }
- break;
- } /* end itemNo switch */
- if (cancelled)
- Quit = false;
- }
-
-
- /*
- *=========================================================================
- * prefEvent (itemNo, theEvent) - handle events in preferences dialog
- * entry: itemNo = the item number in dialog
- * theEvent = ptr to event record significant to dialog
- *=========================================================================
- */
- void
- prefEvent (itemNo, theEvent)
- Integer itemNo;
- EventRecord * theEvent;
- {
- Integer key; /* key character or code */
-
- switch (theEvent->what)
- {
- case mouseDown:
- /*
- * If we have an active editText item, close it out first
- */
- if (curItem)
- edittext (curItem, 0, 0);
- curItem = 0;
- switch (itemNo)
- {
- case PRF_CANCEL:
- cancelled = true;
- prefClose ();
- break;
- case PRF_GO:
- Pending = PA_GO;
- setPref (SP_DIALOGTOWORK);
- HideWindow (PrefDialog);
- break;
- }
- break;
-
- case keyDown:
- key = theEvent->message & 0xff;
- if (key == '\t')
- {
- /*
- * On tab, the supplied item is the *next* item, rather than
- * the one just left
- */
- itemNo -= 2;
- if (itemNo <= 2)
- itemNo = PRF_LAST;
- }
- edittext (itemNo, key, theEvent->modifiers);
- break;
-
- case activateEvt:
- prefDoActivate (theEvent->modifiers & activeFlag);
- break;
- }
- }
-
-
-
- /*
- *=========================================================================
- * prefFetch (ref) - fetch preferences from resource file
- * entry: ref = fRefNum of opened resource file
- * returns: 0 if no problems
- * <> 0 = system error
- * Note: a missing resource does not count as a problem
- *=========================================================================
- */
-
- OSErr
- prefFetch (res)
- Integer res;
- {
- OSErr error = 0;
- Handle h;
- int i; /* Prefs[].p[] index */
- Integer id; /* for GetResInfo */
- Ptr p; /* temp pointer */
- Integer saveres; /* current resource file */
- register StringHandle sh;
- ResType type; /* for GetResInfo */
- Str255 s; /* resource name from GetResInfo */
-
- saveres = CurResFile ();
- if (saveres != res)
- {
- UseResFile (res);
- error = ResError ();
- if (error)
- {
- saveres = res;
- goto errout;
- }
- }
- /*
- * Free any FILE handles which differ from the WORK ones
- */
- for (i = 0; i < PS_MAX; i++)
- {
- if ((sh = Prefs[P_FILE].p[i]) != 0 && sh != Prefs[P_WORK].p[i])
- DisposHandle ((Handle) sh);
- }
- setmem ((char *)&Prefs[P_FILE], sizeof (prefs_t), 0);
-
- /*
- * Fetch new values from resource file. It is not an error for the
- * resource to not exist.
- * Also, save the name of a resource the first time we encounter one.
- */
- for (i = 0; i <= PS_MAX + 1; i++)
- {
- sh = (StringHandle) Get1Resource ((i < PS_MAX) ? 'STR ' : TYPE_LONG,
- pi[i].p_id);
- if (sh)
- {
- if (pi[i].p_nm == 0)
- {
- GetResInfo ((Handle)sh, &id, &type, (SP)s);
- if (type == 'STR ' && s[0])
- {
- p = NewPtr ((Size) s[0] + 1);
- if (p)
- COPYPS (s, p);
- pi[i].p_nm = (StringPtr) p;
- }
- }
- }
- else
- if ((error = ResError ()) != resNotFound && error != 0)
- goto errout;
- if (i < PS_MAX)
- {
- Prefs[P_FILE].p[i] = sh;
- if (sh)
- DetachResource ((Handle) sh);
- }
- else
- {
- if (sh)
- {
- switch (i)
- {
- case PS_MAX:
- BlockMove (*sh, (Ptr)&Prefs[P_FILE].p_jparam,
- sizeof (junkp_t));
- break;
- case PS_TIME:
- BlockMove (*sh, (Ptr)&Prefs[P_FILE].p_interval,
- sizeof (Prefs[P_FILE].p_interval));
- break;
- }
- ReleaseResource ((Handle) sh);
- }
- }
- }
-
- error = 0;
- Prefs[P_FILE].p_modified = false;
- if (res != saveres)
- {
- UseResFile (saveres);
- error = ResError ();
- }
- return error;
-
- errout:
- if (error == 0)
- error = ResError ();
- if (error == 0)
- error = memFullErr;
- if (res != saveres)
- UseResFile (saveres);
- return error;
- }
-
-
- /*
- *=========================================================================
- * prefFFetch (fi) - open preferences file and then fetch values
- * entry: fi = ptr to file_info structure describing file to open
- * exit: 0 if no error, preferences fetched, file closed
- * OSErr on error
- *=========================================================================
- */
- OSErr
- prefFFetch (fi)
- register file_info_t * fi;
- {
- OSErr error;
- Integer firef; /* value from fi->f_ref */
- Integer ref; /* file reference */
-
- ref = firef = fi->f_ref;
- if (ref == 0)
- {
- HLock ((Handle) fi->f_path);
- ref = OpenRFPerm (*fi->f_path, fi->f_vol, fsRdPerm);
- HUnlock ((Handle) fi->f_path);
- if (ref == -1)
- {
- error = ResError ();
- if (error == 0)
- error = fnfErr;
- return error;
- }
- fi->f_ref = ref;
- }
- error = prefFetch (ref);
- if (firef == 0) /* if we opened file, close it */
- {
- (void) CloseResFile (ref);
- fi->f_ref = 0;
- }
- return (error);
- }
-
-
-
-
- /*
- *=========================================================================
- * prefMerge (dest, merge) - copy preferences between Prefs[] elements
- * entry: dest = which element is the destination [P_WORK, P_FILE]
- * merge = false to copy in toto, true to copy only if not null
- *=========================================================================
- */
- void
- prefMerge (dest, merge)
- pindex_t dest;
- Boolean merge;
- {
- int i;
- StringHandle sh;
- pindex_t src;
-
- src = (dest == P_WORK) ? P_FILE : P_WORK;
- Prefs[dest].p_modified = true;
- if (!merge)
- {
- /*
- * Here to copy/replace
- */
- for (i = 0; i < PS_MAX; i++)
- {
- if ((sh = Prefs[dest].p[i]) != 0 && sh != Prefs[src].p[i])
- DisposHandle ((Handle) sh);
- }
- Prefs[dest] = Prefs[src];
- return;
- }
- /*
- * Here to merge
- */
- for (i = 0; i < PS_MAX; i++)
- {
- if (Prefs[src].p[i] != 0)
- {
- if ((sh = Prefs[dest].p[i]) != 0 && sh != Prefs[src].p[i])
- DisposHandle ((Handle) sh);
- Prefs[dest].p[i] = Prefs[src].p[i];
- }
- }
- if (Prefs[src].p_interval != 0)
- Prefs[dest].p_interval = Prefs[src].p_interval;
- if (Prefs[src].p_jparam.min != 0)
- Prefs[dest].p_jparam.min = Prefs[src].p_jparam.min;
- if (Prefs[src].p_jparam.max != 0)
- Prefs[dest].p_jparam.max = Prefs[src].p_jparam.max;
- if (Prefs[src].p_jparam.space != 0)
- Prefs[dest].p_jparam.space = Prefs[src].p_jparam.space;
- }
-
-
-
- /*
- *=========================================================================
- * prefSetLong(itemNo, value) - set pref dialog item value from long integer
- * entry: itemNo = dialog item number
- * value = new value
- *=========================================================================
- */
- void
- prefSetLong (itemNo, value)
- Integer itemNo;
- Longint value;
- {
- Handle item;
- Integer itemType;
- Rect r;
- Str255 st;
-
- itemType = -1;
- GetDItem (PrefDialog, itemNo, &itemType, &item, &r);
- if (itemType == editText)
- {
- NumToString (value, (SP) st);
- SetIText (item, (SP) st);
- }
- }
-
-
-
- /*
- *=========================================================================
- * prefSetText (itemNo, sh) - set pref dialog value from handle
- * entry: itemNo = item number to change
- * sh = handle to string containing new value
- *=========================================================================
- */
- void
- prefSetText (itemNo, sh)
- Integer itemNo;
- StringHandle sh;
- {
- Handle item;
- Integer itemType;
- Rect r;
- SignedByte handleState;
-
- itemType = -1;
- GetDItem (PrefDialog, itemNo, &itemType, &item, &r);
-
- if (sh && *sh && itemType == editText)
- {
- handleState = HGetState ((Handle) sh);
- HLock ((Handle) sh);
- SetIText (item, *sh);
- HSetState ((Handle) sh, handleState);
- }
- }
-
-
- /*
- *=========================================================================
- * prefSFGfilter (pb) - filter for SFGetFile call to open existing prefs file
- * entry: pb = pointer to paramBlock with info about potential file
- *=========================================================================
- */
- pascal
- Boolean
- prefSFGfilter (pb)
- ParmBlkPtr pb;
- {
- /*
- * File must have resource fork
- */
- if (pb->fileParam.ioFlRLgLen == 0)
- return true;
- /*
- * If it is application, it must be copy of RevRdist
- */
- if (pb->fileParam.ioFlFndrInfo.fdType == 'APPL'
- && pb->fileParam.ioFlFndrInfo.fdCreator != CREATOR)
- return true;
- return false;
- }
-
-
-
-
- /*
- *=========================================================================
- * prefWrite () - Write FILE preferences to file
- * entry: CurResFile() is the file to write the resources to
- * returns: 0 if no error, else OSErr
- *=========================================================================
- */
- OSErr
- prefWrite ()
- {
- OSErr error;
- int i;
- Integer id; /* resource id */
- Handle h1, h2;
- Size len; /* needed resource size */
- prefs_t * p; /* ptr to Prefs[P_FILE] */
- Ptr vp; /* temp pointer */
-
- error = 0;
- p = &Prefs[P_FILE];
- /*
- * First, write the string resources
- */
- for (i = 0; i < PS_MAX; i++)
- {
- h1 = (Handle) p->p[i];
- if (h1 == 0)
- continue;
- id = pi[i].p_id;
- h2 = Get1Resource ('STR ', id);
- if (h2 == 0)
- {
- h2 = h1;
- error = HandToHand (&h2);
- if (error) goto syserr;
- AddResource (h2, 'STR ', id, pi[i].p_nm);
- if (error = ResError ()) goto syserr;
- }
- else
- {
- len = **h1 + 1;
- SetHandleSize (h2, len);
- if (error = MemError ())
- goto syserr;
- COPYPS ((SP)(*h1), (SP)(*h2));
- ChangedResource (h2);
- }
- }
- /*
- * Ditto for the junking parameters
- */
- error = 0;
- for (i = PS_MAX; i <= PS_TIME; i++)
- {
- id = pi[i].p_id;
- switch (id)
- {
- case JUNK_PARM:
- len = sizeof (junkp_t);
- vp = (Ptr)&p->p_jparam;
- break;
- case TIME_INTERVAL:
- len = sizeof (p->p_interval);
- vp = (Ptr)&p->p_interval;
- break;
- default:
- continue;
- }
- h2 = Get1Resource (TYPE_LONG, id);
- if (h2 == 0)
- {
- h2 = NewHandle (len);
- if (h2 == 0)
- goto syserr;
- AddResource (h2, TYPE_LONG, id, pi[i].p_nm);
- if (error = ResError ()) goto syserr;
- }
- else
- {
- SetHandleSize (h2, len);
- }
- BlockMove (vp, *h2, len);
- ChangedResource (h2);
- error = ResError ();
- if (error)
- goto syserr;
- }
- Prefs[P_FILE].p_modified = false;
- return error;
-
- syserr:
- if (error == 0)
- error = memFullErr;
- return error;
- }
-
-
- /*
- *=========================================================================
- * edittext (itemNo, key, modifiers) - handle keyDown in dialog item
- * entry: itemNo = affected item number
- * key = character code
- * modifiers = modifiers from eventRecord
- *=========================================================================
- */
- static
- void
- edittext (itemNo, key, modifiers)
- Integer itemNo;
- Integer key;
- Integer modifiers;
- {
- Boolean changed; /* item string altered ? */
- int i; /* temp */
- Integer itemType; /* dialog item type */
- Handle item; /* dialog item structure */
- Longint l; /* long temp */
- Rect r; /* needed for GetDItem */
- Integer t; /* temp */
- Str255 st; /* string temp */
-
- /*
- * See if it's an item we care about
- */
- for (i = 0; i < PICOUNT; i++)
- if (pi[i].p_in == itemNo)
- break;
- if (i >= PICOUNT)
- {
- curItem = 0;
- return; /* don't care */
- }
- if (key == BACKSPACE && modifiers & shiftKey)
- key = CLEAR;
- GetDItem (PrefDialog, itemNo, &itemType, &item, &r);
- GetIText (item, (SP) st);
- changed = false;
- /*
- * On CLEAR key, restore original value
- */
- if (key == CLEAR)
- {
- prefs_t * p;
-
- p = &Prefs[P_WORK];
- if (i < PS_MAX)
- COPYPS (*p->p[i], st);
- else
- {
- switch (itemNo)
- {
- case PRF_INTERVAL: l = p->p_interval; break;
- case PRF_JMIN: l = p->p_jparam.min; break;
- case PRF_JMAX: l = p->p_jparam.max; break;
- case PRF_DMIN: l = p->p_jparam.space; break;
- default:
- goto skip;
- }
- NumToString (l, st);
- }
- skip:
- changed = true;
- }
- /*
- * Handle finishing with an item
- */
- if (key == ENTER || key == TAB || key == RETURN || key == 0)
- {
- if (key && st[st[0]] == key)
- {
- st[0]--;
- changed = true;
- }
- if (i >= PS_MAX)
- {
- StringToNum ((SP) st, &l);
- NumToString (l, (SP) st);
- changed = true;
- }
- }
- if (changed)
- SetIText (item, st);
- if (key == ENTER || key == RETURN)
- {
- itemNo += 2;
- if (itemNo > PRF_LAST)
- itemNo = PRF_SRVR;
- SelIText (PrefDialog, itemNo, 0, 32767);
- }
- if (key == CLEAR)
- {
- t = st[0];
- SelIText (PrefDialog, itemNo, t, t);
- }
- curItem = itemNo;
- }
-
-
-
- /*
- *=========================================================================
- * setPref (flag) - set preference variables to/from dialog contents
- * entry: flag = SP_WORKTODIALOG -> copy values from P_WORK to dialog
- * SP_DIALOGTOWORK -> copy the other way
- * SP_CHECKONLY -> same as SP_DIALOGTOWORK, except that
- * no values are changed, but p_modified is set if
- * any would have been changed.
- * PrefDialog set
- * exit: Prefs[P_WORK].p_modified possibly set
- *=========================================================================
- */
- void
- setPref (action)
- enum sp_action action;
- {
- file_info_t * fi;
- int i, j; /* temp index */
- Handle item; /* for GetDItem */
- Integer itemType; /* for GetDItem */
- Boolean modified; /* set true if dialog value changed */
- prefs_t * p;
- Rect r; /* for GetDItem */
- StringHandle sh;
- Longint value; /* temp value for junking params */
- unsigned long * vp; /* pointer to a value */
- junkp_t jparam; /* copy of junking params */
- Str255 s; /* string temp */
-
- fi = &File_list[FL_PREF];
- p = &Prefs[P_WORK];
- jparam = p->p_jparam;
- modified = false;
- if (action == SP_WORKTODIALOG)
- {
- for (i = 0; i < PICOUNT; i++)
- {
- if (i < PS_MAX)
- {
- sh = p->p[i];
- if (sh)
- prefSetText (pi[i].p_in, sh);
- }
- else
- {
- switch (pi[i].p_in)
- {
- case PRF_INTERVAL:value = p->p_interval; break;
- case PRF_JMIN: value = jparam.min; break;
- case PRF_JMAX: value = jparam.max; break;
- case PRF_DMIN: value = jparam.space; break;
- default:
- continue;
- }
- prefSetLong (pi[i].p_in, value);
- }
- }
- /*
- * Set prefs window title to file name
- */
- if (fi->f_set)
- COPYPS (fi->f_info.name, s);
- else
- COPYPS (*Untitled, s);
- SetWTitle (PrefDialog, s);
- return;
- }
- /*
- * Here for DIALOGTOWORK and CHECKONLY
- */
- for (i = 0; i < PICOUNT; i++)
- {
- j = pi[i].p_in;
- if (j)
- {
- itemType = -1;
- GetDItem (PrefDialog, pi[i].p_in, &itemType, &item, &r);
- if (itemType != editText)
- continue; /* should not happen */
- GetIText (item, s);
- }
- if (i < PS_MAX)
- {
- /*
- * Handle simple strings
- */
- sh = p->p[i];
- if (s[0] == 0)
- {
- if (sh == 0 || **sh == 0)
- continue;
- }
- if (sh)
- {
- HLock ((Handle) sh);
- j = RelString (*sh, s, false, true);
- HUnlock ((Handle) sh);
- }
- else
- {
- sh = (StringHandle) NewHandle ((Size) s[0] + 1);
- if (sh == 0)
- continue;
- p->p[i] = sh;
- j = 1;
- }
- if (j)
- {
- if (action == SP_DIALOGTOWORK)
- {
- SetHandleSize ((Handle) sh, (Size) s[0] + 1);
- if (MemError ())
- continue;
- COPYPS (s, *sh);
- }
- modified = true;
- }
- }
- else
- {
- StringToNum (s, &value);
- switch (j)
- {
- case PRF_INTERVAL:vp = &p->p_interval; break;
- case PRF_JMIN: vp = &jparam.min; break;
- case PRF_JMAX: vp = &jparam.max; break;
- case PRF_DMIN: vp = &jparam.space; break;
- default:
- continue;
- }
- if ((unsigned long) value != *vp)
- {
- if (action == SP_DIALOGTOWORK)
- *vp = value;
- modified = true;
- }
- }
- }
- if (action == SP_DIALOGTOWORK)
- p->p_jparam = jparam;
- if (modified)
- p->p_modified = true;
- }