This is AbstractSquare.m in view mode; [Download] [Up]
#import "AbstractSquare.h"
@implementation AbstractSquare
- (short) column {
return column;
}
- (short) distanceTo: otherSquare {
return MAX(ABS([self row ] - [otherSquare row ]),
ABS([self column] - [otherSquare column]));
}
- drawSelf: (const NXRect *) rects : (int) rectCount {
[super drawSelf: rects : rectCount];
NXDrawGrayBezel(&bounds, rects);
if ([self isHighlighted])
[self highlight: rects];
return self;
}
- (BOOL) isHighlighted {
return isHighlighted;
}
- mouseExited: (NXEvent *) theEvent {
if ([self isHighlighted])
[self setIsHighlighted: NO];
return self;
}
- (short) row {
return row;
}
- setIsHighlighted: (BOOL) state {
if (isHighlighted = state)
[NXApp setHighlightedSquare: self];
return [self display];
}
/* Private methods: */
- appDidInit {
return [self appDidInitInside: NO];
}
- appDidInitInside: (BOOL) state {
return [self setTrackingRect: &frame inside: state];
}
- become: newSquareClass {
BOOL wasHighlighted = [self isHighlighted];
id theSuperView = [self superview];
id newSquare = [[newSquareClass alloc] initFrame: &frame];
[[[self freeTrackingRect] removeFromSuperview] free];
[theSuperView addSubview: newSquare];
return [newSquare appDidInitInside: wasHighlighted];
}
- capture: sender {
return self;
}
- checkAdjacencyWith: sender {
return self;
}
- free {
if ([self isHighlighted])
[NXApp setHighlightedSquare: nil];
return [super free];
}
- freeTrackingRect {
if (trackingRectNumber > 0)
[[self window] discardTrackingRect: trackingRectNumber];
return self;
}
#define INSET 2
#define WIDTH 7
- highlight: (const NXRect *) aRect {
NXRect theRect = *aRect;
NXInsetRect(&theRect, INSET, INSET);
PSsetgray(NX_DKGRAY);
NXFrameRectWithWidth(&theRect, WIDTH);
return self;
}
- initFrame: (const NXRect *) frameRect {
[super initFrame: frameRect]; /* the below only works with small */
row = frameRect->origin.y / frameRect->size.height; /* borders */
column = frameRect->origin.x / frameRect->size.width;
return self;
}
- setTrackingRect: (const NXRect *) aRect inside: (BOOL) state {
static int rectNumber = 1;
NXRect winRect = *aRect;
trackingRectNumber = rectNumber;
[[self superview] convertRect: &winRect toView: nil];
[[self window] setTrackingRect: &winRect
inside: state /* cursor is inside/outside rect */
owner: self tag: rectNumber++ left: NO right: NO];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.