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

  1. /*
  2.     fnframer.c 
  3.  
  4.     jmd 6/23/89  new(er) framer funcs
  5.  
  6.     % framer_funcs
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988-1989, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      5/24/89 jdc    added sed_DoSpecial and special_key
  15.      5/26/89 jdc    added fix for help
  16.      6/23/89 jmd    completely rewrote
  17.      6/26/89 jmd    added FRAME_LEFT, FRAME_RIGHT
  18.      7/21/89 jdc    readded special_key and added immediate selection from
  19.                     sed_SearchMerge
  20.                     changed return value condition
  21.      8/12/89 jmd    removed call to sed_GetBob
  22.  
  23.     12/09/89 ted    Completely rewrote.
  24.      3/10/90 pmcm    Changed so _bobgo ret'ing 0 to pulldown keeps pulldown down
  25.      3/14/90 jmd    changed fexit, fenter to std_fexit, std_fenter
  26.      3/28/90 jmd    ansi-fied
  27.      4/08/90 ted    Fixed pulldown bug pmcm and I made on 3/3/90 when we fixed the ufunc rtn case.
  28.      4/23/90 jmd    fixed expression for Zortech compiler
  29.      8/13/90 ted    Changed references from sed_SetMouseCode to kb_Stuff.
  30.      8/13/90 ted    Modified framer bit test to allow sub-pulldowns.
  31.      8/29/90 ted    Reconstructed to have more SAA-like mouse behavior.
  32.      9/23/90 ted    Got rid of FRAME_QUIT code, made use of MOU_THERE code.
  33.      9/23/90 ted    Turned BD_MOUSETHRU on before painting a dropdown sed.
  34.     10/04/90 pmcm    removed isprint from search
  35.     10/16/90 ted    fixed framer test loop so embedded framers will work.
  36.     10/22/90 pmcm    added reset of border prompt when ret'ing from bob
  37.     10/25/90 ted    moved border prompt resetting into msys_bobgo.
  38.     10/25/90 ted    added case to check for SED_ABORT after msys_bobgo for LNF.
  39.     10/31/90 ted    changed 'letter' from char to int to avoid int/char compiler warning.
  40.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  41. */
  42.  
  43. #include <stdio.h>
  44. #include <ctype.h>
  45.  
  46. #include "cscape.h"
  47. #include "scancode.h"
  48. #include "oaktag.h"                /* For ID in bob_IsUfunc */
  49. #include "msys.h"
  50. #include "helpdecl.h"
  51. #include "menupriv.h"
  52.  
  53. OSTATIC void framer_fkey(sed_type sed);
  54. OSTATIC void common_fkey(sed_type sed, int scancode);
  55. OSTATIC void gotofirst(sed_type sed, int scancode);
  56.  
  57. OGLOBAL field_funcs_struct framer_funcs = {
  58.     stdNoCur_fenter,
  59.     std_fexit,
  60.     framer_fkey,
  61.     FNULL,
  62.     FNULL,
  63.     0
  64. };
  65. /* -------------------------------------------------------------------------- */
  66.  
  67. static void framer_fkey(sed_type sed)
  68. /*
  69. */
  70. {
  71.     int scancode;
  72.     int    ret;
  73.     win_type parent;
  74.     bob_type bob;
  75.  
  76.     /* If we're the first here, we're the top framer, so we set a bit so our
  77.         kids won't think they're it. */
  78.  
  79.     if (!msys_IsFramer(sed)) {
  80.         parent = sed;
  81.         for (;;) {
  82.             if ((parent = bob_GetParent(parent)) == NULL) {
  83.                 msys_SetFramer(sed, TRUE);
  84.                 break;
  85.             }
  86.             if (msys_IsFramer(parent)) {
  87.                 break;
  88.             }
  89.         }
  90.     }
  91.     scancode = kb_Read();
  92.  
  93.     /* Clear the framer return flag for this sed in case we set it last time through */
  94.     msys_SetFrameRtn(sed, FALSE);
  95.  
  96.     if (sed_DoSpecial(sed, scancode)) {
  97.         gotofirst(sed, scancode);
  98.         return;
  99.     }
  100.     if (scancode == FN1 && msys_IsFramer(sed)) {
  101.         framerbar_help(sed);
  102.         return;
  103.     }
  104.     if (special_key(sed, scancode)) {
  105.         gotofirst(sed, scancode);
  106.         return;
  107.     }
  108.     if (msys_IsFramer(sed)) {
  109.         /* Features specific for top menu */
  110.         switch (scancode) {
  111.  
  112.         case ESC:
  113.             sed_SetBaton(sed, 0);
  114.             sed_ToggleExit(sed);
  115.             break;
  116.  
  117.         case MOU_CLICK:        /* Display dropdown menu */
  118.         case MOU_NOFIELD:    /* Remove dropdown menu */
  119.         {
  120.             int i;
  121.             menu_type menu;
  122.             bob_type abob;
  123.             unsigned bfeature;
  124.  
  125.             /* Remove all dropdowns, except the one that should be up */
  126.  
  127.             bob = sed_GetFieldBob(sed, sed_GetFieldNo(sed));
  128.  
  129.             menu = sed_GetMenu(sed);
  130.             for (i = 0; i < menu_GetBobCount(menu); i++) {
  131.                 abob = menu_GetBob(menu, i);
  132.                 if (abob != NULL && !bob_IsUfunc(abob)) {
  133.                     if (abob == bob && scancode == MOU_CLICK) {
  134.                         if (!win_IsEmployed(abob)) {
  135.                             bfeature = bord_GetFeature(bob);
  136.                             bord_SetFeature(bob, bfeature | BD_MOUSETHRU);
  137.                             bob_Repaint(bob);
  138.                         }
  139.                     }
  140.                     else if (win_IsEmployed(abob)) {
  141.                         bob_Pop(abob);    /* Unemploy bob */
  142.                     }
  143.                 }
  144.             }
  145.             break;
  146.         }
  147.         case MOU_RELEASE:
  148.             bob = sed_GetFieldBob(sed, sed_GetFieldNo(sed));
  149.             if (bob != NULL && !bob_IsUfunc(bob)) {
  150.                 /* Pop menu if it's already been up */
  151.                 if (win_IsEmployed(bob) && bob == disp_GetFromWin()) {
  152.                     bob_Pop(bob);    /* Unemploy bob */
  153.                 }
  154.                 /* Don't go into bob if it's not ready
  155.                     (we're not on its field or it's been popped) */
  156.                 if (!win_IsEmployed(bob)) {
  157.                     sed_SetBaton(sed, 0);    /* Get out of here */
  158.                     sed_ToggleExit(sed);
  159.                     scancode = MOU_THERE;    /* For the benefit of 'gotofirst()' */
  160.                     break;
  161.                 }
  162.             }
  163.             /* no break; fall thru */
  164.         case ENTER:            /* Go in dropdown menu */
  165.         case DOWN:            /* Display and go in dropdown menu */
  166.             /* Set FrameRtn flag TRUE so mouse events in next kb_read will
  167.                 know we just entered a framer dropdown.
  168.                 (We'll clear it later - see below).
  169.             */
  170.             msys_SetFrameRtn(sed, TRUE);
  171.  
  172.             /* Employ and go in the dropdown, or call the user function */
  173.             ret = msys_bobgo(sed, scancode);
  174.  
  175.             switch (ret) {
  176.             case 0:
  177.             case SED_ABORT:        /* LNF special func may return this */
  178.                 /* Leave FrameRtn flag TRUE so mouse events in next kb_read will
  179.                     know we just returned from a framer dropdown menu.
  180.                     (We know we will be re-entering this field right away, so
  181.                      we can clear the flag again after the kb_read up above).
  182.                 */
  183.                 break;
  184.  
  185.             default:
  186.                 msys_SetFrameRtn(sed, FALSE);
  187.  
  188.                 sed_SetBaton(sed, ret);
  189.                    sed_ToggleExit(sed);
  190.                 break;
  191.             }
  192.             break;
  193.  
  194.         case UP:
  195.             break;
  196.  
  197.         case LEFT:
  198.             if (sed_LeftField(sed) == SED_STUCK) {    
  199.                 sed_GotoLastField(sed);
  200.             }
  201.             break;
  202.  
  203.         case RIGHT:
  204.             if (sed_RightField(sed) == SED_STUCK) {    
  205.                 sed_GotoFirstField(sed);
  206.             }
  207.             break;
  208.  
  209.         default:
  210.             common_fkey(sed, scancode);
  211.             break;
  212.         }
  213.         gotofirst(sed, scancode);
  214.     }
  215.     else {
  216.         /* Features specific for dropdown menus */
  217.  
  218.         if (!kb_WasMouse()) {
  219.             sed_SetActive(sed, TRUE);    /* In case mouhandler deactivated it */
  220.         }
  221.         switch (scancode) {
  222.  
  223.         case ESC:
  224.             sed_SetBaton(sed, 0);
  225.             sed_ToggleExit(sed);
  226.             break;
  227.  
  228.         case ENTER:
  229.         case MOU_CLICK:
  230.             /* Do the next menu or call the ufunc */
  231.             /* Set FrameRtn flag TRUE so mouse events in next kb_read will
  232.                 know we just entered a dropdown sub-menu or ufunc.
  233.                 (We'll clear it later - see below).
  234.             */
  235.             msys_SetFrameRtn(sed, TRUE);
  236.  
  237.             if ((ret = msys_bobgo(sed, scancode)) != 0) {
  238.                 msys_SetFrameRtn(sed, FALSE);
  239.  
  240.                 sed_SetBaton(sed, ret);
  241.                    sed_ToggleExit(sed);
  242.             }
  243.             /*  else (if ret == 0) leave FrameRtn flag TRUE so mouse events 
  244.                 in next    kb_read'll know we just came from a dropdown 
  245.                 sub-menu or ufunc.
  246.                 (We know we will be re-entering this field right away, so
  247.                  we can clear the flag again after the kb_read up above).
  248.             */
  249.  
  250.             /*    reset border prompt in case pulldown shares prompt msgwin of
  251.                 parent field
  252.             */
  253.             sed_BorderPrompt(sed, (char *) sed_GetCurrFieldData(sed, 0));
  254.  
  255.             break;
  256.  
  257.         case DOWN:
  258.             if (sed_DownField(sed) == SED_STUCK) {    
  259.                 sed_GotoFirstField(sed);
  260.             }
  261.             break;
  262.  
  263.         case UP:
  264.             if (sed_UpField(sed) == SED_STUCK) {
  265.                 sed_GotoLastField(sed);
  266.             }
  267.             break;
  268.  
  269.         case LEFT:
  270.         case RIGHT:
  271.         {
  272.             sed_type topmenu;
  273.  
  274.             /* Move to the next dropdown */
  275.             topmenu = bob_GetParent(sed);
  276.  
  277.             if (scancode == LEFT) {
  278.                 if (sed_LeftField(topmenu) == SED_STUCK) {    
  279.                     sed_GotoLastField(topmenu);
  280.                 }
  281.             }
  282.             else {
  283.                 if (sed_RightField(topmenu) == SED_STUCK) {    
  284.                     sed_GotoFirstField(topmenu);
  285.                 }
  286.             }
  287.             /* Pass a DOWN arrow to the new field's fkey */
  288.             kb_Stuff(DOWN);
  289.  
  290.             sed_SetBaton(sed, 0);
  291.             sed_ToggleExit(sed);
  292.             break;
  293.         }
  294.         default:
  295.             common_fkey(sed, scancode);
  296.             break;
  297.         }
  298.     }
  299. }
  300. /* -------------------------------------------------------------------------- */
  301.  
  302. static void common_fkey(sed_type sed, int scancode)
  303. /*
  304.     Features shared by top menu and dropdown menus
  305. */
  306. {
  307.     switch (scancode) {
  308.  
  309.     /* Note: FN1 & MOU_HERE & MOU_THERE are normally handled in special_key() */
  310.  
  311.     case HOME:
  312.         sed_GotoFirstField(sed);
  313.         break;
  314.  
  315.     case END:
  316.         sed_GotoLastField(sed);
  317.         break;
  318.  
  319.     default:
  320.     {
  321.         int    choice, letter;
  322.  
  323.         /* Do first letter search */
  324.         letter = ascii(scancode);
  325.         if ((choice = sed_SearchMerge(sed, (char) letter)) != -1) {
  326.             sed_GotoField(sed, choice);
  327.             kb_Stuff(ENTER); /* select choice immediately */
  328.         }
  329.         break;
  330.     }
  331.     }
  332. }
  333. /* -------------------------------------------------------------------------- */
  334.  
  335. static void gotofirst(sed_type sed, int scancode)
  336. /* Call GotoFirstField and then restore baton */
  337. {
  338.     int baton;
  339.  
  340.     if (sed_GetExit(sed) && msys_IsFramer(sed)) {
  341.         baton = sed_GetBaton(sed);
  342.         sed_GotoFirstField(sed);
  343.         /* Set the baton to MOU_THERE instead of 0 so outside world can tell
  344.             the diff between a user-generated quit code and normal mouse stuff */
  345.         if (scancode == MOU_THERE && baton == 0) {
  346.             baton = MOU_THERE;
  347.         }
  348.         sed_SetBaton(sed, baton);
  349.     }
  350. }
  351. /* -------------------------------------------------------------------------- */
  352.  
  353. void framerbar_help(sed_type sed)
  354. /*
  355.     A Special help function for a framer menu bar.
  356. */
  357. {
  358.     bob_type bob;
  359.     ufuncopen_struct ufuncopen;
  360.     int label = 0;
  361.  
  362.     /* help for topbar, chapter = bob label, paragraph = 0 */
  363.     bob = sed_GetFieldBob(sed, sed_GetFieldNo(sed));
  364.  
  365.     if (bob_IsUfunc(bob)) {
  366.         bob_Do(bob, UFUNCBM_GETUFUNC, NULL, &ufuncopen);
  367.         label = ufuncopen.idata;
  368.     }
  369.     else if (bob_IsSed(bob)) {
  370.         label = sed_GetLabel(bob);
  371.     }
  372.     help_Show(label, 0);
  373. }
  374. /* -------------------------------------------------------------------------- */
  375.  
  376.