This is CircleView.m in view mode; [Download] [Up]
/*-------------------------------------------------------------------------------
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
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.