home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------------------
- 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
-