/****************************************************************************/
/*   Program: Graph It II	(The C Program)									*/
/*   SubModule:	window.c  1-20-87											*/
/*   CopyRight By Flynn D. Fishman  January 1987							*/
/*	Feel Free to copy and alter this source									*/
/****************************************************************************/
/*	This module contains some of the more "primitive" graphic routines such
	 as Line, DrawImages, DrawWindow										*/

#include "graph.h"
#define MAXMENU 2
struct Menu menu[MAXMENU];

/* Image data structures (Icons)	*/
USHORT Move_Icon[] =
	{
	0xffff, 0x8001, 0x8001, 0x8181, 0x8d81, 0x8db1, 0x8db1, 0xedb5, 0xeffd,
	0xbffd, 0x9ffd, 0x8ff1, 0x8001, 0x8001, 0xffff, 
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- 22-2 2--- ---1 */
	0x8001,		/* 1--- 22-2 2-22 ---1 */
	0x8001,		/* 1--- 22-2 2-22 ---1 */
	0x8001,		/* 122- 22-2 2-22 -2-1 */
	0x8001,		/* 122- 2222 2222 22-1 */
	0x8001,		/* 1-22 2222 2222 22-1 */
	0x8001,		/* 1--2 2222 2222 22-1 */
	0x8001,		/* 1--- 2222 2222 2--1 */
	0x9ffd,		/* 1--3 3333 3333 33-1 */
	0x9ffd,		/* 1--3 3333 3333 33-1 */
	0xffff		/* 1111 1111 1111 1111 */
	};

USHORT Zoom_Icon[] =
	{
	0xffff, 0x8001,  0x83c1,  0x8661,  0x8c31,  0x8c31,  0x8661, 
	0x83c1, 0x8181,  0x8181,  0x8181,  0x8181,  0x8181,  0x8001,  0xffff, 
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- --33 33-- ---1 */
	0x8001,		/* 1--- -332 233- ---1 */
	0x8001,		/* 1--- 33-- 2233 ---1 */
	0x8001,		/* 1--- 33-- -233 ---1 */
	0x8001,		/* 1--- -33- -33- ---1 */
	0x8001,		/* 1--- --33 33-- ---1 */
	0x8001,		/* 1--- ---3 3--- ---1 */
	0x8001,		/* 1--- ---3 3--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---3 3--- ---1 */
	0x8001,		/* 1--- ---3 3--- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xffff,		/* 1111 1111 1111 1111 */
	};

USHORT Command_Icon[] =
	{
	0xffff, 0x8001, 0x8001, 0xe0c1, 0xe0c1, 0xb19f, 0x9b1f, 0x8e01, 
	0x8c1f, 0x8c1f, 0x8c01, 0x8c01, 0x8001, 0x8001, 0xffff, 
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 122- ---- 22-- ---1 */
	0x8001,		/* 122- ---- 22-- ---1 */
	0x8001,		/* 1-22 ---2 2--2 2221 */
	0x8001,		/* 1--2 2-22 ---2 2221 */
	0x8001,		/* 1--- 222- ---- ---1 */
	0x8001,		/* 1--- 22-- ---2 2221 */
	0x8001,		/* 1--- 22-- ---2 2221 */
	0x8001,		/* 1--- 22-- ---- ---1 */
	0x8001,		/* 1--- 22-- ---- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xffff		/* 1111 1111 1111 1111 */
	};

USHORT Help_Icon[] =
	{
	0xffff, 0x8001, 0x83e1, 0x87e1, 0x8c71, 0x80e1, 0x80e1, 0x81c1, 
	0x81c1, 0x8001, 0x8081, 0x81c1, 0x8081, 0x8001, 0xffff, 
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- --22 222- ---1 */
	0x8001,		/* 1--- -222 2222 ---1 */
	0x8001,		/* 1--- 22-- -222 ---1 */
	0x8001,		/* 1--- ---- 222- ---1 */
	0x8001,		/* 1--- ---- 222- ---1 */
	0x8001,		/* 1--- ---2 22-- ---1 */
	0x8001,		/* 1--- ---2 22-- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- ---- 2--- ---1 */
	0x8001,		/* 1--- ---2 22-- ---1 */
	0x8001,		/* 1--- ---- 2--- ---1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xffff,		/* 1111 1111 1111 1111 */
	};

USHORT Hidden_Icon[] =
	{
	0xffff, 0x8001, 0x8001, 0x8001, 0x83cf, 0x8301, 0x8301, 0x8301, 
	0x8001, 0x8301, 0x8301, 0x8301, 0x83ff, 0x8001, 0xffff, 
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xbff1,		/* 1-22 2222 2222 ---1 */
	0xb031,		/* 1-22 ---- --22 ---1 */
	0xb03f,		/* 1-22 --11 1122 3331 */
	0xb031,		/* 1-22 --11 --22 ---1 */
	0xb031,		/* 1-22 --11 --22 ---1 */
	0xb031,		/* 1-22 --11 --22 ---1 */
	0xbff1,		/* 1-22 2222 2222 ---1 */
	0x8301,		/* 1--- --33 ---- ---1 */
	0x8301,		/* 1--- --33 ---- ---1 */
	0x8301,		/* 1--- --33 ---- ---1 */
	0x83ff,		/* 1--- --33 3333 3331 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xffff,		/* 1111 1111 1111 1111 */
	};

USHORT Home_Icon[] =
	{
	0xffff, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xffff, 0x8181,
	0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xffff,
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1222 2222 2222 2221 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0x8001,		/* 1--- ---2 2--- ---1 */
	0xffff		/* 1111 1111 1111 1111 */
	};

USHORT Quit_Icon[] =
	{
	0xffff, 0x8001, 0x83c1, 0x8661, 0x8c31, 0x8c31, 0x9819, 0x9819, 0x9999,
	0x9db9, 0x8cf1, 0x8679, 0x83cd, 0x8001, 0xffff,
	0xffff,		/* 1111 1111 1111 1111 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0x8001,		/* 1--- --22 22-- ---1 */
	0x8001,		/* 1--- -22- -22- ---1 */
	0x8001,		/* 1--- 22-- --22 ---1 */
	0x8001,		/* 1--- 22-- --22 ---1 */
	0x8001,		/* 1--2 2--- ---2 2--1 */
	0x8001,		/* 1--2 2--- ---2 2--1 */
	0x8001,		/* 1--2 2--2 2--2 2--1 */
	0x8001,		/* 1--- 22-2 2-22 ---1 */
	0x8001,		/* 1--- 22-- 2222 ---1 */
	0x8001,		/* 1--- -22- -222 2--1 */
	0x8001,		/* 1--- --22 22-- 22-1 */
	0x8001,		/* 1--- ---- ---- ---1 */
	0xffff		/* 1111 1111 1111 1111 */
	};

#define BALLHEIGHT  5
#define BALLWIDTH	6

struct Image Icons =
	{
	0,0,			/* left Top					*/
	16, ICONY, 2,	/* width hieght, depth		*/
	&Move_Icon[0],	/* image date				*/
	0x3, 0x0,		/* PlanePick, PlaneOnOff	*/
	NULL,			/* Next Image				*/
	};

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct TextAttr MyFont =
  {
   "topaz.font",              /* Font Name        */
   TOPAZ_SIXTY,               /* Font Height      */
   FS_NORMAL,                 /* Style            */
   FPF_ROMFONT,               /* Preferences      */
  };

struct NewWindow NewWindow =
	{
	0l,
	0l,
	XSIZE,
	YSIZE,
	0l,
	1l,
	CLOSEWINDOW | MOUSEMOVE | MOUSEBUTTONS | MENUPICK
	| NEWSIZE | INACTIVEWINDOW | SIZEVERIFY,
	WINDOWCLOSE | SMART_REFRESH | ACTIVATE | WINDOWDRAG
	| WINDOWDEPTH | WINDOWSIZING | REPORTMOUSE,
	NULL,
	NULL,
	"Graph It II  Beta 1.0  By Flynn D. Fishman", 
	NULL,
	NULL,
	100l, 35l,
	NULL, NULL,
	WBENCHSCREEN,
	};

openstuff()
	{
	struct Window *Window;

	IntuitionBase = (struct IntuitionBase *)
							OpenLibrary("intuition.library", INTUITION_REV);
	if( IntuitionBase == NULL )
		{
		printf("Error: opening Intuition\n");
		exit(FALSE); 
		}

	GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",GRAPHICS_REV);
	if( GfxBase == NULL )
		{
		printf("Error: opening graphics\n");
		exit(FALSE);
		}

	if(( Window = (struct Window *)OpenWindow(&NewWindow) ) == NULL)
		{
		printf("Error: opening window\n");
		exit(FALSE);
		}

	InitMenu();
	SetMenuStrip( Window, &menu[0] );

	return(Window);
	}

closestuff(Window)
struct Window *Window;
	{
	if (Window != NULL)
		{
		CloseWindow( Window );
		ClearMenuStrip( Window );
		}
	}

DrawWindow(Window, parameters)
struct Window *Window;
struct Graph_Parameters *parameters;
	{
	long int minx, miny, maxx, maxy;
	long int y;
	char line[80];

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	ClearWindow(Window);

/* Place the data		*/
	SetAPen(Window->RPort, 3);

	Move(Window->RPort, minx, maxy + 9);
	sprintf(line,"%2.2f", parameters->xstart);
	Text(Window->RPort, line, strlen(line) );

	Move(Window->RPort, maxx - XEXPANDX + 3, maxy + 9);
	sprintf(line,"%2.2f", parameters->xend);
	Text(Window->RPort, line, strlen(line) );

	Move(Window->RPort, maxx, maxy - YEXPANDY + 9);
	sprintf(line,"%3.0f", parameters->ystart);
	Text(Window->RPort, line, strlen(line) );

	Move(Window->RPort, maxx, miny + 9);
	sprintf(line,"%3.0f", parameters->yend);
	Text(Window->RPort, line, strlen(line) );

/* Draw the Graph rectangle area	*/
	DrawRectangle(Window, 1, minx, miny, maxx, maxy);
/* Draw the X-Expand area			*/
	DrawRectangle(Window, 3, minx + XEXPANDX, maxy + 2,
							 maxx - XEXPANDX, maxy + XEXPANDY);
/* Draw the Y-Expand area			*/
	DrawRectangle(Window, 3, maxx + 2, miny + YEXPANDY,
							 maxx + YEXPANDX, maxy - YEXPANDY);
/* Draw the Icon Area				*/
	for (y = miny + YEXPANDY; y < maxy - YEXPANDX - ICONY; y += ICONY + 2)
		DrawRectangle(Window, 3, maxx + YEXPANDX + 2, y,
								 maxx + XBORDER  - 1, y + ICONY); 

	DrawImages(Window, maxx + YEXPANDX + 2, miny + YEXPANDY);
	DrawButton(Window, minx + XEXPANDX + 1, maxy + 3);
	DrawButton(Window, maxx + 3, maxy - YEXPANDY - BALLHEIGHT - 1 );
	}

ClearWindow(Window)
struct Window *Window;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight;
    maxy = Window->Height - Window->BorderBottom;

	SetAPen(Window->RPort, 0l);
	SetOPen(Window->RPort, 0l);
	SetDrMd(Window->RPort, JAM2);
	RectFill(Window->RPort, minx, miny, maxx, maxy);
	}


DrawRectangle(Window, colour, x1, y1, x2, y2)
struct Window *Window;
long int colour, x1, y1, x2, y2;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight;
    maxy = Window->Height - Window->BorderBottom;

	x1 = (x1 < minx) ? minx : x1;
	y1 = (y1 < miny) ? miny : y1;
	x2 = (x2 > maxx) ? maxx : x2;
	y2 = (y2 > maxy) ? maxy : y2;

	if (x1 > x2) return(FALSE);
	if (y1 > y2) return(FALSE);

	SetDrMd(Window->RPort, JAM2);
	SetOPen(Window->RPort, colour);
	SetAPen(Window->RPort, 0l);
	RectFill(Window->RPort, x1, y1, x2, y2);
	}

DrawImages(Window, x, y)
struct Window *Window;
long int x, y;
	{
	USHORT *icon;
	int loop;

	Icons.Height = ICONY;
	Icons.Width  = ICONX;
	Icons.PlanePick = 0x3;
	Icons.PlaneOnOff = 0x0;

	icon = AllocMem( (long) sizeof(USHORT) * ICONY * Icons.Depth + 10,
																MEMF_CHIP);

	Icons.ImageData = icon;

	for
	(loop=0; loop < ICONY * Icons.Depth; loop++) icon[loop] = Zoom_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;
	for
	(loop=0; loop < ICONY * Icons.Depth; loop++) icon[loop] = Move_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;
	for
	(loop=0; loop<ICONY * Icons.Depth; loop++) icon[loop] = Command_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;
	for
	(loop=0; loop< ICONY * Icons.Depth; loop++) icon[loop] = Hidden_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;		/* future location of home icon	*/
	for
	(loop=0; loop < ICONY * Icons.Depth; loop++) icon[loop] = Home_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;		/* future location of quit icon	*/
	for
	(loop=0; loop < ICONY * Icons.Depth; loop++) icon[loop] = Quit_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	y += ICONY + 2;
	for
	(loop=0; loop < ICONY * Icons.Depth; loop++) icon[loop] = Help_Icon[loop];
	DrawImage(Window->RPort, &Icons, x, y);

	FreeMem( icon, (long) sizeof(USHORT) * ICONY * Icons.Depth);
	}

InvertIcon(Window, icon)
struct Window *Window;
long int icon;
	{
	long int x, y;
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	SetDrMd(Window->RPort, COMPLEMENT);
	SetAPen(Window->RPort, 3l);
	SetOPen(Window->RPort, 0l);

	y = miny + YEXPANDY + (icon - 1) * (ICONY + 2);
	RectFill(Window->RPort, maxx + YEXPANDX +2, y, maxx +XBORDER -1, y +ICONY);
	}

DrawButton(Window, x, y)
struct Window *Window;
long int x,y;
	{
	long int minx, miny, maxx, maxy;

	SetDrMd(Window->RPort, JAM2);
	SetAPen(Window->RPort, 2l);
	SetOPen(Window->RPort, 2l);
	RectFill(Window->RPort, x, y, x + BALLWIDTH - 1, y + BALLHEIGHT - 1);
	}

EraseButton(Window, x, y)
struct Window *Window;
long int x,y;
	{
	long int minx, miny, maxx, maxy;

	SetDrMd(Window->RPort, JAM2);
	SetAPen(Window->RPort, 0l);
	SetOPen(Window->RPort, 0l);
	RectFill(Window->RPort, x, y, x + BALLWIDTH - 1, y + BALLHEIGHT - 1);
	}

swap (x1, x2)
long int *x1, *x2;
	{
	long int tmp;
	tmp = *x1;
	*x1 = *x2;
	*x2 = tmp;
	}

Line(Window, colour, x1, y1, x2, y2)
struct Window *Window;
long int colour, x1, y1, x2, y2;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

/* Clip the edges of the graph 			*/
/* start with the horizontal borders	*/
	if (y1 >= miny && y1 <= maxy && y2 >= miny && y2 <= maxy);/* Do nothing	*/
	else if ( (y1 - miny) * (y2 - miny) < 0 )
		{
		/* Clip against top edge	*/
		if (y2 > miny) 
			{
			swap(&x1, &x2);
			swap(&y1, &y2);
			}
		x2 = (miny - y1)*(x1-x2)/(y1-y2)+x1;
		y2 = miny;
		}
	else if ( (y1 - maxy) * (y2 - maxy) < 0 )
		{
		/* Clip against bottom edge	*/
		if (y2 < maxy) 
			{
			swap(&x1, &x2);
			swap(&y1, &y2);
			}
		x2 = (maxy - y1)*(x1-x2)/(y1-y2)+x1;
		y2 = maxy;
		}
	else return();

/* and know the vertical edges		*/
	if (x1 >= minx && x1 <= maxx && x2 >= minx && x2 <= maxx);/* Do nothing	*/
	else if ( (x1 - minx) * (x2 - minx) < 0 )
		{
		/* Clip against top edge	*/
		if (x2 > minx) 
			{
			swap(&x1, &x2);
			swap(&y1, &y2);
			}
		y2 = (minx - x1)*(y1-y2)/(x1-x2)+y1;
		x2 = minx;
		}
	else if ( (x1 - maxx) * (x2 - maxx) < 0 )
		{
		/* Clip against bottom edge	*/
		if (x2 < maxx) 
			{
			swap(&x1, &x2);
			swap(&y1, &y2);
			}
		y2 = (maxx - x1)*(y1-y2)/(x1-x2)+y1;
		x2 = maxx;
		}
	else return();

	SetAPen(Window->RPort, colour);
	Move(Window->RPort, x1, y1);
	Draw(Window->RPort, x2, y2);
	}

CrossHair(Window, x, y)
struct Window *Window;
long int x, y;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	SetDrMd(Window->RPort, COMPLEMENT);
	Line(Window, 3l, x, miny, x, maxy);
	Line(Window, 3l, minx, y, maxx, y);
	SetDrMd(Window->RPort, JAM2);
	}

Box(Window, deltax, deltay)
struct Window *Window;
long int deltax, deltay;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	SetDrMd(Window->RPort, COMPLEMENT);
	if (deltax > 0) Line(Window, 3l, minx + deltax, miny, minx + deltax, maxy);
	if (deltax < 0) Line(Window, 3l, maxx + deltax, miny, maxx + deltax, maxy);

	if (deltay > 0) Line(Window, 3l, minx, miny + deltay, maxx, miny + deltay);
	if (deltay < 0) Line(Window, 3l, minx, maxy + deltay, maxx, maxy + deltay);

	SetDrMd(Window->RPort, JAM2);
	}

DrawGrid(Window)
struct Window *Window;
	{
	long int minx, miny, maxx, maxy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	SetDrMd(Window->RPort, COMPLEMENT);
	Line(Window, 1l, maxx / 3, miny, maxx / 3, maxy);
	Line(Window, 1l, maxx * 2/ 3, miny, maxx * 2 / 3, maxy);
	Line(Window, 1l, minx, maxy / 3, maxx, maxy / 3);
	Line(Window, 1l, minx, maxy * 2 / 3, maxx, maxy * 2 / 3);
	SetDrMd(Window->RPort, JAM2);
	}

Real(Window, parameters, x1, y1, x2, y2)
struct Window *Window;
struct Graph_Parameters *parameters;
long int x1, y1, x2, y2;
	{
	long int minx, miny, maxx, maxy;
	double xsize, ysize, xstart, ystart, xend, yend, xconversion, yconversion;

	if (x1 == x2 || y1 == y2) return();

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	x1 = x1 - minx;
	x2 = x2 - minx;
	y1 = y1 - miny;
	y2 = y2 - miny;

	xsize = parameters->xend - parameters->xstart;
	ysize = parameters->yend - parameters->ystart;

	xstart = parameters->xstart;
	ystart = parameters->ystart;

	xend = parameters->xend;
	yend = parameters->yend;

	xconversion = xsize /(maxx - minx);
	yconversion = ysize /(maxy - miny);

	if (x1 > x2) swap (&x1, &x2);
	if (y1 > y2) swap (&y1, &y2);

	parameters->xstart = xstart + xconversion * x1;
	parameters->ystart = ystart + yconversion * y1;

	parameters->xend = xstart + xconversion * x2;
	parameters->yend = ystart + yconversion * y2;
	DrawWindow(Window, parameters);
	}

Shift(Window, parameters, dx, dy)
struct Window *Window;
struct Graph_Parameters *parameters;
long int dx, dy;
	{
	long int minx, miny, maxx, maxy;
	double xsize, ysize, xstart, ystart, xend, yend, xconversion, yconversion;
	double deltax, deltay;

	deltax = dx;
	deltay = dy;

    minx = Window->BorderLeft;
    miny = Window->BorderTop;
    maxx = Window->Width - Window->BorderRight - XBORDER;
    maxy = Window->Height - Window->BorderBottom - YBORDER;

	xsize = parameters->xend - parameters->xstart;
	ysize = parameters->yend - parameters->ystart;

	xstart = parameters->xstart;
	ystart = parameters->ystart;

	xend = parameters->xend;
	yend = parameters->yend;

	xconversion = xsize /(maxx - minx);
	yconversion = ysize /(maxy - miny);

	parameters->xstart = xstart + xconversion * deltax;
	parameters->ystart = ystart + yconversion * deltay;

	parameters->xend = xend + xconversion * deltax;
	parameters->yend = yend + yconversion * deltay;
	}

/* define maximum number of menu items */
#define MENU0MAX 4
#define MENU1MAX 7

struct MenuItem ItemText0[MENU0MAX];
struct MenuItem ItemText1[MENU1MAX];
struct IntuiText MenuItem0[MENU0MAX];
struct IntuiText MenuItem1[MENU1MAX];

InitMenu()
	{
	InitMenu0();
	InitMenu1();

	menu[0].NextMenu = &menu[1];
	menu[0].LeftEdge = 10;
	menu[0].TopEdge = 0;
	menu[0].Width = 80;
	menu[0].Height = 10;
	menu[0].Flags = MENUENABLED;
	menu[0].MenuName = "Project";           /* text for menu-bar display */
	menu[0].FirstItem = &ItemText0[0];    /* pointer to first item in list */

	menu[1].NextMenu = NULL;
	menu[1].LeftEdge = 100;
	menu[1].TopEdge = 0;
	menu[1].Width = 100;
	menu[1].Height = 10;
	menu[1].Flags = MENUENABLED;
	menu[1].MenuName = "Functions";        /* text for menu-bar display */
	menu[1].FirstItem = &ItemText1[0];    /* pointer to first item in list */
	}

InitMenu0()
	{
	short n;

	/* initialize each meu item and IntuiText with loop */
	for( n=0; n<MENU1MAX; n++ )
		{
		ItemText0[n].NextItem = &ItemText0[n+1];
		ItemText0[n].LeftEdge = 0;
		ItemText0[n].TopEdge = 10 * n;
		ItemText0[n].Width = 80;
		ItemText0[n].Height = 10;
		ItemText0[n].Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
		ItemText0[n].MutualExclude = 0;
		ItemText0[n].ItemFill = (APTR)&MenuItem0[n];
		ItemText0[n].SelectFill = NULL;
		ItemText0[n].Command = 0;
		ItemText0[n].SubItem = NULL;
		ItemText0[n].NextSelect = 0;

		MenuItem0[n].FrontPen = 0;
		MenuItem0[n].BackPen = 1;
		MenuItem0[n].DrawMode = JAM2;     /* render in fore and background */
		MenuItem0[n].LeftEdge = 0;
		MenuItem0[n].TopEdge = 1;
		MenuItem0[n].ITextFont = NULL;
		MenuItem0[n].NextText = NULL;
		}
	ItemText0[MENU0MAX-1].NextItem = NULL;

	/* initialize text for specific menu items */
	MenuItem0[0].IText = (UBYTE *)"Load";
	MenuItem0[1].IText = (UBYTE *)"Save";
	MenuItem0[2].IText = (UBYTE *)"About";
	MenuItem0[3].IText = (UBYTE *)"Quit";
	}

InitMenu1()
	{
	short n;

	/* initialize each meu item and IntuiText with loop */
	for( n=0; n<MENU1MAX; n++ )
		{
		ItemText1[n].NextItem = &ItemText1[n+1];
		ItemText1[n].LeftEdge = 0;
		ItemText1[n].TopEdge = 10 * n;
		ItemText1[n].Width = 120;
		ItemText1[n].Height = 10;
		ItemText1[n].Flags = ITEMTEXT | ITEMENABLED | HIGHCOMP;
		ItemText1[n].MutualExclude = 0;
		ItemText1[n].ItemFill = (APTR)&MenuItem1[n];
		ItemText1[n].SelectFill = NULL;
		ItemText1[n].Command = 0;
		ItemText1[n].SubItem = NULL;
		ItemText1[n].NextSelect = 0;

		MenuItem1[n].FrontPen = 0;
		MenuItem1[n].BackPen = 1;
		MenuItem1[n].DrawMode = JAM2;     /* render in fore and background */
		MenuItem1[n].LeftEdge = 0;
		MenuItem1[n].TopEdge = 1;
		MenuItem1[n].ITextFont = NULL;
		MenuItem1[n].NextText = NULL;
		}
	ItemText1[MENU1MAX-1].NextItem = NULL;

	/* initialize text for specific menu items */
	MenuItem1[0].IText = (UBYTE *)"Zoom";
	MenuItem1[1].IText = (UBYTE *)"Move";
	MenuItem1[2].IText = (UBYTE *)"Command";
	MenuItem1[3].IText = (UBYTE *)"Hidden Lines";
	MenuItem1[4].IText = (UBYTE *)"Home";
	MenuItem1[5].IText = (UBYTE *)"Quit";
	MenuItem1[6].IText = (UBYTE *)"Help";
	}
