This is IKBrowserCell.m in view mode; [Download] [Up]
#pragma .h #import <AppKit/NSBrowserCell.h> #pragma .h #pragma .h #import "IKDependency.h" #pragma .h #pragma .h @interface NSObject (IKBrowserCellDelegate) <IKDependency> #pragma .h - (NSString *)name; #pragma .h - (BOOL)isLeaf; #pragma .h - (BOOL)respondsToSelector:(SEL)message; #pragma .h @end #pragma .h #import <Foundation/NSString.h> #import <Foundation/NSUtilities.h> #import <AppKit/AppKit.h> #import "iconkit.h" @implementation IKBrowserCell:NSBrowserCell { id delegate; id matrix; BOOL needsErase; } - (void)dealloc { [delegate removeUser: self]; return [super dealloc]; } - (void)setDelegate:(id)theDelegate { id old = delegate; NSString *name; if (!theDelegate || [theDelegate conformsToProtocol: @protocol(IKDependency)]) { delegate = theDelegate; } else { NSLog (@"%@ does not conform to IKDependency", [(IKFolder *)theDelegate name]); delegate = nil; } [self setLoaded:YES]; if(delegate) { [delegate addUser: self]; [self setStringValue: (name = [(IKFolder *)delegate name]) ? name : @""]; [self setLeaf: [delegate respondsToSelector:@selector(isLeaf)] ? [delegate isLeaf] : YES]; } else { [self setStringValue:@""]; [self setLeaf:YES]; } if(old) { [old removeUser: self]; } } - delegate { return delegate; } - willFree: sender { if (delegate == sender) delegate = nil; return self; } - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { NSString *title; id branchIcon = [NSBrowserCell branchImage]; NSSize size; matrix = controlView; if (needsErase && (![matrix drawsCellBackground])) { PSsetgray (NSLightGray); NSRectFill(cellFrame); } needsErase = NO; title = [[self stringValue] copy]; size = [branchIcon size]; IKShortenTitle (self, cellFrame.size.width - size.width); [super drawInteriorWithFrame:cellFrame inView:matrix]; [self setStringValue:title]; [title release]; } - didChangeName: sender { if ((sender == delegate) && [self isLoaded]) { NSString *name = [(IKFolder *)delegate name]; [self setStringValue: name ? name : @""]; needsErase = ![self state]; [matrix updateCell:self]; } return self; } - didChangeProperties: sender { if ((sender == delegate) && ([delegate isLeaf] != [self isLeaf])) { [self setLeaf: [delegate isLeaf]]; needsErase = ![self state]; [matrix updateCell:self]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.