This is AbstractTimerView.m in view mode; [Download] [Up]
#import "AbstractTimerView.h" #import "ErgoApp.h" #import <appkit/Font.h> #import <appkit/Text.h> #import <appkit/TextField.h> @implementation AbstractTimerView - gameOver { gameOver = YES; return self; } - (BOOL) isWhite { return [self subclassResponsibility: _cmd], NO; } - startOfNewMove { if (!gameOver && [NXApp isWhiteMove] == [self isWhite]) { if (wasCounting) { [timerTextField setIntValue: --timeLeft]; [self display]; } else wasCounting = YES; if (timeLeft) [self perform: @selector(startOfNewMove) with: nil afterDelay: 1000 cancelPrevious: YES]; else [NXApp gameOverDueTo: TIMER_RAN_OUT winner: [NXApp isWhiteMove] ? BLACK_WINS : WHITE_WINS]; } else wasCounting = NO; return self; } /* Private methods: */ - appDidInit { return [self startOfNewMove]; } #define INITIAL_TIME 120 #define FONT_FACTOR 0.7 - initFrame: (const NXRect *) frameRect { NXRect localRect = *frameRect; double fontSize = FONT_FACTOR * frameRect->size.height; [super initFrame: frameRect]; gameOver = wasCounting = NO; localRect.origin.x = localRect.origin.y = 0; timerTextField = [[TextField alloc] initFrame: &localRect]; [timerTextField setFont: [Font newFont: "Helvetica-Bold" size: fontSize]]; [[timerTextField setSelectable: NO] setAlignment: NX_CENTERED]; [timerTextField setBackgroundGray: [self isWhite] ? NX_WHITE : NX_BLACK]; [timerTextField setTextGray: [self isWhite] ? NX_DKGRAY : NX_LTGRAY]; [self addSubview: [timerTextField setIntValue: (timeLeft = INITIAL_TIME)]]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.