home *** CD-ROM | disk | FTP | other *** search
- /* Requester toolbox - written and designed by David A. Visage */
-
- #include <stdio.h>
- #include <exec/types.h>
- #include <intuition/intuition.h>
-
- #define REQ_GAD_HEIGHT 13 /* Requester Gadget = 13 pixels */
- #define STR_GADGET_HEIGHT 10 /* String Gadgets = 10 pixels */
-
- #define MAX_STR_LEN 256 /* Maximum string input length */
-
- #define STR_GAD_ID 5
- #define TEXT_WIDTH 8
-
- #define MAX_WIDTH 640
- #define MAX_HEIGHT 200
-
- #define COLOR00 0
- #define COLOR05 5
-
- /* These define the number of random sorry and continue messages */
- #define SORRY_COUNT 8
- #define CONT_COUNT 8
-
- /* Declare return values from requester functions */
- extern struct Message *GetMsg();
- extern LONG InitIText();
- extern LONG IntuiTextLength();
- extern USHORT WaitForGadget();
- extern BOOL GetString();
- extern unsigned int GetRand();
-
- /* The famous points structure */
- struct Points
- {
- SHORT X1,Y1;
- SHORT X2,Y2;
- SHORT X3,Y3;
- SHORT X4,Y4;
- SHORT X5,Y5;
- };
-
- /* Used for rendering requesters */
- struct ReqData
- {
- struct Requester ReqRequest;
- struct Border ReqBorder;
- struct Points ReqPoints;
- struct IntuiText ReqIText[25]; /* Holds requester text */
- };
-
- /* Used for rendering requester gadgets */
- struct ReqGadData
- {
- struct Gadget ReqGadget;
- struct Border ReqGadBorder;
- struct Points ReqGadPoints;
- struct IntuiText ReqGadIText[2]; /* Leave room for InitIText NULL */
- };
-
- /* Used for rendering string gadgets */
- struct StrGadData
- {
- struct Gadget StrGad;
- struct Border StrGadBorder;
- struct Points StrGadPoints;
- struct StringInfo StrGadInfo;
- UBYTE StrGadBuffer [MAX_STR_LEN];
- };
-
- /* SpriteWiz continue message */
- char *ContMsg[] = { NULL,NULL };
-
- /* These ought to liven things up a bit */
- char *ContArray[] = {
- "CONTINUE",
- "WHATEVER",
- "WHO CARES",
- "YOU SAID IT",
- "I BELIEVE IT",
- "YOU BET YOUR LIFE",
- "AFFIRMATIVE",
- "10-4 GOOD BUDDY" };
-
- /* SpriteWiz error message */
- char *SorryMsg[] = { NULL,NULL };
-
- /* More funny messages */
- char *SorryArray[] = {
- "OOPS",
- "SORRY",
- "MY FAULT",
- "I BLEW IT",
- "MY MISTAKE",
- "FORGET IT",
- "AW SHUCKS",
- "NO PROBLEM" };
-
- /* SpriteWiz yes/no gadget text */
- char *OkayMsg[] = { " OKAY ",NULL };
- char *NahMsg[] = { "CANCEL",NULL };
-
- char *AuthorMsg [] = {
- "Sprite Wizard V1.0",
- " ",
- "Written and designed by David A. Visage",
- " ",
- "(C) 1988 Message Software",
- "James Messa and David Visage",
- "Our Logo - GET THE MESSAGE!",
- " ",
- "Comments and/or suggestions are welcome!",
- " ",
- "Home : (916) 383-0986",
- "Work : (916) 446-8550",
- " ",
- "Also by David Visage - Disk Wizard V1.0",
- " Mind Expander!",
- NULL };
-
- char *PgmMsg[] = {
- "Sprite Wizard is a Multi-Purpose sprite editor/animator designed",
- "to take the pain out of designing and animating hardware sprites",
- "and VSprites.",
- " ",
- "Although this version of Sprite Wizard only works with sprites",
- "16 pixels wide by 16 pixels high, I believe you will find a lot",
- "of useful options are available.",
- " ",
- "If I decide to make V2.0 of Sprite Wizard, sprites will be editable",
- "up to 192 pixels high.",
- " ",
- "Have Fun, and remember - Your comments are the deciding factor as to",
- "whether or not V2.0 of Sprite Wizard will become a reality!",
- NULL };
-
- char *MoneyMsg[] = {
- "This is a demo version of Sprite Wizard V1.0 that has the save",
- "C source and save Assembler source options disabled.",
- " ",
- "If you find Sprite Wizard useful, you can get a full working",
- "copy by mailing me a self-addressed stamped envelope, a blank",
- "disk, and a check or money order for five dollars.",
- "If you are just learning to use the Amiga, you might find the",
- "C source code for Sprite Wizard useful. Thus, For an additional",
- "ten dollars, the source code for Sprite Wizard can be yours.",
- " ",
- "David A. Visage",
- "7371 Power Inn Road #106",
- "Sacramento, Ca. 95826",
- NULL };
-
- char *ErrMsg[] =
- {
- NULL,
- " ",
- NULL
- };
-
- char *GetStrMsg[] =
- {
- NULL,
- " ",
- NULL
- };
-
- /* Handle Author requester */
- Author(WindowPtr)
- struct Window *WindowPtr;
- {
- struct ReqData MyRequest;
- struct Requester *RequestPtr;
- struct ReqGadData YesGad;
- struct Gadget *GadgetPtr;
- unsigned int RandVal;
- USHORT GadID;
-
- BuildRequest(&MyRequest,AuthorMsg); /* Build Author request */
- RequestPtr = &MyRequest.ReqRequest;
-
- /* Get random continue message */
- RandVal = GetRand(CONT_COUNT);
- ContMsg[0] = ContArray[RandVal];
-
- BuildReqGadget(&YesGad,ContMsg,TRUE); /* Build true requester gadget */
- GadgetPtr = &YesGad.ReqGadget;
-
- /* Link gadget to requester, do request, and wait for gadget */
- RequestPtr->ReqGadget = GadgetPtr;
- Request(RequestPtr,WindowPtr);
- GadID = WaitForGadget(WindowPtr); /* Wait until RELVERIFY gadget hit */
- }
-
-
- /* Handle Program requester */
- Program(WindowPtr)
- struct Window *WindowPtr;
- {
- struct ReqData MyRequest;
- struct Requester *RequestPtr;
- struct ReqGadData YesGad;
- struct Gadget *GadgetPtr;
- unsigned int RandVal;
- USHORT GadID;
-
- BuildRequest(&MyRequest,PgmMsg); /* Build program request */
- RequestPtr = &MyRequest.ReqRequest;
-
- /* Get random continue message */
- RandVal = GetRand(CONT_COUNT);
- ContMsg[0] = ContArray[RandVal];
-
- BuildReqGadget(&YesGad,ContMsg,TRUE); /* Build true requester gadget */
- GadgetPtr = &YesGad.ReqGadget;
-
- /* Link gadget to requester, do request, and wait for gadget */
- RequestPtr->ReqGadget = GadgetPtr;
- Request(RequestPtr,WindowPtr);
- GadID = WaitForGadget(WindowPtr); /* Wait until RELVERIFY gadget hit */
- }
-
-
- /* Handle Money requester */
- Money(WindowPtr)
- struct Window *WindowPtr;
- {
- struct ReqData MyRequest;
- struct Requester *RequestPtr;
- struct ReqGadData YesGad;
- struct Gadget *GadgetPtr;
- unsigned int RandVal;
- USHORT GadID;
-
- BuildRequest(&MyRequest,MoneyMsg); /* Build Money request */
- RequestPtr = &MyRequest.ReqRequest;
-
- /* Get random continue message */
- RandVal = GetRand(CONT_COUNT);
- ContMsg[0] = ContArray[RandVal];
-
- BuildReqGadget(&YesGad,ContMsg,TRUE); /* Build true requester gadget */
- GadgetPtr = &YesGad.ReqGadget;
-
- /* Link gadget to requester, do request, and wait for gadget */
- RequestPtr->ReqGadget = GadgetPtr;
- Request(RequestPtr,WindowPtr);
- GadID = WaitForGadget(WindowPtr); /* Wait until RELVERIFY gadget hit */
- }
-
-
- /* Handle SpriteWiz errors */
- ErrRequest(WindowPtr,Heading)
- struct Window *WindowPtr;
- char *Heading;
- {
- struct ReqData MyRequest;
- struct Requester *RequestPtr;
- struct ReqGadData YesGad;
- struct Gadget *GadgetPtr;
- unsigned int RandVal;
- USHORT GadID;
-
- /* Assign error message to requester heading */
- ErrMsg[0] = Heading;
- BuildRequest(&MyRequest,ErrMsg); /* Build program request */
- RequestPtr = &MyRequest.ReqRequest;
-
- /* Get a random sorry message */
- RandVal = GetRand(SORRY_COUNT);
- SorryMsg[0] = SorryArray[RandVal];
-
- BuildReqGadget(&YesGad,SorryMsg,TRUE); /* Build true requester gadget */
- GadgetPtr = &YesGad.ReqGadget;
-
- /* Link gadget to requester, do request, and wait for gadget */
- RequestPtr->ReqGadget = GadgetPtr;
- Request(RequestPtr,WindowPtr);
- GadID = WaitForGadget(WindowPtr); /* Wait until RELVERIFY gadget hit */
- }
-
-
- /* Accept input string in requester */
- BOOL GetString(WindowPtr,Heading,BufferPtr)
- struct Window *WindowPtr;
- char *Heading; /* Text for string entry requester */
- UBYTE *BufferPtr;
- {
- struct ReqData MyRequest;
- struct Requester *RequestPtr;
- struct ReqGadData YesGad,NoGad;
- struct StrGadData InputGad;
- struct Gadget *GadgetPtr;
- UBYTE *DestBuffer,*SrcBuffer;
- USHORT GadID;
-
- GetStrMsg[0] = Heading;
- BuildRequest(&MyRequest,GetStrMsg); /* Build string request */
- RequestPtr = &MyRequest.ReqRequest;
-
- BuildReqGadget(&YesGad,OkayMsg,TRUE); /* Build true gadget */
- BuildReqGadget(&NoGad,NahMsg,FALSE); /* Build false gadget */
-
- DestBuffer = &InputGad.StrGadBuffer[0];
- strcpy(DestBuffer,BufferPtr); /* Copy user buffer */
- BuildStrGadget(&InputGad); /* Build string gadget */
-
- /* Link string gadget to false gadget */
- GadgetPtr = &NoGad.ReqGadget;
- GadgetPtr->NextGadget = &InputGad.StrGad;
-
- /* Link false gadget to true gadget */
- GadgetPtr = &YesGad.ReqGadget;
- GadgetPtr->NextGadget = &NoGad.ReqGadget;
-
- /* Link true gadget to requester, do request, and wait for gadget */
- RequestPtr->ReqGadget = GadgetPtr;
- Request(RequestPtr,WindowPtr);
- GadID = WaitForGadget(WindowPtr);
-
- /* Check if string is copied to user buffer */
- if ( GadID != FALSE )
- {
- SrcBuffer = &InputGad.StrGadBuffer[0];
- strcpy(BufferPtr,SrcBuffer);
- return(TRUE);
- };
- return(FALSE);
- }
-
-
- /* Take the pain out of creating complex requesters */
- BuildRequest(ReqDataPtr,StrPtr)
- struct ReqData *ReqDataPtr;
- char *StrPtr[];
- {
- struct Requester *RequestPtr;
- struct Border *BorderPtr;
- struct Points *PointsPtr;
- struct IntuiText *ITextPtr;
- LONG ITextLen;
- SHORT Width,Height;
- SHORT ReqWidth,ReqHeight;
- LONG Count;
-
- /* Extract information from ReqData structure */
- RequestPtr = &ReqDataPtr->ReqRequest;
- BorderPtr = &ReqDataPtr->ReqBorder;
- PointsPtr = &ReqDataPtr->ReqPoints;
- ITextPtr = &ReqDataPtr->ReqIText[0];
-
- /* Initialize requester IText and calculate width and height */
- InitRequester(RequestPtr);
- ITextLen = InitIText(ITextPtr,StrPtr,&Count);
- ReqWidth = ITextLen + (TEXT_WIDTH * 2);
- ReqHeight = Count * 10;
-
- /* Initialize requester information */
- RequestPtr->LeftEdge = (MAX_WIDTH - ReqWidth) / 2;
- RequestPtr->TopEdge = (MAX_HEIGHT - ReqHeight) / 2;
- RequestPtr->Width = ReqWidth;
- RequestPtr->Height = ReqHeight + REQ_GAD_HEIGHT; /* Room for gadgets */
- RequestPtr->ReqText = ITextPtr;
- RequestPtr->Flags = NULL;
- RequestPtr->BackFill = COLOR05;
-
- /* Build requester border and link into requester */
- Width = RequestPtr->Width - 1;
- Height = RequestPtr->Height - 1;
- InitBorder(PointsPtr,BorderPtr,Width,Height);
- RequestPtr->ReqBorder = BorderPtr;
- }
-
-
- /* Take some of the hassle out of creating requester gadgets */
- BuildReqGadget(GadDataPtr,StrPtr,GadType)
- struct ReqGadData *GadDataPtr;
- char *StrPtr[];
- USHORT GadType;
- {
- struct Gadget *GadgetPtr;
- struct Border *BorderPtr;
- struct Points *PointsPtr;
- struct IntuiText *ITextPtr;
- LONG ITextLen,Count;
- SHORT Width,Height,ReqGadWidth;
-
- /* Extract information from ReqGadData structure */
- GadgetPtr = &GadDataPtr->ReqGadget;
- BorderPtr = &GadDataPtr->ReqGadBorder;
- PointsPtr = &GadDataPtr->ReqGadPoints;
- ITextPtr = &GadDataPtr->ReqGadIText[0];
-
- /* Initialize gadget IText and calculate width */
- ITextLen = InitIText(ITextPtr,StrPtr,&Count);
- ReqGadWidth = ITextLen + (TEXT_WIDTH * 2);
-
- /* Intialize gadget information */
- GadgetPtr->TopEdge = - ( AUTOTOPEDGE + REQ_GAD_HEIGHT );
- GadgetPtr->Width = ReqGadWidth;
- GadgetPtr->Height = REQ_GAD_HEIGHT;
- GadgetPtr->Activation = RELVERIFY | ENDGADGET;
- GadgetPtr->GadgetType = BOOLGADGET | REQGADGET;
- GadgetPtr->GadgetText = ITextPtr;
- GadgetPtr->GadgetID = GadType;
- GadgetPtr->NextGadget = NULL;
- if ( GadType == TRUE )
- {
- GadgetPtr->Flags = GADGHCOMP | GRELBOTTOM | GRELRIGHT;
- GadgetPtr->LeftEdge = - ( TEXT_WIDTH + ReqGadWidth );
- }
- else
- {
- GadgetPtr->Flags = GADGHCOMP | GRELBOTTOM;
- GadgetPtr->LeftEdge = TEXT_WIDTH;
- };
-
- /* Build requester gadget border and link into gadget */
- Width = GadgetPtr->Width - 1;
- Height = GadgetPtr->Height - 1;
- InitBorder(PointsPtr,BorderPtr,Width,Height);
- GadgetPtr->GadgetRender = (APTR) BorderPtr;
- }
-
-
- /* Create a String Gadget for display in a requester */
- BuildStrGadget(GadDataPtr)
- struct StrGadData *GadDataPtr;
- {
- struct Gadget *GadgetPtr;
- struct Border *BorderPtr;
- struct Points *PointsPtr;
- struct StringInfo *StrInfoPtr;
- UBYTE *BufferPtr;
- USHORT Width,Height;
-
- /* Extract information from StrGadData structure */
- GadgetPtr = &GadDataPtr->StrGad;
- BorderPtr = &GadDataPtr->StrGadBorder;
- PointsPtr = &GadDataPtr->StrGadPoints;
- StrInfoPtr = &GadDataPtr->StrGadInfo;
- BufferPtr = &GadDataPtr->StrGadBuffer[0];
-
- /* Intialize string info for gadget */
- StrInfoPtr->Buffer = BufferPtr;
- StrInfoPtr->UndoBuffer = BufferPtr;
- StrInfoPtr->BufferPos = 0;
- StrInfoPtr->MaxChars = MAX_STR_LEN - 1; /* Allow for '/0' */
- StrInfoPtr->DispPos = 0;
-
- /* Initialize string gadget information */
- GadgetPtr->LeftEdge = 11 * TEXT_WIDTH;
- GadgetPtr->TopEdge = - ( AUTOTOPEDGE + STR_GADGET_HEIGHT );
- GadgetPtr->Height = STR_GADGET_HEIGHT;
- GadgetPtr->Width = 20 * TEXT_WIDTH; /* Select box width */
- GadgetPtr->Flags = GADGHCOMP | GRELBOTTOM;
- GadgetPtr->Activation = RELVERIFY | ENDGADGET;
- GadgetPtr->GadgetType = STRGADGET | REQGADGET;
- GadgetPtr->GadgetText = NULL;
- GadgetPtr->GadgetID = STR_GAD_ID; /* String gadget ID */
- GadgetPtr->NextGadget = NULL;
- GadgetPtr->SpecialInfo = (APTR) StrInfoPtr;
-
- /* Make border and link to string gadget */
- Width = GadgetPtr->Width + 1;
- Height = GadgetPtr->Height - 1;
-
- InitBorder(PointsPtr,BorderPtr,Width,Height);
-
- BorderPtr->LeftEdge = - 1;
- BorderPtr->TopEdge = - 1;
- GadgetPtr->GadgetRender = (APTR) BorderPtr;
- }
-
-
- /* Link IntuiText together and return pixel length of the longest one */
- LONG InitIText(ITextPtr,StrPtr,CountPtr)
- struct IntuiText *ITextPtr;
- char *StrPtr[];
- LONG *CountPtr;
- {
- struct IntuiText *NextTextPtr; /* Points to next IntuiText */
- BOOL Finished;
- LONG MaxTextLen,TextLen,Count;
- int i;
-
-
- i = MaxTextLen = 0; Count = 1; Finished = FALSE;
-
- while ( ! Finished )
- {
- /* Initilize IntuiText */
- ITextPtr->FrontPen = COLOR00;
- ITextPtr->BackPen = COLOR05;
- ITextPtr->DrawMode = JAM1;
- ITextPtr->LeftEdge = TEXT_WIDTH;
- ITextPtr->TopEdge = AUTOTOPEDGE + ( i * 9 );
- ITextPtr->ITextFont = NULL;
- ITextPtr->IText = (UBYTE *) StrPtr[i];
-
- /* Check length of this IntuiText */
- TextLen = IntuiTextLength(ITextPtr);
- if ( TextLen > MaxTextLen )
- MaxTextLen = TextLen; /* IntuiText length in pixels */
-
- i++;
- NextTextPtr = ITextPtr + 1; /* Auto scaled by argument size */
-
- if ( StrPtr[i] != NULL )
- {
- ITextPtr->NextText = NextTextPtr;
- ITextPtr++; /* Get next IntuiText */
- Count++;
- }
- else
- {
- ITextPtr->NextText = NULL;
- Finished = TRUE;
- };
- };
-
- *CountPtr = Count;
- return(MaxTextLen); /* return maximum IntuiText length */
- }
-
-
- /* Wait until requester gadget hit and return GadgetID */
- USHORT WaitForGadget(WindowPtr)
- struct Window *WindowPtr;
- {
- struct IntuiMessage *MessagePtr;
- USHORT GadID;
- struct Gadget *GadgetPtr;
- BOOL Done;
-
- Done = FALSE;
- while ( ! Done )
- {
- MessagePtr = (struct IntuiMessage *) GetMsg(WindowPtr->UserPort);
- if ( MessagePtr != NULL )
- {
- ReplyMsg(MessagePtr);
- if ( MessagePtr->Class == GADGETUP )
- {
- GadgetPtr = (struct Gadget *) MessagePtr->IAddress;
- GadID = GadgetPtr->GadgetID;
- Done = TRUE;
- };
- };
- };
- return(GadID);
- }
-
-
-