/* include not needed for Aztec C using provided makefile */ #include "sb:sb.h" #define CHOICEWIDTH 280 #define CHOICEHEIGHT 8 #define SPACING 9 #define TOPGADG 30 #define PUTTEXT(text, x, y) { Move(rp, (long)x, (long)y); \ Text(rp, text, (long)strlen(text)); } struct IntuitionBase *IntuitionBase = NULL; struct GfxBase *GfxBase = NULL; struct Window *OpenWindow(), *MainWindow = NULL; struct RastPort *rp; extern int level; APTR OpenLibrary(); struct IntuiText ChoiceText[MAXGADG + 1]; struct Gadget ChoiceGadg[MAXGADG + 1]; extern void CloseOut(), Redisplay(); struct IntuiText BackIText = { 3, 2, JAM2, 5, 2, NULL, NULL, NULL }; struct IntuiText MoreIText = { 2, 3, JAM2, 5, 2, NULL, (UBYTE *)"(MORE)", NULL }; struct Gadget BackGadg = { NULL, 10, -12, 140, 12, GADGHCOMP | GRELBOTTOM, RELVERIFY, BOOLGADGET, NULL, NULL, &BackIText, NULL, NULL, 0, NULL /* gadget ID is zero */ }; struct Gadget MoreGadg = { NULL, 300, -12, 59, 12, GADGHCOMP | GRELBOTTOM, RELVERIFY, BOOLGADGET, NULL, NULL, &MoreIText, NULL, NULL, MOREGADG, NULL }; struct NewWindow NWindow = { 0, 10, 640, 189, /* left, top, width, height */ -1, -1, /* use screen colours */ GADGETUP /* IDCMP flags */ | CLOSEWINDOW, WINDOWDEPTH /* window flags */ | WINDOWCLOSE | WINDOWDRAG | RMBTRAP | ACTIVATE | NOCAREREFRESH | SMART_REFRESH, &BackGadg, /* first gadget in list */ NULL, (UBYTE *)"The Transactor Structure Browser V 1.0", NULL, NULL, 0, 0, 0, 0, /* sizing limits (non-resizable) */ WBENCHSCREEN }; void SetupGadg() { int i; for (i = 0; i < MAXGADG; i++) { ChoiceText[i].BackPen = 0; ChoiceText[i].DrawMode = JAM2; ChoiceText[i].LeftEdge = 0; ChoiceText[i].TopEdge = 0; ChoiceText[i].ITextFont = NULL; ChoiceText[i].IText = NULL; ChoiceText[i].NextText = NULL; ChoiceGadg[i].LeftEdge = 20; ChoiceGadg[i].TopEdge = i * SPACING + TOPGADG; ChoiceGadg[i].Width = CHOICEWIDTH; ChoiceGadg[i].Height = CHOICEHEIGHT; ChoiceGadg[i].Flags = GADGHCOMP; ChoiceGadg[i].Activation = RELVERIFY; ChoiceGadg[i].GadgetType = BOOLGADGET; ChoiceGadg[i].GadgetText = &ChoiceText[i]; ChoiceGadg[i].GadgetID = i + 1; /* gadget IDs start at 1 */ } } int GetChoice (num) int num; { struct IntuiMessage *GetMsg(), *message; ULONG msgclass; /* message class from IDCMP */ APTR IAddr; /* pointer to gadget from IDCMP */ Redisplay(num); /* put up choices in windows */ FOREVER { /*** main event loop ***/ Wait (1L << MainWindow->UserPort->mp_SigBit); while (message = GetMsg(MainWindow->UserPort)) { /* get what we need from the message port */ msgclass = message->Class; IAddr = message->IAddress; ReplyMsg(message); /* reply to message right away */ /* check for gadget selected */ if (msgclass == GADGETUP) return ( (int)((struct Gadget *)IAddr)->GadgetID ); /* finish up if the close gadget is clicked */ else if (msgclass == CLOSEWINDOW) CloseOut(); /* clean up and exit */ } } return(0); /* dummy to stop warning */ } void putHeader(string, ptr) char *string; APTR ptr; /* put title and pointer at top of screen - * if ptr is NULL, put string only. */ { char buf[80]; SetAPen(rp, 0L); RectFill(rp, 1L, 10L, (long)MainWindow->Width-25, 27L); SetAPen(rp, 3L); if (ptr) { sprintf(buf, "%d: %s (address $%lx):", level, string, ptr); PUTTEXT( " Member Type Value (hex/decimal)", 20L, 10L + 2 * rp->TxHeight); } else sprintf(buf, "%d: %s:", level, string); PUTTEXT(buf, 20L, 10L + rp->TxHeight); } void OpenStuff () { /* open intuition & graphics libraries and window */ if (!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L) ) ) CloseOut(); if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L) ) ) CloseOut(); /* now attempt to open the main window */ if (!(MainWindow = OpenWindow(&NWindow)) ) CloseOut(); rp = MainWindow->RPort; /* rastport for graphics routines */ } void CloseOut() { /* close everything up before ending */ if (MainWindow) CloseWindow(MainWindow); if (IntuitionBase) CloseLibrary(IntuitionBase); if (GfxBase) CloseLibrary(GfxBase); exit(0); /* exit program - we may be deeply nested */ } void Redisplay(num) int num; /* clear window, remove old gadgets, prepare and add new ones */ { struct Gadget *gadg; BOOL MoreFlag = FALSE; int i, c; SetAPen(rp, 0L); /* rectfill with background colour to clear */ RectFill(rp, 1L, (long)TOPGADG, (long)MainWindow->Width - 2, (long)MainWindow->Height - 2); if (num > MAXGADG) { num = MAXGADG; MoreFlag = TRUE; /* put up "more" gadget */ } /* remove all choice gadgets */ gadg = &BackGadg; while (gadg = gadg->NextGadget) RemoveGadget(MainWindow, gadg); /* render gadgets according to single-digit code at * the start of the gadget's intuitext */ for (i = 0; i < num; i++) { ChoiceText[i].FrontPen = 1; if ((c = *ChoiceText[i].IText) == '-' || c == '(') { if (c == '-') { *ChoiceText[i].IText = ' '; ChoiceText[i].FrontPen = 2; } PrintIText(rp, &ChoiceText[i], (long)ChoiceGadg[i].LeftEdge, (long)ChoiceGadg[i].TopEdge); } else AddGadget(MainWindow, &ChoiceGadg[i], -1L); } if (MoreFlag) AddGadget(MainWindow, &MoreGadg, -1L); /* display gadget imagery (the text) */ RefreshGadgets(&BackGadg, MainWindow, NULL); } void SetBackText (sflag) int sflag; { BackIText.IText = (UBYTE *)(sflag ? " Previous Page " : " Previous Level "); }