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

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