This is ScoreView.m in view mode; [Download] [Up]
#import "ScoreView.h" #import "BlackFilledSquare.h" #import "WhiteFilledSquare.h" #import <appkit/Font.h> /* for Font's newFont:size: message */ #import <appkit/Text.h> /* to get NX_CENTERED definition */ #import <appkit/TextField.h> @implementation ScoreView #define MAX_NUM_PIECES 37 /* should really be calculated from the board */ - letOtherColorMove { short winType; [self updateTextFields]; winType = whiteCount == blackCount ? GAME_TIED : whiteCount > blackCount ? WHITE_WINS : BLACK_WINS; if (blackCount + whiteCount == MAX_NUM_PIECES) [NXApp gameOverDueTo: BOARD_FILLED winner: winType]; if (([NXApp isWhiteMove] || whiteCount) && blackCount) [NXApp allowOtherColorMove]; else [NXApp gameOverDueTo: NO_OPPONENTS winner: winType]; return self; } /* Private methods: */ - appDidInit { return [self updateTextFields]; } - countSquareAsWhite: (BOOL) isWhite { isWhite ? ++whiteCount : ++blackCount; /* may not be fully portable */ return self; /* (but I like it...:-) */ } - hitTest: (NXPoint *) aPoint { return nil; /* ignore mouseDown: or subviews of us will try to respond */ } #define VERTICAL_ADJUST (-0.23 * frameRect->size.height) /* magic double */ - initFrame: (const NXRect *) frameRect { NXRect blackRect = *frameRect, whiteRect = *frameRect; [super initFrame: frameRect]; blackRect.size.width = (whiteRect.size.width /= 2); blackRect.origin.x = whiteRect.size.width; /* ^ makes 2 equal-size rects */ blackRect.origin.y = whiteRect.origin.y = whiteRect.origin.x = 0; [self addSubview: [[BlackFilledSquare alloc] initFrame: &blackRect]]; [self addSubview: [[WhiteFilledSquare alloc] initFrame: &whiteRect]]; whiteRect.origin.y = blackRect.origin.y = VERTICAL_ADJUST; blackTextField = [self initTextFieldFrame: &blackRect]; whiteTextField = [self initTextFieldFrame: &whiteRect]; [self addSubview: [blackTextField setTextGray: NX_LTGRAY]]; [self addSubview: [whiteTextField setTextGray: NX_DKGRAY]]; return self; } #define FONT_SIZE 14 /* picking Font's "design size" works best */ #define CIRCLE_FACTOR 0.4 /* needed since text must fit inside circle */ - initTextFieldFrame: (const NXRect *) frameRect { id aTextField = [[TextField alloc] initFrame: frameRect]; double scaleFactor = CIRCLE_FACTOR * frameRect->size.height / FONT_SIZE; [aTextField setFont: [Font newFont: "Times-Bold" size: FONT_SIZE]]; [aTextField scale: scaleFactor : scaleFactor]; [[aTextField setBackgroundTransparent: YES] setSelectable: NO]; return [[aTextField setBezeled: NO] setAlignment: NX_CENTERED]; } - updateTextFields { blackCount = whiteCount = 0; [NXApp makeSquaresPerform: @selector(calculateScore:) with: self]; [blackTextField setIntValue: blackCount]; [whiteTextField setIntValue: whiteCount]; return [self display]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.