diff --git a/IGKPreferencesController.h b/IGKPreferencesController.h index 618f1b2..8a3ffe6 100644 --- a/IGKPreferencesController.h +++ b/IGKPreferencesController.h @@ -23,6 +23,9 @@ IBOutlet NSView *updatesView; IBOutlet NSToolbarItem *updatesToolbarItem; + + NSMutableArray *developerDirectories; + NSMutableArray *docsets; } - (NSManagedObjectContext *)managedObjectContext; diff --git a/IGKPreferencesController.m b/IGKPreferencesController.m index 5a20b0b..9f001b2 100644 --- a/IGKPreferencesController.m +++ b/IGKPreferencesController.m @@ -20,13 +20,15 @@ - (id)init { if (self = [super initWithWindowNibName:@"IGKPreferences"]) { - + developerDirectories = [[NSMutableArray alloc] init]; + docsets = [[NSMutableArray alloc] init]; } return self; } - (void)windowDidLoad { + [self reloadTableViews]; [self switchToView:generalView item:generalToolbarItem animate:NO]; } - (void)showWindow:(id)sender @@ -81,29 +83,96 @@ - (void)switchToView:(NSView *)view item:(NSToolbarItem *)toolbarItem animate:(B [[self window] setFrame:newWindowFrame display:YES animate:animate]; } +- (void)reloadTableViews +{ + if ([[NSUserDefaults standardUserDefaults] valueForKey:@"developerDirectories"]) + developerDirectories = [[NSUserDefaults standardUserDefaults] valueForKey:@"developerDirectories"]; + + if ([[NSUserDefaults standardUserDefaults] valueForKey:@"docsets"]) + docsets = [[NSUserDefaults standardUserDefaults] valueForKey:@"docsets"]; + + [developerDirectoriesTableView reloadData]; + [docsetsTableView reloadData]; +} #pragma mark Docsets Logic - (IBAction)addDeveloperDirectory:(id)sender { NSOpenPanel *openPanel = [NSOpenPanel openPanel]; + [openPanel setCanChooseFiles:NO]; + [openPanel setCanChooseDirectories:YES]; - [openPanel runModal]; + [openPanel beginWithCompletionHandler:^(NSInteger result) { + if (result != NSFileHandlingPanelOKButton) + return; + + NSString *path = [[openPanel URL] path]; + + //Sanity check path. If it really is a Developer directory, it should have a Library/version.plist + NSString *versionPlistPath = [path stringByAppendingPathComponent:@"Library/version.plist"]; + BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:versionPlistPath]; + if (!exists) + { + NSBeep(); + return; + } + + NSMutableDictionary *devDir = [[NSMutableDictionary alloc] init]; + [devDir setValue:path forKey:@"path"]; + + [developerDirectories addObject:devDir]; + [self saveChanges]; + + [self reloadTableViews]; + }]; } - (IBAction)removeSelectedDeveloperDirectories:(id)sender { + NSIndexSet *selectedIndicies = [developerDirectoriesTableView selectedRowIndexes]; + if ([selectedIndicies count] >= [developerDirectories count]) + { + NSAlert *alert = [NSAlert alertWithMessageText:@"Are you sure you want to remove all developer directories?" defaultButton:@"Remove" alternateButton:@"Don't Remove" otherButton:nil informativeTextWithFormat:@"No documentation will be visible."]; + [alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:@selector(removeLastAlertDidEnd:returnCode:contextInfo:) contextInfo:nil]; + } + else + { + [self removeSelectedDeveloperDirectories]; + } +} +- (void)removeLastAlertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + if (returnCode == NSAlertDefaultReturn) + { + [self removeSelectedDeveloperDirectories]; + } +} +- (void)removeSelectedDeveloperDirectories +{ + NSIndexSet *selectedIndicies = [developerDirectoriesTableView selectedRowIndexes]; + [developerDirectories removeObjectsAtIndexes:selectedIndicies]; + [self saveChanges]; + + [self reloadTableViews]; +} + +- (void)saveChanges +{ + [[NSUserDefaults standardUserDefaults] setValue:developerDirectories forKey:@"developerDirectories"]; + [[NSUserDefaults standardUserDefaults] setValue:docsets forKey:@"docsets"]; + [[NSUserDefaults standardUserDefaults] synchronize]; } - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { if (tableView == developerDirectoriesTableView) { - return 3; + return [developerDirectories count]; } else if (tableView == docsetsTableView) { - return 3; + return [docsets count]; } return 0; @@ -112,32 +181,36 @@ - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColum { if (tableView == developerDirectoriesTableView) { + NSString *path = [[developerDirectories objectAtIndex:row] valueForKey:@"path"]; if ([[tableColumn identifier] isEqual:@"icon"]) { - return [NSImage imageNamed:@"NSComputer"]; + //FIXME: We need proper icons for docsets and developer directories + return [[NSWorkspace sharedWorkspace] iconForFile:path]; } else if ([[tableColumn identifier] isEqual:@"path"]) { - return @"~/Foo"; + return path; } } else if (tableView == docsetsTableView) { + NSDictionary *docset = [docsets objectAtIndex:row]; + if ([[tableColumn identifier] isEqual:@"isEnabled"]) { - return [NSNumber numberWithBool:(row % 2) == 0]; + return [docset valueForKey:@"isEnabled"]; } else if ([[tableColumn identifier] isEqual:@"icon"]) { - return [NSImage imageNamed:@"NSComputer"]; + return [[NSWorkspace sharedWorkspace] iconForFile:[docset valueForKey:@"path"]]; } else if ([[tableColumn identifier] isEqual:@"name"]) { - return @"Mac"; + return [docset valueForKey:@"name"]; } else if ([[tableColumn identifier] isEqual:@"developerDirectory"]) { - return @"~/Foo"; + return [docset valueForKey:@"developerDirectoryPath"]; } } @@ -145,13 +218,18 @@ - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColum } - (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - if (tableView == developerDirectoriesTableView) - { - - } - else if (tableView == docsetsTableView) + if (tableView == docsetsTableView) { - + if ([[tableColumn identifier] isEqual:@"isEnabled"]) + { + NSDictionary *docset = [[docsets objectAtIndex:row] mutableCopy]; + [docset setValue:[NSNumber numberWithBool:[object boolValue]] forKey:@"isEnabled"]; + + [docsets replaceObjectAtIndex:row withObject:docset]; + [self saveChanges]; + + [self reloadTableViews]; + } } }