// // TaskManager.m // Task Views // // Created by Chris Karr on 2/18/09. // Copyright 2009 Chris J. Karr. All rights reserved. // #import "TaskManager.h" #import "AttributeValueFormatter.h" @implementation TaskManager @synthesize selectedAttributeType; - (void) awakeFromNib { [attributesTable setTarget:self]; [attributesTable setDoubleAction:@selector(editAttribute:)]; [[valueColumn dataCell] setFormatter:[[AttributeValueFormatter alloc] init]]; [tasks addObserver:self forKeyPath:@"selection" options:0 context:NULL]; } - (IBAction) newTask:(id)sender { NSMutableDictionary * task = [NSMutableDictionary dictionary]; [task setValue:@"New Task" forKey:@"name"]; [task setValue:@"Task Views" forKey:@"source"]; [task setValue:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:@"id"]; [tasks addObject:task]; [[NSNotificationCenter defaultCenter] postNotificationName:@"refresh_fields" object:nil]; } - (IBAction) removeTask:(id)sender { NSDictionary * selectedTask = [[tasks selectedObjects] lastObject]; NSString * title = [NSString stringWithFormat:@"Delete '%@'?", [selectedTask valueForKey:@"name"]]; NSString * message = [NSString stringWithFormat:@"Are you sure that you wish to delete the task '%@'?", [selectedTask valueForKey:@"name"]]; if (NSAlertDefaultReturn == NSRunAlertPanel(title, message, @"Yes", @"No", nil)) [tasks remove:sender]; } - (IBAction) editTask:(id)sender { [editWindow makeKeyAndOrderFront:sender]; } - (IBAction) addAttribute:(id)sender { [self willChangeValueForKey:@"currentTask"]; NSMutableDictionary * selectedTask = [[tasks selectedObjects] lastObject]; [selectedTask setValue:@"New Value" forKey:@"New Attribute"]; [self didChangeValueForKey:@"currentTask"]; for (NSDictionary * pair in [attributes arrangedObjects]) { if ([[pair valueForKey:@"key"] isEqualToString:@"New Attribute"]) [attributes setSelectedObjects:[NSArray arrayWithObject:pair]]; } [self editAttribute:sender]; } - (IBAction) removeAttribute:(id)sender { [attributes remove:sender]; } - (IBAction) editAttribute:(id)sender { if (![editWindow isVisible]) [editWindow makeKeyAndOrderFront:sender]; NSMutableDictionary * selectedTask = [[tasks selectedObjects] lastObject]; NSMutableDictionary * selectedAttribute = [[attributes selectedObjects] lastObject]; NSObject * value = [selectedTask valueForKey:[selectedAttribute valueForKey:@"key"]]; [self willChangeValueForKey:@"selectedAttributeType"]; if ([value isKindOfClass:[NSNumber class]]) { self.selectedAttributeType = @"Number"; [textField setStringValue:[value description]]; [numberField setStringValue:[value description]]; [listField setString:[value description]]; [dateField setDateValue:[NSDate date]]; } else if ([value isKindOfClass:[NSDate class]]) { self.selectedAttributeType = @"Date"; [dateField setDateValue:((NSDate *) value)]; [textField setStringValue:[value description]]; [listField setString:[value description]]; [numberField setStringValue:[value description]]; } else if ([value isKindOfClass:[NSArray class]]) { self.selectedAttributeType = @"List"; NSMutableString * string = [NSMutableString string]; for (id item in ((NSArray *) value)) { if (![string isEqualToString:@""]) [string appendString:@"\r"]; [string appendString:[item description]]; } [listField setString:string]; [textField setStringValue:string]; [numberField setStringValue:string]; [dateField setDateValue:[NSDate date]]; } else { self.selectedAttributeType = @"Text"; if (value == nil) value = @""; [textField setStringValue:[value description]]; [numberField setStringValue:[value description]]; [listField setString:[value description]]; [dateField setDateValue:[NSDate date]]; } [self didChangeValueForKey:@"selectedAttributeType"]; [NSApp beginSheet:attributePanel modalForWindow:editWindow modalDelegate:self didEndSelector:nil contextInfo:NULL]; } - (IBAction) finishAttributeEdit:(id)sender { [self willChangeValueForKey:@"currentTask"]; id value = nil; if ([self.selectedAttributeType isEqualToString:@"Date"]) value = [dateField dateValue]; else if ([self.selectedAttributeType isEqualToString:@"List"]) value = [[listField string] componentsSeparatedByString:@"\r"]; else if ([self.selectedAttributeType isEqualToString:@"Number"]) { NSScanner * scanner = [NSScanner scannerWithString:[numberField stringValue]]; double d = 0; if ([scanner scanDouble:&d]) value = [NSNumber numberWithDouble:d]; } else value = [textField stringValue]; if (value == nil) value = @""; NSMutableDictionary * selectedTask = [[tasks selectedObjects] lastObject]; NSMutableDictionary * selectedAttribute = [[attributes selectedObjects] lastObject]; [selectedTask setValue:value forKey:[selectedAttribute valueForKey:@"key"]]; [self didChangeValueForKey:@"currentTask"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"refresh_fields" object:nil]; [NSApp endSheet:attributePanel]; [attributePanel orderOut:self]; } - (NSMutableDictionary *) currentTask { if ([[tasks selectedObjects] count] > 0) return [[tasks selectedObjects] lastObject]; return nil; } - (void) setCurrentTask:(NSDictionary *) task { NSMutableDictionary * current = [self currentTask]; [current setDictionary:task]; } - (void) observeValueForKeyPath: (NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context { [self willChangeValueForKey:@"currentTask"]; [self didChangeValueForKey:@"currentTask"]; } @end