home *** CD-ROM | disk | FTP | other *** search
- //
- // *************************************************************************
- // * *
- // * OMEGA C++ Windowing Class Library *
- // * ================================= *
- // * *
- // * Copyright 1991,92 Tom Clancy *
- // * Submitted to the public domain, April 1992 *
- // * *
- // *************************************************************************
- // * *
- // * Popup Menu Methods *
- // * *
- // *************************************************************************
- //
-
- #include <dos.h>
- #include <string.h>
- #include "ommenu.hpp"
-
-
- oMenu::oMenu() {
- Current=1;
- Picked=0;
- Numops=0;
- Gap=3;
- Topgap=0;
- mWid=0;
- Hid=TRUE;
- memset(hotlist,0,sizeof(hotlist));
- dragging(OFF);
- closing(OFF);
- expanding(OFF);
- resizing(OFF);
- setsolidheader(OFF);
- }
-
- oMenu::~oMenu() {
- int i;
- for(i=1; i<=Numops; i++)
- delete picks[i];
- }
-
- void oMenu::setmenu(int x, int y, int fg, int bk, int nfg, int hfg, int hbk,
- int pfg, int style) {
-
- setwindow(x,y,20,5,fg,bk,style);
- Nfg=nfg;
- Hfg=hfg;
- Hbk=hbk;
- Pfg=pfg;
- }
-
- int oMenu::largestpick() {
- int i,l=0;
-
- for(i=1; i<=Numops; i++)
- if(strlen(picks[i])>l)
- l=strlen(picks[i]);
- return l;
- }
-
- void oMenu::writeoption(int i, int fg, int bk) {
-
- char s[80];
- int pos;
- register int j,k;
-
- if(!strchr(picks[i],'~'))
- writeat(1+Gap,i+Topgap,fg,bk,picks[i]);
- else {
- pos=strchr(picks[i],'~')-picks[i];
- for(j=0; j<pos; j++)
- s[j]=picks[i][j];
- k=j;
- for(j=pos+1;j<strlen(picks[i]); j++,k++)
- s[k]=picks[i][j];
- s[k]='\0';
- writeat(1+Gap,i+Topgap,fg,bk,s);
- chwriteat(1+Gap+pos,i+Topgap,Pfg,bk,picks[i][pos+1]);
- }
- }
-
- void oMenu::addtohotlist(int i) {
- if(strchr(picks[i],'~'))
- hotlist[i]=picks[i][(strchr(picks[i],'~')-picks[i])+1];
- else
- hotlist[i]=0;
- }
-
- void oMenu::addoption(char *s) {
-
- if(!Numops && s[0]=='-');
- else {
- Numops++;
- if(Numops>50)
- Numops=50;
- else {
- picks[Numops]=new char[strlen(s)+1];
- strcpy(picks[Numops],s);
- addtohotlist(Numops);
- mWid=largestpick();
- setwindow(getleft(),gettop(),(Gap*2)+mWid+1,Numops+2+(Topgap*2),
- getfgcolor(),getbkcolor(),getstyle());
-
- setminlen(Numops+2+Topgap*2);
- setminwid((Gap*2)+mWid+1);
- }
- }
- }
-
- void oMenu::makeline(int i) {
- fillarea(1,i+Topgap,getwid(),i+Topgap,getfgcolor(),getbkcolor(),196);
- }
-
- int oMenu::seperator(int i) {
- return picks[i][0]=='-';
- }
-
- void oMenu::highlight(int i) {
-
- if(i<=Numops)
- if(!seperator(i)) {
- fillarea(1,i+Topgap,getwid(),i+Topgap,Hfg,Hbk,32);
- writeoption(i,Hfg,Hbk);
- }
- else
- makeline(i);
- }
-
- void oMenu::unhighlight(int i) {
-
- if(i<=Numops)
- if(!seperator(i)) {
- fillarea(1,i+Topgap,getwid(),i+Topgap,Nfg,getbkcolor(),32);
- writeoption(i,Nfg,getbkcolor());
- }
- else
- makeline(i);
- }
-
- void oMenu::snaptocenter() {
- if(Hid) {
- Hid=FALSE;
- oWindow::snaptocenter();
- }
- }
-
- void oMenu::openmenu() {
- if(Hid) {
- Hid=FALSE;
- openwin();
- }
- }
-
- void oMenu::closemenu() {
- if (!Hid) {
- Hid=TRUE;
- closewin();
- }
- }
-
-
- void oMenu::display_info() {
-
- register int i;
-
- if(Numops) {
- for(i=1;i<=Numops;i++)
- if(picks[i][0]!='-')
- writeoption(i,Nfg,getbkcolor());
- else
- makeline(i);
- highlight(Current);
- }
- }
-
- int oMenu::withinbounds(int x, int y) {
-
- int found=0;
- int i=0;
-
- while(!found && i<=Numops) {
- i++;
- if(x>=1 && x<getwid()-1 && y==Topgap+i)
- found=i;
- }
- return found;
- }
-
- int oMenu::withinbounds(int c, int x, int y) {
-
- if(x>=1 && x<=getwid()-1 && y==Topgap+c)
- return c;
- else
- return 0;
- }
-
-
-
- int oMenu::handle_key_event() {
-
- int ev,i;
-
- ev=oWindow::handle_key_event();
- if(ev)
- return ev;
- int k=getkeycode();
- switch(k) {
- case 13 :
- Picked=Current;
- return cmdMenuPick;
- break; // enter
-
- case 27 : break; // escape
-
- case UpArrow : // up arrow
- unhighlight(Current);
- Current--;
- if(seperator(Current)) Current--;
- if(Current<1) Current=Numops;
- highlight(Current);
- break;
- case DownArrow: // down arrow
- unhighlight(Current);
- Current++;
- if(seperator(Current)) Current++;
- if(Current>Numops) Current=1;
- highlight(Current);
- break;
- default :
- k=upcase(k);
- for(i=1;(i<=Numops) && k!=upcase(hotlist[i]); i++);
- if(k==upcase(hotlist[i])) {
- unhighlight(Current);
- Current=i;
- highlight(Current);
- Picked=Current;
- return cmdMenuPick;
- }
- break;
-
- }
- return cmdNocmd;
- }
-
- int oMenu::handle_mouse_event() {
-
- int r=oWindow::handle_mouse_event();
- if(r && r!=cmdWithinwin)
- return r;
-
- if(r==cmdWithinwin) {
- int ev,ch;
- int x=buttonx();
- int y=buttony();
- int b=buttonb();
-
-
- if(b==1) {
- ch=withinbounds(x,y);
- if(ch) {
- unhighlight(Current);
- Current=ch;
- highlight(ch);
- while(b==1) {
- getmouse(x,y,b);
- showmouse();
- }
- ch=withinbounds(Current,x,y);
- if(ch)
- if(picks[Current][0]!='-') {
- Picked=ch;
- return cmdMenuPick;
- }
-
- }
- }
- }
- return cmdNocmd;
- }
-
- void oMenu::run() {
- setlastcmd(cmdNocmd);
- snaptocenter();
- while(getlastcmd()!=cmdClose && getlastcmd()!=cmdMenuPick)
- handle_events();
- }
-
- int oMenu::gomenu() {
-
- int ch=0;
-
- openmenu();
- while((ch<=0 || ch>Numops) && getlastcmd()!=cmdClose) {
- handle_events();
- ch=getlastcmd();
- }
- return ch;
- }
-