home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FRAMER.C < prev    next >
Text File  |  1990-09-24  |  5KB  |  210 lines

  1. /*
  2.       framer.c
  3.  
  4.     % framer menu functions
  5.  
  6.     rules for user functions:
  7.  
  8.     they get passed two arguments  (a VOID * and an int).
  9.     The VOID * is passed through msys_Go().
  10.     The int is the value parameter from the frame_def struct.
  11.  
  12.     they return a positive value if processing is finished
  13.     This value is passed up and returned from msys_Go
  14.     0 acts like an ESCape was pressed.
  15.  
  16.     int user_func(VOID *, int);
  17.  
  18.     C-scape 3.2
  19.     Copyright (c) 1988, by Oakland Group, Inc.
  20.     ALL RIGHTS RESERVED.
  21.  
  22.     Revision History:
  23.     -----------------
  24.      8/30/88 jdc    re-created
  25.     12/11/88 jmd    moved idata to ufunc _od
  26.     12/18/88 jdc    fixed field NAME_MAXLEN bug
  27.  
  28.     03/08/89 jdc    remove field name stuff
  29.      4/22/89 jmd    changed border to bord
  30.      7/26/89 jmd    made frame_Lock a function
  31.      8/11/89 jmd    added call to ufunc_Open
  32.  
  33.     12/12/89 ted    overhauled.
  34.     12/12/89 ted    Removed dir, row, col args from frame_create.
  35.      1/05/89 jmd    added hilite support to the def structure
  36.      3/28/90 jmd    ansi-fied
  37.      9/23/90 ted    Put loop in frame_Go to support demofram-style framer usage.
  38. */
  39.  
  40. #include <stdio.h>
  41. #include <ctype.h>
  42. #include <string.h>
  43.  
  44. #include "cscape.h"
  45. #include "oaktag.h"                /* For IDs in msys.h */
  46. #include "msys.h"
  47. #include "scancode.h"            /* For MOU_THERE baton/scancode */
  48.  
  49. #define MAXCHOICE    80
  50.  
  51. /* -------------------------------------------------------------------------- */
  52.  
  53. sed_type frame_create(struct frame_def frame_list[], bd_fptr bord, byte bkg, byte sel, byte bdr, field_funcs_ptr ffuncs, mouhandler_fptr fmfunc)
  54. /*
  55.     Create a menuing system object from a frame_list.
  56.     The object is a top menu sed with sed bobs and ufunc bobs attached to the
  57.     fields in the top menu. The sed bobs are 'independent' and are employed
  58.     only when they are activated.
  59. */
  60. {
  61.     menu_type topmenu, popmenu;
  62.     sed_type topsed;
  63.     bob_type bob;
  64.     int i, top;
  65.     int r1, c1, row, col;
  66.     char       string[MAXCHOICE + 1];
  67.     int      hichar;
  68.  
  69.     if (frame_list[0].choice == NULL ||
  70.         (topmenu = menu_Open()) == NULL) {
  71.         return(NULL);
  72.     }
  73.     for (i = 1, top = 0, popmenu = NULL;; i++) {
  74.  
  75.         bob = NULL;
  76.         if ( frame_list[i].choice == NULL ) {
  77.             /* process field in top sed */
  78.  
  79.             if (popmenu != NULL) {
  80.                 menu_Flush(popmenu);
  81.                 if ((bob = sed_Open(popmenu)) == NULL) {
  82.                     return(NULL);
  83.                 }
  84.                 sed_SetColors(bob, bkg, bkg, sel);
  85.                 sed_SetBorder(bob, bord);
  86.                 sed_SetBorderColor(bob, bdr);
  87.                 sed_SetLabel(bob, frame_list[top].value);
  88.                 sed_SetMouse(bob, fmfunc);
  89.                 win_SetParentClip(bob, BOB_INDEPENDENT);
  90.             }
  91.             else if ( (bob = ufunc_Open(frame_list[top].frame_func,
  92.                     frame_list[top].value)) == NULL ) {
  93.  
  94.                 return(NULL);
  95.             }
  96.  
  97.             /* check for hilighted characters */
  98.             if ((hichar = msys_ParseChoice(frame_list[top].choice, string, MAXCHOICE)) >= 0) {
  99.                 hichar++;
  100.             }
  101.  
  102.             menu_Printf(topmenu, "@fbh%d[ %s ]", NULL, ffuncs, bob,    hichar, string);
  103.  
  104.             if (frame_list[i+1].choice == NULL) {
  105.                 /* done parsing frame_list */
  106.                 break;
  107.             }
  108.             else {
  109.                 i++;
  110.                 top = i;
  111.             }
  112.             popmenu = NULL;
  113.         }
  114.         else {
  115.             /* process field in pop sed */
  116.             if ( popmenu ==    NULL ) {
  117.                 if ( (popmenu = menu_Open()) == NULL ) {
  118.                     return(NULL);
  119.                 }
  120.             }                
  121.             else {
  122.                 menu_Printf(popmenu, "\n");
  123.             }
  124.  
  125.             if ((bob = ufunc_Open(frame_list[i].frame_func, 
  126.                 frame_list[i].value)) == NULL ) {
  127.  
  128.                 return(NULL);
  129.             }
  130.  
  131.             /* check for hilighted characters */
  132.             if ((hichar = msys_ParseChoice(frame_list[i].choice, string, MAXCHOICE)) >= 0) {
  133.                 hichar++;
  134.             }
  135.  
  136.             menu_Printf(popmenu, "@fbh%d[ %s ]", NULL, ffuncs, bob,    hichar, string);
  137.         }
  138.     }            
  139.     menu_Flush(topmenu);
  140.  
  141.     if ((topsed = sed_Open(topmenu)) == NULL) {
  142.         return(NULL);
  143.     }
  144.     sed_SetColors(topsed, bkg, bkg, sel);
  145.     sed_SetWidth(topsed, disp_GetWidth());
  146.     sed_SetLabel(topsed, frame_list[0].value);
  147.     sed_SetMouse(topsed, fmfunc);
  148.  
  149.     /* Set the positions of all dropdowns in framer */
  150.     sed_GetBordCorners(topsed, &r1, &c1, &row, &col);
  151.     row++;
  152.     for (i = sed_GetFieldCount(topsed) - 1; i >= 0; i--) {
  153.         bob = sed_GetFieldBob(topsed, i);
  154.         if (bob_IsWin(bob)) {
  155.             col = sed_GetFieldCol(topsed, i);
  156.             bob_SetPosition(bob, row, col);
  157.         }
  158.     }
  159.     return(topsed);
  160. }
  161. /* -------------------------------------------------------------------------- */
  162.  
  163. boolean frame_Lock(sed_type sed, int family, int member, byte attr)
  164. /*
  165.     "lock" a menu choice in a framer menu.
  166. */
  167. {
  168.     return(frame_do(sed, MSYS_LOCK, family, member, (VOID *) &attr));
  169. }
  170. /* -------------------------------------------------------------------------- */
  171.  
  172. boolean frame_do(sed_type sed, int msg, int family, int member, VOID *indata)
  173. /*
  174. */
  175. {
  176.     int code[3];
  177.  
  178.     code[0] = family;
  179.     code[1] = member;
  180.     code[2] = -1;
  181.  
  182.     return(msys_do(sed, code, msg, indata));
  183. }
  184. /* -------------------------------------------------------------------------- */
  185.  
  186. int frame_Go(sed_type sed, int chr, VOID *data)
  187. {
  188.     int choice, ret;
  189.  
  190.     if (chr != ' ') {
  191.         if ((choice = sed_SearchMerge(sed, (char)chr)) == -1) {
  192.             return(0);
  193.         }
  194.         else {
  195.             sed_GotoField(sed, choice);
  196.         }
  197.     }
  198.     sed_SetData(sed, data);
  199.  
  200.     /* Put sed_Go in a loop so normal mouse operation won't make us return */
  201.     for (;;) {
  202.         if ((ret = sed_Go(sed)) != MOU_THERE) {
  203.             break;
  204.         }
  205.     }
  206.     return(ret);
  207. }
  208. /* -------------------------------------------------------------------------- */
  209.  
  210.