DEFINITION MODULE WGraph;

	(********************************************************)
	(*							*)
	(*		Graph module For GWindows.		*)
	(*							*)
	(*  Programmer:		S.P.Lontis, P. Moylan.		*)
	(*  Last edited:	15 February 1993		*)
	(*  Status:						*)
	(*	Basically working, but still fiddling with	*)
	(*	the details.					*)
	(*							*)
	(*	It's not clear whether OpenGraph needs so many	*)
	(*	parameters.  Also not clear how bar graphs	*)
	(*	fit into the overall picture.			*)
	(*							*)
	(********************************************************)

FROM GWindows IMPORT 
     (* type *)   Window;

(************************************************************************)

TYPE
    Graph;		(* is private *)
    
    (* Types of graphs that can be drawn.	*)

    GraphType = (linear, loglinear, loglog, bar);

    (* Line Types that can be used.	*)

    LineType  = (dots, joined, vertical, normal);

    (* Marker Types for individual points plotted.	*)

    MarkType  = (none, square, cross, plus, diamond);

    BarType = (One, Two, Three, Four, Five);

(************************************************************************)

PROCEDURE OpenGraph (VAR (*OUT*) G: Graph;  w: Window;  GrphType: GraphType;
		    LnType: LineType; xst, yst, xen, yen: CARDINAL;
		    xmin, ymin, xmax, ymax: LONGREAL;  Mark: MarkType);

    (* Creates graph G in window w.  The Graph will occupy a rectangle	*)
    (* with a bottom left corner of (xs,ys) and top right corner of	*)
    (* (xe,ye) relative to the window. The range of values which can be	*)
    (* plotted is from (xmin,ymin) to (xmax,ymax).  NOTE: for a bar	*)
    (* graph, xmin gives the width of the bars and xmax gives the	*)
    (* distance between different bars.					*)

PROCEDURE DrawXAxis (G: Graph;  xinc: LONGREAL;
			yoffset, DecPlaces: CARDINAL;  numbering: BOOLEAN);

    (* Draws the x-axis for a graph; xinc is the distance between tick	*)
    (* marks, and yoffset gives the distance that the axis will lie	*)
    (* below the line y=ys (ys is defined in OpenGraph).  The option	*)
    (* yoffset <> 0 allows for the case where more than one graph	*)
    (* occupies the same window, since the graphs may have different	*)
    (* scales.  DecPlaces gives the number of decimal places that will	*)
    (* be used.  If numbering is FALSE, the axis is drawn but not	*)
    (* labelled.							*)

PROCEDURE DrawYAxis (G: Graph;  yinc: LONGREAL;
			xoffset, DecPlaces: CARDINAL;  numbering: BOOLEAN);

    (* Draws the y-axis for a graph; yinc is the space between tick	*)
    (* marks, and xoffset gives the distance that the axis will lie to	*)
    (* the left of the line x=xs (xs is defined in OpenGraph).		*)
    (* DecPlaces gives the number of decimal places that will be used.	*)
    (* If numbering is FALSE, the axis is drawn but not labelled.	*)

PROCEDURE DrawAxes (G: Graph;
	xinc: LONGREAL;  yoffset, xdecplaces: CARDINAL;  numberx: BOOLEAN;
	yinc: LONGREAL;  xoffset, ydecplaces: CARDINAL;  numbery: BOOLEAN);

    (* Draws both the X and Y axes.  See the definitions of		*)
    (* DrawXAxis and DrawYAxis above.					*)

PROCEDURE AddPoint (G: Graph;  x, y: LONGREAL);

    (* For lines of type						*)
    (*		'dots'	: only the marker will be displayed.		*)
    (*		'joined': draws a line from the last point and marker.	*)
    (*		'vertical' : draws a vertical line and a marker.	*)
    (* NOTE: lines of type 'normal' are used for discontinuous graphs	*)
    (* and are not drawn using this procedure.				*)
    (* Points outside the region (xmin <= x <= xmax, ymin <= y <= ymax	*)
    (* will be clipped.							*)

PROCEDURE DrawLines (G: Graph;  x, y: ARRAY OF LONGREAL);

    (* Allows vectors of x and y points to be drawn.  Refer to		*)
    (* procedure AddPoint for specifications of the line types.		*)

PROCEDURE DrawLine (G: Graph;  x0, y0, x1, y1: LONGREAL);

    (* Used for drawing discontinuous lines.  The line is drawn between	*)
    (* (x0,y0) and (x1,y1) relative to graph G.				*)

PROCEDURE BarGraph (G: Graph;  y: ARRAY OF LONGREAL;  del: CARDINAL;  bt: BarType);

    (* Displays a BarGraph of the vector y.  Parameter del gives the	*)
    (* number of stripes per bar, in the case of striped fill patterns.	*)

END WGraph.
