home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNCHECK.C < prev    next >
C/C++ Source or Header  |  1990-10-04  |  3KB  |  148 lines

  1. /*
  2.     fncheck.c       9/26/88
  3.  
  4.     % check_funcs
  5.  
  6.     Check marked field functions
  7.     for creating multiple choice lists
  8.  
  9.     The field variable should be a boolean *.
  10.     The record should contain a writable position for the check mark.
  11.  
  12.     C-scape 3.2
  13.     Copyright (c) 1988, by Oakland Group, Inc.
  14.     ALL RIGHTS RESERVED.
  15.  
  16.     Revision History:
  17.     -----------------
  18.     10/09/88 jmd     added SED_ABORT support
  19.     10/14/88 jdc    added var_size element to field_funcs_struct
  20.     12/20/88 jmd    added mouse support
  21.  
  22.      3/01/89 jmd    changed CS_DOS to OAK_DOS
  23.      6/07/89 jmd    added test for mouse code (later removed)
  24.      3/28/90 jmd    ansi-fied
  25.      3/28/90 ted    Moved MOU_CLICK test into a switch case.
  26.     10/04/90 pmcm    removed isprint from search
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <ctype.h>
  31.  
  32. #include "cscape.h"
  33. #include "fnfunc.h"            /* for field functions */
  34. #include "scancode.h"
  35.  
  36. #ifdef OAK_DOS
  37. #    define CHECK_MARK    "\xfb"
  38. #endif
  39.  
  40. #ifdef OAK_OS2
  41. #    define CHECK_MARK    "\xfb"
  42. #endif
  43.  
  44. #ifndef CHECK_MARK
  45. #    define CHECK_MARK    "*"
  46. #endif
  47.  
  48. OGLOBAL field_funcs_struct check_funcs = {
  49.     stdNoCur_fenter,
  50.     std_fexit,
  51.     check_fkey,
  52.     check_senter,
  53.     check_sexit,
  54.     sizeof(boolean)
  55. };
  56.  
  57. void check_fkey(sed_type sed)
  58. /*
  59.     Up and down keys move cursor.
  60.     letters search for choices.
  61.     space bar toggles choice selection.
  62.     Baton contains field number + 1 when ENTER is pressed
  63.     or 0 if ESC pressed.
  64. */
  65. {
  66.     int   scancode, letter, choice;
  67.     char *p;
  68.  
  69.     scancode = kb_Read();
  70.  
  71.     if (sed_DoSpecial(sed, scancode))
  72.         return;
  73.     if (special_key(sed, scancode))
  74.         return;
  75.  
  76.     if (scancode == ENTER) {            /* intercept inter_field() */
  77.         sed_SetBaton(sed, sed_GetFieldNo(sed) + 1);
  78.         sed_ToggleExit(sed);
  79.         return;
  80.     }
  81.  
  82.     if (inter_field(sed, scancode))
  83.         return;
  84.     if (inter_page(sed, scancode))
  85.         return;
  86.  
  87.     switch(scancode) {
  88.     case HOME:
  89.         sed_GotoFirstField(sed);
  90.         break;
  91.     case END:
  92.         sed_GotoLastField(sed);
  93.         break;
  94.     case MOU_CLICK:        /* same as pressing space */
  95.         scancode = ' ';
  96.         /* no break; */
  97.     default:
  98.         /* do first letter search */
  99.         letter = ascii(scancode);
  100.         if ((choice = sed_SearchMerge(sed, (char)letter)) != -1) {
  101.             sed_GotoField(sed, choice);
  102.         }
  103.         else if (letter == ' ') {
  104.             p = sed_GetRecord(sed, sed_GetFieldNo(sed));
  105.             if (*p == '\0') {
  106.                 sed_SetRecord(sed, CHECK_MARK, sed_GetFieldNo(sed));
  107.             }
  108.             else {
  109.                 sed_SetRecord(sed, "", sed_GetFieldNo(sed));
  110.             }
  111.             sed_UpdateField(sed, sed_GetFieldNo(sed));
  112.         }
  113.         break;
  114.     }
  115.  
  116.     /* reset baton */
  117.     sed_SetBaton(sed, -1);
  118. }
  119.  
  120. void check_senter(sed_type sed, int fieldno)
  121. /*
  122.     Marks field if var is true
  123.     Unmarks otherwise
  124. */
  125. {
  126.     if (*((boolean *) sed_GetVar(sed, fieldno))) {
  127.         sed_SetRecord(sed, CHECK_MARK, fieldno);
  128.     }
  129.     else {
  130.         sed_SetRecord(sed, "", fieldno);
  131.     }
  132. }
  133.  
  134. void check_sexit(sed_type sed, int fieldno)
  135. /*
  136.     Sets var true if field is marked
  137.     False otherwise
  138. */
  139. {
  140.     char *p;
  141.  
  142.     if (sed_GetBaton(sed) != SED_ABORT) {
  143.         p = sed_GetRecord(sed, fieldno);
  144.         *((boolean *) sed_GetVar(sed, fieldno)) = !(*p == '\0');
  145.     }
  146. }
  147.  
  148.