-- Plotter.mesa, an interface for creating and maintaining
--   Viewer-world plots of real values
-- Last Modified On June 20, 1982 10:02 am By Paul Rovner

DIRECTORY
    RealEvent USING[StreamHandle],
    RealVec USING[Handle],
    Rope USING[ROPE],
    ViewerClasses USING[Viewer];
    
Plotter: DEFINITIONS =
 { Object: TYPE;
   Handle: TYPE = REF Object;

   -- A plotter is an active object that pulls events from an
   -- eventSource, incorporates them in a circular buffer of
   -- events, and maintains a graph showing event values vs.
   -- event times.  
   
   PointShape: TYPE = {none, filledBox, emptyBox, filledDiamond,
                       emptyDiamond, dot, circle};

   Connectivity: TYPE = {solid, dotted, dashed, dotDash, vertical};

   Create: PROC
             [label: Rope.ROPE,
              eventSource: RealEvent.StreamHandle,
              nEvents: NAT,
	         -- the length of the circular buffer.
              plotValueDifferences: BOOLEAN ← FALSE,
              plotValuePerSecond: BOOLEAN ← FALSE,
	      autoRepaint: BOOLEAN ← FALSE,
	         -- TRUE => repaint whenever a new event occurs
	      iconic: BOOLEAN ← TRUE,
	      connectivity: Connectivity ← solid,
	         -- how to draw the connecting line between
		 -- adjacent data points
	      pointShape: PointShape ← none
	         -- how to depict data points
             ]
         RETURNS[Handle];

         -- This provides a "pull-style" plotter.

   CoCreate: PROC
             [label: Rope.ROPE,
              nEvents: NAT,
              plotValueDifferences: BOOLEAN ← FALSE,
              plotValuePerSecond: BOOLEAN ← FALSE,
	      autoRepaint: BOOLEAN ← FALSE,
	      iconic: BOOLEAN ← TRUE,
	      connectivity: Connectivity ← solid,
	      pointShape: PointShape ← none
             ]
         RETURNS[plotter: Handle, eventSink: RealEvent.StreamHandle];

         -- This uses PORTs to provide a "push-style" alternative.
	 
   Paint: PROC[self: Handle];

   Destroy: PROC[self: Handle];

   CreatePlotViewer: PROC
             [label: Rope.ROPE,
              verticalAxis: RealVec.Handle,
	      horizontalAxis: RealVec.Handle ← NIL,
	         -- default: RealVec.IndexVec[verticalAxis.length]
	      iconic: BOOLEAN ← TRUE,
	      connectivity: Connectivity ← solid,
	      pointShape: PointShape ← none
             ]
         RETURNS[ViewerClasses.Viewer];
	 
	 -- This low-level procedure is used by Create and CoCreate.
	 -- The two RealVec.Object's must have the same length.
	 -- CreatePlotViewer creates a graph of
	 --    verticalAxis[i] vs. horizontalAxis[i]
	 -- for i IN [0..verticalAxis.length)
	 -- Subsequent changes to the two RealVec.Object's will be
	 -- reflected in the graph when it is repainted
	 -- (via ViewerOps.PaintViewer). For the purpose of connecting
	 -- adjacent data points with lines, adjacency of values in
	 -- verticalAxis is determined by the sort order of
	 -- corresponding values in horizontalAxis.
   

 }.