home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / FUNCS / FNRADIO.C < prev    next >
C/C++ Source or Header  |  1990-10-25  |  4KB  |  158 lines

  1. /*
  2.     fnradio.c       
  3.  
  4.     by mla 2/14/90  (ripped off most of it from check_funcs)
  5.  
  6.     % radio_funcs
  7.  
  8.     Car radio style check marked field functions
  9.     for creating single choice lists
  10.  
  11.     All fields of the same name are considered a radio group.
  12.     Only one selection per group is allowed.
  13.  
  14.     To have radio_funcs simulate real radio buttons (ie one field must be
  15.     chosen and only one field may be chosen), the programmer must initialize
  16.     all variables in the group to FALSE except one (the default choice)
  17.     which must be initialized to TRUE.  The #define ALWAYS_ONE line should 
  18.     be removed if the user is to be permited to choose none of the fields.
  19.  
  20.     The field variable should be a boolean *.
  21.     The record should contain a writable position for the check mark.
  22.  
  23.     C-scape 3.2
  24.     Copyright (c) 1988, by Oakland Group, Inc.
  25.     ALL RIGHTS RESERVED.
  26.  
  27.     Revision History:
  28.     -----------------
  29.      2/15/90 jmd    made space bar work
  30.      3/28/90 jmd    ansi-fied
  31.     10/04/90 pmcm    removed isprint from search
  32.     10/25/90 pmcm    added null field name check in for search loop
  33. */
  34.  
  35. #include <stdio.h>
  36. #include <ctype.h>
  37. #include <string.h>
  38.  
  39. #include "cscape.h"
  40. #include "fnfunc.h"            /* for field functions */
  41. #include "scancode.h"
  42.  
  43. /*  remove this line if no choice is an option  */
  44. #define ALWAYS_ONE
  45.  
  46. #ifdef OAK_DOS
  47. #    define CHECK_MARK    "\xfb"
  48. #endif
  49.  
  50. #ifdef OAK_OS2
  51. #    define CHECK_MARK    "\xfb"
  52. #endif
  53.  
  54. #ifndef CHECK_MARK
  55. #    define CHECK_MARK    "*"
  56. #endif
  57.  
  58. OGLOBAL field_funcs_struct radio_funcs = {
  59.     stdNoCur_fenter,
  60.     std_fexit,
  61.     radio_fkey,
  62.     check_senter,
  63.     check_sexit,
  64.     sizeof(boolean)
  65. };
  66.  
  67. void radio_fkey(sed_type sed)
  68. /*
  69.     Up and down keys move cursor.
  70.     letters search for choices.
  71.     space bar toggles choice selection.
  72.     Baton contains field number + 1 when ENTER is pressed
  73.     or 0 if ESC pressed.
  74. */
  75. {
  76.     int   scancode, letter, choice, i;
  77.     char *group;
  78.     char *fieldname;
  79.  
  80.     scancode = kb_Read();
  81.  
  82.     if (sed_DoSpecial(sed, scancode))
  83.         return;
  84.     if (special_key(sed, scancode))
  85.         return;
  86.  
  87.     if (scancode == ENTER) {            /* intercept inter_field() */
  88.         sed_SetBaton(sed, sed_GetFieldNo(sed) + 1);
  89.         sed_ToggleExit(sed);
  90.         return;
  91.     }
  92.  
  93.     if (inter_field(sed, scancode))
  94.         return;
  95.     if (inter_page(sed, scancode))
  96.         return;
  97.  
  98.     /* make space equivalent to mouse click */
  99.     if (ascii(scancode) == ' ') {
  100.         scancode = MOU_CLICK;
  101.     }
  102.  
  103.     switch(scancode) {
  104.     case HOME:
  105.         sed_GotoFirstField(sed);
  106.         break;
  107.     case END:
  108.         sed_GotoLastField(sed);
  109.         break;
  110.     case ' ':
  111.     case MOU_CLICK:
  112.         group = sed_GetFieldName(sed, sed_GetFieldNo(sed));
  113.         if (group != NULL) {
  114.             if (*sed_GetCurrRecord(sed) == '\0') {  /* curr field unchecked */
  115.                   for (i = sed_GetFieldCount(sed); i-- > 0; ) {
  116.                     
  117.                     if ((fieldname = sed_GetFieldName(sed, i)) != NULL &&
  118.                         !strcmp(fieldname, group)) {
  119.  
  120.                         if (i == sed_GetFieldNo(sed)) {
  121.                             sed_SetRecord(sed, CHECK_MARK, i); /* check it  */
  122.                         }
  123.                         else {
  124.                             sed_SetRecord(sed, "", i);     /* uncheck the rest */
  125.                         }
  126.                         sed_UpdateField(sed, i);        
  127.                     }
  128.                 }
  129.             }
  130.             else {                                    /* curr field checked  */
  131.                   for (i = sed_GetFieldCount(sed); i-- > 0; ) {
  132.                     if ((fieldname = sed_GetFieldName(sed, i)) != NULL &&
  133.                         !strcmp(fieldname, group)) {
  134. #ifdef ALWAYS_ONE                                /* do we want to uncheck it? */
  135.                         if (i != sed_GetFieldNo(sed)) {
  136. #endif                                            /*  uncheck the rest anyway  */
  137.                             sed_SetRecord(sed, "", i);
  138. #ifdef ALWAYS_ONE
  139.                         }
  140. #endif                           
  141.                         sed_UpdateField(sed, i);        
  142.                     }
  143.                 }
  144.             } 
  145.             break;
  146.         }
  147.     default:
  148.         /* do first letter search */
  149.         letter = ascii(scancode);
  150.         if ((choice = sed_SearchMerge(sed, (char)letter)) != -1) {
  151.             sed_GotoField(sed, choice);
  152.         }
  153.  
  154.         /* reset baton */
  155.         sed_SetBaton(sed, -1);
  156.     }
  157. }
  158.