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

  1. /* 
  2.     msys.c
  3.  
  4.     % msys menu system routines
  5.  
  6.     C-scape 3.1
  7.     Copyright (c) 1988, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.       8/30/88 jdc    created
  13.     11/05/88 jmd    removed menu_Close
  14.     11/30/88 jmd    Modified UFUNCBOB case in msys_GoBob
  15.     12/11/88 jmd    moved idata to ufunc _od
  16.  
  17.      6/23/89 jmd    added GotoFirstField in msys_GoBob
  18.      8/21/89 jmd    added bob_IsWin to msys_RepaintBob
  19.      9/10/89 jmd    re-wrote msys_dir
  20.      9/11/89 jmd    added win_Top to msys_RepaintBob
  21.  
  22.     12/12/89 ted    overhauled.
  23.      1/24/90 ted    Added msys_SetPixShadow stuff.
  24.      3/28/90 jmd    ansi-fied
  25.      8/29/90 ted    Removed mouse-waiting before bob entry because new framer
  26.                      mouse handlers don't need it
  27.      9/09/90 jmd    added msys_SetHiColors
  28.     10/25/90 ted    added border prompt resetting in msys_bobgo.
  29.     12/08/90 pmcm    changed std_fenter to stdNoCur_fenter
  30. */
  31.  
  32. #include <stdio.h>
  33. #include <ctype.h>
  34.  
  35. #include "cscape.h"
  36. #include "scancode.h"            /* for scancodes in msys_bobgo */
  37. #include "oaktag.h"                /* For IDs in msys.h */
  38. #include "msys.h"
  39.  
  40. /* -------------------------------------------------------------------------- */
  41.  
  42. void msys_SetSpecial(sed_type sed, spc_fptr spcfunc)
  43. {
  44.     msys_doall(sed, MSYSALL_SETSPCFUNC, (VOID *) &spcfunc);
  45. }
  46. /* -------------------------------------------------------------------------- */
  47.  
  48. void msys_SetMouse(sed_type sed, mouhandler_fptr mfunc)
  49. {
  50.     msys_doall(sed, MSYSALL_SETMFUNC, (VOID *) &mfunc);
  51. }
  52. /* -------------------------------------------------------------------------- */
  53.  
  54. void msys_SetParentMove(sed_type sed, boolean move)
  55. {
  56.     msys_doall(sed, MSYSALL_SETPARMOVE, (VOID *) &move);
  57. }
  58. /* -------------------------------------------------------------------------- */
  59.  
  60. void msys_SetPixShadow(sed_type sed, opcoord xshad, opcoord yshad)
  61. {
  62.     opoint pt;
  63.  
  64.     pt.x = xshad;
  65.     pt.y = yshad;
  66.  
  67.     msys_doall(sed, MSYSALL_SETSHADOW, (VOID *) &pt);
  68. }
  69.  
  70. /* -------------------------------------------------------------------------- */
  71. void msys_SetHiColors(sed_type sed, byte hreg, byte hsel)
  72. {
  73.     struct msys_hicolor hicol;
  74.  
  75.     hicol.hireg = hreg;
  76.     hicol.hisel = hsel;
  77.  
  78.     msys_doall(sed, MSYSALL_SETHICOLOR, (VOID *) &hicol);
  79. }
  80.  
  81. /* -------------------------------------------------------------------------- */
  82.  
  83. int msys_bobgo(sed_type sed, unsigned scancode)
  84. /*
  85.     Pass control to the bob attached to the current field of the sed.
  86.     If the bob is a window, employ it, call go on it, and unemploy it.
  87.     If the bob is a user function, call it and return its value (unless
  88.     'scancode' == DOWN, in which case 0 is returned instead of calling the
  89.     ufunc).
  90.     return value  > 0            : quit w/ return value
  91.     return value == 0            : escape back to top; don't quit
  92.     return value == FRAME_QUIT    : quit w/ 0 ret. value
  93. */
  94. {
  95.     bob_type bob;
  96.     int      fldno;
  97.     int      ret;
  98.     unsigned bfeature;
  99.  
  100.     /* Employ the dropdown and go in it, or call the user function */
  101.  
  102.     /* Remember current fieldno, it could be changed on us. */
  103.     fldno = sed_GetFieldNo(sed);
  104.     bob =     sed_GetFieldBob(sed, fldno);
  105.  
  106.     /* Go in the pulldown or call the function if there ain't no pull down */
  107.     if (bob != NULL) {
  108.         if (bob_IsUfunc(bob)) {
  109.             if (scancode == DOWN) {
  110.                 return(0);
  111.             }
  112.             /* call the user function */
  113.             bob_Do(bob, WINM_GOREQ, sed_GetData(sed), &ret);
  114.         }
  115.         else {    /* Bob is not a ufunc; must be a win */
  116.             /* Top the bob, just in case, or else employ it */
  117.             if (win_IsEmployed(bob)) {
  118.                 win_Top(bob);
  119.             }
  120.             else {
  121.                 bob_Repaint(bob);
  122.             }
  123.  
  124.             if (bob_IsSed(bob) == TRUE) {
  125.                 sed_SetData(bob, sed_GetData(sed));
  126.                 sed_GotoFirstField(bob);
  127.             }
  128.  
  129.             /* make border events pass on through to mouse handler */
  130.             bfeature = bord_GetFeature(bob);
  131.             bord_SetFeature(bob, bfeature | BD_MOUSETHRU);
  132.  
  133.             ret = bob_Go(bob);
  134.  
  135.             bob_Pop(bob);
  136.         }
  137.     }
  138.     /*    Reset border prompt in case bob shared prompt msgwin of parent field */
  139.     sed_BorderPrompt(sed, (char *) sed_GetCurrFieldData(sed, 0));
  140.  
  141.     return(ret);
  142. }
  143. /* -------------------------------------------------------------------------- */
  144.  
  145. void msys_doall(sed_type sed, int msg, VOID *data)
  146. /*
  147.     This function recursively traces the tree of all children of the given sed,
  148.     including sed itself, and performs a function on them specified by 'msg'.
  149. */
  150. {
  151.     int i;
  152.     bob_type bob;
  153.  
  154.     if (sed == NULL || !bob_IsWin(sed)) {
  155.         return;
  156.     }
  157.  
  158.     /* Call ourselves again for each child */
  159.     for (i = sed_GetFieldCount(sed) - 1; i >= 0; i--) {
  160.         bob = sed_GetFieldBob(sed, i);
  161.         if (bob_IsWin(bob)) {
  162.             msys_doall(bob, msg, data);
  163.         }
  164.     }
  165.     /* Do the function on ourselves */
  166.     switch (msg) {
  167.     case MSYSALL_SETPARMOVE:
  168.         bob_SetParentMove(sed, *((boolean *) data));
  169.         break;
  170.     case MSYSALL_SETSHADOW:
  171.         win_SetPixShadow(sed, ((opoint *) data)->x, ((opoint *) data)->y);
  172.         break;    
  173.     default:
  174.         /* Special cases for sed bobs only */
  175.         if (bob_IsSed(sed)) {
  176.             switch (msg) {
  177.             case MSYSALL_SETFFUNCS:
  178.                 for (i = sed_GetFieldCount(sed) - 1; i >= 0; i--) {
  179.                     sed_SetFuncs(sed, i, (field_funcs_struct *) data);
  180.                 }
  181.                 break;    
  182.             case MSYSALL_SETMFUNC:
  183.                 sed_SetMouse(sed, *((mouhandler_fptr *) data));
  184.                 break;    
  185.             case MSYSALL_SETSPCFUNC:
  186.                 sed_SetSpecial(sed, *((spc_fptr *) data));
  187.                 break;    
  188.             case MSYSALL_SETHICOLOR:
  189.                 sed_SetHiColors(sed,
  190.                     ((struct msys_hicolor *) data)->hisel,
  191.                     ((struct msys_hicolor *) data)->hireg);
  192.                 
  193.                 break;    
  194.             }
  195.         }
  196.     }
  197. }
  198. /* -------------------------------------------------------------------------- */
  199.  
  200. int msys_dir(sed_type sed)
  201. /*
  202.     Determines the orientation of a sed
  203.     returns either MENU_HORIZONTAL or MENU_VERTICAL
  204. */
  205. {
  206.     if (sed_GetFieldCount(sed) <= 1  || sed_GetGridField(sed, 0, 1) > 0) {
  207.         return(MENU_HORIZONTAL);
  208.     }
  209.     else {
  210.         return(MENU_VERTICAL);
  211.     }
  212. }
  213. /* -------------------------------------------------------------------------- */
  214.  
  215.