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