home *** CD-ROM | disk | FTP | other *** search
- /* hAWK_prompt.c : prompt user for a string */
- /* Copyright © 1986, 1988, 1989 1991 the Free Software Foundation, Inc.
- * This file is part of GAWK, the GNU implementation of the
- * AWK Progamming Language, modified for the Macintosh (also called hAWK).
- * GAWK is free software; you can redistribute or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 1, or any later version.
- * GAWK is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with GAWK; see the file "COPYING hAWK". If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- * Written for THINK C 4 on the Macintosh by Ken Earle (Dynabyte) Aug 1991.
- * Revision July 92, prompt and progress disabled if running concurrently
- * with calling application.
- */
- #include "AWK.H"
-
- #define PROMPTID 408
- #define ASK 3
- #define ANSWER 4
-
- static DialogPtr progressPtr;
- #define PROGRESSID 409
-
- static void get_one_string(NODE *tree, NODE **res);
- NODE *do_prompt(NODE *tree);
- char *Prompt(char *ask, short askLen);
- static pascal Boolean
- PromptFilter(DialogPtr theDlog, EventRecord *theEvent, short *itemHit);
- NODE *do_progress(NODE *tree);
- short Progress(char *msg, short msgLen);
- void UpdateProgress(void);
- void DisposeProgress(void);
-
- static void get_one_string(NODE *tree, NODE **res)
- {
- if (!tree)
- {
- *res = WHOLELINE;
- return;
- }
- *res = tree_eval(tree->lnode);
- }
-
- /* Display dialog with prompt asking for string. Return string. */
- NODE *do_prompt(NODE *tree)
- {
- NODE *t1, *t2;
- char *answer;
-
- get_one_string(tree, &t1);
- t1 = force_string(t1);
- answer = Prompt(t1->stptr, t1->stlen);
- t2 = tmp_string(answer, (short)strlen(answer));
- free(answer);
- free_temp(t1);
- return t2;
- }
-
- /* Display dialog with prompt message (ask), return
- reply typed in edit field. For display purposes, all
- '\n' are converted to '\r'. */
- char *Prompt(char *ask, short askLen)
- {
- DialogPtr dPtr;
- char bufStr[256],
- *answer,
- *tPtr,
- *endPtr,
- oldByte;
- short i, itemHit, maxByte = 0, nl[6];
- extern Boolean gConcurrent;
- #ifdef powerc
- ModalFilterUPP filterUPP;
- #endif
-
- if (gConcurrent)
- return(NULL);
-
- if (askLen < 0)
- return(NULL);
-
- if (!GetAndAlignDialog(PROMPTID))
- return(NULL);
- dPtr = GetNewDialog(PROMPTID, NULL, (WindowPtr)-1L);
- if (!dPtr)
- return(NULL);
- if (askLen > 255)
- {
- maxByte = 255;
- oldByte = *(ask+maxByte);
- *(ask+maxByte) = '\0';
- }
- tPtr = ask;
- endPtr = tPtr + askLen;
- for (i = 0; i < 6; ++i)
- nl[i] = -1;
- i = 0;
- while (tPtr < endPtr)
- {
- if (*tPtr == '\n')
- {
- nl[i++] = tPtr - ask;
- *tPtr = '\r';
- if (i >= 6)
- break;
- }
- ++tPtr;
- }
- CtoPstr(ask);
- SetEText(dPtr, ASK, (StringPtr)ask);
- PtoCstr((StringPtr)ask);
- if (nl[0] >= 0)
- {
- i = 0;
- while (i < 6 && nl[i] >= 0)
- *(ask+nl[i++]) = '\n';
- }
- if (maxByte)
- *(ask+maxByte) = oldByte;
-
- ShowWindow(dPtr);
- SetPort(dPtr);
- FrameDialogItem(dPtr,1); /* admittedly lazy... */
- #ifdef powerc
- filterUPP = NewModalFilterProc(PromptFilter);
- ModalDialog(filterUPP, &itemHit);
- DisposeRoutineDescriptor(filterUPP);
- #else
- ModalDialog(PromptFilter, &itemHit);
- #endif
- if (itemHit == 2) /* cancel */
- {
- DisposDialog(dPtr);
- return(NULL);
- }
- GetEText(dPtr, ANSWER, (StringPtr)bufStr);
- PtoCstr((StringPtr)bufStr);
- itemHit = (short)strlen(bufStr);
- emalloc(answer, char *, itemHit + 1, "Prompt");
- memcpy(answer, bufStr, itemHit + 1);
- DisposDialog(dPtr);
- UpdateProgress();
- return(answer);
- }
-
- /* Filter for prompt dialog; treat <Command><Return> as
- a literal return. Treat <Return> or <Enter> as "OK". */
- static pascal Boolean
- PromptFilter(DialogPtr theDlog, EventRecord *theEvent, short *itemHit)
- {
- register short key;
-
- /* Just catching key events */
- if (theEvent->what != keyDown)
- return (FALSE);
-
- key = (unsigned char) theEvent->message;
-
- if ((theEvent->modifiers & cmdKey)
- && key == '\r') /* command - return */
- {
- TEKey ('\r', ((DialogPeek)theDlog)->textH);
- theEvent->what = nullEvent;
- return (FALSE);
- }
- else if (key == '\r' || key == '\003')
- {
- *itemHit = 1;
- return (TRUE);
- }
- return (FALSE);
- }
-
- /* Display message on the go to report progress. Return number of
- times Progress has been called. */
- NODE *do_progress(NODE *tree)
- {
- NODE *t1, *t2;
-
- get_one_string(tree, &t1);
- t1 = force_string(t1);
- t2 = tmp_number((AWKNUM)Progress(t1->stptr, t1->stlen));
- free_temp(t1);
- return t2;
- }
-
- short Progress(char *msg, short msgLen)
- {
- short maxByte = 0;
- char *tPtr,
- *endPtr,
- oldByte;
- Boolean first = FALSE;
- static short numCalls;
- short i, nl[6];
- extern Boolean gConcurrent;
-
- if (gConcurrent)
- return(0);
-
- if (msgLen < 0)
- return(0);
- if (!progressPtr)
- {
- first = TRUE;
- if (!GetAndAlignDialog(PROGRESSID))
- return(0);
- progressPtr = GetNewDialog(PROGRESSID, NULL, (WindowPtr)-1L);
- if (!progressPtr)
- return(0);
- }
- if (msgLen > 255)
- {
- maxByte = 255;
- oldByte = *(msg+maxByte);
- *(msg+maxByte) = '\0';
- }
- tPtr = msg;
- endPtr = tPtr + msgLen;
- for (i = 0; i < 6; ++i)
- nl[i] = -1;
- i = 0;
- while (tPtr < endPtr)
- {
- if (*tPtr == '\n')
- {
- nl[i++] = tPtr - msg;
- *tPtr = '\r';
- if (i >= 6)
- break;
- }
- ++tPtr;
- }
- CtoPstr(msg);
- SetEText(progressPtr, 1, (StringPtr)msg);
- PtoCstr((StringPtr)msg);
- if (nl[0] >= 0)
- {
- i = 0;
- while (i < 6 && nl[i] >= 0)
- *(msg+nl[i++]) = '\n';
- }
- if (maxByte)
- *(msg+maxByte) = oldByte;
- if (first)
- {
- ShowWindow(progressPtr);
- DrawDialog(progressPtr);
- }
-
- return(++numCalls);
- }
-
- void UpdateProgress()
- {
- if (progressPtr)
- DrawDialog(progressPtr);
- }
-
- void DisposeProgress()
- {
- if (progressPtr)
- DisposDialog(progressPtr);
- }
-