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

  1. /*
  2.     fntogint.c
  3.  
  4.     % togint_funcs, like toggle_funcs except the variable is an int
  5.  
  6.     A field has multiple choices.
  7.     The Space bar changes the selection.
  8.     First letter searching.
  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) 1989 by Oakland Group, Inc.
  21.     ALL RIGHTS RESERVED.
  22.  
  23.     Revision History:
  24.     -----------------
  25.     11/04/89 jdc    changed toupper & tolower to otoupper & otolower
  26.      3/28/90 jmd    ansi-fied
  27.      6/01/90 jmd    changed index to indeks to avoid DG conflict
  28.      6/05/90 jmd    changed the rest of index to indeks to avoid DG conflict
  29.     10/31/90 ted    changed 'key' from char to int to avoid int/char compiler warning.
  30. */
  31.  
  32. #include <stdio.h>
  33. #include <string.h>
  34. #include <ctype.h>
  35.  
  36. #include "cscape.h"
  37. #include "fnfunc.h"            /* for field functions */
  38. #include "scancode.h"
  39.  
  40. #include "oakpriv.h"        /* for memmove() macro */
  41.  
  42. OGLOBAL field_funcs_struct togint_funcs = { 
  43.     stdNoCur_fenter,
  44.     std_fexit,
  45.     togint_fkey,
  46.     togint_senter,
  47.     togint_sexit,
  48.     sizeof(int)
  49. };
  50.  
  51. #define    DELIMITER    ','
  52. #define TOGINT_CHOICE_COUNT        100
  53.  
  54. OSTATIC char *togint_GetChoice(char *list, char *string, int indeks, int slen);
  55.  
  56. void togint_fkey(sed_type sed)
  57. /*
  58.     Cycle through list of changes when the SPACE bar is pressed.
  59.     (or when mouse is clicked on the field)
  60. */
  61. {
  62.     int     scancode, i, fieldno, key;
  63.     char    *list, choice;
  64.  
  65.     scancode = kb_Read();
  66.  
  67.     if (sed_DoSpecial(sed, scancode))
  68.         return;
  69.     if (special_key(sed, scancode))
  70.         return;
  71.     if (inter_field(sed, scancode))
  72.         return;
  73.     if (inter_page(sed, scancode))
  74.         return;
  75.  
  76.     /* reset baton */
  77.     sed_SetBaton(sed, -1);
  78.  
  79.     if ((list = (char *) sed_GetFieldData(sed, sed_GetFieldNo(sed), 1)) == NULL) {
  80.         return;
  81.     }
  82.  
  83.     fieldno = sed_GetFieldNo(sed);
  84.  
  85.     /* toggle on mouse click or spacebar */
  86.     if (scancode == MOU_CLICK || (ascii(scancode)) == ' ') {
  87.  
  88.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  89.  
  90.             if (strncmp(togint_GetChoice(list, sed_GetScratchPad(sed), 
  91.                 i, sed_GetRecordLen(sed, fieldno)), 
  92.                 sed_GetCurrRecord(sed), 
  93.                 sed_GetRecordLen(sed, fieldno)) == 0) {
  94.  
  95.                 togint_GetChoice(list, sed_GetScratchPad(sed), i + 1, 
  96.                     sed_GetRecordLen(sed, fieldno));
  97.                 sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  98.                 sed_UpdateCurrField(sed);
  99.                 break;
  100.             }
  101.         }
  102.     }
  103.     /* do first letter search */
  104.     else {
  105.         key = otolower(ascii(scancode));
  106.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  107.  
  108.             choice = otolower(*togint_GetChoice(list, sed_GetScratchPad(sed), 
  109.                 i, sed_GetRecordLen(sed, fieldno)));
  110.  
  111.             if (choice == (char) key) {
  112.                 sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  113.                 sed_UpdateCurrField(sed);
  114.                 break;
  115.             }
  116.         }
  117.     }
  118. }
  119.  
  120. static char *togint_GetChoice(char *list, char *string, int indeks, int slen)
  121. /*
  122.     Copies the next choice from the list into string.
  123.     Returns string.
  124.     List is of the form:
  125.     "choice 1,choice 2,choice 3"  (commas delimit).
  126. */
  127. {
  128.     int start_off, off, word_off;
  129.     int len, len1, count;
  130.     
  131.     /* skip leading DELIMITERS */
  132.     for (start_off = 0; list[start_off] == DELIMITER; start_off++) {
  133.         ;
  134.     }
  135.  
  136.     for (word_off = off = start_off, count = 0, len1 = -1;; off++) {
  137.  
  138.         if (list[off] == DELIMITER || list[off] == '\0') {
  139.             if ((len = off - word_off) > slen) {
  140.                 len = slen;
  141.             }
  142.             if (len1 == -1) {
  143.                 len1 = len;
  144.             }
  145.             if (count == indeks) {
  146.                  memmove(string, list + word_off, len);
  147.                  string[len] = '\0';
  148.                  return(string);
  149.              }
  150.             if (list[off] == '\0') {
  151.                  memmove(string, list + start_off, len1);
  152.                  string[len1] = '\0';
  153.                  return(string);
  154.             }
  155.             count++;
  156.             word_off = off + 1;
  157.         }
  158.     }
  159. }
  160.  
  161. void togint_senter(sed_type sed, int fieldno)
  162. /*
  163.     This function goes from the native int to the record string.
  164. */
  165. {
  166.     char *list;
  167.  
  168.     if ((list = (char *) sed_GetFieldData(sed, fieldno, 1)) == NULL) {
  169.         return;
  170.     }
  171.  
  172.     togint_GetChoice(list, sed_GetScratchPad(sed), 
  173.         *(int *)sed_GetVar(sed, fieldno), sed_GetRecordLen(sed, fieldno));
  174.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  175.  
  176.     std_senter(sed, fieldno);
  177. }
  178.  
  179. void togint_sexit(sed_type sed, int fieldno)
  180. /*
  181.     Converts the record string into a int.
  182. */
  183. {
  184.     int i;
  185.     char *list;
  186.  
  187.     if (sed_GetBaton(sed) != SED_ABORT) {
  188.  
  189.         if ((list = (char *) sed_GetFieldData(sed, fieldno, 1)) == NULL) {
  190.             return;
  191.         }
  192.         for (i = 0; i < TOGINT_CHOICE_COUNT; i++) {
  193.             if (strncmp(togint_GetChoice(list, sed_GetScratchPad(sed), 
  194.                 i, sed_GetRecordLen(sed, fieldno)), sed_GetRecord(sed, fieldno), 
  195.                 sed_GetRecordLen(sed, fieldno)) == 0) {
  196.  
  197.                 *(int *)sed_GetVar(sed, fieldno) = i;
  198.                 return;
  199.             }
  200.         }
  201.         *(int *)sed_GetVar(sed, fieldno) = 0;
  202.     }
  203. }
  204.  
  205.