home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / C / OMEGA2 / OMMENU.CPP < prev    next >
C/C++ Source or Header  |  1992-04-25  |  6KB  |  301 lines

  1. //
  2. // *************************************************************************
  3. // *                                                                       *
  4. // *    OMEGA C++ Windowing Class Library                                  *
  5. // *    =================================                                  *
  6. // *                                                                       *
  7. // *    Copyright 1991,92 Tom Clancy                                       *
  8. // *    Submitted to the public domain, April 1992                         *
  9. // *                                                                       *
  10. // *************************************************************************
  11. // *                                                                       *
  12. // *    Popup Menu Methods                                                 *
  13. // *                                                                       *
  14. // *************************************************************************
  15. //
  16.  
  17. #include <dos.h>
  18. #include <string.h>
  19. #include "ommenu.hpp"
  20.  
  21.  
  22. oMenu::oMenu() {
  23.   Current=1;
  24.   Picked=0;
  25.   Numops=0;
  26.   Gap=3;
  27.   Topgap=0;
  28.   mWid=0;
  29.   Hid=TRUE;
  30.   memset(hotlist,0,sizeof(hotlist));
  31.   dragging(OFF);
  32.   closing(OFF);
  33.   expanding(OFF);
  34.   resizing(OFF);
  35.   setsolidheader(OFF);
  36. }
  37.  
  38. oMenu::~oMenu() {
  39.   int i;
  40.   for(i=1; i<=Numops; i++)
  41.     delete picks[i];
  42. }
  43.  
  44. void oMenu::setmenu(int x, int y, int fg, int bk, int nfg, int hfg, int hbk,
  45.             int pfg, int style) {
  46.  
  47.   setwindow(x,y,20,5,fg,bk,style);
  48.   Nfg=nfg;
  49.   Hfg=hfg;
  50.   Hbk=hbk;
  51.   Pfg=pfg;
  52. }
  53.  
  54. int oMenu::largestpick() {
  55.   int i,l=0;
  56.  
  57.   for(i=1; i<=Numops; i++)
  58.     if(strlen(picks[i])>l)
  59.       l=strlen(picks[i]);
  60.   return l;
  61. }
  62.  
  63. void oMenu::writeoption(int i, int fg, int bk) {
  64.  
  65.   char s[80];
  66.   int pos;
  67.   register int j,k;
  68.  
  69.   if(!strchr(picks[i],'~'))
  70.     writeat(1+Gap,i+Topgap,fg,bk,picks[i]);
  71.   else {
  72.     pos=strchr(picks[i],'~')-picks[i];
  73.     for(j=0; j<pos; j++)
  74.       s[j]=picks[i][j];
  75.     k=j;
  76.     for(j=pos+1;j<strlen(picks[i]); j++,k++)
  77.       s[k]=picks[i][j];
  78.     s[k]='\0';
  79.     writeat(1+Gap,i+Topgap,fg,bk,s);
  80.     chwriteat(1+Gap+pos,i+Topgap,Pfg,bk,picks[i][pos+1]);
  81.   }
  82. }
  83.  
  84. void oMenu::addtohotlist(int i) {
  85.   if(strchr(picks[i],'~'))
  86.     hotlist[i]=picks[i][(strchr(picks[i],'~')-picks[i])+1];
  87.   else
  88.     hotlist[i]=0;
  89. }
  90.  
  91. void oMenu::addoption(char *s) {
  92.  
  93.   if(!Numops && s[0]=='-');
  94.   else {
  95.    Numops++;
  96.    if(Numops>50)
  97.      Numops=50;
  98.    else {
  99.      picks[Numops]=new char[strlen(s)+1];
  100.      strcpy(picks[Numops],s);
  101.      addtohotlist(Numops);
  102.      mWid=largestpick();
  103.      setwindow(getleft(),gettop(),(Gap*2)+mWid+1,Numops+2+(Topgap*2),
  104.            getfgcolor(),getbkcolor(),getstyle());
  105.  
  106.      setminlen(Numops+2+Topgap*2);
  107.      setminwid((Gap*2)+mWid+1);
  108.    }
  109.  }
  110. }
  111.  
  112. void oMenu::makeline(int i) {
  113.   fillarea(1,i+Topgap,getwid(),i+Topgap,getfgcolor(),getbkcolor(),196);
  114. }
  115.  
  116. int oMenu::seperator(int i) {
  117.   return picks[i][0]=='-';
  118. }
  119.  
  120. void oMenu::highlight(int i) {
  121.  
  122.   if(i<=Numops)
  123.     if(!seperator(i)) {
  124.       fillarea(1,i+Topgap,getwid(),i+Topgap,Hfg,Hbk,32);
  125.       writeoption(i,Hfg,Hbk);
  126.     }
  127.     else
  128.       makeline(i);
  129. }
  130.  
  131. void oMenu::unhighlight(int i) {
  132.  
  133.   if(i<=Numops)
  134.     if(!seperator(i)) {
  135.       fillarea(1,i+Topgap,getwid(),i+Topgap,Nfg,getbkcolor(),32);
  136.       writeoption(i,Nfg,getbkcolor());
  137.     }
  138.     else
  139.       makeline(i);
  140. }
  141.  
  142. void oMenu::snaptocenter() {
  143.   if(Hid) {
  144.     Hid=FALSE;
  145.     oWindow::snaptocenter();
  146.   }
  147. }
  148.  
  149. void oMenu::openmenu() {
  150.   if(Hid) {
  151.     Hid=FALSE;
  152.     openwin();
  153.   }
  154. }
  155.  
  156. void oMenu::closemenu() {
  157.   if (!Hid) {
  158.     Hid=TRUE;
  159.     closewin();
  160.   }
  161. }
  162.  
  163.  
  164. void oMenu::display_info() {
  165.  
  166.   register int i;
  167.  
  168.   if(Numops) {
  169.     for(i=1;i<=Numops;i++)
  170.       if(picks[i][0]!='-')
  171.     writeoption(i,Nfg,getbkcolor());
  172.       else
  173.     makeline(i);
  174.     highlight(Current);
  175.   }
  176. }
  177.  
  178. int oMenu::withinbounds(int x, int y) {
  179.  
  180.   int found=0;
  181.   int i=0;
  182.  
  183.   while(!found && i<=Numops) {
  184.     i++;
  185.     if(x>=1 && x<getwid()-1 && y==Topgap+i)
  186.       found=i;
  187.   }
  188.   return found;
  189. }
  190.  
  191. int oMenu::withinbounds(int c, int x, int y) {
  192.  
  193.    if(x>=1 && x<=getwid()-1 && y==Topgap+c)
  194.      return c;
  195.    else
  196.      return 0;
  197. }
  198.  
  199.  
  200.  
  201. int oMenu::handle_key_event() {
  202.  
  203.    int ev,i;
  204.  
  205.    ev=oWindow::handle_key_event();
  206.    if(ev)
  207.      return ev;
  208.    int k=getkeycode();
  209.    switch(k) {
  210.      case 13 :
  211.          Picked=Current;
  212.          return cmdMenuPick;
  213.          break;  // enter
  214.  
  215.      case 27 : break;  // escape
  216.  
  217.      case UpArrow :                 // up arrow
  218.          unhighlight(Current);
  219.          Current--;
  220.          if(seperator(Current)) Current--;
  221.          if(Current<1) Current=Numops;
  222.          highlight(Current);
  223.          break;
  224.      case DownArrow:                 // down arrow
  225.          unhighlight(Current);
  226.          Current++;
  227.          if(seperator(Current)) Current++;
  228.          if(Current>Numops) Current=1;
  229.          highlight(Current);
  230.          break;
  231.      default :
  232.          k=upcase(k);
  233.          for(i=1;(i<=Numops) && k!=upcase(hotlist[i]); i++);
  234.          if(k==upcase(hotlist[i])) {
  235.            unhighlight(Current);
  236.            Current=i;
  237.            highlight(Current);
  238.            Picked=Current;
  239.            return cmdMenuPick;
  240.          }
  241.          break;
  242.  
  243.    }
  244.    return cmdNocmd;
  245. }
  246.  
  247. int oMenu::handle_mouse_event() {
  248.  
  249.    int r=oWindow::handle_mouse_event();
  250.    if(r && r!=cmdWithinwin)
  251.      return r;
  252.  
  253.    if(r==cmdWithinwin) {
  254.      int ev,ch;
  255.      int x=buttonx();
  256.      int y=buttony();
  257.      int b=buttonb();
  258.  
  259.  
  260.      if(b==1) {
  261.        ch=withinbounds(x,y);
  262.        if(ch) {
  263.      unhighlight(Current);
  264.      Current=ch;
  265.      highlight(ch);
  266.      while(b==1) {
  267.        getmouse(x,y,b);
  268.        showmouse();
  269.      }
  270.      ch=withinbounds(Current,x,y);
  271.      if(ch)
  272.        if(picks[Current][0]!='-') {
  273.          Picked=ch;
  274.          return cmdMenuPick;
  275.        }
  276.  
  277.        }
  278.      }
  279.    }
  280.    return cmdNocmd;
  281. }
  282.  
  283. void oMenu::run() {
  284.   setlastcmd(cmdNocmd);
  285.   snaptocenter();
  286.   while(getlastcmd()!=cmdClose && getlastcmd()!=cmdMenuPick)
  287.     handle_events();
  288. }
  289.  
  290. int oMenu::gomenu() {
  291.  
  292.   int ch=0;
  293.  
  294.   openmenu();
  295.   while((ch<=0 || ch>Numops) && getlastcmd()!=cmdClose) {
  296.     handle_events();
  297.     ch=getlastcmd();
  298.   }
  299.   return ch;
  300. }
  301.