home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 91 / af091a.adf / af91a3.lzx / prgs / Library / GTools.b < prev    next >
Text File  |  2018-11-21  |  6KB  |  229 lines

  1. /*
  2. ** An example of GadTools library usage.
  3. **
  4. ** Adapted from RKM: Libraries (1992), p 383-385 
  5. ** and NDK example gadget1.c, by David Benn, 
  6. ** 18th March, 3rd April, 7th,8th June, 7th October 1995.
  7. **
  8. ** Changed the IDCMP flags, they where the old ones
  9. ** Also changed to use the functions headers.
  10. ** Finaly I changed the tags to use my tagmacros.
  11. ** Date 15-Oct-95      Nils Sjoholm
  12. **
  13. */
  14.  
  15. #include <libraries/gadtools.h>
  16. #include <ace/acedef.h>
  17.  
  18. /* Now we need some functions */
  19. #include <funcs/intuition_funcs.h>
  20. #include <funcs/gadtools_funcs.h>
  21. #include <funcs/utility_funcs.h>
  22. #include <funcs/exec_funcs.h>
  23.  
  24. /*
  25. ** Constant definitions.
  26. */
  27. CONST GAD_SLIDER = 1
  28. CONST GAD_STRING = 2
  29. CONST GAD_BUTTON = 3
  30.  
  31. /* Range for the slider */
  32.  
  33. CONST SLIDER_MIN = 1
  34. CONST SLIDER_MAX = 20
  35.  
  36. /*
  37. ** Forward SUB declarations.
  38. */
  39. DECLARE SUB process_window_events(ADDRESS wdw)
  40. DECLARE SUB gadtools_window
  41. DECLARE SUB handle_gadget(ADDRESS msg)
  42. DECLARE SUB do_window_refresh(ADDRESS wdw)
  43.  
  44. /*
  45. ** Shared library function declarations.
  46. */
  47. LIBRARY "exec.library"
  48. LIBRARY "utility.library"
  49. LIBRARY "intuition.library"
  50. LIBRARY "gadtools.library"
  51.  
  52. /*
  53. ** Global variables.
  54. */
  55. DECLARE STRUCT TextAttr gadFont
  56. gadFont->ta_Name  = SADD("topaz.font")
  57. gadFont->ta_YSize = 8
  58. gadFont->ta_Style = 0
  59. gadFont->ta_Flags = 0
  60.  
  61. SHORTINT slider_level : slider_level = 5
  62.  
  63. /*
  64. ** Subprogram definitions.
  65. */
  66. SUB gadtools_window
  67. /*
  68. ** Prepare for using GadTools, set up gadgets
  69. ** and open window.
  70. */
  71. SHARED slider_level, gadFont
  72.  
  73. DECLARE STRUCT _Screen *mysc
  74. DECLARE STRUCT TextAttr *scrFont
  75. DECLARE STRUCT _Window *mywin
  76. DECLARE STRUCT _Gadget *glist, *gad
  77. DECLARE STRUCT NewGadget ng
  78. DECLARE STRUCT TagItem *gadTags, *tag
  79. DIM ADDRESS radioButtonStrings(3)
  80. ADDRESS vi
  81.  
  82.   glist = NULL
  83.   
  84.   mysc = SCREEN(1)
  85.   IF mysc <> NULL THEN
  86.     vi = GetVisualInfoA(mysc, NULL)
  87.     IF vi <> NULL THEN
  88.       /*  GadTools always requires this step to be taken. */
  89.       gad = CreateContext(@glist)
  90.  
  91.     /* All the gadget creation calls accept a pointer to the previous
  92.      * gadget, and link the new gadget to that gadget's NextGadget field.
  93.      * Also, they exit gracefully, returning NULL, if any previous gadget
  94.      * was NULL.  This limits the amount of checking for failure that
  95.      * is needed.  You only need to check before you tweak any gadget
  96.      * structure or use any of its fields, and finally once at the end,
  97.      * before you add the gadgets. */
  98.  
  99.     ng->ng_LeftEdge = 100
  100.     ng->ng_TopEdge = 20
  101.     ng->ng_Width = 200
  102.     ng->ng_Height = 12
  103.     ng->ng_GadgetText = SADD("Speed:   ")
  104.     ng->ng_TextAttr = gadFont
  105.     ng->ng_VisualInfo = vi
  106.     ng->ng_GadgetID = GAD_SLIDER
  107.  
  108.     SetUpTags(gadTags,6)
  109.     IF gadTags <> NULL THEN
  110.         tag = gadTags
  111.         SetTag(GTSL_Min,SLIDER_MIN)
  112.         SetTag(GTSL_Max,SLIDER_MAX)
  113.         SetTag(GTSL_Level,slider_level)
  114.         SetTag(GTSL_LevelFormat,SADD("%2ld"))
  115.         SetTag(GTSL_MaxLevelLen,2)
  116.         SetTagEnd
  117.       END IF
  118.       gad = CreateGadgetA(SLIDER_KIND, gad, ng, gadTags)
  119.       slidergad = gad
  120.       FreeTagItems(gadTags) 
  121.  
  122.     ng->ng_TopEdge = 40+topborder
  123.     ng->ng_Height = 14
  124.     ng->ng_GadgetText = SADD("Type Here:")
  125.     ng->ng_GadgetID = GAD_STRING
  126.  
  127.     SetUpTags(GadTags,3)
  128.     IF gadTags <> NULL THEN
  129.        tag = gadTags
  130.        SetTag(GTST_String,SADD("Hello World!"))
  131.        SetTag(GTST_MaxChars,50)
  132.        SetTagEnd
  133.     END IF
  134.     gad = CreateGadgetA(STRING_KIND, gad, ng, gadTags)
  135.     FreeTagItems(gadTags)
  136.  
  137.     ng->ng_LeftEdge = ng->ng_LeftEdge + 50
  138.     ng->ng_TopEdge = 60+topborder
  139.     ng->ng_Width = 100
  140.     ng->ng_Height = 12
  141.     ng->ng_GadgetText = SADD("Click Here")
  142.     ng->ng_GadgetID = GAD_BUTTON
  143.     ng->ng_Flags = NULL
  144.     gad = CreateGadgetA(BUTTON_KIND, gad, ng, NULL)
  145.       
  146.       /*  Open window, render gadgets and enter event-handling loop. */ 
  147.       IF gad <> NULL THEN
  148.     WINDOW 1,"GadTools Gadget Demo",(0,0)-(400,100),30
  149.     IF ERR = 0 THEN
  150.       mywin = WINDOW(7)
  151.  
  152.       ModifyIDCMP(mywin, mywin->IDCMPFlags OR SLIDERIDCMP)
  153.  
  154.       AddGList(mywin,glist,0,-1,NULL)
  155.       RefreshGadgets(glist,mywin,NULL)
  156.       GT_RefreshWindow(mywin,NULL)
  157.       process_window_events(mywin)
  158.       WINDOW CLOSE 1
  159.         END IF
  160.       END IF
  161.     
  162.       /*  FreeGadgets() must be called after the context has been
  163.           created. It does nothing if glist is NULL. */
  164.       FreeGadgets(glist)
  165.       FreeVisualInfo(vi)
  166.     END IF        
  167.   END IF
  168. END SUB
  169.  
  170. SUB process_window_events(ADDRESS mywinaddr)
  171. /*
  172. ** Standard message handling loop with GadTools message
  173. ** handling functions used (GT_GetIMsg() and GT_ReplyIMsg()).
  174. */
  175. DECLARE STRUCT _Window *mywin : mywin = mywinaddr
  176. DECLARE STRUCT IntuiMessage *imsg
  177. DECLARE STRUCT _Gadget *gad
  178. LONGINT terminated, class
  179.  
  180.   WHILE NOT terminated
  181.     WaitPort(mywin->UserPort)
  182.  
  183.     /*  Use GT_GetIMsg() and GT_ReplyIMsg() for handling
  184.         IntuiMessages with GadTools gadgets. */
  185.     REPEAT
  186.       imsg = GT_GetIMsg(mywin->UserPort)
  187.       class = imsg->Class
  188.       CASE
  189.     /*  BUTTON, STRING GADGET, slider? (IDCMP_MOUSEMOVE used FOR slider here;
  190.         results in more messages; could use IDCMP_GADGETUP/DOWN but need
  191.         GA_RelVerify/GA_Immediate - see scroller.b example program). */
  192.     class = IDCMP_GADGETUP OR class = IDCMP_GADGETDOWN OR ~
  193.     class = IDCMP_MOUSEMOVE : handle_gadget(imsg)
  194.         /*  Has window close gadget been clicked? */
  195.     class = IDCMP_CLOSEWINDOW : terminated = TRUE
  196.         /*  This handling is REQUIRED with GadTools. */
  197.     class = IDCMP_REFRESHWINDOW : do_window_refresh(mywin)
  198.       END CASE
  199.       GT_ReplyIMsg(imsg)          
  200.     UNTIL terminated OR imsg = NULL
  201.   WEND
  202. END SUB
  203.  
  204. SUB handle_gadget(ADDRESS msg)
  205. DECLARE STRUCT IntuiMessage *imsg
  206. DECLARE STRUCT _Gadget *gad
  207. DECLARE STRUCT StringInfo *info
  208.   imsg = msg
  209.   gad = imsg->IAddress
  210.   info = gad->SpecialInfo
  211.   CASE 
  212.     gad->GadgetID = GAD_SLIDER : MsgBox "Speed: "+STR$(imsg->Code),"OK"
  213.     gad->GadgetID = GAD_STRING : MsgBox CSTR(info->Buffer),"OK"
  214.     gad->GadgetID = GAD_BUTTON : BEEP
  215.   END CASE
  216. END SUB
  217.  
  218. SUB do_window_refresh(ADDRESS wdw)
  219.   GT_BeginRefresh(mywin)
  220.   GT_EndRefresh(mywin,true)
  221. END SUB
  222.  
  223. /*
  224. ** Main program.
  225. */
  226. gadtools_window
  227. LIBRARY CLOSE
  228. END
  229.