home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / fishdisks / d1001.lha / Programs / AmigaGuide / AG_V39 / Source / advaghelp.c < prev    next >
C/C++ Source or Header  |  1993-01-08  |  19KB  |  742 lines

  1. /* aghelp.c
  2.  *
  3.  * (c) Copyright 1992 Commodore-Amiga, Inc.  All rights reserved.
  4.  *
  5.  * This software is provided as-is and is subject to change; no warranties
  6.  * are made.  All use is at your own risk.  No liability or responsibility
  7.  * is assumed.
  8.  *
  9.  */
  10.  
  11. #include <exec/types.h>
  12. #include <exec/memory.h>
  13. #include <exec/execbase.h>
  14. #include <exec/libraries.h>
  15. #include <intuition/screens.h>
  16. #include <intuition/intuition.h>
  17. #include <graphics/gfx.h>
  18. #include <graphics/text.h>
  19. #include <libraries/amigaguide.h>
  20. #include <libraries/gadtools.h>
  21. #include <utility/hooks.h>
  22. #include <utility/tagitem.h>
  23. #include <string.h>
  24. #include <stdio.h>
  25.  
  26. #include <clib/alib_protos.h>
  27. #include <clib/amigaguide_protos.h>
  28. #include <clib/dos_protos.h>
  29. #include <clib/exec_protos.h>
  30. #include <clib/gadtools_protos.h>
  31. #include <clib/graphics_protos.h>
  32. #include <clib/intuition_protos.h>
  33. #include <clib/utility_protos.h>
  34.  
  35. #include <pragmas/amigaguide_pragmas.h>
  36. #include <pragmas/dos_pragmas.h>
  37. #include <pragmas/exec_pragmas.h>
  38. #include <pragmas/gadtools_pragmas.h>
  39. #include <pragmas/graphics_pragmas.h>
  40. #include <pragmas/intuition_pragmas.h>
  41. #include <pragmas/utility_pragmas.h>
  42.  
  43. /*****************************************************************************/
  44.  
  45. #define    DB(x)    x
  46.  
  47. /*****************************************************************************/
  48.  
  49. void kprintf (void *, ...);
  50.  
  51. /*****************************************************************************/
  52.  
  53. #define    BASENAME    "ADVAGHELP"
  54. #define    BASENAME_LENGTH    9
  55.  
  56. /*****************************************************************************/
  57.  
  58. #define ASM        __asm __saveds
  59. #define REG(x)        register __ ## x
  60.  
  61. /*****************************************************************************/
  62.  
  63. struct AppInfo
  64. {
  65.     struct Process        *ai_Process;        /* Our process address */
  66.     struct Screen        *ai_Screen;        /* Screen that our application will open on */
  67.     APTR             ai_VI;            /* GadTools visual info */
  68.     struct Window        *ai_Window;        /* Window pointer */
  69.     struct Menu            *ai_Menu;        /* Menus */
  70.  
  71.     /* Gadgets that we want to set attributes on */
  72.     struct Gadget        *ai_GStatus;        /* Status window */
  73.  
  74.     /* Help related information */
  75.     LONG             ai_NHID;        /* Unique id */
  76.     ULONG             ai_NHFlags;        /* Help related flags */
  77.     UBYTE             ai_NHName[64];        /* Unique name */
  78.     struct Hook             ai_NHHook;        /* Dynamic node host hook */
  79.     struct AmigaGuideHost    *ai_NH;            /* Dynamic node host */
  80.     AMIGAGUIDECONTEXT         ai_AmigaGuide;        /* Pointer to the AmigaGuide context */
  81.     struct NewAmigaGuide     ai_NAG;        /* Used to start AmigaGuide */
  82.     LONG             ai_Region;        /* Region that the mouse if over */
  83.  
  84.     /* Control information */
  85.     BOOL             ai_Done;        /* Done yet? */
  86. };
  87.  
  88. #define    AGHF_CONTINUOUS    (1L<<0)
  89.  
  90. /*****************************************************************************/
  91.  
  92. extern struct Library *SysBase;
  93. extern struct Library *DOSBase;
  94. struct Library *AmigaGuideBase;
  95. struct Library *GadToolsBase;
  96. struct Library *GfxBase;
  97. struct Library *IntuitionBase;
  98. struct Library *UtilityBase;
  99.  
  100. /*****************************************************************************/
  101.  
  102. /* Context ID's to be sent to AmigaGuide */
  103. STRPTR context[] =
  104. {
  105.     "MAIN",
  106.     "STATUS",
  107.     "LISTVIEW",
  108.     "ACCEPT",
  109.     "CANCEL",
  110.     "QUIT",
  111.     "NONCONTINUOUS",
  112.     "CONTINUOUS",
  113.     NULL
  114. };
  115.  
  116. /*****************************************************************************/
  117.  
  118. #define    MCMD_MAIN        0
  119. #define    MCMD_STATUS        1
  120. #define    MCMD_LISTVIEW        2
  121. #define    MCMD_ACCEPT        3
  122. #define    MCMD_CANCEL        4
  123. #define    MCMD_QUIT        5
  124. #define    MCMD_NONCONTINUOUS    6
  125. #define    MCMD_CONTINUOUS        7
  126.  
  127. /*****************************************************************************/
  128.  
  129. /* Simple little prompts to display within the status window */
  130. STRPTR quickhelp[] =
  131. {
  132.     "AGHelp main window.",
  133.     "Quick-Help or status window.",
  134.     "List of absolutely nothing.",
  135.     "Accept changes.",
  136.     "Cancel changes.",
  137.     "",
  138.     "Window sizing gadget.",
  139.     "Window drag bar.",
  140.     "Screen drag bar.",
  141.     "Window depth gadget.",
  142.     "Screen depth gadget.",
  143.     "Window zoom gadget.",
  144.     "",
  145.     "Window close gadget.",
  146.     NULL
  147. };
  148.  
  149. #define    MAX_REGION    14
  150.  
  151. /*****************************************************************************/
  152.  
  153. struct TextAttr topaz8 = {"topaz.font", 8,};
  154.  
  155. /*****************************************************************************/
  156.  
  157. #define    IDCMP_FLAGS    IDCMP_RAWKEY | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_MENUHELP | \
  158.             IDCMP_GADGETUP | IDCMP_MOUSEMOVE | IDCMP_GADGETHELP
  159.  
  160. /*****************************************************************************/
  161.  
  162. #define    V(x)    ((void *)(x))
  163.  
  164. struct NewMenu main_menu[] =
  165. {
  166.     {NM_TITLE,    "Project",},
  167.     {NM_ITEM,    "Quit",            "Q", NULL, NULL, V(MCMD_QUIT),},
  168.  
  169.     {NM_TITLE,    "Settings",},
  170.     {NM_ITEM,    "Continuous Help?",    "",  CHECKIT | MENUTOGGLE, NULL, V(MCMD_NONCONTINUOUS),},
  171.     {NM_END,},
  172. };
  173.  
  174. /*****************************************************************************/
  175. /*****************************************************************************/
  176. /*****************************************************************************/
  177.  
  178. VOID DisplayError (LONG err)
  179. {
  180.     printf ("%s\n", GetAmigaGuideString (err));
  181. }
  182.  
  183. /*****************************************************************************/
  184.  
  185. void HandleEvents (struct AppInfo * ai)
  186. {
  187.     struct Window *win = ai->ai_Window;
  188.     struct AmigaGuideMsg *agm;
  189.     struct IntuiMessage *imsg;
  190.     struct MenuItem *item;
  191.     ULONG sigr = 0L;
  192.     ULONG sigi = 0L;
  193.     ULONG sigb = 0L;
  194.     UWORD selection;
  195.     STRPTR label;
  196.     LONG region;
  197.     LONG qhelp;
  198.     LONG id;
  199.  
  200.     /* Show that we're not done running the application yet */
  201.     ai->ai_Done = FALSE;
  202.  
  203.     /* Get our signal bits */
  204.     sigb = AmigaGuideSignal (ai->ai_AmigaGuide);
  205.     sigi = (1L << win->UserPort->mp_SigBit);
  206.  
  207.     /* Clear the AmigaGuide context */
  208.     SetAmigaGuideContext (ai->ai_AmigaGuide, 0L, NULL);
  209.  
  210.     /* Continue until done */
  211.     while (!(ai->ai_Done))
  212.     {
  213.     /* Wait for something to happen */
  214.     sigr = Wait (sigb | sigi);
  215.  
  216.     /* Pull Intuition & GadTools messages */
  217.     while (imsg = GT_GetIMsg (win->UserPort))
  218.     {
  219.         switch (imsg->Class)
  220.         {
  221.         case IDCMP_CLOSEWINDOW:
  222.             ai->ai_Done = TRUE;
  223.             break;
  224.  
  225.         case IDCMP_MENUPICK:
  226.             selection = imsg->Code;
  227.             while (selection != MENUNULL)
  228.             {
  229.             item = ItemAddress (win->MenuStrip, selection);
  230.  
  231.             switch ((LONG)MENU_USERDATA (item))
  232.             {
  233.                 case MCMD_QUIT:
  234.                 ai->ai_Done = TRUE;
  235.                 break;
  236.  
  237.                 case MCMD_NONCONTINUOUS:
  238.                 if (item->Flags & CHECKED)
  239.                     ai->ai_NHFlags |= AGHF_CONTINUOUS;
  240.                 else
  241.                     ai->ai_NHFlags &= ~AGHF_CONTINUOUS;
  242.                 break;
  243.             }
  244.  
  245.             selection = item->NextSelect;
  246.             }
  247.             break;
  248.  
  249.         case IDCMP_MENUHELP:
  250.             if (item = ItemAddress (win->MenuStrip, imsg->Code))
  251.             {
  252.             /* Get the context ID */
  253.             id = (LONG) MENU_USERDATA (item);
  254.  
  255.             /* Adjust for being selected */
  256.             if (item->Flags & CHECKED)
  257.                 id++;
  258.  
  259.             /* Display the node */
  260.             SendAmigaGuideCmd (ai->ai_AmigaGuide, NULL, AGA_Context, id, TAG_DONE);
  261.             }
  262.  
  263.             break;
  264.  
  265.         case IDCMP_GADGETUP:
  266.             switch (((struct Gadget *)imsg->IAddress)->GadgetID)
  267.             {
  268.             case MCMD_ACCEPT:
  269.             case MCMD_CANCEL:
  270.                 ai->ai_Done = TRUE;
  271.                 break;
  272.             }
  273.             break;
  274.  
  275.         case IDCMP_GADGETHELP:
  276.             qhelp = region = -1;
  277.             if (imsg->IAddress == NULL)
  278.             {
  279.             /* Not over our window */
  280.             DB (printf ("not over our window\n"));
  281.             }
  282.             else if (imsg->IAddress == (APTR) win)
  283.             {
  284.             /* Over our window */
  285.             DB (printf ("over window\n"));
  286.             qhelp = region = 0;
  287.             }
  288.             else
  289.             {
  290.  
  291.             /*
  292.              * Detect system gadgets.  Figure out by looking at
  293.              * system-gadget-type bits in GadgetType field:
  294.              */
  295.             LONG sysgtype = ((struct Gadget *) imsg->IAddress)->GadgetType & 0xF0;
  296.  
  297.             /* Set the region */
  298.             qhelp = (sysgtype >> 4) + 5;
  299.             region = HTFC_SYSGADS + sysgtype;
  300.  
  301.             switch (sysgtype)
  302.             {
  303.                 case GTYP_SIZING:
  304.                 DB (printf ("Gadget Help for window sizing gadget\n"));
  305.                 break;
  306.  
  307.                 case GTYP_WDRAGGING:
  308.                 DB (printf ("Gadget Help for window drag-bar\n"));
  309.                 break;
  310.  
  311.                 case GTYP_WUPFRONT:
  312.                 DB (printf ("Gadget Help for window depth gadget\n"));
  313.                 break;
  314.  
  315.