home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / SLUG.C < prev    next >
C/C++ Source or Header  |  1990-03-28  |  4KB  |  156 lines

  1. /*
  2.       slug.c
  3.  
  4.     % slug menu routines
  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 slug_list 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.  
  27.      4/22/89 jmd    changed border to bord
  28.      8/11/89 jmd    added call to ufunc_Open
  29.  
  30.     12/12/89 ted    overhauled.
  31.      1/05/89 jmd    added hilite support to the def structure
  32.      2/26/90 ted    Made slug_Repaint a function again.
  33.      3/28/90 jmd    ansi-fied
  34. */
  35.  
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include <string.h>
  39.  
  40. #include "cscape.h"
  41. #include "oaktag.h"                /* For IDs in msys.h */
  42. #include "msys.h"
  43.  
  44. #define    SLUG_MIN_WIDTH    20
  45. #define    MAXCHOICE        80
  46.  
  47. /* this scratch pad must be static as slug_create is called recursively */
  48. static    char       choice_string[MAXCHOICE + 1];
  49.  
  50. /* -------------------------------------------------------------------------- */
  51.  
  52. sed_type slug_create(struct slug_list slug_def[], int dir, bd_fptr bord, byte bkg, byte sel, byte bdr, field_funcs_ptr ffuncs, mouhandler_fptr mfunc)
  53. /*
  54.     Create a menuing system object from a slug_list.
  55.     This function gets called recursively.
  56. */
  57. {
  58.     menu_type menu;
  59.     sed_type sed;
  60.     bob_type bob;
  61.     int i, dif;
  62.     int      hichar;
  63.  
  64.     if ((menu = menu_Open()) == NULL) {
  65.         return(NULL);
  66.     }
  67.     for ( i = 0; slug_def[i].choice != NULL ; i++) {
  68.         bob = NULL;
  69.  
  70.         if ( dir == MENU_VERTICAL && i > 0 ) {
  71.             menu_Printf(menu, "\n");
  72.         }
  73.         if (slug_def[i].child != NULL) {            /* make the child */
  74.  
  75.             if ((bob = slug_create(slug_def[i].child, dir, bord, bkg, 
  76.                                 sel, bdr, ffuncs, mfunc)) == NULL) {
  77.                 return(NULL);
  78.             }
  79.             bob_SetDepend(bob, BOB_INDEPENDENT);
  80.         }
  81.         else if ((bob = ufunc_Open(slug_def[i].slug_func, slug_def[i].value)) == NULL ) {
  82.             return(NULL);
  83.         }        
  84.  
  85.         /* check for hilighted characters */
  86.         if ((hichar = msys_ParseChoice(slug_def[i].choice, choice_string, MAXCHOICE)) >= 0) {
  87.             hichar++;
  88.         }
  89.  
  90.         menu_Printf(menu, "@fbdh%d[ %s ]", NULL, ffuncs, bob,
  91.             slug_def[i].message, hichar, choice_string);
  92.     }
  93.     menu_Flush(menu);
  94.  
  95.     if ((sed = sed_Open(menu)) == NULL) {
  96.         return(NULL);
  97.     }
  98.     sed_SetColors(sed, bkg, bkg, sel);
  99.     sed_SetBorder(sed, bord);
  100.     sed_SetBorderColor(sed, bdr);
  101.     sed_SetBorderTitle(sed, slug_def[i].message);
  102.     sed_SetLabel(sed, slug_def[i].value);
  103.     sed_SetMouse(sed, mfunc);
  104.     if (dir == MENU_VERTICAL) {
  105.         if (sed_GetWidth(sed) < SLUG_MIN_WIDTH) {
  106.             sed_SetWidth(sed, SLUG_MIN_WIDTH);
  107.         }
  108.         if ( (dif = sed_GetBorderHeight(sed) - disp_GetHeight()) > 0 ) {
  109.             sed_SetHeight(sed, sed_GetHeight(sed) - dif);
  110.         }
  111.     }
  112.     else {
  113.         sed_SetWidth(sed, disp_GetWidth());
  114.     }
  115.  
  116.     return(sed);
  117. }
  118. /* -------------------------------------------------------------------------- */
  119.  
  120. int slug_Go(sed_type sed, int startfld, int row, int col, VOID *data)
  121. /*
  122.     Calls go (sed_Go) on a slug menu (sed).
  123.     'row' and 'column' are the position of the slug menu.
  124.     (use -1, -1, to override positioning)
  125.     'startfld' is the field number of the starting field (use -1 to ignore)
  126.     'data' is the data passed on to the user functions.
  127. */
  128. {
  129.     int ret;
  130.  
  131.     if (row != -1 && col != -1) {
  132.         sed_SetPosition(sed, row, col);
  133.     }
  134.  
  135.     if (startfld != -1 ) {           /* upon original entry */
  136.         sed_GotoField(sed, startfld);
  137.     }
  138.     sed_SetData(sed, data);
  139.     sed_Repaint(sed);
  140.     ret = sed_Go(sed);
  141.  
  142.     sed_Pop(sed);
  143.  
  144.     return(ret);
  145. }
  146. /* -------------------------------------------------------------------------- */
  147. void slug_Repaint(sed_type sed, int row, int col)
  148. {    
  149.     if (row != -1 && col != -1) {
  150.         sed_SetPosition(sed, row, col);
  151.     }
  152.     sed_Repaint(sed);
  153. }
  154. /* -------------------------------------------------------------------------- */
  155.  
  156.