

|
Volume Number: | 12 | |
Issue Number: | 12 | |
Column Tag: | Tips & Tidbits |
Tips & Tidbits
by Steve Sisak
For a program I recently wrote, I wanted to do user input checking for a dialog box as they were typing into an EditText field. I wrote a routine to figure out what the contents of a specific EditText box will be if the current event is allowed to be processed. I then called the routine from my custom dialog event process, and analyzed the results. That way, I could easily decide if the user’s action would produce valid results, or if I needed to abort the current event.
IsDlgControl is a simple check for control characters we always want to process. DivineNewItemString is the routine that does all the work. PStrCopy is a little routine for copying Pascal strings - I’m sure that other people have better ways of doing this.
// some control key constants. #define kEnterKey3 #define kBackspace 8 #define kTab9 #define kReturnKey 13 #define kEscapeKey 27 #define kLeftKey 28 #define kRightKey29 #define kUpKey 30 #define kDownKey 31 #define kDelete 0xFF /* IsDlgControl * Returns true if c is a special control key (say an arrow key, or escape). * Otherwise returns false. */ Boolean IsDlgControl(char c) { if ((c >= kEscapeKey) && (c <= kDownKey)) return true; if ((c == kReturnKey) || (c == kEnterKey) || (c == kDelete) || (c == kBackspace) || (c == kTab)) return true; return false; } /* PStrCpy * A little routine to copy Pascal strings. Provided for those people who don’t * already use BlockMove() to do this for them ... */ void PStrCpy(Str255 s, const Str255 t) { short i; for (i=0; i<=s[0]; i++) { s[i]=t[i]; } /* DivineNewItemString * Given a DialogPtr, EventPtr and an item number for the active EditText DLOG * Item, it returns what the string will be if the current event is processed. * It should be called from a custom dialog event proc. */ void DivineNewItemString (DialogPtr d, EventRecord *e, short item, Str255 output) { short *TEScrpLength = (short *)0x0AB0; DialogRecord *dr; TEHandle teh; char c; Str255 input, text; short selStart, selEnd; short i; short outStrIdx=0; short iType; Handle iHandle; Rect iRect; // get the text string GetDItem(d,item,&iType,&iHandle,&iRect); GetIText(iHandle,text); // Set the input string c = (e->message & charCodeMask); if (IsDlgControl(c)) { // if it’s a control char, return the item’s text. PStrCpy(output,text); return; } else if (e->modifiers & cmdKey) { if ((c == ‘v’) || (c == ‘V’)) { // if pasting, get the pasted string. (void)TEFromScrap(); HLock(iHandle); iHandle = TEScrapHandle(); for (i=0; i< *TEScrpLength; i++) { input[i+1]=((unsigned char *)(*iHandle))[i]; } input[0]=*TEScrpLength; HUnlock(iHandle); } else { // if any other command stroke ä PStrCpy(output,text); return; } } else { // else, set the input string equal to the new character // else, set the input string equal to the new character input[0]=1; input[1]=(unsigned char) c; } // get the selection point from the TERec dr = (DialogRecord *)d; teh = dr->textH; selStart=(*teh)->selStart; selEnd=(*teh)->selEnd; // generate output string: copy the first bit of text for (i=1; i<=selStart; i++) { output[++outStrIdx]=text[i]; } // copy the input string for (i=1; i<=input[0]; i++) { output[++outStrIdx]=input[i]; } // copy the last part of text for (i=selEnd+1; i<=text[0]; i++) { output[++outStrIdx]=text[i]; } // lastly, set the length output[0] = outStrIdx; }
Michael Trent
mtrent@msn.fullfeed.com

- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine