home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sd386v50.zip / sd386src.zip / BOXMENU.C < prev    next >
Text File  |  1995-04-20  |  3KB  |  94 lines

  1. /*****************************************************************************/
  2. /* File:                                             IBM INTERNAL USE ONLY   */
  3. /*   boxmenu.c                                                               */
  4. /*                                                                           */
  5. /* Description:                                                              */
  6. /*  puts up a menu waiting on a key.                                         */
  7. /*                                                                           */
  8. /*                                                                           */
  9. /* History:                                                                  */
  10. /*                                                                           */
  11. /*   04/09/91 Creation of 32-bit SD86, from 16-bit version.                  */
  12. /*                                                                           */
  13. /**Includes*******************************************************************/
  14.  
  15. #include "all.h"                        /* SD86 include files                */
  16.  
  17. extern uchar      VideoAtr;
  18.  
  19. static  uchar lolite[] = { RepCnt(00), Attrib(00), 0 };
  20. static  uchar hilite[] = { RepCnt(00), Attrib(vaCallSel), 0 };
  21.  
  22.  uint
  23. BoxMenu(uint row,uint col,uint rows,uint cols,BoxMenuData *ptr)
  24. {
  25.     int item = ptr->item, maxitem;      /* was register.                  112*/
  26.     ulong mask = ptr->rowmask;
  27.     uint key, absrow;
  28.  
  29.     lolite[1] = hilite[1] = ( uchar )cols;
  30.     lolite[2] = ( uchar )Attrib(VideoAtr);
  31.  
  32.     for( maxitem = 8*sizeof(mask) ;; ){
  33.         if( --maxitem < 0 )
  34.             return(0);
  35.         if( mask & (1L << maxitem) )
  36.             break;
  37.     }
  38.     for(;;)
  39.     {
  40.         if( item2row(item, mask) >= rows )
  41.             item = 1;
  42.         putrc( absrow = row + item2row(item,mask), col, hilite );
  43.         key = GetKey();
  44.         switch( key )
  45.         {
  46.           case DOWN:
  47.           case RIGHT:
  48.           case SPACEBAR:
  49.             ++item;
  50.             break;
  51.  
  52.           case UP:
  53.           case LEFT:
  54.             if( --item < 1 )
  55.                 item = maxitem;
  56.             break;
  57.  
  58.           case F1:
  59.             Help( ptr->helpid );
  60.             break;
  61.  
  62.           case ESC:
  63.             return( key );
  64.  
  65.           case ENTER:
  66.           case A_ENTER:
  67.           case C_ENTER:
  68.             if( ptr->selectmask & (1L << item2row(item,mask)) )
  69.             {
  70.                 ptr->item = item;
  71.                 return( key );
  72.             }
  73.             beep();
  74.             break;
  75.  
  76.           default:
  77.             beep();
  78.         }
  79.         putrc( absrow, col, lolite );
  80.     }
  81. }
  82.  
  83. uint
  84. item2row(int item,ulong mask)
  85. {
  86.     uint n;                             /* was register.                  112*/
  87.  
  88.     for( n=0 ; n < 8*sizeof(mask) ; ++n )
  89.         if( mask & (1L << n) )
  90.             if( --item <= 0 )
  91.                 break;
  92.     return(n);
  93. }
  94.