home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNMENU.C < prev    next >
C/C++ Source or Header  |  1990-12-08  |  4KB  |  192 lines

  1. /*
  2.     fnmenu.c       11/21/86
  3.  
  4.     % menu_funcs, gmenu_funcs
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.     11/25/86 jmd    Added first letter search to menu_funcs.
  13.      4/06/88 jmd     added call to sed_DoSpecial
  14.      9/17/88 jmd     added std_ funcs
  15.     10/14/88 jdc    added var_size element to field_funcs_struct
  16.  
  17.      6/07/89 jmd    added test for mouse code (later removed)
  18.                     combined into one routine, added data pointer test
  19.                     combined with click_funcs
  20.      7/02/89 jdc    moved menucommon_return after sed_GotoField
  21.      3/28/90 jmd    ansi-fied
  22.     10/04/90 pmcm    removed isprint from search
  23.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  24. */
  25.  
  26. #include <stdio.h>
  27. #include <ctype.h>
  28.  
  29. #include "cscape.h"
  30. #include "ostdlib.h"        /* for atoi() */
  31. #include "fnfunc.h"            /* for field functions */
  32. #include "scancode.h"
  33.  
  34. OSTATIC void menucommon_fkey(sed_type sed, int mode);
  35. OSTATIC int  menucommon_return(sed_type sed);
  36.  
  37. /** modes **/
  38.  
  39. #define MENU_FUNCS        0
  40. #define GMENU_FUNCS        1
  41. #define CLICK_FUNCS        2
  42.  
  43. OGLOBAL field_funcs_struct menu_funcs = {
  44.     stdNoCur_fenter,
  45.     std_fexit,
  46.     menu_fkey,
  47.     FNULL,
  48.     FNULL,
  49.     0
  50. };
  51.  
  52. OGLOBAL field_funcs_struct gmenu_funcs = {
  53.     stdNoCur_fenter,
  54.     std_fexit,
  55.     gmenu_fkey,
  56.     FNULL,
  57.     FNULL,
  58.     0
  59. };
  60.  
  61. OGLOBAL field_funcs_struct click_funcs = {
  62.     std_fenter,
  63.     std_fexit,
  64.     click_fkey,
  65.     FNULL,
  66.     FNULL,
  67.     0
  68. };
  69.  
  70. void menu_fkey(sed_type sed)
  71. /*
  72.     modifies:   sed.
  73.     effects:    Standard menu functions.
  74.                 Up and down keys change choices.
  75.                 Baton contains field number + 1 when ENTER is pressed
  76.                 or 0 if ESC pressed.
  77.     Note:        If the field's second data pointer is not NULL,
  78.                 it is assumed to be a pointer to a numeric string, i.e., "2",
  79.                 This string is converted to an integer and returned
  80.                 via the baton when ENTER is pressed (instead of the
  81.                 field number).
  82.                 This makes if possible to define menus whose returns values
  83.                 are not dependent on field order.
  84. */
  85. {
  86.     menucommon_fkey(sed, MENU_FUNCS);
  87. }
  88.  
  89. void gmenu_fkey(sed_type sed)
  90. /*
  91.     modifies:   sed.
  92.     effects:    Grid menu functions.
  93.                 Up, down, left, and right keys change choices.
  94.                 Baton contains field number + 1 when ENTER is pressed
  95.                 or 0 if ESC pressed.
  96.     Note:        (see note for menu_fkey above)
  97. */
  98. {
  99.     menucommon_fkey(sed, GMENU_FUNCS);
  100. }
  101.  
  102. void click_fkey(sed_type sed)
  103. /*
  104.     Just like gmenu_funcs, except that first letter choices are immediate.
  105. */
  106. {
  107.     menucommon_fkey(sed, CLICK_FUNCS);
  108. }
  109.  
  110.  
  111. static void menucommon_fkey(sed_type sed, int mode)
  112. /*
  113.     This routines does the actual work for menu and gmenu_fkey.
  114.     mode determines how the function acts, MENU_FUNCS, GMENU_FUNCS
  115. */
  116. {
  117.     int scancode, letter, choice, ret;
  118.  
  119.     scancode = kb_Read();
  120.  
  121.     if (sed_DoSpecial(sed, scancode))
  122.         return;
  123.     if (special_key(sed, scancode))
  124.         return;
  125.  
  126.     /* intercept key (and mouse) before inter_field...() */
  127.     if (scancode == ENTER || scancode == MOU_CLICK) {
  128.         sed_SetBaton(sed, menucommon_return(sed));
  129.         sed_ToggleExit(sed);
  130.         return;
  131.     }
  132.  
  133.     if (mode == MENU_FUNCS) {
  134.         /* menu_fkey */
  135.         if (inter_field(sed, scancode))
  136.             return;
  137.     }
  138.     else {
  139.         /* gmenu_fkey and click_fkey */
  140.         if (inter_field_grid(sed, scancode))
  141.             return;
  142.     }
  143.     
  144.     if (inter_page(sed, scancode))
  145.         return;
  146.  
  147.     switch(scancode) {
  148.     case HOME:
  149.         sed_GotoFirstField(sed);
  150.         break;
  151.     case END:
  152.         sed_GotoLastField(sed);
  153.         break;
  154.     default:
  155.         /* do first letter search */
  156.         letter = ascii(scancode);
  157.         if ((choice = sed_SearchMerge(sed, (char)letter)) != -1) {
  158.             sed_GotoField(sed, choice);
  159.             ret = menucommon_return(sed);
  160.  
  161.             if (mode == CLICK_FUNCS) {
  162.                 /* click funcs return immediately when a letter is pressed */
  163.                 sed_SetBaton(sed, ret);
  164.                 sed_ToggleExit(sed);
  165.                 return;
  166.             }
  167.         }
  168.         break;
  169.     }
  170.  
  171.     /* reset baton */
  172.     sed_SetBaton(sed, -1);
  173. }
  174.  
  175.  
  176. static int menucommon_return(sed_type sed)
  177. /*
  178.     Determines the return value for menucommon_fkey when a choice is made.
  179.     If the second data isn't NULL, converts it from a string to an int
  180.     and returns that value, else returns the field number + 1.
  181. */
  182. {
  183.     char *d;
  184.  
  185.     if ((d = (char *) sed_GetFieldData(sed, sed_GetFieldNo(sed), 1)) != NULL) {
  186.         return(atoi(d));
  187.     }
  188.     else {
  189.         return(sed_GetFieldNo(sed) + 1);
  190.     }
  191. }
  192.