This is TestView.m in view mode; [Download] [Up]
/***************************************************************************/
/* TestView.m - implementation file for TestView class */
/* January 1990 Carl F. Sutter */
/* This view is a simple animated bitmap test to see how fast they can */
/* move around. The bitmaps are handled by the MovingBitmap class */
/***************************************************************************/
#import "TestView.h"
#import <stdio.h> // for fprintf REMOVE THIS AFTER DEBUGGING
#import <string.h> // for sprintf
#import <dpsclient/psops.h> // for PSsetgray
#import <appkit/Control.h> // for setIntValue
#import <appkit/Cell.h> // for setEnabled
#import <appkit/nextstd.h> // for MIN and MAX
@implementation TestView
/***************************************************************************/
/* newFrame: - initialize the new view for the bitmaps to bounce around in */
/***************************************************************************/
- initFrame:(NXRect *)rect
{
[super initFrame:rect];
listMB = [[List alloc] init]; // new list to hold MovingBitmaps
bMoving = NO;
bGState = NO;
bPing = NO;
bEraseBackground = NO;
bEraseBitmaps = YES;
bTightDrawLoop = NO;
bRandomVelocity = YES;
dPeriod = 0.0;
timer = [[Animator alloc] initChronon:dPeriod adaptation:0.0 target:self
action:@selector(step:) autoStart:NO eventMask:NX_ALLEVENTS];
return( self );
} /* newFrame: 1/25/89 CFS */
/***************************************************************************/
// appDidInit - Delegate message sent after application is set up.
// The Views's window instance variable is now set, so it's size can be
// found. Now find the minimum window size for a view of 1x1.
/***************************************************************************/
- appDidInit:(id)sender
{
NXRect nxrWinFrame;
[window getFrame:&nxrWinFrame];
nxsMinWindow.width = nxrWinFrame.size.width; /* controls cross whole bottom */
nxsMinWindow.height = nxrWinFrame.size.height - bounds.size.height + 1.0;
return( self );
} /* appDidInit 8/16/89 CFS */
/***************************************************************************/
// windowWillResize - Delegate message sent from main window.
// Prevent window from getting so small that the view size is zero.
/***************************************************************************/
- windowWillResize:sender toSize:(NXSize *)frameSize
{
frameSize->width = MAX( frameSize->width, nxsMinWindow.width );
frameSize->height = MAX( frameSize->height, nxsMinWindow.height );
return( self );
} /* windowWillResize 9/14/89 CFS */
/***************************************************************************/
// windowDidResize - Delegate message sent from main window.
// After sizing, reset the limits for the moving bitmaps
/***************************************************************************/
- windowDidResize:sender;
{
[listMB makeObjectsPerform:@selector( setFrame: ) with:(id)&bounds];
return( self );
} /* windowDidResize 9/14/89 CFS */
/***************************************************************************/
/* setPeriod: - changes the period of the timer object */
/***************************************************************************/
- setPeriod:sender
{
dPeriod = [timerPeriod doubleValue];
[timer free];
timer = [[Animator alloc] initChronon:dPeriod adaptation:dPeriod target:self
action:@selector(step:) autoStart:bMoving eventMask:NX_ALLEVENTS];
return( self );
} /* setPeriod: 1/25/90 CFS */
/***************************************************************************/
/* start: - start or stop the timer, and thus the animation */
/***************************************************************************/
- start:sender
{
bMoving = !bMoving;
if (bMoving) [timer startEntry];
else [timer stopEntry];
return( self );
} /* start: 1/25/90 CFS */
/***************************************************************************/
/* step: - step the animation once, called from the timer object */
/***************************************************************************/
- step:sender
{
if (bTightDrawLoop)
{ /* keep drawing until an event happens - disregards timer delay! */
[self lockFocus];
while (![timer shouldBreak])
{
[listMB makeObjectsPerform:@selector( move )];
[self drawBitmaps];
[window flushWindow];
}
[self unlockFocus];
}
else /* just draw once */
{
[listMB makeObjectsPerform:@selector( move )];
[self display];
}
return( self );
} /* step: 1/25/90 CFS */
/***************************************************************************/
/* create: - make a new moving bitmap, and add it to the list */
/***************************************************************************/
- create:sender
{
MovingBitmap *mbNew;
char szTiffFile[40];
int nSize;
nSize = [[size selectedCell] tag];
sprintf( szTiffFile, "%dx%d.tiff", nSize, nSize );
mbNew = [[MovingBitmap alloc] initFromMachO:szTiffFile inFrame:&bounds];
if (!bRandomVelocity)
[mbNew setVelocity:[xVel floatValue] :[yVel floatValue]];
[listMB addObject:mbNew];
[count setIntValue:[listMB count]];
[self display];
return( self );
} /* create: 1/25/90 CFS */
/***************************************************************************/
/* removeOne: - remove the last bitmap on the list - the last one created */
/***************************************************************************/
- removeOne:sender
{
BOOL bSave = bEraseBackground;
[listMB removeLastObject];
[count setIntValue:[listMB count]];
bEraseBackground = TRUE;
[self display];
bEraseBackground = bSave;
return( self );
} /* removeOne: 1/25/90 CFS */
/***************************************************************************/
/* allocateGState: - toggle GState allocation to this view */
/***************************************************************************/
- allocateGState:sender
{
bGState = !bGState;
if (bGState) [self allocateGState]; // For faster lock/unlockFocus
else [self freeGState];
return( self );
} /* allocateGState: 1/25/90 CFS */
/***************************************************************************/
/* Boolean toggling action methods */
/***************************************************************************/
- nxPing:sender {bPing = !bPing; return( self );}
- eraseBackground:sender {bEraseBackground = !bEraseBackground;return( self );}
- eraseBitmaps:sender {bEraseBitmaps = !bEraseBitmaps; return( self );}
- tightDrawLoop:sender {bTightDrawLoop = !bTightDrawLoop; return( self );}
/***************************************************************************/
/* randomVel: - toggles random velocity for new bitmaps & enables fields */
/***************************************************************************/
- randomVel:sender;
{
bRandomVelocity = !bRandomVelocity;
[xVel setEnabled:!bRandomVelocity];
[yVel setEnabled:!bRandomVelocity];
return( self );
} /* randomVel: 1/25/90 CFS */
/***************************************************************************/
/* drawBitmaps - draw the bitmaps */
/***************************************************************************/
- drawBitmaps
{
if (bEraseBackground)
{
PSsetgray( NX_LTGRAY );
NXRectFill( &bounds );
}
if (bEraseBitmaps) [listMB makeObjectsPerform:@selector( erase )];
[listMB makeObjectsPerform:@selector( draw )];
if (bPing) NXPing();
} /* drawBitmaps 1/25/90 CFS */
/***************************************************************************/
/* drawSelf:: - draw the current view */
/***************************************************************************/
- drawSelf:(NXRect *)r :(int) count
{
[self drawBitmaps];
return( self );
} /* drawSelf:: 1/25/90 CFS */
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.