home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 328_02 / wpromptc.c < prev    next >
C/C++ Source or Header  |  1991-04-11  |  4KB  |  182 lines

  1. /*  wpromptc
  2.  *    dialog box routine.
  3.  *
  4.  *    displays a message in a window, waits for the user to press a key
  5.  *    window is auto_sizing and auto_centering
  6.  *
  7.  *    parameters:
  8.  *        title = ptr to title string. Ignored if null
  9.  *        msg   = ptr to message for main body of window.
  10.  *            may be multiple lines. Window sized to fit.
  11.  *        response = NULL terminated set of ptr to response choices.
  12.  *            The possible user responses are the first letters
  13.  *            of each of the response choices. Lowercase letters
  14.  *            are translated to UPPERCASE.
  15.  *
  16.  * The response line will be placed at the bottom
  17.  *    of the window; the word Escape will be placed at left
  18.  *
  19.  *    returns: The keypressed by the user, as limitted by response chioces
  20.  *
  21.  *    ex: key=wpromptc("title", "How are you?", "Fine", "Lousy", NULL);
  22.  *
  23.  *        the only possible values returned by this call are 'F', 'L'
  24.  *            or ESCAPE.
  25.  *
  26.  */
  27.  
  28. #include "wsys.h"
  29. #include <ctype.h>
  30. #include <stdarg.h>
  31.  
  32.  
  33. static char ESC_msg [] = "ESCAPE";
  34. static char ANY_KEY [] = "Press any key";
  35.  
  36.  
  37.  
  38. int wpromptc(char *title, char *msg,  ...)
  39.     {
  40.     int l, t;     /* position of window */
  41.     int linecnt, width;     /* size of msg */
  42.     char first_char;        /* first letter of a choice */
  43.     int key;
  44.     unsigned char color;
  45.  
  46.     int     any_response;        /* ON = responses set by caller */
  47.  
  48.     va_list response;
  49.     int     resplen,        /* length of a particular response */
  50.         resprow, respcol;
  51.  
  52.  
  53.  
  54.     /* 'normalize' the pointers  (if the memory model requires it)
  55.      * so we can add to them without wrapping around
  56.      * segment boundaries
  57.      */
  58.     _NORMALIZE (title);
  59.     _NORMALIZE (msg);
  60.  
  61.  
  62.  
  63.  
  64.     /* count lines in message  and size of largest line
  65.      */
  66.     wstrrowcol ( msg, &linecnt, &width );
  67.  
  68.     linecnt += 6;    /* allow room for top & bottom margins plus choices*/
  69.     width   += 2;
  70.  
  71.     width = max ( width, strlen (title) );
  72.  
  73.     /* allow room for all the responses -
  74.      *  loop through and count lengths of each one,
  75.      *  allow 3 bytes for spaces in between.
  76.      */
  77.     resplen = sizeof (ESC_msg) +2;
  78.     any_response = 0;
  79.  
  80.     for ( va_start (response, msg);
  81.           *((char**)response);
  82.           va_arg (response, char *)  )
  83.         {
  84.         resplen  +=  strlen (*((char**)response)) + 3;
  85.         ++any_response;
  86.         }
  87.     va_end (response);
  88.  
  89.  
  90.     if ( any_response == 0 )
  91.         {
  92.         /* no responses were provided.
  93.          * Use default message...
  94.          */
  95.         resplen = sizeof (ANY_KEY) + 2;
  96.         }
  97.  
  98.  
  99.     width = max ( width, resplen );
  100.  
  101.     /* get color of current screen
  102.      */
  103.     color = wgetattr();
  104.  
  105.  
  106.     /* window location
  107.      */
  108.     wlocate ( &l, &t, width, linecnt );
  109.  
  110.  
  111.     wopen (l, t, width, linecnt,
  112.         color, DOUBLE_BORDER, BRIGHT | color, WSAVE2RAM);
  113.  
  114.     /* turn off scrolling and wrappping
  115.      */
  116.     w0-> winputstyle &= (0xff - WPUTSCROLL - WPUTWRAP);
  117.  
  118.     if (title)
  119.         {
  120.         wtitle (title);
  121.         }
  122.  
  123.     wgoto (0,1);
  124.     wputs(msg);
  125.  
  126.     if ( any_response )
  127.         {
  128.  
  129.  
  130.         /* setup response buttons and create a string of choices.
  131.          */
  132.         resprow = linecnt -3;
  133.  
  134.         wbutton_add (ESC_msg, 1, resprow, sizeof(ESC_msg),ESCAPE,
  135.                     WBTN_BOX);
  136.  
  137.         respcol = 3 + sizeof (ESC_msg);
  138.  
  139.         for ( va_start (response, msg);
  140.               *((char**)response);
  141.               va_arg (response, char *)  )
  142.             {
  143.             resplen = strlen (*((char**)response));
  144.  
  145.             first_char = toupper (**((char **)response));
  146.  
  147.             wbutton_add (*((char**)response),
  148.                     respcol, resprow, resplen+1,
  149.                     first_char, WBTN_BOX );
  150.  
  151.  
  152.             respcol += resplen +3;        /* for next one */
  153.             }
  154.         va_end (response);
  155.  
  156.  
  157.         do    {
  158.             key = wgetc();
  159.             if ( isascii (key) ) key = toupper (key);
  160.             }
  161.         while ( ! wbutton_test (key) );
  162.  
  163.         }
  164.     else
  165.         {
  166.         /* no specific responses set by user, so
  167.          * place non-specific message and get a key.
  168.          * if key is MOUSE, wait for button release.
  169.          */
  170.         wgoto (  (width- sizeof(ANY_KEY))/2, linecnt-2 );
  171.         wputs (   ANY_KEY  );
  172.         key = wgetc ();
  173.         wmouse_flush ();
  174.         }
  175.  
  176.     wclose();
  177.  
  178.     return (key);  /* wpromptc */
  179.     } 
  180. /*--------------------- END OF WPROMPTC.C ---------------------*/
  181.  
  182.