minow@thundr.dec.com (Fortran for Precedent) (09/12/88)
/*
* This is taken from a demo program that Mike Kahl (who wrote Think C)
* passed out at a Boston Computer Society meeting. It is intended to
* be used as the filterProc argument to ModalDialog, and handles highlighting
* the OK button. I believe it can also be used for this function
* in the SF...file procedures. Usage:
* dialog = GetNewDialog(...);
* do {
* ModalDialog(standard_filter, &item);
* } while (item != OK && item != Cancel);
*
* Martin Minow
* minow%thundr.dec@decwrl.dec.com
*/
void ring_button(DialogPeek);
int flash_button(DialogPeek, int);
/*
* Dialog support routines
*
* Replacement for the default ModalDialog procedure. It does everything
* the default filter does, plus it draws a ring around the OK button.
*/
pascal Boolean
standard_filter(dp, event, item)
DialogPeek dp;
EventRecord *event;
int *item;
{
GrafPtr save_port;
Boolean result = TRUE;
int c;
GetPort(&save_port);
switch (event->what) { /* Handle standard events */
case updateEvt:
if ((DialogPeek) event->message == dp)
ring_button(dp);
break;
case keyDown:
c = (char) event->message;
if (c == '\r' || c == '\003') {
if ((*item = flash_button(dp, dp->aDefItem)) != FALSE)
goto done;
event->what = nullEvent;
}
break;
}
result = FALSE;
done: SetPort(save_port);
return (result);
}
/*
* Draw a ring around the OK (default) item.
* (Should it do a GetPort, too?)
*/
static void
ring_button(dp)
register DialogPeek dp;
{
int type;
ControlHandle button;
Rect box;
if (dp->aDefItem) {
GetDItem(dp, dp->aDefItem, &type, &button, &box);
if (type == ctrlItem + btnCtrl) {
SetPort(dp);
PenNormal();
PenSize(3, 3);
InsetRect(&box, -4, -4);
FrameRoundRect(&box, 16, 16);
PenNormal();
}
}
}
/*
* Pretend the button was clicked. Returns the item number,
* or zero if it was disabled.
*/
static int
flash_button(dp, item)
DialogPeek dp;
int item;
{
int type;
ControlHandle button;
Rect box;
long dummy;
if (item != 0) {
GetDItem(dp, item, &type, &button, &box);
if (type == ctrlItem + btnCtrl) {
if ((**button).contrlHilite)
item = 0;
else {
HiliteControl(button, inButton);
Delay(8, &dummy);
HiliteControl(button, 0);
}
}
}
return (item);
}