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

  1. /*
  2.     fnslug.c
  3.  
  4.     % slug_funcs
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988-1989, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      8/30/88 jdc    created
  13.      5/24/89 jdc    added sed_DoSpecial and special_key
  14.      8/30/89 gam    added check for MENU_VERTICAL before sed_Pop (again)
  15.  
  16.     11/12/89 jmd    added check for MOU_CLICK
  17.     11/27/89 ted    Made slug_fkey static.
  18.  
  19.     12/12/89 ted    overhauled.
  20.      2/20/90 jmd    changed Repaint to Update in ENTER case
  21.      3/28/90 jmd    ansi-fied
  22.      9/11/90 pmcm    changed sed_SetMouseCode to kb_Stuff
  23.     10/04/90 pmcm    removed isprint from search
  24.     10/31/90 ted    changed 'letter' from char to int to avoid int/char compiler warning.
  25.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  26. */
  27.  
  28. #include <stdio.h>
  29. #include <ctype.h>
  30.  
  31. #include "cscape.h"
  32. #include "scancode.h"
  33. #include "oaktag.h"                /* For IDs in msys.h */
  34. #include "msys.h"
  35. #include "helpdecl.h"
  36.  
  37. OSTATIC void slug_fkey(sed_type sed);
  38.  
  39. /* -------------------------------------------------------------------------- */
  40.  
  41. OGLOBAL field_funcs_struct slug_funcs = {
  42.     stdNoCur_fenter,
  43.     std_fexit,
  44.     slug_fkey,
  45.     FNULL,
  46.     FNULL,
  47.     0
  48. };
  49. /* -------------------------------------------------------------------------- */
  50.  
  51. static void slug_fkey(sed_type sed)
  52. /*
  53.     modifies:   sed.
  54.     effects:    Standard menu functions.
  55.                 Up and down keys change choices.
  56.                 Baton contains field number + 1 when ENTER is pressed
  57.                 or 0 if ESC pressed.
  58. */
  59. {
  60.     unsigned scancode;
  61.  
  62.     scancode = kb_Read();
  63.  
  64.     if (sed_DoSpecial(sed, scancode))
  65.         return;
  66.     if (special_key(sed, scancode))
  67.         return;
  68.  
  69.     slug_dokey(sed, scancode);
  70. }
  71. /* -------------------------------------------------------------------------- */
  72.  
  73. void slug_dokey(sed_type sed, unsigned scancode)
  74. {
  75.     switch(scancode) {
  76.  
  77.     case MOU_CLICK:
  78.     case ENTER:
  79.     {
  80.         int ret;
  81.  
  82.         if (msys_dir(sed) == MENU_VERTICAL) {
  83.             sed_Pop(sed);
  84.         }
  85.         ret = msys_bobgo(sed, ENTER);    /* 'ENTER' because no mouse suck needed */
  86.  
  87.         if (ret != 0) {
  88.             sed_ToggleExit(sed);
  89.             sed_SetBaton(sed, ret);
  90.         }
  91.         else {
  92.             sed_Update(sed);
  93.         }
  94.  
  95.         break;
  96.     }
  97.     case ESC:
  98.         sed_SetBaton(sed, 0);
  99.         sed_ToggleExit(sed);
  100.         break;
  101.  
  102.     case DOWN:
  103.     case RIGHT:
  104.         if ((msys_dir(sed) == MENU_VERTICAL) ^ (scancode == RIGHT)) {
  105.             if (sed_IncField(sed) == SED_STUCK) {
  106.                 sed_GotoFirstField(sed);
  107.             }
  108.         }
  109.         break;
  110.  
  111.     case UP:
  112.     case LEFT:
  113.         if ((msys_dir(sed) == MENU_VERTICAL) ^ (scancode == LEFT)) {
  114.             if (sed_DecField(sed) == SED_STUCK) {
  115.                 sed_GotoLastField(sed);
  116.             }
  117.         }
  118.         break;
  119.  
  120.      case PGUP:
  121.         sed_PageUp(sed);
  122.         break;
  123.  
  124.     case PGDN:
  125.         sed_PageDown(sed);
  126.         break;
  127.  
  128.     case HOME:
  129.         sed_GotoFirstField(sed);
  130.         break;
  131.  
  132.     case END:
  133.         sed_GotoLastField(sed);
  134.         break;
  135.  
  136.     default:
  137.     {
  138.         int    choice, letter;
  139.  
  140.         /* do first letter search */
  141.         letter = ascii(scancode);
  142.         if ((choice = sed_SearchMerge(sed, (char) letter)) != -1) {
  143.             sed_GotoField(sed, choice);
  144.             kb_Stuff(ENTER); /* select choice immediately */
  145.         }
  146.         break;
  147.     }
  148.     }
  149. }
  150. /* -------------------------------------------------------------------------- */
  151.  
  152.