/* * * Copywrite (C) 1986 by Davide P. Cervone * * Permission is granted for any individual or institution to use, * copy, or redistribute this software, provided this copywrite * notice is retained. * */ #include "exec/types.h" #include "exec/devices.h" #include "libraries/dos.h" #include "intuition/intuition.h" #include "intuition/intuitionbase.h" #include "graphics/gfxbase.h" #include "graphics/regions.h" #include "graphics/copper.h" #include "graphics/gels.h" #include "devices/keymap.h" #include "hardware/blit.h" #include "mxgadget.h" #define INTUITION_REV 0 #define GRAPHICS_REV 0 #define ERROR_EXIT 10 /* Error number to return on error exit */ struct IntuitionBase *IntuitionBase = NULL; struct GfxBase *GfxBase = NULL; /* * These are the title texts of all the gadgets: */ struct IntuiText Title[] = { { 1,0, /* Text pen colors */ JAM1, /* drawing mode */ 30,1, /* Offset */ NULL, /* font */ "Choice 1", /* text of message */ NULL /* next IntuiText */ }, {1,0, JAM1, 30,1, NULL, "Choice 2", NULL}, {1,0, JAM1, 30,1, NULL, "Choice 3, with Sub-Items", NULL}, {1,0, JAM1, 30,1, NULL, "Sub-Choice 1", NULL}, {1,0, JAM1, 30,1, NULL, "Sub-Choice 2", NULL}, {1,0, JAM1, -4,-12, NULL, "A String, or", NULL}, {1,0, JAM1, -13,-11, NULL, "A Flag", NULL}, {3,0, JAM1, 8,2, NULL, "1", NULL}, {3,0, JAM1, 8,2, NULL, "2", NULL}, {3,0, JAM1, 8,2, NULL, "4", NULL}, {3,0, JAM1, 8,2, NULL, "8 Items", NULL}, {1,0, JAM1, 4,2, NULL, "OK", NULL} }; /* * These are the border coordinates and border structures for * the gadgets: */ USHORT Button[] = {0,0, 25,0, 25,13, 0,13, 0,0}; /* Boarder coordinates */ USHORT StrBox[] = {0,0, 92,0, 92,13, 0,13, 0,0}; /* string border */ USHORT ReqBox[] = {0,0,399,0,399,149,0,149,0,0}; /* Requester border */ struct Border ButtonBrdr = { -1,-1, /* starting position of boarder lines */ 1,0, /* front and back pens */ JAM1, /* Drawing mode */ 5, /* Number of points in Button Boarder */ &Button[0], /* pointer to outline */ NULL /* pointer to next boarder */ }; struct Border StrBoxBrdr = {-6,-3, 1,0, JAM1, 5, &StrBox[0], NULL}; struct Border RequestBrdr = { 0, 0, 1,0, JAM1, 5, &ReqBox[0], NULL}; /* * These are the image data for the box and the box with an X in it: */ USHORT EmptyBoxData[] = { 0xFFFF, 0xFC00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xFFFF, 0xFC00 }; USHORT CheckBoxData[] = { /* plane 1 */ 0xFFFF, 0xFC00, 0xF000, 0x3C00, 0xCC00, 0xCC00, 0xC303, 0x0C00, 0xC0CC, 0x0C00, 0xC030, 0x0C00, 0xC0CC, 0x0C00, 0xC303, 0x0C00, 0xCC00, 0xCC00, 0xF000, 0x3C00, 0xFFFF, 0xFC00, /* plane 2 */ 0xFFFF, 0xFC00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xC000, 0x0C00, 0xFFFF, 0xFC00 }; struct Image EmptyBox = { 0,0, /* left, top */ 22,11,1, /* width, height, depth */ (USHORT *) &EmptyBoxData, /* the image data */ 0x1,0x0, /* PlanePick, PlaneOnOff */ NULL /* next image */ }; struct Image CheckBox = { 0,0, 22,11,2, (USHORT *) &CheckBoxData, 0x3,0x0, NULL }; /* * String gadget special info: */ char StrBuf[11]; /* string buffer area */ struct StringInfo StrBoxInfo = { (UBYTE *) &StrBuf[0], /* pointer to string buffer area */ NULL, /* UNDO buffer */ 0, /* initial cursor position */ 11, /* buffer size */ 0, /* position of first character in display */ 0, /* UNDO position */ 0, /* number of chars in the buffer */ 0, /* number of characters visiable */ 0,0, /* position of left and top of container */ NULL, /* layer pointer */ 0L, /* long it value (if INTEGER gadget) */ NULL /* alternate kymao for input */ }; /* * These are the gadgets themselves: * the array is a linked list, and is completely initalized here, * so these gadgets can be used without additional initialization code. * They are linked into the Requester structure below. */ #define OKGADGET 11 /* This is the gagdet number of the end gadget */ struct Gadget Choice[12] = { { &Choice[1], /* Next Gadget */ 60,20, 22,11, /* left and top edges, width and height */ GADGIMAGE | SELECTED | GADGHIMAGE, /* flags */ GADGIMMEDIATE, /* activation flags */ BOOLGADGET | REQGADGET, /* Boolean requseter gadget */ (APTR) &EmptyBox, /* Pointer to Image */ (APTR) &CheckBox, /* Pointer to select rendering */ &Title[0], /* text for gadget */ 1+2, /* Mutual Exclude group 1, disable group 2 */ NULL, /* special info (PropInfo or StringInfo) */ 0, /* identification */ (APTR) MXDISABLEGADG /* This one is pre-selected (SELECTED) and is an IMAGE gadget (GADGHIMAGE); it disabled group 2 (MXDISABLEGADG); group 2 is specified as a disable group by a call to SetMxGadgetMasks in the OpenMyWindow procedure */ },{ &Choice[2], 60,35, 22,11, GADGIMAGE | GADGHIMAGE, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &EmptyBox, (APTR) &CheckBox, &Title[1], 1+2, /* Mutual Exclude group 1, disable group 2 */ NULL, 1, (APTR) MXDISABLEGADG },{ &Choice[3], 60,50, 22,11, GADGIMAGE | GADGHIMAGE, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &EmptyBox, (APTR) &CheckBox, &Title[2], 1+2, /* Mutual Exclude group 1, enable group 2 */ NULL, 2, (APTR) MXENABLEGADG /* This one enables group 2 (MXENABLEGADG), which are the sub-choices */ },{ &Choice[4], 100,65, 22,11, GADGIMAGE | GADGDISABLED | GADGHBOX, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &EmptyBox, NULL, &Title[3], 2+4, /* Mutual Exclude group 4, disabled by group 2 */ NULL, 3, (APTR) (MXGADGONOFF | MXSELECT) /* Disabled when a member of Mutual Exclude group 2 is enabled (MXGADGONOFF), start out disabled (GADGDISABLED), but selected when enabled (MXSELECT) */ },{ &Choice[5], 260,65, 22,11, GADGIMAGE | GADGDISABLED | GADGHBOX, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &EmptyBox, NULL, &Title[4], 2+4, /* Mutual Exclude group 4, disabled by group 2 */ NULL, 4, (APTR) MXGADGONOFF /* Disabled when a member of Mutual Exclude group 2 is enabled (MXGADGONOFF) and starts out disabled (GADGDISABLED) */ },{ &Choice[6], 60,105, 81,8, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, STRGADGET | REQGADGET, (APTR) &StrBoxBrdr, NULL, &Title[5], 8, /* Disabled by group 8 */ (APTR) &StrBoxInfo, 5, (APTR) MXGADGONOFF /* Disabled by mutual exclude group 8 (MXGADGONOFF), but starts out enabled */ },{ &Choice[7], 190,104, 22,11, GADGIMAGE | GADGHIMAGE, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET | REQGADGET, (APTR) &EmptyBox, (APTR) &CheckBox, &Title[6], 8, /* Disable members of group 8 */ NULL, 6, (APTR) MXDISABLEGADG /* Disables Mutual Exclude group 8 (MXDISABLEGADG), toggles to re-enable it (TOGGLESELECT) */ },{ &Choice[8], 130,130, 24,12, GADGHCOMP | SELECTED, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &ButtonBrdr, NULL, &Title[7], 16, /* Mutual Exclude group 16 */ NULL, 7, NULL /* Exclude members of group 16, and complement (GADGHCOMP) */ },{ &Choice[9], 156,130, 24,12, GADGHCOMP, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &ButtonBrdr, NULL, &Title[8], 16, /* Mutual Exclude group 16 */ NULL, 8, NULL /* Exclude members of group 16, and complement (GADGHCOMP) */ },{ &Choice[10], 182,130, 24,12, GADGHCOMP, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &ButtonBrdr, NULL, &Title[9], 16, /* Mutual Exclude group 16 */ NULL, 9, NULL /* Exclude members of group 16, and complement (GADGHCOMP) */ },{ &Choice[11], 208,130, 24,12, GADGHCOMP, GADGIMMEDIATE, BOOLGADGET | REQGADGET, (APTR) &ButtonBrdr, NULL, &Title[10], 16, /* Mutual Exclude group 16 */ NULL, 10, NULL /* Exclude members of group 16, and complement (GADGHCOMP) */ },{ NULL, 320,104, 24,12, GADGHCOMP, RELVERIFY, BOOLGADGET | REQGADGET, (APTR) &ButtonBrdr, NULL, &Title[11], 0, NULL, OKGADGET, NULL /* OK button, this one closes the requester */ /* it is not a Mutual Exclude gadget */ } }; /* * This is the requester that uses the gadgets defined above: */ struct Requester myRequester = { NULL, /* Next requester */ 120,20, 400,150, /* left-edge, top-edge, width, height */ 0,0, /* relLeft, relRight */ &Choice[0], /* first Gadget */ &RequestBrdr, /* border */ NULL, /* Text */ NULL, /* Flags */ 2, /* Back Fill */ NULL, /* Clip region */ NULL, /* Bit map */ NULL /* other bitmap */ }; /* * This is the window in which the requester will be placed: */ struct NewWindow NewWindow = { 0,0, 640,200, /* left, top, width, height */ 0,1, /* detail and block pens */ GADGETDOWN | GADGETUP, /* flags */ WINDOWDEPTH | WINDOWSIZING | WINDOWDRAG | SMART_REFRESH | ACTIVATE, NULL, /* first gadget */ NULL, /* check image */ "Mutual Exclude Gadgets", /* title */ NULL, /* screen */ NULL, /* bit map */ 100, 35, /* min size */ 640, 200, /* max size */ WBENCHSCREEN /* screen type */ }; struct Window *myWindow = NULL; main() { CheckLibOpen(&IntuitionBase,"intuition.library",INTUITION_REV); CheckLibOpen(&GfxBase,"graphics.library",GRAPHICS_REV); OpenMyWindow(); if (Request(&myRequester,myWindow)) { WaitForAction(); EndRequest(&myRequester,myWindow); } else { printf("Can't open requester\n"); } DoExit(0); } DoExit(status) int status; { CloseMyWindow(); CloseLibraries(); exit(status); } CheckLibOpen(lib,name,rev) APTR **lib; char *name; long rev; { if ((*lib = (APTR) OpenLibrary(name,rev)) == NULL) { printf("Can't open %s\n",name); DoExit(ERROR_EXIT); } } OpenMyWindow() { if ((myWindow = (struct Window *) MxOpenWindow(&NewWindow)) == NULL) { printf("Can't open my window\n"); DoExit(ERROR_EXIT); } else { SetMxGadgetMasks(myWindow,2,8+2); /* Mutual Exclude group 2 is an Enable group */ /* Mutual Exclude groups 8 and 2 are Disable groups */ } } CloseLibraries() { if (IntuitionBase != NULL) CloseLibrary(IntuitionBase); IntuitionBase = NULL; if (GfxBase != NULL) CloseLibrary(GfxBase); GfxBase = NULL; } CloseMyWindow() { if (myWindow != NULL) MxCloseWindow(myWindow); myWindow = NULL; } WaitForAction() { int class,code, NotDone = 1; extern struct MenuItem *ItemAddress(); struct IntuiMessage *NewMessage; struct Gadget *theGadget; while (NotDone) { Wait(1 << myWindow->UserPort->mp_SigBit); while (NewMessage = (struct IntuiMessage *)GetMsg(myWindow->UserPort)) { class = NewMessage->Class; code = NewMessage->Code; switch (class) { case GADGETDOWN: theGadget = (struct Gadget *) NewMessage->IAddress; /* * This is the call to the mutual exclude gadget handler. Call * SelectGadget whenever a mutual exclude gadget is selected. Note that * you can call it for ANY gadget, as SelecteGadget checks whether the * gadget has the mutual exclude flags set. */ SelectGadget(theGadget,myWindow,&myRequester); /* do any other stuff with the gadgets here */ break; case GADGETUP: theGadget = (struct Gadget *) NewMessage->IAddress; if (theGadget->GadgetID == OKGADGET) NotDone = 0; /* if you have RELVERIFY gadgets, do their stuff here */ /* Mutual Exclude gadgets should not be RELVERIFY gadgets */ break; } ReplyMsg(NewMessage); } } }