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

  1. /*
  2.     fnbob.c  8/30/88
  3.  
  4.     % bob_funcs
  5.  
  6.     Object control passing functions.
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1986-1989 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      9/15/88 jmd     removed vid_Cursor calls
  15.      9/17/88 jmd     added std_ funcs
  16.     10/14/88 jdc    added var_size element to field_funcs_struct
  17.     12/05/88 jmd    added mouse checking
  18.     12/06/88 jmd    added special func, nesting support
  19.      5/23/89 jdc    made default case pass value back instead of sed_IncField
  20.  
  21.      1/29/90 jmd    added support for independent bobs
  22.      3/28/90 jmd    ansi-fied
  23.      4/12/90 pmcm    switched on ret value of independent bob
  24.      5/17/90 pmcm    BOB_QUIT changed to 0 in relay when baton reaches parent
  25.      8/07/90 pmcm    added BOB_INC
  26.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <ctype.h>
  31.  
  32. #include "cscape.h"
  33. #include "fnfunc.h"
  34. #include "scancode.h"
  35.  
  36. OGLOBAL field_funcs_struct bob_funcs = {
  37.     stdNoCur_fenter,
  38.     std_fexit,
  39.     bob_fkey,
  40.     FNULL,
  41.     FNULL,
  42.     0
  43. };
  44.  
  45. void bob_fkey(sed_type sed)
  46. /*
  47.     Calls bob_Go for the bob attached to the field.
  48.     Moves to the next field in the direction indicated
  49.     by bob_Go's return value.
  50.     If the bob is independent, waits for ENTER/MOU_CLICK
  51.     and then calls go on it.
  52. */
  53. {
  54.     bob_type bob;
  55.     int      scancode, ret, fieldno;
  56.  
  57.     fieldno = sed_GetFieldNo(sed);
  58.     if ((bob = sed_GetFieldBob(sed, fieldno)) == NULL) {
  59.  
  60.         /* Error: no bob attached to the field */
  61.         sed_SetBaton(sed, BOB_QUIT);
  62.         sed_ToggleExit(sed);
  63.         return;
  64.     }
  65.  
  66.     if (bob_IsDepend(bob)) {
  67.         /* Dependent bob: call go directly */
  68.  
  69.         ret = bob_Go(bob);
  70.  
  71.         /* return 0 instead of BOB_QUIT from ultimate ancestor */
  72.         if (ret == BOB_QUIT) {
  73.             ret = (bob_GetParent(sed) == NULL) ? 0 : ret;
  74.         }
  75.  
  76.         /* See if special function is interested in BOB_ code */
  77.         if (sed_DoSpecial(sed, ret)) {
  78.             return;
  79.         }
  80.  
  81.         switch (ret) {
  82.         case BOB_INC:
  83.             if (sed_IncField(sed) == SED_STUCK) {
  84.                 sed_SetBaton(sed, sed_GetFieldNo(sed) + 1);
  85.                 sed_ToggleExit(sed);
  86.             }
  87.             break;
  88.         case BOB_UP:
  89.             sed_UpField(sed);
  90.             break;
  91.         case BOB_DOWN:
  92.             sed_DownField(sed);
  93.             break;
  94.         case BOB_LEFT:
  95.             sed_LeftField(sed);
  96.             break;
  97.         case BOB_RIGHT:
  98.             sed_RightField(sed);
  99.             break;
  100.  
  101.         case BOB_QUIT:
  102.         default:
  103.             sed_SetBaton(sed, ret);
  104.             sed_ToggleExit(sed);
  105.             break;
  106.         }
  107.     }
  108.     else {
  109.         /* Independent bob: get a keystroke (a la menu_funcs) */
  110.  
  111.         scancode = kb_Read();
  112.  
  113.         if (sed_DoSpecial(sed, scancode))
  114.             return;
  115.         if (special_key(sed, scancode))
  116.             return;
  117.  
  118.         /* intercept key (and mouse) before inter_field... */
  119.         if (scancode == ENTER || scancode == MOU_CLICK) {
  120.  
  121.             /*     Only pressing ENTER or clicking with the mouse activates an
  122.                  indie bob.
  123.                 Paint and go, then remove bob from display.
  124.              */
  125.  
  126.             bob_Repaint(bob);
  127.             ret = bob_Go(bob);
  128.             bob_Pop(bob);
  129.  
  130.             /* return 0 instead of BOB_QUIT from ultimate ancestor */
  131.             if (ret == BOB_QUIT) {
  132.                 ret = (bob_GetParent(sed) == NULL) ? 0 : ret;
  133.             }
  134.  
  135.             /*     See if special function is interested in return code 
  136.                 code from the indie bob 
  137.             */
  138.             if (sed_DoSpecial(sed, ret)) {
  139.                 return;
  140.             }
  141.  
  142.             switch (ret) {
  143.             case 0:
  144.                 break;
  145.             case BOB_INC:
  146.                 sed_IncField(sed);
  147.                 break;
  148.             case BOB_UP:
  149.                 sed_UpField(sed);
  150.                 break;
  151.             case BOB_DOWN:
  152.                 sed_DownField(sed);
  153.                 break;
  154.             case BOB_LEFT:
  155.                 sed_LeftField(sed);
  156.                 break;
  157.             case BOB_RIGHT:
  158.                 sed_RightField(sed);
  159.                 break;
  160.             case BOB_QUIT:
  161.             default:
  162.                 sed_SetBaton(sed, ret);
  163.                 sed_ToggleExit(sed);
  164.                 break;
  165.             }
  166.             return;
  167.         }
  168.  
  169.         /*     If we did not activate the indie bob, pass the keystroke or
  170.             mouse event onto inter_field_grid and inter_page.
  171.         */
  172.         if (inter_field_grid(sed, scancode))
  173.             return;
  174.         
  175.         if (inter_page(sed, scancode))
  176.             return;
  177.     }
  178. }
  179.  
  180.