From 9d52266f823daf5cb83e3eebe1b9f57594bc9d4a Mon Sep 17 00:00:00 2001 From: matt handler Date: Wed, 20 Apr 2011 14:39:20 -0400 Subject: first commit --- Classes/TopicsViewController.m | 380 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 Classes/TopicsViewController.m (limited to 'Classes/TopicsViewController.m') diff --git a/Classes/TopicsViewController.m b/Classes/TopicsViewController.m new file mode 100644 index 0000000..ab07416 --- /dev/null +++ b/Classes/TopicsViewController.m @@ -0,0 +1,380 @@ +// +// 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" + + +@implementation TopicsViewController + +@synthesize topics, parser; + +- (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; +} + +- (PhotoViewController *)photoViewController { + if (photoViewController == nil) { + photoViewController = [[[PhotoViewController alloc] init] autorelease]; + } + return photoViewController; +} + +//- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { +// +// self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; +// if (self) { +// // Initialization code. +// } +// return self; +//} + + +- (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]; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [topics count]; +} + +//- (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 + -- cgit v1.2.3