home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / spirit / tut / !Lesson4_C_Lesson4 < prev    next >
Encoding:
Text File  |  1993-11-28  |  11.0 KB  |  410 lines

  1. /*
  2.  *      Title     : Lesson 4
  3.  *      System    : New Risc-OS library. */
  4. #define Version     "1.0"
  5. /*      Copyright : (c) John Winters
  6.  *      Date      : 28th November, 1993
  7.  *      Author    : John H. Winters
  8.  *
  9.  *      Function  : Lesson 4 of the Spirit library tutorial.
  10.  *
  11.  *      At last, a "Hello World" program.
  12.  *
  13.  *      N.B.  We use the high-level font opening routines in WinAppLib,
  14.  *      rather than the low-level ones in FontLib, so that they will be
  15.  *      closed automatically when the program exits.
  16.  *
  17.  *
  18.  *      Modification history.
  19.  *
  20.  *      Version   : 
  21.  *      Date      : 
  22.  *      Author    : 
  23.  *      Changes   : 
  24.  *
  25.  */
  26.  
  27. #include <stdlib.h>
  28. #include "fontlib.h"
  29. #include "winapp.h"
  30.  
  31. /*
  32.  *==========================================================================
  33.  *
  34.  *  Hash defines.
  35.  *
  36.  *==========================================================================
  37.  */
  38.  
  39. #define FONT_SIZE  50   /* Point size of font to use */
  40. #define MENU_INFO   0   /* Menu entry for information */
  41. #define MENU_QUIT   1   /* Menu entry to quit */
  42. #define TFN_VERSION 4   /* Field number for version string */
  43.  
  44. /*
  45.  *==========================================================================
  46.  *
  47.  *  Local data.
  48.  *
  49.  *==========================================================================
  50.  */
  51.  
  52. /*
  53.  *  The following data items describe the font we are going
  54.  *  to use.
  55.  */
  56. static const t_font_descriptor *FontDescriptor ;
  57. static const char               FontName []    = "Trinity.Medium" ;
  58. static unsigned int             FontResolution = 0 ;
  59. static unsigned int             FontSize       = FONT_SIZE * 16 ;
  60. /*
  61.  *  The text we propose to print.
  62.  */
  63. static const char        Text []     = "Hello World" ;
  64. /*
  65.  *  Handle on the dialogue box which we use to give process information.
  66.  */
  67. static t_dbox          InfoDbox ;
  68. /*
  69.  *  Name of our template file.
  70.  */
  71. static const char      TemplateFileName [] = "Templates" ;
  72. /*
  73.  *  String to place in our information dialogue box.
  74.  */
  75. static char            VersionString [] = Version " (28th November, 1993)" ;
  76. /*
  77.  *  Handle for our window.
  78.  */
  79. static t_window_handle WindowHandle ;
  80.  
  81. /*
  82.  *==========================================================================
  83.  *
  84.  *  Externally visible data.
  85.  *
  86.  *==========================================================================
  87.  */
  88.  
  89. /*
  90.  *  This data item gives the name of the directory to look in when loading
  91.  *  resources.  It will make the library code look for an environment
  92.  *  variable <Lesson4$Dir> which points to the correct directory.
  93.  */
  94. const char WA_resource_dir [] = "Lesson4" ;
  95. /*
  96.  *  This data item defines the task name.
  97.  */
  98. const char WA_task_name [] = "Lesson 4" ;
  99.  
  100. /*
  101.  *==========================================================================
  102.  *
  103.  *  Forward declarations.
  104.  *
  105.  *==========================================================================
  106.  */
  107.  
  108. static unsigned int ClickHandler (
  109.     t_poll_block *poll_block,
  110.     void         *reference) ;
  111.  
  112. static void MenuHandler (
  113.     void      *reference,
  114.     const int *hit) ;
  115.  
  116. static uint RedrawHandler (
  117.     t_poll_block *poll_block,
  118.     void         *reference) ;
  119.  
  120. /*
  121.  *==========================================================================
  122.  *
  123.  *  Externally visible routines.
  124.  *
  125.  *==========================================================================
  126.  */
  127.  
  128. unsigned int WA_BeginProcessing (void)
  129.  
  130. /*
  131.  *  Function :
  132.  *                  This routine is called after we have succesfully
  133.  *                  called WIMP_Initialise and are ready to go ahead.
  134.  *
  135.  *  Parameters :
  136.  *                  None.
  137.  *
  138.  *  Returns :
  139.  *                  TRUE if we are happy to go on, FALSE otherwise.
  140.  *
  141.  */
  142.  
  143. {
  144.     t_menu_block    *MainMenu ;
  145.  
  146.     /*
  147.      *  Create a menu to attach to our icon.  The syntax for the menu
  148.      *  string is as for Acorn's product.
  149.      */
  150.     MainMenu = WA_BuildMenu (WA_resource_dir,
  151.                              ">Info, Quit") ;
  152.     if (MainMenu == NULL)
  153.     {
  154.         LOG_Error ("Failed to create a menu.\n") ;
  155.     }
  156.     else
  157.     {
  158.         /*
  159.          *  Now create a dialogue box from the template we loaded
  160.          *  earlier.  It's a non-persistent one (FALSE), and
  161.          *  doesn't require a handler or reference (NULL, NULL).
  162.          */
  163.         InfoDbox = WA_CreateDbox ("ProgInfo", FALSE, NULL, NULL) ;
  164.         if (InfoDbox == NULL)
  165.         {
  166.             LOG_Error ("Can't create information dbox.\n") ;
  167.         }
  168.         else
  169.         {
  170.             /*
  171.              *  Inject our current version number into the dialogue
  172.              *  box.
  173.              */
  174.             WA_SetDboxField (InfoDbox,
  175.                              TFN_VERSION,
  176.                              VersionString) ;
  177.             /*
  178.              *  Create a window.  Note the use of WA_CreateWindow
  179.              *  instead of WIMP_CreateWindow.  The former does more
  180.              *  work for us (cloning the template etc.) and registers
  181.              *  a default handler.
  182.              */
  183.             if ((WA_CreateWindow ("Window", NULL, &WindowHandle)) &&
  184.                 (WA_ClaimEvent (ET_RedrawRequest,
  185.                                 WindowHandle,
  186.                                 DONT_CARE,
  187.                                 RedrawHandler,
  188.                                 NULL)))
  189.             {
  190.                 /*
  191.                  *  Now pop our icon on the bar, and attach a menu to it.
  192.                  *  If an error occurs it will be reported for us.
  193.                  */
  194.                 return ((WA_IconToBar ("!lesson4", TRUE)) &&
  195.                         (WA_AttachMenu (ICON_BAR,
  196.                                         MainMenu,
  197.                                         MenuHandler,
  198.                                         NULL)) &&
  199.                         (WA_ClaimEvent (ET_MouseClick,
  200.                                         ICON_BAR,
  201.                                         DONT_CARE,
  202.                                         ClickHandler,
  203.                                         NULL))) ;
  204.             }
  205.         }
  206.     }
  207.     return (FALSE) ;
  208. }
  209.  
  210.  
  211. unsigned int WA_LoadResources (void)
  212.  
  213. /*
  214.  *  Function :
  215.  *                  This is our opportunity to load whatever resources
  216.  *                  we require before WIMP_Initialise is called.
  217.  *
  218.  *  Parameters :
  219.  *                  None.
  220.  *
  221.  *  Returns :
  222.  *                  TRUE if we are happy to go on, FALSE otherwise.
  223.  *
  224.  */
  225.  
  226. {
  227.     t_LOG_HandlerMask mask ;
  228.  
  229.     /*
  230.      *  Arrange for any messages to appear in a pop-up box.  A more
  231.      *  sophisticated application would probably arrange its own
  232.      *  message handling, but this easy method is provided for noddy
  233.      *  code.
  234.      */
  235.     mask.value             = 0 ;
  236.     mask.b.LHM_Debug       = TRUE ;
  237.     mask.b.LHM_Info        = TRUE ;
  238.     mask.b.LHM_Warning     = TRUE ;
  239.     mask.b.LHM_Error       = TRUE ;
  240.     mask.b.LHM_SevereError = TRUE ;
  241.     WA_SetPopupErrors (mask) ;
  242.     /*
  243.      *  Now we need a sprite to put on the icon bar, and a template
  244.      *  for our information box.  Note that we are here loading our sprite
  245.      *  from the !Sprites file in our application directory.  If we were
  246.      *  using more than one sprite, we would probably use a separate
  247.      *  sprite file.
  248.      */
  249.     return ((WA_LoadSprites ("!Sprites")) &&
  250.             (WA_LoadTemplate (TemplateFileName, "ProgInfo")) &&
  251.             (WA_LoadTemplate (TemplateFileName, "Window")) &&
  252.             ((FontDescriptor = WA_OpenFont (FontName,
  253.                                             FontSize,
  254.                                             FontSize,
  255.                                             FontResolution,
  256.                                             FontResolution)) != NULL)) ;
  257. }
  258.  
  259. /*
  260.  *==========================================================================
  261.  *
  262.  *  Local routines.
  263.  *
  264.  *==========================================================================
  265.  */
  266.  
  267. static unsigned int ClickHandler (
  268.     t_poll_block *poll_block,
  269.     void         *reference)
  270.  
  271. /*
  272.  *  Function :
  273.  *                  Click handler.
  274.  *
  275.  *  Parameters :
  276.  *                  poll_block  Pointer to block describing the event.
  277.  *                  reference   Ignored.
  278.  *
  279.  *  Returns :
  280.  *                  TRUE if we handled the event, FALSE otherwise.
  281.  *
  282.  */
  283.  
  284. {
  285.     t_state_block state ;
  286.  
  287.     reference = reference ;
  288.     /*
  289.      *  Check for left or right.
  290.      */
  291.     if ((poll_block->data.mc.button_state.m.adjust) ||
  292.         (poll_block->data.mc.button_state.m.select))
  293.     {
  294.         /*
  295.          *  The customer has clicked on our icon.  Display our window.
  296.          *  If it is already on view, this sequence will have the effect
  297.          *  of bringing it to the front.
  298.          */
  299.         if (LOG_OSError (WIMP_GetWindowState (WindowHandle,
  300.                                               &state)) == NULL)
  301.         {
  302.             state.open_block.behind = -1 ;
  303.             LOG_OSError (WIMP_OpenWindow (&(state.open_block))) ;
  304.         }
  305.         return (TRUE) ;
  306.     }
  307.     else
  308.     {
  309.         return (FALSE) ;
  310.     }
  311. }
  312.  
  313.  
  314. static void MenuHandler (
  315.     void      *reference,
  316.     const int *hit)
  317.  
  318. /*
  319.  *  Function :
  320.  *                  Menu event handler.
  321.  *
  322.  *  Parameters :
  323.  *                  reference  Ignored.
  324.  *                  hit        Indication of the menu hit.
  325.  *
  326.  *  Returns :
  327.  *                  None.
  328.  *
  329.  */
  330.  
  331. {
  332.     reference = reference ;
  333.     /*
  334.      *  See which menu entry has been chosen.
  335.      */
  336.     switch (hit [0])
  337.     {
  338.         case MENU_INFO :
  339.             WA_DisplayDbox (InfoDbox) ;
  340.             break ;
  341.  
  342.         case MENU_QUIT :
  343.             /*
  344.              *  This call causes our application to exit in an
  345.              *  orderly manner.
  346.              */
  347.             WA_WindUp () ;
  348.             break ;
  349.  
  350.     }
  351. }
  352.  
  353.  
  354. static uint RedrawHandler (
  355.     t_poll_block *poll_block,
  356.     void         *reference)
  357.  
  358. /*
  359.  *  Function :
  360.  *                  Handle incoming redraw requests.
  361.  *
  362.  *  Parameters :
  363.  *                  poll_block  Poll block describing event.
  364.  *                  reference   Ignored.
  365.  *
  366.  *  Returns :
  367.  *                  TRUE if we handled it, FALSE if we didn't.
  368.  *
  369.  */
  370.  
  371. {
  372.     uint                    more ;
  373.     static t_font_plot_type plot_type = {
  374.         FALSE,  /* Graphics justify */
  375.         FALSE,  /* Rubout */
  376.         FALSE,  /* 2  bits unused */
  377.  
  378.         TRUE,   /* OS units */
  379.         FALSE,  /* Use Coordinate block */
  380.         FALSE,  /* Use transformation matrix */
  381.         FALSE,  /* Use length value */
  382.  
  383.         TRUE,   /* Use font handle */
  384.         FALSE,  /* Do kerning */
  385.         FALSE,  /* Write from right to left */
  386.         0       /* The rest */
  387.     } ;
  388.     t_redraw_block          rb ;
  389.  
  390.     reference = reference ;
  391.     WIMP_SetFontColours (8, 0) ;
  392.     rb.handle = poll_block->data.ob.window_handle ;
  393.     if (LOG_OSError (WIMP_RedrawWindow (&rb, &more)) == NULL)
  394.     {
  395.         while (more)
  396.         {
  397.             FONT_Paint (FontDescriptor->handle,
  398.                         Text,
  399.                         plot_type,
  400.                         rb.visible_area.min.x - rb.scroll_offset.x + 25,
  401.                         rb.visible_area.max.y - rb.scroll_offset.y - 200,
  402.                         NULL,
  403.                         NULL,
  404.                         0) ;
  405.             WIMP_GetRectangle (&rb, &more) ;
  406.         }
  407.     }
  408.     return (TRUE) ;
  409. }
  410.