// // EspagramLessonViewController.m // Espagram // // Created by Abel Fokkinga on 11/12/12. // Copyright (c) 2012 Abel Fokkinga. All rights reserved. // #import "EspagramLessonViewController.h" #import "Lesson+Create.h" #import "Lesson+Conjugator.h" #import "Verb+Create.h" #import "EspagramTestViewController.h" @interface EspagramLessonViewController () @property UITabBarController * tabBarController; @property (strong,nonatomic) UIPopoverController *myPopover; @end @implementation EspagramLessonViewController @synthesize lessonsDatabase = _lessonsDatabase; @synthesize lesson = _lesson; @synthesize conjugator = _conjugator; @synthesize tense = _tense; @synthesize tabBarController = _tabBarController; @synthesize myPopover = _myPopover; - (IBAction)AddButtonPressed:(id)sender { NSLog(@"Selected lesson %@", self.lesson.title); [self performSegueWithIdentifier:@"Add A Word To Lesson" sender:self]; } // Only reached on iPhone - (void) addWord:(NSString *)word withMeaning:(NSString *)meaning{ if ( word ) { NSLog(@"Selected lesson %@", self.lesson.title); [Verb addVerb:word andMeaning:meaning toLesson:self.lesson]; } [[self parentViewController] dismissViewControllerAnimated:TRUE completion:^{ NSLog(@"Word added"); }]; if ( self.lesson.verbs.count > 0 && self.tabBarController ) { // Words in lesson, enable tabs NSArray *tabItems = self.tabBarController.tabBar.items; for (UIBarItem *tabItem in tabItems) { [tabItem setEnabled:true]; } } } - (NSString *) searchWordMeaning:(NSString *)word { if ( word ) { Verb * v= [Verb searchWordMeaning:word usingLessonLanguage:self.lesson]; return v.meaning; } return nil; }; // Only reached on iPhone - (void) cancelAddingWord{ [[self parentViewController] dismissViewControllerAnimated:TRUE completion:^{ NSLog(@"Adding a word cancelled"); }]; } - (IBAction)addLessonButtonPressed:(id)sender { [self performSegueWithIdentifier:@"Add new Lesson" sender:self]; } - (void) addLesson:(NSString*)title withDescription:(NSString*) subTitle { if ( self.myPopover ) { // On iPad. Dismiss the pop over [[self myPopover] dismissPopoverAnimated:TRUE]; self.myPopover = nil; } else { // On iPhone [[self parentViewController] dismissViewControllerAnimated:TRUE completion:^{ }]; } NSLog(@"database %@, context %@", self.lessonsDatabase,[self.lessonsDatabase managedObjectContext]); [Lesson addLessonWithTitle:title andSubTitle:subTitle inTense:self.tense conjugatedBy:self.conjugator inManagedObjectContext:[self.lessonsDatabase managedObjectContext]]; [self.lessonsDatabase saveToURL:self.lessonsDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]; } - (void) cancelLesson{ if ( self.myPopover ) { // On iPad. Dismiss the pop over [[self myPopover] dismissPopoverAnimated:TRUE]; self.myPopover = nil; } else { // On iPhone [[self parentViewController] dismissViewControllerAnimated:TRUE completion:^{ }]; } } #pragma mark - View lifecycle - (void) setupFetchedResultsController{ NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Lesson"]; self.debug = TRUE; // Where clause request.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:[NSPredicate predicateWithFormat:@"tense = %@", self.tense.tense], [NSPredicate predicateWithFormat:@"conjugator = %@", [self.conjugator description]],nil]]; request.sortDescriptors = [[NSArray alloc] initWithObjects:[[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE], nil]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.lessonsDatabase.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; } - (void) createDocument { [self.lessonsDatabase saveToURL:self.lessonsDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL succes){ NSLog(@"Created lessons database"); }]; } - (void) useDocument { if (![[NSFileManager defaultManager] fileExistsAtPath:[self.lessonsDatabase.fileURL path]]) { NSLog(@"No database exists"); [self createDocument]; [self fetchedResultsController]; } else if (self.lessonsDatabase.documentState == UIDocumentStateClosed){ [self.lessonsDatabase openWithCompletionHandler:^(BOOL succes){ NSLog(@"Opened lessons database"); [self setupFetchedResultsController]; }]; } else if (self.lessonsDatabase.documentState == UIDocumentStateNormal) { [self setupFetchedResultsController]; } } - (void) setLessonsDatabase:(UIManagedDocument *)lessonsDatabase{ if ( _lessonsDatabase != lessonsDatabase ) { _lessonsDatabase = lessonsDatabase; [self useDocument]; } } -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { } - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; if ( self.splitViewController) { // self.title = NSLocalizedString([@"TENSE_" stringByAppendingString:self.tense.tense], nil); self.title = [self.tense getTenseInLanguage:[self.conjugator description]]; } else { NSLocalizedString(@"Lessons title",@"Lessons title"); } if (!self.lessonsDatabase) { // We'll create a default database if none is set NSFileManager * fileManager = [NSFileManager defaultManager]; NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject] URLByAppendingPathComponent: @"Default Espagram database"]; NSLog(@"DB url: %@", storeURL.path); if (![fileManager fileExistsAtPath:storeURL.path]) { NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Default Espagram database" ofType:@"sqlite"]; //NSString *defaultStorePath = [[[NSBundle mainBundle] resourcePath] // stringByAppendingPathComponent:@"Default Espagram database"]; if ( [fileManager fileExistsAtPath:defaultStorePath]) { NSLog(@"Default DB present in app"); NSError *error; [fileManager copyItemAtPath:defaultStorePath toPath:storeURL.path error:&error]; NSLog(@"%@",error.debugDescription ); } } NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject]; url = [url URLByAppendingPathComponent:@"Default Espagram database"]; UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; doc.persistentStoreOptions = options; self.lessonsDatabase = doc; } } - (void)viewDidUnload { [super viewDidUnload]; [self.lessonsDatabase closeWithCompletionHandler:^(BOOL success) { NSLog(@"Database closed"); }]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Lesson cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; Lesson *lesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; NSLog(@"Showing lesson: %@", lesson.title); cell.textLabel.text = lesson.title; NSString * lessonDescription = lesson.subTitle; if (lessonDescription.length == 0 && [lesson.verbs count] > 0 ) { for ( Verb * v in lesson.verbs) { if (lessonDescription.length == 0) { lessonDescription = v.verb; } else { lessonDescription = [[lessonDescription stringByAppendingString:@", "] stringByAppendingString:v.verb]; if ( lessonDescription.length > 50) break; } } } cell.detailTextLabel.text = lessonDescription; return cell; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [segue.identifier isEqualToString:@"Testing"]){ NSLog(@"Preparing for segue Testing"); NSIndexPath * indexPath = [self.tableView indexPathForCell:sender]; self.lesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; if ([segue.destinationViewController respondsToSelector:@selector(setConjugator:)]) { [segue.destinationViewController setConjugator:self.conjugator]; } if ([segue.destinationViewController respondsToSelector:@selector(setLesson:)]) { [segue.destinationViewController setLesson:self.lesson]; [segue.destinationViewController setTitle:self.lesson.title]; } } if ( [segue.identifier isEqualToString:@"Testing Tab Bar"]){ NSLog(@"Preparing for segue Testing Tab Bar"); NSIndexPath * indexPath = [self.tableView indexPathForCell:sender]; self.lesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; if ([segue.destinationViewController respondsToSelector:@selector(setDelegate:)]) { [segue.destinationViewController setDelegate:self]; [segue.destinationViewController setTitle:self.lesson.title]; UIBarButtonItem * rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddButtonPressed:)]; UIViewController *rootViewController = segue.destinationViewController; rootViewController.navigationItem.rightBarButtonItem = rightButton; } self.tabBarController = segue.destinationViewController; if ( self.lesson.verbs.count == 0 ) { // No words in lesson.. disable tabs NSArray *tabItems = self.tabBarController.tabBar.items; for (UIBarItem *tabItem in tabItems) { [tabItem setEnabled:false]; } } for ( id vc in [self.tabBarController viewControllers] ) { if ( [vc respondsToSelector:@selector(setLesson:)]) { [vc setLesson:self.lesson]; } UIViewController *tvc= (UIViewController *)vc; NSLog(@"title = %@",tvc.title); if ( [tvc.title isEqualToString:@"Verb"]) tvc.title = NSLocalizedString(@"Verbs List",@"List of verbs"); else if ( [tvc.title isEqualToString:@"Multiple Choice"]) tvc.title = NSLocalizedString(@"Multiple Choice",@"Multiple Choice test"); else if ( [tvc.title isEqualToString:@"Typing Test"]) tvc.title = NSLocalizedString(@"Typing", @"Typing test"); } } if ( [segue.identifier isEqualToString:@"Show Words In Lesson"]){ NSIndexPath * indexPath = [self.tableView indexPathForCell:sender]; self.lesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; NSLog(@"Preparing for segue Show Words In Lesson"); if ([segue.destinationViewController respondsToSelector:@selector(setLesson:)]) { [segue.destinationViewController setLesson:self.lesson]; } } if ( [segue.identifier isEqualToString:@"Add new Lesson"]){ NSLog(@"Preparing for segue Add new Lesson"); [segue.destinationViewController setDataSource:self]; if ( self.splitViewController ) { // On iPad, we want to store the pointer to the popOver self.myPopover = [(UIStoryboardPopoverSegue *)segue popoverController]; } } if ( [segue.identifier isEqualToString:@"Add A Word To Lesson"]) { [segue.destinationViewController setDataSource:self]; } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"Testing Tab Bar" sender:[self.tableView cellForRowAtIndexPath:indexPath]]; // [self performSegueWithIdentifier:@"Testing" sender:[self.tableView cellForRowAtIndexPath:indexPath]]; } - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"Show Words In Lesson" sender:[self.tableView cellForRowAtIndexPath:indexPath]]; } // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; Lesson * selectedLesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; [[self.lessonsDatabase managedObjectContext] deleteObject:selectedLesson]; } // else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view // } } @end