home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d2xx
/
d253
/
elements.lha
/
Elements
/
Source
/
elements.c
next >
Wrap
C/C++ Source or Header
|
1989-10-19
|
23KB
|
866 lines
/***************************************************************************
* elements.c - CAMM v2.0 Periodic Table of the Elements module. This set *
* 11-8-88 of routines draws and gives information about the periodic *
* Paul Miller table of the elements. (Info provided by Sargent-Welch) *
***************************************************************************/
#include "elements.h"
#include <libraries/dos.h>
struct Window *ewindow;
struct Screen *escreen;
struct TextFont *TextFont;
struct TextFont *ElementFont;
struct TextFont *CAMMFont;
struct TextAttr TextAttr = {(STRPTR)"CAMMtopaz.font", 8, 0, FPF_DISKFONT};
struct TextAttr ElementAttr = {(STRPTR)"element.font", 12, 0, FPF_DISKFONT};
struct TextAttr CAMMAttr = {(STRPTR)"CAMM.font", 5, 0, FPF_DISKFONT};
struct IntuiText TextText = {
1,0,JAM1,0,0,&TextAttr, (UBYTE *)"", NULL
};
struct IntuiText ElementText = {
1,0,JAM1,0,0,&ElementAttr, (UBYTE *)"", NULL
};
struct IntuiText CAMMText = {
1,0,JAM1,0,0,&CAMMAttr, (UBYTE *)"", NULL
};
char *columntext[] = {"IA","IIA","IIA","IVA","VA","VIA","VIIA","VIIIA",
"IB","IIB","IIIB","IVB","VB","VIB","VIIB","VIII"};
char *rowtext[] = {"I","II","III","IV","V","VI","VII"};
USHORT table_x[] = {0,1,2,3,4,5,6,8,10,11,12,13,14,15,16,17};
USHORT table_y[] = {0,1,3,3,3,3,3,3,3,3,1,1,1,1,1,0};
USHORT info_x[]={126,197,150,126,126,205,174,157,205,230,253,
157,254,205,286,246};
int tabledata[] = {249,106, 249,103, 265,103,
-298,103, 315,103, 315,106, -1};
int CubicFCData[] = {0,0, 26,0, 38,12, 38,35, 12,35, 0,23, 0,0,
12,12, 38,12, -12,12, 12,35, -25,23, 26,23, 26,24, 25,24, -1};
int CubicBCData[] = {0,0, 26,0, 26,23, 0,23, 0,0, 12,12, 12,35, 0,23,
-12,12, 38,12, 38,35, 12,35, -26,23, 38,35, -26,0, 38,12,
-38,35, 0,0, -26,0, 12,35, -38,12, 0,23, -12,12, 20,23, -1};
int CubicData[] = {0,0, 26,0, 38,12, 38,35, 12,35, 0,23, 0,0,
12,12, 38,12, -12,12, 12,35, -1};
int HexData[] = {0,10, 19,0, 38,10, 38,31, 19,41, 0,31, 0,10, 38,31,
-19,0, 19,41, -38,10, 0,31, -1};
int RhombData[] = {0,35, 5,12, 13,4, 8,27, 0,35, 25,31, 30,8, 5,12,
-13,4, 38,0, 33,23, 8,27, -33,23, 25,31, -38,0, 30,8, -1};
int TetraData[] = {11,39, 11,5, 22,5, 22,39, 11,39, -11,5, 18,0, 29,0, 22,5,
-29,0, 29,34, 22,39, -1};
int OrthoData[] = {0,41, 0,11, 27,11, 27,41, 0,41, -27,11, 38,0, 11,0, 0,11,
-38,0, 38,30, 27,41, -1};
int MonoData[] = {0,20, 10,0, 28,0, 38,20, 28,40, 10,40, 0,20, -1};
int *structuredata[] = {&CubicFCData[0], &CubicBCData[0], &CubicData[0],
&HexData[0], &RhombData[0], &TetraData[0], &OrthoData[0], &MonoData[0]};
char *structuretext[] = {"Cubic, FC", "Cubic, BC", "Cubic", "Hexagonal",
"Rhombohedral","Tetragonal","Orthorhombic","Monoclinic", "Unknown"};
char *elem_type[] = {"SOLID","LIQUID","GAS","SYNTHETIC"};
char *infotext[] = {"Atomic Weight:","Electron Configuration:",
"Oxidation States:","Boiling Point:","Melting Point:",
"Density at 300K (g/cm3):","Covalent Radius (A):","Atomic Radius (A):",
"Atomic Volume (cm3/mol):","First Ionization Potential:",
"Specific Heat Capacity (J/gK):","Electronegativity:",
"Heat of Vaporization (kJ/mol):","Heat of Fusion (kJ/mol):",
"Electrical Conductivity (106/Ocm):","Thermal Conductivity (W/cmK):"};
UWORD color_map[4] = {0x0020, 0x00A0, 0x007F, 0x0E44};
UWORD shadow_map[8] = {0x0333, 0x00A0, 0x000F, 0x0E00,
0x0000, 0x0000, 0x0000, 0x0000};
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct DiskfontBase *DiskfontBase;
extern struct Menu infomenu_strip[];
struct Element element[ELEMENTS];
struct Info info[ELEMENTS];
long Xoff = EOFF_X, Yoff = EOFF_Y;
BOOL shadow = FALSE;
void elements(), handle_infomenu(), draw_table(), outline(), PrintBText();
void superscript(), convert_superscript(), draw_text(), draw_box();
void draw_data(), draw_infotext(), draw_info(), open_libraries(), abort();
void highlight_box();
main(argc,argv)
int argc;
char *argv[];
{
struct NewScreen ns;
if (argc > 1)
shadow = TRUE;
open_libraries();
if (!load_elements())
abort("Cannot find `Elements.DAT' file.");
if (!load_info())
abort("Cannot find `Info.DAT' file.");
setmem(&ns, sizeof(ns), 0L);
ns.LeftEdge = 0;
ns.TopEdge = 0;
ns.Width = SCREEN_WIDTH;
ns.Height = SCREEN_HEIGHT;
ns.Depth = DEPTH;
ns.DetailPen = 0;
ns.BlockPen = 1;
ns.ViewModes = HIRES | LACE;
ns.Type = CUSTOMSCREEN;
ns.DefaultTitle = (UBYTE *)SCREEN_TITLE;
if (shadow)
ns.Depth = SHADOWDEPTH;
if (!(escreen = (struct Screen *)OpenScreen(&ns)))
abort("Cannot open main screen.");
if (!shadow)
LoadRGB4(&escreen->ViewPort, color_map, 4L);
else
LoadRGB4(&escreen->ViewPort, shadow_map, 8L);
elements(escreen);
}
void elements(screen)
struct Screen *screen;
{
struct NewWindow nw;
struct Window *w;
struct IntuiMessage *message;
ULONG class;
USHORT code;
int mx, my, info;
setmem(&nw, sizeof(nw), 0L);
nw.LeftEdge = 0;
nw.TopEdge = EWIN_TOP;
nw.Width = EWIN_WIDTH;
nw.Height = EWIN_HEIGHT;
nw.DetailPen = -1;
nw.BlockPen = -1;
nw.IDCMPFlags = MOUSEBUTTONS | MENUPICK;
nw.Flags = WINDOWDEPTH | GIMMEZEROZERO | SMART_REFRESH | REPORTMOUSE |
ACTIVATE;
nw.Title = (UBYTE *)E_TITLE;
nw.Screen = screen;
nw.Type = CUSTOMSCREEN;
if (!(ewindow = (struct Window *)OpenWindow(&nw)))
abort("Cannot open elements window.");
SetMenuStrip(ewindow, infomenu_strip);
if (shadow)
draw_table(ewindow, shadow);
draw_table(ewindow, FALSE);
while(1)
{
Wait(1L<<ewindow->UserPort->mp_SigBit);
while(message = (struct IntuiMessage *)GetMsg(ewindow->UserPort))
{
class = message->Class;
code = message->Code;
mx = message->MouseX;
my = message->MouseY;
w = message->IDCMPWindow;
ReplyMsg(message);
switch (class)
{
case CLOSEWINDOW:
close_window(w);
case MOUSEBUTTONS:
switch (code)
{
case SELECTDOWN:
if (info = get_element(mx, my))
info_window(info-1);
break;
}
break;
case MENUPICK:
ClearMenuStrip(w);
handle_infomenu(code);
SetMenuStrip(w, infomenu_strip);
break;
}
}
}
}
void handle_infomenu(menu)
int menu;
{
if (menu != MENUNULL)
{
switch (ITEMNUM(menu))
{
case 0:
display_subpart();
break;
case 1:
display_radioiso();
break;
case 2:
display_ionichar();
break;
case 3:
display_notes();
break;
case 4:
display_info();
break;
case 5:
close_all();
abort("");
break;
}
}
}
get_element(x, y)
int x, y;
{
register int i;
if (y <= EWIN_TOP)
return(NULL);
y -= EWIN_TOP;
if (y > (EOFF_Y + 7 * BOX_H))
y -= (.25 * BOX_H);
x = (x - EOFF_X - 4) / BOX_W;
y = (y - EOFF_Y) / BOX_H;
for (i = 0; i < ELEMENTS; i++)
if ((x == element[i].column) && (y == element[i].row))
{
highlight_box(i);
return(i+1);
}
return(NULL);
}
void draw_table(window, shad)
struct Window *window;
BOOL shad;
{
struct RastPort *rp = window->RPort;
long x, y, i, num;
char number[3];
if (!shad)
{
SetAPen(rp, (long)BOX_COLOR);
Xoff = EOFF_X;
Yoff = EOFF_Y;
}
else
{
SetAPen(rp, (long)SHADOWBLACK);
ElementText.FrontPen = SHADOWBLACK;
Xoff = EOFF_SHADX;
Yoff = EOFF_SHADY;
}
for (i = 0; i < ELEMENTS; i++)
{
num = element[i].number;
x = Xoff + (element[i].column * BOX_W);
y = Yoff + (element[i].row * BOX_H);
if ((num>57 && num<72) || (num>89 && num<104))
y += (.25 * BOX_H);
draw_box(rp, x, y, BOX_W, BOX_H);
sprintf(number, "%d", element[i].number);
superscript(number);
if (!shad)
ElementText.FrontPen = BOX_COLOR;
else
ElementText.FrontPen = SHADOWBLACK;
ElementText.IText = (UBYTE *)number;
PrintIText(rp, &ElementText, (long)(x+ENUM_X), (long)(y+ENUM_Y));
if (num > 103) x -= 6;
if (!shad)
ElementText.FrontPen = element[i].type;
ElementText.IText = (UBYTE *)element[i].symbol;
if (element[i].type == SYNTHETIC_E)
{
if (!shad)
outline(rp, &ElementText, x+ESYM_X-2L, y+ESYM_Y-2L, BOX_COLOR);
else
outline(rp, &ElementText, x+ESYM_X-2L, y+ESYM_Y-2L, SHADOWBLACK);
}
else
PrintIText(rp, &ElementText, (long)(x+ESYM_X), (long)(y+ESYM_Y));
}
Move(rp, (long)(Xoff+(12*BOX_W)-1), (long)(Yoff+(1*BOX_H)));
Draw(rp, (long)(Xoff+(12*BOX_W)-1), (long)(Yoff+(2*BOX_H)-1));
Draw(rp, (long)(Xoff+(13*BOX_W)-1), (long)(Yoff+(2*BOX_H)-1));
Draw(rp, (long)(Xoff+(13*BOX_W)-1), (long)(Yoff+(3*BOX_H)-1));
Draw(rp, (long)(Xoff+(14*BOX_W)-1), (long)(Yoff+(3*BOX_H)-1));
Draw(rp, (long)(Xoff+(14*BOX_W)-1), (long)(Yoff+(4*BOX_H)-1));
Draw(rp, (long)(Xoff+(15*BOX_W)-1), (long)(Yoff+(4*BOX_H)-1));
Draw(rp, (long)(Xoff+(15*BOX_W)-1), (long)(Yoff+(5*BOX_H)-1));
Draw(rp, (long)(Xoff+(16*BOX_W)-1), (long)(Yoff+(5*BOX_H)-1));
Draw(rp, (long)(Xoff+(16*BOX_W)-1), (long)(Yoff+(6*BOX_H)-1));
draw_text(window, shad);
}
void outline(rp, text, x, y, color)
struct RastPort *rp;
struct IntuiText *text;
long x, y, color;
{
long xx, yy;
text->FrontPen = color;
for (yy = y-1; yy <= y+1; yy++)
for (xx = x-1; xx <= x+1; xx++)
PrintIText(rp, text, xx, yy);
text->FrontPen = BACKGROUND;
PrintIText(rp, text, x, y);
}
void superscript(text)
char text[];
{
register USHORT i;
for (i = 0; text[i] != '\0'; i++)
text[i] += 0x50;
}
void convert_super(in, out)
char in[], out[];
{
register USHORT i, n;
for (i = 0, n = 0; in[i] != '\0'; i++)
{
if (in[i] == '+')
out[n] = in[++i] + 0x50;
else
out[n] = in[i];
n++;
}
out[n] = '\0';
}
void draw_text(w, shad)
struct Window *w;
BOOL shad;
{
struct RastPort *rp = w->RPort;
long i, x, y;
if (!shad)
CAMMText.FrontPen = BOX_COLOR;
else
CAMMText.FrontPen = SHADOWBLACK;
CAMMText.IText = (UBYTE *)"GROUP";
PrintIText(rp, &CAMMText, (long)(Xoff+3), (long)(Yoff-14));
for (i = 0; i < 16; i++)
{
CAMMText.IText = (UBYTE *)columntext[i];
x = Xoff+(table_x[i]*BOX_W)+2;
x += (.5 * (BOX_W - IntuiTextLength(&CAMMText)));
y = Yoff + (table_y[i]*BOX_H) - 7;
PrintIText(rp, &CAMMText, x, y);
}
for (i = 0; i < 7; i++)
{
CAMMText.IText = (UBYTE *)rowtext[i];
x = (Xoff - IntuiTextLength(&CAMMText))/2;
y = Yoff+(i*BOX_H)+ROWNUM_Y;
PrintIText(rp, &CAMMText, x, y);
}
draw_data(rp, &tabledata[0], Xoff, Yoff);
}
void draw_box(rp, x, y, width, height)
struct RastPort *rp;
long x, y, width, height;
{
Move(rp, x, y);
Draw(rp, x+width, y);
Draw(rp, x+width, y+height);
Draw(rp, x, y+height);
Draw(rp, x, y);
}
void draw_data(rp, data, x, y)
struct RastPort *rp;
int data[];
long x, y;
{
long i;
Move(rp, (long)(data[0]+x), (long)(data[1]+y));
for (i = 2; data[i] != -1; i += 2)
{
if (data[i] < 0)
Move(rp, (long)((-data[i])+x), (long)(data[i+1]+y));
else
Draw(rp, (long)(data[i]+x), (long)(data[i+1]+y));
}
}
info_window(num)
int num;
{
struct Window *iwindow;
LONG pro, neu;
char title[80];
pro = element[num].number;
neu = (long)info[num].AWeight;
if (neu < 0)
neu = -neu;
neu -= pro;
sprintf(title,"%s: %s (P:%d N:%d E:%d)", element[num].symbol,
element[num].name, pro, neu, pro);
pro = Xoff + (element[num].column * BOX_W) - (.5 * IWIN_WIDTH);
neu = Yoff + (element[num].row * BOX_H) - (.5 * IWIN_HEIGHT);
if (pro < 0) pro = 0;
if (pro > SCREEN_WIDTH-IWIN_WIDTH) pro = SCREEN_WIDTH-IWIN_WIDTH;
if (neu < EWIN_TOP) neu = EWIN_TOP;
if (neu > SCREEN_HEIGHT-IWIN_HEIGHT) neu = SCREEN_HEIGHT-IWIN_HEIGHT;
iwindow = get_window(pro,neu,IWIN_WIDTH,IWIN_HEIGHT,title);
if (iwindow == NULL)
return(NULL);
draw_infotext(iwindow);
draw_info(iwindow, num);
return(TRUE);
}
void draw_infotext(window)
struct Window *window;
{
struct RastPort *rp = window->RPort;
register USHORT i;
TextText.FrontPen = GREENTEXT;
for (i = 0; i < INFOTEXT; i++)
{
TextText.IText = (UBYTE *)infotext[i];
PrintIText(rp, &TextText, (long)INFOTEXTX, (long)(((i+1)*10)+3));
}
TextText.IText = (UBYTE *)"Stable Form:";
PrintIText(rp, &TextText, 214L, 13L);
TextText.IText = (UBYTE *)"Crystal";
PrintIText(rp, &TextText, 312L, 63L);
TextText.IText = (UBYTE *)"Structure:";
PrintIText(rp, &TextText, 304L, 73L);
}
void draw_info(window, num)
struct Window *window;
int num;
{
struct RastPort *rp = window->RPort;
register USHORT i;
char info_t[INFOTEXT][25];
char floattext[25], modtext[25];
TextText.FrontPen = REDTEXT;
TextText.IText = (UBYTE *)elem_type[element[num].type-1];
PrintIText(rp, &TextText, 318L, 13L);
if (info[num].OxiStates[0] == '*')
info[num].OxiStates[0] = 0xB1;
TextText.IText = (UBYTE *)structuretext[info[num].Structure];
i = 343 - (.5 * IntuiTextLength(&TextText));
PrintIText(rp, &TextText, (long)i, 83L);
if (info[num].Structure < 8)
draw_data(rp, structuredata[info[num].Structure], 324L, 93L);
sprintf(info_t[0], "%f", info[num].AWeight);
convert_super(info[num].Config, info_t[1]);
sprintf(info_t[2], "%s", info[num].OxiStates);
sprintf(info_t[5], "%f", info[num].Density);
sprintf(info_t[6], "%f", info[num].CRadius);
sprintf(info_t[7], "%f", info[num].ARadius);
sprintf(info_t[8], "%f", info[num].AVolume);
sprintf(info_t[9], "%f", info[num].IonPot);
sprintf(info_t[10], "%f", info[num].SpecHeat);
sprintf(info_t[11], "%f", info[num].Electroneg);
sprintf(info_t[12], "%f", info[num].HeatVap);
sprintf(info_t[13], "%f", info[num].HeatFus);
convert_super(info[num].ElecCond, info_t[14]);
sprintf(info_t[15], "%f", info[num].ThermalCond);
shfloat(info_t[0]);
for (i = 5; i < 14; i++)
shfloat(info_t[i]);
shfloat(info_t[15]);
if (info[num].AWeight < 0)
{
info_t[0][0] = '(';
info_t[0][4] = ')';
info_t[0][5] = '\0';
}
if (info[num].BoilingP == 0.0)
sprintf(info_t[3], "-");
else
{
sprintf(floattext, "%.3f", info[num].BoilingP);
sprintf(modtext, "%.3f", (info[num].BoilingP-273.0));
shfloat(floattext);
shfloat(modtext);
sprintf(info_t[3], "%s°K (%s°C)", floattext,modtext);
}
if (info[num].MeltingP == 0.0)
sprintf(info_t[4], "-");
else
{
sprintf(floattext, "%.3f", info[num].MeltingP);
sprintf(modtext, "%.3f", (info[num].MeltingP-273.0));
shfloat(floattext);
shfloat(modtext);
sprintf(info_t[4], "%s°K (%s°C)", floattext,modtext);
}
for (i = 1; info_t[14][i] != '\0'; i++)
if (info_t[14][i] == '-')
info_t[14][i] = 0x8E;
for (i = 0; i < INFOTEXT; i++)
{
if (i == 2)
{
PrintBText(rp, info_t[i], (long)info_x[i], (long)(((i+1)*10)+3));
continue;
}
TextText.IText = (UBYTE *)info_t[i];
PrintIText(rp, &TextText, (long)info_x[i], (long)(((i+1)*10)+3));
}
}
void PrintBText(rp, text, x, y)
struct RastPort *rp;
char *text;
long x, y;
{
register USHORT i;
char letter[2];
for (i = 0; text[i] != '\0'; i++)
{
if (text[i] == 'B')
{
sprintf(letter,"%c",text[++i]);
TextText.IText = (UBYTE *)letter;
PrintIText(rp, &TextText, x, y);
PrintIText(rp, &TextText, x+1, y);
}
else
{
sprintf(letter,"%c",text[i]);
TextText.IText = (UBYTE *)letter;
PrintIText(rp, &TextText, x, y);
}
x += 8;
}
}
shfloat(text)
char *text;
{
register USHORT i;
USHORT decimal = NULL;
if (text[0] == '0' && text[1] == '\0')
{
text[0] = '-';
return(NULL);
}
for (i = 0; text[i] != '\0'; i++)
{
if (text[i] == '.')
decimal = 1;
}
if (!decimal)
return(NULL);
while (--i > 0)
{
if ((text[i] != '0') || (text[i-1] == '.'))
break;
text[i] = '\0';
}
if (text[0] == '0' && text[3] == '\0')
{
text[0] = '-';
text[1] = '\0';
}
}
load_info()
{
register LONG fd;
register USHORT i;
fd = (LONG)Open(INFO_FILE, MODE_OLDFILE);
if (!fd)
return(NULL);
for (i = 0; i < ELEMENTS; i++)
{
Read(fd, &info[i].Structure, 2L);
Read(fd, &info[i].AWeight, 4L);
Read(fd, &info[i].Config, 25L);
Read(fd, &info[i].OxiStates, 11L);
Read(fd, &info[i].BoilingP, 4L);
Read(fd, &info[i].MeltingP, 4L);
Read(fd, &info[i].Density, 4L);
Read(fd, &info[i].CRadius, 4L);
Read(fd, &info[i].ARadius, 4L);
Read(fd, &info[i].AVolume, 4L);
Read(fd, &info[i].IonPot, 4L);
Read(fd, &info[i].SpecHeat, 4L);
Read(fd, &info[i].Electroneg, 4L);
Read(fd, &info[i].HeatVap, 4L);
Read(fd, &info[i].HeatFus, 4L);
Read(fd, &info[i].ElecCond, 13L);
Read(fd, &info[i].ThermalCond, 4L);
}
Close(fd);
return(TRUE);
}
void open_libraries()
{
if ((DiskfontBase = (struct DiskfontBase *)
OpenLibrary("diskfont.library",0L)) == NULL)
abort("Couldn't open diskfont.library!");
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",0L)) == NULL)
abort("Could't open intuition.library!");
if ((GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library",0L)) == NULL)
abort("Couldn't open graphics.library!");
if ((TextFont = (struct TextFont *)OpenDiskFont(&TextAttr)) == NULL)
abort("Couldn't find CAMMtopaz.font.");
if ((ElementFont = (struct TextFont *)OpenDiskFont(&ElementAttr)) == NULL)
abort("Couldn't find element.font.");
if ((CAMMFont = (struct TextFont *)OpenDiskFont(&CAMMAttr)) == NULL)
abort("Couldn't find CAMM.font.");
}
void abort(txt)
char *txt;
{
puts(txt);
if (infomenu_strip) ClearMenuStrip(ewindow);
if (ewindow) CloseWindow(ewindow);
if (escreen) CloseScreen(escreen);
if (TextFont) CloseFont(TextFont);
if (CAMMFont) CloseFont(CAMMFont);
if (ElementFont) CloseFont(ElementFont);
if (GfxBase) CloseLibrary(GfxBase);
if (IntuitionBase) CloseLibrary(IntuitionBase);
if (DiskfontBase) CloseLibrary(DiskfontBase);
exit(NULL);
}
load_elements()
{
register LONG fd;
USHORT num, col, row;
char symbol[4], name[13], type[7];
register USHORT i;
fd = (LONG)Open(ELEMENTS_FILE, MODE_OLDFILE);
if (!fd)
abort("Cannot find elements file.");
for (i = 0; i < ELEMENTS; i++)
{
Read(fd, &num, 2L);
Read(fd, &col, 2L);
Read(fd, &row, 2L);
Read(fd, &symbol, 4L);
Read(fd, &name, 13L);
Read(fd, &type, 7L);
element[i].number = num;
element[i].column = col-1;
element[i].row = row-1;
switch(type[1])
{
case 'O':
element[i].type = SOLID_E;
break;
case 'I':
element[i].type = LIQUID_E;
break;
case 'A':
element[i].type = GAS_E;
break;
case 'Y':
element[i].type = SYNTHETIC_E;
break;
}
strcpy(element[i].symbol, symbol);
strcpy(element[i].name, name);
}
Close(fd);
*(infotext[5]+21) += 0x50;
*(infotext[6]+17) = 0xC2;
*(infotext[7]+15) = 0xC2;
*(infotext[8]+17) += 0x50;
*(infotext[14]+27) += 0x50;
*(infotext[14]+29) = 0x95;
return(TRUE);
}
struct Window *get_window(left,top,width,height,title)
int left, top, width, height;
UBYTE *title;
{
struct NewWindow nw;
struct Window *window;
UBYTE *text;
if (left+width > SCREEN_WIDTH)
left = SCREEN_WIDTH-width-1;
if (top+height > SCREEN_HEIGHT)
top = SCREEN_HEIGHT-height-1;
if (left < 0) left = 0;
if (top < 0) top = EWIN_TOP;
text = (UBYTE *)AllocMem(80L, MEMF_PUBLIC|MEMF_CLEAR);
if (!text) return(NULL);
strcpy(text, title);
setmem(&nw, sizeof(nw), 0L);
nw.TopEdge = top;
nw.LeftEdge = left;
nw.Width = width;
nw.Height = height;
nw.DetailPen = -1;
nw.BlockPen = -1;
nw.IDCMPFlags = NULL;
nw.Flags = WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE|SMART_REFRESH|ACTIVATE;
nw.Title = text;
nw.Screen = escreen;
nw.Type = CUSTOMSCREEN;
window = (struct Window *)OpenWindow(&nw);
if (window == NULL)
{
if (text) FreeMem(text, 80);
return(NULL);
}
window->UserPort = ewindow->UserPort;
ModifyIDCMP(window, CLOSEWINDOW | MENUPICK);
SetMenuStrip(window, infomenu_strip);
window->UserData = text;
return(window);
}
close_window(window)
struct Window *window;
{
struct IntuiMessage *message;
if (window == NULL)
return(NULL);
while (message = (struct IntuiMessage *)GetMsg(window->UserPort))
{
if (message->IDCMPWindow == window)
Remove(&message->ExecMessage.mn_Node);
ReplyMsg(message);
}
if (window->MenuStrip)
ClearMenuStrip(window);
window->UserPort = NULL;
ModifyIDCMP(window, NULL);
if (window->UserData)
{
FreeMem(window->UserData, 80L);
window->Title = NULL;
window->UserData = NULL;
}
CloseWindow(window);
return(TRUE);
}
close_all()
{
struct Window *window = ewindow;
while (window = ewindow->NextWindow)
{
ewindow->NextWindow = window->NextWindow;
close_window(window);
}
ewindow->NextWindow = NULL;
return(NULL);
}
void highlight_box(num)
int num;
{
register int x, y;
struct RastPort *rp = ewindow->RPort;
x = EOFF_X + (element[num].column * BOX_W);
y = EOFF_Y + (element[num].row * BOX_H);
if (y > (Yoff + 6*BOX_H))
y += .25 * BOX_H;
SetAPen(rp, GREENTEXT);
SetDrMd(rp, COMPLEMENT);
RectFill(rp, x, y, x+BOX_W, y+BOX_H);
Delay(2);
RectFill(rp, x, y, x+BOX_W, y+BOX_H);
SetDrMd(rp, JAM1);
}