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 >
Wrap
C/C++ Source or Header
|
1992-04-25
|
6KB
|
301 lines
//
// *************************************************************************
// * *
// * 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;
}