home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / ansicdemo.lha / ANSI-C / gadtools / gadtools1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-30  |  24.2 KB  |  990 lines

  1. /*
  2. ** gadtools1.c:  Complex GadTools example.
  3. **
  4. ** (C) Copyright 1990, Commodore-Amiga, Inc.
  5. **
  6. ** Executables based on this information may be used in software
  7. ** for Commodore Amiga computers.  All other rights reserved.
  8. ** This information is provided "as is"; no warranties are made.  All
  9. ** use is at your own risk. No liability or responsibility is assumed.
  10. **
  11. */
  12.  
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15. #include <intuition/gadgetclass.h>
  16. #include <utility/tagitem.h>
  17. #include <clib/macros.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20.  
  21. #include <clib/intuition_protos.h> // diese beiden Includes müssten normalerweise nicht sein
  22. #include <clib/gadtools_protos.h>  // Der Compi meldet aber einen Fehler wenn das nicht so ist!
  23.  
  24. #include <libraries/gadtools.h>
  25.  
  26. #include <pragma/exec_lib.h>
  27. #include <pragma/graphics_lib.h>
  28. #include <pragma/intuition_lib.h>
  29. #include <pragma/gadtools_lib.h>
  30.  
  31. #include <graphics/gfxmacros.h>
  32.  
  33.  
  34. //void printf(STRPTR, ...);
  35. void NewList(struct List *);
  36. //void exit(int);
  37.  
  38. extern struct Library *GadToolsBase;
  39.  
  40. /*------------------------------------------------------------------------*/
  41.  
  42. int main(void);
  43. void bail_out(int code, STRPTR error);
  44. BOOL HandleMenuEvent(UWORD code);
  45. BOOL OpenFunc(UWORD code);
  46. BOOL SaveFunc(UWORD code);
  47. BOOL SaveAsFunc(UWORD code);
  48. BOOL PrintFunc(UWORD code);
  49. BOOL QuitFunc(UWORD code);
  50. BOOL HandleMouseMove(struct Gadget *gad, UWORD code);
  51. BOOL HandleGadgetEvent(struct Gadget *gad, UWORD code);
  52. struct Gadget *CreateAllGadgets(struct Gadget **glistptr, 
  53.     void *vi, UWORD topborder);
  54.  
  55. /*------------------------------------------------------------------------*/
  56.  
  57. /*/ Gadget defines of our choosing, to be used as GadgetID's: */
  58.  
  59. #define GAD_BUTTON    1
  60. #define GAD_INTEGER    2
  61. #define GAD_CHECKBOX1    3
  62. #define GAD_CHECKBOX2    4
  63. #define GAD_CYCLE    5
  64. #define GAD_MX        6
  65. #define GAD_SLIDER    7
  66. #define GAD_SCROLLER    8
  67. #define GAD_LVSTRING    9
  68. #define GAD_LISTVIEW    10
  69. #define GAD_PALETTE    11
  70.  
  71.  
  72. /* Menu defines of our choosing, to be placed in the NewMenu's UserData
  73.  * field:
  74.  */
  75. #define MENU_FOO_SET    1
  76. #define MENU_FOO_CLEAR    2
  77. #define MENU_FOO_TOGGLE    3
  78. #define MENU_INCREASE    4
  79. #define MENU_DECREASE    5
  80. #define MENU_BY1    6
  81. #define MENU_BY5    7
  82. #define MENU_BY10    8
  83. #define MENU_CONNECTED    9
  84. #define MENU_NEVER    10
  85.  
  86. /* Since NewMenu.nm_UserData are supposed to be of type (void *), we
  87.  * make this abbreviation do our casting.
  88.  */
  89.  
  90. #define V(x) ((void *)x)
  91.  
  92. /*------------------------------------------------------------------------*/
  93.  
  94. /* Here we specify what we want our menus to contain: */
  95.  
  96. struct NewMenu mynewmenu[] =
  97. {
  98.     { NM_TITLE, "Project",     0 , 0, 0, 0,},
  99.     {  NM_ITEM, "Open...",    "O", 0, 0, OpenFunc,},
  100.     {  NM_ITEM, "Save",         0 , 0, 0, SaveFunc,},
  101.     {  NM_ITEM, "Save As...",    0 , 0, 0, SaveAsFunc,},
  102.     {  NM_ITEM, NM_BARLABEL,     0 , 0, 0, 0,},
  103.     {  NM_ITEM, "Print",     0 , 0, 0, 0,},
  104.     {   NM_SUB, "NLQ",         0 , 0, 0, PrintFunc,},
  105.     {   NM_SUB, "Draft",     0 , 0, 0, PrintFunc,},
  106.     {  NM_ITEM, NM_BARLABEL,     0 , 0, 0, 0,},
  107.     {  NM_ITEM, "Quit...",    "Q", 0, 0, QuitFunc,},
  108.  
  109.     { NM_TITLE, "Gadgets",     0 , 0, 0, 0,},
  110.     {  NM_ITEM, "Foo",         0 , 0, 0, 0,},
  111.     {   NM_SUB, "Set",        "S", 0, 0, V(MENU_FOO_SET),},
  112.     {   NM_SUB, "Clear",    "C", 0, 0, V(MENU_FOO_CLEAR),},
  113.     {   NM_SUB, "Toggle",    "T", 0, 0, V(MENU_FOO_TOGGLE),},
  114.     {  NM_ITEM, "Slider",     0 , 0, 0, 0,},
  115.     {   NM_SUB, "Increase",    "I", 0, 0, V(MENU_INCREASE),},
  116.     {   NM_SUB, "Decrease",    "D", 0, 0, V(MENU_DECREASE),},
  117.     {   NM_SUB, NM_BARLABEL,     0 , 0, 0, 0,},
  118.     {   NM_SUB, "By 1s",     0 , CHECKIT|CHECKED, ~0x0008, V(MENU_BY1),},
  119.     {   NM_SUB, "By 5s",     0 , CHECKIT, ~0x0010, V(MENU_BY5),},
  120.     {   NM_SUB, "By 10s",     0 , CHECKIT, ~0x0020, V(MENU_BY10),},
  121.     {  NM_ITEM, "MX Gadgets",     0 , 0, 0, 0,},
  122.     {   NM_SUB, "Connected?",     0 , CHECKIT|MENUTOGGLE, 0, V(MENU_CONNECTED),},
  123.     {  NM_ITEM, "Not Me!",     0 , NM_ITEMDISABLED, 0, V(MENU_NEVER)},
  124.  
  125.     {   NM_END, 0,         0 , 0, 0, 0},
  126. };
  127.  
  128. /*------------------------------------------------------------------------*/
  129.  
  130. struct NewWindow mynewwin =
  131. {
  132.     0, 0,        /* LeftEdge, TopEdge */
  133.     600, 166,        /* Width, Height */
  134.     -1, -1,             /* DetailPen, BlockPen */
  135.     MENUPICK | MOUSEBUTTONS | GADGETUP | GADGETDOWN | MOUSEMOVE |
  136.     CLOSEWINDOW | REFRESHWINDOW | INTUITICKS, /* IDCMPFlags */
  137.     ACTIVATE | WINDOWDRAG | WINDOWSIZING | WINDOWDEPTH | WINDOWCLOSE |
  138.     SIMPLE_REFRESH,    /* Flags */
  139.     NULL,        /* FirstGadget */
  140.     NULL,        /* CheckMark */
  141.     "Fancy GadTools Demo",    /* Title */
  142.     NULL,        /* Screen */
  143.     NULL,        /* BitMap */    
  144.     50, 50,    /* MinWidth, MinHeight */
  145.     640, 200,    /* MaxWidth, MaxHeight */
  146.     WBENCHSCREEN,    /* Type */
  147. };
  148.  
  149. struct TextAttr Topaz80 =
  150. {
  151.     "topaz.font",    /* Name */
  152.     8,            /* YSize */
  153.     0,            /* Style */
  154.     0,            /* Flags */
  155. };
  156.  
  157. /*------------------------------------------------------------------------*/
  158.  
  159. STRPTR MonthLabels[] =
  160. {
  161.     "January",
  162.     "February",
  163.     "March",
  164.     "April",
  165.     "May",
  166.     "June",
  167.     "July",
  168.     "August",
  169.     "September",
  170.     "October",
  171.     "November",
  172.     "December",
  173.     NULL,
  174. };
  175.  
  176. STRPTR DayLabels[] =
  177. {
  178.     "Monday",
  179.     "Tuesday",
  180.     "Wednesday",
  181.     "Thursday",
  182.     "Friday",
  183.     "Saturday",
  184.     "Sunday",
  185.     NULL,
  186. };
  187.  
  188. struct List lh;
  189.  
  190. /*------------------------------------------------------------------------*/
  191.  
  192. /* These are all the things to be allocated/opened, and later
  193.  * freed/closed:
  194.  */
  195.  
  196. struct GfxBase *GfxBase = NULL;
  197. struct IntuitionBase *IntuitionBase = NULL;
  198. struct Library *GadToolsBase = NULL;
  199. struct TextFont *font = NULL;
  200. struct Screen *mysc = NULL;
  201. struct Remember *RKey = NULL;
  202. struct Gadget *glist = NULL;
  203. struct Menu *menu = NULL;
  204. struct Window *mywin = NULL;
  205. void *vi = NULL;
  206.  
  207. /*------------------------------------------------------------------------*/
  208.  
  209. BOOL terminated;
  210.  
  211. /*------------------------------------------------------------------------*/
  212.  
  213. /* We need the following information about individual gadgets to
  214.  * demonstrate our ability to manipulate them with the GT_SetGadgetAttrs()
  215.  * function:
  216.  */
  217.  
  218. WORD sliderlevel = 7;
  219. WORD incr = 1;
  220. struct Gadget *integergad, *mxgad, *checkgad, *slidergad, *cyclegad,
  221.     *lvgad, *stringgad;
  222. BOOL foochecked = TRUE;
  223. BOOL connected = FALSE;
  224.  
  225. #define SLIDER_MIN    0
  226. #define SLIDER_MAX    49
  227.  
  228. /*------------------------------------------------------------------------*/
  229.  
  230. int main(void)
  231. {
  232.     struct IntuiMessage *imsg;
  233.     struct Gadget *gad;
  234.     ULONG imsgClass;
  235.     UWORD imsgCode;
  236.     UWORD topborder;
  237.  
  238.     terminated = FALSE;
  239.  
  240.     /* Open all libraries: */
  241.  
  242.     if (!(GfxBase = (struct GfxBase *)
  243.     OpenLibrary("graphics.library", 36L)))
  244.     bail_out(20, "Requires V36 graphics.library");
  245.  
  246.     if (!(IntuitionBase = (struct IntuitionBase *)
  247.     OpenLibrary("intuition.library", 36L)))
  248.     bail_out(20, "Requires V36 intuition.library");
  249.  
  250.     if (!(GadToolsBase = OpenLibrary("gadtools.library", 36L)))
  251.     bail_out(20, "Requires V36 gadtools.library");
  252.  
  253.     /* Open topaz 8 font: */
  254.  
  255.     if (!(font = OpenFont(&Topaz80)))
  256.     bail_out(20, "Failed to open font");
  257.  
  258.     if (!(mysc = LockPubScreen(NULL)))
  259.     bail_out(20, "Couldn't lock default public screen");
  260.  
  261.     if (!(vi = GetVisualInfo(mysc,
  262.     TAG_DONE)))
  263.     bail_out(20, "GetVisualInfo() failed");
  264.  
  265.     topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
  266.  
  267.     /* Build and layout menus: */
  268.     if (!(menu = CreateMenus(mynewmenu,
  269.     GTMN_FrontPen, 0,
  270.     TAG_DONE)))
  271.     bail_out(20, "CreateMenus() failed");
  272.  
  273.     if (!LayoutMenus(menu, vi,
  274.     TAG_DONE))
  275.     bail_out(20, "LayoutMenus() failed");
  276.  
  277.     if (!CreateAllGadgets(&glist, vi, topborder))
  278.     {
  279.     bail_out(20, "CreateAllGadgets() failed");
  280.     }
  281.  
  282.     /* I could equally well use the {WA_Gadgets, glist} TagItem */
  283.     mynewwin.FirstGadget = glist;
  284.  
  285.     /* I've actually put the inner-height in mynewwin.Height, so
  286.      * I'll override that value with a W_INNERHEIGHT:
  287.      */
  288.     /* Open the window: */
  289.     if (!(mywin = OpenWindowTags(&mynewwin,
  290.     WA_InnerHeight, mynewwin.Height,
  291.     WA_AutoAdjust, TRUE,
  292.     WA_PubScreen, mysc,
  293.     TAG_DONE)))
  294.     bail_out(20, "OpenWindow() failed");
  295.  
  296.     /* After window is open, we must call this GadTools refresh
  297.      * function.
  298.      */
  299.     GT_RefreshWindow(mywin, NULL);
  300.  
  301.     SetMenuStrip(mywin, menu);
  302.  
  303.     while (!terminated)
  304.     {
  305.     Wait (1 << mywin->UserPort->mp_SigBit);
  306.     /* GT_GetIMsg() returns a cooked-up IntuiMessage with
  307.      * more friendly information for complex gadget classes.  Use
  308.      * it wherever you get IntuiMessages:
  309.      */
  310.     while ((!terminated) && (imsg = GT_GetIMsg(mywin->UserPort)))
  311.     {
  312.         imsgClass = imsg->Class;
  313.         imsgCode = imsg->Code;
  314.         /* Presuming a gadget, of course, but no harm... */
  315.         gad = (struct Gadget *)imsg->IAddress;
  316.         /* Use the toolkit message-replying function here... */
  317.         GT_ReplyIMsg(imsg);
  318.         switch (imsgClass)
  319.         {
  320.         case MENUPICK:
  321.             terminated = HandleMenuEvent(imsgCode);
  322.             break;
  323.  
  324.         case MOUSEMOVE:
  325.             terminated = HandleMouseMove(gad, imsgCode);
  326.             break;
  327.  
  328.         case GADGETUP:
  329.             printf("GADGETUP.  ");
  330.             terminated = HandleGadgetEvent(gad, imsgCode);
  331.             break;
  332.  
  333.         case GADGETDOWN:
  334.             printf("GADGETDOWN.  ");
  335.             terminated = HandleGadgetEvent(gad, imsgCode);
  336.             break;
  337.  
  338.         case CLOSEWINDOW:
  339.             printf("CLOSEWINDOW.\n");
  340.             terminated = TRUE;
  341.             break;
  342.  
  343.         case REFRESHWINDOW:
  344.             printf("REFRESHWINDOW.\n");
  345.             /* You must use GT_BeginRefresh() where you would
  346.              * normally have your first BeginRefresh()
  347.              */
  348.             GT_BeginRefresh(mywin);
  349.             GT_EndRefresh(mywin, TRUE);
  350.             break;
  351.         }
  352.     }
  353.     }
  354.     bail_out(0, NULL);
  355. return 0;
  356. }
  357.  
  358. /*------------------------------------------------------------------------*/
  359.  
  360. /*/ bail_out()
  361.  *
  362.  * Function to close down or free any opened or allocated stuff, and then
  363.  * exit.
  364.  *
  365.  */
  366.  
  367. void bail_out( int code, STRPTR error)
  368. {
  369.  
  370.     if (mywin)
  371.     {
  372.     ClearMenuStrip(mywin);
  373.     CloseWindow(mywin);
  374.     }
  375.  
  376.     /* None of these three calls mind a NULL parameter, so it's not
  377.      * necessary to check for non-NULL before calling.  If we do that,
  378.      * we must be certain that the OpenLibrary() of GadTools succeeded,
  379.      * or else we would be jumping into outer space:
  380.      */
  381.     if (GadToolsBase)
  382.     {
  383.     FreeMenus(menu);
  384.     FreeVisualInfo(vi);
  385.     FreeGadgets(glist);
  386.     CloseLibrary(GadToolsBase);
  387.     }
  388.  
  389.     if (mysc)
  390.     {
  391.     UnlockPubScreen(NULL, mysc);
  392.     }
  393.  
  394.     if (RKey)
  395.     {
  396.     FreeRemember(&RKey, TRUE);
  397.     }
  398.  
  399.     if (font)
  400.     {
  401.         CloseFont(font);
  402.     }
  403.  
  404.  
  405.     if (IntuitionBase)
  406.     {
  407.     CloseLibrary( ( struct Library *)IntuitionBase);
  408.     }
  409.  
  410.     if (GfxBase)
  411.     {
  412.     CloseLibrary( ( struct Library *)GfxBase);
  413.     }
  414.  
  415.     if (error)
  416.     {
  417.     printf("Error: %s\n", error);
  418.     }
  419.     exit(code);
  420. }
  421.  
  422.  
  423. /*------------------------------------------------------------------------*/
  424.  
  425. /*/ HandleMenuEvent()
  426.  *
  427.  * This function handles IntuiMessage events of type MENUPICK.  It
  428.  * demonstrates the two most common uses for the Menu UserData field
  429.  * provided only by CreateMenus(), namely a place to store
  430.  * pointers-to-functions (for menu # 0), or as a place to store a
  431.  * constant to switch on (for menu # 1).
  432.  *
  433.  */
  434.  
  435. BOOL HandleMenuEvent( UWORD code)
  436. {
  437.     struct MenuItem *item;
  438.     BOOL terminated = FALSE;
  439.  
  440.     printf("MENUPICK.  ");
  441.     /* Get all menu events including NextEvents until a terminating
  442.      * selection is made (such as Quit)
  443.      */
  444.     while ((code != MENUNULL) && (!terminated))
  445.     {
  446.     item = ItemAddress(menu, code);
  447.     if (MENUNUM(code) != 0)
  448.     {
  449.         /* I made menu #1's UserData into constants to switch on.
  450.          * Note that in C, switch demands an "int":
  451.          */
  452.         switch ( (int)MENU_USERDATA(item) )
  453.         {
  454.             case MENU_FOO_SET:
  455.             printf("Foo Set.  ");
  456.             /* Set the Foo checkbox */
  457.             GT_SetGadgetAttrs(checkgad, mywin, NULL,
  458.             GTCB_Checked, TRUE,
  459.             TAG_DONE);
  460.             foochecked = TRUE;
  461.             break;
  462.  
  463.         case MENU_FOO_CLEAR:
  464.             printf("Foo Clear.  ");
  465.             /* Clear the Foo checkbox */
  466.             GT_SetGadgetAttrs(checkgad, mywin, NULL,
  467.             GTCB_Checked, FALSE,
  468.             TAG_DONE);
  469.             foochecked = FALSE;
  470.             break;
  471.  
  472.         case MENU_FOO_TOGGLE:
  473.             printf("Foo Toggle.  ");
  474.             /* Toggle the foo checkbox */
  475.             foochecked = !foochecked;
  476.             GT_SetGadgetAttrs(checkgad, mywin, NULL,
  477.             GTCB_Checked, foochecked,
  478.             TAG_DONE);
  479.             break;
  480.  
  481.         case MENU_INCREASE:
  482.         printf("Slider Increase.  ");
  483.             if (sliderlevel < SLIDER_MAX)
  484.             {
  485.             sliderlevel += incr;
  486.             if (sliderlevel > SLIDER_MAX)
  487.                 sliderlevel = SLIDER_MAX;
  488.             /* Move the slider */
  489.             GT_SetGadgetAttrs(slidergad, mywin, NULL,
  490.                 GTSL_Level, sliderlevel,
  491.                 TAG_DONE);
  492.             }
  493.             break;
  494.  
  495.         case MENU_DECREASE:
  496.             printf("Slider Decrease.  ");
  497.             if (sliderlevel > SLIDER_MIN)
  498.             {
  499.             sliderlevel -= incr;
  500.             if (sliderlevel < SLIDER_MIN)
  501.                 sliderlevel = SLIDER_MIN;
  502.             /* Move the slider */
  503.             GT_SetGadgetAttrs(slidergad, mywin, NULL,
  504.                 GTSL_Level, sliderlevel,
  505.                 TAG_DONE);
  506.             }
  507.             break;
  508.  
  509.         case MENU_BY1:
  510.             printf("Change Slider By 1's.  ");
  511.             incr = 1;
  512.             break;
  513.  
  514.         case MENU_BY5:
  515.             printf("Change Slider By 5's.  ");
  516.             incr = 5;
  517.             break;
  518.  
  519.         case MENU_BY10:
  520.             printf("Change Slider By 10's.  ");
  521.             incr = 10;
  522.             break;
  523.  
  524.         case MENU_CONNECTED:
  525.             printf("MX Gadgets Connected?");
  526.             connected = (item->Flags & CHECKED);
  527.             break;
  528.  
  529.         case MENU_NEVER:
  530.             /* As this item is disabled, this switch can
  531.              * never happen
  532.              */
  533.             printf("Can't Get Me!  ");
  534.             break;
  535.         }
  536.     }
  537.     /* There may be more menu selections to process */
  538.     code = item->NextSelect;
  539.     }
  540.     printf("\n");
  541.  
  542.     return(terminated);
  543. }
  544.  
  545.  
  546. /*------------------------------------------------------------------------*/
  547.  
  548. /*/ OpenFunc()
  549.  *
  550.  * Function that prints out a message and returns.
  551.  *
  552.  */
  553.  
  554. BOOL OpenFunc( UWORD code)
  555. {
  556.     printf("Called Open Function.  ");
  557.     return(FALSE);
  558. }
  559.  
  560. /*/ SaveFunc()
  561.  *
  562.  * Function that prints out a message and returns.
  563.  *
  564.  */
  565.  
  566. BOOL SaveFunc( UWORD code)
  567. {
  568.     printf("Called Save Function.  ");
  569.     return(FALSE);
  570. }
  571.  
  572. /*/ SaveAsFunc()
  573.  *
  574.  * Function that prints out a message and returns.
  575.  *
  576.  */
  577.  
  578. BOOL SaveAsFunc( UWORD code)
  579. {
  580.     printf("Called SaveAs Function.  ");
  581.     return(FALSE);
  582. }
  583.  
  584. /*/ PrintFunc()
  585.  *
  586.  * Function that can tell which sub-item was selected, and print
  587.  * different messages accordingly.
  588.  *
  589.  */
  590.  
  591. BOOL PrintFunc( UWORD code)
  592. {
  593.     printf("Called Print Function - ");
  594.     if (SUBNUM(code) == 0)
  595.     printf("NLQ.  ");
  596.     else
  597.     printf("Draft.  ");
  598.     return(FALSE);
  599. }
  600.  
  601. /*/ QuitFunc()
  602.  *
  603.  * Function that prints out a message and returns TRUE, which, by our
  604.  * convention, signifies an action which should terminate the program.
  605.  *
  606.  */
  607.  
  608. BOOL QuitFunc( UWORD code)
  609. {
  610.     printf("Called Quit Function.  ");
  611.     return(TRUE);
  612. }
  613.  
  614. /*------------------------------------------------------------------------*/
  615.  
  616. /*/ HandleMouseMove()
  617.  *
  618.  * Function to handle MOUSEMOVE events.  For toolkit gadgets, such events
  619.  * have a pointer to the gadget in the IAddress field of the IntuiMessage.
  620.  * (This is not true for MOUSEMOVEs from Intuition gadgets in general).
  621.  * This function could have been folded into HandleGadgetEvent().
  622.  *
  623.  */
  624.  
  625. BOOL HandleMouseMove( struct Gadget *gad,  UWORD code)
  626. {
  627.     BOOL terminated = FALSE;
  628.  
  629.     printf("MOUSEMOVE.  ");
  630.     switch (gad->GadgetID)
  631.     {
  632.     case GAD_SLIDER:
  633.         /* Slider level is in code.  Note
  634.          * that level is a SIGNED word, while Code
  635.          * is a UWORD.  Casting it back to WORD
  636.          * gives you back the sign.  I know it's
  637.          * a bit ugly - I'll think about other
  638.          * ways.
  639.          */
  640.         printf("Slider Level: %d\n", (WORD)code);
  641.         sliderlevel = (WORD)code;
  642.         break;
  643.     case GAD_SCROLLER:
  644.         /* Scroller level is in code: */
  645.         printf("Scroller Level: %d\n", code);
  646.         break;
  647.     }
  648.     return(terminated);
  649. }
  650.  
  651.  
  652. /*------------------------------------------------------------------------*/
  653.  
  654. /*/ HandleGadgetEvent()
  655.  *
  656.  * Function to handle a GADGETUP or GADGETDOWN event.  For toolkit gadgets,
  657.  * it is possible to use this function to handle MOUSEMOVEs as well, with
  658.  * little or no work.
  659.  *
  660.  */
  661.  
  662. BOOL HandleGadgetEvent( struct Gadget *gad, UWORD code)
  663. {
  664.     BOOL terminated = FALSE;
  665.  
  666.     switch (gad->GadgetID)
  667.     {
  668.     case GAD_BUTTON:
  669.         /* Buttons always report GADGETUP's, nothing
  670.          * fancy or different here
  671.          */
  672.         printf("Button 'ClickMe'.\n");
  673.         /* Demonstrating the ability to change the
  674.          * displayed value in an integer gadget, we do
  675.          * this on every click of this button:
  676.          */
  677.         GT_SetGadgetAttrs(integergad, mywin, NULL,
  678.         GTIN_Number, 271828,
  679.         TAG_DONE);
  680.         break;
  681.  
  682.     case GAD_INTEGER:
  683.         /* String/Integer gadgets report GADGETUP's,
  684.          * fancy or different here:
  685.          */
  686.         printf("Integer gadget: %ld.\n",
  687.         ((struct StringInfo *)gad->SpecialInfo)->LongInt);
  688.         break;
  689.  
  690.     case GAD_CHECKBOX1:
  691.         /* Checkboxes report GADGETUP's, nothing
  692.          * fancy or different here:
  693.          */
  694.         printf("Foo is ");
  695.         if (!(gad->Flags & SELECTED))
  696.         {
  697.         foochecked = FALSE;
  698.         printf("not ");
  699.         }
  700.         else
  701.         {
  702.         foochecked = TRUE;
  703.         }
  704.         printf("selected.\n");
  705.         break;
  706.  
  707.     case GAD_CHECKBOX2:
  708.         printf("Bar is ");
  709.         if (!(gad->Flags & SELECTED))
  710.         printf("not ");
  711.         printf("selected.\n");
  712.         break;
  713.  
  714.     case GAD_CYCLE:
  715.         /* Cycle gadgets report the number (0..n-1)
  716.          * of the new active label in the code
  717.          * field:
  718.          */
  719.         printf("Cycle: '%s'.\n", MonthLabels[code]);
  720.         /* Here we demonstrate the ability to set
  721.          * the active choice in a set of Mutually
  722.          * Exclusive gadgets:
  723.          */
  724.         if ((connected) && (code < 7))
  725.         GT_SetGadgetAttrs(mxgad, mywin, NULL,
  726.             GTMX_Active, code,
  727.             TAG_DONE);
  728.         break;
  729.  
  730.     case GAD_MX:
  731.         /* MX gadgets report the number (0..n-1)
  732.          * of the new active label in the code
  733.          * field:
  734.          */
  735.         printf("MX: Day-of-week '%s'\n", DayLabels[code]);
  736.         /* Here we demonstrate the ability to set
  737.          * the active choice in an Cycle gadget:
  738.          */
  739.         if (connected)
  740.         GT_SetGadgetAttrs(cyclegad, mywin, NULL,
  741.             GTCY_Active, code,
  742.             TAG_DONE);
  743.         break;
  744.  
  745.     case GAD_SLIDER:
  746.         /* Slider level is in code.  Note that
  747.          * level is a signed WORD, while Code is a
  748.          * UWORD.  Casting it back to WORD gives
  749.          * you back the sign.
  750.          */
  751.         printf("Slider Level: %d\n", (WORD)code);
  752.         sliderlevel = (WORD)code;
  753.         if ((sliderlevel >= 0) && (sliderlevel <= 12))
  754.         {
  755.         GT_SetGadgetAttrs(lvgad, mywin, NULL,
  756.             GTLV_Selected, code,
  757.             TAG_DONE);
  758.         }
  759.         break;
  760.  
  761.     case GAD_SCROLLER:
  762.         /* Scroller level is in code: */
  763.         printf("Scroller Level: %d\n", code);
  764.         break;
  765.  
  766.     case GAD_PALETTE:
  767.         /* Palette's color is in code: */
  768.         printf("Palette:  selected color %d\n", code);
  769.         break;
  770.  
  771.     case GAD_LVSTRING:
  772.         /* String gadgets report GADGETUP's, nothing
  773.          * fancy or different here:
  774.          */
  775.         printf("LVString: '%s'.\n",
  776.         ((struct StringInfo *)gad->SpecialInfo)->Buffer);
  777.         break;
  778.  
  779.     case GAD_LISTVIEW:
  780.         /* ListView ordinal count is in code: */
  781.         printf("ListView: clicked on '%s'\n", MonthLabels[code]);
  782.         break;
  783.     }
  784.     return(terminated);
  785. }
  786.  
  787.  
  788. /*------------------------------------------------------------------------*/
  789.  
  790. /*/ CreateAllGadgets()
  791.  *
  792.  * Here is where all the initialization and creation of toolkit gadgets
  793.  * take place.  This function requires a pointer to a NULL-initialized
  794.  * gadget list pointer.  It returns a pointer to the last created gadget,
  795.  * which can be checked for success/failure.
  796.  *
  797.  */
  798.  
  799. struct Gadget *CreateAllGadgets( struct Gadget **glistptr, void *vi, UWORD topborder)
  800. {
  801.     struct NewGadget ng;
  802.  
  803.     struct Gadget *gad;
  804.  
  805.     WORD index;
  806.     struct Node *node;
  807.  
  808.     /* All the gadget creation calls accept a pointer to the previous
  809.      * gadget, and link the new gadget to that gadget's NextGadget field.
  810.      * Also, they exit gracefully, returning NULL, if any previous gadget
  811.      * was NULL.  This limits the amount of checking for failure that
  812.      * is needed.  You only need to check before you tweak any gadget
  813.      * structure or use any of its fields, and finally once at the end,
  814.      * before you add the gadgets.
  815.      */
  816.  
  817.     /* We obligingly perform the following operation, required of
  818.      * any program that uses the toolkit.  It gives the toolkit a
  819.      * place to stuff context data:
  820.      */
  821.     gad = CreateContext(glistptr);
  822.     /* Fill out a NewGadget structure to describe the gadget we want
  823.      * to create:
  824.      */
  825.     /* Create a centered label (read-only) */
  826.     ng.ng_LeftEdge = 300;
  827.     ng.ng_TopEdge = 4+topborder;
  828.     ng.ng_Width = 0;
  829.     ng.ng_Height = 8;
  830.     ng.ng_GadgetText = "Gadget Toolkit Test";
  831.     ng.ng_TextAttr = &Topaz80;
  832.     ng.ng_GadgetID = 0;
  833.     ng.ng_Flags = PLACETEXT_IN | NG_HIGHLABEL;
  834.     ng.ng_VisualInfo = vi;
  835.     /* Text-Only gadget with GadgetText but no other text: */
  836.     gad = CreateGadget(TEXT_KIND, gad, &ng,
  837.     TAG_DONE);
  838.  
  839.     /* Since the NewGadget structure is unmodified by any of the
  840.      * CreateGadget() calls, we need only change those fields which
  841.      * are different.
  842.      */
  843.     ng.ng_LeftEdge = 10;
  844.     ng.ng_TopEdge = 19+topborder;
  845.     ng.ng_Width = 100;
  846.     ng.ng_Height = 12;
  847.     ng.ng_GadgetText = "ClickMe";
  848.     ng.ng_GadgetID = GAD_BUTTON;
  849.     ng.ng_Flags = 0;
  850.     gad = CreateGadget(BUTTON_KIND, gad, &ng,
  851.     TAG_DONE);
  852.  
  853.     ng.ng_LeftEdge = 400;
  854.     ng.ng_Height = 14;
  855.     ng.ng_GadgetText = "Month:";
  856.     ng.ng_GadgetID = GAD_CYCLE;
  857.     ng.ng_Flags = NG_HIGHLABEL;
  858.     cyclegad = gad = CreateGadget(CYCLE_KIND, gad, &ng,
  859.     GTCY_Labels, MonthLabels,
  860.     GTCY_Active, 3,
  861.     TAG_DONE);
  862.  
  863.     ng.ng_TopEdge = 69+topborder;
  864.     ng.ng_LeftEdge = 70;
  865.     ng.ng_GadgetText = "Foo:";
  866.     ng.ng_GadgetID = GAD_CHECKBOX1;
  867.     checkgad = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
  868.     GTCB_Checked, foochecked,
  869.     TAG_DONE);
  870.  
  871.     if (gad)
  872.     ng.ng_TopEdge += gad->Height;
  873.  
  874.     ng.ng_GadgetText = "Bar:";
  875.     ng.ng_GadgetID = GAD_CHECKBOX2;
  876.     gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
  877.     GTCB_Checked, FALSE,
  878.     TAG_DONE);
  879.  
  880.     ng.ng_TopEdge = 99+topborder;
  881.     ng.ng_Width = 200;
  882.     ng.ng_GadgetText = "Type:";
  883.     ng.ng_GadgetID = GAD_INTEGER;
  884.     integergad = gad = CreateGadget(INTEGER_KIND, gad, &ng,
  885.     GTIN_Number, 54321,
  886.     GTIN_MaxChars, 10,
  887.     TAG_DONE);
  888.  
  889.     ng.ng_TopEdge = 117+topborder;
  890.     ng.ng_Height = 12;
  891.     ng.ng_GadgetText = "L:   ";
  892.     ng.ng_GadgetID = GAD_SLIDER;
  893.     slidergad = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  894.     GTSL_Min, SLIDER_MIN,
  895.     GTSL_Max, SLIDER_MAX,
  896.     GTSL_Level, sliderlevel,
  897.     GTSL_LevelFormat, "%2ld",
  898.     GTSL_LevelPlace, PLACETEXT_LEFT,
  899.     GTSL_MaxLevelLen, 2,
  900.     GA_IMMEDIATE, TRUE,
  901.     GA_RELVERIFY, TRUE,
  902.     TAG_DONE);
  903.  
  904.     ng.ng_TopEdge = 133+topborder;
  905.     ng.ng_GadgetText = "Scroll:";
  906.     ng.ng_GadgetID = GAD_SCROLLER;
  907.     gad = CreateGadget(SCROLLER_KIND, gad, &ng,
  908.     GTSC_Top, 5,
  909.     GTSC_Total, 30,
  910.     GTSC_Visible, 10,
  911.     GTSC_Arrows, 13,
  912.     GA_RELVERIFY, TRUE,
  913.     TAG_DONE);
  914.  
  915.     ng.ng_TopEdge = 149+topborder;
  916.     ng.ng_Height = 8;
  917.     ng.ng_GadgetText = "Number:";
  918.     gad = CreateGadget(NUMBER_KIND, gad, &ng,
  919.     GTNM_Number, 314159,
  920.     TAG_DONE);
  921.  
  922.     ng.ng_LeftEdge = 400;
  923.     ng.ng_GadgetText = "Read:";
  924.     gad = CreateGadget(TEXT_KIND, gad, &ng,
  925.     GTTX_Text, "Read-Only Field!",
  926.     TAG_DONE);
  927.  
  928.     ng.ng_LeftEdge = 470;
  929.     ng.ng_TopEdge = 49+topborder;
  930.     ng.ng_GadgetID = GAD_MX;
  931.     mxgad = gad = CreateGadget(MX_KIND, gad, &ng,
  932.     GTMX_Labels, DayLabels,
  933.     GTMX_Active, 0,
  934.     GTMX_Spacing, 4,
  935.     TAG_DONE);
  936.  
  937.     NewList(&lh);
  938.     index = 0;
  939.     while (MonthLabels[index])
  940.     {
  941.     node = (struct Node *)AllocRemember(&RKey, sizeof(struct Node), MEMF_CLEAR);
  942.     node->ln_Name = MonthLabels[index++];
  943.      AddTail(&lh, node);
  944.     }
  945.  
  946.     /* Here's a string gadget to be attached to the listview: */
  947.     ng.ng_Width = 150;
  948.     ng.ng_Height = 14;
  949.     ng.ng_GadgetText = NULL;
  950.     ng.ng_GadgetID = GAD_LVSTRING;
  951.     stringgad = gad = CreateGadget(STRING_KIND, gad, &ng,
  952.     GTST_MaxChars, 50,
  953.     TAG_DONE);
  954.  
  955.     ng.ng_LeftEdge = 130;
  956.     ng.ng_TopEdge = 19+topborder;
  957.     ng.ng_Width = 150;
  958.     ng.ng_Height = 57;
  959.     ng.ng_GadgetText = "Months:";
  960.     ng.ng_GadgetID = GAD_LISTVIEW;
  961.     ng.ng_Flags = NG_HIGHLABEL|PLACETEXT_LEFT;
  962.     lvgad = gad = CreateGadget(LISTVIEW_KIND, gad, &ng,
  963.     GTLV_Labels, &lh,
  964.     GTLV_Top, 1,
  965.     LAYOUTA_SPACING, 1,
  966.     GTLV_ShowSelected, stringgad,
  967.     GTLV_Selected, 3,
  968.     GTLV_ScrollWidth, 18,
  969.     TAG_DONE);
  970.  
  971.     ng.ng_LeftEdge = 320;
  972.     ng.ng_TopEdge = 49+topborder;
  973.     ng.ng_Width = 40;
  974.     ng.ng_Height = 75;
  975.     ng.ng_GadgetText = "Colors";
  976.     ng.ng_GadgetID = GAD_PALETTE;
  977.     ng.ng_Flags = NG_HIGHLABEL;
  978.  
  979.     gad = CreateGadget(PALETTE_KIND, gad, &ng,
  980.     GTPA_Depth, mysc->BitMap.Depth,
  981.     GTPA_Color, 1,
  982.     GTPA_ColorOffset, 0,
  983.     GTPA_IndicatorHeight, 15,
  984.     TAG_DONE);
  985.  
  986.     return(gad);
  987. }
  988.  
  989. /*------------------------------------------------------------------------*/
  990.