This is InformerGraph.m in view mode; [Download] [Up]
// InformerGraph.m
//
#import "InformerGraph.h"
@implementation InformerGraph
/////////////////////////////////////////////////////////////
// Initializes the view's instance variables.
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
[self setFlipped:YES];
currentX = 0;
MinY = MaxY = 0;
strcpy(title, "Untitled");
strcpy(numFormat, "%.0f");
myFont = [Font newFont:"Helvetica" size:9.0];
return self;
}
/////////////////////////////////////////////////////////////
// Free method
- free
{
return [super free];
}
/////////////////////////////////////////////////////////////
// Drawing method
- drawSelf:(const NXRect *)rects :(int)rectCount
{
NXRect theRect;
float width, height;
char tmpChar[64];
int i;
[self getBounds:&theRect];
width = theRect.size.width;
height = theRect.size.height;
PSsetgray(NX_WHITE);
NXRectFill(&theRect);
PSsetgray(NX_DKGRAY);
[myFont set];
PSmoveto(2, 25);
if (isDelta)
sprintf(tmpChar, "%s (D)", title);
else
strcpy(tmpChar, title);
PSshow(tmpChar);
sprintf(tmpChar, numFormat, MaxY);
PSmoveto(2, 10);
PSshow(tmpChar);
sprintf(tmpChar, numFormat, MinY);
PSmoveto(2, height - 3);
PSshow(tmpChar);
PSsetgray(NX_BLACK);
PSsetlinewidth(1.0);
if (currentX > 0)
{
PSnewpath();
PSmoveto(0, height - (((values[0] - MinY) / (MaxY - MinY)) * height));
for (i = 0; i < currentX; i++)
PSlineto((float)i, height - (((values[i] - MinY) / (MaxY - MinY)) *
height));
PSstroke();
PSmoveto((float)currentX, height -
(((values[currentX - 1] - MinY) / (MaxY - MinY)) * height) - 1);
sprintf(tmpChar, numFormat, values[currentX - 1]);
PSshow(tmpChar);
}
return self;
}
////////////////////////////////////////////////////////////////
//
- initMin:(float)theMin max:(float)theMax title:(char *)theTitle
numFormat:(char *)theFormat
{
MinY = theMin;
MaxY = theMax;
if (MaxY == MinY)
MaxY = MinY + 1;
currentX = 0;
strncpy(title, theTitle, MAXGRAPHTITLE - 1);
strncpy(numFormat, theFormat, 31);
[self display];
return self;
}
////////////////////////////////////////////////////////////////
//
- addPoint:(float)thePoint
{
NXRect theRect;
float width, height;
int i, scrollFactor;
isDelta = NO;
[self getBounds:&theRect];
width = theRect.size.width;
height = theRect.size.height;
if (thePoint > MaxY - (12 * (MaxY - MinY) / height))
if (thePoint > 0)
MaxY = thePoint * 1.2;
else
MaxY = thePoint * 0.8;
if (thePoint < MinY)
if (thePoint > 0)
MinY = thePoint * 0.8;
else
MinY = thePoint * 1.2;
values[currentX++] = thePoint;
if ((currentX >= MAXGRAPHVALUES) || (currentX >= (width - 25)))
{
scrollFactor = width / 5;
for (i = 0; i < currentX; i++)
values[i] = values[i + scrollFactor];
currentX -= scrollFactor;
}
[self display];
return self;
}
////////////////////////////////////////////////////////////////
//
- addDeltaPoint:(float)thePoint
{
NXRect theRect;
float width, height;
int i, scrollFactor;
float newPoint;
isDelta = YES;
[self getBounds:&theRect];
width = theRect.size.width;
height = theRect.size.height;
if (currentX)
newPoint = thePoint - formerPoint;
else
newPoint = 0;
formerPoint = thePoint;
if (newPoint > MaxY - (12 * (MaxY - MinY) / height))
if (newPoint > 0)
MaxY = newPoint * 1.2;
else
MaxY = newPoint * 0.8;
if (newPoint < MinY)
if (newPoint > 0)
MinY = newPoint * 0.9;
else
MinY = newPoint * 1.1;
values[currentX++] = newPoint;
if ((currentX >= MAXGRAPHVALUES) || (currentX >= (width - 25)))
{
scrollFactor = width / 5;
for (i = 0; i < (currentX - scrollFactor); i++)
values[i] = values[i + scrollFactor];
currentX -= scrollFactor;
}
[self display];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.