home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 1.ddi / FUNCS.EXE / CSCAPE / SOURCE / FNCHECK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-12  |  2.9 KB  |  154 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.1
  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. */
  25.  
  26. #include <stdio.h>
  27. #include <ctype.h>
  28.  
  29. #include "cscape.h"
  30. #include "fnfunc.h"            /* for field functions */
  31. #include "scancode.h"
  32.  
  33. #ifdef OAK_DOS
  34. #    define CHECK_MARK    "\xfb"
  35. #endif
  36.  
  37. #ifdef OAK_OS2
  38. #    define CHECK_MARK    "\xfb"
  39. #endif
  40.  
  41. #ifndef CHECK_MARK
  42. #    define CHECK_MARK    "*"
  43. #endif
  44.  
  45. OGLOBAL field_funcs_struct check_funcs = {
  46.     stdNoCur_fenter,
  47.     std_fexit,
  48.     check_fkey,
  49.     check_senter,
  50.     check_sexit,
  51.     sizeof(boolean)
  52. };
  53.  
  54. void check_fkey(sed)
  55.     sed_type sed;
  56. /*
  57.     Up and down keys move cursor.
  58.     letters search for choices.
  59.     space bar toggles choice selection.
  60.  
  61.     Baton contains field number + 1 when ENTER is pressed
  62.     or 0 if ESC pressed.
  63. */
  64. {
  65.     int   scancode, letter, choice;
  66.     char *p;
  67.  
  68.     scancode = kb_Read();
  69.  
  70.     if (sed_DoSpecial(sed, scancode))
  71.         return;
  72.     if (special_key(sed, scancode))
  73.         return;
  74.  
  75.     if (scancode == ENTER) {            /* intercept inter_field() */
  76.         sed_SetBaton(sed, sed_GetFieldNo(sed) + 1);
  77.         sed_ToggleExit(sed);
  78.         return;
  79.     }
  80.  
  81.     if (inter_field(sed, scancode))
  82.         return;
  83.     if (inter_page(sed, scancode))
  84.         return;
  85.  
  86.     if (scancode == MOU_CLICK) {
  87.         /* same as pressing space */
  88.         scancode = ' ';
  89.     }
  90.  
  91.     switch(scancode) {
  92.     case HOME:
  93.         sed_GotoFirstField(sed);
  94.         break;
  95.     case END:
  96.         sed_GotoLastField(sed);
  97.         break;
  98.     default:
  99.         /* do first letter search */
  100.         letter = ascii(scancode);
  101.         if (isprint(letter) &&
  102.          (choice=sed_SearchMerge(sed, (char)letter)) !=-1){
  103.             sed_GotoField(sed, choice);
  104.         }
  105.         else if (letter == ' ') {
  106.             p = sed_GetRecord(sed, sed_GetFieldNo(sed));
  107.             if (*p == '\0') {
  108.                 sed_SetRecord(sed, CHECK_MARK, sed_GetFieldNo(sed));
  109.             }
  110.             else {
  111.                 sed_SetRecord(sed, "", sed_GetFieldNo(sed));
  112.             }
  113.             sed_UpdateField(sed, sed_GetFieldNo(sed));
  114.         }
  115.         break;
  116.     }
  117.  
  118.     /* reset baton */
  119.     sed_SetBaton(sed, -1);
  120. }
  121.  
  122. void check_senter(sed, fieldno)
  123.     sed_type sed;
  124.     int fieldno;
  125. /*
  126.     Marks field if var is true
  127.     Unmarks otherwise
  128. */
  129. {
  130.     if (*((boolean *) sed_GetVar(sed, fieldno))) {
  131.         sed_SetRecord(sed, CHECK_MARK, fieldno);
  132.     }
  133.     else {
  134.         sed_SetRecord(sed, "", fieldno);
  135.     }
  136. }
  137.  
  138. void check_sexit(sed, fieldno)
  139.     sed_type sed;
  140.     int fieldno;
  141. /*
  142.     Sets var true if field is marked
  143.     False otherwise
  144. */
  145. {
  146.     char *p;
  147.  
  148.     if (sed_GetBaton(sed) != SED_ABORT) {
  149.         p = sed_GetRecord(sed, fieldno);
  150.         *((boolean *) sed_GetVar(sed, fieldno)) = !(*p == '\0');
  151.     }
  152. }
  153.  
  154.