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

  1. /*
  2.     fnstrcom.c
  3.  
  4.     -jmd 8/07/89
  5.  
  6.     % StrCommon_fkey
  7.  
  8.     Common routines used by string editing field functions
  9.  
  10.     C-scape 3.2
  11.     Copyright (c) 1986-1989 by Oakland Group, Inc.
  12.     ALL RIGHTS RESERVED.
  13.  
  14.     Revision History:
  15.     -----------------
  16.      1/31/90 jmd    don't reset baton on MOU_CLICK
  17.      3/24/90 jmd    added sfilter_func define
  18.      3/28/90 jmd    ansi-fied
  19.     10/20/90 mla    fixed padding bug in clear record on first keystroke case
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <ctype.h>
  25.  
  26. #include "cscape.h"
  27. #include "fnfunc.h"
  28. #include "scancode.h"
  29.  
  30. void StrCommon_fkey(sed_type sed, sfilter_fptr filter)
  31. /*
  32.     fkey function for various string field functions.
  33.     Uses the 'filter' function to test characters
  34.     as they are typed in.  if 'filter' returns TRUE
  35.     the character is accepted.
  36. */
  37. {
  38.     int     scancode, key;
  39.  
  40.     scancode = kb_Read();
  41.  
  42.     if (sed_DoSpecial(sed, scancode))
  43.         return;
  44.     if (special_key(sed, scancode))
  45.         return;
  46.     if (inter_field(sed, scancode))
  47.         return;
  48.     if (inter_page(sed, scancode))
  49.         return;
  50.  
  51.     switch(scancode) {
  52.     case RIGHT:
  53.         sed_IncChar(sed);
  54.         break;
  55.     case LEFT:
  56.         sed_DecChar(sed);
  57.         break;
  58.     case HOME:
  59.         sed_GoHome(sed);
  60.         break;
  61.     case END:
  62.         sed_GoEnd(sed);
  63.         break;
  64.     case INS:
  65.         if (kb_Insert()) {
  66.             sed_SetCursorType(sed, CURSOR_HALF);
  67.         }
  68.         else {
  69.             sed_SetCursorType(sed, CURSOR_NORMAL);
  70.         }
  71.         break;
  72.     case BACKSPACE:
  73.         if (sed_DecChar(sed)) {
  74.             sed_PullRight(sed);
  75.         }
  76.         break;
  77.     case DEL:
  78.         sed_PullRight(sed);
  79.         break;
  80.     default:
  81.         key = ascii(scancode);
  82.  
  83.         if ((*filter)(key)) {
  84.             if (sed_GetBaton(sed) == SED_FIRST) {
  85.                 /* clear record on first keystroke */
  86.                 sed_SetCurrRecord(sed, "");
  87.                 sed_GoHome(sed);
  88.                 sed_UpdateCurrField(sed);
  89.             }
  90.  
  91.             if (kb_Insert()) {
  92.                 sed_PushRight(sed, key);
  93.             }
  94.             else {
  95.                 sed_Overwrite(sed, key);
  96.             }
  97.  
  98.             sed_IncChar(sed);
  99.         }
  100.         break;
  101.     }
  102.  
  103.     /* reset baton */
  104.     if (scancode != MOU_CLICK) {
  105.         sed_SetBaton(sed, -1);
  106.     }
  107. }
  108.