home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / fishdisks / d1001.lha / Programs / AmigaGuide / AG_V34 / Source / HyperApp.c next >
C/C++ Source or Header  |  1992-12-30  |  15KB  |  681 lines

  1. /* HyperApp.c
  2.  */
  3.  
  4. #include <exec/types.h>
  5. #include <exec/libraries.h>
  6. #include <intuition/intuition.h>
  7. #include <graphics/gfx.h>
  8. #include <graphics/text.h>
  9. #include <libraries/amigaguide.h>
  10. #include <clib/alib_protos.h>
  11. #include <clib/exec_protos.h>
  12. #include <clib/intuition_protos.h>
  13. #include <clib/graphics_protos.h>
  14. #include <clib/amigaguide_protos.h>
  15. #include <pragmas/amigaguide_pragmas.h>
  16. #include <stdio.h>
  17.  
  18. #define    DB(x)    ;
  19.  
  20. struct AppInfo
  21. {
  22.     struct Window *ai_Window;                /* Window pointer */
  23.     BOOL ai_Done;                    /* Done yet? */
  24.     AMIGAGUIDECONTEXT ai_AmigaGuide;            /* Pointer to the AmigaGuide context */
  25.     LONG ai_Region;                    /* Region that the mouse if over */
  26.     struct TextFont *ai_Font;                /* Window font */
  27. };
  28.  
  29. struct FuncTable
  30. {
  31.     VOID (*ft_Func) (struct AppInfo *);
  32. };
  33.  
  34. struct EMenuItem
  35. {
  36.     struct MenuItem em_MenuItem;            /* Embedded menu structure */
  37.     LONG em_MenuID;                    /* Menu ID */
  38. };
  39.  
  40. extern struct Library *SysBase, *DOSBase;
  41. struct Library *IntuitionBase, *GfxBase, *AmigaGuideBase;
  42.  
  43. VOID MainFunc (struct AppInfo *);
  44. VOID QuitFunc (struct AppInfo *);
  45. VOID GadgetFunc (struct AppInfo *);
  46. VOID OkayFunc (struct AppInfo *);
  47. VOID CancelFunc (struct AppInfo *);
  48.  
  49. /* Context ID's to be sent to AmigaGuide */
  50. STRPTR context[] =
  51. {
  52.     "MAIN",
  53.     "QUIT",
  54.     "GADGET",
  55.     "OKAY",
  56.     "CANCEL",
  57.     NULL
  58. };
  59.  
  60. /* Simple little prompts to display within the application window */
  61. STRPTR quickhelp[] =
  62. {
  63.     "HyperApp Main Window",
  64.     "",
  65.     "Transmogrify Objects",
  66.     "Positive Quit",
  67.     "Negative Quit",
  68.     NULL
  69. };
  70.  
  71. struct FuncTable Funcs[] =
  72. {
  73.     MainFunc,
  74.     QuitFunc,
  75.     GadgetFunc,
  76.     OkayFunc,
  77.     CancelFunc,
  78.     NULL
  79. };
  80.  
  81. struct TextAttr TOPAZ8 =
  82. {(STRPTR) "topaz.font", 8, 0, 0};
  83.  
  84. struct IntuiText IText3 =
  85. {
  86.     0, 0, JAM1, 2, 1, &TOPAZ8, "Quit", NULL
  87. };
  88.  
  89. struct EMenuItem MenuItem1 =
  90. {
  91.     NULL, 0, 0, 142, 9, ITEMTEXT | COMMSEQ | ITEMENABLED | HIGHCOMP,
  92.     0, (APTR) & IText3, NULL, 'Q', NULL, MENUNULL, 1L
  93. };
  94.  
  95. struct Menu Menu1 =
  96. {
  97.     NULL, 2, 0, 64, 0, MENUENABLED, "Project", (struct MenuItem *) & MenuItem1
  98. };
  99.  
  100. SHORT BData1[] =
  101. {0, 0, 94, 0, 94, 13, 0, 13, 0, 0};
  102. SHORT BData2[] =
  103. {0, 0, 94, 0, 94, 13, 0, 13, 0, 0};
  104.  
  105. struct Border Border1 =
  106. {0, 0, 1, 0, JAM1, 5, BData1, NULL};
  107. struct Border Border2 =
  108. {0, 0, 1, 0, JAM1, 5, BData2, NULL};
  109.  
  110. struct IntuiText IText1 =
  111. {1, 0, JAM2, 26, 3, &TOPAZ8, "Cancel", NULL};
  112. struct IntuiText IText2 =
  113. {1, 0, JAM2, 40, 3, &TOPAZ8, "OK", NULL};
  114.  
  115. struct Gadget Gadget3 =
  116. {
  117.     NULL, -120, -18, 95, 14, GRELBOTTOM | GRELRIGHT, RELVERIFY, BOOLGADGET,
  118.     (APTR) & Border1, NULL, &IText1, NULL, NULL, 4L, NULL
  119. };
  120.  
  121. struct Gadget Gadget2 =
  122. {
  123.     &Gadget3, 12, -18, 95, 14, GRELBOTTOM, RELVERIFY, BOOLGADGET,
  124.     (APTR) & Border2, NULL, &IText2, NULL, NULL, 3L, NULL
  125. };
  126.  
  127. struct Gadget Gadget1 =
  128. {
  129.     &Gadget2, 12, 27, -40, -48, GADGHCOMP | GRELWIDTH | GRELHEIGHT | SELECTED,
  130.     TOGGLESELECT | RELVERIFY, BOOLGADGET, NULL, NULL, NULL, NULL, NULL,
  131.     2L, NULL
  132. };
  133.  
  134. struct TagItem WinTags[] =
  135. {
  136.     WA_MenuHelp, TRUE,
  137.     TAG_DONE,
  138. };
  139.  
  140. /* NewWindow Structures */
  141. struct ExtNewWindow NewWindowStructure1 =
  142. {
  143.     0, 0, 640, 100, -1, -1,
  144.     IDCMP_RAWKEY | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_MENUHELP |
  145.     IDCMP_GADGETUP | IDCMP_MOUSEMOVE,
  146.     WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | WFLG_REPORTMOUSE |
  147.     SIZEBRIGHT | ACTIVATE | NOCAREREFRESH | WFLG_NW_EXTENDED,
  148.     &Gadget1, NULL, "HyperApp (Press HELP over Gadget or Menu)", NULL, NULL,
  149.     320, 50, 65535, 65535, WBENCHSCREEN, WinTags,
  150. };
  151.  
  152. /* Determine if a point is within a rectangle */
  153. ULONG PointInBox (WORD x, WORD y, struct IBox * box)
  154. {
  155.  
  156.     if ((x >= box->Left) &&
  157.     (x <= (box->Left + box->Width)) &&
  158.     (y >= box->Top) &&
  159.     (y <= (box->Top + box->Height)))
  160.     {
  161.     return (1L);
  162.     }
  163.  
  164.     return (0L);
  165. }
  166.  
  167. /* Find the rectangle of a gadget */
  168. VOID gadgetBox (struct Gadget * g, struct IBox * domain, struct IBox * box)
  169. {
  170.  
  171.     /* Set the 'normal' rectangle */
  172.     box->Left = g->LeftEdge;
  173.     box->Top = g->TopEdge;
  174.     box->Width = g->Width;
  175.     box->Height = g->Height;
  176.  
  177.     /* Check for relativity */
  178.     if (g->Flags & GRELRIGHT)
  179.     box->Left += domain->Width - 1;
  180.     if (g->Flags & GRELBOTTOM)
  181.     box->Top += domain->Height - 1;
  182.     if (g->Flags & GRELWIDTH)
  183.     box->Width += domain->Width;
  184.     if (g->Flags & GRELHEIGHT)
  185.     box->Height += domain->Height;
  186. }
  187.  
  188. /* Process menu events */
  189. VOID HandleMenuEvent (struct IntuiMessage * msg)
  190. {
  191.     struct Window *win = msg->IDCMPWindow;
  192.     struct AppInfo *ai = (struct AppInfo *) win->UserData;
  193.     UWORD selection = msg->Code;
  194.     struct EMenuItem *item;
  195.  
  196.     /* Turn off the menu button */
  197.     win->Flags |= RMBTRAP;
  198.  
  199.     /* Process all menu events */
  200.     while (selection != MENUNULL)
  201.     {
  202.     /* Get the MenuItem structure address */
  203.     if (item = (struct EMenuItem *)
  204.         ItemAddress (win->MenuStrip, (LONG) selection))
  205.     {
  206.         (*(Funcs[item->em_MenuID].ft_Func)) (ai);
  207.  
  208.         /* Get the next selection */
  209.         selection = item->em_MenuItem.NextSelect;
  210.     }
  211.     else
  212.     {
  213.         selection = MENUNULL;
  214.     }
  215.     }
  216.  
  217.     /* Turn menu events back on. */
  218.     win->Flags &= ~RMBTRAP;
  219. }
  220.  
  221. /* Process MenuHelp events */
  222. VOID HandleMenuHelp (struct IntuiMessage * msg)
  223. {
  224.     struct Window *win = msg->IDCMPWindow;
  225.     struct AppInfo *ai = (struct AppInfo *) win->UserData;
  226.     struct EMenuItem *item;
  227.     WORD mnum, inum, snum;
  228.  
  229.     mnum = MENUNUM (msg->Code);
  230.     inum = ITEMNUM (msg->Code);
  231.     snum = SUBNUM (msg->Code);
  232.  
  233.     printf ("m %d i %d s %d\n", mnum, inum, snum);
  234.  
  235.     /* Get the MenuItem structure address */
  236.     if (item = (struct EMenuItem *)
  237.     ItemAddress (win->MenuStrip, (LONG) msg->Code))
  238.     {
  239.     /* Set the AmigaGuide context */
  240.     SetAmigaGuideContext (ai->ai_AmigaGuide, item->em_MenuID, NULL);
  241.  
  242.     /* Display the node */
  243.     SendAmigaGuideContext (ai->ai_AmigaGuide, NULL);
  244.     }
  245.     else
  246.     {
  247.     /* No selectable item where help was pressed */
  248.     printf ("No item here\n");
  249.     }
  250. }
  251.  
  252. /* Process MouseMove events */
  253. VOID HandleMouseMove (struct IntuiMessage * msg)
  254. {
  255.     struct Window *win = msg->IDCMPWindow;
  256.     struct AppInfo *ai = (struct AppInfo *) win->UserData;
  257.     struct Gadget *gad = win->FirstGadget;
  258.     struct IBox box;
  259.     LONG region;
  260.  
  261.     if ((msg->MouseX < 0) || (msg->MouseX > win->Width) ||
  262.     (msg->MouseY < 0) || (msg->MouseY > win->Height))
  263.     {
  264.     region = -1L;
  265.     }
  266.     else
  267.     {
  268.     region = 0L;
  269.  
  270.     /* Step through the gadgets to see which one the pointer was over */
  271.     while (gad && (region == 0L))
  272.     {
  273.         /* Calculate the gadget rectangle */
  274.         gadgetBox (gad, (struct IBox *) & (win->LeftEdge), &box);
  275.  
  276.         /* Is the pointer within this gadget? */
  277.         if (PointInBox (msg->MouseX, msg->MouseY, &box))
  278.         {
  279.         /* Is it a system gadget? */
  280.         if (!(gad->GadgetType & GTYP_SYSGADGET))
  281.         {
  282.             /* Set the region */
  283.             region = (LONG) gad->GadgetID;
  284.         }
  285.         }
  286.  
  287.         /* Get the next gadget */
  288.         gad = gad->NextGadget;
  289.     }
  290.     }
  291.  
  292.     if (region != ai->ai_Region)
  293.     {
  294.     WORD tx, ty;
  295.     WORD bx, by;
  296.  
  297.     tx = win->BorderLeft + 8;
  298.     ty = win->BorderTop + 2;
  299.     bx = win->Width - (win->BorderRight + 8);
  300.     by = ty + win->RPort->TxHeight;
  301.  
  302.     SetDrMd (win->RPort, JAM1);
  303.  
  304.     /* Clear the quick help region */
  305.     SetAPen (win->RPort, 0);
  306.     RectFill (win->RPort, tx, ty, bx, by);
  307.  
  308.     /* Remember the region */
  309.     ai->ai_Region = region;
  310.  
  311.     /* Display the quick help if within the window */
  312.     if (region >= 0)
  313.     {
  314.         SetAPen (win->RPort, 1);
  315.         Move (win->RPort, tx, ty + win->RPort->TxBaseline);
  316.         Text (win->RPort, quickhelp[region], strlen (quickhelp[region]));
  317.     }
  318.     }
  319. }
  320.  
  321. /* Process GadgetHelp events */
  322. VOID HandleGadgetHelp (struct IntuiMessage * msg)
  323. {
  324.     struct Window *win = msg->IDCMPWindow;
  325.     struct AppInfo *ai = (struct AppInfo *) win->UserData;
  326.     struct Gadget *gad = win->FirstGadget;
  327.     struct IBox box;
  328.     LONG region;
  329.  
  330.     region = 0L;
  331.  
  332.     /* Step through the gadgets to see which one the pointer was over */
  333.     while (gad && (region == 0L))
  334.     {
  335.     /* Calculate the gadget rectangle */
  336.     gadgetBox (gad, (struct IBox *) & (win->LeftEdge), &box);
  337.  
  338.     /* Is the pointer within this gadget? */
  339.     if (PointInBox (msg->MouseX, msg->MouseY, &box))
  340.     {
  341.         /* Is it a system gadget? */
  342.         if (gad->GadgetType & GTYP_SYSGADGET)
  343.         {
  344.         ULONG sys;
  345.  
  346.         /* Which system gadg