/*-------------------------------------------------------------------------------
   A simple View subclass that draws a series of circles.  The list of
	 circles to be drawn is kept in a Storage object; we just run down
	 the list, drawing them.
	 
	 HISTORY:
	 	
			10Oct93	DM	New
-------------------------------------------------------------------------------*/

#import "CircleView.h"

@implementation CircleView

- initFrame															// Designated initializer for View
	:(const NXRect*)frameRect;
{
  /*-------------------------------------------------------------------
	   The designated initializer for Views.  We take this opportunity
		 to initialize our Storage object.
	-------------------------------------------------------------------*/
	
	self = [super initFrame:frameRect];
	
	circleList = [[Storage alloc] initCount:0
																elementSize:(sizeof(NXPoint) + sizeof(double)) 
																description:"{dd}d"];
	return self;
}
	
- addCircleAt														// Add a circle to the display list
	:(NXPoint)pPoint											// INPUT: the center of the circle
		withRadius:(double)pRadius;					// INPUT: the radius of the circle
{
  /*-------------------------------------------------------------------
	   We get passed in one circle, and it gets added to a display list.
		 This lets us redraw and get all the old circles if we want.
		 
		 CircleList should probably be called something else.  It's a 
		 Storage object, not a List.  We should probably also lock-focus
		 and draw the new circle directly; this would prevent having to
		 draw all the circles in the list just to add one new one.
	-------------------------------------------------------------------*/
	circle	aCircle;
	
	aCircle.center = pPoint;
	aCircle.radius = pRadius;
	
	[circleList addElement:&aCircle];
	
	return self;
}

- emptyCircles;													// Remove all the circles from the display list
{
  [circleList empty];
	return self;
}

- drawSelf
		:(const NXRect *)rects 
		:(int)rectCount;
{
  /*-------------------------------------------------------------------
	   The quintessential View method.  Draws all the circles in the 
		 display list.
		 
		 This is not particularly rapid.  A pswrap would speed things
		 up appreciably.  Being smarter about how this is drawn would
		 help a lot too.  In fact, this is a pretty bad example of a
		 drawSelf: method.
	-------------------------------------------------------------------*/
	int			i;
	circle	*thisCircle;
	
		// lay down the background
		
	PSsetgray(NX_LTGRAY);								// Wipe out the current contents by filling the view w/ lt. grey
	NXRectFill(&rects[0]);	
	
	PSsetgray(NX_BLACK);								// Draw a rectangle to frame the view
	NXFrameRect(&rects[0]);
		
		// Loop through the list of Circles, drawing them one-by-one.
		// This would be significantly sped up with a pswrap.
		
	for(i = 0; i < [circleList count]; i++)
		{
			thisCircle = [circleList elementAt:i];
			
			PSnewpath();
			PSarc(thisCircle->center.x, thisCircle->center.y, thisCircle->radius, 0, 360);
			PSstroke();
		}
	
	return self;
}
	

@end
