This is IKList.m in view mode; [Download] [Up]
#pragma .h #import <Foundation/NSObject.h> #pragma .h #import <Foundation/NSArray.h> #pragma .h #import "IKIconObject.h" #pragma .h #import "IKDependency.h" #pragma .h @class IKAnnouncer; #import <Foundation/NSArchiver.h> #import <Foundation/NSUtilities.h> #import <InterfaceBuilder/InterfaceBuilder.h> #import "IKAnnouncer.h" #import "IKfunctions.h" #import "IKList.h" #import "NSObject.LoadImage.h" @implementation IKList:NSObject #pragma .h <IKDependency,IKDraggableObject> #pragma .h { #pragma .h NSMutableArray *embeddedArray; #pragma .h IKAnnouncer *users; #pragma .h } static NSImage * sheaf = nil; static NSImage * miniSheaf = nil; + (void)initialize { if (self == [IKList class]) { IKInitIDpboardType(); sheaf = [self loadImageFromBundle:@"IKSheaf"]; miniSheaf = [self loadImageFromBundle:@"IKMiniSheaf"]; } } - (NSImage *) getIBImage { return sheaf; } - init { return [self initCount:10]; } - initCount: (unsigned int) numSlots { if ((self = [super init]) != nil) { embeddedArray = [[NSMutableArray alloc] initWithCapacity:numSlots]; users = [[IKAnnouncer alloc] initOwner: self]; } return self; } - copyWithZone: (NSZone *) zone { IKList *copy = NSCopyObject(self, 0, zone); if (copy) { copy->users = [[IKAnnouncer alloc] initOwner: copy]; copy->embeddedArray = [embeddedArray copyWithZone:zone]; } return copy; } - (void)dealloc { NSMutableArray *usersAndListeners; #if DEBUG NSLog(@"freeing list: %@\n", [self description]); #endif [users announce: @selector(willFree:)]; usersAndListeners = [users usersAndListeners]; [usersAndListeners removeAllObjects]; [usersAndListeners addObject:self]; [embeddedArray makeObjectsPerform:@selector(removeUser:) withObject: self]; [users release]; [super dealloc]; } - (void)forwardInvocation:(NSInvocation *)anInvocation { if(embeddedArray && [embeddedArray count] > 0) { id target = [embeddedArray objectAtIndex:0]; if ([target respondsToSelector:[anInvocation selector]]) { [anInvocation invokeWithTarget:target]; } } [super forwardInvocation:anInvocation]; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { if(embeddedArray && [embeddedArray count] > 0) { return [[embeddedArray objectAtIndex:0] methodSignatureForSelector:aSelector]; } return [super methodSignatureForSelector:aSelector]; } - (BOOL) respondsToSelector: (SEL) method { if([super respondsToSelector:method]) { return YES; } else { if(embeddedArray && [embeddedArray count] > 0) { return [[embeddedArray objectAtIndex:0] respondsToSelector:method]; } } return NO; } - (id)initWithCoder:(NSCoder *)aDecoder { embeddedArray = [aDecoder decodeObject]; if(embeddedArray) { [embeddedArray retain]; } users = [[IKAnnouncer alloc] initOwner:self]; return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:embeddedArray]; } - (void)addUser: who { [users addUser: who]; } - (void)addListener: who { [users addListener: who]; } - (void)removeListener: who { [users removeListener: who]; } - (void)removeUser: who { [users removeUser: who]; if( ([users numUsers] == 0) && [self garbageCollect] && (![NSApp conformsToProtocol: @protocol(IB)])) { [self release]; } } - (BOOL) garbageCollect { return YES; } - (NSString *)name { if ([embeddedArray count] == 0) return nil; else if ([embeddedArray count] == 1) return [[embeddedArray objectAtIndex: 0] name]; else return [NSString stringWithFormat:@"%d objects", [embeddedArray count]]; } - (id)image { if ([embeddedArray count] == 0) return nil; else if ([embeddedArray count] == 1) return [[embeddedArray objectAtIndex: 0] image]; else return sheaf; } - (id)miniImage { if ([embeddedArray count] == 0) return nil; else if ([embeddedArray count] == 1) return [[embeddedArray objectAtIndex:0] miniImage]; else return miniSheaf; } - (NSString *)descrition { int numElements = [embeddedArray count]; if (numElements == 0) return @"<empty IKList>"; else if ([embeddedArray count] == 1) return [[embeddedArray objectAtIndex:0] descrition]; else { return [NSString stringWithFormat:@"%d items", numElements]; } } - (BOOL)isDraggable { if ([embeddedArray count] == 0) return NO; else return [[embeddedArray objectAtIndex:0] isDraggable]; } - (BOOL) isDragAccepting { return NO; } - (BOOL) isEditable { return NO; } - (void)setDraggable: (BOOL)flag; {} - (void)appendList: (NSArray *)objects { if (![users poll: @selector(list:willAppendList:) with:objects]) return; [users setSendAnnouncements: NO]; [embeddedArray addObjectsFromArray: objects]; [users setSendAnnouncements: YES]; [users announce: @selector(list:didAppendList:) with:objects]; } - (void)removeList: (NSArray *) objects { if (![users poll: @selector(list:willRemoveList:) with:objects]) return; [users setSendAnnouncements: NO]; [embeddedArray removeObjectsInArray:objects]; [users setSendAnnouncements: YES]; [users announce: @selector(list:didRemoveList:) with:objects]; } - (unsigned)count { return [embeddedArray count]; } - (id)objectAtIndex:(unsigned)i { return [embeddedArray objectAtIndex:i]; } - (void)addObject:anObject { [embeddedArray addObject:anObject]; } - insertObject: object atIndex: (unsigned int) i { if (![users poll: @selector(list:willAdd:) with:object]) return nil; [embeddedArray insertObject:object atIndex:i]; [object addUser: self]; [users announce: @selector(list:didAdd:) with:object]; return self; } - (void)removeObjectAtIndex: (unsigned int) i { id object = [embeddedArray objectAtIndex: i]; if (![users poll: @selector(list:willRemove:) with:object]) return; [embeddedArray removeObjectAtIndex: i]; [object removeUser: self]; [users announce: @selector(list:didRemove:) with:object]; } - (void)willFree: who { [embeddedArray removeObject:who]; } + (NSArray *) pasteTypes { return IKIDPasteTypes(); } - (void)copyToPasteboard: (NSPasteboard *) pboard { IKCopyID (pboard, self); } + readFromPasteboard: (NSPasteboard *) pboard; { id object = IKReadID (pboard); return [object isKindOfClass: [self class]] ? object : nil; } @end @implementation NSObject (IKListAnnouncements) - (BOOL)list:sender willAppendList: objects{ return YES; } - (BOOL)list:sender willRemoveList: objects{ return YES; } - (BOOL)list:sender willAdd: object { return YES; } - (BOOL)list:sender willRemove:object { return YES; } - (void)list: sender didAppendList: objects { ; } - (void)list: sender didRemoveList: objects { ; } - (void)list: sender didAdd: object { ; } - (void)list: sender didRemove: object { ; } - (void)willFree: sender { ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.