Advertisement
shubhamgoyal

ArticleViewController

Jan 9th, 2013
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  ViewController.m
  3. //  RenderTextDemo
  4. //
  5. //  Created by Shubham Goyal on 10/3/12.
  6. //  Copyright (c) 2012 [email protected]. All rights reserved.
  7. //
  8.  
  9. #import "ArticleViewController.h"
  10. #import "CommentsWidgetViewController.h"
  11. #import "RatingWidgetViewController.h"
  12. #import "RelatedArticlesWidgetViewController.h"
  13. #import "SDURLCache.h"
  14.  
  15. #define BAR_HEIGHT 60
  16. #define IPAD_HEIGHT 748
  17. #define IPAD_WIDTH 1024
  18. #define ANIMATION_DURATION 0.5
  19. #define PADDING 50
  20.  
  21. #define articleURLFormat @"http://ec2-175-41-180-218.ap-southeast-1.compute.amazonaws.com/article/list_article_content/%u"
  22. #define themeURLFormat @"http://ec2-175-41-180-218.ap-southeast-1.compute.amazonaws.com/publisher/get_theme/%u"
  23. #define kJSONThemeKey @"data"
  24. #define kJSONSuccessKey @"success"
  25. #define kJSONErrorMessageKey @"error_msg"
  26.  
  27. @interface ArticleViewController ()
  28.  
  29. #pragma mark - Network
  30.  
  31. @property (strong, nonatomic) NSMutableData *receivedThemeData;
  32. @property (strong, nonatomic) NSMutableData *receivedArticleData;
  33.  
  34. @end
  35.  
  36. @implementation ArticleViewController
  37.  
  38. @synthesize publisherId;
  39. @synthesize articleId;
  40.  
  41. @synthesize pages;
  42. @synthesize pageNumber = _pageNumber;
  43.  
  44. - (void)setPageNumber: (NSUInteger) aPageNumber {
  45.     _pageNumber = aPageNumber;
  46.     [[NSNotificationCenter defaultCenter] postNotificationName:@"pageNumberSet" object:@"nil"];
  47. }
  48.  
  49. @synthesize pageViews;
  50. @synthesize pageViewContainer;
  51.  
  52. @synthesize comments;
  53. @synthesize rating;
  54. @synthesize relatedArticles;
  55. @synthesize images;
  56. @synthesize numberOfStars;
  57.  
  58. @synthesize bar;
  59. @synthesize ratingButton;
  60. @synthesize isRatingButtonClicked;
  61. @synthesize commentsButton;
  62. @synthesize relatedArticlesButton;
  63.  
  64. @synthesize curtain;
  65. @synthesize thumbnailContentView;
  66. @synthesize thumbnailScrollView;
  67.  
  68. @synthesize headerView;
  69. @synthesize themeModel;
  70.  
  71. @synthesize receivedThemeData;
  72. @synthesize receivedArticleData;
  73.  
  74. #pragma mark - Custom initialization
  75.  
  76. - (id) initWithCoder:(NSCoder *)aDecoder {
  77.     if (self = [super initWithCoder: aDecoder]) {
  78.         pages = [NSMutableArray array];
  79.         pageViews = [NSMutableArray array];
  80.     }
  81.    
  82.     return self;
  83. }
  84.  
  85. #pragma mark - Page layout
  86.  
  87. + (LayoutType) layoutTypeFromString: (NSString*) aLayoutTypeString {
  88.     if ([aLayoutTypeString isEqualToString: @"TWO_COLUMN"]) {
  89.         return TWO_COLUMN;
  90.     } else if ([aLayoutTypeString isEqualToString: @"THREE_COLUMN"]) {
  91.         return THREE_COLUMN;
  92.     } else if ([aLayoutTypeString isEqualToString: @"TWO_COLUMN_IMAGE"]) {
  93.         return TWO_COLUMN_IMAGE;
  94.     } else if ([aLayoutTypeString isEqualToString: @"TWO_COLUMN_VIDEO"]) {
  95.         return TWO_COLUMN_VIDEO;
  96.     } else {
  97.         // TODO: Should not crash like this
  98.         // @throw [NSException exceptionWithName: NSGenericException reason: @"Unexpected LayoutType string" userInfo: nil];
  99.         return DEFAULT_LAYOUT;
  100.     }
  101. }
  102.  
  103. - (void) applyLayout:(LayoutType)layoutType toView:(UIView*)view pageData: (NSDictionary*) aPage {
  104.     switch (layoutType) {
  105.         case TWO_COLUMN:
  106.         case THREE_COLUMN:
  107.             break;
  108.         case TWO_COLUMN_IMAGE:
  109.             [self putImageWidgetInView: view pageData: aPage];
  110.             break;
  111.         case TWO_COLUMN_VIDEO:
  112.             [self putVideoInView: view pageData: aPage];
  113.             break;
  114.         default:
  115.             DLog(@"/!\\ WARNING!!! Bad LayoutType input")
  116.             break;
  117.     }
  118. }
  119.  
  120. #define kYouTubeVideoHTMLFormat @"<embed src=\"%@\" type=\"application/x-shockwave-flash\" width=\"%f\" height=\"%f\"></embed>"
  121.  
  122. - (void) putVideoInView:(UIView*)view pageData: (NSDictionary*) aPage {
  123.     UIWebView* video = [[UIWebView alloc] initWithFrame:CGRectMake(530, 155, 470, 345)];
  124.     video.scrollView.scrollEnabled = NO;
  125.     // TODO: Currently the server doesn't support video on other pages. Add support later.
  126.     NSString* urlString = [aPage objectForKey: @"video"];
  127.     NSString *html = [NSString stringWithFormat: kYouTubeVideoHTMLFormat, urlString, video.frame.size.width, video.frame.size.height];
  128.     [video loadHTMLString:html baseURL:nil];
  129.     [view addSubview:video];
  130. }
  131.  
  132. #define serverBaseURL @"http://ec2-175-41-180-218.ap-southeast-1.compute.amazonaws.com/"
  133.  
  134. - (void) putImageWidgetInView: (UIView*) view pageData: (NSDictionary*) aPage {
  135.     // TODO: Currently the server doesn't support image on other pages. Add support later.
  136.     NSArray *imageURLStrings = [aPage objectForKey: @"images"];
  137.     DLog(@"imageURLStrings: %@", imageURLStrings);
  138.     NSMutableArray *imageURLs = [NSMutableArray array];
  139.    
  140.     for (NSString *URLString in imageURLStrings) {
  141.         DLog(@"%@", [serverBaseURL stringByAppendingPathComponent:URLString])
  142.        
  143.         NSString *imageURLString = [serverBaseURL stringByAppendingString: [URLString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
  144.  
  145.         NSURL *imageURL = [NSURL URLWithString: imageURLString];
  146.         if (imageURL) {
  147.             DLog(@"%@", imageURL);
  148.             [imageURLs addObject: imageURL];
  149.         } else {
  150.             DLog(@"Failed to create URL for: %@", imageURLString);
  151.         }
  152.     }
  153.  
  154.     self.images = [ImageWidgetViewController createImageWidgetWithImageURLs: [NSArray arrayWithArray:imageURLs] frame: CGRectMake(530, 155, 470, 345) fullScreenSuperview: self.view];
  155.     // TODO: When to remove the child view controller?
  156.     // TODO: Check if we need to add as child VC
  157.     [self addChildViewController: self.images];
  158.     [view addSubview: self.images.view];
  159. }
  160.  
  161. #pragma mark - Theme
  162.  
  163. - (void) parseTheme: (NSData*) aData {
  164.     NSError* jsonParsingError = nil;
  165.     NSDictionary* responseJSON = [NSJSONSerialization JSONObjectWithData: aData options: kNilOptions error: &jsonParsingError];
  166.    
  167.     assert(responseJSON == nil ^ jsonParsingError == nil);
  168.     if (jsonParsingError) {
  169.         DLog(@"JSON parsing error: %@", jsonParsingError.debugDescription);
  170.         DLog(@"Data dump: %@", [[NSString alloc] initWithData: aData encoding: NSUTF8StringEncoding]);
  171.         return;
  172.     }
  173.     assert([responseJSON isKindOfClass: [NSDictionary class]]);
  174.    
  175.     BOOL isSuccess = [(NSNumber*) [responseJSON valueForKey: kJSONSuccessKey] boolValue];
  176.     if (!isSuccess) {
  177.         DLog(@"Error encountered on server: %@", [responseJSON valueForKey: kJSONErrorMessageKey]);
  178.         DLog(@"Data dump: %@",  [[NSString alloc] initWithData: aData encoding: NSUTF8StringEncoding]);
  179.         return;
  180.     }
  181.    
  182.     NSDictionary* themeImages = [responseJSON valueForKey: kJSONThemeKey];
  183.     assert(themeImages && [themeImages isKindOfClass: [NSDictionary class]]);
  184.     self.themeModel = [[ThemeModel alloc] initWithDictionary: themeImages];
  185. }
  186.  
  187. - (void) loadTheme {
  188.     NSURL* themeURL = [[NSURL alloc] initWithString: [NSString stringWithFormat: themeURLFormat, self.publisherId]];
  189.     NSURLRequest *themeRequest = [[NSURLRequest alloc] initWithURL: themeURL cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval: 60.];
  190.    
  191.     NSURLConnection *themeConnection = [[NSURLConnection alloc] initWithRequest:themeRequest delegate:self];
  192.     if (themeConnection) {
  193.         self.receivedThemeData = [NSMutableData data];
  194.     }
  195. }
  196.  
  197. - (void) updateHeader {
  198.     self.headerView.image = self.themeModel.primaryHeader;
  199. }
  200.  
  201. #pragma mark - Article
  202.  
  203. #define kJSONContentKey @"content"
  204. #define kJSONLayoutTypeKey @"layoutType"
  205. #define kInsertCSSFormatString @"<style type=\"text/css\">h1,h2,h3,h4,h5 {color: %@;}</style>"
  206.  
  207. - (void) parseArticle: (NSData*) aData {
  208.     NSError* jsonParsingError = nil;
  209.     NSDictionary* responseJSON = [NSJSONSerialization JSONObjectWithData: aData options: kNilOptions error: &jsonParsingError];
  210.    
  211.     assert(responseJSON == nil ^ jsonParsingError == nil);
  212.     if (jsonParsingError) {
  213.         DLog(@"JSON parsing error: %@", jsonParsingError.debugDescription);
  214.         DLog(@"Data dump: %@", [[NSString alloc] initWithData: aData encoding: NSUTF8StringEncoding]);
  215.         return;
  216.     }
  217.     assert([responseJSON isKindOfClass: [NSDictionary class]]);
  218.    
  219.     BOOL isSuccess = [(NSNumber*) [responseJSON valueForKey: kJSONSuccessKey] boolValue];
  220.     if (!isSuccess) {
  221.         DLog(@"Error encountered on server: %@", [responseJSON valueForKey: kJSONErrorMessageKey]);
  222.         DLog(@"Data dump: %@",  [[NSString alloc] initWithData: aData encoding: NSUTF8StringEncoding]);
  223.         return;
  224.     }
  225.    
  226.     NSArray *data_ = [responseJSON objectForKey: @"data"];
  227.     NSDictionary *obj = [data_ objectAtIndex: 0];
  228.     self.pages = [obj objectForKey: @"content"];
  229.    
  230.     NSString *colorString = [obj objectForKey: @"color"];
  231.    
  232.     int i = 0;
  233.     for (i = 0; i < [self.pages count]; i++) {
  234.         NSDictionary *page = [self.pages objectAtIndex: i];
  235.         NSString *pageContent = [page objectForKey: kJSONContentKey];
  236.         assert(pageContent);
  237.        
  238.         // TODO: Remove this hack!!!
  239.         UIWebView* pageView = [[UIWebView alloc] initWithFrame:CGRectMake(i * IPAD_WIDTH, 30, IPAD_WIDTH, IPAD_HEIGHT - BAR_HEIGHT)];
  240.         pageView.delegate = self;
  241.        
  242.         NSString* css = [NSString stringWithFormat: kInsertCSSFormatString, colorString];
  243.         pageContent = [css stringByAppendingString: pageContent];
  244.        
  245.         [pageView loadHTMLString: pageContent baseURL:nil];
  246.         pageView.scrollView.scrollEnabled = NO;
  247.         [self.pageViews addObject:pageView];
  248.         [self.pageViewContainer insertSubview: pageView atIndex:i];
  249.        
  250.         UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeGesture:)];
  251.         leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
  252.         [pageView addGestureRecognizer:leftSwipeGestureRecognizer];
  253.        
  254.         UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeGesture:)];
  255.         rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
  256.         [pageView addGestureRecognizer:rightSwipeGestureRecognizer];
  257.        
  258.         NSString *layoutTypeString = [page objectForKey: kJSONLayoutTypeKey];
  259.         assert(layoutTypeString);
  260.         LayoutType layoutType = [ArticleViewController layoutTypeFromString: layoutTypeString];
  261.        
  262.         [self applyLayout:layoutType toView:pageView pageData: page];
  263.     }
  264.    
  265.     self.pageNumber = 0;
  266. }
  267.  
  268. - (void) loadArticleContent {
  269.     NSURL* articleURL = [[NSURL alloc] initWithString: [NSString stringWithFormat: articleURLFormat, self.articleId]];
  270.     NSURLRequest *articleRequest = [[NSURLRequest alloc] initWithURL: articleURL cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval: 60.];
  271.     NSURLConnection *articleConnection = [[NSURLConnection alloc] initWithRequest:articleRequest delegate:self];
  272.     if (articleConnection) {
  273.         self.receivedArticleData = [NSMutableData data];
  274.     }
  275. }
  276.  
  277. - (void) handleLeftSwipeGesture:(UISwipeGestureRecognizer*)swipeGestureRecognizer {
  278.     if (self.pageNumber < self.pages.count - 1)
  279.         self.pageNumber += 1;
  280. }
  281.  
  282. - (void) handleRightSwipeGesture:(UISwipeGestureRecognizer*)swipeGestureRecognizer {
  283.     if (self.pageNumber > 0)
  284.         self.pageNumber -= 1;
  285.    
  286. }
  287.  
  288. - (void) updatePagesView {
  289.     [UIView animateWithDuration:ANIMATION_DURATION animations:^{
  290.         // For consistency
  291.         int currentPage = self.pageNumber;
  292.        
  293.         int i = 0;
  294.         for (UIView* page in self.pageViews) {
  295.             page.center = CGPointMake((i - currentPage) * IPAD_WIDTH + IPAD_WIDTH / 2, page.center.y);
  296.            
  297.             i++;
  298.         }
  299.     }];
  300. }
  301.  
  302. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  303.     // TODO: Pop up a browser like Flipboard
  304.     return navigationType != UIWebViewNavigationTypeLinkClicked;
  305. }
  306.  
  307. #pragma mark - Overview
  308.  
  309. // UIScrollViewDelegate function
  310. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
  311.     if (scrollView == self.thumbnailScrollView)
  312.         return self.thumbnailContentView;
  313.     else
  314.         return nil;
  315. }
  316.  
  317. - (void) handleSelectPage: (UITapGestureRecognizer*) sender {
  318.     DLog(@"Detected tap gesture");
  319.     DLog(@"%d", [self.thumbnailContentView.subviews indexOfObject: sender.view]);
  320.     self.pageNumber = [self.thumbnailContentView.subviews indexOfObject: sender.view];
  321.     [self closeOverview];
  322. }
  323.  
  324. - (void) openOverview {
  325.     for (UIView* thumbnailImageView in self.thumbnailContentView.subviews) {
  326.         [thumbnailImageView removeFromSuperview];
  327.     }
  328.    
  329.     int i = 0;
  330.     for (UIView* page in self.pageViews) {
  331.         UIGraphicsBeginImageContext(page.frame.size);
  332.         [[page layer] renderInContext: UIGraphicsGetCurrentContext()];
  333.         UIImage* webPageImage = UIGraphicsGetImageFromCurrentImageContext();
  334.         UIGraphicsEndImageContext();
  335.        
  336.        
  337.         UIView* thumbnailView = [[UIView alloc] initWithFrame: CGRectMake(i * (self.pageViewContainer.frame.size.width + PADDING), 0, self.pageViewContainer.frame.size.width, self.pageViewContainer.frame.size.height)];
  338.        
  339.         UIImageView *webPageImageView = [[UIImageView alloc] initWithImage: webPageImage];
  340.         webPageImageView.frame = CGRectMake(0, 30, webPageImageView.frame.size.width, webPageImageView.frame.size.height);
  341.        
  342.         UIImageView *headerImageView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, 1024, 130)];
  343.         headerImageView.image = self.headerView.image;
  344.        
  345.         [thumbnailView addSubview: webPageImageView];
  346.         [thumbnailView addSubview: headerImageView];
  347.        
  348.         [self.thumbnailContentView addSubview: thumbnailView];
  349.        
  350.         UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(handleSelectPage:)];
  351.         tap.numberOfTapsRequired = 1;
  352.         [thumbnailView addGestureRecognizer: tap];
  353.        
  354.         i++;
  355.     }
  356.  
  357.     self.thumbnailContentView.frame = CGRectMake(0, 0, MAX(0, (IPAD_WIDTH + PADDING) * self.pages.count- PADDING), IPAD_HEIGHT - BAR_HEIGHT);
  358.     self.thumbnailScrollView.contentSize = CGSizeMake(MAX(self.thumbnailContentView.frame.size.width * self.thumbnailScrollView.zoomScale, self.thumbnailScrollView.frame.size.width), self.thumbnailScrollView.frame.size.height);
  359.    
  360.     [UIView beginAnimations: @"ProtonReader.ArticleViewController.overviewButtonPressed.open" context: nil];
  361.     [UIView setAnimationDuration: 0.3];
  362.     self.curtain.hidden = NO;
  363.    
  364.     self.thumbnailScrollView.frame = CGRectMake(0, self.pageViewContainer.frame.size.height - self.thumbnailScrollView.frame.size.height, self.thumbnailScrollView.frame.size.width, self.thumbnailScrollView.frame.size.height);
  365.     [UIView commitAnimations];
  366.    
  367.     DLog(@"%f %f %f %f", self.thumbnailScrollView.frame.origin.x, self.thumbnailScrollView.frame.origin.y, self.thumbnailScrollView.frame.size.width, self.thumbnailScrollView.frame.size.height);
  368. }
  369.  
  370. - (void) closeOverview {
  371.     [UIView beginAnimations: @"ProtonReader.ArticleViewController.overviewButtonPressed.close" context: nil];
  372.     [UIView setAnimationDuration: 0.3];
  373.     self.curtain.hidden = YES;
  374.    
  375.     self.thumbnailScrollView.frame = CGRectMake(0, 768, self.thumbnailScrollView.frame.size.width, self.thumbnailScrollView.frame.size.height);
  376.    
  377.     [UIView commitAnimations];
  378.    
  379.     DLog(@"%f %f %f %f", self.thumbnailScrollView.frame.origin.x, self.thumbnailScrollView.frame.origin.y, self.thumbnailScrollView.frame.size.width, self.thumbnailScrollView.frame.size.height);
  380. }
  381.  
  382. #pragma mark - Article view
  383.  
  384. - (void) loadArticle: (NSUInteger) anArticleId {
  385.     for (UIView* view in self.pageViews) {
  386.         [view removeFromSuperview];
  387.     }
  388.     [self.pageViews removeAllObjects];
  389.    
  390.     self.images = nil;
  391.     // [self.comments.view removeFromSuperview];
  392.     [self.comments.background removeFromSuperview];
  393.     // [self.rating.view removeFromSuperview];
  394.     [self.rating.rateView removeFromSuperview];
  395.     [self.relatedArticles.view removeFromSuperview];
  396.     [self closeOverview];
  397.    
  398.    
  399.     self.articleId = anArticleId;
  400.     [self loadArticleContent];
  401.     self.comments = [[CommentsWidgetViewController alloc] initWithMainController:self];
  402.     self.rating = [[RatingWidgetViewController alloc] initWithMainController:self];
  403.     self.relatedArticles = [[RelatedArticlesWidgetViewController alloc] initWithMainController:self];
  404. }
  405.  
  406.  
  407. #pragma mark - View life cycle
  408.  
  409. - (void)viewDidLoad
  410. {
  411.     [super viewDidLoad];
  412.    
  413.     // TODO: Do we need to remove the observer?
  414.     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePagesView) name:@"pageNumberSet" object:nil];
  415.    
  416.     self.thumbnailScrollView.delegate = self;
  417.     self.thumbnailScrollView.zoomScale =
  418.     self.thumbnailScrollView.minimumZoomScale =
  419.     self.thumbnailScrollView.maximumZoomScale = self.thumbnailScrollView.frame.size.height / self.pageViewContainer.frame.size.height;
  420.    
  421.     [self loadTheme];
  422.     [self loadArticle: self.articleId];
  423.     // [self.comments viewDidLoad];
  424. }
  425.  
  426.  
  427. - (void)viewDidUnload
  428. {
  429.     [self setRating:nil];
  430.     [self setComments:nil];
  431.     [self setRelatedArticles:nil];
  432.    
  433.     [self setBar:nil];
  434.     [self setRatingButton:nil];
  435.     [self setCommentsButton:nil];
  436.     [self setRelatedArticlesButton:nil];
  437.    
  438.     [self.pageViews removeAllObjects];
  439.    
  440.     [self setHeaderView:nil];
  441.    
  442.     [self setCurtain:nil];
  443.     [self setThumbnailContentView:nil];
  444.     [self setThumbnailScrollView:nil];
  445.    
  446.     [self setPageViewContainer:nil];
  447.    
  448.     [super viewDidUnload];    
  449. }
  450.  
  451. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  452. {
  453.     return UIInterfaceOrientationIsLandscape(interfaceOrientation);
  454. }
  455.  
  456. #pragma mark - Network
  457.  
  458. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  459. {
  460.     if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  461.          isEqual: [themeURLFormat stringByDeletingLastPathComponent]]) {
  462.         [self.receivedThemeData setLength: 0];
  463.     }
  464.     else if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  465.               isEqual: [articleURLFormat stringByDeletingLastPathComponent]]) {
  466.         [self.receivedArticleData setLength: 0];
  467.     }
  468.     else {
  469.         assert(0);
  470.     }
  471. }
  472.  
  473. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  474. {
  475.     if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  476.          isEqual: [themeURLFormat stringByDeletingLastPathComponent]]) {
  477.         [self.receivedThemeData appendData: data];
  478.     }
  479.     else if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  480.               isEqual: [articleURLFormat stringByDeletingLastPathComponent]]) {
  481.         [self.receivedArticleData appendData:data];
  482.     }
  483.     else {
  484.         assert(0);
  485.     }
  486. }
  487.  
  488. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  489. {
  490.     DLog(@"Connection failed - %@", error.debugDescription);
  491.    
  492.     NSCachedURLResponse* cachedResponse = [[SDURLCache sharedURLCache] cachedResponseForRequest:connection.originalRequest];
  493.    
  494.     if (cachedResponse) {
  495.         DLog(@"Cached response for %@ found.", connection.originalRequest.URL);
  496.        
  497.         if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  498.              isEqual: [themeURLFormat stringByDeletingLastPathComponent]]) {
  499.             DLog(@"Theme");
  500.             self.receivedThemeData = nil;
  501.            
  502.             [self parseTheme: cachedResponse.data];
  503.             [self updateHeader];
  504.         }
  505.         else if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  506.                   isEqual: [articleURLFormat stringByDeletingLastPathComponent]]) {
  507.             DLog(@"Article");
  508.             self.receivedArticleData = nil;
  509.            
  510.             [self parseArticle: cachedResponse.data];
  511.         }
  512.         else {
  513.             assert(0);
  514.         }
  515.     } else {
  516.         DLog(@"Cached response not found for %@.", connection.originalRequest.URL);
  517.         if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  518.              isEqual: [themeURLFormat stringByDeletingLastPathComponent]]) {
  519.             DLog(@"Theme");
  520.             self.receivedThemeData = nil;
  521.         }
  522.         else if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  523.                   isEqual: [articleURLFormat stringByDeletingLastPathComponent]]) {
  524.             DLog(@"Article");
  525.             self.receivedArticleData = nil;
  526.         }
  527.         else {
  528.             assert(0);
  529.         }
  530.     }
  531. }
  532.  
  533. - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  534. {
  535.     if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  536.          isEqual: [themeURLFormat stringByDeletingLastPathComponent]]) {
  537.         DLog(@"Theme");
  538.         [self parseTheme: self.receivedThemeData];
  539.         self.receivedThemeData = nil;
  540.        
  541.         [self updateHeader];
  542.     }
  543.     else if ([[connection.originalRequest.URL.absoluteString stringByDeletingLastPathComponent]
  544.               isEqual: [articleURLFormat stringByDeletingLastPathComponent]]) {
  545.         DLog(@"Article");
  546.         [self parseArticle: self.receivedArticleData];
  547.         self.receivedArticleData = nil;
  548.     }
  549.     else {
  550.         assert(0);
  551.     }
  552. }
  553.  
  554. #pragma mark - Action handler
  555.  
  556. - (IBAction)ratingButtonPressed:(id)sender {
  557.     if (isRatingButtonClicked) {
  558.         [self.rating viewDidUnload];
  559.     }
  560.     else {
  561.         if (self.rating.rateView != nil) {
  562.             [self.rating.rateView removeFromSuperview];
  563.             self.rating.rateView = nil;
  564.         }
  565.         [self.rating viewDidLoad];
  566.     }
  567.     self.isRatingButtonClicked = !self.isRatingButtonClicked;
  568. }
  569.  
  570. - (IBAction)commentsButtonPressed:(id)sender {
  571.     [self.comments buttonPressed:sender];
  572. }
  573.  
  574. - (IBAction)relatedArticlesButtonPressed:(UIButton *)sender {
  575.     [self.relatedArticles buttonPressed:sender];
  576. }
  577.  
  578. - (IBAction)homeButtonPressed:(id)sender {
  579.     UINavigationController *navigationController = self.navigationController;
  580.     [navigationController popToRootViewControllerAnimated: YES];
  581. }
  582.  
  583. - (IBAction)tappedOnCurtain:(id)sender {
  584.     [self closeOverview];
  585. }
  586.  
  587. - (IBAction)overviewButtonPressed:(id)sender {
  588.     if (self.curtain.hidden) {
  589.         [self openOverview];
  590.     } else {
  591.         [self closeOverview];
  592.     }
  593. }
  594.  
  595. - (IBAction)backButtonPressed:(id)sender {
  596.     [self.navigationController popViewControllerAnimated: YES];
  597. }
  598.  
  599. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement