diff options
Diffstat (limited to 'Liaison/Group.m')
-rw-r--r-- | Liaison/Group.m | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/Liaison/Group.m b/Liaison/Group.m new file mode 100644 index 0000000..f975f60 --- /dev/null +++ b/Liaison/Group.m @@ -0,0 +1,321 @@ +// +// Group.m +// Liaison +// +// Created by Brian Cully on Tue Feb 04 2003. +// Copyright (c) 2003 Brian Cully. All rights reserved. +// +#import "Group.h" + +@implementation Group (Copying) +- (id)copyWithZone: (NSZone *)aZone +{ + Group *tmpGroup; + + tmpGroup = [[Group alloc] initWithName: [self name] andType: [self type]]; + [tmpGroup setIcon: [self icon]]; + [tmpGroup setFileStore: [self fileStore]]; + tmpGroup->parent = parent; // XXX + tmpGroup->children = children; // XXX + + return tmpGroup; +} + +- (unsigned)hash +{ + unsigned nameHash, storeHash; + + storeHash = (unsigned)[[[self fileStore] storeID] performSelector: @selector(hash)]; + nameHash = [[self name] hash]; + return (storeHash ^ nameHash); +} + +- (BOOL)isEqual: (id)anObject +{ + if ([anObject isKindOfClass: [self class]]) { + Group *otherGroup; + id myStoreID, otherStoreID; + + myStoreID = [[self fileStore] storeID]; + otherGroup = anObject; + otherStoreID = [[otherGroup fileStore] storeID]; + + if ([myStoreID performSelector: @selector(compare:) withObject: otherStoreID] && + [[self name] isEqualToString: [otherGroup name]]) + return YES; + else + return NO; + } + + return NO; +} +@end + +@implementation Group ++ (Group *)groupWithName: (NSString *)aName +{ + return [[[self alloc] initWithName: aName] autorelease]; +} + ++ (Group *)groupWithName: (NSString *)aName andType: (GroupType)aType +{ + return [[[self alloc] initWithName: aName andType: aType] autorelease]; +} + +- (Group *)initWithName: (NSString *)aName +{ + return [self initWithName: aName andType: BRANCH]; +} + +- (Group *)initWithName: (NSString *)aName andType: (GroupType)aType; +{ + self = [super init]; + + [self setName: aName]; + [self setType: aType]; + icon = [[NSImage imageNamed: LiNormalGroupIcon] retain]; + children = [[NSMutableArray alloc] init]; + + return self; +} + +- (id)init +{ + NSException *myException; + + [self autorelease]; + + myException = [NSException exceptionWithName: @"GroupInitFailure" + reason: @"[[Group alloc] init] isn't supported." + userInfo: nil]; + [myException raise]; + return nil; +} + +- (void)dealloc +{ + [self setName: nil]; + [icon release]; + [children release]; + [self setFileStore: nil]; + + [super dealloc]; +} + +- (id)initWithContentsOfFile: (NSString *)aFilename +{ + NSArray *groupArray; + NSDictionary *groupDict; + NSString *groupname; + + groupDict = [NSDictionary dictionaryWithContentsOfFile: aFilename]; + self = [self initWithName: [groupDict objectForKey: @"name"]]; + + groupArray = [groupDict objectForKey: @"children"]; + for (groupname in groupArray) { + Group *newGroup; + + // XXX - should encode type + newGroup = [[[Group alloc] initWithName: groupname + andType: LEAF] autorelease]; + [newGroup setIcon: [NSImage imageNamed: LiNormalGroupIcon]]; + [self addChild: newGroup]; + } + return self; +} + +- (BOOL)writeToFile: (NSString *)aFilename +{ + Group *group; + NSMutableArray *groupArray; + NSMutableDictionary *groupDict; + + groupDict = [NSMutableDictionary dictionary]; + + groupArray = [NSMutableArray array]; + for (group in children) { + [groupArray addObject: [group name]]; + } + + [groupDict setObject: name forKey: @"name"]; + [groupDict setObject: groupArray forKey: @"children"]; + + return [groupDict writeToFile: aFilename atomically: NO]; +} + +- (LiFileStore *)fileStore +{ + return theFileStore; +} + +- (void)setFileStore: (LiFileStore *)aFileStore +{ + [aFileStore retain]; + [theFileStore release]; + theFileStore = aFileStore; +} + +- (id)initWithCoder: (NSCoder *)coder +{ + NSString *typeString; + + self = [super init]; + + if ([coder allowsKeyedCoding]) { + [self setName: [coder decodeObjectForKey: @"name"]]; + typeString = [coder decodeObjectForKey: @"type"]; + children = [[coder decodeObjectForKey: @"children"] retain]; + } else { + [self setName: [coder decodeObject]]; + typeString = [coder decodeObject]; + children = [[coder decodeObject] retain]; + } + + if ([typeString isEqualToString: @"LEAF"]) + [self setType: LEAF]; + else + [self setType: BRANCH]; + + icon = [[NSImage imageNamed: LiNormalGroupIcon] retain]; + + return self; +} + +- (void)encodeWithCoder: (NSCoder *)coder +{ + NSString *typeString; + + if ([self type] == LEAF) + typeString = @"LEAF"; + else + typeString = @"BRANCH"; + + if ([coder allowsKeyedCoding]) { + [coder encodeObject: [self name] forKey: @"name"]; + [coder encodeObject: typeString forKey: @"type"]; + [coder encodeObject: children forKey: @"children"]; + } else { + [coder encodeObject: [self name]]; + [coder encodeObject: typeString]; + [coder encodeObject: children]; + } +} + +- (NSString *)name +{ + return name; +} + +- (GroupType)type +{ + return type; +} + +- (void)setName: (NSString *)aName +{ + [aName retain]; + [name release]; + name = aName; +} + +- (void)setType: (GroupType)aType +{ + type = aType; +} + +- (NSImage *)icon +{ + return icon; +} + +- (void)setIcon: (NSImage *)anIcon +{ + [anIcon retain]; + [icon release]; + icon = anIcon; +} + +- (Group *)parent +{ + return parent; +} + +- (void)setParent: (Group *)aParent +{ + [aParent retain]; + [parent release]; + parent = aParent; +} + +- (int)numberOfChildren +{ + return [children count]; +} + +- (BOOL)hasChild: (id)aChild +{ + return [children containsObject: aChild]; +} + +- (NSEnumerator *)childEnumerator +{ + return [children objectEnumerator]; +} + +- (void)addChild: (id)aChild +{ + [children addObject: aChild]; + [aChild setParent: self]; +} + +- (void)removeChild: (id)aChild +{ + [aChild setParent: nil]; + [children removeObject: aChild]; +} + +- (Group *)childNamed: (NSString *)aName +{ + Group *child; + int i, numberOfChildren; + + child = nil; + numberOfChildren = [children count]; + for (i = 0; i < numberOfChildren; i++) { + child = [children objectAtIndex: i]; + if ([[child name] isEqualToString: aName]) + break; + } + if (i < numberOfChildren) + return child; + return nil; +} + +- (void)removeChildNamed: (NSString *)aName +{ + int i, numberOfChildren; + + numberOfChildren = [children count]; + for (i = 0; i < numberOfChildren; i++) { + Group *child; + + child = [children objectAtIndex: i]; + if ([[child name] isEqualToString: aName]) + break; + } + if (i < numberOfChildren) + [children removeObjectAtIndex: i]; +} + +- (id)childAtIndex: (int)index +{ + return [children objectAtIndex: index]; +} + +- (void)removeChildAtIndex: (int)index +{ + [children removeObjectAtIndex: index]; +} +@synthesize children; +@synthesize theFileStore; +@end |