This is MoonView.m in view mode; [Download] [Up]
/* MoonView.m * Part of the Moon application for the NeXT computer. * Author: Geoffrey S. Knauth * Date: January 4, 1992 * * Permission to copy this program is hereby granted under the terms * of the Free Software Foundation's GNU General Public License. */ #import <appkit/Application.h> /* NXApp */ #import <appkit/NXImage.h> #import <appkit/Window.h> #import "MoonView.h" #import "HugeMoonView.h" #import "all.h" /* These measures of the moon's edges were taken manually via: * - mouseDown:(NXEvent *)e * { NXPoint local = e->location; * [self convertPoint:&local fromView:nil]; * printf("mouseDown: view coordinates %.f, %.f\n", local.x, local.y); * return self; * } */ struct moonInfo fullMoon = {208., 16., 50., 238.}; /* FullMoon.tiff */ @implementation MoonView - initFrame:(const NXRect *)frameRect { /* 288, 228 --> This is the size that IB should know about. */ NXSize rectSize = {1152/4, 912/4}; [super initFrame:frameRect]; /* This is for the 1/4 size MoonView in the main application window. */ image = [[NXImage alloc] initFromSection:"FullMoon.tiff"]; [[image setSize:&rectSize] setScalable:YES]; /* This is for the moon itself, that is, not the stars and space * that make up the background. */ xradius = (fullMoon.right - fullMoon.left) / 2.; yradius = (fullMoon.top - fullMoon.bottom) / 2.; center.x = fullMoon.left + xradius; center.y = fullMoon.bottom + yradius; [self setPhase:0.0]; return self; } - drawSelf :(const NXRect *)rects :(int)rectCount { /* draw the image of the moon */ [image composite:NX_COPY toPoint:&bounds.origin]; /* now draw the shadow over that part hidden from the sun */ DrawMoonShadow([self phase], ¢er, xradius, yradius, NX_BLACK); return self; } - free { [image free]; /* Free the 1/4 size image on our way out. */ if (hugeWindow) /* See if full size window and image exist. */ [hugeWindow free]; /* This will also free the view and image. */ return [super free]; } - mouseDown:(NXEvent *)theEvent { NXRect hugeRect = {{0., 0.}, {1152., 912.}}; /* full screen */ if (theEvent->type == NX_MOUSEDOWN) { if (theEvent->data.mouse.click > 1) { [NXApp getNextEvent:NX_MOUSEUPMASK]; /* wait for mouse up */ if (hugeWindow == nil) { hugeWindow = [[Window alloc] initContent:&hugeRect style:NX_PLAINSTYLE backing:NX_RETAINED buttonMask:0 defer:YES]; hugeMoonView = [[HugeMoonView alloc] initFrame:&hugeRect]; [hugeWindow setContentView:hugeMoonView]; } [hugeWindow makeKeyAndOrderFront:self]; [hugeMoonView display]; /* Cheese! */ [NXApp getNextEvent:NX_MOUSEDOWNMASK]; /* absorb mouse down */ [NXApp getNextEvent:NX_MOUSEUPMASK]; /* and mouse up */ [hugeWindow orderOut:self]; /* put huge moon away */ } } return self; } - (float)phase { return phase; } - setPhase :(float)aFloat; { phase = aFloat; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.