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

  1. /*
  2.     fntoggle.c        10/02/87
  3.  
  4.     % toggle_funcs
  5.  
  6.     Toggle Functions:
  7.     A field has multiple choices.
  8.     The Space bar changes the selection.
  9.     The Variable is the number of the selected choice.
  10.  
  11.     The choices are contained in the field's second data pointer in
  12.     the form "choice 1, choice 2, choice 3"  (commas delimit).
  13.  
  14.     The cursor is turned off.
  15.  
  16.     Also toggles choice when clicked with a mouse.
  17.     (if mouse handler is attached to sed)
  18.  
  19.     C-scape 3.2
  20.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  21.     ALL RIGHTS RESERVED.
  22.  
  23.     Revision History:
  24.     -----------------
  25.      3/31/88 jmd    Removed tinkering of static strings
  26.      4/06/88 jmd     added call to sed_DoSpecial
  27.      4/13/88 jmd     changed MAX_FIELD_LEN to MAX_CHOICE_LEN
  28.      9/15/88 jmd     removed vid_Cursor calls
  29.      9/17/88 jmd     added std_ funcs
  30.     10/09/88 jmd     added SED_ABORT support
  31.     10/14/88 jdc    added var_size element to field_funcs_struct
  32.     12/14/88 jdc    removed pointer subtraction from toggle_GetNextChoice()
  33.     12/20/88 jmd    fixed missing entry problem, added mouse support
  34.  
  35.      2/07/89 jmd    added char * cast
  36.      4/10/89 jmd    added oakpriv.h
  37.      6/07/89 jmd    added test for mouse code (later removed)
  38.  
  39.     11/29/89 jmd    added casts for DG
  40.      3/28/90 jmd    ansi-fied
  41. */
  42.  
  43. #include <stdio.h>
  44. #include <string.h>
  45. #include <ctype.h>
  46.  
  47. #include "cscape.h"
  48. #include "fnfunc.h"            /* for field functions */
  49. #include "scancode.h"
  50.  
  51. #include "oakpriv.h"        /* for memmove() macro */
  52.  
  53. #define    DELIMITER    ','
  54.  
  55. OSTATIC void toggle_GetNextChoice(char *list, char *string, char *curr, int slen);
  56.  
  57. #define MAX_CHOICE_LEN    80            /* maximum length of a choice */
  58.  
  59. OGLOBAL field_funcs_struct toggle_funcs = {
  60.     stdNoCur_fenter,
  61.     std_fexit,
  62.     toggle_fkey,
  63.     string_senter,
  64.     string_sexit,
  65.     VAR_STRING
  66. };
  67.  
  68. void toggle_fkey(sed_type sed)
  69. /*
  70.     Cycle through list of changes when the SPACE bar is pressed.
  71.     (or when mouse is clicked on the field)
  72. */
  73. {
  74.     int     scancode;
  75.     char     s[MAX_CHOICE_LEN + 1];
  76.     char    *list;
  77.     int        fieldno;
  78.  
  79.     scancode = kb_Read();
  80.  
  81.     if (sed_DoSpecial(sed, scancode))
  82.         return;
  83.     if (special_key(sed, scancode))
  84.         return;
  85.     if (inter_field(sed, scancode))
  86.         return;
  87.     if (inter_page(sed, scancode))
  88.         return;
  89.  
  90.     switch(scancode) {
  91.     case 0:        /* this case is just here to trick certain compilers    */
  92.     default:
  93.         if (scancode == MOU_CLICK || (ascii(scancode)) == ' ') {
  94.             fieldno = sed_GetFieldNo(sed);
  95.             if ((list = (char *) sed_GetFieldData(sed, fieldno, 1)) != NULL) {
  96.                 toggle_GetNextChoice(list, s,
  97.                     sed_GetCurrRecord(sed), sed_GetRecordLen(sed, fieldno));
  98.                 sed_SetCurrRecord(sed, s);
  99.                 sed_UpdateCurrField(sed);
  100.             }
  101.         }
  102.     }
  103.  
  104.     /* reset baton */
  105.     sed_SetBaton(sed, -1);
  106. }
  107.  
  108. static void toggle_GetNextChoice(char *list, char *string, char *curr, int slen)
  109. /*
  110.     Copies the next choice from the list into string.
  111.     Returns string.
  112.     List is of the form:
  113.     "choice 1,choice 2,choice 3"  (commas delimit).
  114.     Note: assumes that string is at least MAX_CHOICE_LEN + 1 chars long.
  115. */
  116. {
  117.     int     off, word_off;
  118.     int     len1, len;
  119.     boolean found;
  120.     char   *start;
  121.  
  122.     /* skip leading DELIMITERS */
  123.     for (off = 0; list[off] == DELIMITER; off++) {
  124.         ;
  125.     }
  126.  
  127.     start = &list[off];
  128.  
  129.     for (word_off = off, len1 = -1, found = FALSE;; off++) {
  130.  
  131.         if (list[off] == DELIMITER || list[off] == '\0') {
  132.             if ( (len = off - word_off) > MAX_CHOICE_LEN ) {
  133.                 len = MAX_CHOICE_LEN;
  134.             }
  135.             if (len1 == -1) {
  136.                 /* remember length of first word */
  137.                 len1 = len;
  138.             }
  139.              memmove((VOID *) string, (VOID *) (list + word_off), len);
  140.              string[len] = '\0';
  141.  
  142.              if (found) {
  143.                  return;
  144.              }
  145.              if (strncmp(string, curr, slen) == 0) {
  146.                  /* get the next choice */
  147.                  found = TRUE;
  148.              }
  149.  
  150.             /* find next entry */
  151.             /* point word_off to beginning of next entry */
  152.             for (word_off = off + 1; list[word_off] == DELIMITER; word_off++, off++) {
  153.                 ;
  154.             }
  155.             if (list[word_off] == '\0') {
  156.                 break;
  157.             }
  158.         }
  159.         if (list[off] == '\0') {
  160.             break;
  161.         }
  162.     }
  163.     /* curr not found or wrap-a-round, return first choice */
  164.     if (len1 == -1) {
  165.         string[0] = '\0';
  166.     }
  167.     else {
  168.         memmove((VOID *) string, (VOID *) start, len1);
  169.         string[len1] = '\0';
  170.     }
  171. }
  172.