/*************************************************************************** * 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 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<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); }