home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 1.ddi / FUNCS.EXE / CSCAPE / SOURCE / FNFRAMER.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-11  |  5.8 KB  |  297 lines

  1. /*
  2.     fnframer.c 
  3.  
  4.     jmd 6/23/89  new(er) framer funcs
  5.  
  6.     % framer_funcs
  7.  
  8.     C-scape 3.1
  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.  
  24. #include <stdio.h>
  25. #include <ctype.h>
  26.  
  27. #include "cscape.h"
  28. #include "scancode.h"
  29. #include "oaktag.h"                /* For IDs in msys.h */
  30. #include "msys.h"
  31. #include "helpdecl.h"
  32.  
  33. extern void     framer_fenter(_arg1(sed_type));
  34. extern boolean    framer_fexit(_arg1(sed_type));
  35. extern void        framer_fkey(_arg1(sed_type));
  36.  
  37. #define FRAME_LEFT  -31
  38. #define FRAME_RIGHT  -32
  39.  
  40. OGLOBAL field_funcs_struct framer_funcs = {
  41.     framer_fenter,
  42.     framer_fexit,
  43.     framer_fkey,
  44.     FNULL,
  45.     FNULL
  46. };
  47.  
  48. void framer_help(_arg1(sed_type));
  49. int framer_dropdown(_arg1(sed_type));
  50.  
  51. void framer_fenter(sed)
  52.     sed_type sed;
  53. /*
  54.     fenter function for framer menu fields.
  55. */
  56. {
  57.     sed_BorderPrompt(sed, (char *) sed_GetCurrFieldData(sed, 0));
  58. }
  59.  
  60. boolean framer_fexit(sed)
  61.     sed_type sed;
  62. /*
  63.     fexit function for menu fields.
  64. */
  65. {
  66.     sed_BorderPrompt(sed, NULL);
  67.     return(TRUE);
  68. }
  69.  
  70. void framer_fkey(sed)
  71.     sed_type sed;
  72. /*
  73. */
  74. {
  75.     int     scancode, letter, choice, fld;
  76.     int        ret = 0;
  77.     boolean istop;
  78.  
  79.     /* figure out if we're the top menu or not */
  80.     istop = (bob_GetOwner(sed, &fld) == NULL);
  81.  
  82.     scancode = kb_Read();
  83.  
  84.     if (sed_DoSpecial(sed, scancode))
  85.         return;
  86.     if (special_key(sed, scancode))
  87.         return;
  88.  
  89.     switch(scancode) {
  90.     case FN1:
  91.         framer_help(sed);
  92.         break;
  93.  
  94.     case ESC:
  95.         sed_SetBaton(sed, 0);
  96.         sed_ToggleExit(sed);
  97.         break;
  98.  
  99.     case MOU_THERE:
  100.         /* if we're in a pulldown and the mouse was clicked in the
  101.            top menu */
  102.         sed_SetBaton(sed, 0);
  103.         sed_ToggleExit(sed);
  104.         break;
  105.  
  106.     case MOU_HERE:
  107.         break;
  108.  
  109.     case ENTER:
  110.     case MOU_CLICK:
  111.         /* drop the pulldown or call the function if there ain't no pull down */
  112.         if (msys_FieldBobExists(sed)) {
  113.             if ((ret = framer_dropdown(sed)) != 0 && ret != FRAME_LEFT && ret != FRAME_RIGHT) {
  114.                 sed_SetBaton(sed, ret);
  115.                    sed_ToggleExit(sed);
  116.                 return;
  117.             }
  118.         }
  119.         break;
  120.  
  121.     case DOWN:
  122.         if (istop) {
  123.             /* drop the pulldown */
  124.             if (msys_FieldBobExists(sed) && !msys_FieldBobIsUfunc(sed)) {
  125.                 if ((ret = framer_dropdown(sed)) != 0 && ret != FRAME_LEFT && ret != FRAME_RIGHT) {
  126.                     sed_SetBaton(sed, ret);
  127.                        sed_ToggleExit(sed);
  128.                     return;
  129.                 }
  130.             }
  131.         }
  132.         else if (sed_DownField(sed) == SED_STUCK) {    
  133.             sed_GotoFirstField(sed);
  134.         }
  135.         break;
  136.  
  137.     case UP:
  138.         if (!istop) {
  139.             if (sed_UpField(sed) == SED_STUCK) {
  140.                 sed_GotoLastField(sed);
  141.             }
  142.         }
  143.         break;
  144.  
  145.     case LEFT:
  146.         if (istop) {
  147.             if (sed_LeftField(sed) == SED_STUCK) {    
  148.                 sed_GotoLastField(sed);
  149.             }
  150.         }
  151.         else {
  152.             /* move to the next pulldown */
  153.             sed_SetBaton(sed, FRAME_LEFT);
  154.                sed_ToggleExit(sed);
  155.         }
  156.         break;
  157.  
  158.     case RIGHT:
  159.         if (istop) {
  160.             if (sed_RightField(sed) == SED_STUCK) {    
  161.                 sed_GotoFirstField(sed);
  162.             }
  163.         }
  164.         else {
  165.             /* move to the next pulldown */
  166.             sed_SetBaton(sed, FRAME_RIGHT);
  167.                sed_ToggleExit(sed);
  168.         }
  169.         break;
  170.  
  171.     case HOME:
  172.         sed_GotoFirstField(sed);
  173.         break;
  174.  
  175.     case END:
  176.         sed_GotoLastField(sed);
  177.         break;
  178.  
  179.     default:
  180.         /* do first letter search */
  181.         letter = ascii(scancode);
  182.         if ( isprint(letter) 
  183.             && (choice = sed_SearchMerge(sed, (char)letter)) != -1) {
  184.  
  185.             sed_GotoField(sed, choice);
  186.             sed_SetMouseCode(sed, MOU_CLICK);    /* select choice immediately */
  187.             break;
  188.         }
  189.         break;
  190.     }
  191.  
  192.     /* see if we we're asked to move left or right */
  193.     switch(ret) {
  194.     case FRAME_LEFT:
  195.         if (sed_LeftField(sed) == SED_STUCK) {    
  196.             sed_GotoLastField(sed);
  197.         }
  198.         /* pass a DOWN arrow to the new field's fkey */
  199.         sed_SetMouseCode(sed, DOWN);
  200.         break;
  201.  
  202.     case FRAME_RIGHT:
  203.         if (sed_RightField(sed) == SED_STUCK) {    
  204.             sed_GotoFirstField(sed);
  205.         }
  206.         /* pass a DOWN arrow to the new field's fkey */
  207.         sed_SetMouseCode(sed, DOWN);
  208.         break;
  209.  
  210.     default:
  211.         break;
  212.     }
  213. }
  214.  
  215.  
  216. int framer_dropdown(sed)
  217.     sed_type sed;
  218. /*
  219.     Display and activate a dropdown.
  220.     if the bob is a ufunc, call it and return its value.
  221.  
  222.     return value  > 0 quit
  223.     return value == 0 escape back to top
  224.     return value  < 0
  225. */
  226. {
  227.     int ret;
  228.     int row1, col1, row2, col2;
  229.  
  230.     int fldno;
  231.  
  232.     /* remember current fieldno, it could be changed on us */
  233.     fldno = sed_GetFieldNo(sed);
  234.  
  235.     sed_GetBordCorners(sed, &row1, &col1, &row2, &col2);
  236.  
  237.     /* compensate for border */
  238.     if (!sed_BorderExists(sed)) {
  239.         row2++;
  240.         col2++;
  241.     }
  242.  
  243.     if (msys_dir(sed) == MENU_HORIZONTAL) {
  244.         col2 = sed_GetFieldCol(sed, sed_GetFieldNo(sed));
  245.     }
  246.     else {
  247.         row2 = sed_GetFieldRow(sed, sed_GetFieldNo(sed));
  248.     }
  249.  
  250.     /* Use baton value of BOB_DOWN to tell mouse handler 
  251.        that the pulldown is active
  252.     */
  253.     sed_SetBaton(sed, BOB_DOWN);
  254.  
  255.     msys_RepaintBob(sed, row2, col2);
  256.     ret = msys_GoBob(sed, -1, -1);
  257.  
  258.     if (sed_GetFieldBob(sed, fldno) != NULL) {
  259.         win_UnEmploy(sed_GetFieldBob(sed, fldno));
  260.     }
  261.  
  262.     sed_SetBaton(sed, -1);
  263.  
  264.     return(ret);
  265. }
  266.  
  267.  
  268. void framer_help(sed)
  269.     sed_type sed;
  270. /*
  271. */
  272. {
  273.     bob_type bob;
  274.     ufuncopen_struct ufuncopen;
  275.     int label = 0;
  276.  
  277.     if (bob_GetParent(sed) == NULL) {
  278.         /* help for topbar, chapter = bob label, paragraph = 0 */
  279.         bob = sed_GetFieldBob(sed, sed_GetFieldNo(sed));
  280.  
  281.         if (bob_IsUfunc(bob)) {
  282.             bob_Do(bob, UFUNCBM_GETUFUNC, NULL, &ufuncopen);
  283.             label = ufuncopen.idata;
  284.         }
  285.         else if (bob_IsSed(bob)) {
  286.             label = sed_GetLabel(bob);
  287.         }
  288.  
  289.         help_Show(label, 0);
  290.     }
  291.     else {
  292.         /* help for pulldown, chapter = label, paragraph = fieldno + 1 */
  293.         help_Show(sed_GetLabel(sed), sed_GetFieldNo(sed) + 1);
  294.     }
  295. }
  296.  
  297.