Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
// // FriendsTimelineController.m // Twitterena // // Created by Andy on 4/06/09 // Copyright 2009 Andrew.Weekes.com. All rights reserved. // #import "FriendsTimelineController.h" #import "FriendsTimelineDataSource.h" #import "TwitterenaAppDelegate.h" #import "ColorUtils.h" @interface FriendsTimelineController (Private) - (void)scrollToFirstUnread; - (void)didLeaveTab:(UINavigationController*)navigationController; @end @implementation FriendsTimelineController // // UIViewController methods // - (void)viewDidLoad { if (!isLoaded) { [self loadTimeline]; } } - (void) dealloc { [super dealloc]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView setContentOffset:contentOffset animated:false]; [self.tableView reloadData]; self.navigationController.navigationBar.tintColor = [UIColor navigationColorForTab:tab]; self.tableView.separatorColor = [UIColor lightGrayColor]; } - (void)viewDidAppear:(BOOL)animated { if (firstTimeToAppear) { firstTimeToAppear = false; [self scrollToFirstUnread]; } [super viewDidAppear:animated]; if (stopwatch) { LAP(stopwatch, @"viewDidAppear"); [stopwatch release]; stopwatch = nil; } } - (void)viewWillDisappear:(BOOL)animated { contentOffset = self.tableView.contentOffset; } - (void)viewDidDisappear:(BOOL)animated { } - (void)didReceiveMemoryWarning { #if 0 TwitterenaAppDelegate *appDelegate = (TwitterenaAppDelegate*)[UIApplication sharedApplication].delegate; if (appDelegate.selectedTab != [self navigationController].tabBarItem.tag) { [super didReceiveMemoryWarning]; } #endif } // // Public methods // - (void)loadTimeline { NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"username"]; NSString *password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"]; if ([username length] != 0 && [password length] != 0) { self.navigationItem.leftBarButtonItem.enabled = false; [timelineDataSource getTimeline]; } isLoaded = true; } - (void)restoreAndLoadTimeline:(BOOL)load { firstTimeToAppear = true; stopwatch = [[Stopwatch alloc] init]; tab = [self navigationController].tabBarItem.tag; timelineDataSource = [[FriendsTimelineDataSource alloc] initWithController:self tweetType:tab]; self.tableView.dataSource = timelineDataSource; self.tableView.delegate = timelineDataSource; if (load) [self loadTimeline]; } - (IBAction) reload:(id) sender { self.navigationItem.leftBarButtonItem.enabled = false; [timelineDataSource getTimeline]; } - (void)autoRefresh { [self reload:nil]; } // sound notification -(void)playSound {BOOL flag = [[NSUserDefaults standardUserDefaults] boolForKey:@"tweetsounds"]; if (flag == false) return; {itootSound *mentionssound = [[itootSound alloc] initWithFileName:@"mentionssound.aif"]; [mentionssound play]; }} - (void)postViewAnimationDidFinish { if (self.navigationController.topViewController != self) return; if (tab == TAB_FRIENDS) { // // Do animation if the controller displays friends timeline or sent direct messages. // NSArray *indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:0 inSection:0], nil]; [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop, [self playSound]]; [self.tableView endUpdates]; } } - (void)postTweetDidSucceed:(Status*)status { if (tab == TAB_FRIENDS) { [timelineDataSource.timeline insertStatus:status atIndex:0]; } } // // TwitterenaApPDelegate delegate // - (void)didLeaveTab:(UINavigationController*)navigationController { navigationController.tabBarItem.badgeValue = nil; for (int i = 0; i < [timelineDataSource.timeline countStatuses]; ++i) { Status* sts = [timelineDataSource.timeline statusAtIndex:i]; sts.unread = false; } unread = 0; } - (void) removeStatus:(Status*)status { [timelineDataSource.timeline removeStatus:status]; [self.tableView reloadData]; } - (void) updateFavorite:(Status*)status { [timelineDataSource.timeline updateFavorite:status]; } - (void)scrollToFirstUnread { BOOL flag = [[NSUserDefaults standardUserDefaults] boolForKey:@"autoScrollToFirstUnread"]; if (flag == false) return; if (unread) { if (unread < [timelineDataSource.timeline countStatuses]) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:unread inSection:0]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition: UITableViewScrollPositionBottom animated:true]; } } } // // TimelineDelegate // - (void)timelineDidUpdate:(FriendsTimelineDataSource*)sender count:(int)count insertAt:(int)position { self.navigationItem.leftBarButtonItem.enabled = true; if (self.navigationController.tabBarController.selectedIndex == tab && self.navigationController.topViewController == self) { [self.tableView beginUpdates]; if (position) { NSMutableArray *deletion = [[[NSMutableArray alloc] init] autorelease]; [deletion addObject:[NSIndexPath indexPathForRow:position inSection:0]]; [self.tableView deleteRowsAtIndexPaths:deletion withRowAnimation:UITableViewRowAnimationBottom]; } if (count != 0) { NSMutableArray *insertion = [[[NSMutableArray alloc] init] autorelease]; int numInsert = count; // Avoid to create too many table cell. if (numInsert > 8) numInsert = 8; for (int i = 0; i < numInsert; ++i) { [insertion addObject:[NSIndexPath indexPathForRow:position + i inSection:0]]; } [self.tableView insertRowsAtIndexPaths:insertion withRowAnimation:UITableViewRowAnimationTop]; } [self.tableView endUpdates]; if (position == 0 && unread == 0) { [self performSelector:@selector(scrollToFirstUnread) withObject:nil afterDelay:0.4]; } } if (count) { unread += count; [self navigationController].tabBarItem.badgeValue = [NSString stringWithFormat:@"%d", unread]; } } - (void)timelineDidFailToUpdate:(FriendsTimelineDataSource*)sender position:(int)position { self.navigationItem.leftBarButtonItem.enabled = true; } @end
This paste will be private.
From the Design Piracy series on my blog: