home *** CD-ROM | disk | FTP | other *** search
/ AGA Toolkit '97 / The AGA Toolkit '97.iso / programming / gui / gadutil / examples / moreexamples-c / demo.c next >
Encoding:
C/C++ Source or Header  |  1996-09-07  |  11.2 KB  |  385 lines

  1. /*
  2.            project: gadutil.library example demo
  3.             author: Lukasz Szelag
  4.             e-mail: luk@i17linuxa.ists.pwr.wroc.pl
  5.                WWW: http://www.pwr.wroc.pl/amiga/amiuser/luk
  6.                IRC: #amigapl (Luk)
  7. */
  8. /*-----------------------------------------------------------------------*/
  9. /*
  10. Since every C program usually has header files included, so we here include
  11. needed files to satisfy our compiler !
  12. */
  13. #include <proto/exec.h>
  14. #include <proto/intuition.h>
  15. #include <intuition/gadgetclass.h>
  16. #include <proto/gadtools.h>
  17. #include <proto/gadutil.h>          /* the name of the game ! */
  18. /*-----------------------------------------------------------------------*/
  19. /*
  20. It's  very useful to define absolute gadget's position in the window. Note:
  21. it's only for the first gadget - other gadgets may be positioned relatively
  22. each  to other. Also these values are used to compute the right size of the
  23. window  (see  tags WA_InnerWidth and WA_InnerHeight). It means that gadutil
  24. will compute for you the final size of the window !
  25. */
  26. #define LEFT_OFFSET 10
  27. #define TOP_OFFSET  10
  28.  
  29. /* standard gadtools underscore tags */
  30. struct TagItem GT_tags[] =
  31. {
  32.   GT_Underscore, '_',
  33.   TAG_DONE
  34. };
  35.  
  36. /*
  37. The  following  variables  will  be  further  filled  by  gadutil  internal
  38. routines. Aren't ya familar with these yet ? Just refer to gadutil autodocs
  39. and it'll becomes clear at once !
  40. */
  41. LONG farright, farbottom, gad_IDCMP;
  42.  
  43. struct TagItem global_tags[] =
  44. {
  45.   GU_RightExtreme, (ULONG)&farright,
  46.   GU_LowerExtreme, (ULONG)&farbottom,
  47.   GU_MinimumIDCMP, (ULONG)&gad_IDCMP,
  48.   TAG_DONE
  49. };
  50. /*-----------------------------------------------------------------------*/
  51. /*
  52. Here  we've  some hot image data for the IMAGE_KIND gadget - unselected and
  53. selected images !
  54. */
  55. static UWORD __chip image1_data[60] =
  56. {
  57.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3C1F, 0xC1E0, 0x780F,
  58.   0x80F0, 0x780F, 0x80F0, 0xF9CF, 0x9CF8, 0xFDDD, 0xDDF8, 0xFFF8, 0xFFF8,
  59.   0x7FF8, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FE0, 0x3F80, 0x03FF,
  60.   0xFE00, 0x007F, 0xF000,
  61.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3FFF, 0xFFE0, 0x7FFF,
  62.   0xFFF0, 0x7FFF, 0xFFF0, 0xFE3F, 0xE3F8, 0xFE3F, 0xE3F8, 0xFFFF, 0xFFF8,
  63.   0x7FFF, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FFF, 0xFF80, 0x03FF,
  64.   0xFE00, 0x007F, 0xF000
  65. };
  66.  
  67. static UWORD __chip image2_data[60] =
  68. {
  69.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3C1F, 0xC1E0, 0x78EF,
  70.   0x8EF0, 0x78EF, 0x8EF0, 0xF80F, 0x80F8, 0xFC1D, 0xC1F8, 0xFFF8, 0xFFF8,
  71.   0x7FF8, 0xFFF0, 0x7FFF, 0xFFF0, 0x3F9F, 0xCFE0, 0x0FC0, 0x1F80, 0x03FF,
  72.   0xFE00, 0x007F, 0xF000,
  73.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3FFF, 0xFFE0, 0x7F1F,
  74.   0xF1F0, 0x7F1F, 0xF1F0, 0xFFFF, 0xFFF8, 0xFFFF, 0xFFF8, 0xFFFF, 0xFFF8,
  75.   0x7FFF, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FFF, 0xFF80, 0x03FF,
  76.   0xFE00, 0x007F, 0xF000
  77. };
  78.  
  79. struct Image image1 = {0, 0, 29, 15, 2, image1_data, 0x03, 0x00, NULL};
  80. struct Image image2 = {0, 0, 29, 15, 2, image2_data, 0x03, 0x00, NULL};
  81. /*-----------------------------------------------------------------------*/
  82. /*
  83. Here we can define all gadgets ! It's very simple task - you don't need any
  84. GUI  editor  since  gadget's  positions may be specified relatively each to
  85. other !
  86. */
  87.  
  88. /* gadget's names */
  89. #define GDG_BOX1     0
  90. #define GDG_BOX2     1
  91. #define GDG_BOX3     2
  92. #define GDG_BOX4     3
  93. #define GDG_BOX5     4
  94. #define GDG_BOX6     5
  95. #define GDG_DRAWER   6
  96. #define GDG_FILE     7
  97. #define GDG_PROGRESS 8
  98. #define GDG_IMAGE    9
  99.  
  100. struct TagItem box1[] =
  101. {
  102.   GU_GadgetKind,  BEVELBOX_KIND,
  103.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_RIDGE",
  104.   GUBB_Recessed,  TRUE,
  105.   GUBB_FrameType, BFT_RIDGE,
  106.   GUBB_TextColor, 2,
  107.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  108.   GUBB_3DText,    TRUE,
  109.   GU_Left,        LEFT_OFFSET,
  110.   GU_Top,         TOP_OFFSET,
  111.   GU_Width,       300,
  112.   GU_Height,      30,
  113.   TAG_DONE
  114. };
  115.  
  116. struct TagItem box2[] =
  117. {
  118.   GU_GadgetKind,  BEVELBOX_KIND,
  119.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_RIDGE",
  120.   GUBB_Recessed,  TRUE,
  121.   GUBB_FrameType, BFT_RIDGE,
  122.   GUBB_TextColor, 2,
  123.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  124.   GU_LeftRel,     GDG_BOX1,
  125.   GU_AlignTop,    GDG_BOX1,
  126.   GU_DupeWidth,   GDG_BOX1,
  127.   GU_DupeHeight,  GDG_BOX1,
  128.   TAG_DONE
  129. };
  130.  
  131. struct TagItem box3[] =
  132. {
  133.   GU_GadgetKind,  BEVELBOX_KIND,
  134.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_BUTTON",
  135.   GUBB_Recessed,  TRUE,
  136.   GUBB_FrameType, BFT_BUTTON,
  137.   GUBB_TextColor, 2,
  138.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  139.   GUBB_3DText,    TRUE,
  140.   GU_AlignLeft,   GDG_BOX1,
  141.   GU_TopRel,      GDG_BOX1,
  142.   GU_AddTop,      10,
  143.   GU_DupeWidth,   GDG_BOX1,
  144.   GU_DupeHeight,  GDG_BOX1,
  145.   TAG_DONE
  146. };
  147.  
  148. struct TagItem box4[] =
  149. {
  150.   GU_GadgetKind,  BEVELBOX_KIND,
  151.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_BUTTON",
  152.   GUBB_Recessed,  TRUE,
  153.   GUBB_FrameType, BFT_BUTTON,
  154.   GUBB_TextColor, 2,
  155.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  156.   GU_LeftRel,     GDG_BOX3,
  157.   GU_AlignTop,    GDG_BOX3,
  158.   GU_DupeWidth,   GDG_BOX1,
  159.   GU_DupeHeight,  GDG_BOX1,
  160.   TAG_DONE
  161. };
  162.  
  163. struct TagItem box5[] =
  164. {
  165.   GU_GadgetKind,  BEVELBOX_KIND,
  166.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_DROPBOX",
  167.   GUBB_Recessed,  TRUE,
  168.   GUBB_FrameType, BFT_DROPBOX,
  169.   GUBB_TextColor, 2,
  170.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  171.   GUBB_3DText,    TRUE,
  172.   GU_AlignLeft,   GDG_BOX1,
  173.   GU_TopRel,      GDG_BOX4,
  174.   GU_AddTop,      10,
  175.   GU_DupeWidth,   GDG_BOX1,
  176.   GU_DupeHeight,  GDG_BOX1,
  177.   TAG_DONE
  178. };
  179.  
  180. struct TagItem box6[] =
  181. {
  182.   GU_GadgetKind,  BEVELBOX_KIND,
  183.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_DROPBOX",
  184.   GUBB_Recessed,  TRUE,
  185.   GUBB_FrameType, BFT_DROPBOX,
  186.   GUBB_TextColor, 2,
  187.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  188.   GU_LeftRel,     GDG_BOX5,
  189.   GU_AlignTop,    GDG_BOX5,
  190.   GU_DupeWidth,   GDG_BOX1,
  191.   GU_DupeHeight,  GDG_BOX1,
  192.   TAG_DONE
  193. };
  194.  
  195. struct TagItem drawer[] =
  196. {
  197.   GU_GadgetKind,  DRAWER_KIND,
  198.   GU_GadgetText,  (ULONG)"_DRAWER KIND:",
  199.   GU_Flags,       NG_HIGHLABEL,
  200.   GU_LabelHotkey, TRUE,
  201.   GU_AlignLeft,   GDG_BOX1,
  202.   GU_AdjustLeft,  10,
  203.   GU_TopRel,      GDG_BOX5,
  204.   GU_AddTop,      5,
  205.   GU_Width,       DRAWER_WIDTH,
  206.   GU_Height,      DRAWER_HEIGHT,
  207.   TAG_DONE
  208. };
  209.  
  210. struct TagItem file[] =
  211. {
  212.   GU_GadgetKind,  FILE_KIND,
  213.   GU_GadgetText,  (ULONG)"_FILE KIND:",
  214.   GU_Flags,       NG_HIGHLABEL,
  215.   GU_LabelHotkey, TRUE,
  216.   GU_AlignLeft,   GDG_DRAWER,
  217.   GU_TopRel,      GDG_DRAWER,
  218.   GU_AddTop,      5,
  219.   GU_Width,       FILE_WIDTH,
  220.   GU_Height,      FILE_HEIGHT,
  221.   TAG_DONE
  222. };
  223.  
  224. struct TagItem progress[] =
  225. {
  226.   GU_GadgetKind,  PROGRESS_KIND,
  227.   GU_GadgetText,  (ULONG)"PROGRESS KIND:",
  228.   GUPR_Current,   30,
  229.   GUPR_Total,     100,
  230.   GU_Flags,       NG_HIGHLABEL,
  231.   GU_LeftRel,     GDG_DRAWER,
  232.   GU_AdjustLeft,  10,
  233.   GU_AlignTop,    GDG_DRAWER,
  234.   GU_Width,       100,
  235.   GU_DupeHeight,  GDG_DRAWER,
  236.   TAG_DONE
  237. };
  238.  
  239. struct TagItem image[] =
  240. {
  241.   GU_GadgetKind,   IMAGE_KIND,
  242.   GU_GadgetText,   (ULONG)"_IMAGE KIND:",
  243.   GUIM_Image,      (ULONG)&image1,
  244.   GUIM_SelectImg,  (ULONG)&image2,
  245.   GU_Flags,        NG_HIGHLABEL,
  246.   GU_LabelHotkey,  TRUE,
  247.   GU_LeftRel,      GDG_PROGRESS,
  248.   GU_AdjustLeft,   10,
  249.   GU_AlignTop,     GDG_PROGRESS,
  250.   GU_Width,        29+10,
  251.   GU_Height,       15+5,
  252.   TAG_DONE
  253. };
  254.  
  255. struct LayoutGadget gadgets[] =
  256. {
  257.   GDG_BOX1,     box1,     NULL,    NULL,
  258.   GDG_BOX2,     box2,     NULL,    NULL,
  259.   GDG_BOX3,     box3,     NULL,    NULL,
  260.   GDG_BOX4,     box4,     NULL,    NULL,
  261.   GDG_BOX5,     box5,     NULL,    NULL,
  262.   GDG_BOX6,     box6,     NULL,    NULL,
  263.   GDG_DRAWER,   drawer,   GT_tags, NULL,
  264.   GDG_FILE,     file,     GT_tags, NULL,
  265.   GDG_PROGRESS, progress, NULL,    NULL,
  266.   GDG_IMAGE,    image,    GT_tags, NULL,
  267.   -1
  268. };
  269. /*-----------------------------------------------------------------------*/
  270. struct Library *GadUtilBase = NULL;  /* library base */
  271. struct Screen *myscreen     = NULL;  /* our screen */
  272. struct Window *mywindow     = NULL;  /* and its visitor window */
  273.  
  274. APTR ginfo;                          /* gadget's stuff */
  275. struct Gadget *glist;
  276. UWORD sel_gadID;                     /* number of the selected gadget */
  277.  
  278. struct IntuiMessage *imsg;           /* IntuiMessage stuff */
  279. ULONG class;
  280. UWORD code;
  281. APTR iaddress;
  282.  
  283. BOOL done = FALSE;                   /* program termination flag */
  284. /*-----------------------------------------------------------------------*/
  285. void main(void)
  286. {
  287.   /* let's open the famous library :-) */
  288.   if (GadUtilBase = OpenLibrary(GADUTILNAME, 36))
  289.   {
  290.     /* let's get pointer to any public screen */
  291.     if (myscreen = LockPubScreen(NULL))
  292.     {
  293.       /* let's initialize our pretty gadgets */
  294.       if (ginfo = GU_LayoutGadgetsA(&glist, gadgets, myscreen, global_tags))
  295.       {
  296.         /* I think it'd be great to have one small cute window ! */
  297.         if (mywindow = OpenWindowTags(
  298.         NULL,
  299.         WA_Left,         5,
  300.         WA_Top,          20,
  301.         WA_InnerWidth,   farright+LEFT_OFFSET,
  302.         WA_InnerHeight,  farbottom+TOP_OFFSET,
  303.         WA_IDCMP,        gad_IDCMP|
  304.                          IDCMP_CLOSEWINDOW|
  305.                          IDCMP_VANILLAKEY,
  306.         WA_Flags,        WFLG_DRAGBAR|
  307.                          WFLG_DEPTHGADGET|
  308.                          WFLG_CLOSEGADGET|
  309.                          WFLG_SMART_REFRESH|
  310.                          WFLG_ACTIVATE|
  311.                          WFLG_RMBTRAP,
  312.         WA_Gadgets,      glist,
  313.         WA_Title,        (ULONG)"Yeah, it tastes well, doesn't ?!",
  314.         TAG_DONE))
  315.         {
  316.           /* Hmm, our pretties need to be refreshed... */
  317.           GU_RefreshWindow(mywindow, ginfo);
  318.  
  319.           /* Accordin' to the RKM we may unlock our screen now ! */
  320.           UnlockPubScreen(NULL, myscreen);
  321.  
  322.  
  323.  
  324. DrawImage(mywindow->RPort, &image1, 50, 70);
  325. DrawImage(mywindow->RPort, &image2, 50, 110);
  326.  
  327.  
  328.  
  329.  
  330.  
  331.           /*
  332.           As ya may see program will terminate if our boolean become TRUE !
  333.           */
  334.           while (!done)
  335.           {
  336.             /* Waitin' for messages - is it heavy work ? */
  337.             Wait(1L << mywindow->UserPort->mp_SigBit);
  338.  
  339.             /* let's process our messages */
  340.             while (imsg = GU_GetIMsg(mywindow->UserPort))
  341.             {
  342.               /* Let's store every message and reply as fast as we can ! */
  343.               class    = imsg->Class;
  344.               code     = imsg->Code;
  345.               iaddress = imsg->IAddress;
  346.               GU_ReplyIMsg(imsg);
  347.  
  348.               /* number of the selected gadget */
  349.               sel_gadID = ((struct Gadget *)iaddress)->GadgetID;
  350.  
  351.               /*
  352.               Let's  take  a brave decission and branch out (standard IDCMP
  353.               handling).
  354.               */
  355.               switch (class)
  356.               {
  357.                 /* DRAWER_KIND, FILE_KIND or IMAGE_KIND */
  358.                 case IDCMP_GADGETUP:
  359.                   switch (sel_gadID)
  360.                   {
  361.                     case GDG_DRAWER:
  362.                     case GDG_FILE:
  363.                     case GDG_IMAGE:
  364.                       DisplayBeep(myscreen); break;
  365.                   }
  366.                   break;
  367.  
  368.                 /* both close window and Esc key will cause quit */
  369.                 case IDCMP_CLOSEWINDOW: done = TRUE; break;
  370.                 case IDCMP_VANILLAKEY:  done = (code==27); break;
  371.               }
  372.             }
  373.           }
  374.           /* Bye, bye dear window ! */
  375.           CloseWindow(mywindow);
  376.         }
  377.         /* Bye for now, pretty gadgets ! */
  378.         GU_FreeLayoutGadgets(ginfo);
  379.       }
  380.     }
  381.     /* Sorry, accordin' to the RKM I... have to close ya :( */
  382.     CloseLibrary(GadUtilBase);
  383.   }
  384. }
  385.