This is Spewer.m in view mode; [Download] [Up]
#import "Spewer.h"
#import "FlyingWindow.h"
#import "Animator.h"
@implementation EnhanceSpewer:Object
- init
{
[super init];
srandom(time(0));
initiator = nil;
animator = [[EnhanceAnimator allocFromZone:[self zone]] initChronon:0.05
adaptation:0.0 target:self action:@selector(move:)
autoStart:NO eventMask:0];
_extraList = [[List allocFromZone:[self zone]] init];
idleWindows = [[List allocFromZone:[self zone]] init];
windowList = [[List allocFromZone:[self zone]] init];
createOK = NO;
return self;
}
- start:sender
{
createOK = YES;
initiator = sender;
[self addWindow];
[animator startEntry];
return self;
}
- stop:sender
{
createOK = NO;
initiator = nil;
// we stop creating windows, but keep the animator running
// until all the windows are gone
return self;
}
- windowWillClose:sender
{
[self stop:self];
return self;
}
- free
{ // clean out any windows, remove the timed antry and free everything
int i;
animator = [[animator stopEntry] free];
for (i=0; i<[windowList count]; i++)
[[windowList objectAt:i] orderOut:self];
[windowList freeObjects];
windowList = [windowList free];
return [super free];
}
- addWindow
{
NXPoint theCenterPoint;
NXRect senderFrame; id newWindow;
if (!createOK) return nil;
[initiator getFrame:&senderFrame];
//[initiator convertRect:&senderFrame toView:nil];
theCenterPoint.x = NX_X(&senderFrame) + NX_WIDTH(&senderFrame) / 2;
theCenterPoint.y = NX_Y(&senderFrame) + NX_HEIGHT(&senderFrame) / 2;
[[initiator window] convertBaseToScreen:&theCenterPoint];
// recycle if we can; otherwise make a new one
newWindow = [idleWindows removeLastObject];
if (!newWindow) newWindow = [[EnhanceFlyingWindow allocFromZone:[self zone]]
initAt:&theCenterPoint];
else [newWindow reInitAt:&theCenterPoint];
[windowList addObject:newWindow];
return self;
}
- move:sender
{
int i; id newList = _extraList;
// add any new windows spewing about if necessary...
if (([windowList count] < MAX_SPEWS) && !(random() % FREQUENCY)) {
[self addWindow];
}
// move the windows
for (i=0; i<[windowList count]; i++) [[windowList objectAt:i] move];
// remove any windows that left the screen
for (i=0; i<[windowList count]; i++) {
id theWindow = [windowList objectAt:i];
if ([theWindow onScreen]) [newList addObject:theWindow];
else {
[theWindow orderOut:self];
[idleWindows addObject:theWindow]; // put in recycler
}
}
[windowList empty];
_extraList = windowList;
windowList = newList;
if (([windowList count] < 1) && !(createOK))
// stop TE after all windows gone
[animator stopEntry];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.