// ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
// º NPSGUI.LIB Ç¿
// º GUICLS.CPP º³
// º Copyright 1993, Nearly Perfect Software. º³
// º All rights reserved º³
// º º³
// º This file is included in NPSGUI as a set of º³
// º middle-level classes for use by the library º³
// º user. It is intended as a programming example º³
// º and is included as source code. It may be º³
// º modified as needed and used in any application º³
// º that uses NPSGUI, as long as this comment º³
// º block is included. º³
// º º³
// º þ Written by Brad Broerman º³
// º þ Last Modified: 02/14/95 º³
// º þ Revision 2.5 º³
// ÈÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ³
// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
#include "npsgui.h"
#include "guicls.h"
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <alloc.h>
#include <time.h>
#include <dos.h>
extern gmouse mouse; // The global mouse handler...
// These functions find a character 'fnd' in "str" starting at begin, and returns the
// offset of that character (starting at 0). If the character is not found, an error
// is indicated as follows:
int find_char (char *str, char fnd, int begin); // Returns strlen() if not found.
int find_char2 (char *str, char fnd, int begin);// Returns -1 if not found.
// This function is used to return a sub-part of a string, just like the BASIC
// function of the same name. The pointer must br free'd after use.
char *mids(char *strr, int beg, int len);
radiopanel::radiopanel(int x, int y, int w, int h, int d, char *Hdr, char *list,int k=1)
: panel (x,y,w,h,d,7,OUT,k)
{
int pos = 0,
cpos = 0,
i,
slen;
TextClr = WHITE;
BtnSel = 0;
slen = strlen(Hdr);
Header = (char *)calloc(slen+2,1);
if (Header == NULL)
{
closegraph();
cerr << "Memory Allocation error making rbutton." << endl;
exit(-1);
}
strncpy(Header,Hdr,slen);
NumItems = 0;
while (cpos != -1)
{
cpos = find_char2(list,',',pos);
pos = cpos + 1;
++ NumItems;
}
i = pos = cpos = 0;
while (cpos != -1)
{
cpos = find_char2(list,',',pos);
Items[i++] = mids(list,pos,((cpos == -1) ? strlen(list) : cpos)-pos);
pos = cpos + 1;
}
for (i = 0; i < NumItems; ++i)
if ((Buttons[i] = new rbutton(0,0,textheight("Aj")/2+2,BLACK,0)) == NULL)
{
closegraph();
cerr << "Memory Allocation error making rbutton." << endl;
exit(-1);
}
}
radiopanel::~radiopanel()
{
for (int i=0; i < NumItems; ++i)
{
delete Items[i];
delete Buttons[i];
}
delete Header;
}
void radiopanel::setbtnclr(int c)
{
int i;
for (i=0; i < NumItems; ++i);
Buttons[i]->chgclr(c);
}
void radiopanel::settextclr(int c)
{
TextClr = c;
}
void radiopanel::show()
{
int Xo,i;
int orig_color;
struct fillsettingstype orig_settings;
struct linesettingstype orig_line;
struct textsettingstype textinfo;
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
gettextsettings(&textinfo);
setlinestyle(0,1,0);
if ((Height-2*Depth) < (NumItems+1) * (textheight("A")+3))
Height = (NumItems+1) * (textheight("A")+7) + 2*Depth+2;
if ((Width -2*Depth) < textwidth (Header))
Width = textwidth(Header) + 2*Depth+2;
for (i=0; i < NumItems; ++i)
if ((Width - 2*Depth) < textheight("A") + 16 + textwidth(Items[i]))
Width = textheight("A") + 18 + textwidth(Items[i]) + 2*Depth;
panel::show();
mouse.hide();
setcolor(TextClr);
settextjustify(CENTER_TEXT,TOP_TEXT);
outtextxy((X+Width/2),(Xo=Y+Height/2-(NumItems*(textheight("A")+7)+textheight("A"))/2),Header);
for (i=0; i <NumItems; ++i)
{
Xo += 7+textheight("Aj");
Buttons[i]->moveto(X+Depth+10,Xo+textheight("A")/2);
Buttons[i]->show();
settextjustify(LEFT_TEXT,TOP_TEXT);
setcolor(TextClr);
outtextxy((X+Depth+16+textheight("A")),Xo,Items[i]);
}
mouse.show();
settextjustify(textinfo.horiz,textinfo.vert);
setcolor(orig_color);
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
}
void radiopanel::hide()
{
int i;
for (i=0; i<NumItems; ++i)
Buttons[i]->hide();
panel::hide();
}
int radiopanel::btnhit()
{
int i;
for (i=0; i < NumItems; ++i)
if (Buttons[i]->hit())
break;
if (i == NumItems)
return 0;
return (i+1);
}
void radiopanel::selectbtn(int no)
{
if ((no > 0) && (no <= NumItems))
{
if (BtnSel > 0)
Buttons[BtnSel-1]->show();
Buttons[no-1]->select();
BtnSel = no;
}
}
int radiopanel::checkforevent()
{
int c;
int cb;
if (!isShown)
return 0;
cb = BtnSel;
while(1)
{
if (btnhit() && mouse.getbutton(LEFT_BTN) && btnhit())
{
selectbtn(btnhit());
return 1;
}
if (keyhit())
{
c = getkey();
if (c > 255)
{
c= c & 0xf;
if (c == 80) // Down Arrow
selectbtn(cb = (cb+1 > 7) ? 7 : cb+1);
else if (c == 72) // Up Arrow
selectbtn(cb =(cb-1 > 1) ? cb-1 : 1);
}
else if (c == 13) // The Enter Key
return 1;
else if (c == 27) // The Escape Key
break;
}
}
return 0;
}
int radiopanel::btnselected()
{
return (BtnSel);
}
void radiopanel::btnclear()
{
Buttons[BtnSel-1]->show();
BtnSel = 0;
}
void textplane::ANSI_Decode(char c) // Decodes ANSI escape sequences.
{
int attrib,
i,
Indx;
if (REscSeq) // If we are recording a sequence,
{
if (isalpha(c)) // and we encounter an alpha,
{ // no more than 40 in STR[].
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = c; // Store it,
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = 0x00; // terminate the string,
--SIndex;
REscSeq = 0; // And terminate recording.
}
else // Otherwise,
{
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = c; // Store it, and return. Keep recording!
return;
}
}
else // Otherwise, if we aren't recording a sequence,
{
if (c == 27) // Check for escape sequence.
{
REscSeq = 1; // Indicate that we are reading a sequence.
SIndex = 0; // Start at the beginning of the buffer.
for (i=0; i<20; ++i) // Clear the buffer.
STR[i] = 0;
STR[0] = 27; // Set the beginning of the string to the ESC chaaracter.
return; // and return.
}
else // If we aren't beginning a new one,
{
STR[0] = c; // Place the character in STR,
STR[1] = 0x00; // and terminate it.
}
}
// Now, when we reach this point, we are ready to translate the string STR.
int orig_color; // Store original screen settings,
struct fillsettingstype orig_settings; // So we can fet them back later.
struct linesettingstype orig_line;
struct textsettingstype textinfo;
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
gettextsettings(&textinfo);
setlinestyle(0,1,0);
if ((STR[0] == 27) && (STR[1] == '[')) // Check for an escape sequence in STR.
{
switch (STR[SIndex]) // get the character that tells what the code is for.
{
case 's': SavY = CsrY;
SavX = CsrX;
break;
case 'u': CsrX = SavX;
CsrY = SavY;
break;
case 'K': mouse.hide();
CsrX = X+textwidth("A")/2-1;
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,CsrY-textheight("A")/2,X+Width-1,CsrY+textheight("A")/2-1);
for (Indx =0; Indx < (Width/textwidth("A"));++Indx)
{
*(TxtBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
*((char *)(AtrBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))) = 0x00;
}
mouse.show();
break;
case 'A': if (atoi(STR+2) >0)
CsrY = CsrY - (textheight("A"))*atoi(STR+2);
else
CsrY = CsrY - textheight("A");
if (CsrY < Y+textheight("A")/2)
CsrY = Y+textheight("A")/2;
break;
case 'B': if (atoi(STR+2) > 0)
CsrY = CsrY + (textheight("A"))*atoi(STR+2);
else
CsrY = CsrY + textheight("A");
while (CsrY > (Y+Height-textheight("A")/2))
CsrY -= textheight("A");
break;
case 'C': if (atoi(STR+2) > 0)
CsrX = CsrX + textwidth("A")*atoi(STR+2);
else
CsrX = CsrX + textwidth("A");
while (CsrX > (X+Width - textwidth("A")/2))
CsrX -= textwidth("A");
break;
case 'D': if (atoi(STR+2) > 0)
CsrX = CsrX - textwidth("A")*atoi(STR+2);
else
CsrX = CsrX - textwidth("A");
if (CsrX < X + textwidth("A")/2-1)
CsrX = X + textwidth("A")/2-1;
break;
case 'J': if (atoi(STR+2) == 2)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,Y,X+Width-1,Y+Height-1);
CsrX = X+textwidth("A")/2-1;
CsrY = Y+textheight("A")/2;
for (Indx = 0; Indx < (Width/textwidth("A"))* (Height/textheight("A")) ; ++Indx)
{
*(TxtBuf+CurScrn+Indx) = (char)0x00;
(AtrBuf+CurScrn+Indx)->Bkg = BkgClr;
}
mouse.show();
}
break;
case 'H':
case 'f': CsrY = (textheight("A")) * (((atoi(STR+2)-1) > 0) ? (atoi(STR+2)-1) : 0) +Y+textheight("A")/2;
CsrX = textwidth("A") * ( (atoi((STR+find_char(STR,';',0)+1))>0)?(atoi((STR+find_char(STR,';',0)+1))-1):0)+X+textwidth("A")/2-1;
while (CsrX > (X+Width - textwidth("A")/2))
CsrX -= textwidth("A");
while (CsrY > (Y+Height-textheight("A")/2))
CsrY -= textheight("A");
break;
case 'm': i=-1;
do
{
attrib = atoi(STR+3+i);
if (attrib == 0) Bold = 0;
if (attrib == 1) Bold = 1;
if ((attrib > 29) && (attrib < 38))
switch (attrib-30)
{
case 0:TxtClr = BLACK+8*Bold; break;
case 1:TxtClr = RED+8*Bold; break;
case 2:TxtClr = GREEN+8*Bold; break;
case 3:TxtClr = BROWN+8*Bold; break;
case 4:TxtClr = BLUE+8*Bold; break;
case 5:TxtClr = MAGENTA+8*Bold; break;
case 6:TxtClr = CYAN+8*Bold; break;
case 7:TxtClr = LIGHTGRAY+8*Bold; break;
}
if ((attrib > 39) && (attrib < 48))
switch (attrib-40)
{
case 0:BkgClr = BLACK; break;
case 1:BkgClr = RED; break;
case 2:BkgClr = GREEN; break;
case 3:BkgClr = BROWN; break;
case 4:BkgClr = BLUE; break;
case 5:BkgClr = MAGENTA; break;
case 6:BkgClr = CYAN; break;
case 7:BkgClr = LIGHTGRAY; break;
}
i = find_char(STR+2,';',i+1);
}
while (i < strlen(STR)-2);
}
}
else
Print_Char(STR[0]);
move_csr();
settextjustify(textinfo.horiz,textinfo.vert); // Reset various screen parameters
setcolor(orig_color); // that we may have changed here.
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
}
void textplane::VT100_Decode(char c)
{
int attrib,
i,
Indx;
if (REscSeq) // If we are recording a sequence,
{
if (isalpha(c)) // and we encounter an alpha,
{
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = c; // Store it,
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = 0x00; // terminate the string,
--SIndex;
REscSeq = 0; // And terminate recording.
}
else // Otherwise,
{
STR[(SIndex = (SIndex<39) ? SIndex+1 : 39)] = c; // Store it, and return. Keep recording!
return;
}
}
else // Otherwise, if we aren't recording a sequence,
{
if (c == 27) // Check for escape sequence.
{
REscSeq = 1; // Indicate that we are reading a sequence.
SIndex = 0; // Start at the beginning of the buffer.
memset(STR,0,20);// Clear the buffer.
STR[0] = 27; // Set the beginning of the string to the ESC chaaracter.
return; // and return.
}
else // If we aren't beginning a new one,
{
STR[0] = c; // Place the character in STR,
STR[1] = 0x00; // and terminate it.
}
}
// Now, when we reach this point, we are ready to translate the string STR.
if ((STR[0] == 27) && (STR[1] == '[')) // Check for an escape sequence in STR.
{
switch(STR[SIndex])
{
case 'A': if (atoi(STR+2) >0)
CsrY = CsrY - (textheight("A"))*atoi(STR+2);
else
CsrY = CsrY - textheight("A");
if (CsrY < Y+textheight("A")/2)
CsrY = Y+textheight("A")/2;
break;
case 'B': if (atoi(STR+2) > 0)
CsrY = CsrY + (textheight("A"))*atoi(STR+2);
else
CsrY = CsrY + textheight("A");
while (CsrY > (Y+Height-textheight("A")/2))
CsrY -= textheight("A");
break;
case 'C': if (atoi(STR+2) > 0)
CsrX = CsrX + textwidth("A")*atoi(STR+2);
else
CsrX = CsrX + textwidth("A");
while (CsrX > (X+Width - textwidth("A")/2))
CsrX -= textwidth("A");
break;
case 'D': if (atoi(STR+2) > 0)
CsrX = CsrX - textwidth("A")*atoi(STR+2);
else
CsrX = CsrX - textwidth("A");
if (CsrX < X + textwidth("A")/2-1)
CsrX = X + textwidth("A")/2-1;
break;
case 'H':
case 'f': CsrY = (textheight("A")) * (((atoi(STR+2)-1) > 0) ? (atoi(STR+2)-1) : 0) +Y+textheight("A")/2;
CsrX = textwidth("A") * ( (atoi((STR+find_char(STR,';',0)+1))>0)?(atoi((STR+find_char(STR,';',0)+1))-1):0)+X+textwidth("A")/2-1;
while (CsrX > (X+Width - textwidth("A")/2))
CsrX -= textwidth("A");
while (CsrY > (Y+Height-textheight("A")/2))
CsrY -= textheight("A");
break;
case 'J': if (atoi(STR+2) == 2)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,Y,X+Width-1,Y+Height-1);
CsrX = X+textwidth("A")/2-1;
CsrY = Y+textheight("A")/2;
for (Indx = 0; Indx < (Width/textwidth("A"))* (Height/textheight("A")) ; ++Indx)
{
*(TxtBuf+CurScrn+Indx) = (char)0x00;
(AtrBuf+CurScrn+Indx)->Bkg = BkgClr;
}
mouse.show();
}
else if (atoi(STR+2) == 1)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,Y,X+Width-1,CsrY+textheight("A")/2-1);
for (Indx = 0; Indx < (Width/textwidth("A"))* (((CsrY-Y)+textheight("A")/2)/textheight("A")) ; ++Indx)
{
*(TxtBuf+CurScrn+Indx) = (char)0x00;
(AtrBuf+CurScrn+Indx)->Bkg = BkgClr;
}
mouse.show();
}
else //if (atoi(STR+2) == 0)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,CsrY-textheight("A")/2,X+Width-1,Y+Height-1);
for (Indx = ((Width/textwidth("A"))* (((CsrY-Y)-textheight("A")/2)/textheight("A"))) ; Indx < ((Width/textwidth("A"))* (Height/textheight("A"))) ; ++Indx)
{
*(TxtBuf+CurScrn+Indx) = (char)0x00;
(AtrBuf+CurScrn+Indx)->Bkg = BkgClr;
}
mouse.show();
}
break;
case 'K': if (atoi(STR+2) == 2)
{
mouse.hide();
CsrX = X+textwidth("A")/2-1;
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,CsrY-textheight("A")/2,X+Width-1,CsrY+textheight("A")/2-1);
for (Indx =0; Indx < (Width/textwidth("A"));++Indx)
{
*(TxtBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
*((char *)(AtrBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))) = 0x00;
}
mouse.show();
}
else if (atoi(STR+2) == 1)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,CsrY-textheight("A")/2,X+CsrX+textwidth("A")/2,CsrY+textheight("A")/2-1);
for (Indx =0; Indx <= ((CsrX-X)/textwidth("A")) ;++Indx)
{
*(TxtBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
*((char *)(AtrBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))) = 0x00;
}
mouse.show();
}
else //if (atoi(STR+2) == 0)
{
mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X+CsrX+textwidth("A")/2+1,CsrY-textheight("A")/2,X+Width-1,CsrY+textheight("A")/2-1);
for (Indx =((CsrX-X)/textwidth("A")) ; Indx < (Width/textwidth("A"));++Indx)
{
*(TxtBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
*((char *)(AtrBuf+CurScrn+Indx+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))) = 0x00;
}
mouse.show();
}
break;
case 'm': attrib = atoi(STR+2);
if (attrib == 0)
{
Bold = 0;
TxtClr = LIGHTGRAY;
BkgClr = BLACK;
}
else if (attrib == 1)
{
Bold = 1;
if (TxtClr == LIGHTGRAY)
TxtClr = WHITE;
}
else if (attrib == 7)
{
TxtClr = BLACK;
BkgClr = LIGHTGRAY+8*Bold;
}
break;
}
}
else if ((STR[0] == 27) && (isalpha(STR[1])))
{
}
else
Print_Char(STR[0]);
move_csr();
}
void textplane::Print_Char(char c) // Displays the character on the screen.
{
char S[2];
int Indx, i;
S[0] = c;
S[1] = 0x00;
int orig_color; // Store original screen settings,
struct fillsettingstype orig_settings; // So we can fet them back later.
struct linesettingstype orig_line;
struct textsettingstype textinfo;
unsigned long istr;
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
gettextsettings(&textinfo);
setlinestyle(0,1,0);
switch ((int) S[0]) // If it isn't a control sequence, translate and print it.
{
case 10: CsrY += textheight("Aj");
break;
case 13: CsrX = X+textwidth("A")/2-1;
break;
case 9: CsrX += 5*textwidth("A")-1;
break;
case 8: if (CsrX >X+textwidth("A")/2+1)
{
mouse.hide();
CsrX -= textwidth("A");
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar (CsrX-textwidth("A")/2+1,CsrY-textheight("A")/2,
CsrX+textwidth("A")/2,CsrY+textheight("A")/2-1);
*(TxtBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Fgd = TxtClr;
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Bkg = BkgClr;
mouse.show();
}
break;
case 127:mouse.hide();
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar (CsrX-textwidth("A")/2+1,CsrY-textheight("A")/2,
CsrX+textwidth("A")/2,CsrY+textheight("A")/2-1);
*(TxtBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = 0x00;
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Fgd = TxtClr;
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Bkg = BkgClr;
mouse.show();
break;
default: setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
mouse.hide();
bar (CsrX-textwidth("A")/2+1,CsrY-textheight("A")/2,
CsrX+textwidth("A")/2,CsrY+textheight("A")/2-1);
setcolor(TxtClr);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(CsrX,CsrY,S);
*(TxtBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A"))) = S[0];
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Fgd = TxtClr;
(AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Bkg = BkgClr;
mouse.show();
CsrX += textwidth("A");
break;
}
if (CsrX >= X+Width-textwidth("A")/2)
{
CsrX = X+textwidth("A")/2-1;
CsrY += textheight("Aj");
}
if (CsrY > Y+Height- textheight("Aj")/2)
{
mouse.hide();
setcolor(DefBkgClr);
setfillstyle(SOLID_FILL,DefBkgClr);
CurScrn += ((Width/textwidth("A"))*((Height/textheight("A"))/2));
if (CurScrn >= SBBSize-((Width/textwidth("A"))*((Height/textheight("A"))/2))-(SBBSize%((Width/textwidth("A"))*((Height/textheight("A"))/2))))
{
for (istr = 0; istr < SBBSize-(Width/textwidth("A"))*((Height/textheight("A"))/2); ++ istr)
{
*(TxtBuf+istr) = *(TxtBuf+(Width/textwidth("A"))*((Height/textheight("A"))/2)+istr);
*((char far *)AtrBuf+istr) = *((char far *)AtrBuf+(Width/textwidth("A"))*((Height/textheight("A"))/2)+istr);
}
for (istr = 0; istr < ((Width/textwidth("A"))*((Height/textheight("A"))/2)); ++istr)
{
*((char far *)AtrBuf+SBBSize-(Width/textwidth("A"))*((Height/textheight("A"))/2)+istr) = 0x00;
*(TxtBuf+SBBSize-(Width/textwidth("A"))*((Height/textheight("A"))/2)+istr) = 0x00;
}
CurScrn -= ((Width/textwidth("A"))*((Height/textheight("A"))/2));
}
drawscrn((TxtBuf+CurScrn),(AtrBuf+CurScrn),(Height/textheight("A")));
CsrY = Y+((Height/textheight("A"))/2+((Height/textheight("A"))%2 == 1))*textheight("A")+textheight("A")/2;
mouse.show();
}
move_csr();
settextjustify(textinfo.horiz,textinfo.vert); // Reset various screen parameters
setcolor(orig_color); // that we may have changed here.
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
}
textplane::textplane(int x, int y, int w, int h, int tc, int bc)
: gbase(x,y,w,h,0)
{
OldX = SavX = CsrX = x+textwidth("A")/2-1;
OldY = SavY = CsrY = y+textheight("A")/2;
DefBkgClr = BkgClr = bc;
TxtClr = tc;
TermEm = 3;
Echo = Bold = 0;
STR[0]=0x00;
SIndex = REscSeq = 0;
Buffer = NULL;
SBBSize = (Width/textwidth("A"))*(Height/textheight("A"));
CurScrn = 0;
ShowCsr = 0;
CsrShwn = 0;
TxtBuf = (char far *)farcalloc(SBBSize,1);
AtrBuf = (attr far *)farcalloc(SBBSize,1);
move_csr();
if ((!TxtBuf) || (!AtrBuf))
{
closegraph();
cerr << "Memory allocatin error in scrollback buffer in textplane."<<endl;
if (TxtBuf)
free(TxtBuf);
else
free (AtrBuf);
exit(1);
}
}
textplane::~textplane()
{
if (Buffer)
farfree(Buffer);
if (TxtBuf)
farfree(TxtBuf);
if (AtrBuf)
farfree(AtrBuf);
}
int textplane::setbuffsize(unsigned size)
{
char *NewTxtBuf;
attr *NewAtrBuf;
if (size < (Width/textwidth("A"))*(Height/textheight("A")))
size =(Width/textwidth("A"))*(Height/textheight("A"));
if (size % (Width/textwidth("A"))*(Height/textheight("A")))
size -= (size%(Width/textwidth("A"))*(Height/textheight("A")));
NewTxtBuf = (char far *)farcalloc(size,1);
NewAtrBuf = (attr far *)farcalloc(size,1);
if ((!NewTxtBuf) || (!NewAtrBuf))
{
if (NewTxtBuf)
farfree (NewTxtBuf);
if (NewAtrBuf)
farfree (NewAtrBuf);
return 0;
}
_fmemcpy(NewTxtBuf,TxtBuf,((size > SBBSize) ? SBBSize : size));
_fmemcpy(NewAtrBuf,AtrBuf,((size > SBBSize) ? SBBSize : size));
farfree(TxtBuf);
farfree(AtrBuf);
TxtBuf = NewTxtBuf;
AtrBuf = NewAtrBuf;
SBBSize = size;
return 1;
}
void textplane::show()
{
mouse.hide();
if (Buffer)
{
putimage(X,Y,Buffer,COPY_PUT);
farfree(Buffer);
Buffer = NULL;
}
else
{
int orig_color; // Store original screen settings,
struct fillsettingstype orig_settings; // So we can fet them back later.
struct linesettingstype orig_line;
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
setlinestyle(0,1,0);
setcolor(BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar(X,Y,X+Width-1,Y+Height-1);
setcolor(orig_color); // that we may have changed here.
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
}
STR[0] = 0x00;
SIndex = REscSeq = 0;
isShown = 1;
move_csr();
mouse.show();
}
void textplane::drawscrn(char far *Buffer,attr far *AtrBuf,int lines)
{
int i,
j,
Cx,
Cy;
char C[2] = {0x00,0x00};
mouse.hide();
for (i = 0; i < lines; ++i)
for (j=0; j<(Width/textwidth("A")); ++j)
{
setcolor((AtrBuf+i*(Width/textwidth("A"))+j)->Bkg);
setfillstyle(SOLID_FILL,(AtrBuf+i*(Width/textwidth("A"))+j)->Bkg);
bar (j*textwidth("A")+X-1,i*textheight("A")+Y,
(j+1)*textwidth("A")+X-1,(i+1)*textheight("A")+Y-1);
setcolor((AtrBuf+i*(Width/textwidth("A"))+j)->Fgd);
settextjustify(CENTER_TEXT,CENTER_TEXT);
Cx = j*textwidth("A")+X+textwidth("A")/2-1;
Cy = i*textheight("A")+Y+textheight("A")/2;
*C = *(Buffer+i*(Width/textwidth("A"))+j);
if (*C != (char)0x00)
outtextxy(Cx,Cy,C);
}
mouse.show();
}
void textplane::hide()
{
long int imgsize;
if (Buffer)
delete Buffer;
imgsize = imagesize(X,Y,X+Width-1, Y+Height-1);
Buffer = (char *)farmalloc(imgsize);
if (!Buffer)
{
closegraph();
cerr << "Error allocating memory in textplane::hide."<<endl;
exit(1);
}
int orig_color; // Store original screen settings,
struct fillsettingstype orig_settings; // So we can fet them back later.
struct linesettingstype orig_line;
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
setlinestyle(0,1,0);
mouse.hide();
getimage (X,Y,X+Width-1,Y+Height+1,Buffer);
isShown = 0;
setcolor(DefBkgClr);
setfillstyle(SOLID_FILL,DefBkgClr);
bar (X,Y,X=Width-1,Y+Height-1);
STR[0] = 0x00;
SIndex = REscSeq = 0;
setcolor(orig_color); // that we may have changed here.
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
mouse.show();
}
void textplane::settxtclr(int c) // Set the text color.
{
TxtClr = c;
}
void textplane::setbkgclr(int c) // Set the background color.
{
DefBkgClr = BkgClr = c;
}
void textplane::gotoxy(int x, int y) // Move the cursor to x,y (in pixels).
{
CsrY = (textheight("A") * y)+Y+textheight("A")/2;
CsrX = (textwidth("A") * x)+X+textwidth("A")/2-1;
while (CsrX > (X+Width - textwidth("A")/2))
CsrX -= textwidth("A");
while (CsrY > (Y+Height-textheight("A")/2))
CsrY -= textheight("A");
move_csr();
}
void textplane::move_csr(void)
{
char FgChar,
C[3]={0x00,0x00,0x00};
int FgClr,
BkClr;
mouse.hide();
if (CsrShwn)
{
FgChar = *(TxtBuf+CurScrn+(OldX-X)/textwidth("A")+(OldY-Y)/textheight("A")*(Width/textwidth("A")));
FgClr = (AtrBuf+CurScrn+(OldX-X)/textwidth("A")+(OldY-Y)/textheight("A")*(Width/textwidth("A")))->Fgd;
BkClr = (AtrBuf+CurScrn+(OldX-X)/textwidth("A")+(OldY-Y)/textheight("A")*(Width/textwidth("A")))->Bkg;
setcolor(BkClr);
setfillstyle(SOLID_FILL,BkClr);
bar (OldX-textwidth("A")/2+1,OldY-textheight("A")/2,
OldX+textwidth("A")/2,OldY+textheight("A")/2-1);
setcolor(FgClr);
settextjustify(CENTER_TEXT,CENTER_TEXT);
C[0] = FgChar;
outtextxy(OldX,OldY,C);
CsrShwn = 0;
}
if (ShowCsr)
{
FgChar = *(TxtBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")));
FgClr = (AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Fgd;
BkClr = (AtrBuf+CurScrn+(CsrX-X)/textwidth("A")+(CsrY-Y)/textheight("A")*(Width/textwidth("A")))->Bkg;
BkClr = (BkClr >= 7) ? BLACK : WHITE;
FgClr = (BkClr == WHITE) ? BLACK : WHITE;
setcolor(BkClr);
setfillstyle(SOLID_FILL,BkClr);
bar (CsrX-textwidth("A")/2+1,CsrY-textheight("A")/2,
CsrX+textwidth("A")/2,CsrY+textheight("A")/2-1);
setcolor(FgClr);
settextjustify(CENTER_TEXT,CENTER_TEXT);
C[0] = FgChar;
outtextxy(CsrX,CsrY,C);
CsrShwn = 1;
OldX = CsrX;
OldY = CsrY;
}
mouse.show();
}
void textplane::setcsr(int F)
{
ShowCsr = (F != 0);
}
void textplane::settermem(int t) // Sets the terminal emulation. (ANSI, VT100, ASCII)
{
switch (t)
{
case 1: TermEm = 1; break; // Ansi Emulation.
case 2: TermEm = 2; break; // VT100 Emulation.
case 3:
default: TermEm = 3; break; // Straight ASCII.
}
TxtClr = LIGHTGRAY;
BkgClr = BLACK;
STR[0] = 0x00;
SIndex = REscSeq = 0;
}
void textplane::clearwin(void) // Clears the textplane to the background color.
{
int Indx;
int orig_color; // Store original screen settings,
struct fillsettingstype orig_settings; // So we can fet them back later.
struct linesettingstype orig_line;
mouse.hide();
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
setlinestyle(0,1,0);
setcolor (BkgClr);
setfillstyle(SOLID_FILL,BkgClr);
bar (X,Y,X+Width-1,Y+Height-1);
setcolor(orig_color); // that we may have changed here.
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
for (Indx = 0; Indx < (Width/textwidth("A"))* (Height/textheight("A")) ; ++Indx)
{
*(TxtBuf+Indx) = (char) 0x00;
*((char *)(AtrBuf+Indx)) = (char) 0x00;
}
mouse.show();
}
char textplane::peek()
{
char c;
c = getkey();
putbk(c);
return ((char)(c & 0xff));
}
textplane &textplane::operator << (char &c)
{
switch (TermEm)
{
case 1: ANSI_Decode(c); break;
case 2: VT100_Decode(c); break;
case 3: Print_Char(c); break;
}
return *this;
}
textplane &textplane::operator << (char *c)
{
for (int i=0; i < strlen(c); ++i)
operator <<( (char) *(c+i) );
return *this;
}
textplane &textplane::operator << (int &I)
{
char Strn[10];
itoa(I,Strn,10);
operator <<(Strn);
return *this;
}
textplane &textplane::operator << (long &L)
{
char Strn[15];
ltoa(L,Strn,10);
operator <<(Strn);
return *this;
}
textplane &textplane::operator << (double &D)
{
char Strn[10];
gcvt(D,7,Strn);
operator <<(Strn);
return *this;
}
textplane &textplane::operator >> (char &c)
{
if (keyhit())
{
c = (char)(getkey() & 0xff);
if (Echo)
operator <<(c);
}
return *this;
}
textplane &textplane::operator >> (char *C)
{
char inchar;
int index = 0;
while (isspace(peek()))
operator >> (inchar); // Skip leading whitespace.
while (!(isspace(peek())))
{
operator >> (inchar); // Get characters until whitespace.
*(C+index++) = inchar;
}
*(C+index) = 0x00; // Null terminate end of string.
return *this;
}
textplane &textplane::operator >> (int &I)
{
char inchar, C[9];
int index=0;
while (isspace(peek())) // Skip leading whitespace.
operator >> (inchar);
if ((peek() == '+') || (peek() == '-')) // Get sign character.
{
operator >> (inchar);
*(C+index++) = inchar;
}
while ((isdigit(peek())) && (index < 8))// Get characters until no more digits.
{
operator >> (inchar);
*(C+index++) = inchar;
}
*(C+index) = 0x00; // Null terminate end of string.
I =atoi(C); // Convert it to an int.
return *this;
}
textplane &textplane::operator >> (long &L)
{
char inchar, C[16];
int index=0;
while (isspace(peek())) // Skip leading whitespace.
operator >> (inchar);
if ((peek() == '+') || (peek() == '-')) // Get sign character.
{
operator >> (inchar);
*(C+index++) = inchar;
}
while ((isdigit(peek())) && (index <15)) // Get characters until no more digits.
{
operator >> (inchar);
*(C+index++) = inchar;
}
*(C+index) = 0x00; // Null terminate end of string.
L =atol(C); // Convert it to a long.
return *this;
}
textplane &textplane::operator >> (double &D)
{
char inchar, C[30], *endptr;
int index=0;
while (isspace(peek())) // Skip leading whitespace.
operator >> (inchar);
if ((peek() == '+') || (peek() == '-')) // Get sign character.
{
operator >> (inchar);
*(C+index++) = inchar;
}
while (((isdigit(peek())) || (peek() == '.') || (peek() == 'e') ||
(peek() == 'E') || (peek() == '+') || (peek() == '-')) && (index <29)) // Get characters until no more digits.
{
operator >> (inchar);
*(C+index++) = inchar;
}
*(C+index) = 0x00; // Null terminate end of string.
D =strtol(C, &endptr, 10); // Convert it to a double.
return *this;
}
char *textplane::gettxt(void) // returns a copy of the screen text buffer.
{
return (TxtBuf);
}
char *textplane::getatr(void)
{
return ((char *)AtrBuf);
}
unsigned textplane::getscrnptr(void)
{
return CurScrn;
}
unsigned textplane::getbufsize(void)
{
return SBBSize;
}
selectbar::selectbar(int x, int y, int w, char *Lst, int bw, int h, int c, int bc, int k)
: instrn (x,y,w,h,1,c,k)
{
char Dn[3] = {23,0,0};
int Error = 0,
slen;
pulled_down = 0;
itm_selected = 0;
BW = bw;
Hi_Clr = LIGHTRED;
slen = strlen(Lst);
List = (char *)calloc(1,slen+1);
if (List != NULL)
{
strncpy(List,Lst,slen);
num_itms = 1;
for (int i=0;*(List+i) != 0x00; ++i)
if (*(List+i) == ',')
++num_itms;
}
else
Error = 1;
DnBtn = new button(x+w+4,y+1,bw,h-2,1,bc,1,TEXT,Dn,k);
if (!DnBtn)
Error = 1;
PlDn = new panel(x,y+h+2,w,num_itms*(textheight("Aj")+2)+2,1,IN,c,1);
if (!PlDn)
Error = 1;
if (Error)
{
if (List)
free(List);
if (DnBtn)
delete DnBtn;
if (PlDn)
delete PlDn;
closegraph();
cerr << "Memory allocation error in selectbar::selectbar()" << endl;
exit(-1);
}
}
selectbar::~selectbar(void)
{
if (PlDn)
delete PlDn;
if (DnBtn)
delete DnBtn;
if (List)
free (List);
}
void selectbar::show(void)
{
instrn::show();
DnBtn->show();
if (pulled_down)
PlDn->hide();
pulled_down = 0;
}
/*void selectbar::newlist(char *Lst)
{
if (List)
free(List);
List = (char *)calloc(1,strlen(Lst)+1);
if (List != NULL)
{
strcpy(List,Lst);
num_itms = 1;
for (int i=0;*(List+i) != 0x00; ++i)
if (*(List+i) == ',')
++num_itms;
}
else
Error = 1;
if (PlDn)
delete PlDn;
PlDn = new panel(x,y+h+2,w,num_itms*(textheight("Aj")+2)+2,1,IN,c,1);
if (!PlDn)
Error = 1;
if (Error)
{
if (List)
free(List);
if (PlDn)
delete PlDn;
closegraph();
cerr << "Memory allocation error in selectbar::newlist()" << endl;
exit(-1);
}
}*/
void selectbar::hide(void)
{
instrn::hide();
DnBtn->hide();
if (pulled_down)
PlDn->hide();
pulled_down = 0;
}
char *selectbar::inptstrn()
{
return instrn::getinput();
}
char *selectbar::getinput()
{
char *Temp,
*Temp2;
int Key,
Itm;
while(1)
{
Temp = instrn::getinput();
if ((lastkey() == 0x50) || btnhit())
{
push();
while(mouse.btnpressed() && btnhit())
;
rels();
pulldown();
if (lastkey() == 0x50)
selitem(1);
while(1)
{
if ((!btnhit()) && DnBtn->is_selected())
rels();
if (mouse.getbutton(LEFT_BTN))
{
while (mouse.getbutton(LEFT_BTN))
{
if (btnhit() && (!DnBtn->is_selected()))
push();
if ((!btnhit()) && DnBtn->is_selected())
rels();
if (itmhit())
{
if (itmhit() != itmselected())
{
clritem();
selitem(itmhit());
}
}
if (!pnlhit() && !btnhit() && pulled_down)
{
rels();
pushup();
break;
}
}
if (itmhit())
{
Temp2 = getitem();
preset(Temp2);
free(Temp2);
instrn::show();
pushup();
break;
}
else if (btnhit())
rels();
else
{
pushup();
break;
}
}
if (keyhit())
{
Key = getkey();
if (Key == 336) // Down Arrow
{
Itm = itmselected();
clritem();
Itm = (Itm < num_itms) ? Itm+1 : num_itms;
selitem(Itm);
}
if (Key == 328) // Up Arrow
{
Itm = itmselected();
clritem();
Itm = (Itm > 1) ? Itm-1 : 1;
selitem(Itm);
}
if (Key == 13)
{
Temp2 = getitem();
preset(Temp2);
free(Temp2);
instrn::show();
pushup();
break;
}
if (Key == 27)
{
pushup();
break;
}
}
}
}
else
break;
}
return Temp;
}
void selectbar::pulldown(void)
{
int i,
l,
h;
char *Tmp;
mouse.hide();
PlDn->show();
setcolor(TxtColor);
settextjustify(LEFT_TEXT,CENTER_TEXT);
itm_selected = 0;
h = Y+Height+3+textheight("Aj")/2;
for (i=0, l=0; *(List+i) != 0x00;)
{
i = find_char(List,',',l);
outtextxy(X+4,h,(Tmp = mids(List,l,i-l)));
free(Tmp);
l=i+1;
h += textheight("Aj")+2;
}
pulled_down = 1;
mouse.show();
}
void selectbar::pushup(void)
{
if (pulled_down)
PlDn->hide();
pulled_down = 0;
}
void selectbar::push(void)
{
DnBtn->select();
}
void selectbar::rels(void)
{
DnBtn->show();
}
void selectbar::selitem (int itm)
{
int h;
char *Tmp;
if (!((itm > 0) && (itm <= num_itms)))
return;
mouse.hide();
itm_selected = itm;
h = Y+Height+2+(textheight("Aj")+2)*(itm-1);
setcolor(Hi_Clr);
setfillstyle(SOLID_FILL,Hi_Clr);
bar(X+3,h,X+Width-4,h+textheight("Aj")+1);
setcolor(TxtColor);
settextjustify(LEFT_TEXT,CENTER_TEXT);
outtextxy(X+4,h+textheight("Aj")/2+1,(Tmp = getitem()));
free(Tmp);
mouse.show();
}
void selectbar::clritem (void)
{
pulldown();
}
int selectbar::itmselected(void)
{
return itm_selected;
}
char *selectbar::getitem(void)
{
int Cnt = 0,
i = 0,
l = 0;
for (i=0,l=0; *(List+i) != 0x00;l=i+1)
{
i = find_char(List,',',l);
if (++Cnt == itm_selected)
break;
}
if (l < i)
return (mids(List,l,i-l));
return NULL;
}
int selectbar::itmhit(void)
{
int itm = 0;
if (pulled_down)
if (PlDn->hit())
itm = ((mouse.getmY()-(Y+Height)-2) / (textheight("Aj")+2))+1;
if ((itm <0) || (itm > num_itms))
return 0;
return itm;
}
int selectbar::btnhit(void)
{
return DnBtn->hit();
}
int selectbar::pnlhit(void)
{
return PlDn->hit();
}
void selectbar::setbtnclr(int c)
{
DnBtn->setextclr(c);
}
void selectbar::setbkgclr(int c)
{
instrn::setbkgclr(c);
PlDn->setbkgclr(c);
}
void selectbar::sethiclr(int c)
{
Hi_Clr = c;
}
void selectbar::moveto (int x, int y)
{
instrn::moveto(x,y);
PlDn->moveto(x,y+Height);
DnBtn->moveto(x+Width+2,y+1);
}
void selectbar::resize(int w, int h)
{
instrn::resize(w,h);
PlDn->moveto(X,Y+Height+2);
PlDn->resize(w,num_itms*(textheight("Aj")+2));
DnBtn->moveto(X+Width+4,Y+1);
DnBtn->resize(BW,h);
}
int find_char (char *str, char fnd, int begin)
{
int i;
for (i= begin; *(str+i) != '\0' ;++i)
{
if ( *(str+i) == fnd )
break;
}
if (!(*(str+i) == '\0'))
return i;
else
return strlen(str);
}
int find_char2 (char *str, char fnd, int begin)
{
int i;
for (i= begin; *(str+i) != '\0' ;++i)
{
if ( *(str+i) == fnd )
break;
}
if (!(*(str+i) == '\0'))
return i;
else
return -1;
}
char *mids(char *Str, int beg, int cnt)
{
int i;
char *target;
target =(char *)malloc(cnt+1);
if (target != NULL)
{
for (i=0; i< cnt; ++i)
*(target+i) = *(Str+i+beg);
*(target+i) = '\0';
}
else
{
closegraph();
cerr << "Memory allocation error in: char *mids(char *, int, int)."<<endl;
exit (-1);
}
return target;
}
wndow::wndow(int x,int y,int w,int h,int d,int bw,char *caption, int k)
: bevel(x,y,w,h,d,bw,7,k)
{
int caplen;
Caption = NULL;
cl_button = NULL;
cap_panl = NULL;
Client_Clr = 7;
Txt_Clr = 15;
cl_button = new button(x+d+1,y+d+1,9,9,d,7,1,TEXT,"",0);
if (!cl_button)
{
closegraph();
cerr << "Memory allocation error in window::window" << endl;
exit(-1);
}
cap_panl = new panel(x+3*d+11,y+d,w-4*d-11,11,d,OUT,7,0);
if (!cap_panl)
{
delete cl_button;
closegraph();
cerr << "Memory allocation error in window::window" << endl;
exit(-1);
}
caplen = strlen(caption)+2;
Caption = (char *)farcalloc(caplen,1);
if (!Caption)
{
delete cl_button;
delete cap_panl;
closegraph();
cerr << "Memory allocation error in wndow::wndow" << endl;
exit(-1);
}
strncpy(Caption,caption,caplen);
}
wndow::~wndow()
{
delete cl_button;
delete cap_panl;
farfree(Caption);
}
void wndow::show(void)
{
char temp[80];
int size,
i,
orig_color;
struct textsettingstype textinfo;
struct fillsettingstype orig_settings;
struct linesettingstype orig_line;
if (isShown)
return;
mouse.hide();
bevel::show();
cl_button->show();
cap_panl->show();
orig_color=getcolor();
getfillsettings(&orig_settings);
getlinesettings(&orig_line);
gettextsettings(&textinfo);
setlinestyle(0,1,1);
setcolor(Client_Clr);
setfillstyle(SOLID_FILL,Client_Clr);
bar(X+2*Depth+BWidth,Y+6*Depth+2*BWidth+10,X+Width-2*Depth-BWidth-1,Y+Height-2*Depth-BWidth-1);
setcolor((Color+8 > 15) ? 15 : Color+8);
for (i=0; i< Depth; ++i)
line(X+Depth+BWidth+(Depth-1-i),Y+4*Depth+BWidth+11+i,X+Width-Depth-BWidth-(Depth-1-i)-1,Y+4*Depth+BWidth+11+i);
setcolor(Color);
for (i=0; i< BWidth; ++i)
line(X+Depth+BWidth,Y+5*Depth+BWidth+11+i,X+Width-Depth-BWidth,Y+5*Depth+BWidth+11+i);
setcolor((Color >8) ? Color-8 : DARKGRAY);
for (i=0; i< Depth; ++i)
line(X+Depth+BWidth+i,Y+5*Depth+2*BWidth+11+i,X+Width-Depth-BWidth-i-1,Y+5*Depth+2*BWidth+11+i);
memset(temp,0,80);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(Txt_Clr);
strncpy(temp,Caption,79);
outtextxy(X+3*Depth+BWidth+13+(Width-8*Depth-2*BWidth-10)/2,Y+3*Depth+BWidth+6,temp);
settextjustify(textinfo.horiz,textinfo.vert);
setcolor(orig_color);
setfillstyle(orig_settings.pattern, orig_settings.color);
setlinestyle(orig_line.linestyle, orig_line.upattern, orig_line.thickness);
mouse.show();
return;
}
void wndow::moveto(int x, int y)
{
int reshow = 0;
if(isShown)
{
hide();
reshow = 1;
}
bevel::moveto(x,y);
cl_button->moveto(x+Depth+1,y+Depth+1);
cap_panl->moveto(x+3*Depth+10,y+Depth);
if (reshow)
show();
}
void wndow::resize(int w, int h)
{
int reshow = 0;
if(isShown)
{
hide();
reshow = 1;
}
bevel::resize(w,h);
cl_button->moveto(X+3*Depth+BWidth+1,Y+3*Depth+BWidth+1);
cap_panl->moveto(X+5*Depth+BWidth+10,Y+3*Depth+BWidth);
cap_panl->resize(w-4*Depth-10,10);
if (reshow)
show();
}
void wndow::setbkgclr(int c)
{
int reshow = 0;
if(isShown)
{
hide();
reshow = 1;
}
bevel::setbkgclr(c);
if (reshow)
show();
}
void wndow::setcliclr(int c)
{
int orig_color;
struct textsettingstype textinfo;
struct fillsettingstype orig_settings;
struct linesettingstype orig_line;
Client_Clr = c;
if(isShown)
{
orig_color=getcolor();
getfillsettings(&orig_settings);
setcolor(Client_Clr);
setfillstyle(SOLID_FILL,Client_Clr);
bar(X+2*Depth+BWidth,Y+6*Depth+2*BWidth+10,X+Width-2*Depth-BWidth,Y+Height-2*Depth-BWidth);
setcolor(orig_color);
setfillstyle(orig_settings.pattern, orig_settings.color);
}
}
void wndow::setcapclr(int c)
{
char temp[80];
int size,
orig_color;
struct textsettingstype textinfo;
cap_panl->setbkgclr(c);
if(isShown)
{
orig_color=getcolor();
gettextsettings(&textinfo);
cap_panl->show();
memset(temp,0,80);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(Txt_Clr);
strncpy(temp,Caption,79);
outtextxy(X+3*Depth+BWidth+13+(Width-8*Depth-2*BWidth-10)/2,Y+3*Depth+BWidth+6,temp);
settextjustify(textinfo.horiz,textinfo.vert);
setcolor(orig_color);
}
}
void wndow::settxtclr(int c)
{
char temp[200];
int size,
orig_color;
struct textsettingstype textinfo;
Txt_Clr = c;
if(isShown)
{
orig_color=getcolor();
gettextsettings(&textinfo);
cap_panl->show();
memset(temp,0,200);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(Txt_Clr);
strncpy(temp,Caption,199);
outtextxy(X+3*Depth+BWidth+13+(Width-8*Depth-2*BWidth-10)/2,Y+3*Depth+BWidth+6,temp);
settextjustify(textinfo.horiz,textinfo.vert);
setcolor(orig_color);
}
}
int wndow::clbtnhit(void)
{
return (cl_button->hit());
}
int wndow::capbarhit(void)
{
return(cap_panl->hit());
}
void wndow::clbtnprs(void)
{
cl_button->select();
}
void wndow::clbtnrls(void)
{
cl_button->show();
}
int wndow::clbtnpressed(void)
{
return(cl_button->is_selected());
}