This is AbstractView.m in view mode; [Download] [Up]
// AbstractView.m
#import "AbstractView.h"
#import "Controller.h"
#import <stdio.h>
@implementation AbstractView
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
xMin = -100;
xMax = 100;
yMin = -100;
yMax = 100;
[self display];
return self;
}
- newLimits:sender
{
xMin = [xMinField floatValue];
xMax = [xMaxField floatValue];
yMin = [yMinField floatValue];
yMax = [yMaxField floatValue];
[self display];
return self;
}
#define X(x) ((x - xMin) * sx)
#define Y(y) ((y - yMin) * sy)
- drawSelf:(const NXRect *)rects :(int)rectCount
{
float sx = bounds.size.width / (xMax - xMin);
float sy = bounds.size.height / (yMax - yMin);
id font = [Font newFont:"Helvetica" size:12.0 matrix:NX_IDENTITYMATRIX];
// erase view
NXEraseRect(&rects[0]);
// draw axes
PSsetgray(NX_BLACK);
PSmoveto(X(xMin), Y(0.0));
PSlineto(X(xMax), Y(0.0));
PSstroke();
PSmoveto(X(0.0), Y(yMin));
PSlineto(X(0.0), Y(yMax));
PSstroke();
// set font for later
[font set];
return self;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- copy:sender
{
NXStream *stream;
NXAtom typelist[1] = { NXPostScriptPboardType };
int length, maxLength;
char *data;
id pboard = [Pasteboard new];
// put EPS on the pasteboard
NX_DURING
[pboard declareTypes:typelist num:1 owner:self];
stream = NXOpenMemory(NULL, 0, NX_READWRITE);
[self copyPSCodeInside:&bounds to:stream];
NXGetMemoryBuffer(stream, &data, &length, &maxLength);
[pboard writeType:NXPostScriptPboardType data:data length:length];
NXCloseMemory(stream, NX_FREEBUFFER);
NX_HANDLER
NXRunAlertPanel("Error", "Can't copy EPS to the pasteboard.", NULL, NULL, NULL);
NX_ENDHANDLER
return self;
}
#define ZOOM_FACTOR 1.2
- zoomIn:sender
{
xMin /= ZOOM_FACTOR;
yMin /= ZOOM_FACTOR;
xMax /= ZOOM_FACTOR;
yMax /= ZOOM_FACTOR;
[self displayLimits];
[self display];
return self;
}
- zoomOut:sender
{
xMin *= ZOOM_FACTOR;
yMin *= ZOOM_FACTOR;
xMax *= ZOOM_FACTOR;
yMax *= ZOOM_FACTOR;
[self displayLimits];
[self display];
return self;
}
- (void)displayLimits
{
[xMinField setFloatValue: xMin];
[xMaxField setFloatValue: xMax];
[yMinField setFloatValue: yMin];
[yMaxField setFloatValue: yMax];
}
- awakeFromNib
{
[self displayLimits];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.