// // TopicsViewController.m // acidcow // // Created by Matthew Handler on 4/15/11. // Copyright 2011 Earl Industries. All rights reserved. // #import "TopicsViewController.h" #import "XMLParser.h" #import "Topic.h" #import "TopicTableViewCell.h" #import "AcidCowFeedburnerParser.h" #import "PhotoViewController.h" //#import "AsyncImageView.h" #import "HJObjManager.h" #import "HJManagedImageV.h" #import "SourcesEditViewController.h" @implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect { //NSLog(@"titlebar: %@", self.barStyle); if (self.barStyle == UIBarStyleDefault) { UIImage *image = [UIImage imageNamed: @"titleBarBackground.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } else { UIImage *image = [UIImage imageNamed: @"titleBarBackgroundBlack.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } //[super drawRect:rect]; } @end @implementation TopicsViewController @synthesize topics, parser, tableView; - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad"); self.tableView.rowHeight = 100; //UIBarButtonItem *doneItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(returnToParserChoices)] autorelease]; //self.navigationItem.rightBarButtonItem = doneItem; // Create the object manager objMan = [[HJObjManager alloc] initWithLoadingBufferSize:6 memCacheSize:20]; //if you are using for full screen images, you'll need a smaller memory cache than the defaults, //otherwise the cached images will get you out of memory quickly //objMan = [[HJObjManager alloc] initWithLoadingBufferSize:6 memCacheSize:1]; // Create a file cache for the object manager to use // A real app might do this durring startup, allowing the object manager and cache to be shared by several screens NSString* cacheDirectory = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches/imgcache/flickr/"] ; HJMOFileCache* fileCache = [[[HJMOFileCache alloc] initWithRootPath:cacheDirectory] autorelease]; objMan.fileCache = fileCache; // Have the file cache trim itself down to a size & age limit, so it doesn't grow forever fileCache.fileCountLimit = 100; fileCache.fileAgeLimit = 60*60*24*7; //1 week [fileCache trimCacheUsingBackgroundThread]; [self startParsing]; } //- (UINavigationController *)topicsNavigationController { // if (topicsNavigationController == nil) { // topicsNavigationController = [[UINavigationController alloc] initWithRootViewController:self.picDumpViewController]; // } // return topicsNavigationController; //} // //- (PicDumpViewController *)picDumpViewController { // if (picDumpViewController == nil) { // picDumpViewController = [[PicDumpViewController alloc] initWithNibName:@"PicDumpViewController" bundle:nil]; // } // return picDumpViewController; //} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return [topics count]; } - (void) sourcesEditViewControllerDidFinish:(SourcesEditViewController *)controller { [self dismissModalViewControllerAnimated:YES]; //[self _userIs:[controller getUserGenderString] heets:[controller getHeetGenderString]]; } - (void) showSources:(id)sender { SourcesEditViewController *controller = [[SourcesEditViewController alloc] initWithNibName:@"SourcesEditViewController" bundle:nil]; controller.delegate = self; controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; [controller release]; } - (PhotoViewController *)photoViewController { if (photoViewController == nil) { photoViewController = [[[PhotoViewController alloc] init] autorelease]; } return photoViewController; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state. } - (void)viewWillAppear:(BOOL)animated { NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; if (selectedRowIndexPath != nil) { [self.tableView deselectRowAtIndexPath:selectedRowIndexPath animated:NO]; } } - (void)startParsing { NSLog(@"startParsing"); //self.navigationItem.rightBarButtonItem.enabled = NO; // Reset the title //self.title = NSLocalizedString(@"Getting Recent Picdumps...", @"Loading"); // Allocate the array for song storage, or empty the results of previous parses if (topics == nil) { self.topics = [NSMutableArray array]; } else { [topics removeAllObjects]; [self.tableView reloadData]; } // Create the parser, set its delegate, and start it. self.parser = [[[AcidCowFeedburnerParser alloc] init] autorelease]; parser.delegate = self; [parser start]; } //- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath //{ // return 100; //} - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *kCellIdentifier = @"TopicTableViewCell"; TopicTableViewCell *cell = (TopicTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; HJManagedImageV* mi; HJManagedImageV* micon; if (cell == nil) { NSArray *tmpCell = [[NSBundle mainBundle] loadNibNamed:@"TopicTableViewCell" owner:self options:nil]; for (id currentObj in tmpCell) { if ([currentObj isKindOfClass:[TopicTableViewCell class]]) { cell = (TopicTableViewCell *)currentObj; break; } } micon = [[[HJManagedImageV alloc] initWithFrame:CGRectMake(105,72,16,16)] autorelease]; mi = [[[HJManagedImageV alloc] initWithFrame:CGRectMake(3,3,94,94)] autorelease]; mi.tag = 998; mi.tag = 999; [cell addSubview:micon]; [cell addSubview:mi]; } else { //Get a reference to the managed image view that was already in the recycled cell, and clear it micon = (HJManagedImageV*)[cell viewWithTag:998]; mi = (HJManagedImageV*)[cell viewWithTag:999]; [micon clear]; [mi clear]; } //cell.useDarkBackground = (indexPath.row % 2 == 0); cell.title = [[topics objectAtIndex:indexPath.row] title]; cell.picCount = [NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] picCount]]; //cell.iconUrl = [[topics objectAtIndex:indexPath.row] iconUrl]; // CGRect frame; // frame.size.width=94; frame.size.height=94; // frame.origin.x=3; frame.origin.y=3; // AsyncImageView* asyncImage = [[[AsyncImageView alloc] // initWithFrame:frame] autorelease]; // asyncImage.tag = 999; // NSURL* url = [imageDownload // thumbnailURLAtIndex:indexPath.row]; micon.url = [NSURL URLWithString:@"http://www.acidcow.com/favicon.ico"]; mi.url = [NSURL URLWithString:[[topics objectAtIndex:indexPath.row] iconUrl]]; mi.squareCropped = true; //tell the object manager to manage the managed image view, //this causes the cached image to display, or the image to be loaded, cached, and displayed [objMan manage:mi]; [objMan manage:micon]; // [asyncImage loadImageFromURL:url]; // [cell.contentView addSubview:asyncImage]; return cell; } - (void)tableView:(UITableView *)table didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // self.picDumpViewController.topic = [topics objectAtIndex:indexPath.row]; self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil]; // [self.navigationController pushViewController:picDumpViewController animated:YES]; // photoViewController = [[[PhotoViewController alloc] init] autorelease]; photoViewController.topic = [topics objectAtIndex:indexPath.row]; [self.navigationController pushViewController:photoViewController animated:YES]; } #pragma mark Implementation - (void)parserDidEndParsingData:(XMLParser *)parser { //self.title = [NSString stringWithFormat:NSLocalizedString(@"Recent Picdumps (%d)", @"Recent"), [topics count]]; [self.tableView reloadData]; //self.navigationItem.rightBarButtonItem.enabled = YES; self.parser = nil; } - (void)parser:(XMLParser *)parser didParseTopics:(NSArray *)parsedTopics { [topics addObjectsFromArray:parsedTopics]; // Three scroll view properties are checked to keep the user interface smooth during parse. When new objects are delivered // by the parser, the table view is reloaded to display them. If the table is reloaded while // the user is scrolling, this can result in eratic behavior. dragging, tracking, and decelerating can be checked // for this purpose. When the parser finishes, reloadData will be called in parserDidEndParsingData:, guaranteeing // that all data will ultimately be displayed even if reloadData is not called in this method because of user interaction. if (!self.tableView.dragging && !self.tableView.tracking && !self.tableView.decelerating) { //self.title = [NSString stringWithFormat:NSLocalizedString(@"Recent Picdumps (%d)", @"Recent"), [topics count]]; [self.tableView reloadData]; } } - (void)parser:(XMLParser *)parser didFailWithError:(NSError *)error { // handle errors as appropriate to your application... } #pragma mark - #pragma mark View lifecycle /* - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; } */ /* - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } */ /* - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } */ /* - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } */ /* - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } */ /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ #pragma mark - #pragma mark Table view data source //- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // // Return the number of sections. // return <#number of sections#>; //} // // //- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // // Return the number of rows in the section. // return <#number of rows in section#>; //} // Customize the appearance of table view cells. //- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // // static NSString *CellIdentifier = @"Cell"; // // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // if (cell == nil) { // cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; // } // // // Configure the cell... // // return cell; //} /* // 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:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } 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. } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ #pragma mark - #pragma mark Table view delegate //- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // // Navigation logic may go here. Create and push another view controller. // /* // <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; // // ... // // Pass the selected object to the new view controller. // [self.navigationController pushViewController:detailViewController animated:YES]; // [detailViewController release]; // */ //} #pragma mark - #pragma mark Memory management - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Relinquish ownership any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. // For example: self.myOutlet = nil; } - (void)dealloc { [objMan release]; [topics release]; //[detailController release]; [parser release]; [super dealloc]; } @end