390 lines
14 KiB
Objective-C
390 lines
14 KiB
Objective-C
//
|
|
// 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
|