Dec 96 Tips
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 users 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 - Im 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 dont
* 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 its a control char, return the items 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