This is Overlay.m in view mode; [Download] [Up]
/* Overlay.m by Paul Kunz March 1991
* Group of Plot graphics that overlay each other.
*
* Copyright (C) 1992 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*/
#import "Overlay.h"
const char Overlay_h_rcsid[] = OVERLAY_H_ID;
const char Overlay_m_rcsid[] = "$Id: Overlay.m,v 2.10.2.2 1993/10/26 00:09:46 rensing Exp $";
#import "Plot.h"
@implementation Overlay
- initList:list with:plot
{
Plot *g;
binding_t xaxis = XAXIS, yaxis = YAXIS;
unsigned int i;
int flag = 0;
int logX, logY;
[super initList:list];
[self getExtendedBounds:&initialRect];
firstPlot = plot;
[self checkBounds];
logX = [firstPlot isLogScaleX];
logY = [firstPlot isLogScaleY];
[firstPlot setAutoScale:&xaxis to:&flag];
[firstPlot setAutoScale:&yaxis to:&flag];
lastRect = bounds;
i = [components count];
while ( i-- ) {
g = [components objectAt:i];
if ( g != firstPlot ) {
[g setRangesFrom:firstPlot];
[g setTitlesFlag:&flag];
[g setAxesFlag:&flag];
[g setLogScale:&xaxis to:&logX];
[g setLogScale:&yaxis to:&logY];
[g setBounds:&bounds];
}
}
return self;
}
- checkBounds
{
NXRect frameRect;
NXCoord edge;
[firstPlot getBounds:&bounds];
[[firstPlot graphicView] getFrame:&frameRect];
if ( NXContainsRect( &frameRect, &bounds) ) {
return self;
}
edge = NX_MAXX(&frameRect);
if ( NX_MAXX(&bounds) > edge ) {
[firstPlot moveRightEdgeTo:&edge];
}
edge = NX_MAXY(&frameRect);
if ( NX_MAXY(&bounds) > edge ) {
[firstPlot moveTopEdgeTo:&edge ];
}
edge = NX_X(&frameRect);
if ( NX_X(&bounds) < edge ) {
[firstPlot moveLeftEdgeTo:&edge];
}
edge = NX_Y(&frameRect);
if ( NX_Y(&bounds) < edge ) {
[firstPlot moveBottomEdgeTo:&edge ];
}
[firstPlot getBounds:&bounds];
NXUnionRect(&bounds, &initialRect);
return self;
}
- (NXRect *) getInitialBounds:(NXRect *)initBounds
{
*initBounds = initialRect;
return initBounds;
}
- transferSubGraphicsTo:list at:(int)position
{
id g;
NXRect b;
int i, flag = 1;
b = bounds;
i = [components count];
while ( i-- ) {
g = [components objectAt:i];
if ( [g isKindOf:[Plot class]] ) {
[g setTitlesFlag:&flag];
[g setAxesFlag:&flag];
[g setBounds:&b];
b.origin.x += 10.0;
b.origin.y -= 10.0;
}
}
[super transferSubGraphicsTo:list at:position];
[components empty];
return self;
}
- firstPlot
{
return firstPlot;
}
- NameAxisX:(const char *) stringValue
{
[firstPlot NameAxisX:stringValue];
return self;
}
- NameAxisY:(const char *) stringValue
{
[firstPlot NameAxisY:stringValue];
return self;
}
- setAutoScale:(binding_t *) axis to:(const int *) value
{
Plot *plot;
NXPoint range, max_range;
display disp;
unsigned int i, count;
[firstPlot setAutoScale:axis to:value];
if (!*value) return self;
disp = [firstPlot histDisplay];
h_autoScale(disp);
h_getRange(disp, *axis, &max_range.x, &max_range.y );
count = [components count];
for (i = 0; i < count; i++) {
plot = [components objectAt:i];
if ((plot != firstPlot) && [plot isKindOf:[Plot class]]) {
[plot setAutoScale:axis to:value];
disp = [plot histDisplay];
h_autoScale(disp);
switch (*axis) {
case XAXIS:
h_getRange(disp, XAXIS, &range.x, &range.y );
break;
case YAXIS:
[plot getRangeForAxisY:&range normalizedTo:firstPlot];
break;
default:
break;
}
if (range.x < max_range.x) max_range.x = range.x;
if (range.y > max_range.y) max_range.y = range.y;
}
}
[self makeGraphicsPerform:@selector(setRange:to:)
with :axis with:&max_range];
return self;
}
- setRange:(binding_t* ) axis to:(const NXPoint *)p
{
[firstPlot setRange:axis to:p];
[components makeObjectsPerform:@selector(setRangesAndBinsFrom:) with:firstPlot];
return self;
}
- setNumBins:(binding_t *) axis to:(const int *) value
{
[firstPlot setNumBins:axis to:value];
[components makeObjectsPerform:@selector(setRangesAndBinsFrom:) with:firstPlot];
return self;
}
- setTitle:(const char *) stringValue
{
[firstPlot setTitle:stringValue];
return self;
}
- setTitlesFlag:(const int *) value
{
[firstPlot setTitlesFlag:value];
return self;
}
/* Methods supporting archiving and de-archiving */
- write:(NXTypedStream *) ts
{
[super write:ts];
NXWriteObjectReference( ts, firstPlot );
return self;
}
- read:(NXTypedStream *)ts
{
[super read:ts];
firstPlot = NXReadObject( ts );
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.