From d2fd88b409b2ad6653d5583825f2aa188eb9a5d6 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Thu, 17 Jul 2014 15:56:52 -0700 Subject: [PATCH 01/60] Moved libraries/frameworks to Frameworks group. --- sample-app/TestBrowser.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 7be6630..ac0b439 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -159,9 +159,6 @@ children = ( FAF75E8018A17A59007B317D /* Browser Resources */, FAF75E6A18A179D1007B317D /* Browser */, - FAC9B3B816F38D3700E37710 /* SystemConfiguration.framework */, - FAC9B3B416F38C6500E37710 /* CoreData.framework */, - FAC9B3B016F3863500E37710 /* libxml2.2.dylib */, FAC9B26316F27BF800E37710 /* TestBrowser */, FAC9B25C16F27BF800E37710 /* Frameworks */, FAC9B25B16F27BF800E37710 /* Products */, @@ -179,6 +176,9 @@ FAC9B25C16F27BF800E37710 /* Frameworks */ = { isa = PBXGroup; children = ( + FAC9B3B016F3863500E37710 /* libxml2.2.dylib */, + FAC9B3B816F38D3700E37710 /* SystemConfiguration.framework */, + FAC9B3B416F38C6500E37710 /* CoreData.framework */, FAC9B25D16F27BF800E37710 /* UIKit.framework */, FAC9B25F16F27BF800E37710 /* Foundation.framework */, FAC9B26116F27BF800E37710 /* CoreGraphics.framework */, From f3567363ce84e128ef5e7414fe29646ed79059a2 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Thu, 17 Jul 2014 15:58:25 -0700 Subject: [PATCH 02/60] =?UTF-8?q?Removed=20=E2=80=9CItem=E2=80=9D=20and=20?= =?UTF-8?q?=E2=80=9CItem2=E2=80=9D=20bar=20button=20items=20which=20were?= =?UTF-8?q?=20causing=20crashes=20upon=20tap=20due=20to=20lack=20of=20meth?= =?UTF-8?q?od=20implementation=20for=20their=20corresponding=20IBActions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Browser Resources/MainWindow-iPad.xib | 17 +---------------- Browser Resources/MainWindow.xib | 17 +---------------- Browser/BrowserViewController.h | 2 -- README.md | 6 ------ 4 files changed, 2 insertions(+), 40 deletions(-) diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index 4fa6046..48917e1 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -1,5 +1,5 @@ - + @@ -12,8 +12,6 @@ - - @@ -87,19 +85,6 @@ - - - - - - - - - - - - - diff --git a/Browser Resources/MainWindow.xib b/Browser Resources/MainWindow.xib index 2015274..796f689 100644 --- a/Browser Resources/MainWindow.xib +++ b/Browser Resources/MainWindow.xib @@ -1,5 +1,5 @@ - + @@ -12,8 +12,6 @@ - - @@ -223,19 +221,6 @@ - - - - - - - - - - - - - diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 5ca5394..eda7d01 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -116,8 +116,6 @@ -(IBAction) goForward:(id)sender; -(IBAction) stopLoading:(id)sender; -(IBAction) showBookmarks:(id)sender; --(IBAction) customButtonClick:(id)sender; --(IBAction) customButtonClick2:(id)sender; -(IBAction) scrollToTop:(id)sender; -(NSArray *) actionSheetButtons; diff --git a/README.md b/README.md index 7476a94..9cbf500 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,6 @@ The browser code does reference the app delegate, so you must have an AppDelegat self.viewController = [[BrowserViewController alloc] init]; -## Misc - - There is a `customButton` UIBarButtonitem which you can customize programmatically in your view controller. This button appears in the bottom toolbar on the right. You can also overwrite the click handler method `-(IBAction) customButtonClick:(id)sender`. - - There are now 2 custom buttons. - ## License Copyright (c) 2014 Evidon unless otherwise specified From c60b5d15f758c0cc67d30d5a9a9c8219b2df3b1d Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Thu, 17 Jul 2014 17:19:10 -0700 Subject: [PATCH 03/60] Fixed plethora of warnings. Code cleanup. --- Browser/BookmarkFolderFormController.m | 2 +- Browser/BookmarkImporter.h | 6 +- Browser/BookmarkImporter.m | 26 ++- Browser/BookmarksController.m | 4 +- Browser/BookmarksFormController.m | 4 +- Browser/BrowserViewController.m | 2 +- Browser/Tab.h | 31 +--- Browser/Tab.m | 248 +++++++++++++------------ 8 files changed, 145 insertions(+), 178 deletions(-) diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index 76fa825..a3e76be 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -46,7 +46,7 @@ - (void)viewDidLoad { [nameField becomeFirstResponder]; - self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + self.preferredContentSize = CGSizeMake(320.0, 480.0); [super viewDidLoad]; } diff --git a/Browser/BookmarkImporter.h b/Browser/BookmarkImporter.h index a21c839..c98c93d 100644 --- a/Browser/BookmarkImporter.h +++ b/Browser/BookmarkImporter.h @@ -10,11 +10,7 @@ #import #import -@interface BookmarkImporter : NSObject { - NSManagedObjectContext *managedObjectContext; - NSManagedObject *rootFolder; - xmlNodeSetPtr allNodes; -} +@interface BookmarkImporter : NSObject - (void)loadBookmarksFromUrl:(NSURL *) url; - (void) loadBookmarksFromNodes:(NSArray *)nodes inFolder:(NSManagedObject *)parentFolder scanDL:(BOOL)scanDL; diff --git a/Browser/BookmarkImporter.m b/Browser/BookmarkImporter.m index b67fe3f..c45d812 100644 --- a/Browser/BookmarkImporter.m +++ b/Browser/BookmarkImporter.m @@ -16,19 +16,17 @@ @implementation BookmarkImporter -@synthesize managedObjectContext, rootFolder; - - (void)loadBookmarksFromUrl:(NSURL *) url{ NSError *error; - if (managedObjectContext == nil) + if (_managedObjectContext == nil) { - managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; - NSLog(@"After managedObjectContext: %@", managedObjectContext); + _managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; + NSLog(@"After managedObjectContext: %@", _managedObjectContext); } - NSString *bookmarkHTML = [NSString stringWithContentsOfURL:url]; + NSString *bookmarkHTML = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"
|
|

|

|FOLDED|\n|\t|\r|]*||" options:NSRegularExpressionCaseInsensitive error:&error]; bookmarkHTML = [regex stringByReplacingMatchesInString:bookmarkHTML options:0 range:NSMakeRange(0, [bookmarkHTML length]) withTemplate:@""]; @@ -36,14 +34,14 @@ - (void)loadBookmarksFromUrl:(NSURL *) url{ if ([[bookmarkHTML lowercaseString] rangeOfString:@""].location != NSNotFound) { bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"" withString:@""]; bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"" withString:@""]; - bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"<\HTML>" withString:@"<\root>"]; - bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"<\html>" withString:@"<\root>"]; + bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"<\\HTML>" withString:@"<\root>"]; + bookmarkHTML = [bookmarkHTML stringByReplacingOccurrencesOfString:@"<\\html>" withString:@"<\root>"]; } else { bookmarkHTML = [NSString stringWithFormat:@"%@", bookmarkHTML]; } NSData *bookmarkData = [bookmarkHTML dataUsingEncoding:NSUTF8StringEncoding]; - NSManagedObject *parentFolder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext]; + NSManagedObject *parentFolder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:_managedObjectContext]; [parentFolder setValue:[NSString stringWithFormat:@"import folder %@", [[NSDate date] description]] forKey:@"name"]; [parentFolder setNilValueForKey:@"Parent"]; @@ -74,7 +72,7 @@ - (void) loadBookmarksFromNodes:(NSArray *)nodes inFolder:(NSManagedObject *)par nodeName = [[NSString stringWithCString:(const char *)node->name encoding:NSUTF8StringEncoding] lowercaseString]; } if (nodeName != nil && [nodeName isEqualToString:@"h3"]) { - NSManagedObject *folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext]; + NSManagedObject *folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:_managedObjectContext]; NSString *name = [NSString stringWithCString:node->children->content encoding:NSUTF8StringEncoding]; name = [name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; @@ -105,12 +103,12 @@ - (void) loadBookmarksFromNodes:(NSArray *)nodes inFolder:(NSManagedObject *)par if ([attrName isEqualToString:@"href"] && [attrVal hasPrefix:@"http"] && ![attrVal hasPrefix:@"http://localhost"]) { - NSManagedObject *bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:managedObjectContext]; + NSManagedObject *bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:_managedObjectContext]; NSString *name = [NSString stringWithCString:(const char *)node->children->content encoding:NSUTF8StringEncoding]; [bookmark setValue:name forKey:@"name"]; [bookmark setValue:attrVal forKey:@"url"]; [bookmark setValue:parentFolder forKey:@"Folder"]; - if (![managedObjectContext save:nil]) { + if (![_managedObjectContext save:nil]) { NSLog(@"save attempt %@ | %@",name, attrVal); } } @@ -145,9 +143,9 @@ - (void) loadBookmarksFromAllNodesinFolder:(NSManagedObject *)parentFolder scanD } - (void) save:(NSError **) err { - if (managedObjectContext != nil) + if (_managedObjectContext != nil) { - [managedObjectContext save:err]; + [_managedObjectContext save:err]; //NSLog(@"managed error: %@ %@ %@ %i", [*err localizedDescription], [*err helpAnchor], [*err domain], [*err code]); } } diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 9460df8..6550849 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -43,7 +43,7 @@ - (void)viewDidLoad { formController = [browserController bookmarksFormController]; - self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + self.preferredContentSize = CGSizeMake(320.0, 480.0); [super viewDidLoad]; } @@ -80,7 +80,7 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // Return the orientation you'd prefer - this is what it launches to. The // user can still rotate. You don't have to implement this method, in which // case it launches in the current orientation - return UIDeviceOrientationPortrait; + return UIInterfaceOrientationPortrait; } - (NSMutableArray *) reloadBookmarks { diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index ad049c4..2952c7d 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -46,7 +46,7 @@ - (void)viewDidLoad { doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(saveBookmark:)]; cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(switchToBrowser:)]; - self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + self.preferredContentSize = CGSizeMake(320.0, 480.0); [super viewDidLoad]; } @@ -112,7 +112,7 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // Return the orientation you'd prefer - this is what it launches to. The // user can still rotate. You don't have to implement this method, in which // case it launches in the current orientation - return UIDeviceOrientationPortrait; + return UIInterfaceOrientationPortrait; } - (IBAction) switchToBrowser:(id)sender { diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 17804d4..2b8666a 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -880,7 +880,7 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // Return the orientation you'd prefer - this is what it launches to. The // user can still rotate. You don't have to implement this method, in which // case it launches in the current orientation - return UIDeviceOrientationPortrait; + return UIInterfaceOrientationPortrait; } diff --git a/Browser/Tab.h b/Browser/Tab.h index 385895a..61870e9 100644 --- a/Browser/Tab.h +++ b/Browser/Tab.h @@ -10,36 +10,7 @@ @class BrowserViewController, FilterManager; -@interface Tab : UIView { - UIButton *tabButton; - UILabel *tabTitle; - UIWebView *webView; - UIButton *closeButton; - - NSString *currentURLString; - NSURL *currentURL; - NSString *connectionURLString; - NSURLConnection *urlConnection; - NSHTTPURLResponse *response; - NSMutableData *pageData; - - NSMutableArray *history; - int traverse; - int history_position; - - int scrollPosition; - - BOOL loading; - BOOL current; - BOOL actionSheetVisible; - - double loadStartTime; - double loadEndTime; - NSString *pageInfoJS; - - BrowserViewController *viewController; - -} +@interface Tab : UIView @property(nonatomic,strong) UIButton *tabButton; @property(nonatomic,strong) UILabel *tabTitle; diff --git a/Browser/Tab.m b/Browser/Tab.m index daff045..16436af 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -12,88 +12,86 @@ @implementation Tab -@synthesize tabButton, webView, closeButton, tabTitle, history, traverse, history_position, scrollPosition, currentURLString, currentURL, current, urlConnection, connectionURLString, actionSheetVisible, loadStartTime, loadEndTime, pageInfoJS, response, viewController, loading; - -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { if ((self = [super initWithFrame:frame])) { - viewController = vc; + _viewController = vc; NSString *path = [[NSBundle mainBundle] pathForResource:@"page_info" ofType:@"js"]; - pageInfoJS = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + _pageInfoJS = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; // Create tab button [self setTabButton:[UIButton buttonWithType:UIButtonTypeCustom]]; // Style tab button - [[tabButton layer] setCornerRadius: 5.0f]; - [[tabButton layer] setMasksToBounds:YES]; - [[tabButton layer] setBorderWidth: 0.5f]; + [[_tabButton layer] setCornerRadius: 5.0f]; + [[_tabButton layer] setMasksToBounds:YES]; + [[_tabButton layer] setBorderWidth: 0.5f]; - [tabButton setBackgroundColor:[UIColor grayColor]]; + [_tabButton setBackgroundColor:[UIColor grayColor]]; - tabButton.titleLabel.font = [UIFont systemFontOfSize: 11]; - [tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + _tabButton.titleLabel.font = [UIFont systemFontOfSize: 11]; + [_tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - tabButton.contentEdgeInsets = UIEdgeInsetsMake(0.0, 8.0, 0.0, 0.0); - tabButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; - tabButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + _tabButton.contentEdgeInsets = UIEdgeInsetsMake(0.0, 8.0, 0.0, 0.0); + _tabButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + _tabButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - tabButton.frame = CGRectMake(0.0, 0.0, 100.0, 26.0); + _tabButton.frame = CGRectMake(0.0, 0.0, 100.0, 26.0); // Create close tab button [self setCloseButton:[UIButton buttonWithType:UIButtonTypeCustom]]; - [closeButton setTitle:@"x" forState:UIControlStateNormal]; - [closeButton setAccessibilityLabel:@"close tab"]; - [closeButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; - closeButton.frame = CGRectMake(79.0, -1.0, 25.0, 25.0); - closeButton.titleLabel.font = [UIFont systemFontOfSize: 18]; + [_closeButton setTitle:@"x" forState:UIControlStateNormal]; + [_closeButton setAccessibilityLabel:@"close tab"]; + [_closeButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; + _closeButton.frame = CGRectMake(79.0, -1.0, 25.0, 25.0); + _closeButton.titleLabel.font = [UIFont systemFontOfSize: 18]; // append views - [self addSubview:tabButton]; - [self addSubview:closeButton]; + [self addSubview:_tabButton]; + [self addSubview:_closeButton]; // Set up webview - UIWebView *wvTemplate = (UIView *)[viewController webViewTemplate]; + UIWebView *wvTemplate = (UIWebView *)[_viewController webViewTemplate]; int minWebViewSize = wvTemplate.frame.size.height; - int maxWebViewSize = minWebViewSize + [viewController bottomBar].frame.size.height; - int height = [viewController bottomBar].alpha > 0.0 ? minWebViewSize : maxWebViewSize; + int maxWebViewSize = minWebViewSize + [_viewController bottomBar].frame.size.height; + int height = [_viewController bottomBar].alpha > 0.0 ? minWebViewSize : maxWebViewSize; CGRect frame = CGRectMake(wvTemplate.frame.origin.x, wvTemplate.frame.origin.y, wvTemplate.frame.size.width, height); - webView = [[UIWebView alloc] initWithFrame:frame]; - webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); - webView.scalesPageToFit = true; - webView.scrollView.scrollEnabled = YES; - webView.scrollView.bounces = YES; - webView.backgroundColor = [UIColor whiteColor]; - [webView sizeToFit]; - [webView setDelegate:self]; + _webView = [[UIWebView alloc] initWithFrame:frame]; + _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); + _webView.scalesPageToFit = true; + _webView.scrollView.scrollEnabled = YES; + _webView.scrollView.bounces = YES; + _webView.backgroundColor = [UIColor whiteColor]; + [_webView sizeToFit]; + [_webView setDelegate:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextualMenuAction:) name:@"TapAndHoldNotification" object:nil]; // Scroll topbar - [[webView scrollView] setDelegate:viewController]; - [[webView scrollView] setContentInset:UIEdgeInsetsMake([viewController topBar].frame.size.height, 0, 0, 0)]; - [[webView scrollView] setContentOffset:CGPointMake(0, - [viewController topBar].frame.size.height)]; + [[_webView scrollView] setDelegate:_viewController]; + [[_webView scrollView] setContentInset:UIEdgeInsetsMake([_viewController topBar].frame.size.height, 0, 0, 0)]; + [[_webView scrollView] setContentOffset:CGPointMake(0, - [_viewController topBar].frame.size.height)]; - [[viewController view] addSubview:webView]; - [[viewController view] sendSubviewToBack:webView]; - [[viewController view] sendSubviewToBack:[viewController webViewTemplate]]; + [[_viewController view] addSubview:_webView]; + [[_viewController view] sendSubviewToBack:_webView]; + [[_viewController view] sendSubviewToBack:[_viewController webViewTemplate]]; // Set up interactions - [tabButton addTarget:viewController - action:@selector(selectTab:) - forControlEvents:UIControlEventTouchDown]; - [closeButton addTarget:viewController - action:@selector(removeTab:) - forControlEvents:UIControlEventTouchDown]; + [_tabButton addTarget:_viewController + action:@selector(selectTab:) + forControlEvents:UIControlEventTouchDown]; + [_closeButton addTarget:_viewController + action:@selector(removeTab:) + forControlEvents:UIControlEventTouchDown]; //Set history [self setHistory:[[NSMutableArray alloc] initWithCapacity:0]]; - traverse = 0; - history_position = 0; + _traverse = 0; + _history_position = 0; //Set title - [tabButton setTitle:@"New Tab" forState:UIControlStateNormal]; - [tabButton setTitle:@"New Tab" forState:UIControlStateHighlighted]; + [_tabButton setTitle:@"New Tab" forState:UIControlStateNormal]; + [_tabButton setTitle:@"New Tab" forState:UIControlStateHighlighted]; } @@ -112,20 +110,20 @@ -(void) setTitle:(NSString *)title { } -(void) select { - current = YES; - [tabButton setBackgroundColor:[UIColor whiteColor]]; - tabButton.selected = YES; - tabButton.enabled = NO; - [webView.superview bringSubviewToFront:webView]; + _current = YES; + [_tabButton setBackgroundColor:[UIColor whiteColor]]; + _tabButton.selected = YES; + _tabButton.enabled = NO; + [_webView.superview bringSubviewToFront:_webView]; [self.superview bringSubviewToFront:self]; } -(void) deselect { - current = NO; - [tabButton setBackgroundColor:[UIColor lightGrayColor]]; - tabButton.selected = NO; - tabButton.enabled = YES; - [webView.superview sendSubviewToBack:webView]; + _current = NO; + [_tabButton setBackgroundColor:[UIColor lightGrayColor]]; + _tabButton.selected = NO; + _tabButton.enabled = YES; + [_webView.superview sendSubviewToBack:_webView]; [self.superview sendSubviewToBack:self]; } @@ -134,11 +132,11 @@ -(void) incrementOffset { } -(void) hideText { - [tabButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_tabButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; } -(void) showText { - [tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + [_tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; } // CONNECTION @@ -169,15 +167,15 @@ - (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURL self.currentURL = [response URL]; self.currentURLString = [[response URL] absoluteString]; [self setResponse:response]; - if (current) { + if (_current) { [[self progressBar] setProgress:0.25 animated:NO]; } - pageData = [[NSMutableData alloc] initWithLength:0]; + _pageData = [[NSMutableData alloc] initWithLength:0]; } - (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data { - [pageData appendData: data]; + [_pageData appendData: data]; if ([[self progressBar] progress] < 0.75) { [[self progressBar] setProgress:[[self progressBar] progress] + .05 animated:NO]; } @@ -185,55 +183,59 @@ - (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) dat } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - NSURLRequest *request = [connection originalRequest]; +// NSURLRequest *request = [connection originalRequest];/ - if ([pageData length] == 0) { + if ([_pageData length] == 0) { [[self history] removeLastObject]; self.currentURL = [[[self history] lastObject] URL]; self.currentURLString = [[[[self history] lastObject] URL] absoluteString]; - if (current && ![currentURLString isEqualToString:@"about:blank"] && [currentURLString rangeOfString:@"https://duckduckgo.com"].location == NSNotFound) { - [[viewController addressBar] setText:self.currentURLString]; + if (_current && ![_currentURLString isEqualToString:@"about:blank"] && + [_currentURLString rangeOfString:@"https://duckduckgo.com"].location == NSNotFound) + { + [[_viewController addressBar] setText:self.currentURLString]; } [[self progressBar] setHidden:YES]; return; } - if ([[response MIMEType] isEqualToString:@"text/html"] || [[response MIMEType] isEqualToString:@"application/xhtml+xml"] || [[response MIMEType] isEqualToString:@"text/vnd.wap.wml"]) { - NSStringEncoding *enc; - if ([response textEncodingName] != nil) { - enc = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[response textEncodingName])); + if ([[_response MIMEType] isEqualToString:@"text/html"] || + [[_response MIMEType] isEqualToString:@"application/xhtml+xml"] || + [[_response MIMEType] isEqualToString:@"text/vnd.wap.wml"]) + { + NSStringEncoding *enc = NULL; + if ([_response textEncodingName] != nil) { + enc = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[_response textEncodingName])); } else { enc = NSUTF8StringEncoding; } - NSString *page = (NSString *)[[NSString alloc] initWithData:pageData encoding:enc]; + NSString *page = (NSString *)[[NSString alloc] initWithData:_pageData encoding:enc]; [[self webView] stopLoading]; [[self webView] loadHTMLString:page baseURL:self.currentURL]; } else { [[self webView] stopLoading]; - [[self webView] loadData:pageData MIMEType:[response MIMEType] textEncodingName:[response textEncodingName] baseURL:self.currentURL]; + [[self webView] loadData:_pageData MIMEType:[_response MIMEType] textEncodingName:[_response textEncodingName] baseURL:self.currentURL]; //[whiteView setHidden:YES]; } [[self progressBar] setProgress:0.75 animated:NO]; - pageData = nil; + _pageData = nil; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [[self progressBar] setHidden:YES]; if ([[connection currentRequest] URL] != NULL) { - [viewController cannotConnect:webView]; + [_viewController cannotConnect:_webView]; } else { - NSString *urlAddress = @""; [[self webView] loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"launch" ofType:@"html"]isDirectory:NO]]]; - [[viewController addressBar] setText:@""]; + [[_viewController addressBar] setText:@""]; } } -(UIProgressView *) progressBar { - return current ? [viewController progressBar] : nil; + return _current ? [_viewController progressBar] : nil; } #pragma mark - @@ -258,10 +260,10 @@ -(BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)re return YES; } if ([[URL scheme] isEqualToString:@"http"] || [[URL scheme] isEqualToString:@"https"]) { - if (current) { - [[viewController addressBar] setText:[URL absoluteString]]; + if (_current) { + [[_viewController addressBar] setText:[URL absoluteString]]; } - [viewController gotoAddress:nil withRequestObj:request inTab:self]; + [_viewController gotoAddress:nil withRequestObj:request inTab:self]; } return NO; } @@ -274,15 +276,15 @@ -(void) webViewDidStartLoad:(UIWebView *)webView { -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { self.loading = NO; - if (current) { - [viewController currentWebViewDidFinishFinalLoad:webView]; + if (_current) { + [_viewController currentWebViewDidFinishFinalLoad:webView]; } NSLog(@"Loaded url: %@", [webView.request mainDocumentURL]); // set title NSString *tabTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; - NSString *url = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; +// NSString *url = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; if ([tabTitle length] == 0) { [self setTitle:@"Untitled"]; } else { @@ -293,7 +295,7 @@ -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { -(void) webViewDidFinishLoad:(UIWebView *)webView { - if (![[[webView request] URL] isFileURL] && currentURL != nil) { + if (![[[webView request] URL] isFileURL] && _currentURL != nil) { [webView stringByEvaluatingJavaScriptFromString:@"if (document.getElementById('gh-page-loaded') == null && document.documentElement.innerHTML != '') {" "var iframe = document.createElement('IFRAME');" "iframe.setAttribute('id','gh-page-loaded');" @@ -307,7 +309,7 @@ -(void) webViewDidFinishLoad:(UIWebView *)webView { - (void)contextualMenuAction:(NSNotification*)notification { - if (actionSheetVisible || webView != [viewController webView]) { + if (_actionSheetVisible || _webView != [_viewController webView]) { return; } CGPoint pt; @@ -316,11 +318,11 @@ - (void)contextualMenuAction:(NSNotification*)notification pt.y = [[coord objectForKey:@"y"] floatValue]; // convert point from window to view coordinate system - pt = [webView convertPoint:pt fromView:nil]; + pt = [_webView convertPoint:pt fromView:nil]; // convert point from view to HTML coordinate system - CGPoint offset = [self scrollOffset]; - CGSize viewSize = [webView frame].size; +// CGPoint offset = [self scrollOffset]; + CGSize viewSize = [_webView frame].size; CGSize windowSize = [self windowSize]; CGFloat f = windowSize.width / viewSize.width; @@ -335,18 +337,18 @@ - (void)openContextualMenuAt:(CGPoint)pt // Load the JavaScript code from the Resources and inject it into the web page NSString *path = [[NSBundle mainBundle] pathForResource:@"JSTools" ofType:@"js"]; NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; - [webView stringByEvaluatingJavaScriptFromString: jsCode]; + [_webView stringByEvaluatingJavaScriptFromString:jsCode]; NSInteger topOffset; - if ([viewController isPad]) { - topOffset = ((NSInteger)[viewController topBar].frame.size.height) + - ((NSInteger)[(UIMainView *)[viewController view] statusBarView].frame.size.height); + if ([_viewController isPad]) { + topOffset = ((NSInteger)[_viewController topBar].frame.size.height) + + ((NSInteger)[(UIMainView *)[_viewController view] statusBarView].frame.size.height); } else { - topOffset = ((NSInteger)[(UIMainView *)[viewController view] statusBarView].frame.size.height); + topOffset = ((NSInteger)[(UIMainView *)[_viewController view] statusBarView].frame.size.height); } // get the Tags at the touch location - NSArray *r = [[webView stringByEvaluatingJavaScriptFromString: + NSArray *r = [[_webView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat:@"MyAppGetHTMLElementsAtPoint(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y - topOffset]] componentsSeparatedByString:@"|"]; NSString *tags = [r objectAtIndex:0]; @@ -375,22 +377,22 @@ - (void)openContextualMenuAt:(CGPoint)pt [sheet addButtonWithTitle:@"Save Page as Bookmark"]; [sheet addButtonWithTitle:@"Open Page in Safari"]; - [sheet showInView:webView]; + [sheet showInView:_webView]; } - (CGSize)windowSize { CGSize size; - size.width = [[webView stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] integerValue]; - size.height = [[webView stringByEvaluatingJavaScriptFromString:@"window.innerHeight"] integerValue]; + size.width = [[_webView stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] integerValue]; + size.height = [[_webView stringByEvaluatingJavaScriptFromString:@"window.innerHeight"] integerValue]; return size; } - (CGPoint)scrollOffset { CGPoint pt; - pt.x = [[webView stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue]; - pt.y = [[webView stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue]; + pt.x = [[_webView stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue]; + pt.y = [[_webView stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue]; return pt; } @@ -398,9 +400,9 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger NSURL *url = [NSURL URLWithString:[actionSheet title]]; NSString *clickedButton = [actionSheet buttonTitleAtIndex:buttonIndex]; if ([clickedButton isEqualToString:@"Open Link"]) { - [viewController gotoAddress:nil withRequestObj:[[NSURLRequest alloc] initWithURL:url] inTab:self]; + [_viewController gotoAddress:nil withRequestObj:[[NSURLRequest alloc] initWithURL:url] inTab:self]; } else if ([clickedButton isEqualToString:@"Open Link in New Tab"]) { - [viewController addTabWithAddress:[actionSheet title]]; + [_viewController addTabWithAddress:[actionSheet title]]; } else if ([clickedButton isEqualToString:@"Copy Link"]) { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = [url absoluteString]; @@ -409,8 +411,8 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger UIImage *imageToBeSaved = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]]; UIImageWriteToSavedPhotosAlbum(imageToBeSaved, nil, nil, nil); } else if ([clickedButton isEqualToString:@"Save Page as Bookmark"]) { - [[viewController bookmarksFormController] setDefaultUrlFieldText:[url absoluteString]]; - [viewController addBookmarkFromSheet:actionSheet]; + [[_viewController bookmarksFormController] setDefaultUrlFieldText:[url absoluteString]]; + [_viewController addBookmarkFromSheet:actionSheet]; [actionSheet resignFirstResponder]; } else if ([clickedButton isEqualToString:@"Open Page in Safari"]) { [actionSheet dismissWithClickedButtonIndex:buttonIndex animated:YES]; @@ -419,22 +421,22 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger } - (void)didPresentActionSheet:(UIActionSheet *)actionSheet { - actionSheetVisible = YES; + _actionSheetVisible = YES; } - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { - actionSheetVisible = NO; + _actionSheetVisible = NO; } // HISTORY -(BOOL) canGoBack { - return history.count > 0 && history_position > 0; + return _history.count > 0 && _history_position > 0; } -(BOOL) canGoForward { - return history.count > 0 && history_position < history.count - 1; + return _history.count > 0 && _history_position < _history.count - 1; } -(void) goBack { @@ -446,33 +448,33 @@ -(void) goForward { } -(void) go:(int)t { - NSArray *req; - [viewController forwardButton].enabled = FALSE; - [viewController backButton].enabled = FALSE; - traverse = t; - history_position += traverse; - if (history_position >= [history count] || history_position < 0) { - req = [history lastObject]; + NSURLRequest *req; + [_viewController forwardButton].enabled = FALSE; + [_viewController backButton].enabled = FALSE; + _traverse = t; + _history_position += _traverse; + if (_history_position >= [_history count] || _history_position < 0) { + req = [_history lastObject]; } - req = [history objectAtIndex:history_position]; + req = [_history objectAtIndex:_history_position]; //[[viewController addressBar] setText:[[req URL] absoluteString]]; if (req != nil) { - [viewController gotoAddress:nil withRequestObj:req inTab:self]; + [_viewController gotoAddress:nil withRequestObj:req inTab:self]; } } -(void) updateHistory { - if (traverse == 0) { - if (history_position + 1 < history.count) { - [history removeObjectsInRange:NSMakeRange(history_position + 1, history.count - history_position - 1)]; + if (_traverse == 0) { + if (_history_position + 1 < _history.count) { + [_history removeObjectsInRange:NSMakeRange(_history_position + 1, _history.count - _history_position - 1)]; } NSURLRequest *req = [[[self urlConnection] currentRequest] mutableCopy]; - [history addObject:req]; - history_position = history.count - 1; + [_history addObject:req]; + _history_position = _history.count - 1; } - traverse = 0; + _traverse = 0; } From 9fe26566814eaa9cd1341b9c936f6c03a428f468 Mon Sep 17 00:00:00 2001 From: Obi Date: Thu, 17 Jul 2014 19:31:14 -0700 Subject: [PATCH 04/60] Fixed done button press to hide bookmarks controller. --- Browser/BookmarksController.m | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 9460df8..057c5f6 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -124,16 +124,11 @@ - (IBAction)switchToBrowser:(id)sender { [self finishEditMode:sender]; } - if ([browserController isPad]) { - [[browserController padPopover] dismissPopoverAnimated:YES]; - } else { - [UIView transitionFromView:[self.navigationController view] - toView: [browserController view] - duration:0.5 - options:(UIViewAnimationOptionTransitionCrossDissolve) - completion:^(BOOL finished) {}]; - } - + [UIView transitionFromView:[self.navigationController view] + toView: [browserController view] + duration:0.5 + options:(UIViewAnimationOptionTransitionCrossDissolve) + completion:^(BOOL finished) {}]; [self.navigationController popToRootViewControllerAnimated:NO]; } From 256aebcf32e46ce61a43ffde048a77fae7cef1e8 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Thu, 17 Jul 2014 19:44:41 -0700 Subject: [PATCH 05/60] Replaced all instance variables with properties in BrowserViewController.h in order to get rid of some warnings and conform to more modern Obj-C coding convention. --- Browser/BrowserViewController.h | 93 +++------- Browser/BrowserViewController.m | 304 ++++++++++++++++---------------- 2 files changed, 173 insertions(+), 224 deletions(-) diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index eda7d01..e94db2d 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -10,86 +10,37 @@ #import @class Tab, BookmarksController, BookmarksFormController, Reachability; -@interface BrowserViewController : UIViewController { - - IBOutlet UIView *webViewTemplate; - IBOutlet UIScrollView *tabsView; - IBOutlet UIView *topBar; - IBOutlet UIToolbar *bottomBar; - IBOutlet UIToolbar *navBar; - - IBOutlet UITextField *addressBar; - NSMutableString *oldAddressText; - - IBOutlet UIActivityIndicatorView *activityIndicator; - IBOutlet UIView *addressBarButtonsView; - IBOutlet UIButton *refreshButton; - IBOutlet UIButton *stopButton; - - IBOutlet UIBarButtonItem *forwardButton; - IBOutlet UIBarButtonItem *backButton; - IBOutlet UIBarButtonItem *addressItem; - IBOutlet UIBarButtonItem *searchItem; - IBOutlet UIBarButtonItem *customButton; - IBOutlet UIBarButtonItem *customButton2; - IBOutlet UIBarButtonItem *moreButton; - IBOutlet UIBarButtonItem *bookmarkButton; - - UIBarButtonItem *barItemPopoverPresenter; - UIActionSheet *popupQuery; - UIPopoverController *padPopover; - - IBOutlet UIButton *addTab; - Tab *selectedTab; - NSMutableArray *tabs; - - NSURL *gotoUrl; - - UINavigationController *bookmarksController; - BookmarksFormController *bookmarksFormController; - - BOOL reloadOnPageLoad; - BOOL initialPageLoad; - BOOL saveScrollPosition; - - NSString *userAgent; - - - IBOutlet UIProgressView *progressBar; - float contentSize; - -} -@property(nonatomic,strong) UIView *webViewTemplate; - -@property(nonatomic,strong) UIScrollView *tabsView; -@property(nonatomic,strong) UIView *topBar; -@property(nonatomic,strong) UIToolbar *bottomBar; - -@property(nonatomic,strong) UIToolbar *navBar; +@interface BrowserViewController : UIViewController + +@property(nonatomic,strong) IBOutlet UIView *webViewTemplate; + +@property(nonatomic,strong) IBOutlet UIScrollView *tabsView; +@property(nonatomic,strong) IBOutlet UIView *topBar; +@property(nonatomic,strong) IBOutlet UIToolbar *bottomBar; + +@property(nonatomic,strong) IBOutlet UIToolbar *navBar; @property(nonatomic,strong) UIToolbar *bugListNavBar; -@property(nonatomic,strong) UITextField *addressBar; +@property(nonatomic,strong) IBOutlet UITextField *addressBar; @property(nonatomic,strong) UITextField *searchBar; @property(nonatomic,strong) NSMutableString *oldAddressText; -@property(nonatomic,strong) UIActivityIndicatorView *activityIndicator; -@property(nonatomic,strong) UIView *addressBarButtonsView; -@property(nonatomic,strong) UIButton *refreshButton; -@property(nonatomic,strong) UIButton *stopButton; +@property(nonatomic,strong) IBOutlet UIActivityIndicatorView *activityIndicator; +@property(nonatomic,strong) IBOutlet UIView *addressBarButtonsView; +@property(nonatomic,strong) IBOutlet UIButton *refreshButton; +@property(nonatomic,strong) IBOutlet UIButton *stopButton; -@property(nonatomic,strong) UIBarButtonItem *forwardButton; -@property(nonatomic,strong) UIBarButtonItem *backButton; -@property(nonatomic,strong) UIBarButtonItem *addressItem; -@property(nonatomic,strong) UIBarButtonItem *searchItem; -@property(nonatomic,strong) UIBarButtonItem *customButton; -@property(nonatomic,strong) UIBarButtonItem *customButton2; -@property(nonatomic,strong) UIBarButtonItem *moreButton; -@property(nonatomic,strong) UIBarButtonItem *bookmarkButton; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *forwardButton; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *backButton; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *addressItem; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *searchItem; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *moreButton; +@property(nonatomic,strong) IBOutlet UIBarButtonItem *bookmarkButton; @property(nonatomic,strong) UIBarButtonItem *barItemPopoverPresenter; @property(nonatomic,strong) UIActionSheet *popupQuery; @property(nonatomic,strong) UIPopoverController *padPopover; -@property(nonatomic,strong) UIButton *addTab; +@property(nonatomic,strong) IBOutlet UIButton *addTab; @property(nonatomic,strong) Tab *selectedTab; @property(nonatomic,strong) NSMutableArray *tabs; @@ -106,7 +57,7 @@ @property(nonatomic,strong) NSString *userAgent; -@property(nonatomic,strong) UIProgressView *progressBar; +@property(nonatomic,strong) IBOutlet UIProgressView *progressBar; @property(nonatomic,assign) float contentSize; -(IBAction) gotoAddress:(id)sender; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 2b8666a..92e5c08 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -25,17 +25,15 @@ ScrollDirectionCrazy, } ScrollDirection; -@interface BrowserViewController () - -@end - -@implementation BrowserViewController { - +@interface BrowserViewController () { + BOOL localWiFiRef; SCNetworkReachabilityRef reachabilityRef; } -@synthesize addressBar, addressBarButtonsView, addressItem, searchItem, activityIndicator, topBar, bottomBar, refreshButton, forwardButton, backButton, navBar, oldAddressText, addTab, selectedTab, tabs, tabsView, webViewTemplate, bookmarksController, bookmarksFormController, bookmarkButton, bugListNavBar, stopButton, moreButton, reloadOnPageLoad, initialPageLoad, progressBar, gotoUrl, contentSize, barItemPopoverPresenter, padPopover, popupQuery, saveScrollPosition, customButton, customButton2, userAgent; +@end + +@implementation BrowserViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -57,7 +55,7 @@ - (void)viewDidLoad //set background for toolbar in top bar if ([self isPad]) { UIImage *img = [UIImage imageNamed:@"gray-pixel.png"]; - [bottomBar setBackgroundImage:img forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; + [_bottomBar setBackgroundImage:img forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; } //size statusbar @@ -86,7 +84,7 @@ - (void)viewDidLoad [self.addressBar setRightViewMode: UITextFieldViewModeUnlessEditing]; self.oldAddressText = [NSMutableString stringWithString:@""]; - selectedTab.currentURLString = @""; + _selectedTab.currentURLString = @""; [self registerForKeyboardNotifications]; @@ -105,15 +103,15 @@ - (void)registerForKeyboardNotifications } - (void)keyboardWasShown:(NSNotification *)aNotification { - if (![self isPad] && [selectedTab currentURL] == nil && ![addressBar isFirstResponder]) { + if (![self isPad] && [_selectedTab currentURL] == nil && ![_addressBar isFirstResponder]) { [self scrollToTop:aNotification]; - [[selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '-15px'"]; + [[_selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '-15px'"]; } } - (void)keyboardWasHidden:(NSNotification*)aNotification { - if (![self isPad] && [selectedTab currentURL] == nil && ![addressBar isFirstResponder]) { - [[selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '15%'"]; + if (![self isPad] && [_selectedTab currentURL] == nil && ![_addressBar isFirstResponder]) { + [[_selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '15%'"]; [self scrollToTop:aNotification]; } } @@ -147,7 +145,7 @@ -(void) openSavedTabs { for (NSManagedObject *tab in tabFetchResults) { [self addTabWithAddress:[tab valueForKey:@"url"]]; - [selectedTab setTitle:[tab valueForKey:@"title"]]; + [_selectedTab setTitle:[tab valueForKey:@"title"]]; [managedObjectContext deleteObject:tab]; } @@ -202,27 +200,27 @@ - (void)didReceiveMemoryWarning -(IBAction)scrollToTop:(id)sender { if (![self isPad]) { - BOOL animated = ![sender isKindOfClass:[NSNotification class]]; - [[[self webView] scrollView] setContentOffset:CGPointMake(0, - topBar.frame.size.height) animated:NO]; +// BOOL animated = ![sender isKindOfClass:[NSNotification class]]; + [[[self webView] scrollView] setContentOffset:CGPointMake(0, - _topBar.frame.size.height) animated:NO]; [[[self webView] scrollView] setContentInset:UIEdgeInsetsMake(-[[self webView] scrollView].contentOffset.y, 0, 0, 0)]; } } - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ ScrollDirection scrollDirection; - int minWebViewSize = webViewTemplate.frame.size.height; - int maxWebViewSize = minWebViewSize + bottomBar.frame.size.height; + int minWebViewSize = _webViewTemplate.frame.size.height; + int maxWebViewSize = minWebViewSize + _bottomBar.frame.size.height; if (self.lastScrollContentOffset > scrollView.contentOffset.y) scrollDirection = ScrollDirectionUp; else if (self.lastScrollContentOffset < scrollView.contentOffset.y) scrollDirection = ScrollDirectionDown; - if (saveScrollPosition) { - selectedTab.scrollPosition = scrollView.contentOffset.y; + if (_saveScrollPosition) { + _selectedTab.scrollPosition = scrollView.contentOffset.y; } if(![self isPad]) { UIView *statusBarView = [(UIMainView *)self.view statusBarView]; - if (scrollView.contentOffset.y <= -topBar.frame.size.height) { + if (scrollView.contentOffset.y <= -_topBar.frame.size.height) { // noop } else if (scrollView.contentOffset.y < -statusBarView.frame.size.height) { [[[self webView] scrollView] setContentInset:UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0)]; @@ -231,30 +229,30 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ } // show bottom toolbar when scrolling up fast - if (scrollDirection == ScrollDirectionUp && scrollView.contentOffset.y - self.lastScrollContentOffset < -20 && bottomBar.alpha == 0.0) { + if (scrollDirection == ScrollDirectionUp && scrollView.contentOffset.y - self.lastScrollContentOffset < -20 && _bottomBar.alpha == 0.0) { [UIView animateWithDuration: 0.5 delay: 0.0 options: UIViewAnimationOptionCurveEaseOut animations:^{ - bottomBar.alpha = 1.0; + _bottomBar.alpha = 1.0; } completion:^(BOOL finished){ if (finished) { - [selectedTab webView].frame = CGRectMake([selectedTab webView].frame.origin.x, [selectedTab webView].frame.origin.y, [selectedTab webView].frame.size.width, minWebViewSize); + [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, minWebViewSize); } }]; - topBar.frame=CGRectMake(0,0, topBar.frame.size.width, topBar.frame.size.height); + _topBar.frame=CGRectMake(0,0, _topBar.frame.size.width, _topBar.frame.size.height); } else if (scrollView.contentOffset.y > 0 && scrollView.contentOffset.y + scrollView.frame.size.height < scrollView.contentSize.height) { - if (scrollDirection == ScrollDirectionDown && bottomBar.alpha == 1.0) { - [selectedTab webView].frame = CGRectMake([selectedTab webView].frame.origin.x, [selectedTab webView].frame.origin.y, [selectedTab webView].frame.size.width, maxWebViewSize); + if (scrollDirection == ScrollDirectionDown && _bottomBar.alpha == 1.0) { + [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, maxWebViewSize); [UIView animateWithDuration: 1.0 delay: 0.0 options: UIViewAnimationOptionCurveEaseIn animations:^{ - bottomBar.alpha = 0.0; + _bottomBar.alpha = 0.0; } completion:^(BOOL finished){ if (finished) { @@ -263,20 +261,20 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ } // show bottom toolbar - } else if (bottomBar.alpha == 0.0) { + } else if (_bottomBar.alpha == 0.0) { [UIView animateWithDuration: 0.5 delay: 0.0 options: UIViewAnimationOptionCurveEaseOut animations:^{ - bottomBar.alpha = 1.0; + _bottomBar.alpha = 1.0; } completion:^(BOOL finished){ if (finished) { - [selectedTab webView].frame = CGRectMake([selectedTab webView].frame.origin.x, [selectedTab webView].frame.origin.y, [selectedTab webView].frame.size.width, minWebViewSize); + [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, minWebViewSize); if (scrollView.contentOffset.y > 0) { - CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - [selectedTab webView].frame.size.height); + CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - [_selectedTab webView].frame.size.height); [scrollView setContentOffset:bottomOffset animated:NO]; } } @@ -286,9 +284,9 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ } //topbar logic - if(![self isPad] && scrollView.contentOffset.y>=-topBar.frame.size.height && (scrollView.contentOffset.y <= 0 || scrollDirection == ScrollDirectionDown)) + if(![self isPad] && scrollView.contentOffset.y>=-_topBar.frame.size.height && (scrollView.contentOffset.y <= 0 || scrollDirection == ScrollDirectionDown)) { - topBar.frame=CGRectMake(0,-topBar.frame.size.height-scrollView.contentOffset.y, topBar.frame.size.width, topBar.frame.size.height); + _topBar.frame=CGRectMake(0,-_topBar.frame.size.height-scrollView.contentOffset.y, _topBar.frame.size.width, _topBar.frame.size.height); } self.lastScrollContentOffset = scrollView.contentOffset.y; @@ -301,7 +299,7 @@ - (void)showHideView delay: 0.0 options: UIViewAnimationOptionCurveEaseIn animations:^{ - bottomBar.alpha = 0.0; + _bottomBar.alpha = 0.0; } completion:^(BOOL finished){ // Wait one second and then fade in the view @@ -309,7 +307,7 @@ - (void)showHideView delay: 1.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ - bottomBar.alpha = 1.0; + _bottomBar.alpha = 1.0; } completion:nil]; }]; @@ -320,46 +318,46 @@ - (void)showHideView // Web methods - (void) currentWebViewDidStartLoading:(UIWebView *) webView { - if (addressBar.editing) { + if (_addressBar.editing) { [webView stopLoading]; return; } Tab *tab = nil; - for (id cTab in tabs) { + for (id cTab in _tabs) { if ([cTab webView] == webView) { tab = cTab; } } - if (tab == selectedTab) { + if (tab == _selectedTab) { - if (initialPageLoad) { - [refreshButton setHidden:true]; - [stopButton setHidden:false]; + if (_initialPageLoad) { + [_refreshButton setHidden:true]; + [_stopButton setHidden:false]; } } - if (progressBar.progress < 0.95) { - [progressBar setProgress: progressBar.progress + 0.05]; + if (_progressBar.progress < 0.95) { + [_progressBar setProgress:_progressBar.progress + 0.05]; } [self setInitialPageLoad:NO]; } -(void) currentWebViewDidFinishFinalLoad:(UIWebView *) webView { - [progressBar setProgress:1.0 animated:NO]; - [progressBar setHidden:YES]; + [_progressBar setProgress:1.0 animated:NO]; + [_progressBar setHidden:YES]; - [stopButton setHidden:YES]; + [_stopButton setHidden:YES]; NSURL *url = [webView.request URL]; if ([url isFileURL] || [[url absoluteString] isEqualToString:@"about:blank"]) { - [refreshButton setHidden:YES]; + [_refreshButton setHidden:YES]; } else { - [refreshButton setHidden:NO]; + [_refreshButton setHidden:NO]; } - if (saveScrollPosition && [selectedTab scrollPosition] > 0) { - [[[self webView] scrollView] setContentOffset:CGPointMake(0, [selectedTab scrollPosition]) animated:NO]; + if (_saveScrollPosition && [_selectedTab scrollPosition] > 0) { + [[[self webView] scrollView] setContentOffset:CGPointMake(0, [_selectedTab scrollPosition]) animated:NO]; } [self loadTabs:webView]; } @@ -373,13 +371,13 @@ -(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Ta [[self webView] stopLoading]; //[[self webView] loadHTMLString:@"" baseURL:[NSURL URLWithString:@"about:blank" ]]; - saveScrollPosition = [[[request URL] host] isEqualToString:@"duckduckgo.com"] || [[[request URL] host] isEqualToString:@"www.duckduckgo.com"]; + _saveScrollPosition = [[[request URL] host] isEqualToString:@"duckduckgo.com"] || [[[request URL] host] isEqualToString:@"www.duckduckgo.com"]; if (![self isPad]) { [self scrollToTop:nil]; } - [oldAddressText setString:[addressBar text]]; + [_oldAddressText setString:[_addressBar text]]; // Load the request in the UIWebView. if ([self checkNetworkStatus]) { @@ -395,11 +393,11 @@ -(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Ta if ( [[[request URL] host] isEqualToString:@"itunes.apple.com"]) { [[UIApplication sharedApplication] openURL: mRequest.URL ]; } else { - [progressBar setHidden:NO]; - [progressBar setProgress:0.1 animated:NO]; + [_progressBar setHidden:NO]; + [_progressBar setProgress:0.1 animated:NO]; tab.urlConnection = nil; tab.urlConnection = [[NSURLConnection alloc] initWithRequest:mRequest delegate:tab]; - if (sender != refreshButton) { + if (sender != _refreshButton) { [tab updateHistory]; } } @@ -413,38 +411,38 @@ -(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Ta otherButtonTitles:@"Okay", nil]; [netAlert show];*/ - [progressBar setHidden:YES]; + [_progressBar setHidden:YES]; [self cannotConnect:nil]; } - [addressBar resignFirstResponder]; + [_addressBar resignFirstResponder]; } -(IBAction) didStartEditingAddressBar:(id)sender { - if ([[addressBar text] length] > 0) { + if ([[_addressBar text] length] > 0) { [self performSelector:@selector(selectAllAddressText) withObject:nil afterDelay:0.0]; } - [addressBarButtonsView setHidden:YES]; + [_addressBarButtonsView setHidden:YES]; } -(void) selectAllAddressText { - [addressBar setSelectedTextRange:[addressBar textRangeFromPosition:addressBar.beginningOfDocument toPosition:addressBar.endOfDocument]]; + [_addressBar setSelectedTextRange:[_addressBar textRangeFromPosition:_addressBar.beginningOfDocument toPosition:_addressBar.endOfDocument]]; } -(IBAction) gotoAddress:(id) sender { - [addressBarButtonsView setHidden:NO]; - [stopButton setHidden:NO]; - [refreshButton setHidden:YES]; + [_addressBarButtonsView setHidden:NO]; + [_stopButton setHidden:NO]; + [_refreshButton setHidden:YES]; - NSString *inputText = [[addressBar text] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - gotoUrl = [NSURL URLWithString:inputText]; - if (gotoUrl != nil && (!([[gotoUrl scheme] isEqualToString:@"http"] || [[gotoUrl scheme] isEqualToString:@"https"]))) { - gotoUrl = [NSURL URLWithString: [@"http://" stringByAppendingString: [gotoUrl absoluteString]]]; + NSString *inputText = [[_addressBar text] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + _gotoUrl = [NSURL URLWithString:inputText]; + if (_gotoUrl != nil && (!([[_gotoUrl scheme] isEqualToString:@"http"] || [[_gotoUrl scheme] isEqualToString:@"https"]))) { + _gotoUrl = [NSURL URLWithString: [@"http://" stringByAppendingString: [_gotoUrl absoluteString]]]; } - NSURLRequest *request = [NSURLRequest requestWithURL:gotoUrl]; + NSURLRequest *request = [NSURLRequest requestWithURL:_gotoUrl]; if ([inputText rangeOfString:@"."].location != NSNotFound && [NSURLConnection canHandleRequest:request]){ - [self gotoAddress:sender withRequestObj:request inTab:selectedTab]; + [self gotoAddress:sender withRequestObj:request inTab:_selectedTab]; } else { [self searchWeb:sender]; } @@ -455,7 +453,7 @@ -(IBAction) didEndEditingAddressBar:(id)sender { } -(IBAction) searchWeb:(id) sender { - NSString *searchQuery = [addressBar text]; + NSString *searchQuery = [_addressBar text]; NSString *encodedSearchQuery = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)searchQuery, @@ -466,19 +464,19 @@ -(IBAction) searchWeb:(id) sender { // Load the request in the UIWebView. if ([self checkNetworkStatus]) { - [self gotoAddress:sender withRequestObj:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] inTab:selectedTab]; + [self gotoAddress:sender withRequestObj:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] inTab:_selectedTab]; } else { [self cannotConnect:nil]; - [progressBar setHidden:YES]; + [_progressBar setHidden:YES]; } //Load the request in the UIWebView. - [addressBar resignFirstResponder]; + [_addressBar resignFirstResponder]; } -(void) cannotConnect:(UIWebView *) cnWebView { - [stopButton setHidden:NO]; - [refreshButton setHidden:YES]; + [_stopButton setHidden:NO]; + [_refreshButton setHidden:YES]; NSURL *ucUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"unable_to_connect" ofType:@"html"] isDirectory:NO]; NSString *ucContentString = [NSString stringWithContentsOfURL:ucUrl encoding:NSUTF8StringEncoding error:nil]; [[self webView] loadHTMLString:ucContentString baseURL:nil]; @@ -486,13 +484,13 @@ -(void) cannotConnect:(UIWebView *) cnWebView { -(IBAction) goBack:(id)sender { - [selectedTab goBack]; + [_selectedTab goBack]; self.reloadOnPageLoad = YES; } -(IBAction) goForward:(id)sender { - [selectedTab goForward]; + [_selectedTab goForward]; //[[self webView] stringByEvaluatingJavaScriptFromString:@"history.forward();"]; } @@ -507,7 +505,7 @@ -(IBAction) showBookmarks:(id)sender { -(void) showBookmarksView:(id)sender { [UIView transitionFromView:self.view - toView:[bookmarksController view] + toView:[_bookmarksController view] duration:0.5 options:(UIViewAnimationOptionTransitionCrossDissolve) completion:^(BOOL finished) {}]; @@ -515,19 +513,19 @@ -(void) showBookmarksView:(id)sender { } -(IBAction) stopLoading:(id)sender { - [stopButton setHidden:true]; - [refreshButton setHidden:false]; - [progressBar setHidden:YES]; + [_stopButton setHidden:true]; + [_refreshButton setHidden:false]; + [_progressBar setHidden:YES]; //[activityIndicator stopAnimating]; - if ([tabs count] > 0) { - [[selectedTab webView] stopLoading]; + if ([_tabs count] > 0) { + [[_selectedTab webView] stopLoading]; } } -(NSArray *) actionSheetButtons { // hide add bookmark for local html files - if ([[[selectedTab webView] request].URL isFileURL]) { + if ([[[_selectedTab webView] request].URL isFileURL]) { return [NSArray arrayWithObjects:@"Clear Cookies", @"Clear Cache", @"Import Bookmarks", nil]; } else { return [NSArray arrayWithObjects:@"Add Bookmark", @"Clear Cookies", @"Clear Cache", @"Import Bookmarks", nil]; @@ -538,21 +536,21 @@ -(IBAction)showActionSheet:(id)sender { // Hide popover for ipad if ([self isPad] ) { - if (padPopover.popoverVisible) { - [padPopover dismissPopoverAnimated:YES]; + if (_padPopover.popoverVisible) { + [_padPopover dismissPopoverAnimated:YES]; } - if (popupQuery.visible || barItemPopoverPresenter == moreButton) { - barItemPopoverPresenter = nil; - [popupQuery dismissWithClickedButtonIndex:nil animated:YES]; + if (_popupQuery.visible || _barItemPopoverPresenter == _moreButton) { + _barItemPopoverPresenter = nil; + [_popupQuery dismissWithClickedButtonIndex:nil animated:YES]; } else { [self generatePopupQuery]; - barItemPopoverPresenter = moreButton; - [popupQuery showFromBarButtonItem:moreButton animated:YES]; + _barItemPopoverPresenter = _moreButton; + [_popupQuery showFromBarButtonItem:_moreButton animated:YES]; } } else { [self generatePopupQuery]; - [popupQuery showInView:self.view]; + [_popupQuery showInView:self.view]; } } @@ -573,7 +571,7 @@ -(void) generatePopupQuery { -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { // skip add bookmarks if we are loading a local file - if ([[[selectedTab webView] request].URL isFileURL]) { + if ([[[_selectedTab webView] request].URL isFileURL]) { buttonIndex += 1; } // Add Bookmark @@ -604,31 +602,31 @@ -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger) NSString *path = [[NSBundle mainBundle] pathForResource:@"import_bookmark_howto" ofType:@"html"]; NSData *launchData = [NSData dataWithContentsOfFile:path]; [[self webView] loadData:launchData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; - [addressBar setText:urlAddress]; + [_addressBar setText:urlAddress]; } } -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { [sheet dismissWithClickedButtonIndex:0 animated:YES]; - [bookmarksFormController setMode:'A']; - [[bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; - [bookmarksController pushViewController:bookmarksFormController animated:NO]; + [_bookmarksFormController setMode:'A']; + [[_bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; + [_bookmarksController pushViewController:_bookmarksFormController animated:NO]; if ([self isPad]) { - if (padPopover == nil) { + if (_padPopover == nil) { UIPopoverController *ppop = [[UIPopoverController alloc] - initWithContentViewController:bookmarksController]; + initWithContentViewController:_bookmarksController]; self.padPopover = ppop; } else { - [self.padPopover setContentViewController:bookmarksController animated:YES]; + [self.padPopover setContentViewController:_bookmarksController animated:YES]; } - [self.padPopover presentPopoverFromBarButtonItem: bookmarkButton + [self.padPopover presentPopoverFromBarButtonItem:_bookmarkButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } else { [UIView transitionFromView:self.view - toView:[bookmarksController view] + toView:[_bookmarksController view] duration:0.5 options:(UIViewAnimationOptionTransitionCrossDissolve) completion:^(BOOL finished) {}]; @@ -638,7 +636,7 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { // TABS -(IBAction) addTab:(id)sender { - if (tabsView.hidden) { + if (_tabsView.hidden) { [self toggleTabsView:sender]; } [self addTabWithAddress:@""]; @@ -646,8 +644,8 @@ -(IBAction) addTab:(id)sender { -(void) addTabWithAddress:(NSString *)urlAddress { - if ([tabs count] == 0) { - tabs = [[NSMutableArray alloc] initWithCapacity:8]; + if ([_tabs count] == 0) { + _tabs = [[NSMutableArray alloc] initWithCapacity:8]; } // reset navbar //[self contractBar:sender]; @@ -655,36 +653,36 @@ -(void) addTabWithAddress:(NSString *)urlAddress { [self stopLoading:sender]; }*/ - Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake((100.0 * [tabs count]) + 2.0, 2.0, 100.0, 34.0) addTarget: self]; + Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake((100.0 * [_tabs count]) + 2.0, 2.0, 100.0, 34.0) addTarget: self]; - [self switchTabFrom:selectedTab ToTab:nTab]; - [tabsView addSubview:selectedTab]; + [self switchTabFrom:_selectedTab ToTab:nTab]; + [_tabsView addSubview:_selectedTab]; - [tabs addObject:selectedTab]; - [selectedTab select]; + [_tabs addObject:_selectedTab]; + [_selectedTab select]; //scrolling - tabsView.contentSize = CGSizeMake(((100.0) * [tabs count]) + 5.0, 23.0); - if (tabsView.frame.size.width < tabsView.contentSize.width) { - tabsView.contentOffset = CGPointMake(tabsView.contentSize.width - tabsView.frame.size.width,0); + _tabsView.contentSize = CGSizeMake(((100.0) * [_tabs count]) + 5.0, 23.0); + if (_tabsView.frame.size.width < _tabsView.contentSize.width) { + _tabsView.contentOffset = CGPointMake(_tabsView.contentSize.width - _tabsView.frame.size.width,0); } - tabsView.clipsToBounds = YES; - tabsView.showsHorizontalScrollIndicator = NO; + _tabsView.clipsToBounds = YES; + _tabsView.showsHorizontalScrollIndicator = NO; if ([urlAddress isEqualToString:@""]) { NSString *path = [[NSBundle mainBundle] pathForResource:@"launch" ofType:@"html"]; NSData *launchData = [NSData dataWithContentsOfFile:path]; [[self webView] loadData:launchData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; - if (![addressBar isFirstResponder]) { - [addressBar setText:urlAddress]; + if (![_addressBar isFirstResponder]) { + [_addressBar setText:urlAddress]; } } else { - [self gotoAddress:nil withRequestObj:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlAddress]] inTab:selectedTab]; + [self gotoAddress:nil withRequestObj:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlAddress]] inTab:_selectedTab]; } - [self loadTabs:[selectedTab webView]]; + [self loadTabs:[_selectedTab webView]]; } -(IBAction) removeTab:(id)sender { @@ -695,9 +693,9 @@ -(IBAction) removeTab:(id)sender { BOOL removed = false; BOOL select = false; - for (id cTab in tabs) { + for (id cTab in _tabs) { if (select) { - [self switchTabFrom:selectedTab ToTab:cTab]; + [self switchTabFrom:_selectedTab ToTab:cTab]; select = false; } if (removed) { @@ -705,51 +703,51 @@ -(IBAction) removeTab:(id)sender { } if ([cTab closeButton] == sender) { removed = YES; - select = (selectedTab == cTab); + select = (_selectedTab == cTab); } } - if (toBeRemoved == [tabs lastObject] && [tabs lastObject] != [NSNull null] && [tabs count] > 1) { - [self switchTabFrom:selectedTab ToTab:[tabs objectAtIndex:[tabs count]-2]]; - } else if ([tabs count] == 0) { + if (toBeRemoved == [_tabs lastObject] && [_tabs lastObject] != [NSNull null] && [_tabs count] > 1) { + [self switchTabFrom:_selectedTab ToTab:[_tabs objectAtIndex:[_tabs count]-2]]; + } else if ([_tabs count] == 0) { self.webView = nil; } [toBeRemoved removeFromSuperview]; [[toBeRemoved webView] removeFromSuperview]; - [tabs removeObject: toBeRemoved]; + [_tabs removeObject: toBeRemoved]; - if ([tabs count] == 0) { + if ([_tabs count] == 0) { [self addTab:nil]; } - [self loadTabs:[selectedTab webView]]; + [self loadTabs:[_selectedTab webView]]; //scrolling - tabsView.contentSize = CGSizeMake(((100.0) * [tabs count]) + 40.0, 23.0); + _tabsView.contentSize = CGSizeMake(((100.0) * [_tabs count]) + 40.0, 23.0); } -(IBAction) selectTab:(id)sender { - for (id cTab in tabs) { + for (id cTab in _tabs) { if ([cTab tabButton] == sender) { - [self switchTabFrom:selectedTab ToTab:cTab]; + [self switchTabFrom:_selectedTab ToTab:cTab]; } } - [self loadTabs:[selectedTab webView]]; + [self loadTabs:[_selectedTab webView]]; } -(void) switchTabFrom:(Tab *)fromTab ToTab:(Tab *)toTab { - if ([tabs count] > 0) { + if ([_tabs count] > 0) { [fromTab deselect]; } [toTab select]; - selectedTab = toTab; + _selectedTab = toTab; if (![toTab loading]) { [[self progressBar] setHidden:YES]; [[self stopButton] setHidden:YES]; [[self refreshButton] setHidden:NO]; - [[self addressBar] setText:[selectedTab currentURLString]]; + [[self addressBar] setText:[_selectedTab currentURLString]]; } else { [[self progressBar] setHidden:NO]; [[self stopButton] setHidden:NO]; @@ -809,11 +807,11 @@ -(void) switchTabFrom:(Tab *)fromTab ToTab:(Tab *)toTab { // WEBVIEW -(UIWebView *) webView { - return [selectedTab webView]; + return [_selectedTab webView]; } -(UIWebView *) setWebView:(UIWebView *)newWebView { - [selectedTab setWebView:newWebView]; + [_selectedTab setWebView:newWebView]; return newWebView; } @@ -823,7 +821,7 @@ -(void) loadTabs:(UIWebView *)webView { [[self view] sendSubviewToBack:webView]; - for (id cTab in tabs) { + for (id cTab in _tabs) { if ([cTab webView] == webView) { tab = cTab; } else { @@ -831,34 +829,34 @@ -(void) loadTabs:(UIWebView *)webView { } } - if (tab == selectedTab) { + if (tab == _selectedTab) { if ([webView request] == nil || [[webView request].URL isFileURL]) { - if (![addressBar isFirstResponder]) { - [addressBar setText: @""]; + if (![_addressBar isFirstResponder]) { + [_addressBar setText: @""]; } } else { NSString *addressText = tab.currentURLString; if (![addressText isEqualToString:@"about:blank"] && [addressText rangeOfString:@"https://duckduckgo.com"].location == NSNotFound) { - if (![addressBar isFirstResponder]) { - [addressBar setText: addressText]; + if (![_addressBar isFirstResponder]) { + [_addressBar setText:addressText]; } - [refreshButton setHidden:[tab loading]]; + [_refreshButton setHidden:[tab loading]]; } } - if([selectedTab canGoForward]) { - forwardButton.enabled = TRUE; + if([_selectedTab canGoForward]) { + _forwardButton.enabled = TRUE; } - else if(![selectedTab canGoForward]) { - forwardButton.enabled = FALSE; + else if(![_selectedTab canGoForward]) { + _forwardButton.enabled = FALSE; } - if([selectedTab canGoBack]) { - backButton.enabled = TRUE; + if([_selectedTab canGoBack]) { + _backButton.enabled = TRUE; } - else if(![selectedTab canGoBack]) { - backButton.enabled = FALSE; + else if(![_selectedTab canGoBack]) { + _backButton.enabled = FALSE; } } From c0aa30cb6cb369671cb0af8e2de4c43ad1e5ebd5 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Fri, 18 Jul 2014 15:52:28 -0700 Subject: [PATCH 06/60] More warning fixes. --- Browser/BrowserViewController.h | 2 +- Browser/BrowserViewController.m | 10 +++++----- Browser/Tab.m | 4 +--- sample-app/TestBrowser.xcodeproj/project.pbxproj | 2 -- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index e94db2d..3359ae3 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -77,7 +77,7 @@ -(void) addTabWithAddress:(NSString *)urlAddress; -(IBAction) selectTab:(id)sender; -(IBAction) removeTab:(id)sender; --(IBAction) toggleTabsView:(id)sender; +//-(IBAction) toggleTabsView:(id)sender; -(void) loadTabs:(UIWebView *) webView; -(void) switchTabFrom:(Tab *)fromTab ToTab:(Tab *)toTab; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 92e5c08..a9a2140 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -542,7 +542,7 @@ -(IBAction)showActionSheet:(id)sender { if (_popupQuery.visible || _barItemPopoverPresenter == _moreButton) { _barItemPopoverPresenter = nil; - [_popupQuery dismissWithClickedButtonIndex:nil animated:YES]; + [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:YES]; } else { [self generatePopupQuery]; _barItemPopoverPresenter = _moreButton; @@ -636,9 +636,9 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { // TABS -(IBAction) addTab:(id)sender { - if (_tabsView.hidden) { - [self toggleTabsView:sender]; - } +// if (_tabsView.hidden) { +// [self toggleTabsView:sender]; +// } [self addTabWithAddress:@""]; } @@ -886,7 +886,7 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { - (BOOL) checkNetworkStatus { Reachability *reachability = [Reachability reachabilityForInternetConnection]; - NetworkStatus *netstat = [reachability currentReachabilityStatus]; + NetworkStatus netstat = [reachability currentReachabilityStatus]; return netstat != NotReachable; } diff --git a/Browser/Tab.m b/Browser/Tab.m index 16436af..1c2425b 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -202,11 +202,9 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [[_response MIMEType] isEqualToString:@"application/xhtml+xml"] || [[_response MIMEType] isEqualToString:@"text/vnd.wap.wml"]) { - NSStringEncoding *enc = NULL; + NSStringEncoding enc = NSUTF8StringEncoding; if ([_response textEncodingName] != nil) { enc = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[_response textEncodingName])); - } else { - enc = NSUTF8StringEncoding; } NSString *page = (NSString *)[[NSString alloc] initWithData:_pageData encoding:enc]; diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index ac0b439..c86e9c8 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -56,7 +56,6 @@ FAF75EEA18A17BFD007B317D /* iphone_delete_button.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDE18A17BFD007B317D /* iphone_delete_button.png */; }; FAF75EEB18A17BFD007B317D /* refresh.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDF18A17BFD007B317D /* refresh.png */; }; FAF75EEC18A17BFD007B317D /* tabs.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EE018A17BFD007B317D /* tabs.png */; }; - FAF75EED18A17BFD007B317D /* JSTools.js in Sources */ = {isa = PBXBuildFile; fileRef = FAF75EE118A17BFD007B317D /* JSTools.js */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -384,7 +383,6 @@ B572E55818D08D2A005E4834 /* BookmarksController.m in Sources */, B572E55A18D08D2A005E4834 /* BrowserViewController.m in Sources */, FAC9B27716F27BF800E37710 /* ViewController.m in Sources */, - FAF75EED18A17BFD007B317D /* JSTools.js in Sources */, B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 82ca90efe0cffdbd9a75867d25cada36b5ce858d Mon Sep 17 00:00:00 2001 From: Obi Date: Fri, 18 Jul 2014 15:55:17 -0700 Subject: [PATCH 07/60] Fixed broken bookmarks view controller autorotation. --- Browser/BookmarksController.m | 15 +++++---------- Browser/BrowserViewController.m | 13 ++++++------- sample-app/TestBrowser/TestBrowser-Info.plist | 1 + 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 118d002..05c8fc3 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -72,8 +72,7 @@ -(void) viewWillAppear:(BOOL)animated { - (NSUInteger) supportedInterfaceOrientations { // Return a bitmask of supported orientations. If you need more, // use bitwise or (see the commented return). - return UIInterfaceOrientationMaskPortrait; - // return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; + return UIInterfaceOrientationMaskAll; } - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { @@ -82,6 +81,7 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // case it launches in the current orientation return UIInterfaceOrientationPortrait; } + - (NSMutableArray *) reloadBookmarks { if (managedObjectContext == nil) @@ -123,14 +123,9 @@ - (IBAction)switchToBrowser:(id)sender { if (mode == 'E') { [self finishEditMode:sender]; } - - [UIView transitionFromView:[self.navigationController view] - toView: [browserController view] - duration:0.5 - options:(UIViewAnimationOptionTransitionCrossDissolve) - completion:^(BOOL finished) {}]; - - [self.navigationController popToRootViewControllerAnimated:NO]; + [UIView animateWithDuration:0.25 animations:^{ + [self.navigationController view].alpha =0.0f; + }]; } -(void) openBookmark:(NSIndexPath *) indexPath{ diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 2b8666a..5aa644c 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -78,6 +78,8 @@ - (void)viewDidLoad [bookmarkFolderFormController setBookmarksController:bookmarksController]; [bookmarksController setFolderController:bookmarkFolderFormController]; [self setBookmarksController:bookmarksNavController]; + [self.view addSubview:self.bookmarksController.view]; + self.bookmarksController.view.alpha = 0.0f; //Hide the bookmarks controller // Tweak address bar view so text doesn't overflow UIView *addressBarStatusView = [[ UIView alloc ] initWithFrame: @@ -505,13 +507,10 @@ -(IBAction) showBookmarks:(id)sender { } -(void) showBookmarksView:(id)sender { - - [UIView transitionFromView:self.view - toView:[bookmarksController view] - duration:0.5 - options:(UIViewAnimationOptionTransitionCrossDissolve) - completion:^(BOOL finished) {}]; - + [self.view bringSubviewToFront:bookmarksController.view]; + [UIView animateWithDuration:0.25 animations:^{ + bookmarksController.view.alpha =1.0f; + }]; } -(IBAction) stopLoading:(id)sender { diff --git a/sample-app/TestBrowser/TestBrowser-Info.plist b/sample-app/TestBrowser/TestBrowser-Info.plist index 07b5c12..2ee64ea 100644 --- a/sample-app/TestBrowser/TestBrowser-Info.plist +++ b/sample-app/TestBrowser/TestBrowser-Info.plist @@ -31,6 +31,7 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight From 792b01f9ebd5d7bda69ea1147ae2a2ad66e2a6b8 Mon Sep 17 00:00:00 2001 From: Obi Date: Mon, 21 Jul 2014 14:02:15 -0700 Subject: [PATCH 08/60] Arranged the assets and source code into logical groups. --- .../TestBrowser.xcodeproj/project.pbxproj | 108 ++++++++++-------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index c86e9c8..a59a336 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -44,7 +44,6 @@ FAF75EA518A17A77007B317D /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */; }; FAF75EA618A17A77007B317D /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9218A17A77007B317D /* MainWindow.xib */; }; FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9318A17A77007B317D /* Bookmarks.xib */; }; - FAF75EA818A17A77007B317D /* BrowserModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = FAF75E9418A17A77007B317D /* BrowserModel.xcdatamodeld */; }; FAF75EE218A17BFD007B317D /* BrowserModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */; }; FAF75EE318A17BFD007B317D /* arrow-left.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED718A17BFD007B317D /* arrow-left.png */; }; FAF75EE418A17BFD007B317D /* arrow-right.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED818A17BFD007B317D /* arrow-right.png */; }; @@ -62,21 +61,21 @@ 71ED23B4194470B2002ACD24 /* BrowserDelegate.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = BrowserDelegate.h; path = ../Browser/BrowserDelegate.h; sourceTree = ""; }; 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserDelegate.m; path = ../Browser/BrowserDelegate.m; sourceTree = ""; }; B572E54718D08D2A005E4834 /* Tab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Tab.m; path = ../Browser/Tab.m; sourceTree = ""; }; - B572E54818D08D2A005E4834 /* BookmarksController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarksController.m; path = ../Browser/BookmarksController.m; sourceTree = ""; }; - B572E54918D08D2A005E4834 /* BookmarksFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarksFormController.h; path = ../Browser/BookmarksFormController.h; sourceTree = ""; }; - B572E54A18D08D2A005E4834 /* BookmarksFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarksFormController.m; path = ../Browser/BookmarksFormController.m; sourceTree = ""; }; + B572E54818D08D2A005E4834 /* BookmarksController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarksController.m; sourceTree = ""; }; + B572E54918D08D2A005E4834 /* BookmarksFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksFormController.h; sourceTree = ""; }; + B572E54A18D08D2A005E4834 /* BookmarksFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarksFormController.m; sourceTree = ""; }; B572E54B18D08D2A005E4834 /* BrowserViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BrowserViewController.h; path = ../Browser/BrowserViewController.h; sourceTree = ""; }; B572E54C18D08D2A005E4834 /* BrowserViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserViewController.m; path = ../Browser/BrowserViewController.m; sourceTree = ""; }; B572E54D18D08D2A005E4834 /* Tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Tab.h; path = ../Browser/Tab.h; sourceTree = ""; }; B572E54E18D08D2A005E4834 /* UIMainView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UIMainView.h; path = ../Browser/UIMainView.h; sourceTree = ""; }; B572E54F18D08D2A005E4834 /* UIMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UIMainView.m; path = ../Browser/UIMainView.m; sourceTree = ""; }; - B572E55018D08D2A005E4834 /* BookmarkFolderFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkFolderFormController.h; path = ../Browser/BookmarkFolderFormController.h; sourceTree = ""; }; - B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkFolderFormController.m; path = ../Browser/BookmarkFolderFormController.m; sourceTree = ""; }; - B572E55218D08D2A005E4834 /* BookmarkImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkImporter.h; path = ../Browser/BookmarkImporter.h; sourceTree = ""; }; - B572E55318D08D2A005E4834 /* BookmarkImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkImporter.m; path = ../Browser/BookmarkImporter.m; sourceTree = ""; }; - B572E55418D08D2A005E4834 /* BookmarkItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkItem.h; path = ../Browser/BookmarkItem.h; sourceTree = ""; }; - B572E55518D08D2A005E4834 /* BookmarkItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkItem.m; path = ../Browser/BookmarkItem.m; sourceTree = ""; }; - B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarksController.h; path = ../Browser/BookmarksController.h; sourceTree = ""; }; + B572E55018D08D2A005E4834 /* BookmarkFolderFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkFolderFormController.h; sourceTree = ""; }; + B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkFolderFormController.m; sourceTree = ""; }; + B572E55218D08D2A005E4834 /* BookmarkImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkImporter.h; sourceTree = ""; }; + B572E55318D08D2A005E4834 /* BookmarkImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkImporter.m; sourceTree = ""; }; + B572E55418D08D2A005E4834 /* BookmarkItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkItem.h; sourceTree = ""; }; + B572E55518D08D2A005E4834 /* BookmarkItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkItem.m; sourceTree = ""; }; + B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = ""; }; B5A210C018D091F700D65141 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = ../Browser/Reachability.h; sourceTree = ""; }; B5A210C118D091F700D65141 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = ../Browser/Reachability.m; sourceTree = ""; }; FAA4557118A19A2E00B1BDF4 /* gsearch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gsearch.png; sourceTree = ""; }; @@ -111,7 +110,6 @@ FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "MainWindow-iPad.xib"; sourceTree = ""; }; FAF75E9218A17A77007B317D /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; FAF75E9318A17A77007B317D /* Bookmarks.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Bookmarks.xib; sourceTree = ""; }; - FAF75E9518A17A77007B317D /* BrowserModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = BrowserModel.xcdatamodel; sourceTree = ""; }; FAF75ED518A17BFD007B317D /* BrowserModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = BrowserModel.xcdatamodel; sourceTree = ""; }; FAF75ED718A17BFD007B317D /* arrow-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-left.png"; sourceTree = ""; }; FAF75ED818A17BFD007B317D /* arrow-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-right.png"; sourceTree = ""; }; @@ -143,6 +141,47 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0E54DB6D197DAE31005BF033 /* Bookmarks */ = { + isa = PBXGroup; + children = ( + B572E55218D08D2A005E4834 /* BookmarkImporter.h */, + B572E55318D08D2A005E4834 /* BookmarkImporter.m */, + B572E55418D08D2A005E4834 /* BookmarkItem.h */, + B572E55518D08D2A005E4834 /* BookmarkItem.m */, + B572E55618D08D2A005E4834 /* BookmarksController.h */, + B572E54818D08D2A005E4834 /* BookmarksController.m */, + B572E54918D08D2A005E4834 /* BookmarksFormController.h */, + B572E54A18D08D2A005E4834 /* BookmarksFormController.m */, + B572E55018D08D2A005E4834 /* BookmarkFolderFormController.h */, + B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */, + ); + name = Bookmarks; + sourceTree = ""; + }; + 0E54DB6E197DAEA7005BF033 /* Web */ = { + isa = PBXGroup; + children = ( + FAF75EE118A17BFD007B317D /* JSTools.js */, + FAF75E8F18A17A77007B317D /* import_bookmark_howto.html */, + FAA4557818A19D9500B1BDF4 /* unable_to_connect.html */, + FAF75E9018A17A77007B317D /* launch.html */, + ); + name = Web; + sourceTree = ""; + }; + 0E54DB6F197DAECA005BF033 /* Views */ = { + isa = PBXGroup; + children = ( + FAF75E8118A17A77007B317D /* BookmarkFoldersForm.xib */, + FAF75E8218A17A77007B317D /* BookmarkItem.xib */, + FAF75E8318A17A77007B317D /* BookmarksForm.xib */, + FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */, + FAF75E9218A17A77007B317D /* MainWindow.xib */, + FAF75E9318A17A77007B317D /* Bookmarks.xib */, + ); + name = Views; + sourceTree = ""; + }; FAA4557718A19B2700B1BDF4 /* Buttons */ = { isa = PBXGroup; children = ( @@ -214,26 +253,17 @@ FAF75E6A18A179D1007B317D /* Browser */ = { isa = PBXGroup; children = ( - B572E54718D08D2A005E4834 /* Tab.m */, - B572E54818D08D2A005E4834 /* BookmarksController.m */, - B572E54918D08D2A005E4834 /* BookmarksFormController.h */, - B572E54A18D08D2A005E4834 /* BookmarksFormController.m */, - B572E54B18D08D2A005E4834 /* BrowserViewController.h */, - B572E54C18D08D2A005E4834 /* BrowserViewController.m */, + 0E54DB6D197DAE31005BF033 /* Bookmarks */, B572E54D18D08D2A005E4834 /* Tab.h */, + B572E54718D08D2A005E4834 /* Tab.m */, B572E54E18D08D2A005E4834 /* UIMainView.h */, B572E54F18D08D2A005E4834 /* UIMainView.m */, - B572E55018D08D2A005E4834 /* BookmarkFolderFormController.h */, B5A210C018D091F700D65141 /* Reachability.h */, B5A210C118D091F700D65141 /* Reachability.m */, - B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */, - B572E55218D08D2A005E4834 /* BookmarkImporter.h */, - B572E55318D08D2A005E4834 /* BookmarkImporter.m */, - B572E55418D08D2A005E4834 /* BookmarkItem.h */, - B572E55518D08D2A005E4834 /* BookmarkItem.m */, 71ED23B4194470B2002ACD24 /* BrowserDelegate.h */, 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */, - B572E55618D08D2A005E4834 /* BookmarksController.h */, + B572E54B18D08D2A005E4834 /* BrowserViewController.h */, + B572E54C18D08D2A005E4834 /* BrowserViewController.m */, ); name = Browser; path = ../Browser; @@ -242,19 +272,10 @@ FAF75E8018A17A59007B317D /* Browser Resources */ = { isa = PBXGroup; children = ( - FAA4557818A19D9500B1BDF4 /* unable_to_connect.html */, - FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */, + 0E54DB6F197DAECA005BF033 /* Views */, + 0E54DB6E197DAEA7005BF033 /* Web */, FAF75ED618A17BFD007B317D /* Images */, - FAF75EE118A17BFD007B317D /* JSTools.js */, - FAF75E8118A17A77007B317D /* BookmarkFoldersForm.xib */, - FAF75E8218A17A77007B317D /* BookmarkItem.xib */, - FAF75E8318A17A77007B317D /* BookmarksForm.xib */, - FAF75E8F18A17A77007B317D /* import_bookmark_howto.html */, - FAF75E9018A17A77007B317D /* launch.html */, - FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */, - FAF75E9218A17A77007B317D /* MainWindow.xib */, - FAF75E9318A17A77007B317D /* Bookmarks.xib */, - FAF75E9418A17A77007B317D /* BrowserModel.xcdatamodeld */, + FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */, ); name = "Browser Resources"; path = "../Browser Resources"; @@ -373,10 +394,8 @@ B572E55D18D08D2A005E4834 /* BookmarkImporter.m in Sources */, B572E55918D08D2A005E4834 /* BookmarksFormController.m in Sources */, B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */, - FAF75EA818A17A77007B317D /* BrowserModel.xcdatamodeld in Sources */, B5A210C218D091F700D65141 /* Reachability.m in Sources */, B572E55718D08D2A005E4834 /* Tab.m in Sources */, - FAF75EE218A17BFD007B317D /* BrowserModel.xcdatamodeld in Sources */, FAC9B26A16F27BF800E37710 /* main.m in Sources */, FAC9B26E16F27BF800E37710 /* AppDelegate.m in Sources */, B572E55B18D08D2A005E4834 /* UIMainView.m in Sources */, @@ -384,6 +403,7 @@ B572E55A18D08D2A005E4834 /* BrowserViewController.m in Sources */, FAC9B27716F27BF800E37710 /* ViewController.m in Sources */, B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */, + FAF75EE218A17BFD007B317D /* BrowserModel.xcdatamodeld in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -509,16 +529,6 @@ /* End XCConfigurationList section */ /* Begin XCVersionGroup section */ - FAF75E9418A17A77007B317D /* BrowserModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - FAF75E9518A17A77007B317D /* BrowserModel.xcdatamodel */, - ); - currentVersion = FAF75E9518A17A77007B317D /* BrowserModel.xcdatamodel */; - path = BrowserModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */ = { isa = XCVersionGroup; children = ( From 846cc74d51dabee8529bacccbb4e06e51ad66649 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Mon, 21 Jul 2014 14:32:25 -0700 Subject: [PATCH 09/60] Removed ivars to coincide with more modern Objective-C coding practices. --- Browser/UIMainView.h | 10 +++------- Browser/UIMainView.m | 6 ++---- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Browser/UIMainView.h b/Browser/UIMainView.h index 4034745..a64fde5 100644 --- a/Browser/UIMainView.h +++ b/Browser/UIMainView.h @@ -8,14 +8,10 @@ #import @class BrowserViewController; -@interface UIMainView : UIView { - IBOutlet UIView *statusBarView; - IBOutlet BrowserViewController *controller; - IBOutlet NSLayoutConstraint *statusViewHeightConstraint; -} +@interface UIMainView : UIView -@property(nonatomic,strong) UIView *statusBarView; -@property(nonatomic,strong) BrowserViewController *controller; +@property(nonatomic, strong) IBOutlet UIView *statusBarView; +@property(nonatomic, strong) IBOutlet BrowserViewController *controller; @property(nonatomic, strong) IBOutlet NSLayoutConstraint *statusViewHeightConstraint; - (void) sizeStatusBar; diff --git a/Browser/UIMainView.m b/Browser/UIMainView.m index 0ff7f1d..86dc400 100644 --- a/Browser/UIMainView.m +++ b/Browser/UIMainView.m @@ -10,8 +10,6 @@ @implementation UIMainView -@synthesize statusBarView, statusViewHeightConstraint, controller; - - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; @@ -29,8 +27,8 @@ - (void) sizeStatusBar { - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if ([event type]==UIEventTypeTouches) { UIView *v=[super hitTest:point withEvent:event]; - if (statusBarView==v) { - [controller scrollToTop:self]; + if (_statusBarView==v) { + [_controller scrollToTop:self]; } else { return v; } From 640e5d414fbb23b4b990a8d6231435a82df35fcd Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Mon, 21 Jul 2014 17:54:21 -0700 Subject: [PATCH 10/60] Added Logging.h to project for trace logging purposes which makes development easier. Minor code cleanup. --- Browser/BrowserViewController.m | 109 +++++++++++- Browser/Logging/Logging.h | 163 ++++++++++++++++++ Browser/Tab.m | 60 ++++++- .../TestBrowser.xcodeproj/project.pbxproj | 10 ++ 4 files changed, 332 insertions(+), 10 deletions(-) create mode 100755 Browser/Logging/Logging.h diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index f233a67..9121e2a 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -13,6 +13,7 @@ #import "UIMainView.h" #import "BrowserDelegate.h" #import "Reachability.h" +#import "Logging.h" #import @@ -37,6 +38,8 @@ @implementation BrowserViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (nibNameOrNil == nil) { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { nibNameOrNil = @"MainWindow"; @@ -50,6 +53,8 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (void)viewDidLoad { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [super viewDidLoad]; //set background for toolbar in top bar @@ -94,6 +99,8 @@ - (void)viewDidLoad - (void)registerForKeyboardNotifications { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; @@ -105,6 +112,8 @@ - (void)registerForKeyboardNotifications } - (void)keyboardWasShown:(NSNotification *)aNotification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (![self isPad] && [_selectedTab currentURL] == nil && ![_addressBar isFirstResponder]) { [self scrollToTop:aNotification]; [[_selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '-15px'"]; @@ -112,6 +121,8 @@ - (void)keyboardWasShown:(NSNotification *)aNotification { } - (void)keyboardWasHidden:(NSNotification*)aNotification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (![self isPad] && [_selectedTab currentURL] == nil && ![_addressBar isFirstResponder]) { [[_selectedTab webView] stringByEvaluatingJavaScriptFromString:@"document.getElementById('contain').style.top = '15%'"]; [self scrollToTop:aNotification]; @@ -119,6 +130,8 @@ - (void)keyboardWasHidden:(NSNotification*)aNotification { } -(void) saveOpenTabs { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSError *error; int orderCount = 0; @@ -135,6 +148,8 @@ -(void) saveOpenTabs { } -(void) openSavedTabs { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSError *error = nil; @@ -158,6 +173,8 @@ -(void) openSavedTabs { } -(void) deleteSavedTabs { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSError *error = nil; @@ -175,6 +192,8 @@ -(void) deleteSavedTabs { } - (void) viewDidAppear:(BOOL)animated { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [super viewDidAppear:animated]; //create initial tab if ([self.tabs count] == 0) { @@ -184,16 +203,22 @@ - (void) viewDidAppear:(BOOL)animated { } - (void) viewWillAppear:(BOOL)animated { + LogTrace(@"%s", __PRETTY_FUNCTION__); + //[refreshButton setHidden:YES]; [super viewWillAppear:animated]; } -(void) viewWillDisappear:(BOOL)animated { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self.navigationController setNavigationBarHidden:NO animated:animated]; } - (void)didReceiveMemoryWarning { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @@ -201,6 +226,8 @@ - (void)didReceiveMemoryWarning // Scrolling -(IBAction)scrollToTop:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (![self isPad]) { // BOOL animated = ![sender isKindOfClass:[NSNotification class]]; [[[self webView] scrollView] setContentOffset:CGPointMake(0, - _topBar.frame.size.height) animated:NO]; @@ -209,6 +236,8 @@ -(IBAction)scrollToTop:(id)sender { } - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ + LogTrace(@"%s", __PRETTY_FUNCTION__); + ScrollDirection scrollDirection; int minWebViewSize = _webViewTemplate.frame.size.height; int maxWebViewSize = minWebViewSize + _bottomBar.frame.size.height; @@ -296,6 +325,8 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ - (void)showHideView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Fade out the view right away [UIView animateWithDuration:1.0 delay: 0.0 @@ -320,6 +351,8 @@ - (void)showHideView // Web methods - (void) currentWebViewDidStartLoading:(UIWebView *) webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (_addressBar.editing) { [webView stopLoading]; return; @@ -346,7 +379,9 @@ - (void) currentWebViewDidStartLoading:(UIWebView *) webView { [self setInitialPageLoad:NO]; } --(void) currentWebViewDidFinishFinalLoad:(UIWebView *) webView { +- (void)currentWebViewDidFinishFinalLoad:(UIWebView *) webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_progressBar setProgress:1.0 animated:NO]; [_progressBar setHidden:YES]; @@ -364,7 +399,9 @@ -(void) currentWebViewDidFinishFinalLoad:(UIWebView *) webView { [self loadTabs:webView]; } --(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Tab *)tab { +- (void)gotoAddress:(id)sender withRequestObj:(NSURLRequest *)request inTab:(Tab *)tab { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Clear detected bugs tab.currentURLString = @""; [self setInitialPageLoad:YES]; @@ -386,13 +423,13 @@ -(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Ta //[[self webView] loadRequest:requestObj]; NSMutableURLRequest *mRequest = [request mutableCopy]; - NSString *d = [self isPad] ? @"iPad" : @"iPhone"; + NSString *deviceString = [self isPad] ? @"iPad" : @"iPhone"; if (!self.userAgent) { self.userAgent = [[tab webView] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; } - [mRequest setValue:[NSString stringWithFormat:self.userAgent, d] forHTTPHeaderField:@"User-Agent"]; + [mRequest setValue:[NSString stringWithFormat:self.userAgent, deviceString] forHTTPHeaderField:@"User-Agent"]; - if ( [[[request URL] host] isEqualToString:@"itunes.apple.com"]) { + if ([[[request URL] host] isEqualToString:@"itunes.apple.com"]) { [[UIApplication sharedApplication] openURL: mRequest.URL ]; } else { [_progressBar setHidden:NO]; @@ -422,6 +459,8 @@ -(void) gotoAddress:(id) sender withRequestObj:(NSURLRequest *)request inTab:(Ta } -(IBAction) didStartEditingAddressBar:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ([[_addressBar text] length] > 0) { [self performSelector:@selector(selectAllAddressText) withObject:nil afterDelay:0.0]; } @@ -429,10 +468,14 @@ -(IBAction) didStartEditingAddressBar:(id)sender { } -(void) selectAllAddressText { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_addressBar setSelectedTextRange:[_addressBar textRangeFromPosition:_addressBar.beginningOfDocument toPosition:_addressBar.endOfDocument]]; } -(IBAction) gotoAddress:(id) sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_addressBarButtonsView setHidden:NO]; [_stopButton setHidden:NO]; [_refreshButton setHidden:YES]; @@ -440,7 +483,7 @@ -(IBAction) gotoAddress:(id) sender { NSString *inputText = [[_addressBar text] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; _gotoUrl = [NSURL URLWithString:inputText]; if (_gotoUrl != nil && (!([[_gotoUrl scheme] isEqualToString:@"http"] || [[_gotoUrl scheme] isEqualToString:@"https"]))) { - _gotoUrl = [NSURL URLWithString: [@"http://" stringByAppendingString: [_gotoUrl absoluteString]]]; + _gotoUrl = [NSURL URLWithString: [@"http://" stringByAppendingString:[_gotoUrl absoluteString]]]; } NSURLRequest *request = [NSURLRequest requestWithURL:_gotoUrl]; if ([inputText rangeOfString:@"."].location != NSNotFound && [NSURLConnection canHandleRequest:request]){ @@ -451,10 +494,13 @@ -(IBAction) gotoAddress:(id) sender { } -(IBAction) didEndEditingAddressBar:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); } -(IBAction) searchWeb:(id) sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSString *searchQuery = [_addressBar text]; NSString *encodedSearchQuery = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( NULL, @@ -477,6 +523,8 @@ -(IBAction) searchWeb:(id) sender { } -(void) cannotConnect:(UIWebView *) cnWebView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_stopButton setHidden:NO]; [_refreshButton setHidden:YES]; NSURL *ucUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"unable_to_connect" ofType:@"html"] isDirectory:NO]; @@ -485,26 +533,34 @@ -(void) cannotConnect:(UIWebView *) cnWebView { } -(IBAction) goBack:(id)sender { - + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_selectedTab goBack]; self.reloadOnPageLoad = YES; } -(IBAction) goForward:(id)sender { - + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_selectedTab goForward]; //[[self webView] stringByEvaluatingJavaScriptFromString:@"history.forward();"]; } -(IBAction) cancel:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + //[self contractBar: sender]; } -(IBAction) showBookmarks:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self showBookmarksView:sender]; } -(void) showBookmarksView:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self.view bringSubviewToFront:self.bookmarksController.view]; [UIView animateWithDuration:0.25 animations:^{ self.bookmarksController.view.alpha =1.0f; @@ -512,6 +568,8 @@ -(void) showBookmarksView:(id)sender { } -(IBAction) stopLoading:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_stopButton setHidden:true]; [_refreshButton setHidden:false]; [_progressBar setHidden:YES]; @@ -523,6 +581,8 @@ -(IBAction) stopLoading:(id)sender { } -(NSArray *) actionSheetButtons { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // hide add bookmark for local html files if ([[[_selectedTab webView] request].URL isFileURL]) { return [NSArray arrayWithObjects:@"Clear Cookies", @"Clear Cache", @"Import Bookmarks", nil]; @@ -532,6 +592,8 @@ -(NSArray *) actionSheetButtons { } -(IBAction)showActionSheet:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Hide popover for ipad if ([self isPad] ) { @@ -554,6 +616,8 @@ -(IBAction)showActionSheet:(id)sender { } -(void) generatePopupQuery { + LogTrace(@"%s", __PRETTY_FUNCTION__); + UIActionSheet *pQuery= [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil @@ -569,6 +633,8 @@ -(void) generatePopupQuery { } -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // skip add bookmarks if we are loading a local file if ([[[_selectedTab webView] request].URL isFileURL]) { buttonIndex += 1; @@ -607,6 +673,8 @@ -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger) } -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [sheet dismissWithClickedButtonIndex:0 animated:YES]; [_bookmarksFormController setMode:'A']; [[_bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; @@ -635,6 +703,8 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { // TABS -(IBAction) addTab:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // if (_tabsView.hidden) { // [self toggleTabsView:sender]; // } @@ -642,7 +712,8 @@ -(IBAction) addTab:(id)sender { } -(void) addTabWithAddress:(NSString *)urlAddress { - + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ([_tabs count] == 0) { _tabs = [[NSMutableArray alloc] initWithCapacity:8]; } @@ -685,6 +756,8 @@ -(void) addTabWithAddress:(NSString *)urlAddress { } -(IBAction) removeTab:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [sender setEnabled:NO]; Tab *toBeRemoved = (Tab *)[sender superview]; [[toBeRemoved tabButton] setEnabled:NO]; @@ -727,6 +800,8 @@ -(IBAction) removeTab:(id)sender { } -(IBAction) selectTab:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + for (id cTab in _tabs) { if ([cTab tabButton] == sender) { [self switchTabFrom:_selectedTab ToTab:cTab]; @@ -736,6 +811,8 @@ -(IBAction) selectTab:(id)sender { } -(void) switchTabFrom:(Tab *)fromTab ToTab:(Tab *)toTab { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ([_tabs count] > 0) { [fromTab deselect]; @@ -806,16 +883,22 @@ -(void) switchTabFrom:(Tab *)fromTab ToTab:(Tab *)toTab { // WEBVIEW -(UIWebView *) webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + return [_selectedTab webView]; } -(UIWebView *) setWebView:(UIWebView *)newWebView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_selectedTab setWebView:newWebView]; return newWebView; } -(void) loadTabs:(UIWebView *)webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + Tab *tab = nil; [[self view] sendSubviewToBack:webView]; @@ -867,6 +950,8 @@ -(void) loadTabs:(UIWebView *)webView { // Orientation - (NSUInteger) supportedInterfaceOrientations { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Return a bitmask of supported orientations. If you need more, // use bitwise or (see the commented return). return UIInterfaceOrientationMaskAll; @@ -874,6 +959,8 @@ - (NSUInteger) supportedInterfaceOrientations { } - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Return the orientation you'd prefer - this is what it launches to. The // user can still rotate. You don't have to implement this method, in which // case it launches in the current orientation @@ -884,6 +971,8 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // Reachability - (BOOL) checkNetworkStatus { + LogTrace(@"%s", __PRETTY_FUNCTION__); + Reachability *reachability = [Reachability reachabilityForInternetConnection]; NetworkStatus netstat = [reachability currentReachabilityStatus]; return netstat != NotReachable; @@ -891,6 +980,8 @@ - (BOOL) checkNetworkStatus // HARDWARE - (BOOL) isPad { + LogTrace(@"%s", __PRETTY_FUNCTION__); + #ifdef UI_USER_INTERFACE_IDIOM return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); #else diff --git a/Browser/Logging/Logging.h b/Browser/Logging/Logging.h new file mode 100755 index 0000000..8fb7793 --- /dev/null +++ b/Browser/Logging/Logging.h @@ -0,0 +1,163 @@ +/* + * Logging.h + * + * $Version: Logging 1.0 (1e09f90c5fec) on 2010-07-22 $ + * Author: Bill Hollings + * Copyright (c) 2010 The Brenwill Workshop Ltd. + * http://www.brenwill.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * http://en.wikipedia.org/wiki/MIT_License + * + * Thanks to Nick Dalton for providing the underlying ideas for using variadic macros as + * well as for outputting the code location as part of the log entry. For his ideas, see: + * http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog + */ + +/** + * For Objective-C code, this library adds flexible, non-intrusive logging capabilities + * that can be efficiently enabled or disabled via compile switches. + * + * There are four levels of logging: Trace, Info, Error and Debug, and each can be enabled + * independently via the LOGGING_LEVEL_TRACE, LOGGING_LEVEL_INFO, LOGGING_LEVEL_ERROR and + * LOGGING_LEVEL_DEBUG switches, respectively. + * + * In addition, ALL logging can be enabled or disabled via the LOGGING_ENABLED switch. + * + * Logging functions are implemented here via macros. Disabling logging, either entirely, or + * at a specific level, completely removes the corresponding log invocations from the compiled + * code, thus eliminating both the memory and CPU overhead that the logging calls would add. + * You might choose, for example, to completely remove all logging from production release code, + * by setting LOGGING_ENABLED off in your production builds settings. Or, as another example, + * you might choose to include Error logging in your production builds by turning only + * LOGGING_ENABLED and LOGGING_LEVEL_ERROR on, and turning the others off. + * + * To perform logging, use any of the following function calls in your code: + * + * LogTrace(fmt, ...) - recommended for detailed tracing of program flow + * - will print if LOGGING_LEVEL_TRACE is set on. + * + * LogInfo(fmt, ...) - recommended for general, infrequent, information messages + * - will print if LOGGING_LEVEL_INFO is set on. + * + * LogError(fmt, ...) - recommended for use only when there is an error to be logged + * - will print if LOGGING_LEVEL_ERROR is set on. + * + * LogDebug(fmt, ...) - recommended for temporary use during debugging + * - will print if LOGGING_LEVEL_DEBUG is set on. + * + * In each case, the functions follow the general NSLog/printf template, where the first argument + * "fmt" is an NSString that optionally includes embedded Format Specifiers, and subsequent optional + * arguments indicate data to be formatted and inserted into the string. As with NSLog, the number + * of optional arguments must match the number of embedded Format Specifiers. For more info, see the + * core documentation for NSLog and String Format Specifiers. + * + * You can choose to have each logging entry automatically include class, method and line information + * by enabling the LOGGING_INCLUDE_CODE_LOCATION switch. + * + * Although you can directly edit this file to turn on or off the switches below, the preferred + * technique is to set these switches via the compiler build setting GCC_PREPROCESSOR_DEFINITIONS + * in your build configuration. + */ + +/** + * Set this switch to enable or disable logging capabilities. + * This can be set either here or via the compiler build setting GCC_PREPROCESSOR_DEFINITIONS + * in your build configuration. Using the compiler build setting is preferred for this to + * ensure that logging is not accidentally left enabled by accident in release builds. + */ +#ifndef LOGGING_ENABLED +# define LOGGING_ENABLED 1 +#endif + +/** + * Set any or all of these switches to enable or disable logging at specific levels. + * These can be set either here or as a compiler build settings. + * For these settings to be effective, LOGGING_ENABLED must also be defined and non-zero. + */ +#ifndef LOGGING_LEVEL_TRACE +# define LOGGING_LEVEL_TRACE 1 +#endif +#ifndef LOGGING_LEVEL_INFO +# define LOGGING_LEVEL_INFO 1 +#endif +#ifndef LOGGING_LEVEL_ERROR +# define LOGGING_LEVEL_ERROR 1 +#endif +#ifndef LOGGING_LEVEL_DEBUG +# define LOGGING_LEVEL_DEBUG 1 +#endif + +/** + * Set this switch to indicate whether or not to include class, method and line information + * in the log entries. This can be set either here or as a compiler build setting. + */ +#ifndef LOGGING_INCLUDE_CODE_LOCATION + #define LOGGING_INCLUDE_CODE_LOCATION 0 +#endif + +// *********** END OF USER SETTINGS - Do not change anything below this line *********** + + +#if !(defined(LOGGING_ENABLED) && LOGGING_ENABLED) + #undef LOGGING_LEVEL_TRACE + #undef LOGGING_LEVEL_INFO + #undef LOGGING_LEVEL_ERROR + #undef LOGGING_LEVEL_DEBUG +#endif + +// Logging format +#define LOG_FORMAT_NO_LOCATION(fmt, lvl, ...) NSLog((@"[%@] " fmt), lvl, ##__VA_ARGS__) +#define LOG_FORMAT_WITH_LOCATION(fmt, lvl, ...) NSLog((@"%s[Line %d] [%@] " fmt), __PRETTY_FUNCTION__, __LINE__, lvl, ##__VA_ARGS__) + +#if defined(LOGGING_INCLUDE_CODE_LOCATION) && LOGGING_INCLUDE_CODE_LOCATION + #define LOG_FORMAT(fmt, lvl, ...) LOG_FORMAT_WITH_LOCATION(fmt, lvl, ##__VA_ARGS__) +#else + #define LOG_FORMAT(fmt, lvl, ...) LOG_FORMAT_NO_LOCATION(fmt, lvl, ##__VA_ARGS__) +#endif + +// Trace logging - for detailed tracing +#if defined(LOGGING_LEVEL_TRACE) && LOGGING_LEVEL_TRACE + #define LogTrace(fmt, ...) LOG_FORMAT(fmt, @"trace", ##__VA_ARGS__) +#else + #define LogTrace(...) +#endif + +// Info logging - for general, non-performance affecting information messages +#if defined(LOGGING_LEVEL_INFO) && LOGGING_LEVEL_INFO + #define LogInfo(fmt, ...) LOG_FORMAT(fmt, @"info", ##__VA_ARGS__) +#else + #define LogInfo(...) +#endif + +// Error logging - only when there is an error to be logged +#if defined(LOGGING_LEVEL_ERROR) && LOGGING_LEVEL_ERROR + #define LogError(fmt, ...) LOG_FORMAT(fmt, @"***ERROR***", ##__VA_ARGS__) +#else + #define LogError(...) + #endif + +// Debug logging - use only temporarily for highlighting and tracking down problems +#if defined(LOGGING_LEVEL_DEBUG) && LOGGING_LEVEL_DEBUG + #define LogDebug(fmt, ...) LOG_FORMAT(fmt, @"DEBUG", ##__VA_ARGS__) +#else + #define LogDebug(...) +#endif + diff --git a/Browser/Tab.m b/Browser/Tab.m index 1c2425b..7c0e8f9 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -9,10 +9,13 @@ #import "BrowserViewController.h" #import "BookmarksFormController.h" #import "UIMainView.h" +#import "Logging.h" @implementation Tab -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ((self = [super initWithFrame:frame])) { _viewController = vc; NSString *path = [[NSBundle mainBundle] pathForResource:@"page_info" ofType:@"js"]; @@ -99,6 +102,8 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { } -(void) setTitle:(NSString *)title { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ([title length] > 11) { title = [[title substringToIndex:11] stringByAppendingString:@".."]; } @@ -110,6 +115,8 @@ -(void) setTitle:(NSString *)title { } -(void) select { + LogTrace(@"%s", __PRETTY_FUNCTION__); + _current = YES; [_tabButton setBackgroundColor:[UIColor whiteColor]]; _tabButton.selected = YES; @@ -119,6 +126,8 @@ -(void) select { } -(void) deselect { + LogTrace(@"%s", __PRETTY_FUNCTION__); + _current = NO; [_tabButton setBackgroundColor:[UIColor lightGrayColor]]; _tabButton.selected = NO; @@ -128,14 +137,20 @@ -(void) deselect { } -(void) incrementOffset { + LogTrace(@"%s", __PRETTY_FUNCTION__); + self.frame = CGRectOffset(self.frame, -100.0, 0.0); } -(void) hideText { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_tabButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; } -(void) showText { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; } @@ -144,6 +159,8 @@ -(void) showText { #pragma mark urlConnection delegate - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse { + LogTrace(@"%s", __PRETTY_FUNCTION__); + self.loading =YES; self.urlConnection = connection; self.connectionURLString = [[[connection currentRequest] URL] absoluteString]; @@ -164,6 +181,8 @@ - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSUR - (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURLResponse*) response { + LogTrace(@"%s", __PRETTY_FUNCTION__); + self.currentURL = [response URL]; self.currentURLString = [[response URL] absoluteString]; [self setResponse:response]; @@ -175,6 +194,8 @@ - (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURL - (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_pageData appendData: data]; if ([[self progressBar] progress] < 0.75) { [[self progressBar] setProgress:[[self progressBar] progress] + .05 animated:NO]; @@ -183,6 +204,8 @@ - (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) dat } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // NSURLRequest *request = [connection originalRequest];/ if ([_pageData length] == 0) { @@ -223,6 +246,8 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [[self progressBar] setHidden:YES]; if ([[connection currentRequest] URL] != NULL) { [_viewController cannotConnect:_webView]; @@ -233,6 +258,8 @@ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)err } -(UIProgressView *) progressBar { + LogTrace(@"%s", __PRETTY_FUNCTION__); + return _current ? [_viewController progressBar] : nil; } @@ -240,6 +267,7 @@ -(UIProgressView *) progressBar { #pragma mark webview delegate -(BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { + LogTrace(@"%s", __PRETTY_FUNCTION__); if (request == nil) { return NO; @@ -270,9 +298,13 @@ -(BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)re } -(void) webViewDidStartLoad:(UIWebView *)webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + } -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + self.loading = NO; if (_current) { [_viewController currentWebViewDidFinishFinalLoad:webView]; @@ -291,7 +323,7 @@ -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { } -(void) webViewDidFinishLoad:(UIWebView *)webView { - + LogTrace(@"%s", __PRETTY_FUNCTION__); if (![[[webView request] URL] isFileURL] && _currentURL != nil) { [webView stringByEvaluatingJavaScriptFromString:@"if (document.getElementById('gh-page-loaded') == null && document.documentElement.innerHTML != '') {" @@ -307,6 +339,8 @@ -(void) webViewDidFinishLoad:(UIWebView *)webView { - (void)contextualMenuAction:(NSNotification*)notification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (_actionSheetVisible || _webView != [_viewController webView]) { return; } @@ -332,6 +366,8 @@ - (void)contextualMenuAction:(NSNotification*)notification - (void)openContextualMenuAt:(CGPoint)pt { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Load the JavaScript code from the Resources and inject it into the web page NSString *path = [[NSBundle mainBundle] pathForResource:@"JSTools" ofType:@"js"]; NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; @@ -380,6 +416,8 @@ - (void)openContextualMenuAt:(CGPoint)pt - (CGSize)windowSize { + LogTrace(@"%s", __PRETTY_FUNCTION__); + CGSize size; size.width = [[_webView stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] integerValue]; size.height = [[_webView stringByEvaluatingJavaScriptFromString:@"window.innerHeight"] integerValue]; @@ -388,6 +426,8 @@ - (CGSize)windowSize - (CGPoint)scrollOffset { + LogTrace(@"%s", __PRETTY_FUNCTION__); + CGPoint pt; pt.x = [[_webView stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue]; pt.y = [[_webView stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue]; @@ -395,6 +435,8 @@ - (CGPoint)scrollOffset } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSURL *url = [NSURL URLWithString:[actionSheet title]]; NSString *clickedButton = [actionSheet buttonTitleAtIndex:buttonIndex]; if ([clickedButton isEqualToString:@"Open Link"]) { @@ -419,10 +461,14 @@ - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger } - (void)didPresentActionSheet:(UIActionSheet *)actionSheet { + LogTrace(@"%s", __PRETTY_FUNCTION__); + _actionSheetVisible = YES; } - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { + LogTrace(@"%s", __PRETTY_FUNCTION__); + _actionSheetVisible = NO; } @@ -430,22 +476,32 @@ - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSIn // HISTORY -(BOOL) canGoBack { + LogTrace(@"%s", __PRETTY_FUNCTION__); + return _history.count > 0 && _history_position > 0; } -(BOOL) canGoForward { + LogTrace(@"%s", __PRETTY_FUNCTION__); + return _history.count > 0 && _history_position < _history.count - 1; } -(void) goBack { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self go:-1]; } -(void) goForward { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self go:1]; } -(void) go:(int)t { + LogTrace(@"%s", __PRETTY_FUNCTION__); + NSURLRequest *req; [_viewController forwardButton].enabled = FALSE; [_viewController backButton].enabled = FALSE; @@ -463,6 +519,8 @@ -(void) go:(int)t { } -(void) updateHistory { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (_traverse == 0) { if (_history_position + 1 < _history.count) { [_history removeObjectsInRange:NSMakeRange(_history_position + 1, _history.count - _history_position - 1)]; diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index a59a336..87da6b7 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -58,6 +58,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 4B1C68B2197DEC050014AB79 /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logging.h; sourceTree = ""; }; 71ED23B4194470B2002ACD24 /* BrowserDelegate.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = BrowserDelegate.h; path = ../Browser/BrowserDelegate.h; sourceTree = ""; }; 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserDelegate.m; path = ../Browser/BrowserDelegate.m; sourceTree = ""; }; B572E54718D08D2A005E4834 /* Tab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Tab.m; path = ../Browser/Tab.m; sourceTree = ""; }; @@ -182,6 +183,14 @@ name = Views; sourceTree = ""; }; + 4B1C68B1197DEC050014AB79 /* Logging */ = { + isa = PBXGroup; + children = ( + 4B1C68B2197DEC050014AB79 /* Logging.h */, + ); + path = Logging; + sourceTree = ""; + }; FAA4557718A19B2700B1BDF4 /* Buttons */ = { isa = PBXGroup; children = ( @@ -253,6 +262,7 @@ FAF75E6A18A179D1007B317D /* Browser */ = { isa = PBXGroup; children = ( + 4B1C68B1197DEC050014AB79 /* Logging */, 0E54DB6D197DAE31005BF033 /* Bookmarks */, B572E54D18D08D2A005E4834 /* Tab.h */, B572E54718D08D2A005E4834 /* Tab.m */, From efa8a1f592714af4cf670be4e46ad4a9c80fc353 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Tue, 22 Jul 2014 15:36:39 -0700 Subject: [PATCH 11/60] Made adjustments to ensure the project works for iOS 6.0+. --- Browser Resources/MainWindow-iPad.xib | 6 +++--- Browser/BookmarkFolderFormController.m | 6 +++++- Browser/BookmarksController.m | 6 +++++- Browser/BookmarksFormController.m | 6 +++++- Browser/Tab.h | 2 +- sample-app/TestBrowser.xcodeproj/project.pbxproj | 4 ++-- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index 48917e1..2de1809 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -1,7 +1,7 @@ - + @@ -158,8 +158,8 @@ - - + + diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index a3e76be..05e6aa3 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -46,7 +46,11 @@ - (void)viewDidLoad { [nameField becomeFirstResponder]; - self.preferredContentSize = CGSizeMake(320.0, 480.0); + if ([self respondsToSelector:@selector(setPreferredContentSize:)]) { + self.preferredContentSize = CGSizeMake(320.0, 480.0); + } else { + self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + } [super viewDidLoad]; } diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 05c8fc3..84cd872 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -43,7 +43,11 @@ - (void)viewDidLoad { formController = [browserController bookmarksFormController]; - self.preferredContentSize = CGSizeMake(320.0, 480.0); + if ([self respondsToSelector:@selector(setPreferredContentSize:)]) { + self.preferredContentSize = CGSizeMake(320.0, 480.0); + } else { + self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + } [super viewDidLoad]; } diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index 2952c7d..0778a5e 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -46,7 +46,11 @@ - (void)viewDidLoad { doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(saveBookmark:)]; cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(switchToBrowser:)]; - self.preferredContentSize = CGSizeMake(320.0, 480.0); + if ([self respondsToSelector:@selector(setPreferredContentSize:)]) { + self.preferredContentSize = CGSizeMake(320.0, 480.0); + } else { + self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); + } [super viewDidLoad]; } diff --git a/Browser/Tab.h b/Browser/Tab.h index 61870e9..09226a3 100644 --- a/Browser/Tab.h +++ b/Browser/Tab.h @@ -26,7 +26,7 @@ @property(nonatomic,strong) NSMutableArray *history; @property(nonatomic,assign) int traverse; -@property(nonatomic,assign) int history_position; +@property(nonatomic,assign) NSInteger history_position; @property(nonatomic,assign) int scrollPosition; diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 87da6b7..a70670d 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -497,7 +497,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TestBrowser/TestBrowser-Prefix.pch"; INFOPLIST_FILE = "TestBrowser/TestBrowser-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -509,7 +509,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TestBrowser/TestBrowser-Prefix.pch"; INFOPLIST_FILE = "TestBrowser/TestBrowser-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; From 878691ae63941b63f97c0e62257062632433ea0e Mon Sep 17 00:00:00 2001 From: Obi Date: Tue, 22 Jul 2014 16:17:28 -0700 Subject: [PATCH 12/60] Fixed the bug with bookmarks section not appearing after bookmarks popover is displayed. --- Browser/BookmarkFolderFormController.m | 2 + Browser/BookmarksController.m | 2 + Browser/BookmarksFormController.m | 2 + Browser/BrowserViewController.h | 1 + Browser/BrowserViewController.m | 70 +++++++++++++++++--------- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index a3e76be..0ac6795 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -7,6 +7,7 @@ #import "BookmarkFolderFormController.h" #import "BookmarksController.h" +#import "BrowserViewController.h" #import "BrowserDelegate.h" @implementation BookmarkFolderFormController @@ -87,6 +88,7 @@ - (IBAction)saveFolder:(id)sender { [bookmarksController reloadBookmarks]; [[bookmarksController tableView] reloadData]; [self.navigationController popViewControllerAnimated:YES]; + [bookmarksController.browserController dismissPopups]; } - (void)didReceiveMemoryWarning { diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 05c8fc3..1923b19 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -123,8 +123,10 @@ - (IBAction)switchToBrowser:(id)sender { if (mode == 'E') { [self finishEditMode:sender]; } + [self.navigationController popToRootViewControllerAnimated:NO]; [UIView animateWithDuration:0.25 animations:^{ [self.navigationController view].alpha =0.0f; + [browserController dismissPopups]; }]; } diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index 2952c7d..5941ba5 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -148,6 +148,8 @@ - (IBAction) saveBookmark:(id)sender { [bookmarksController reloadBookmarks]; [[bookmarksController tableView] reloadData]; [bookmarksController switchToBrowser:sender]; + [bookmarksController.browserController dismissPopups]; + } - (void)didReceiveMemoryWarning { diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 3359ae3..9f0113e 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -100,5 +100,6 @@ -(void) saveOpenTabs; -(void) openSavedTabs; -(void) deleteSavedTabs; +-(void) dismissPopups; @end diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index f233a67..5d50cb3 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -35,6 +35,7 @@ @interface BrowserViewController () { @implementation BrowserViewController + - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (nibNameOrNil == nil) { @@ -61,21 +62,7 @@ - (void)viewDidLoad //size statusbar [(UIMainView *)[self view] sizeStatusBar]; // Set up bookmark controllers - BookmarksFormController *bookmarksFormController = [[BookmarksFormController alloc] - initWithNibName:@"BookmarksForm" - bundle:[NSBundle mainBundle]]; - BookmarkFolderFormController *bookmarkFolderFormController = [[BookmarkFolderFormController alloc] - initWithNibName:@"BookmarkFoldersForm" - bundle:[NSBundle mainBundle]]; - - BookmarksController *bookmarksController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; - UINavigationController *bookmarksNavController = [[UINavigationController alloc] initWithRootViewController:bookmarksController]; - - [self setBookmarksFormController:bookmarksFormController]; - [bookmarksController setBrowserController:self]; - [bookmarkFolderFormController setBookmarksController:bookmarksController]; - [bookmarksController setFolderController:bookmarkFolderFormController]; - [self setBookmarksController:bookmarksNavController]; + [self createBookmarksController:YES]; [self.view addSubview:self.bookmarksController.view]; self.bookmarksController.view.alpha = 0.0f; //Hide the bookmarks controller @@ -92,6 +79,30 @@ - (void)viewDidLoad } +-(UINavigationController*)createBookmarksController:(BOOL)isMainController { + BookmarksFormController *bookmarksFormController = [[BookmarksFormController alloc] + initWithNibName:@"BookmarksForm" + bundle:[NSBundle mainBundle]]; + BookmarkFolderFormController *bookmarkFolderFormController = [[BookmarkFolderFormController alloc] + initWithNibName:@"BookmarkFoldersForm" + bundle:[NSBundle mainBundle]]; + BookmarksController *bookmarksController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; + UINavigationController *bookmarksNavController = [[UINavigationController alloc] initWithRootViewController:bookmarksController]; + [bookmarksController setBrowserController:self]; + [bookmarkFolderFormController setBookmarksController:bookmarksController]; + [bookmarksController setFolderController:bookmarkFolderFormController]; + if(isMainController) //Creating the main bookmarks page which persists by hiding/unhiding + { + [self setBookmarksController:bookmarksNavController]; + [self setBookmarksFormController:bookmarksFormController]; + } + else //Creating a temporary bookmark controller for the popup with a form controller on the top of the nav stack + { + [bookmarksNavController pushViewController:bookmarksFormController animated:NO]; + } + return bookmarksNavController; +} + - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self @@ -506,6 +517,9 @@ -(IBAction) showBookmarks:(id)sender { -(void) showBookmarksView:(id)sender { [self.view bringSubviewToFront:self.bookmarksController.view]; + BookmarksController* bC = [self.bookmarksController.viewControllers objectAtIndex:0]; + bC.bookmarks = [bC reloadBookmarks]; + [bC.tableView reloadData]; [UIView animateWithDuration:0.25 animations:^{ self.bookmarksController.view.alpha =1.0f; }]; @@ -539,7 +553,7 @@ -(IBAction)showActionSheet:(id)sender { [_padPopover dismissPopoverAnimated:YES]; } - if (_popupQuery.visible || _barItemPopoverPresenter == _moreButton) { + if (_popupQuery.visible) { _barItemPopoverPresenter = nil; [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:YES]; } else { @@ -565,7 +579,7 @@ -(void) generatePopupQuery { pQuery.cancelButtonIndex = [pQuery addButtonWithTitle:@"Cancel"]; - self.popupQuery = pQuery; + _popupQuery = pQuery; } -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { @@ -608,30 +622,40 @@ -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger) -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { [sheet dismissWithClickedButtonIndex:0 animated:YES]; - [_bookmarksFormController setMode:'A']; - [[_bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; - [_bookmarksController pushViewController:_bookmarksFormController animated:NO]; + + // Set up bookmark controllers + UINavigationController *bookmarksNavController = [self createBookmarksController:NO]; + BookmarksController* bookmarksController = (BookmarksController*)[[bookmarksNavController viewControllers] objectAtIndex:0]; + BookmarksFormController* bookmarksFormController = (BookmarksFormController*)[[bookmarksNavController viewControllers] objectAtIndex:1]; + [bookmarksFormController setMode:'A']; + [[bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; + if ([self isPad]) { if (_padPopover == nil) { UIPopoverController *ppop = [[UIPopoverController alloc] - initWithContentViewController:_bookmarksController]; + initWithContentViewController:bookmarksNavController]; self.padPopover = ppop; } else { - [self.padPopover setContentViewController:_bookmarksController animated:YES]; + [self.padPopover setContentViewController:bookmarksNavController animated:YES]; } [self.padPopover presentPopoverFromBarButtonItem:_bookmarkButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } else { [UIView transitionFromView:self.view - toView:[_bookmarksController view] + toView:[bookmarksController view] duration:0.5 options:(UIViewAnimationOptionTransitionCrossDissolve) completion:^(BOOL finished) {}]; } } +-(void) dismissPopups { + [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:NO]; + [_padPopover dismissPopoverAnimated:NO]; +} + // TABS -(IBAction) addTab:(id)sender { From 01f5a0faccaa5d3b0efa273aaaaeaf5cdd897bac Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Tue, 22 Jul 2014 16:53:28 -0700 Subject: [PATCH 13/60] Some warning fixes. --- Browser Resources/MainWindow-iPad.xib | 17 ++++++----------- Browser/BrowserViewController.m | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index 2de1809..8a82eb1 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -158,11 +158,11 @@ - + - + @@ -172,34 +172,29 @@ - - - - - - - - + + + + - diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 6d798ca..23496ea 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -249,7 +249,7 @@ -(IBAction)scrollToTop:(id)sender { - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ LogTrace(@"%s", __PRETTY_FUNCTION__); - ScrollDirection scrollDirection; + ScrollDirection scrollDirection = ScrollDirectionNone; int minWebViewSize = _webViewTemplate.frame.size.height; int maxWebViewSize = minWebViewSize + _bottomBar.frame.size.height; if (self.lastScrollContentOffset > scrollView.contentOffset.y) From b047478a59237ad7abeb01c836a4e795c7498d86 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Thu, 24 Jul 2014 16:30:15 -0700 Subject: [PATCH 14/60] Reload/stop icon toggles appropriately upon page loads and among tabs. --- Browser/BrowserViewController.h | 4 ++ Browser/BrowserViewController.m | 65 +++++++++++++++++++++--- Browser/Tab.h | 1 + Browser/Tab.m | 87 ++++++++++++++++++++++++++++++++- 4 files changed, 147 insertions(+), 10 deletions(-) diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 9f0113e..de3ea16 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -8,6 +8,10 @@ #import #import #import + +#define kStartedLoadingNotification @"kStartedLoadingNotification" +#define kFinishedLoadingNotification @"kFinishedLoadingNotification" + @class Tab, BookmarksController, BookmarksFormController, Reachability; @interface BrowserViewController : UIViewController diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 23496ea..f75aded 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -81,7 +81,7 @@ - (void)viewDidLoad _selectedTab.currentURLString = @""; [self registerForKeyboardNotifications]; - + [self registerForBrowserNotifications]; } -(UINavigationController*)createBookmarksController:(BOOL)isMainController { @@ -140,6 +140,49 @@ - (void)keyboardWasHidden:(NSNotification*)aNotification { } } +- (void)registerForBrowserNotifications +{ + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [[NSNotificationCenter defaultCenter] removeObserver:self name:kStartedLoadingNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:kFinishedLoadingNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(startedLoadingNotification:) + name:kStartedLoadingNotification + object:_selectedTab]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(finishedLoadingNotification:) + name:kFinishedLoadingNotification + object:_selectedTab]; + +} + +- (void)startedLoadingNotification:(NSNotification *)notification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [self displayAsLoading]; +} + +- (void)finishedLoadingNotification:(NSNotification *)notification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [self displayAsNotLoading]; +} + +- (void)displayAsLoading { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [_stopButton setHidden:NO]; + [_refreshButton setHidden:YES]; +} + +- (void)displayAsNotLoading { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [_stopButton setHidden:YES]; + [_refreshButton setHidden:NO]; +} + -(void) saveOpenTabs { LogTrace(@"%s", __PRETTY_FUNCTION__); @@ -379,8 +422,8 @@ - (void) currentWebViewDidStartLoading:(UIWebView *) webView { if (tab == _selectedTab) { if (_initialPageLoad) { - [_refreshButton setHidden:true]; - [_stopButton setHidden:false]; + [_refreshButton setHidden:YES]; + [_stopButton setHidden:NO]; } } @@ -584,8 +627,8 @@ -(void) showBookmarksView:(id)sender { -(IBAction) stopLoading:(id)sender { LogTrace(@"%s", __PRETTY_FUNCTION__); - [_stopButton setHidden:true]; - [_refreshButton setHidden:false]; + [_stopButton setHidden:YES]; + [_refreshButton setHidden:NO]; [_progressBar setHidden:YES]; //[activityIndicator stopAnimating]; @@ -786,13 +829,13 @@ -(IBAction) removeTab:(id)sender { Tab *toBeRemoved = (Tab *)[sender superview]; [[toBeRemoved tabButton] setEnabled:NO]; - BOOL removed = false; - BOOL select = false; + BOOL removed = NO; + BOOL select = NO; for (id cTab in _tabs) { if (select) { [self switchTabFrom:_selectedTab ToTab:cTab]; - select = false; + select = NO; } if (removed) { [cTab incrementOffset]; @@ -829,6 +872,12 @@ -(IBAction) selectTab:(id)sender { for (id cTab in _tabs) { if ([cTab tabButton] == sender) { [self switchTabFrom:_selectedTab ToTab:cTab]; + if ([_selectedTab isLoading]) { + [self displayAsLoading]; + } else { + [self displayAsNotLoading]; + } + [self registerForBrowserNotifications]; } } [self loadTabs:[_selectedTab webView]]; diff --git a/Browser/Tab.h b/Browser/Tab.h index 09226a3..42a16d0 100644 --- a/Browser/Tab.h +++ b/Browser/Tab.h @@ -30,6 +30,7 @@ @property(nonatomic,assign) int scrollPosition; +@property(nonatomic,assign) BOOL isLoading; @property(nonatomic,assign) BOOL loading; @property(nonatomic,assign) BOOL current; @property(nonatomic,assign) BOOL actionSheetVisible; diff --git a/Browser/Tab.m b/Browser/Tab.m index 7c0e8f9..5be107a 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -11,6 +11,16 @@ #import "UIMainView.h" #import "Logging.h" +@interface Tab () + +/** + Counter that increments when webViewDidStartLoad: is called and decrements + when webViewDidFinishLoad: is called. + */ +@property (assign) NSUInteger loadingCount; + +@end + @implementation Tab -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { @@ -68,7 +78,18 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _webView.backgroundColor = [UIColor whiteColor]; [_webView sizeToFit]; [_webView setDelegate:self]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextualMenuAction:) name:@"TapAndHoldNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(contextualMenuAction:) + name:@"TapAndHoldNotification" + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(startedLoadingNotification:) + name:kStartedLoadingNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(finishedLoadingNotification:) + name:kFinishedLoadingNotification + object:nil]; // Scroll topbar [[_webView scrollView] setDelegate:_viewController]; @@ -91,6 +112,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { [self setHistory:[[NSMutableArray alloc] initWithCapacity:0]]; _traverse = 0; _history_position = 0; + _loadingCount = 0; //Set title [_tabButton setTitle:@"New Tab" forState:UIControlStateNormal]; @@ -101,6 +123,32 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { return self; } +- (void)startedLoadingNotification:(NSNotification *)notification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + +} + +- (void)finishedLoadingNotification:(NSNotification *)notification { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + +} + +- (void)incrementLoadingCount { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + _loadingCount++; +} + +- (void)decrementLoadingCount { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + if (_loadingCount > 0) { + _loadingCount--; + } +} + -(void) setTitle:(NSString *)title { LogTrace(@"%s", __PRETTY_FUNCTION__); @@ -257,12 +305,18 @@ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)err } } --(UIProgressView *) progressBar { +- (UIProgressView *)progressBar { LogTrace(@"%s", __PRETTY_FUNCTION__); return _current ? [_viewController progressBar] : nil; } +- (void)loadingBegan { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + +} + #pragma mark - #pragma mark webview delegate @@ -300,11 +354,19 @@ -(BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)re -(void) webViewDidStartLoad:(UIWebView *)webView { LogTrace(@"%s", __PRETTY_FUNCTION__); + if (_loadingCount == 0) { + _isLoading = YES; + [[NSNotificationCenter defaultCenter] postNotificationName:kStartedLoadingNotification object:self]; + } + [self incrementLoadingCount]; + LogDebug(@"loading count: %lu", (unsigned long)_loadingCount); } -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { LogTrace(@"%s", __PRETTY_FUNCTION__); +// _loadingCount--; +// LogDebug(@"loading count: %lu", (unsigned long)_loadingCount); self.loading = NO; if (_current) { [_viewController currentWebViewDidFinishFinalLoad:webView]; @@ -325,6 +387,12 @@ -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { -(void) webViewDidFinishLoad:(UIWebView *)webView { LogTrace(@"%s", __PRETTY_FUNCTION__); + [self decrementLoadingCount]; + LogDebug(@"loading count: %lu", (unsigned long)_loadingCount); + if (_loadingCount == 0) { + _isLoading = NO; + [[NSNotificationCenter defaultCenter] postNotificationName:kFinishedLoadingNotification object:self]; + } if (![[[webView request] URL] isFileURL] && _currentURL != nil) { [webView stringByEvaluatingJavaScriptFromString:@"if (document.getElementById('gh-page-loaded') == null && document.documentElement.innerHTML != '') {" "var iframe = document.createElement('IFRAME');" @@ -337,6 +405,21 @@ -(void) webViewDidFinishLoad:(UIWebView *)webView { } } +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + BOOL wasLoadingBeforeDecrement = NO; + if (_loadingCount > 0) { + wasLoadingBeforeDecrement = YES; + } + [self decrementLoadingCount]; + if (wasLoadingBeforeDecrement && _loadingCount == 0) { + _isLoading = NO; + [[NSNotificationCenter defaultCenter] postNotificationName:kFinishedLoadingNotification object:self]; + } + LogDebug(@"loading count: %lu", (unsigned long)_loadingCount); +} + - (void)contextualMenuAction:(NSNotification*)notification { LogTrace(@"%s", __PRETTY_FUNCTION__); From 29360201603a5295b879710b0600dad560b0ef90 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Fri, 25 Jul 2014 00:20:28 -0700 Subject: [PATCH 15/60] Fixed code sample in README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9cbf500..4c0d0bb 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ The recommended way to integrate the browser code is to make your view controlle ### AppDelegate Your app delegate needs to inherit from the browser delegate as so: + #import "BrowserDelegate.h" @interface AppDelegate : BrowserDelegate From 5f42bf6f0484d80bd967f1312651c808c83c1f5b Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Fri, 25 Jul 2014 01:21:21 -0700 Subject: [PATCH 16/60] Tab titles displayed in UILabel within Tab class. --- Browser/Tab.h | 2 +- Browser/Tab.m | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Browser/Tab.h b/Browser/Tab.h index 42a16d0..aec0c84 100644 --- a/Browser/Tab.h +++ b/Browser/Tab.h @@ -13,7 +13,7 @@ @interface Tab : UIView @property(nonatomic,strong) UIButton *tabButton; -@property(nonatomic,strong) UILabel *tabTitle; +//@property(nonatomic,strong) UILabel *tabTitle; @property(nonatomic,strong) UIWebView *webView; @property(nonatomic,strong) UIButton *closeButton; diff --git a/Browser/Tab.m b/Browser/Tab.m index 5be107a..5869f6d 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -18,6 +18,7 @@ @interface Tab () when webViewDidFinishLoad: is called. */ @property (assign) NSUInteger loadingCount; +@property (nonatomic, strong) UILabel *tabTitle; @end @@ -42,7 +43,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { [_tabButton setBackgroundColor:[UIColor grayColor]]; - _tabButton.titleLabel.font = [UIFont systemFontOfSize: 11]; + _tabButton.titleLabel.font = [UIFont systemFontOfSize:11]; [_tabButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; _tabButton.contentEdgeInsets = UIEdgeInsetsMake(0.0, 8.0, 0.0, 0.0); @@ -58,9 +59,15 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { [_closeButton setAccessibilityLabel:@"close tab"]; [_closeButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; _closeButton.frame = CGRectMake(79.0, -1.0, 25.0, 25.0); - _closeButton.titleLabel.font = [UIFont systemFontOfSize: 18]; + _closeButton.titleLabel.font = [UIFont systemFontOfSize:18]; + + _tabTitle = [[UILabel alloc] initWithFrame:CGRectMake(3, 0, 80, 22)]; + _tabTitle.font = [UIFont systemFontOfSize:11]; + _tabTitle.text = @"Untitled"; + // append views + [_tabButton addSubview:_tabTitle]; [self addSubview:_tabButton]; [self addSubview:_closeButton]; @@ -115,8 +122,8 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _loadingCount = 0; //Set title - [_tabButton setTitle:@"New Tab" forState:UIControlStateNormal]; - [_tabButton setTitle:@"New Tab" forState:UIControlStateHighlighted]; +// [_tabButton setTitle:@"New Tab" forState:UIControlStateNormal]; +// [_tabButton setTitle:@"New Tab" forState:UIControlStateHighlighted]; } @@ -378,9 +385,11 @@ -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { NSString *tabTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; // NSString *url = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; if ([tabTitle length] == 0) { - [self setTitle:@"Untitled"]; + _tabTitle.text = @"Untitled"; +// [self setTitle:@"Untitled"]; } else { - [self setTitle:tabTitle]; +// [self setTitle:tabTitle]; + _tabTitle.text = tabTitle; } } From 6778359500ae9090e54c75f041a52170d7be0f42 Mon Sep 17 00:00:00 2001 From: Obi Date: Fri, 25 Jul 2014 13:24:08 -0700 Subject: [PATCH 17/60] Initial bookamrks commit. --- Browser Resources/BookmarksForm.xib | 9 +- Browser/BookmarkFolderFormController.h | 8 - Browser/BookmarkFolderFormController.m | 77 +++-- Browser/BookmarkItem.h | 6 +- Browser/BookmarkItem.m | 29 +- Browser/BookmarksController.h | 26 +- Browser/BookmarksController.m | 269 +++++++++++------- Browser/BookmarksFormController.h | 15 +- Browser/BookmarksFormController.m | 182 ++++++++---- Browser/BrowserViewController.h | 2 +- Browser/BrowserViewController.m | 40 ++- .../TestBrowser.xcodeproj/project.pbxproj | 33 --- sample-app/TestBrowser/AppDelegate.h | 3 +- sample-app/TestBrowser/AppDelegate.m | 2 +- 14 files changed, 439 insertions(+), 262 deletions(-) diff --git a/Browser Resources/BookmarksForm.xib b/Browser Resources/BookmarksForm.xib index 1a9f4b2..a382537 100644 --- a/Browser Resources/BookmarksForm.xib +++ b/Browser Resources/BookmarksForm.xib @@ -1,12 +1,13 @@ - + - - + + + @@ -61,4 +62,4 @@ - \ No newline at end of file + diff --git a/Browser/BookmarkFolderFormController.h b/Browser/BookmarkFolderFormController.h index 6cb4516..fa29fdc 100644 --- a/Browser/BookmarkFolderFormController.h +++ b/Browser/BookmarkFolderFormController.h @@ -6,7 +6,6 @@ // #import -#import @class BookmarksController; @@ -16,9 +15,6 @@ IBOutlet UITextField *nameField; char mode; - - NSManagedObjectContext *managedObjectContext; - NSManagedObject *folder; } @property(nonatomic,strong) BookmarksController *bookmarksController; @@ -26,10 +22,6 @@ @property(nonatomic,assign) char mode; -@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; -@property(nonatomic, strong) NSManagedObject *folder; - - -(IBAction) saveFolder:(id)sender; @end diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index 6edbf9a..6962b4a 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -8,11 +8,11 @@ #import "BookmarkFolderFormController.h" #import "BookmarksController.h" #import "BrowserViewController.h" -#import "BrowserDelegate.h" @implementation BookmarkFolderFormController -@synthesize nameField, folder, managedObjectContext, mode, bookmarksController; +//Core Data Fix +@synthesize nameField, /*folder, managedObjectContext,*/ mode, bookmarksController; // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* @@ -25,22 +25,8 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil } */ -/* -// Implement loadView to create a view hierarchy programmatically, without using a nib. -- (void)loadView { -} -*/ - - // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { - //set up DB - if (managedObjectContext == nil) - { - managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; - NSLog(@"After managedObjectContext: %@", managedObjectContext); - } - if (!mode) { mode = 'A'; } @@ -57,40 +43,73 @@ - (void)viewDidLoad { - (void)viewWillAppear:(BOOL)animated { if (mode == 'A') { - folder = nil; self.navigationItem.title = @"New Bookmark Folder"; [nameField setText:@""]; } else if (mode == 'E') { self.navigationItem.title = @"Edit Bookmark Folder"; - [nameField setText:[folder valueForKey:@"name"]]; + NSDictionary* folderDict = (NSDictionary*)[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex]; + NSString* folderTitle = (NSString*)[folderDict objectForKey:@"title"]; + [nameField setText:folderTitle]; } } - (IBAction)saveFolder:(id)sender { + + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray* foldersArray = (NSMutableArray*)[[defaults objectForKey:FOLDERS_KEY] mutableCopy]; NSArray *controllers = [self.navigationController viewControllers]; - BookmarksController *newBookmarksController = (BookmarksController *)[controllers objectAtIndex:[controllers count] - 2]; + NSMutableDictionary* folderDict = nil; + + if([[nameField.text stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]] length] == 0) + { + [nameField setText:@"New Folder"]; + } + if (mode == 'A') { - folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext]; + //Core Data Fix + //folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext]; // check for parent folder - if ([controllers count] > 2) { + NSMutableArray* bookmarksArray = [[NSMutableArray alloc] init]; + folderDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:nameField.text,@"title",bookmarksArray,@"bookmarks", nil]; + [foldersArray addObject:folderDict]; + //Core Data Fix + /* BookmarksController *parentBookmarksController = (BookmarksController *)[controllers objectAtIndex:[controllers count] - 3]; NSMutableArray *folders = (NSMutableArray *)[parentBookmarksController bookmarks]; NSIndexPath *selectedIndexPath = [[parentBookmarksController tableView] indexPathForSelectedRow]; NSManagedObject *parentFolder = [folders objectAtIndex:[selectedIndexPath row]]; [folder setValue:parentFolder forKey:@"Parent"]; - } + */ } else if (mode == 'E') { - NSMutableArray *folders = (NSMutableArray *)[newBookmarksController bookmarks]; - NSIndexPath *selectedIndexPath = [[newBookmarksController tableView] indexPathForSelectedRow]; - folder = [folders objectAtIndex:[selectedIndexPath row]]; + folderDict = (NSMutableDictionary*)[[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex] mutableCopy]; + [folderDict setObject:nameField.text forKey:@"title"]; + [foldersArray setObject:folderDict atIndexedSubscript:bookmarksController.folderIndex]; + //Core Data Fix + //NSIndexPath *selectedIndexPath = [[newBookmarksController tableView] indexPathForSelectedRow]; + //folder = [folders objectAtIndex:[selectedIndexPath row]]; } - + + [defaults setObject:foldersArray forKey:FOLDERS_KEY]; + [defaults synchronize]; + + //Core Data Fix + /* [folder setValue:nameField.text forKey:@"name"]; [managedObjectContext save:nil]; - - [bookmarksController reloadBookmarks]; - [[bookmarksController tableView] reloadData]; + */ + + //Reset the folder index back to the bookmarks root, since we're navigating back to the folder root + bookmarksController.folderIndex = BOOKMARKS_ROOT; + //Reload all bC controllers on the navigation stack + for (BookmarksController* bC in self.navigationController.viewControllers) + { + if([bC isKindOfClass:[BookmarksController class]]) + { + [bC reloadData]; + [bC.tableView reloadData]; + } + } [self.navigationController popViewControllerAnimated:YES]; [bookmarksController.browserController dismissPopups]; } diff --git a/Browser/BookmarkItem.h b/Browser/BookmarkItem.h index 83e6956..2039555 100644 --- a/Browser/BookmarkItem.h +++ b/Browser/BookmarkItem.h @@ -6,7 +6,8 @@ // #import -#import +//Core Data Fix +//#import @class BookmarksController; @@ -40,6 +41,7 @@ -(IBAction) deleteCircleClick:(id)sender; -(IBAction) deleteItem:(id)sender; -- (void) deleteItemFromDB:(NSManagedObject *) dbItem; +//Core Data Fix +//- (void) deleteItemFromDB:(NSManagedObject *) dbItem; @end diff --git a/Browser/BookmarkItem.m b/Browser/BookmarkItem.m index bd41972..2f68a76 100644 --- a/Browser/BookmarkItem.m +++ b/Browser/BookmarkItem.m @@ -85,15 +85,41 @@ -(IBAction) deleteCircleClick:(id)sender { -(IBAction) deleteItem:(id)sender { NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; + [self deleteFromBookmarks:[indexPath row]]; + //Core Data Fix + /* NSManagedObject *bookmarkToDelete = [[bookmarksController bookmarks] objectAtIndex:[indexPath row]]; - [[bookmarksController bookmarks] removeObject:bookmarkToDelete]; [self deleteItemFromDB:bookmarkToDelete]; [[bookmarksController managedObjectContext] save:nil]; + */ [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:YES]; [tableView reloadData]; } +-(void)deleteFromBookmarks:(NSInteger)index { + + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + + if (bookmarksController.folderIndex == BOOKMARKS_ROOT) + { + [bookmarksController.folders removeObjectAtIndex:index]; + } + else + { + [bookmarksController.bookmarks removeObjectAtIndex:index]; + NSMutableDictionary* folderDict = (NSMutableDictionary*)[[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex] mutableCopy]; + [folderDict setObject:bookmarksController.bookmarks forKey:@"bookmarks"]; + [bookmarksController.folders setObject:folderDict atIndexedSubscript:bookmarksController.folderIndex]; + } + + [defaults setObject:bookmarksController.folders forKey:FOLDERS_KEY]; + [defaults synchronize]; + [bookmarksController reloadData]; +} + +//Core Data Fix +/* - (void) deleteItemFromDB:(NSManagedObject *) dbItem { if ([[[dbItem entity] name] isEqualToString:@"Folder"]) { NSFetchRequest *request = [[NSFetchRequest alloc] init]; @@ -108,6 +134,7 @@ - (void) deleteItemFromDB:(NSManagedObject *) dbItem { } [[bookmarksController managedObjectContext] deleteObject:dbItem]; } +*/ diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index 34bdcbe..0f1d5af 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -6,7 +6,13 @@ // #import -#import + +#define FOLDERS_KEY @"BookmarksFolders" +#define BOOKMARKS_ROOT -1 +#define MAX_BOOKMARKS 1000 + +//Core Data Fix +//#import @class BookmarksFormController; @class BookmarkFolderFormController; @@ -18,11 +24,15 @@ BookmarksFormController *formController; BookmarkFolderFormController *folderController; - NSManagedObjectContext *managedObjectContext; - NSManagedObject *currentFolder; + //Core Data Fix + //NSManagedObjectContext *managedObjectContext; + //NSManagedObject *currentFolder; char mode; + NSInteger folderIndex; + NSInteger bookmarkIndex; NSMutableArray *bookmarks; + NSMutableArray *folders; IBOutlet UITableView *tableView; @@ -36,12 +46,16 @@ @property(nonatomic, strong) BookmarksFormController *formController; @property(nonatomic, strong) BookmarkFolderFormController *folderController; -@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; -@property(nonatomic, strong) NSManagedObject *currentFolder; +//Core Data Fix +//@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; +//@property(nonatomic, strong) NSManagedObject *currentFolder; @property(nonatomic, assign) char mode; +@property(nonatomic, assign) NSInteger folderIndex; +@property(nonatomic, assign) NSInteger bookmarkIndex; @property(nonatomic, strong) NSMutableArray *bookmarks; +@property(nonatomic, strong) NSMutableArray *folders; @property(nonatomic, strong) UITableView *tableView; @@ -55,7 +69,7 @@ -(IBAction) finishEditMode:(id)sender; -(IBAction) addFolder:(id)sender; --(NSMutableArray *) reloadBookmarks; +-(void)reloadData; -(void) openBookmark:(NSIndexPath *) indexPath; @end diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index c1120c2..0c6fd06 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -5,8 +5,8 @@ // Copyright 2011 Evidon. All rights reserved. // +#import "Logging.h" #import "BookmarksController.h" -#import "BrowserDelegate.h" #import "BrowserViewController.h" #import "BookmarkItem.h" #import "BookmarksFormController.h" @@ -14,23 +14,45 @@ @implementation BookmarksController -@synthesize browserController, formController, folderController, managedObjectContext, mode, bookmarks, folderImage, bookmarkImage, toolbar, editToolbar, tableView, currentFolder; +@synthesize browserController, formController, folderController; +@synthesize mode, bookmarks, folders, folderImage, bookmarkImage; +@synthesize toolbar, editToolbar, tableView, folderIndex, bookmarkIndex; -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* +// The designated initializer. Override if you create the controller programmatically +// and want to perform customization that is not appropriate for viewDidLoad. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. + self.folderIndex = BOOKMARKS_ROOT; + [self reloadData]; } return self; } -*/ - - (void)viewDidLoad { + + //Load the Folders dictionary from the key in user defaults storage. + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary* foldersDict = [defaults objectForKey:FOLDERS_KEY]; + //Check to see if the folders dict is nil, if it is, create a new folder withe the default structure. + if (foldersDict == nil) + { + + NSMutableArray* folderArray = [[NSMutableArray alloc] init]; + NSMutableArray* bookmarksArray = [[NSMutableArray alloc] init]; + NSDictionary* defaultBookmark = [NSDictionary dictionaryWithObjectsAndKeys:@"Reddit", @"title", + @"http://www.reddit.com",@"URL",nil]; + [bookmarksArray addObject:defaultBookmark]; + foldersDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Default", @"title", + bookmarksArray, @"bookmarks",nil]; + [folderArray addObject:foldersDict]; + [defaults setObject:folderArray forKey:FOLDERS_KEY]; + [defaults synchronize]; + } + // nav - UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(switchToBrowser:)]; [self.navigationItem setRightBarButtonItem:doneButton]; @@ -61,13 +83,15 @@ -(void) viewWillAppear:(BOOL)animated { folderImage = [UIImage imageNamed:@"folder.png"]; bookmarkImage = [UIImage imageNamed:@"bookmark.png"]; } + //Core Data Fix + //if (mode == 'P') { if (mode == 'P') { ((UIBarItem *)[[toolbar items] objectAtIndex:0]).enabled = NO; } else { ((UIBarItem *)[[toolbar items] objectAtIndex:0]).enabled = YES; } - - self.bookmarks = [self reloadBookmarks]; + //Core Data Fix + [self reloadData]; [tableView reloadData]; [super viewWillAppear:animated]; } @@ -85,49 +109,28 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { // case it launches in the current orientation return UIInterfaceOrientationPortrait; } - -- (NSMutableArray *) reloadBookmarks { - if (managedObjectContext == nil) - { - managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; - NSLog(@"After managedObjectContext: %@", managedObjectContext); - } - - // Create DB query request for bookmark folders - - NSFetchRequest *request = [[NSFetchRequest alloc] init]; - NSEntityDescription *folderEntity = [NSEntityDescription entityForName:@"Folder" inManagedObjectContext:managedObjectContext]; - NSPredicate *predicateF = nil; - if (mode != 'P') { - predicateF = [NSPredicate predicateWithFormat:(currentFolder != nil) ? [NSString stringWithFormat:@"Parent.name == '%@'", [currentFolder valueForKey:@"name"]] : @"Parent == nil"]; +-(void)reloadData { + //Core Data Fix + //Get the array of folder dictionaries from NSUSerDefaults + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; + self.folders = [foldersArray mutableCopy]; + //If this isn't a folder array, it must be a bookmark array, so return the bookmark array. + if (self.folderIndex != BOOKMARKS_ROOT) { + NSMutableDictionary* folderDict = [foldersArray objectAtIndex:self.folderIndex]; + self.bookmarks = [[folderDict objectForKey:@"bookmarks"] mutableCopy]; } - [request setEntity:folderEntity]; - [request setPredicate:predicateF]; - NSMutableArray *folderFetchResults = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; - - // Create DB query request for bookmarks - - NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:managedObjectContext]; - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Folder.name == %@", ((currentFolder == nil) ? nil : [currentFolder valueForKey:@"name"])]; - [request setEntity:entity]; - [request setPredicate:predicate]; - NSArray *bookmarkFetchResults = [managedObjectContext executeFetchRequest:request error:nil]; - - if (mode != 'P') { - [folderFetchResults addObjectsFromArray:bookmarkFetchResults]; - } else { - [folderFetchResults insertObject:@"Bookmarks" atIndex:0]; + else { + self.bookmarks = nil; } - - return folderFetchResults; } - (IBAction)switchToBrowser:(id)sender { if (mode == 'E') { [self finishEditMode:sender]; } - [self.navigationController popToRootViewControllerAnimated:NO]; + //[self.navigationController popToRootViewControllerAnimated:NO]; [UIView animateWithDuration:0.25 animations:^{ [self.navigationController view].alpha =0.0f; [browserController dismissPopups]; @@ -135,7 +138,7 @@ - (IBAction)switchToBrowser:(id)sender { } -(void) openBookmark:(NSIndexPath *) indexPath{ - [[browserController addressBar] setText:[[bookmarks objectAtIndex:[indexPath row]] valueForKey:@"url"]]; + [[browserController addressBar] setText:[[bookmarks objectAtIndex:[indexPath row]] valueForKey:@"URL"]]; [browserController gotoAddress:nil]; [self switchToBrowser:nil]; } @@ -145,9 +148,7 @@ -(IBAction) enableEditMode:(id)sender { toolbar.hidden = YES; editToolbar.hidden = NO; [self.navigationItem setRightBarButtonItem:nil]; - [tableView reloadData]; - } -(IBAction) finishEditMode:(id)sender{ @@ -165,6 +166,7 @@ -(IBAction) finishEditMode:(id)sender{ } -(IBAction) addFolder:(id)sender{ [folderController setMode:'A']; + [folderController setBookmarksController:self]; [self.navigationController pushViewController:(UIViewController *)folderController animated:YES]; } @@ -177,13 +179,11 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - // Return the number of rows in the section. - /*if (showAllBugs) { - return [[[[NSURLCache sharedURLCache] filterManager] bugArray] count]; - } else { - return [detectedBugs count]; - }*/ - return [bookmarks count]; + [self reloadData]; + if(self.bookmarks != nil && self.folderIndex != BOOKMARKS_ROOT) + return [bookmarks count]; + else + return [folders count]; } @@ -203,11 +203,61 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa } } } - - NSManagedObject *item= [bookmarks objectAtIndex:[indexPath row]]; - cell.bookmarksController = self; + cell.bookmarksController = self; cell.tableView = localTableView; cell.indexPath = indexPath; + + //Load contents of each folder dictionary into a cell if in the Bookmarks root + if (self.mode == 'V' || self.mode == 'P') + { + NSDictionary* folderDict = [self.folders objectAtIndex:[indexPath row]]; + [cell.cellLabel setText:[folderDict valueForKey:@"title"]]; + cell.cellImage.image = folderImage; + } + + //Load contents of each bookmark dictionary into a cell if in a Folder + if (self.mode == 'B') + { + NSDictionary* folderDict = [self.folders objectAtIndex:self.folderIndex]; + NSArray* bookmarksArray = [folderDict objectForKey:@"bookmarks"]; + NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; + [cell.cellLabel setText:[bookmarkDict valueForKey:@"title"]]; + LogInfo(@"Cell Label : %@", cell.cellLabel.text); + cell.cellImage.image = bookmarkImage; + } + + if (self.mode == 'E') { + if(self.folderIndex != BOOKMARKS_ROOT) + { + NSDictionary* folderDict = [self.folders objectAtIndex:self.folderIndex]; + NSArray* bookmarksArray = [folderDict objectForKey:@"bookmarks"]; + NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; + [cell.cellLabel setText:[bookmarkDict valueForKey:@"title"]]; + cell.cellImage.image = bookmarkImage; + [cell enableEdit]; + } + else + { + NSDictionary* folderDict = [self.folders objectAtIndex:[indexPath row]]; + [cell.cellLabel setText:[folderDict valueForKey:@"title"]]; + cell.cellImage.image = folderImage; + if ([self.folders count] > 1) + { + [cell enableEdit]; + } + else + { + [cell disableEdit]; + } + } + } else { + [cell disableEdit]; + } + + + //Core Data Fix + /* + NSManagedObject *item= [bookmarks objectAtIndex:[indexPath row]]; if (![item isEqual:@"Bookmarks"] && [[[item entity] name] isEqualToString:@"Bookmark"]) { cell.cellImage.image = bookmarkImage; } else { @@ -224,23 +274,15 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa } else if (self.mode == 'V') { [cell disableEdit]; } + */ return cell; } -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - /*NSMutableArray *bugs = showAllBugs ? [[[NSURLCache sharedURLCache] filterManager] bugArray] : detectedBugs; - NSManagedObject *bug = [bugs objectAtIndex:[indexPath indexAtPosition:1]]; - NSNumber *block = [bug valueForKey:@"block"]; - if (block.boolValue) { - cell.textLabel.font = [UIFont italicSystemFontOfSize:19.0]; - cell.textLabel.textColor = [UIColor colorWithRed:0.2 green:0.0 blue:0.0 alpha:0.7]; - } else { - cell.textLabel.font = [UIFont boldSystemFontOfSize:19.0]; - cell.textLabel.textColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1]; - }*/ - //cell.selectionStyle = UITableViewCellSelectionStyleNone; + ((BookmarkItem *)cell).cellLabel.font = [UIFont italicSystemFontOfSize:17.0]; + } @@ -288,36 +330,49 @@ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *) #pragma mark Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - /*NSMutableArray *bugs = showAllBugs ? [[[NSURLCache sharedURLCache] filterManager] bugArray] : detectedBugs; - NSManagedObject *bug = [bugs objectAtIndex:[indexPath indexAtPosition:1]]; - NSNumber *block = [bug valueForKey:@"block"]; - - selectedManagedObject = [bugs objectAtIndex:[indexPath row]]; - if (selectedIndexPath) { - [selectedIndexPath release]; - } - selectedIndexPath = [indexPath copy]; - - if (block.boolValue) { - [blockButton setTitle:@"Unblock"]; - } else { - [blockButton setTitle:@"Block"]; - }*/ - NSManagedObject *item = [bookmarks objectAtIndex:[indexPath row]]; - if (mode == 'V') { - if ([[[item entity] name] isEqualToString:@"Folder"]) { - BookmarksController *nextBookmarkController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; - [nextBookmarkController setMode:[self mode]]; - [nextBookmarkController setCurrentFolder:item]; - [nextBookmarkController setManagedObjectContext:managedObjectContext]; - [nextBookmarkController setBrowserController:browserController]; - [nextBookmarkController setFolderController:[self folderController]]; - [self.navigationController pushViewController:nextBookmarkController animated:YES]; - } else { - [self openBookmark:indexPath]; - } + + + if (mode == 'B') { + //Get the folder Dictionary + NSDictionary* folderDict = [self.folders objectAtIndex:folderIndex]; + NSArray* bookmarksArray = [folderDict objectForKey:@"bookmarks"]; + //Get the bookmark Dictionary + NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; + //Open the URL from the bookmark in the folder + [self openBookmark:indexPath]; + + } + //Core Data Fix + //NSManagedObject *item = [bookmarks objectAtIndex:[indexPath row]]; + else if (mode == 'V') { + //Create a new bookmark controller, set the mode, and folder index + BookmarksController *nextBookmarkController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; + [nextBookmarkController setMode:'B']; + [nextBookmarkController setFolderIndex:[indexPath row]]; + [nextBookmarkController setBrowserController:browserController]; + [nextBookmarkController setFolderController:[self folderController]]; + [self.navigationController pushViewController:nextBookmarkController animated:YES]; - } else if (mode == 'E') { + } + else if (mode == 'E') { + + [self reloadData]; + + if (self.folderIndex == BOOKMARKS_ROOT) + { + self.folderIndex = [indexPath row]; + [folderController setMode:'E']; + [self.navigationController pushViewController:(UIViewController *)folderController animated:YES]; + } + else + { + [formController setMode:'E']; + [self setBookmarkIndex:[indexPath row]]; + [self.navigationController pushViewController:formController animated:YES]; + } + + //Core Data Fix + /* if ([[[item entity] name] isEqualToString:@"Folder"]) { [folderController setMode:'E']; [folderController setFolder:item]; @@ -326,12 +381,28 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [formController setMode:'E']; [self.navigationController pushViewController:formController animated:YES]; } - - } else if (mode == 'P') { + */ + + } else if (self.mode == 'P') { + NSArray *vControllers = self.navigationController.viewControllers; + [[vControllers objectAtIndex:([vControllers count] - 3) ] setFolderIndex:[indexPath row]]; + [self.navigationController popViewControllerAnimated:YES]; + + } + + //Core Data Fix + /*else if (mode == 'P') { NSArray *vControllers = self.navigationController.viewControllers; [[vControllers objectAtIndex:([vControllers count] - 2) ] setSelectedFolder:item]; [self.navigationController popViewControllerAnimated:YES]; - } + + }*/ + +} + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + if ([tableView numberOfRowsInSection:0] < 2 && folderIndex == BOOKMARKS_ROOT) return NO; + return YES; } - (void)didReceiveMemoryWarning { diff --git a/Browser/BookmarksFormController.h b/Browser/BookmarksFormController.h index c80bce0..434e6c1 100644 --- a/Browser/BookmarksFormController.h +++ b/Browser/BookmarksFormController.h @@ -6,36 +6,41 @@ // #import -#import +//Core Data Fix +//#import @interface BookmarksFormController : UIViewController { IBOutlet UIButton *parentField; IBOutlet UITextField *nameField; IBOutlet UITextField *urlField; + IBOutlet UILabel *arrowLabel; UIBarButtonItem *cancelButton; UIBarButtonItem *doneButton; - NSManagedObject *selectedFolder; + //Core Data Fix + //NSManagedObject *selectedFolder; + //NSManagedObjectContext *managedObjectContext; NSString *defaultUrlFieldText; char mode; - NSManagedObjectContext *managedObjectContext; } @property(nonatomic, strong) UIButton *parentField; @property(nonatomic, strong) UITextField *nameField; @property(nonatomic, strong) UITextField *urlField; +@property(nonatomic, strong) IBOutlet UILabel *arrowLabel; @property(nonatomic, strong) UIBarButtonItem *cancelButton; @property(nonatomic, strong) UIBarButtonItem *doneButton; -@property(nonatomic, strong) NSManagedObject *selectedFolder; +//Core Data Fix +//@property(nonatomic, strong) NSManagedObject *selectedFolder; +//@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; @property(nonatomic,strong) NSString *defaultUrlFieldText; @property(nonatomic, assign) char mode; -@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; -(IBAction) switchToBrowser:(id)sender; -(IBAction) folderSelect:(id)sender; diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index d12f78c..473c8e2 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -7,38 +7,20 @@ #import "BookmarksController.h" #import "BookmarksFormController.h" -#import "BrowserDelegate.h" +#import "AppDelegate.h" #import "BrowserViewController.h" @class BrowserViewController; @class BookmarksController; +@class AppDelegate; @implementation BookmarksFormController -@synthesize parentField, nameField, urlField, cancelButton, doneButton, managedObjectContext, mode, selectedFolder, defaultUrlFieldText; - -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization. - } - return self; -} -*/ - +@synthesize parentField, nameField, urlField, arrowLabel, cancelButton, doneButton, mode, defaultUrlFieldText; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { - //set up DB - if (managedObjectContext == nil) - { - managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; - NSLog(@"After managedObjectContext: %@", managedObjectContext); - } - if (!mode) { mode = 'A'; } @@ -58,7 +40,9 @@ - (void) viewWillAppear:(BOOL)animated { NSArray *vControllers = [self.navigationController viewControllers]; BookmarksController *bookmarksController = [vControllers objectAtIndex:([vControllers count] - 2)]; BrowserViewController *browserController = [bookmarksController browserController]; - + + + //Edit mode if (mode == 'E') { // adjust nav self.navigationItem.title = @"Edit Bookmark"; @@ -66,22 +50,19 @@ - (void) viewWillAppear:(BOOL)animated { [self.navigationItem setLeftBarButtonItem:nil]; // load name and url - [bookmarksController reloadBookmarks]; - NSMutableArray *bookmarks = [bookmarksController bookmarks]; - NSIndexPath *selectedIndexPath = [[bookmarksController tableView] indexPathForSelectedRow]; - NSManagedObject *bookmark = [bookmarks objectAtIndex:[selectedIndexPath row]]; - [urlField setText:[bookmark valueForKey:@"url"]]; - [nameField setText:[bookmark valueForKey:@"name"]]; - if (selectedFolder == nil) { - selectedFolder = [bookmark valueForKey:@"Folder"]; - } - + [bookmarksController reloadData]; + [urlField setText:[[bookmarksController.bookmarks objectAtIndex:bookmarksController.bookmarkIndex] valueForKey:@"URL"]]; + [nameField setText:[[bookmarksController.bookmarks objectAtIndex:bookmarksController.bookmarkIndex] valueForKey:@"title"]]; + [parentField setHidden:YES]; + [arrowLabel setHidden:YES]; - } else if (mode == 'A') { + } else if (mode == 'A') { //Add Bookmark mode // adjust nav self.navigationItem.title = @"Add Bookmark"; [self.navigationItem setRightBarButtonItem:doneButton]; [self.navigationItem setLeftBarButtonItem:cancelButton]; + [parentField setHidden:NO]; + [arrowLabel setHidden:NO]; if (defaultUrlFieldText != nil) { [urlField setText:defaultUrlFieldText]; @@ -97,10 +78,25 @@ - (void) viewWillAppear:(BOOL)animated { } } - if (selectedFolder != nil && ![selectedFolder isEqual:@"Bookmarks"]) { - [parentField setTitle:[selectedFolder valueForKey:@"name"] forState:UIControlStateNormal]; - } else { - [parentField setTitle:@"Bookmarks" forState:UIControlStateNormal]; + + if (bookmarksController.folders != nil && [bookmarksController.folders count] > 0) { + NSDictionary* folderDict = nil; + NSString* title; + + if(bookmarksController.folderIndex != BOOKMARKS_ROOT) + { + folderDict = [bookmarksController.folders objectAtIndex:bookmarksController.folderIndex]; + title = [folderDict objectForKey:@"title"]; + } + else + { + folderDict = [bookmarksController.folders objectAtIndex:0]; + title = [folderDict objectForKey:@"title"]; + } + + [parentField setTitle:title forState:UIControlStateNormal]; + [parentField setTitle:title forState:UIControlStateSelected]; + [parentField setTitle:title forState:UIControlStateHighlighted]; } [nameField becomeFirstResponder]; } @@ -126,33 +122,103 @@ - (IBAction) switchToBrowser:(id)sender { - (IBAction) folderSelect:(id)sender { BookmarksController *nextBookmarkController = [[BookmarksController alloc] init]; [[NSBundle mainBundle] loadNibNamed:@"Bookmarks" owner:nextBookmarkController options:nil]; - [nextBookmarkController setMode:'P']; - [nextBookmarkController setManagedObjectContext:managedObjectContext]; + AppDelegate* delegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; + [nextBookmarkController setBrowserController:delegate.viewController]; + [nextBookmarkController setMode:'P']; + [nextBookmarkController setFolderIndex:BOOKMARKS_ROOT]; [self.navigationController pushViewController:nextBookmarkController animated:YES]; } - (IBAction) saveBookmark:(id)sender { - NSArray *vControllers = [self.navigationController viewControllers]; + + NSArray *vControllers = [self.navigationController viewControllers]; BookmarksController *bookmarksController = [vControllers objectAtIndex:([vControllers count] - 2)]; - NSManagedObject *bookmark = nil; - if (mode == 'A') { - bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:managedObjectContext]; - } else if (mode == 'E') { - NSMutableArray *bookmarks = [bookmarksController bookmarks]; - NSIndexPath *selectedIndexPath = [[bookmarksController tableView] indexPathForSelectedRow]; - bookmark = [bookmarks objectAtIndex:[selectedIndexPath row]]; - } - - [bookmark setValue:nameField.text forKey:@"name"]; - [bookmark setValue:urlField.text forKey:@"url"]; - [bookmark setValue:([selectedFolder isEqual:@"Bookmarks"] ? nil : selectedFolder) forKey:@"Folder"]; - - [managedObjectContext save:nil]; - - [bookmarksController reloadBookmarks]; - [[bookmarksController tableView] reloadData]; - [bookmarksController switchToBrowser:sender]; + + //New Code to save bookmark - NSUserDefaults + + //Load the Folders dictionary from the key in user defaults storage. + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray* foldersArray = [[defaults objectForKey:FOLDERS_KEY] mutableCopy]; + + //Create a bookmarks Dictionary + NSMutableDictionary* bookmarkDict = [[NSMutableDictionary alloc] init]; + [bookmarkDict setObject:nameField.text forKey:@"title"]; + [bookmarkDict setObject:[urlField.text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] forKey:@"URL"]; + + //Loop to check if the bookmarks have reached the max capacity and check if the bookmark exists + NSUInteger totalBookmarks = 0; + if(self.mode != 'E') + { + for (NSDictionary* folderDict in foldersArray) + { + //increment bookmarks counter + NSArray* bookmarkArray = (NSArray*)[folderDict objectForKey:@"bookmarks"]; + totalBookmarks += [bookmarkArray count]; + + //Return after proper alert message if the bookmark exists + for (NSDictionary* bookmarkDict in bookmarkArray) + { + if([[urlField.text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] + isEqualToString:[bookmarkDict objectForKey:@"URL"]]) + { + UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Duplicate Bookmark" + message:[NSString stringWithFormat:@"This is in bookmark from folder \"%@\"",[folderDict objectForKey:@"title"]] + delegate:self + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [alert show]; + return; + } + } + } + } + + //Show alert if at max capacity and return + if(totalBookmarks >= MAX_BOOKMARKS) + { + UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Unable to Add Bookmark" + message:@"Bookmarks have reached max. capacity" + delegate:self + cancelButtonTitle:@"OK" + otherButtonTitles:nil]; + [alert show]; + return; + } + + //Add the bookmark dictionary to the current folder's bookmark array + if(bookmarksController.folderIndex == BOOKMARKS_ROOT) bookmarksController.folderIndex = 0; + NSMutableDictionary* folderDict = (NSMutableDictionary*)[[foldersArray objectAtIndex:bookmarksController.folderIndex] mutableCopy]; + NSMutableArray* bookmarksArray = [[folderDict objectForKey:@"bookmarks"] mutableCopy]; + if(self.mode == 'E') + { + [bookmarksArray setObject:bookmarkDict atIndexedSubscript:bookmarksController.bookmarkIndex]; + } + else + { + [bookmarksArray addObject:bookmarkDict]; + } + [folderDict setObject:bookmarksArray forKey:@"bookmarks"]; + [foldersArray setObject:folderDict atIndexedSubscript:bookmarksController.folderIndex]; + + //Save the bookmark into the correct folder + [defaults setObject:foldersArray forKey:FOLDERS_KEY]; + [defaults synchronize]; + [bookmarksController setMode:'B']; + //Reload all bC controllers on the navigation stack + for (BookmarksController* bC in self.navigationController.viewControllers) + { + if([bC isKindOfClass:[BookmarksController class]]) + { + [bC reloadData]; + [bC.tableView reloadData]; + } + } + if(self.mode != 'E') + { + [bookmarksController switchToBrowser:sender]; + } [bookmarksController.browserController dismissPopups]; + [self.navigationController popViewControllerAnimated:YES]; } diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 9f0113e..290db3a 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -46,7 +46,7 @@ @property(nonatomic,strong) NSURL *gotoUrl; -@property(nonatomic,strong) UINavigationController *bookmarksController; +@property(nonatomic,strong) UINavigationController *bookmarksNavController; @property(nonatomic,strong) BookmarksFormController *bookmarksFormController; @property(nonatomic,strong) BrowserViewController *browserController; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 6d798ca..9c652f0 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -11,7 +11,6 @@ #import "BookmarksFormController.h" #import "BookmarkFolderFormController.h" #import "UIMainView.h" -#import "BrowserDelegate.h" #import "Reachability.h" #import "Logging.h" @@ -68,8 +67,8 @@ - (void)viewDidLoad [(UIMainView *)[self view] sizeStatusBar]; // Set up bookmark controllers [self createBookmarksController:YES]; - [self.view addSubview:self.bookmarksController.view]; - self.bookmarksController.view.alpha = 0.0f; //Hide the bookmarks controller + [self.view addSubview:self.bookmarksNavController.view]; + self.bookmarksNavController.view.alpha = 0.0f; //Hide the bookmarks controller // Tweak address bar view so text doesn't overflow UIView *addressBarStatusView = [[ UIView alloc ] initWithFrame: @@ -98,7 +97,7 @@ -(UINavigationController*)createBookmarksController:(BOOL)isMainController { [bookmarksController setFolderController:bookmarkFolderFormController]; if(isMainController) //Creating the main bookmarks page which persists by hiding/unhiding { - [self setBookmarksController:bookmarksNavController]; + [self setBookmarksNavController:bookmarksNavController]; [self setBookmarksFormController:bookmarksFormController]; } else //Creating a temporary bookmark controller for the popup with a form controller on the top of the nav stack @@ -143,6 +142,8 @@ - (void)keyboardWasHidden:(NSNotification*)aNotification { -(void) saveOpenTabs { LogTrace(@"%s", __PRETTY_FUNCTION__); + //Core Data Fix + /* NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSError *error; int orderCount = 0; @@ -156,11 +157,14 @@ -(void) saveOpenTabs { if (![managedObjectContext save:&error]) { NSLog(@"Error inserting %@ - error:%@",[self tabs],error); } + */ } -(void) openSavedTabs { LogTrace(@"%s", __PRETTY_FUNCTION__); + //Core Data Fix + /* NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSError *error = nil; @@ -180,12 +184,15 @@ -(void) openSavedTabs { if (![managedObjectContext save:&error]) { NSLog(@"Error deleting %@ - error:%@",tabFetchResults,error); } + */ } -(void) deleteSavedTabs { LogTrace(@"%s", __PRETTY_FUNCTION__); + //Core Data Fix + /* NSManagedObjectContext *managedObjectContext = [(BrowserDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSError *error = nil; @@ -199,6 +206,7 @@ -(void) deleteSavedTabs { if (![managedObjectContext save:&error]) { NSLog(@"Error deleting %@ - error:%@",tabFetchResults,error); } + */ } @@ -572,12 +580,18 @@ -(IBAction) showBookmarks:(id)sender { -(void) showBookmarksView:(id)sender { LogTrace(@"%s", __PRETTY_FUNCTION__); - [self.view bringSubviewToFront:self.bookmarksController.view]; - BookmarksController* bC = [self.bookmarksController.viewControllers objectAtIndex:0]; - bC.bookmarks = [bC reloadBookmarks]; - [bC.tableView reloadData]; + [self.view bringSubviewToFront:self.bookmarksNavController.view]; + //Reload all bC controllers on the navigation stack + for (BookmarksController* bC in self.bookmarksNavController.viewControllers) + { + if([bC isKindOfClass:[BookmarksController class]]) + { + [bC reloadData]; + [bC.tableView reloadData]; + } + } [UIView animateWithDuration:0.25 animations:^{ - self.bookmarksController.view.alpha =1.0f; + self.bookmarksNavController.view.alpha =1.0f; }]; } @@ -599,9 +613,9 @@ -(NSArray *) actionSheetButtons { // hide add bookmark for local html files if ([[[_selectedTab webView] request].URL isFileURL]) { - return [NSArray arrayWithObjects:@"Clear Cookies", @"Clear Cache", @"Import Bookmarks", nil]; + return [NSArray arrayWithObjects:@"Clear Cookies", @"Clear Cache", nil]; } else { - return [NSArray arrayWithObjects:@"Add Bookmark", @"Clear Cookies", @"Clear Cache", @"Import Bookmarks", nil]; + return [NSArray arrayWithObjects:@"Add Bookmark", @"Clear Cookies", @"Clear Cache", nil]; } } @@ -674,7 +688,7 @@ -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger) // Import Bookmarks - else if (buttonIndex == 3) { + /*else if (buttonIndex == 3) { [self addTab:actionSheet]; NSString *urlAddress = @""; //[[self webView] loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"import_bookmark_howto" ofType:@"html"]isDirectory:NO]]]; @@ -682,7 +696,7 @@ -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger) NSData *launchData = [NSData dataWithContentsOfFile:path]; [[self webView] loadData:launchData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; [_addressBar setText:urlAddress]; - } + }*/ } diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index a70670d..788dc12 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -7,14 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - 71ED23B819447163002ACD24 /* BrowserDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */; }; B572E55718D08D2A005E4834 /* Tab.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E54718D08D2A005E4834 /* Tab.m */; }; B572E55818D08D2A005E4834 /* BookmarksController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E54818D08D2A005E4834 /* BookmarksController.m */; }; B572E55918D08D2A005E4834 /* BookmarksFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E54A18D08D2A005E4834 /* BookmarksFormController.m */; }; B572E55A18D08D2A005E4834 /* BrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E54C18D08D2A005E4834 /* BrowserViewController.m */; }; B572E55B18D08D2A005E4834 /* UIMainView.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E54F18D08D2A005E4834 /* UIMainView.m */; }; B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */; }; - B572E55D18D08D2A005E4834 /* BookmarkImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55318D08D2A005E4834 /* BookmarkImporter.m */; }; B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55518D08D2A005E4834 /* BookmarkItem.m */; }; B5A210C218D091F700D65141 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A210C118D091F700D65141 /* Reachability.m */; }; FAA4557418A19A2E00B1BDF4 /* gsearch.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557118A19A2E00B1BDF4 /* gsearch.png */; }; @@ -34,7 +32,6 @@ FAC9B27416F27BF800E37710 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FAC9B27316F27BF800E37710 /* Default-568h@2x.png */; }; FAC9B27716F27BF800E37710 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC9B27616F27BF800E37710 /* ViewController.m */; }; FAC9B3B116F3863500E37710 /* libxml2.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B3B016F3863500E37710 /* libxml2.2.dylib */; }; - FAC9B3B516F38C6500E37710 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B3B416F38C6500E37710 /* CoreData.framework */; }; FAC9B3B916F38D3700E37710 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B3B816F38D3700E37710 /* SystemConfiguration.framework */; }; FAF75E9618A17A77007B317D /* BookmarkFoldersForm.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E8118A17A77007B317D /* BookmarkFoldersForm.xib */; }; FAF75E9718A17A77007B317D /* BookmarkItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E8218A17A77007B317D /* BookmarkItem.xib */; }; @@ -44,7 +41,6 @@ FAF75EA518A17A77007B317D /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */; }; FAF75EA618A17A77007B317D /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9218A17A77007B317D /* MainWindow.xib */; }; FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9318A17A77007B317D /* Bookmarks.xib */; }; - FAF75EE218A17BFD007B317D /* BrowserModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */; }; FAF75EE318A17BFD007B317D /* arrow-left.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED718A17BFD007B317D /* arrow-left.png */; }; FAF75EE418A17BFD007B317D /* arrow-right.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED818A17BFD007B317D /* arrow-right.png */; }; FAF75EE518A17BFD007B317D /* bookmark.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED918A17BFD007B317D /* bookmark.png */; }; @@ -59,8 +55,6 @@ /* Begin PBXFileReference section */ 4B1C68B2197DEC050014AB79 /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logging.h; sourceTree = ""; }; - 71ED23B4194470B2002ACD24 /* BrowserDelegate.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; name = BrowserDelegate.h; path = ../Browser/BrowserDelegate.h; sourceTree = ""; }; - 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BrowserDelegate.m; path = ../Browser/BrowserDelegate.m; sourceTree = ""; }; B572E54718D08D2A005E4834 /* Tab.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Tab.m; path = ../Browser/Tab.m; sourceTree = ""; }; B572E54818D08D2A005E4834 /* BookmarksController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarksController.m; sourceTree = ""; }; B572E54918D08D2A005E4834 /* BookmarksFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksFormController.h; sourceTree = ""; }; @@ -72,8 +66,6 @@ B572E54F18D08D2A005E4834 /* UIMainView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UIMainView.m; path = ../Browser/UIMainView.m; sourceTree = ""; }; B572E55018D08D2A005E4834 /* BookmarkFolderFormController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkFolderFormController.h; sourceTree = ""; }; B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkFolderFormController.m; sourceTree = ""; }; - B572E55218D08D2A005E4834 /* BookmarkImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkImporter.h; sourceTree = ""; }; - B572E55318D08D2A005E4834 /* BookmarkImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkImporter.m; sourceTree = ""; }; B572E55418D08D2A005E4834 /* BookmarkItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarkItem.h; sourceTree = ""; }; B572E55518D08D2A005E4834 /* BookmarkItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BookmarkItem.m; sourceTree = ""; }; B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = ""; }; @@ -101,7 +93,6 @@ FAC9B27516F27BF800E37710 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; FAC9B27616F27BF800E37710 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; FAC9B3B016F3863500E37710 /* libxml2.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.2.dylib; path = usr/lib/libxml2.2.dylib; sourceTree = SDKROOT; }; - FAC9B3B416F38C6500E37710 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; FAC9B3B816F38D3700E37710 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; FAF75E8118A17A77007B317D /* BookmarkFoldersForm.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BookmarkFoldersForm.xib; sourceTree = ""; }; FAF75E8218A17A77007B317D /* BookmarkItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BookmarkItem.xib; sourceTree = ""; }; @@ -111,7 +102,6 @@ FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "MainWindow-iPad.xib"; sourceTree = ""; }; FAF75E9218A17A77007B317D /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; FAF75E9318A17A77007B317D /* Bookmarks.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Bookmarks.xib; sourceTree = ""; }; - FAF75ED518A17BFD007B317D /* BrowserModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = BrowserModel.xcdatamodel; sourceTree = ""; }; FAF75ED718A17BFD007B317D /* arrow-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-left.png"; sourceTree = ""; }; FAF75ED818A17BFD007B317D /* arrow-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-right.png"; sourceTree = ""; }; FAF75ED918A17BFD007B317D /* bookmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bookmark.png; sourceTree = ""; }; @@ -131,7 +121,6 @@ buildActionMask = 2147483647; files = ( FAC9B3B916F38D3700E37710 /* SystemConfiguration.framework in Frameworks */, - FAC9B3B516F38C6500E37710 /* CoreData.framework in Frameworks */, FAC9B3B116F3863500E37710 /* libxml2.2.dylib in Frameworks */, FAC9B25E16F27BF800E37710 /* UIKit.framework in Frameworks */, FAC9B26016F27BF800E37710 /* Foundation.framework in Frameworks */, @@ -145,8 +134,6 @@ 0E54DB6D197DAE31005BF033 /* Bookmarks */ = { isa = PBXGroup; children = ( - B572E55218D08D2A005E4834 /* BookmarkImporter.h */, - B572E55318D08D2A005E4834 /* BookmarkImporter.m */, B572E55418D08D2A005E4834 /* BookmarkItem.h */, B572E55518D08D2A005E4834 /* BookmarkItem.m */, B572E55618D08D2A005E4834 /* BookmarksController.h */, @@ -225,7 +212,6 @@ children = ( FAC9B3B016F3863500E37710 /* libxml2.2.dylib */, FAC9B3B816F38D3700E37710 /* SystemConfiguration.framework */, - FAC9B3B416F38C6500E37710 /* CoreData.framework */, FAC9B25D16F27BF800E37710 /* UIKit.framework */, FAC9B25F16F27BF800E37710 /* Foundation.framework */, FAC9B26116F27BF800E37710 /* CoreGraphics.framework */, @@ -270,8 +256,6 @@ B572E54F18D08D2A005E4834 /* UIMainView.m */, B5A210C018D091F700D65141 /* Reachability.h */, B5A210C118D091F700D65141 /* Reachability.m */, - 71ED23B4194470B2002ACD24 /* BrowserDelegate.h */, - 71ED23B5194470B2002ACD24 /* BrowserDelegate.m */, B572E54B18D08D2A005E4834 /* BrowserViewController.h */, B572E54C18D08D2A005E4834 /* BrowserViewController.m */, ); @@ -285,7 +269,6 @@ 0E54DB6F197DAECA005BF033 /* Views */, 0E54DB6E197DAEA7005BF033 /* Web */, FAF75ED618A17BFD007B317D /* Images */, - FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */, ); name = "Browser Resources"; path = "../Browser Resources"; @@ -400,8 +383,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 71ED23B819447163002ACD24 /* BrowserDelegate.m in Sources */, - B572E55D18D08D2A005E4834 /* BookmarkImporter.m in Sources */, B572E55918D08D2A005E4834 /* BookmarksFormController.m in Sources */, B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */, B5A210C218D091F700D65141 /* Reachability.m in Sources */, @@ -413,7 +394,6 @@ B572E55A18D08D2A005E4834 /* BrowserViewController.m in Sources */, FAC9B27716F27BF800E37710 /* ViewController.m in Sources */, B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */, - FAF75EE218A17BFD007B317D /* BrowserModel.xcdatamodeld in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -537,19 +517,6 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCVersionGroup section */ - FAF75ED418A17BFD007B317D /* BrowserModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - FAF75ED518A17BFD007B317D /* BrowserModel.xcdatamodel */, - ); - currentVersion = FAF75ED518A17BFD007B317D /* BrowserModel.xcdatamodel */; - path = BrowserModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; -/* End XCVersionGroup section */ }; rootObject = FAC9B25216F27BF800E37710 /* Project object */; } diff --git a/sample-app/TestBrowser/AppDelegate.h b/sample-app/TestBrowser/AppDelegate.h index 889c807..f505307 100644 --- a/sample-app/TestBrowser/AppDelegate.h +++ b/sample-app/TestBrowser/AppDelegate.h @@ -7,11 +7,10 @@ // #import -#import "BrowserDelegate.h" @class BrowserViewController; -@interface AppDelegate : BrowserDelegate +@interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; diff --git a/sample-app/TestBrowser/AppDelegate.m b/sample-app/TestBrowser/AppDelegate.m index fc0867d..934ab16 100644 --- a/sample-app/TestBrowser/AppDelegate.m +++ b/sample-app/TestBrowser/AppDelegate.m @@ -11,7 +11,7 @@ @implementation AppDelegate -@synthesize window; +@synthesize window, viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { From f5e99255d3101309475011b8f4157895d4b815e7 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Fri, 25 Jul 2014 14:33:22 -0700 Subject: [PATCH 18/60] Tab title resizes and activity indicator appears in left side of tab to indicate loading status. --- Browser/Tab.m | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/Browser/Tab.m b/Browser/Tab.m index 5869f6d..817e2a8 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -19,6 +19,8 @@ @interface Tab () */ @property (assign) NSUInteger loadingCount; @property (nonatomic, strong) UILabel *tabTitle; +@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; +@property (nonatomic, assign) CGRect tabTitleFrame; @end @@ -51,6 +53,9 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _tabButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _tabButton.frame = CGRectMake(0.0, 0.0, 100.0, 26.0); + + _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + _activityIndicator.frame = CGRectMake(5, 2, 20, 20); // Create close tab button [self setCloseButton:[UIButton buttonWithType:UIButtonTypeCustom]]; @@ -61,8 +66,8 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _closeButton.frame = CGRectMake(79.0, -1.0, 25.0, 25.0); _closeButton.titleLabel.font = [UIFont systemFontOfSize:18]; - - _tabTitle = [[UILabel alloc] initWithFrame:CGRectMake(3, 0, 80, 22)]; + _tabTitleFrame = CGRectMake(3, 0, 80, 22); + _tabTitle = [[UILabel alloc] initWithFrame:_tabTitleFrame]; _tabTitle.font = [UIFont systemFontOfSize:11]; _tabTitle.text = @"Untitled"; @@ -70,6 +75,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { [_tabButton addSubview:_tabTitle]; [self addSubview:_tabButton]; [self addSubview:_closeButton]; + [self addSubview:_activityIndicator]; // Set up webview UIWebView *wvTemplate = (UIWebView *)[_viewController webViewTemplate]; @@ -145,7 +151,20 @@ - (void)finishedLoadingNotification:(NSNotification *)notification { - (void)incrementLoadingCount { LogTrace(@"%s", __PRETTY_FUNCTION__); + BOOL startedAtZero = NO; + if (_loadingCount == 0) { + startedAtZero = YES; + } _loadingCount++; + if (startedAtZero) { + CGRect newTabButtonFrame = _tabTitle.frame; + CGFloat offset = _activityIndicator.frame.size.width + 5; + LogDebug(@"offset: %f", offset); + newTabButtonFrame.origin.x += offset; + newTabButtonFrame.size.width -= offset; + _tabTitle.frame = newTabButtonFrame; + [_activityIndicator startAnimating]; + } } - (void)decrementLoadingCount { @@ -154,6 +173,15 @@ - (void)decrementLoadingCount { if (_loadingCount > 0) { _loadingCount--; } + if (_loadingCount == 0) { + [_activityIndicator stopAnimating]; +// CGRect newTabButtonFrame = _tabTitle.frame; +// CGFloat offset = _activityIndicator.frame.size.width + 5; +// LogDebug(@"offset: %f", offset); +// newTabButtonFrame.origin.x -= offset; +// newTabButtonFrame.size.width += offset; + _tabTitle.frame = _tabTitleFrame; + } } -(void) setTitle:(NSString *)title { @@ -417,6 +445,8 @@ -(void) webViewDidFinishLoad:(UIWebView *)webView { - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { LogTrace(@"%s", __PRETTY_FUNCTION__); + LogDebug(@"error: %@", error); + BOOL wasLoadingBeforeDecrement = NO; if (_loadingCount > 0) { wasLoadingBeforeDecrement = YES; From 44940756a3c1a648edc54641b75ec2b4368fd5fe Mon Sep 17 00:00:00 2001 From: Obi Date: Fri, 25 Jul 2014 14:40:49 -0700 Subject: [PATCH 19/60] Removed comments related to Core Data removal and NSUserDefaults implementation. --- Browser/BookmarkFolderFormController.m | 34 +--------------- Browser/BookmarkItem.h | 4 -- Browser/BookmarkItem.m | 28 ------------- Browser/BookmarksController.h | 12 +----- Browser/BookmarksController.m | 56 +------------------------- Browser/BookmarksFormController.h | 15 ------- 6 files changed, 4 insertions(+), 145 deletions(-) diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index 6962b4a..4b4ba58 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -11,19 +11,7 @@ @implementation BookmarkFolderFormController -//Core Data Fix -@synthesize nameField, /*folder, managedObjectContext,*/ mode, bookmarksController; - -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization. - } - return self; -} -*/ +@synthesize nameField, mode, bookmarksController; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { @@ -66,39 +54,19 @@ - (IBAction)saveFolder:(id)sender { } if (mode == 'A') { - //Core Data Fix - //folder = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:managedObjectContext]; // check for parent folder NSMutableArray* bookmarksArray = [[NSMutableArray alloc] init]; folderDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:nameField.text,@"title",bookmarksArray,@"bookmarks", nil]; [foldersArray addObject:folderDict]; - //Core Data Fix - /* - BookmarksController *parentBookmarksController = (BookmarksController *)[controllers objectAtIndex:[controllers count] - 3]; - NSMutableArray *folders = (NSMutableArray *)[parentBookmarksController bookmarks]; - NSIndexPath *selectedIndexPath = [[parentBookmarksController tableView] indexPathForSelectedRow]; - NSManagedObject *parentFolder = [folders objectAtIndex:[selectedIndexPath row]]; - [folder setValue:parentFolder forKey:@"Parent"]; - */ } else if (mode == 'E') { folderDict = (NSMutableDictionary*)[[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex] mutableCopy]; [folderDict setObject:nameField.text forKey:@"title"]; [foldersArray setObject:folderDict atIndexedSubscript:bookmarksController.folderIndex]; - //Core Data Fix - //NSIndexPath *selectedIndexPath = [[newBookmarksController tableView] indexPathForSelectedRow]; - //folder = [folders objectAtIndex:[selectedIndexPath row]]; } [defaults setObject:foldersArray forKey:FOLDERS_KEY]; [defaults synchronize]; - //Core Data Fix - /* - [folder setValue:nameField.text forKey:@"name"]; - - [managedObjectContext save:nil]; - */ - //Reset the folder index back to the bookmarks root, since we're navigating back to the folder root bookmarksController.folderIndex = BOOKMARKS_ROOT; //Reload all bC controllers on the navigation stack diff --git a/Browser/BookmarkItem.h b/Browser/BookmarkItem.h index 2039555..42b7dad 100644 --- a/Browser/BookmarkItem.h +++ b/Browser/BookmarkItem.h @@ -6,8 +6,6 @@ // #import -//Core Data Fix -//#import @class BookmarksController; @@ -41,7 +39,5 @@ -(IBAction) deleteCircleClick:(id)sender; -(IBAction) deleteItem:(id)sender; -//Core Data Fix -//- (void) deleteItemFromDB:(NSManagedObject *) dbItem; @end diff --git a/Browser/BookmarkItem.m b/Browser/BookmarkItem.m index 2f68a76..02b64c8 100644 --- a/Browser/BookmarkItem.m +++ b/Browser/BookmarkItem.m @@ -86,13 +86,6 @@ -(IBAction) deleteCircleClick:(id)sender { -(IBAction) deleteItem:(id)sender { NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; [self deleteFromBookmarks:[indexPath row]]; - //Core Data Fix - /* - NSManagedObject *bookmarkToDelete = [[bookmarksController bookmarks] objectAtIndex:[indexPath row]]; - [[bookmarksController bookmarks] removeObject:bookmarkToDelete]; - [self deleteItemFromDB:bookmarkToDelete]; - [[bookmarksController managedObjectContext] save:nil]; - */ [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:YES]; [tableView reloadData]; } @@ -118,25 +111,4 @@ -(void)deleteFromBookmarks:(NSInteger)index { [bookmarksController reloadData]; } -//Core Data Fix -/* -- (void) deleteItemFromDB:(NSManagedObject *) dbItem { - if ([[[dbItem entity] name] isEqualToString:@"Folder"]) { - NSFetchRequest *request = [[NSFetchRequest alloc] init]; - NSEntityDescription *folderEntity = [NSEntityDescription entityForName:@"Folder" inManagedObjectContext:[bookmarksController managedObjectContext]]; - NSPredicate *predicateF = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Parent.name == '%@'", [dbItem valueForKey:@"name"]]]; - [request setEntity:folderEntity]; - [request setPredicate:predicateF]; - for (id child in [[bookmarksController managedObjectContext] executeFetchRequest:request error:nil]) { - [self deleteItemFromDB:child]; - } - - } - [[bookmarksController managedObjectContext] deleteObject:dbItem]; -} -*/ - - - - @end diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index 0f1d5af..79296f6 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -11,9 +11,6 @@ #define BOOKMARKS_ROOT -1 #define MAX_BOOKMARKS 1000 -//Core Data Fix -//#import - @class BookmarksFormController; @class BookmarkFolderFormController; @class BrowserViewController; @@ -23,10 +20,7 @@ BrowserViewController *browserController; BookmarksFormController *formController; BookmarkFolderFormController *folderController; - - //Core Data Fix - //NSManagedObjectContext *managedObjectContext; - //NSManagedObject *currentFolder; + char mode; NSInteger folderIndex; NSInteger bookmarkIndex; @@ -46,10 +40,6 @@ @property(nonatomic, strong) BookmarksFormController *formController; @property(nonatomic, strong) BookmarkFolderFormController *folderController; -//Core Data Fix -//@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; -//@property(nonatomic, strong) NSManagedObject *currentFolder; - @property(nonatomic, assign) char mode; @property(nonatomic, assign) NSInteger folderIndex; @property(nonatomic, assign) NSInteger bookmarkIndex; diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 0c6fd06..96ebdb0 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -83,14 +83,11 @@ -(void) viewWillAppear:(BOOL)animated { folderImage = [UIImage imageNamed:@"folder.png"]; bookmarkImage = [UIImage imageNamed:@"bookmark.png"]; } - //Core Data Fix - //if (mode == 'P') { if (mode == 'P') { ((UIBarItem *)[[toolbar items] objectAtIndex:0]).enabled = NO; } else { ((UIBarItem *)[[toolbar items] objectAtIndex:0]).enabled = YES; } - //Core Data Fix [self reloadData]; [tableView reloadData]; [super viewWillAppear:animated]; @@ -111,7 +108,6 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { } -(void)reloadData { - //Core Data Fix //Get the array of folder dictionaries from NSUSerDefaults NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; @@ -253,29 +249,6 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa } else { [cell disableEdit]; } - - - //Core Data Fix - /* - NSManagedObject *item= [bookmarks objectAtIndex:[indexPath row]]; - if (![item isEqual:@"Bookmarks"] && [[[item entity] name] isEqualToString:@"Bookmark"]) { - cell.cellImage.image = bookmarkImage; - } else { - cell.cellImage.image = folderImage; - } - if ([item isEqual:@"Bookmarks"]) { - [cell.cellLabel setText:@"Bookmarks"]; - } else { - [cell.cellLabel setText:[item valueForKey:@"name"]]; - } - - if (self.mode == 'E') { - [cell enableEdit]; - } else if (self.mode == 'V') { - [cell disableEdit]; - } - */ - return cell; } @@ -341,10 +314,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath //Open the URL from the bookmark in the folder [self openBookmark:indexPath]; - } - //Core Data Fix - //NSManagedObject *item = [bookmarks objectAtIndex:[indexPath row]]; - else if (mode == 'V') { + } else if (mode == 'V') { //Create a new bookmark controller, set the mode, and folder index BookmarksController *nextBookmarkController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; [nextBookmarkController setMode:'B']; @@ -353,8 +323,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [nextBookmarkController setFolderController:[self folderController]]; [self.navigationController pushViewController:nextBookmarkController animated:YES]; - } - else if (mode == 'E') { + } else if (mode == 'E') { [self reloadData]; @@ -370,18 +339,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [self setBookmarkIndex:[indexPath row]]; [self.navigationController pushViewController:formController animated:YES]; } - - //Core Data Fix - /* - if ([[[item entity] name] isEqualToString:@"Folder"]) { - [folderController setMode:'E']; - [folderController setFolder:item]; - [self.navigationController pushViewController:(UIViewController *)folderController animated:YES]; - } else { - [formController setMode:'E']; - [self.navigationController pushViewController:formController animated:YES]; - } - */ } else if (self.mode == 'P') { NSArray *vControllers = self.navigationController.viewControllers; @@ -389,15 +346,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [self.navigationController popViewControllerAnimated:YES]; } - - //Core Data Fix - /*else if (mode == 'P') { - NSArray *vControllers = self.navigationController.viewControllers; - [[vControllers objectAtIndex:([vControllers count] - 2) ] setSelectedFolder:item]; - [self.navigationController popViewControllerAnimated:YES]; - - }*/ - } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { diff --git a/Browser/BookmarksFormController.h b/Browser/BookmarksFormController.h index 434e6c1..185ecb6 100644 --- a/Browser/BookmarksFormController.h +++ b/Browser/BookmarksFormController.h @@ -6,8 +6,6 @@ // #import -//Core Data Fix -//#import @interface BookmarksFormController : UIViewController { IBOutlet UIButton *parentField; @@ -16,15 +14,8 @@ IBOutlet UILabel *arrowLabel; UIBarButtonItem *cancelButton; UIBarButtonItem *doneButton; - - //Core Data Fix - //NSManagedObject *selectedFolder; - //NSManagedObjectContext *managedObjectContext; - NSString *defaultUrlFieldText; - char mode; - } @property(nonatomic, strong) UIButton *parentField; @property(nonatomic, strong) UITextField *nameField; @@ -32,13 +23,7 @@ @property(nonatomic, strong) IBOutlet UILabel *arrowLabel; @property(nonatomic, strong) UIBarButtonItem *cancelButton; @property(nonatomic, strong) UIBarButtonItem *doneButton; - -//Core Data Fix -//@property(nonatomic, strong) NSManagedObject *selectedFolder; -//@property(nonatomic, strong) NSManagedObjectContext *managedObjectContext; - @property(nonatomic,strong) NSString *defaultUrlFieldText; - @property(nonatomic, assign) char mode; From a1d4fc7b9f3ce6bf4ceac6fe657b6321fcf1a064 Mon Sep 17 00:00:00 2001 From: Obi Date: Fri, 25 Jul 2014 15:41:03 -0700 Subject: [PATCH 20/60] Fixed bug causing bookmarks deletion to crash. --- Browser/BookmarksController.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 96ebdb0..69b4cf6 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -148,7 +148,10 @@ -(IBAction) enableEditMode:(id)sender { } -(IBAction) finishEditMode:(id)sender{ - self.mode = 'V'; + if(self.folderIndex == BOOKMARKS_ROOT) + self.mode = 'V'; + else + self.mode = 'B'; toolbar.hidden = NO; editToolbar.hidden = YES; From 391075ae71c15180fa14271d04dd8f6bb40e832c Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Fri, 25 Jul 2014 18:18:04 -0700 Subject: [PATCH 21/60] Resolves issue where deleting multiple tabs while loading a page in one of them would cause a crash. --- Browser/Tab.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Browser/Tab.m b/Browser/Tab.m index 817e2a8..ddd2894 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -655,5 +655,11 @@ -(void) updateHistory { _traverse = 0; } +- (void)dealloc { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + @end From 98ef04df6b63b2da852fa702f94390a8e730f556 Mon Sep 17 00:00:00 2001 From: Obi Date: Mon, 28 Jul 2014 13:14:47 -0700 Subject: [PATCH 22/60] Now hiding action sheet popup when showing if bookmarks button is tapped. --- Browser/BrowserViewController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 0234b38..72afe2b 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -623,6 +623,7 @@ -(IBAction) showBookmarks:(id)sender { -(void) showBookmarksView:(id)sender { LogTrace(@"%s", __PRETTY_FUNCTION__); + [self dismissPopups]; [self.view bringSubviewToFront:self.bookmarksNavController.view]; //Reload all bC controllers on the navigation stack for (BookmarksController* bC in self.bookmarksNavController.viewControllers) From 1024e3575ddd19d33737fd0ab01aa9ce08d76277 Mon Sep 17 00:00:00 2001 From: Obi Date: Mon, 28 Jul 2014 13:29:14 -0700 Subject: [PATCH 23/60] Fixed bug - editing bookmark allows adding folder which may crash app. --- Browser/BookmarksController.m | 25 ++++++++++++++++++++++++- Browser/BookmarksFormController.m | 12 ++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 69b4cf6..1cc54db 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -140,6 +140,28 @@ -(void) openBookmark:(NSIndexPath *) indexPath{ } -(IBAction) enableEditMode:(id)sender { + if(self.mode == 'B') + { + for (UIBarButtonItem *item in editToolbar.items) + { + if([[item title] isEqualToString:@"New Folder"]) + { + [item setEnabled:NO]; + [item setTintColor:[UIColor clearColor]]; + } + } + } + else + { + for (UIBarButtonItem *item in editToolbar.items) + { + if([[item title] isEqualToString:@"New Folder"]) + { + [item setEnabled:YES]; + [item setTintColor:nil]; + } + } + } self.mode = 'E'; toolbar.hidden = YES; editToolbar.hidden = NO; @@ -148,7 +170,7 @@ -(IBAction) enableEditMode:(id)sender { } -(IBAction) finishEditMode:(id)sender{ - if(self.folderIndex == BOOKMARKS_ROOT) + if(self.folderIndex == BOOKMARKS_ROOT || self.mode == 'V') self.mode = 'V'; else self.mode = 'B'; @@ -334,6 +356,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath { self.folderIndex = [indexPath row]; [folderController setMode:'E']; + [self setMode:'V']; [self.navigationController pushViewController:(UIViewController *)folderController animated:YES]; } else diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index 473c8e2..a49d967 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -203,7 +203,7 @@ - (IBAction) saveBookmark:(id)sender { //Save the bookmark into the correct folder [defaults setObject:foldersArray forKey:FOLDERS_KEY]; [defaults synchronize]; - [bookmarksController setMode:'B']; + //Reload all bC controllers on the navigation stack for (BookmarksController* bC in self.navigationController.viewControllers) { @@ -213,12 +213,16 @@ - (IBAction) saveBookmark:(id)sender { [bC.tableView reloadData]; } } - if(self.mode != 'E') + + if(self.mode == 'A') { [bookmarksController switchToBrowser:sender]; } - [bookmarksController.browserController dismissPopups]; - [self.navigationController popViewControllerAnimated:YES]; + else + { + self.mode = 'B'; + [self.navigationController popViewControllerAnimated:YES]; + } } From 13e04a3e5447627ea93194acffee598bb1acd09b Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Mon, 28 Jul 2014 14:16:13 -0700 Subject: [PATCH 24/60] Specified tab width via macro, now adjusting tab width is merely a kTabWidth value change. --- Browser/BrowserViewController.m | 6 +++--- Browser/Tab.h | 2 ++ Browser/Tab.m | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 72afe2b..f8949fb 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -805,7 +805,7 @@ -(void) addTabWithAddress:(NSString *)urlAddress { [self stopLoading:sender]; }*/ - Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake((100.0 * [_tabs count]) + 2.0, 2.0, 100.0, 34.0) addTarget: self]; + Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake((kTabWidth * [_tabs count]) + 2.0, 2.0, kTabWidth, 34.0) addTarget: self]; [self switchTabFrom:_selectedTab ToTab:nTab]; [_tabsView addSubview:_selectedTab]; @@ -814,7 +814,7 @@ -(void) addTabWithAddress:(NSString *)urlAddress { [_selectedTab select]; //scrolling - _tabsView.contentSize = CGSizeMake(((100.0) * [_tabs count]) + 5.0, 23.0); + _tabsView.contentSize = CGSizeMake((kTabWidth * [_tabs count]) + 5.0, 23.0); if (_tabsView.frame.size.width < _tabsView.contentSize.width) { _tabsView.contentOffset = CGPointMake(_tabsView.contentSize.width - _tabsView.frame.size.width,0); } @@ -878,7 +878,7 @@ -(IBAction) removeTab:(id)sender { [self loadTabs:[_selectedTab webView]]; //scrolling - _tabsView.contentSize = CGSizeMake(((100.0) * [_tabs count]) + 40.0, 23.0); + _tabsView.contentSize = CGSizeMake((kTabWidth * [_tabs count]) + 40.0, 23.0); } -(IBAction) selectTab:(id)sender { diff --git a/Browser/Tab.h b/Browser/Tab.h index aec0c84..2443242 100644 --- a/Browser/Tab.h +++ b/Browser/Tab.h @@ -8,6 +8,8 @@ #import #import +#define kTabWidth 100.0 + @class BrowserViewController, FilterManager; @interface Tab : UIView diff --git a/Browser/Tab.m b/Browser/Tab.m index ddd2894..43405b7 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -52,7 +52,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _tabButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; _tabButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - _tabButton.frame = CGRectMake(0.0, 0.0, 100.0, 26.0); + _tabButton.frame = CGRectMake(0.0, 0.0, kTabWidth, 26.0); _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; _activityIndicator.frame = CGRectMake(5, 2, 20, 20); @@ -63,7 +63,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { [_closeButton setTitle:@"x" forState:UIControlStateNormal]; [_closeButton setAccessibilityLabel:@"close tab"]; [_closeButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; - _closeButton.frame = CGRectMake(79.0, -1.0, 25.0, 25.0); + _closeButton.frame = CGRectMake(kTabWidth - 21.0, -1.0, 25.0, 25.0); _closeButton.titleLabel.font = [UIFont systemFontOfSize:18]; _tabTitleFrame = CGRectMake(3, 0, 80, 22); @@ -222,7 +222,7 @@ -(void) deselect { -(void) incrementOffset { LogTrace(@"%s", __PRETTY_FUNCTION__); - self.frame = CGRectOffset(self.frame, -100.0, 0.0); + self.frame = CGRectOffset(self.frame, -kTabWidth, 0.0); } -(void) hideText { From 154cda2519f6286ab4f6a2fdd6095bca0d78c364 Mon Sep 17 00:00:00 2001 From: Obi Date: Mon, 28 Jul 2014 15:27:20 -0700 Subject: [PATCH 25/60] Strange bug commit. --- Browser/BookmarkFolderFormController.m | 2 +- Browser/BookmarkItem.m | 2 +- Browser/BookmarksController.h | 5 +++-- Browser/BookmarksController.m | 28 ++++++++++++++++++++------ Browser/BookmarksFormController.m | 4 ++-- Browser/BrowserViewController.m | 2 +- 6 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index 4b4ba58..b4d0219 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -74,7 +74,7 @@ - (IBAction)saveFolder:(id)sender { { if([bC isKindOfClass:[BookmarksController class]]) { - [bC reloadData]; + [bC loadBookmarks]; [bC.tableView reloadData]; } } diff --git a/Browser/BookmarkItem.m b/Browser/BookmarkItem.m index 02b64c8..b98db91 100644 --- a/Browser/BookmarkItem.m +++ b/Browser/BookmarkItem.m @@ -108,7 +108,7 @@ -(void)deleteFromBookmarks:(NSInteger)index { [defaults setObject:bookmarksController.folders forKey:FOLDERS_KEY]; [defaults synchronize]; - [bookmarksController reloadData]; + [bookmarksController loadBookmarks]; } @end diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index 79296f6..dd51d8d 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -16,7 +16,7 @@ @class BrowserViewController; @class BookmarkItem; -@interface BookmarksController : UIViewController { +@interface BookmarksController : UIViewController { BrowserViewController *browserController; BookmarksFormController *formController; BookmarkFolderFormController *folderController; @@ -59,7 +59,8 @@ -(IBAction) finishEditMode:(id)sender; -(IBAction) addFolder:(id)sender; --(void)reloadData; +-(void) reloadBookmarksData; +-(void) loadBookmarks; -(void) openBookmark:(NSIndexPath *) indexPath; @end diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 1cc54db..7266251 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -25,7 +25,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil if (self) { // Custom initialization. self.folderIndex = BOOKMARKS_ROOT; - [self reloadData]; + [self loadBookmarks]; } return self; } @@ -75,6 +75,7 @@ - (void)viewDidLoad { -(void) viewDidAppear:(BOOL)animated { [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated]; + [self.tableView reloadData]; } -(void) viewWillAppear:(BOOL)animated { @@ -88,8 +89,8 @@ -(void) viewWillAppear:(BOOL)animated { } else { ((UIBarItem *)[[toolbar items] objectAtIndex:0]).enabled = YES; } - [self reloadData]; - [tableView reloadData]; + [self loadBookmarks]; + [self.tableView reloadData]; [super viewWillAppear:animated]; } @@ -107,7 +108,22 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } --(void)reloadData { +-(void)reloadBookmarksData { + //Get the array of folder dictionaries from NSUSerDefaults + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; + self.folders = [foldersArray mutableCopy]; + //If this isn't a folder array, it must be a bookmark array, so return the bookmark array. + if (self.folderIndex != BOOKMARKS_ROOT) { + NSMutableDictionary* folderDict = [foldersArray objectAtIndex:self.folderIndex]; + self.bookmarks = [[folderDict objectForKey:@"bookmarks"] mutableCopy]; + } + else { + self.bookmarks = nil; + } +} + +- (void) loadBookmarks { //Get the array of folder dictionaries from NSUSerDefaults NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; @@ -200,7 +216,7 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - [self reloadData]; + [self loadBookmarks]; if(self.bookmarks != nil && self.folderIndex != BOOKMARKS_ROOT) return [bookmarks count]; else @@ -350,7 +366,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } else if (mode == 'E') { - [self reloadData]; + [self loadBookmarks]; if (self.folderIndex == BOOKMARKS_ROOT) { diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index a49d967..82ed654 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -50,7 +50,7 @@ - (void) viewWillAppear:(BOOL)animated { [self.navigationItem setLeftBarButtonItem:nil]; // load name and url - [bookmarksController reloadData]; + [bookmarksController loadBookmarks]; [urlField setText:[[bookmarksController.bookmarks objectAtIndex:bookmarksController.bookmarkIndex] valueForKey:@"URL"]]; [nameField setText:[[bookmarksController.bookmarks objectAtIndex:bookmarksController.bookmarkIndex] valueForKey:@"title"]]; [parentField setHidden:YES]; @@ -209,7 +209,7 @@ - (IBAction) saveBookmark:(id)sender { { if([bC isKindOfClass:[BookmarksController class]]) { - [bC reloadData]; + [bC loadBookmarks]; [bC.tableView reloadData]; } } diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 72afe2b..f206d2e 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -630,7 +630,7 @@ -(void) showBookmarksView:(id)sender { { if([bC isKindOfClass:[BookmarksController class]]) { - [bC reloadData]; + [bC loadBookmarks]; [bC.tableView reloadData]; } } From 25a23bedb8238d5ca9d63f8c5d733c1810a1e058 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Mon, 28 Jul 2014 16:06:37 -0700 Subject: [PATCH 26/60] Added trace logs to BookmarksController. Some code cleanup. --- Browser/BookmarksController.h | 4 +-- Browser/BookmarksController.m | 50 +++++++++++++++++++++++++++------ Browser/BrowserViewController.m | 6 +++- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index dd51d8d..9d1618b 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -28,8 +28,6 @@ NSMutableArray *bookmarks; NSMutableArray *folders; - IBOutlet UITableView *tableView; - UIImage *bookmarkImage; UIImage *folderImage; IBOutlet UIToolbar *toolbar; @@ -47,7 +45,7 @@ @property(nonatomic, strong) NSMutableArray *bookmarks; @property(nonatomic, strong) NSMutableArray *folders; -@property(nonatomic, strong) UITableView *tableView; +@property(nonatomic, strong) IBOutlet UITableView *tableView; @property(nonatomic, strong) UIImage *bookmarkImage; @property(nonatomic, strong) UIImage *folderImage; diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 7266251..4794357 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -16,11 +16,13 @@ @implementation BookmarksController @synthesize browserController, formController, folderController; @synthesize mode, bookmarks, folders, folderImage, bookmarkImage; -@synthesize toolbar, editToolbar, tableView, folderIndex, bookmarkIndex; +@synthesize toolbar, editToolbar, folderIndex, bookmarkIndex; // The designated initializer. Override if you create the controller programmatically // and want to perform customization that is not appropriate for viewDidLoad. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + LogTrace(@"%s", __PRETTY_FUNCTION__); + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. @@ -31,6 +33,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil } - (void)viewDidLoad { + LogTrace(@"%s", __PRETTY_FUNCTION__); //Load the Folders dictionary from the key in user defaults storage. NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; @@ -74,11 +77,16 @@ - (void)viewDidLoad { } -(void) viewDidAppear:(BOOL)animated { - [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated]; + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [_tableView deselectRowAtIndexPath:[_tableView indexPathForSelectedRow] animated:animated]; [self.tableView reloadData]; } -(void) viewWillAppear:(BOOL)animated { + LogTrace(@"%s", __PRETTY_FUNCTION__); + + [super viewWillAppear:animated]; // load bookmark related images if (folderImage == nil || bookmarkImage == nil) { folderImage = [UIImage imageNamed:@"folder.png"]; @@ -91,7 +99,6 @@ -(void) viewWillAppear:(BOOL)animated { } [self loadBookmarks]; [self.tableView reloadData]; - [super viewWillAppear:animated]; } @@ -109,6 +116,8 @@ - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { } -(void)reloadBookmarksData { + LogTrace(@"%s", __PRETTY_FUNCTION__); + //Get the array of folder dictionaries from NSUSerDefaults NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; @@ -124,6 +133,8 @@ -(void)reloadBookmarksData { } - (void) loadBookmarks { + LogTrace(@"%s", __PRETTY_FUNCTION__); + //Get the array of folder dictionaries from NSUSerDefaults NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* foldersArray = (NSMutableArray*)[defaults objectForKey:FOLDERS_KEY]; @@ -139,6 +150,8 @@ - (void) loadBookmarks { } - (IBAction)switchToBrowser:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if (mode == 'E') { [self finishEditMode:sender]; } @@ -149,13 +162,17 @@ - (IBAction)switchToBrowser:(id)sender { }]; } --(void) openBookmark:(NSIndexPath *) indexPath{ +-(void) openBookmark:(NSIndexPath *) indexPath{ + LogTrace(@"%s", __PRETTY_FUNCTION__); + [[browserController addressBar] setText:[[bookmarks objectAtIndex:[indexPath row]] valueForKey:@"URL"]]; [browserController gotoAddress:nil]; [self switchToBrowser:nil]; } -(IBAction) enableEditMode:(id)sender { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if(self.mode == 'B') { for (UIBarButtonItem *item in editToolbar.items) @@ -182,10 +199,12 @@ -(IBAction) enableEditMode:(id)sender { toolbar.hidden = YES; editToolbar.hidden = NO; [self.navigationItem setRightBarButtonItem:nil]; - [tableView reloadData]; + [_tableView reloadData]; } -(IBAction) finishEditMode:(id)sender{ + LogTrace(@"%s", __PRETTY_FUNCTION__); + if(self.folderIndex == BOOKMARKS_ROOT || self.mode == 'V') self.mode = 'V'; else @@ -199,9 +218,12 @@ -(IBAction) finishEditMode:(id)sender{ action:@selector(switchToBrowser:)]; [self.navigationItem setRightBarButtonItem:doneButton]; - [tableView reloadData]; + [_tableView reloadData]; } --(IBAction) addFolder:(id)sender{ + +- (IBAction) addFolder:(id)sender{ + LogTrace(@"%s", __PRETTY_FUNCTION__); + [folderController setMode:'A']; [folderController setBookmarksController:self]; [self.navigationController pushViewController:(UIViewController *)folderController animated:YES]; @@ -211,11 +233,15 @@ -(IBAction) addFolder:(id)sender{ #pragma mark Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [self loadBookmarks]; if(self.bookmarks != nil && self.folderIndex != BOOKMARKS_ROOT) return [bookmarks count]; @@ -226,6 +252,7 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + LogTrace(@"%s", __PRETTY_FUNCTION__); static NSString *CellIdentifier = @"BookmarkItem"; @@ -294,6 +321,7 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa } -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { + LogTrace(@"%s", __PRETTY_FUNCTION__); ((BookmarkItem *)cell).cellLabel.font = [UIFont italicSystemFontOfSize:17.0]; @@ -344,7 +372,7 @@ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *) #pragma mark Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - + LogTrace(@"%s", __PRETTY_FUNCTION__); if (mode == 'B') { //Get the folder Dictionary @@ -391,11 +419,15 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + LogTrace(@"%s", __PRETTY_FUNCTION__); + if ([tableView numberOfRowsInSection:0] < 2 && folderIndex == BOOKMARKS_ROOT) return NO; return YES; } - (void)didReceiveMemoryWarning { + LogTrace(@"%s", __PRETTY_FUNCTION__); + // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; @@ -403,6 +435,8 @@ - (void)didReceiveMemoryWarning { } - (void)viewDidUnload { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index f206d2e..abd6df4 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -83,7 +83,9 @@ - (void)viewDidLoad [self registerForBrowserNotifications]; } --(UINavigationController*)createBookmarksController:(BOOL)isMainController { +- (UINavigationController *)createBookmarksController:(BOOL)isMainController { + LogTrace(@"%s", __PRETTY_FUNCTION__); + BookmarksFormController *bookmarksFormController = [[BookmarksFormController alloc] initWithNibName:@"BookmarksForm" bundle:[NSBundle mainBundle]]; @@ -778,6 +780,8 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { } -(void) dismissPopups { + LogTrace(@"%s", __PRETTY_FUNCTION__); + [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:NO]; [_padPopover dismissPopoverAnimated:NO]; } From efa15c2c490bf1dcd8b8b77e5626e8c549cec698 Mon Sep 17 00:00:00 2001 From: Obi Date: Mon, 28 Jul 2014 16:25:07 -0700 Subject: [PATCH 27/60] Fixed bug - in bookmarks mode editing folder name, then going back to folder list causes empty table. --- Browser/BookmarkFolderFormController.h | 4 ++++ Browser/BookmarkFolderFormController.m | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Browser/BookmarkFolderFormController.h b/Browser/BookmarkFolderFormController.h index fa29fdc..d7873d1 100644 --- a/Browser/BookmarkFolderFormController.h +++ b/Browser/BookmarkFolderFormController.h @@ -13,6 +13,8 @@ BookmarksController *bookmarksController; IBOutlet UITextField *nameField; + + NSInteger folderIndex; char mode; } @@ -20,6 +22,8 @@ @property(nonatomic,strong) UITextField *nameField; +@property(nonatomic,assign) NSInteger folderIndex; + @property(nonatomic,assign) char mode; -(IBAction) saveFolder:(id)sender; diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index b4d0219..b753eb8 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -11,7 +11,7 @@ @implementation BookmarkFolderFormController -@synthesize nameField, mode, bookmarksController; +@synthesize nameField, folderIndex, mode, bookmarksController; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { @@ -30,12 +30,18 @@ - (void)viewDidLoad { } - (void)viewWillAppear:(BOOL)animated { + //Set the folder index to the bookmarkcontroller folder index + self.folderIndex = bookmarksController.folderIndex; + //Reset the folder index back to the bookmarks root, since we're navigating back to the folder root + bookmarksController.folderIndex = BOOKMARKS_ROOT; + //Disable edit mode in the bookmarks controller + [bookmarksController finishEditMode:self]; if (mode == 'A') { self.navigationItem.title = @"New Bookmark Folder"; [nameField setText:@""]; } else if (mode == 'E') { self.navigationItem.title = @"Edit Bookmark Folder"; - NSDictionary* folderDict = (NSDictionary*)[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex]; + NSDictionary* folderDict = (NSDictionary*)[bookmarksController.folders objectAtIndex:self.folderIndex]; NSString* folderTitle = (NSString*)[folderDict objectForKey:@"title"]; [nameField setText:folderTitle]; } @@ -59,9 +65,9 @@ - (IBAction)saveFolder:(id)sender { folderDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:nameField.text,@"title",bookmarksArray,@"bookmarks", nil]; [foldersArray addObject:folderDict]; } else if (mode == 'E') { - folderDict = (NSMutableDictionary*)[[bookmarksController.folders objectAtIndex:bookmarksController.folderIndex] mutableCopy]; + folderDict = (NSMutableDictionary*)[[bookmarksController.folders objectAtIndex:self.folderIndex] mutableCopy]; [folderDict setObject:nameField.text forKey:@"title"]; - [foldersArray setObject:folderDict atIndexedSubscript:bookmarksController.folderIndex]; + [foldersArray setObject:folderDict atIndexedSubscript:self.folderIndex]; } [defaults setObject:foldersArray forKey:FOLDERS_KEY]; From b5ca1b1e697d8bce4b041f8d52a63c6855b79271 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Tue, 29 Jul 2014 02:26:19 -0700 Subject: [PATCH 28/60] Animate the adding of tabs by sliding them in from the right. Works for portrait oriented iPad. --- Browser/BrowserViewController.m | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 8aedd1f..cb11c60 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -809,13 +809,29 @@ -(void) addTabWithAddress:(NSString *)urlAddress { [self stopLoading:sender]; }*/ - Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake((kTabWidth * [_tabs count]) + 2.0, 2.0, kTabWidth, 34.0) addTarget: self]; + Tab *rightMostTab = [_tabs lastObject]; + CGFloat rightMostTabEdge = (rightMostTab) ? rightMostTab.frame.origin.x + rightMostTab.frame.size.width : 0; + CGFloat initialX = (rightMostTabEdge >= 768) ? rightMostTabEdge + rightMostTab.frame.size.width : 768; + Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake(initialX, 2.0, kTabWidth, 34.0) + addTarget: self]; - [self switchTabFrom:_selectedTab ToTab:nTab]; + [self switchTabFrom:_selectedTab ToTab:nTab]; [_tabsView addSubview:_selectedTab]; [_tabs addObject:_selectedTab]; [_selectedTab select]; + + [UIView animateWithDuration:0.35 animations:^{ + CGRect newFrame = nTab.frame; + newFrame.origin.x = (kTabWidth * ([_tabs count] - 1)) + 2.0; + nTab.frame = newFrame; + } completion:^(BOOL finished) { + if (!finished) { + CGRect newFrame = nTab.frame; + newFrame.origin.x = (kTabWidth * ([_tabs count] - 1)) + 2.0; + nTab.frame = newFrame; + } + }]; //scrolling _tabsView.contentSize = CGSizeMake((kTabWidth * [_tabs count]) + 5.0, 23.0); From f22c8c99c986a1a3c3109943a7587564881cf626 Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Tue, 29 Jul 2014 13:50:56 -0700 Subject: [PATCH 29/60] Add tab animation will now work for any device form factor and orientation. --- Browser/BrowserViewController.h | 3 +++ Browser/BrowserViewController.m | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 8a4e50a..7076c0b 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -12,6 +12,9 @@ #define kStartedLoadingNotification @"kStartedLoadingNotification" #define kFinishedLoadingNotification @"kFinishedLoadingNotification" +//reference: http://stackoverflow.com/a/18085584/347339 +#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size + @class Tab, BookmarksController, BookmarksFormController, Reachability; @interface BrowserViewController : UIViewController diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index cb11c60..6269ad3 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -811,7 +811,8 @@ -(void) addTabWithAddress:(NSString *)urlAddress { Tab *rightMostTab = [_tabs lastObject]; CGFloat rightMostTabEdge = (rightMostTab) ? rightMostTab.frame.origin.x + rightMostTab.frame.size.width : 0; - CGFloat initialX = (rightMostTabEdge >= 768) ? rightMostTabEdge + rightMostTab.frame.size.width : 768; + CGFloat tabWidth = rightMostTab.frame.size.width; + CGFloat initialX = (rightMostTabEdge < DEVICE_SIZE.width) ? DEVICE_SIZE.width + tabWidth : rightMostTabEdge + tabWidth; Tab *nTab = [[Tab alloc] initWithFrame:CGRectMake(initialX, 2.0, kTabWidth, 34.0) addTarget: self]; From c6e99863899dd40d65d4ebbbe0295f696daffb1c Mon Sep 17 00:00:00 2001 From: Obi Date: Tue, 29 Jul 2014 14:35:16 -0700 Subject: [PATCH 30/60] Fixed bug - Floating Delete Button in Bookmarks. --- Browser/BookmarkItem.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Browser/BookmarkItem.m b/Browser/BookmarkItem.m index b98db91..72ff33d 100644 --- a/Browser/BookmarkItem.m +++ b/Browser/BookmarkItem.m @@ -111,4 +111,14 @@ -(void)deleteFromBookmarks:(NSInteger)index { [bookmarksController loadBookmarks]; } +- (void)layoutSubviews +{ + [super layoutSubviews]; + + [self.deleteConfirmation setFrame:CGRectMake(self.tableView.frame.size.width - self.deleteConfirmation.frame.size.width, + self.deleteConfirmation.frame.origin.y, + self.deleteConfirmation.frame.size.width, + self.deleteConfirmation.frame.size.height)]; +} + @end From 9d9e5085537854349229776d310b4298832bced8 Mon Sep 17 00:00:00 2001 From: Obi Date: Tue, 29 Jul 2014 15:02:16 -0700 Subject: [PATCH 31/60] Fixed display of add bookmarks popup for iPhones. --- Browser/BrowserViewController.m | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 8aedd1f..987404c 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -771,19 +771,22 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } else { - [UIView transitionFromView:self.view - toView:[bookmarksController view] - duration:0.5 - options:(UIViewAnimationOptionTransitionCrossDissolve) - completion:^(BOOL finished) {}]; + [self presentViewController:bookmarksNavController animated:YES completion:nil]; } } -(void) dismissPopups { LogTrace(@"%s", __PRETTY_FUNCTION__); - [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:NO]; - [_padPopover dismissPopoverAnimated:NO]; + if([self isPad]) + { + [_popupQuery dismissWithClickedButtonIndex:_popupQuery.cancelButtonIndex animated:NO]; + [_padPopover dismissPopoverAnimated:NO]; + } + else + { + [self dismissViewControllerAnimated:YES completion:nil]; + } } // TABS From 29c76ef8dcb18ed99e46c6fd2865e0439d83a46b Mon Sep 17 00:00:00 2001 From: Obi Date: Tue, 29 Jul 2014 15:04:52 -0700 Subject: [PATCH 32/60] Removing unused variables. --- Browser/BookmarkFolderFormController.m | 1 - Browser/BookmarksController.m | 6 ------ Browser/BrowserViewController.m | 1 - 3 files changed, 8 deletions(-) diff --git a/Browser/BookmarkFolderFormController.m b/Browser/BookmarkFolderFormController.m index b753eb8..b42fce8 100644 --- a/Browser/BookmarkFolderFormController.m +++ b/Browser/BookmarkFolderFormController.m @@ -51,7 +51,6 @@ - (IBAction)saveFolder:(id)sender { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray* foldersArray = (NSMutableArray*)[[defaults objectForKey:FOLDERS_KEY] mutableCopy]; - NSArray *controllers = [self.navigationController viewControllers]; NSMutableDictionary* folderDict = nil; if([[nameField.text stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]] length] == 0) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index 4794357..b0729ce 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -375,14 +375,8 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath LogTrace(@"%s", __PRETTY_FUNCTION__); if (mode == 'B') { - //Get the folder Dictionary - NSDictionary* folderDict = [self.folders objectAtIndex:folderIndex]; - NSArray* bookmarksArray = [folderDict objectForKey:@"bookmarks"]; - //Get the bookmark Dictionary - NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; //Open the URL from the bookmark in the folder [self openBookmark:indexPath]; - } else if (mode == 'V') { //Create a new bookmark controller, set the mode, and folder index BookmarksController *nextBookmarkController = [[BookmarksController alloc] initWithNibName:@"Bookmarks" bundle:[NSBundle mainBundle]]; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 987404c..0556179 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -753,7 +753,6 @@ -(void) addBookmarkFromSheet:(UIActionSheet *) sheet { // Set up bookmark controllers UINavigationController *bookmarksNavController = [self createBookmarksController:NO]; - BookmarksController* bookmarksController = (BookmarksController*)[[bookmarksNavController viewControllers] objectAtIndex:0]; BookmarksFormController* bookmarksFormController = (BookmarksFormController*)[[bookmarksNavController viewControllers] objectAtIndex:1]; [bookmarksFormController setMode:'A']; [[bookmarksFormController navigationItem] setHidesBackButton:YES animated:NO]; From 7510ed5bbb44739db1e749df12e555218a6940c0 Mon Sep 17 00:00:00 2001 From: Obi Date: Tue, 29 Jul 2014 16:07:07 -0700 Subject: [PATCH 33/60] Changed all the XIB files to iOS 6.1 and earlier to support iOS 6.1. --- Browser Resources/BookmarkFoldersForm.xib | 10 +- Browser Resources/BookmarkItem.xib | 4 +- Browser Resources/Bookmarks.xib | 754 ++-------------------- Browser Resources/BookmarksForm.xib | 4 +- Browser Resources/MainWindow-iPad.xib | 4 +- Browser Resources/MainWindow.xib | 10 +- 6 files changed, 79 insertions(+), 707 deletions(-) diff --git a/Browser Resources/BookmarkFoldersForm.xib b/Browser Resources/BookmarkFoldersForm.xib index 1d22bf4..710345f 100644 --- a/Browser Resources/BookmarkFoldersForm.xib +++ b/Browser Resources/BookmarkFoldersForm.xib @@ -1,8 +1,8 @@ - + - - + + @@ -13,7 +13,7 @@ - + @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/Browser Resources/BookmarkItem.xib b/Browser Resources/BookmarkItem.xib index 21cafda..4c4a92f 100644 --- a/Browser Resources/BookmarkItem.xib +++ b/Browser Resources/BookmarkItem.xib @@ -1,7 +1,7 @@ - + - + diff --git a/Browser Resources/Bookmarks.xib b/Browser Resources/Bookmarks.xib index 06cd48a..27ee343 100644 --- a/Browser Resources/Bookmarks.xib +++ b/Browser Resources/Bookmarks.xib @@ -1,691 +1,63 @@ - - - - 1056 - 10K549 - 851 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 274 - {320, 417} - - - 3 - MQA - - YES - IBCocoaTouchFramework - YES - 1 - 0 - YES - 44 - 22 - 22 - - - - 266 - {{0, 416}, {320, 44}} - - NO - NO - IBCocoaTouchFramework - - YES - - Edit - IBCocoaTouchFramework - 1 - - - - - - - -2147483382 - {{0, 416}, {320, 44}} - - NO - NO - IBCocoaTouchFramework - - YES - - IBCocoaTouchFramework - 1 - - 0 - - - IBCocoaTouchFramework - 163 - - 6 - - - New Folder - IBCocoaTouchFramework - 1 - - - - - - {320, 460} - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - dataSource - - - - 9 - - - - delegate - - - - 10 - - - - toolbar - - - - 35 - - - - editToolbar - - - - 36 - - - - enableEditMode: - - - - 37 - - - - tableView - - - - 38 - - - - finishEditMode: - - - - 39 - - - - addFolder: - - - - 40 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - YES - - - - - 7 - - - YES - - - - - - 8 - - - - - 32 - - - YES - - - - - - EditToolbar - - - 33 - - - - - 30 - - - - - 34 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 30.IBPluginDependency - 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform - 33.IBPluginDependency - 34.IBPluginDependency - 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBPluginDependency - - - YES - BookmarksController - UIResponder - {{357, 356}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw8+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw8+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAA/gAAAw+SAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 40 - - - - YES - - BookmarksController - UIViewController - - YES - - YES - addFolder: - enableEditMode: - finishEditMode: - switchToBrowser: - - - YES - id - id - id - id - - - - YES - - YES - addFolder: - enableEditMode: - finishEditMode: - switchToBrowser: - - - YES - - addFolder: - id - - - enableEditMode: - id - - - finishEditMode: - id - - - switchToBrowser: - id - - - - - YES - - YES - editToolbar - tableView - toolbar - - - YES - UIToolbar - UITableView - UIToolbar - - - - YES - - YES - editToolbar - tableView - toolbar - - - YES - - editToolbar - UIToolbar - - - tableView - UITableView - - - toolbar - UIToolbar - - - - - IBProjectSource - Classes/BookmarksController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - NSObject - - IBFrameworkSource - YAJLiOS.framework/Headers/NSObject+YAJL.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 141 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Browser Resources/BookmarksForm.xib b/Browser Resources/BookmarksForm.xib index a382537..d9cc9ed 100644 --- a/Browser Resources/BookmarksForm.xib +++ b/Browser Resources/BookmarksForm.xib @@ -1,5 +1,5 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index 8a82eb1..f458acd 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -1,5 +1,5 @@ - + @@ -198,7 +198,7 @@ - - + @@ -188,7 +188,7 @@ - + @@ -225,7 +225,7 @@ From 16b5b25acdc5f048652b23d2b40de59b9663124a Mon Sep 17 00:00:00 2001 From: Aaron Jubbal Date: Tue, 29 Jul 2014 16:24:59 -0700 Subject: [PATCH 34/60] =?UTF-8?q?Animated=20closing=20of=20tabs=20by=20hav?= =?UTF-8?q?ing=20them=20drop=20down,=20and=20the=20moving=20of=20tabs=20to?= =?UTF-8?q?=20occupy=20a=20recently=20removed=20tab=E2=80=99s=20space.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Browser/BrowserViewController.m | 79 +++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 6269ad3..f9f33c2 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -865,41 +865,54 @@ -(IBAction) removeTab:(id)sender { Tab *toBeRemoved = (Tab *)[sender superview]; [[toBeRemoved tabButton] setEnabled:NO]; - BOOL removed = NO; - BOOL select = NO; - - for (id cTab in _tabs) { - if (select) { - [self switchTabFrom:_selectedTab ToTab:cTab]; - select = NO; - } - if (removed) { - [cTab incrementOffset]; - } - if ([cTab closeButton] == sender) { - removed = YES; - select = (_selectedTab == cTab); - } + [UIView animateWithDuration:0.20 animations:^{ + CGRect newFrame = toBeRemoved.frame; + newFrame.origin.y += toBeRemoved.frame.size.height; + toBeRemoved.frame = newFrame; + } completion:^(BOOL finished) { + BOOL removed = NO; + BOOL select = NO; - } + for (id cTab in _tabs) { + if (select) { + [self switchTabFrom:_selectedTab ToTab:cTab]; + select = NO; + } + if (removed) { + if (!finished) { + [cTab incrementOffset]; + } else { + [UIView animateWithDuration:0.20 animations:^{ + [cTab incrementOffset]; + } completion:nil]; + } + } + if ([cTab closeButton] == sender) { + removed = YES; + select = (_selectedTab == cTab); + } + + } + + if (toBeRemoved == [_tabs lastObject] && [_tabs lastObject] != [NSNull null] && [_tabs count] > 1) { + [self switchTabFrom:_selectedTab ToTab:[_tabs objectAtIndex:[_tabs count]-2]]; + } else if ([_tabs count] == 0) { + self.webView = nil; // why? + } + [toBeRemoved removeFromSuperview]; + [[toBeRemoved webView] removeFromSuperview]; + [_tabs removeObject:toBeRemoved]; + + + if ([_tabs count] == 0) { + [self addTab:nil]; + } + [self loadTabs:[_selectedTab webView]]; + + //scrolling + _tabsView.contentSize = CGSizeMake((kTabWidth * [_tabs count]) + 40.0, 23.0); + }]; - if (toBeRemoved == [_tabs lastObject] && [_tabs lastObject] != [NSNull null] && [_tabs count] > 1) { - [self switchTabFrom:_selectedTab ToTab:[_tabs objectAtIndex:[_tabs count]-2]]; - } else if ([_tabs count] == 0) { - self.webView = nil; - } - [toBeRemoved removeFromSuperview]; - [[toBeRemoved webView] removeFromSuperview]; - [_tabs removeObject: toBeRemoved]; - - - if ([_tabs count] == 0) { - [self addTab:nil]; - } - [self loadTabs:[_selectedTab webView]]; - - //scrolling - _tabsView.contentSize = CGSizeMake((kTabWidth * [_tabs count]) + 40.0, 23.0); } -(IBAction) selectTab:(id)sender { From bc1b0a0d189a2fea060a13762f9e17276e6bd287 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Wed, 30 Jul 2014 13:15:29 -0400 Subject: [PATCH 35/60] update podspec; code cleanup --- Browser/BookmarksFormController.h | 5 +++++ Browser/BookmarksFormController.m | 9 ++------- Browser/BrowserViewController.h | 2 +- Browser/BrowserViewController.m | 1 + banshee.podspec | 10 +++++----- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Browser/BookmarksFormController.h b/Browser/BookmarksFormController.h index 185ecb6..717ba1a 100644 --- a/Browser/BookmarksFormController.h +++ b/Browser/BookmarksFormController.h @@ -7,7 +7,10 @@ #import +@class BrowserViewController; + @interface BookmarksFormController : UIViewController { + BrowserViewController *browserController; IBOutlet UIButton *parentField; IBOutlet UITextField *nameField; IBOutlet UITextField *urlField; @@ -17,6 +20,8 @@ NSString *defaultUrlFieldText; char mode; } + +@property(nonatomic, strong) BrowserViewController *browserController; @property(nonatomic, strong) UIButton *parentField; @property(nonatomic, strong) UITextField *nameField; @property(nonatomic, strong) UITextField *urlField; diff --git a/Browser/BookmarksFormController.m b/Browser/BookmarksFormController.m index 82ed654..7b3976e 100644 --- a/Browser/BookmarksFormController.m +++ b/Browser/BookmarksFormController.m @@ -7,16 +7,14 @@ #import "BookmarksController.h" #import "BookmarksFormController.h" -#import "AppDelegate.h" #import "BrowserViewController.h" @class BrowserViewController; @class BookmarksController; -@class AppDelegate; @implementation BookmarksFormController -@synthesize parentField, nameField, urlField, arrowLabel, cancelButton, doneButton, mode, defaultUrlFieldText; +@synthesize parentField, nameField, urlField, arrowLabel, cancelButton, doneButton, mode, defaultUrlFieldText, browserController; // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. @@ -39,8 +37,6 @@ - (void)viewDidLoad { - (void) viewWillAppear:(BOOL)animated { NSArray *vControllers = [self.navigationController viewControllers]; BookmarksController *bookmarksController = [vControllers objectAtIndex:([vControllers count] - 2)]; - BrowserViewController *browserController = [bookmarksController browserController]; - //Edit mode if (mode == 'E') { @@ -122,8 +118,7 @@ - (IBAction) switchToBrowser:(id)sender { - (IBAction) folderSelect:(id)sender { BookmarksController *nextBookmarkController = [[BookmarksController alloc] init]; [[NSBundle mainBundle] loadNibNamed:@"Bookmarks" owner:nextBookmarkController options:nil]; - AppDelegate* delegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; - [nextBookmarkController setBrowserController:delegate.viewController]; + [nextBookmarkController setBrowserController:self.browserController]; [nextBookmarkController setMode:'P']; [nextBookmarkController setFolderIndex:BOOKMARKS_ROOT]; [self.navigationController pushViewController:nextBookmarkController animated:YES]; diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index 7076c0b..ba1cf85 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -13,7 +13,7 @@ #define kFinishedLoadingNotification @"kFinishedLoadingNotification" //reference: http://stackoverflow.com/a/18085584/347339 -#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size +#define DEVICE_SIZE [[UIScreen mainScreen] bounds].size @class Tab, BookmarksController, BookmarksFormController, Reachability; diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 6cbc0ce..3b943e5 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -89,6 +89,7 @@ - (UINavigationController *)createBookmarksController:(BOOL)isMainController { BookmarksFormController *bookmarksFormController = [[BookmarksFormController alloc] initWithNibName:@"BookmarksForm" bundle:[NSBundle mainBundle]]; + [bookmarksFormController setBrowserController:self]; BookmarkFolderFormController *bookmarkFolderFormController = [[BookmarkFolderFormController alloc] initWithNibName:@"BookmarkFoldersForm" bundle:[NSBundle mainBundle]]; diff --git a/banshee.podspec b/banshee.podspec index 21a0825..9ad5c2b 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,18 +1,18 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.2" + s.version = "0.1.3" s.summary = "An iOS browser built on top of UIWebView." - s.homepage = "https://github.com/ghostery/banshee" + s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" s.license = 'MIT' s.author = { "Alex Catighera" => "acatighera@gmail.com" } - s.source = { :git => "https://github.com/ghostery/banshee.git", :tag => s.version.to_s } + s.source = { :git => "https://github.com/acatighera/banshee.git", :tag => s.version.to_s } s.social_media_url = 'https://twitter.com/acatighera' - s.platform = :ios, '7.0' + s.platform = :ios, '7.0' s.requires_arc = true - s.source_files = 'Browser/*.{h,m,c}' + s.source_files = [ 'Browser/*.{h,m,c}', 'Browser/*/*.{h,m.c}' ] s.resources = 'Browser Resources/*' s.frameworks = [ 'CoreData', 'SystemConfiguration' ] From d3939fe311f0e4cf0ec06e268854f1f4421d5913 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Fri, 1 Aug 2014 16:57:35 -0400 Subject: [PATCH 36/60] tweak to podspec --- banshee.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/banshee.podspec b/banshee.podspec index 9ad5c2b..1e32a34 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.3" + s.version = "0.1.4" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.requires_arc = true s.source_files = [ 'Browser/*.{h,m,c}', 'Browser/*/*.{h,m.c}' ] - s.resources = 'Browser Resources/*' + s.resources = [ 'Browser Resources/*', 'Browser Resources/**/*' ] s.frameworks = [ 'CoreData', 'SystemConfiguration' ] s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' } From 2860956cc34dc5bed6d5e7ab0e1b4b938fa7f383 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Fri, 1 Aug 2014 17:11:27 -0400 Subject: [PATCH 37/60] some README cleanup --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4c0d0bb..0b6be8b 100644 --- a/README.md +++ b/README.md @@ -26,20 +26,18 @@ Since libxml is not a framework but rather a dylib you will also have to add it The recommended way to integrate the browser code is to make your view controller a subclass of the browser controller. Which should look something like this: + #import // only necessary if using banshee cocoapod + @interface ViewController : BrowserViewController ### AppDelegate -Your app delegate needs to inherit from the browser delegate as so: - - #import "BrowserDelegate.h" - - @interface AppDelegate : BrowserDelegate +In the app delegate you should place this code in your `didFinishLaunchingWithOptions`: -The browser code does reference the app delegate, so you must have an AppDelegate Task. In the app delegate you should place this code in your `didFinishLaunchingWithOptions`: + [self.window setRootViewController:[[ViewController alloc] init]]; - self.viewController = [[BrowserViewController alloc] init]; +Note: These instructions only work if you create an empty project file. If you create a different type of project like a "single page" app, you will have to use a different approach since story board files are pulled in via plist file. ## License From d0a3b76948ab2140cfcabd48da4d39e82386a900 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 12:00:10 -0400 Subject: [PATCH 38/60] swap out toolbar items to ios7 style --- Browser Resources/Images/arrow-left.png | Bin 1061 -> 0 bytes Browser Resources/Images/arrow-right.png | Bin 1104 -> 0 bytes Browser Resources/Images/left.png | Bin 0 -> 291 bytes Browser Resources/Images/right.png | Bin 0 -> 274 bytes Browser Resources/MainWindow-iPad.xib | 18 +++++++------- Browser Resources/MainWindow.xib | 22 ++++++++---------- .../TestBrowser.xcodeproj/project.pbxproj | 16 ++++++------- 7 files changed, 26 insertions(+), 30 deletions(-) delete mode 100644 Browser Resources/Images/arrow-left.png delete mode 100644 Browser Resources/Images/arrow-right.png create mode 100644 Browser Resources/Images/left.png create mode 100644 Browser Resources/Images/right.png diff --git a/Browser Resources/Images/arrow-left.png b/Browser Resources/Images/arrow-left.png deleted file mode 100644 index d952e74fc006fc58c3d5e3900a73a687654044da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmV+=1ls$FP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS& z7b7W)C|=zF00X5-L_t(I%axT+NMlzN#=m>td(9scZ4;v=CI&@ULP=Y?5Q#K{;3i#I zM6n3cY^rG5AP6oZb<%|vZBS%Tu;N%mbR~rp+|`Yc1}xJq3WBq;Z6Jx!Cc&tA_uek- zON~0i^sL@Hocnv<`OdjK;D1DKZ!guJy+5T> zx3|XuprfN>sI#+kmUHgh-`{_s)fJ1y*8>L!2SEtI_VzXa2#?3}w!`80%H?u>>G60- zCX+!jndDl%qA0Hh4h;=qYiq0g?(_LRu-R-2ZnyiRwzf7f#*ocsVK5kkRwGH$L*Vf6 zFaTh4bF-Z5>FN2@;c$H0($do4a=AbV;iXcEQc6K-*;Y_WA5};$FE0fEba!`KEf&ku zy1Kft*49>7EEX`vgsQ4kmgQT3{2xM+B*?*F5b1OpMxzmg5Uj7S3jpZr>+7hhs+zB_ zukUm^ozUy`C=?2Ua}Gj?P*s&M#vTHfmzUx9`?0gLbJxGmO(xUVHk-|6wOXO7s>tPX zV6sW3NsW21@Ar^}v6bfN{d>jC>_) z#X^imBVmkzF-9awg27+_fER~{hd%&7S63J4{cEBqikO&~006A5t(`6`EDWVmsqsuE z^S4f?LsL@|tX3;m6y;XYy|sA&j7Fn~Mx&UVoGj;-mX@BKpP%=pQmJ2VZf;0JLj!d> zoiLe9AcVXgsKxyJJf^0mFg-mD09agH{3)N$f1FOIpBD-RG&eV+wzjqcSf28$Vs35@ z01ys`!5Aa6v$KBz_-tlo=IG?)`5RH_%jd) fJlArONCf`?)}(fIPZd&t00000NkvXXu0mjf)UVg* diff --git a/Browser Resources/Images/arrow-right.png b/Browser Resources/Images/arrow-right.png deleted file mode 100644 index 11770c6c7053c732d2e3f266b8beefe95fd4726a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1104 zcmV-W1h4yvP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS& z7b71;lFLK@00YoTL_t(I%axT+NL*JK#ees{_r}S4=4BW=js?M8V8lNpff6i~f*X@g zN?o{-36)y9(Ig;f+Dc&-4NaR?)IeerlGTU{DQ&QuEF`PaRZ)k;h=C!=LhOt>c_lhC z%)EQMNG6P!koN8l91h<(=i|Hd^z@*$1|XG6eV0n59-cmZ`a@p6-riox|9D1gYb*Wz z{Qx+Q^Ko-?^GCLA$AN#IJbCih+S-~vbLNcb?CfN9b@i=+re#^LKsKAzp6Aio+4)XB zpPzAE_e3t2`(|Nb;ctLMB7yJw%+1ZcdBXPgb{;%<06<$?TTdtyI_bJDkw^s7G*1X2 zK4@xcTFYcIPt)l%_wU~)kw}nEr(Y{5rIfV*DJ7Lk1((uXhleqaA3x6W@-hI&jvea>g+eDy)1+K3Q>j!$rBb0(Dxs9(@ZrOvuCDG~t@S6d zSgf2*r~h19T4HHwiFiCtDwR4op;C%csf6$Q8W1&Z1fYY#Akk>l4Fm!|4h#&mT9!3_ z^XARXy}iAI8CsTwQi|Q(U3}jc0HPY|i>!q2`D!&o`+IOODTnv5+Q^ZLLh{|vMd@J8gLwka=8ppuav3-&{`jC8Nl~_ zlv3g)Nedx_l#)Y-4iSw;wc|L(#>NJ@T<#a!w!gY}@7|+uILz(ax7EH3rIc8f^~$gpmIjk3?OVHg;Ofn{0vzOSW}1OfrV;V=yi z4Wd{qlFQ{Dd7gK1W@hGBfT5uwOw(j)YKjXNF6_5#7zR?x>VgZ$adadS5w>mPc^>(E z{x{F_F5b9tV;$h!xpVUB)vF5N{Q2`tO-&t~uqqe|g>)nmK}yN?_I6=sXD2y1Ir&4C zJ2El?psIL!diq5VwSoY)ZFA(v5gf-6rBaDpF8A>H^XFrelas$!IisVaT)A@P_2;X$ z6o7CzOk-msnM{W5?d|zOq44Fz#6$)lnM_hF7P)-+@|*8rZH8KF*4NkZJa4y9D17_) z@#CLnXJ^Y}V`Cx^2WJ@>d?v2|0000;}5&E7&i+7Ic z1y>kY3Ot@E<|o`>sA_|o@QJbkv)#ipu$L|C> zjyjg1(#1J|E|M-(xODYP$iq9+a8WhCL^Q8^P46@w!m9e}IcP;&x+*4pTT@!Z6>W+u p#Z{j`uYTA(`g;uZGfMg|fiF`AG?O7I0yzKx002ovPDHLkV1lz%bmjm6 literal 0 HcmV?d00001 diff --git a/Browser Resources/Images/right.png b/Browser Resources/Images/right.png new file mode 100644 index 0000000000000000000000000000000000000000..310855e846bcbdbe836a5ddc24d00419d583b9f8 GIT binary patch literal 274 zcmV+t0qy>YP)A}hmYAh zp?ZS{)aFV@aY}CocbGwlWULK3(1syWM2bq0DY_8puyyD+vs6q1 YAJHf@JD15qj{pDw07*qoM6N<$g4%d$*Z=?k literal 0 HcmV?d00001 diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index f458acd..7f7c693 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -1,5 +1,5 @@ - + @@ -59,27 +59,27 @@ - + - + - + - + @@ -198,7 +198,7 @@ - diff --git a/Browser Resources/MainWindow.xib b/Browser Resources/MainWindow.xib index 4244d57..d88120a 100644 --- a/Browser Resources/MainWindow.xib +++ b/Browser Resources/MainWindow.xib @@ -1,5 +1,5 @@ - + @@ -25,7 +25,7 @@ - + @@ -188,34 +188,34 @@ - + - + - + - + - + @@ -225,7 +225,7 @@ @@ -266,11 +266,9 @@ - - - - + + diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 788dc12..4a903c3 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */; }; B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55518D08D2A005E4834 /* BookmarkItem.m */; }; B5A210C218D091F700D65141 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A210C118D091F700D65141 /* Reachability.m */; }; + FA3CD2AD1993D98800B3ACF0 /* right.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AB1993D98800B3ACF0 /* right.png */; }; + FA3CD2AE1993D98800B3ACF0 /* left.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AC1993D98800B3ACF0 /* left.png */; }; FAA4557418A19A2E00B1BDF4 /* gsearch.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557118A19A2E00B1BDF4 /* gsearch.png */; }; FAA4557518A19A2E00B1BDF4 /* magglass.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557218A19A2E00B1BDF4 /* magglass.png */; }; FAA4557618A19A2E00B1BDF4 /* tab_add.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557318A19A2E00B1BDF4 /* tab_add.png */; }; @@ -41,8 +43,6 @@ FAF75EA518A17A77007B317D /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */; }; FAF75EA618A17A77007B317D /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9218A17A77007B317D /* MainWindow.xib */; }; FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAF75E9318A17A77007B317D /* Bookmarks.xib */; }; - FAF75EE318A17BFD007B317D /* arrow-left.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED718A17BFD007B317D /* arrow-left.png */; }; - FAF75EE418A17BFD007B317D /* arrow-right.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED818A17BFD007B317D /* arrow-right.png */; }; FAF75EE518A17BFD007B317D /* bookmark.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED918A17BFD007B317D /* bookmark.png */; }; FAF75EE618A17BFD007B317D /* cell_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDA18A17BFD007B317D /* cell_arrow.png */; }; FAF75EE718A17BFD007B317D /* delete_circle.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDB18A17BFD007B317D /* delete_circle.png */; }; @@ -71,6 +71,8 @@ B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = ""; }; B5A210C018D091F700D65141 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = ../Browser/Reachability.h; sourceTree = ""; }; B5A210C118D091F700D65141 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = ../Browser/Reachability.m; sourceTree = ""; }; + FA3CD2AB1993D98800B3ACF0 /* right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = right.png; sourceTree = ""; }; + FA3CD2AC1993D98800B3ACF0 /* left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = left.png; sourceTree = ""; }; FAA4557118A19A2E00B1BDF4 /* gsearch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gsearch.png; sourceTree = ""; }; FAA4557218A19A2E00B1BDF4 /* magglass.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = magglass.png; sourceTree = ""; }; FAA4557318A19A2E00B1BDF4 /* tab_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tab_add.png; sourceTree = ""; }; @@ -102,8 +104,6 @@ FAF75E9118A17A77007B317D /* MainWindow-iPad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "MainWindow-iPad.xib"; sourceTree = ""; }; FAF75E9218A17A77007B317D /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; FAF75E9318A17A77007B317D /* Bookmarks.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Bookmarks.xib; sourceTree = ""; }; - FAF75ED718A17BFD007B317D /* arrow-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-left.png"; sourceTree = ""; }; - FAF75ED818A17BFD007B317D /* arrow-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow-right.png"; sourceTree = ""; }; FAF75ED918A17BFD007B317D /* bookmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bookmark.png; sourceTree = ""; }; FAF75EDA18A17BFD007B317D /* cell_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cell_arrow.png; sourceTree = ""; }; FAF75EDB18A17BFD007B317D /* delete_circle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_circle.png; sourceTree = ""; }; @@ -181,6 +181,8 @@ FAA4557718A19B2700B1BDF4 /* Buttons */ = { isa = PBXGroup; children = ( + FA3CD2AB1993D98800B3ACF0 /* right.png */, + FA3CD2AC1993D98800B3ACF0 /* left.png */, FAA4557C18A19F7A00B1BDF4 /* bookmarks.png */, FAA4557A18A19F1E00B1BDF4 /* configure.png */, FAA4557318A19A2E00B1BDF4 /* tab_add.png */, @@ -281,8 +283,6 @@ FAA4557118A19A2E00B1BDF4 /* gsearch.png */, FAF75ED918A17BFD007B317D /* bookmark.png */, FAA4557218A19A2E00B1BDF4 /* magglass.png */, - FAF75ED718A17BFD007B317D /* arrow-left.png */, - FAF75ED818A17BFD007B317D /* arrow-right.png */, FAF75EDA18A17BFD007B317D /* cell_arrow.png */, FAF75EDB18A17BFD007B317D /* delete_circle.png */, FAF75EDC18A17BFD007B317D /* folder.png */, @@ -357,19 +357,19 @@ FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */, FAC9B26816F27BF800E37710 /* InfoPlist.strings in Resources */, FAF75EEA18A17BFD007B317D /* iphone_delete_button.png in Resources */, - FAF75EE318A17BFD007B317D /* arrow-left.png in Resources */, FAA4557B18A19F1E00B1BDF4 /* configure.png in Resources */, FAF75EA418A17A77007B317D /* launch.html in Resources */, - FAF75EE418A17BFD007B317D /* arrow-right.png in Resources */, FAA4557518A19A2E00B1BDF4 /* magglass.png in Resources */, FAC9B27016F27BF800E37710 /* Default.png in Resources */, FAF75EE818A17BFD007B317D /* folder.png in Resources */, FAA4557418A19A2E00B1BDF4 /* gsearch.png in Resources */, FAA4557618A19A2E00B1BDF4 /* tab_add.png in Resources */, FAF75EEB18A17BFD007B317D /* refresh.png in Resources */, + FA3CD2AD1993D98800B3ACF0 /* right.png in Resources */, FAF75E9718A17A77007B317D /* BookmarkItem.xib in Resources */, FAC9B27216F27BF800E37710 /* Default@2x.png in Resources */, FAC9B27416F27BF800E37710 /* Default-568h@2x.png in Resources */, + FA3CD2AE1993D98800B3ACF0 /* left.png in Resources */, FAF75EA618A17A77007B317D /* MainWindow.xib in Resources */, FAF75E9618A17A77007B317D /* BookmarkFoldersForm.xib in Resources */, FAA4557918A19D9500B1BDF4 /* unable_to_connect.html in Resources */, From d173b5aece7ef03944601bf7b4d07620e1a55184 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 12:01:08 -0400 Subject: [PATCH 39/60] bump podspec --- banshee.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banshee.podspec b/banshee.podspec index 1e32a34..f5003f9 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.4" + s.version = "0.1.5" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 8720363adb157101f80cab1f9188a09a48fa06fe Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 14:44:40 -0400 Subject: [PATCH 40/60] partial refactor of scrolling logic (one step at a time) --- Browser/BrowserViewController.m | 51 ++++++++------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/Browser/BrowserViewController.m b/Browser/BrowserViewController.m index 3b943e5..938036c 100644 --- a/Browser/BrowserViewController.m +++ b/Browser/BrowserViewController.m @@ -326,13 +326,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ // show bottom toolbar when scrolling up fast if (scrollDirection == ScrollDirectionUp && scrollView.contentOffset.y - self.lastScrollContentOffset < -20 && _bottomBar.alpha == 0.0) { - [UIView animateWithDuration: 0.5 - delay: 0.0 - options: UIViewAnimationOptionCurveEaseOut - animations:^{ - _bottomBar.alpha = 1.0; - } - completion:^(BOOL finished){ + [self toggleBottomBarWithCompletion:^(BOOL finished){ if (finished) { [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, minWebViewSize); } @@ -344,29 +338,12 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if (scrollDirection == ScrollDirectionDown && _bottomBar.alpha == 1.0) { [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, maxWebViewSize); - [UIView animateWithDuration: 1.0 - delay: 0.0 - options: UIViewAnimationOptionCurveEaseIn - animations:^{ - _bottomBar.alpha = 0.0; - } - completion:^(BOOL finished){ - if (finished) { - } - }]; + [self toggleBottomBarWithCompletion:nil]; } // show bottom toolbar } else if (_bottomBar.alpha == 0.0) { - - - [UIView animateWithDuration: 0.5 - delay: 0.0 - options: UIViewAnimationOptionCurveEaseOut - animations:^{ - _bottomBar.alpha = 1.0; - } - completion:^(BOOL finished){ + [self toggleBottomBarWithCompletion:^(BOOL finished){ if (finished) { [_selectedTab webView].frame = CGRectMake([_selectedTab webView].frame.origin.x, [_selectedTab webView].frame.origin.y, [_selectedTab webView].frame.size.width, minWebViewSize); if (scrollView.contentOffset.y > 0) { @@ -388,27 +365,23 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ self.lastScrollContentOffset = scrollView.contentOffset.y; } -- (void)showHideView +- (void)toggleBottomBarWithCompletion:(void (^)(BOOL finished))completion { LogTrace(@"%s", __PRETTY_FUNCTION__); + float alpha = 0.0; + //UIViewAnimationCurve *options = UIViewAnimationCurveEaseO + if (_bottomBar.alpha == 0.0) { + alpha = 1.0; + } // Fade out the view right away [UIView animateWithDuration:1.0 delay: 0.0 - options: UIViewAnimationOptionCurveEaseIn + options: UIViewAnimationOptionCurveEaseInOut animations:^{ - _bottomBar.alpha = 0.0; + _bottomBar.alpha = alpha; } - completion:^(BOOL finished){ - // Wait one second and then fade in the view - [UIView animateWithDuration:1.0 - delay: 1.0 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - _bottomBar.alpha = 1.0; - } - completion:nil]; - }]; + completion: completion]; } From 596e6c1f75f4ee0bd547f843acb606237e20e17b Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 14:45:13 -0400 Subject: [PATCH 41/60] podspec version bump --- banshee.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banshee.podspec b/banshee.podspec index f5003f9..09a33e9 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.5" + s.version = "0.1.6" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 017cf64d35882722ab09bfa0638260bbf7239d84 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 14:49:00 -0400 Subject: [PATCH 42/60] missing header declartion --- Browser/BrowserViewController.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Browser/BrowserViewController.h b/Browser/BrowserViewController.h index ba1cf85..d296789 100644 --- a/Browser/BrowserViewController.h +++ b/Browser/BrowserViewController.h @@ -76,6 +76,8 @@ -(IBAction) showBookmarks:(id)sender; -(IBAction) scrollToTop:(id)sender; +-(void) toggleBottomBarWithCompletion:(void (^)(BOOL finished))completion; + -(NSArray *) actionSheetButtons; -(IBAction) showActionSheet:(id)sender; -(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex; From 2a40a0d1fb118c83366d15642b6799a0b492afe8 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 14:52:03 -0400 Subject: [PATCH 43/60] bump podspec --- banshee.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banshee.podspec b/banshee.podspec index 09a33e9..142fc64 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.6" + s.version = "0.1.7" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 65e7b2b6a4d22d5a817dc4c5d42f59f79773827b Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 17:22:34 -0400 Subject: [PATCH 44/60] extract bookmark seed data --- Browser Resources/bookmarks.strings | 9 ++++ Browser/BookmarksController.h | 7 ++- Browser/BookmarksController.m | 49 +++++++++++++++---- .../TestBrowser.xcodeproj/project.pbxproj | 12 +++++ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 Browser Resources/bookmarks.strings diff --git a/Browser Resources/bookmarks.strings b/Browser Resources/bookmarks.strings new file mode 100644 index 0000000..d2651e7 --- /dev/null +++ b/Browser Resources/bookmarks.strings @@ -0,0 +1,9 @@ +/* + bookmarks.strings + TestBrowser + + Created by Alexandru Catighera on 8/7/14. + Copyright (c) 2014 Alexandru Catighera. All rights reserved. +*/ + +"Default/Reddit" = "http://www.reddit.com"; diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index 9d1618b..bda5f3f 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -10,6 +10,7 @@ #define FOLDERS_KEY @"BookmarksFolders" #define BOOKMARKS_ROOT -1 #define MAX_BOOKMARKS 1000 +#define BOOKMARKS_SEED_RESOURCE_NAME @"bookmarks" @class BookmarksFormController; @class BookmarkFolderFormController; @@ -24,10 +25,12 @@ char mode; NSInteger folderIndex; NSInteger bookmarkIndex; - + NSMutableArray *bookmarks; NSMutableArray *folders; + NSString *bookmarksSeedResourceName; + UIImage *bookmarkImage; UIImage *folderImage; IBOutlet UIToolbar *toolbar; @@ -45,6 +48,8 @@ @property(nonatomic, strong) NSMutableArray *bookmarks; @property(nonatomic, strong) NSMutableArray *folders; +@property(nonatomic, strong) NSString *bookmarksSeedResourceName; + @property(nonatomic, strong) IBOutlet UITableView *tableView; @property(nonatomic, strong) UIImage *bookmarkImage; diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index b0729ce..51fb427 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -17,6 +17,7 @@ @implementation BookmarksController @synthesize browserController, formController, folderController; @synthesize mode, bookmarks, folders, folderImage, bookmarkImage; @synthesize toolbar, editToolbar, folderIndex, bookmarkIndex; +@synthesize bookmarksSeedResourceName; // The designated initializer. Override if you create the controller programmatically // and want to perform customization that is not appropriate for viewDidLoad. @@ -41,16 +42,46 @@ - (void)viewDidLoad { //Check to see if the folders dict is nil, if it is, create a new folder withe the default structure. if (foldersDict == nil) { + NSString *fname = nil; + fname = [[NSBundle mainBundle] pathForResource:BOOKMARKS_SEED_RESOURCE_NAME ofType:@"strings"]; + NSDictionary *seedBookmarks = [NSDictionary dictionaryWithContentsOfFile:fname]; - NSMutableArray* folderArray = [[NSMutableArray alloc] init]; - NSMutableArray* bookmarksArray = [[NSMutableArray alloc] init]; - NSDictionary* defaultBookmark = [NSDictionary dictionaryWithObjectsAndKeys:@"Reddit", @"title", - @"http://www.reddit.com",@"URL",nil]; - [bookmarksArray addObject:defaultBookmark]; - foldersDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Default", @"title", - bookmarksArray, @"bookmarks",nil]; - [folderArray addObject:foldersDict]; - [defaults setObject:folderArray forKey:FOLDERS_KEY]; + NSMutableDictionary *foldersDict = [[NSMutableDictionary alloc] init]; + + NSEnumerator *enumerator = [seedBookmarks keyEnumerator]; + NSString *key; + NSArray *bookmarkComponents; + NSString *url; + NSDictionary *bookmark; + NSDictionary *folder; + NSString *folderName; + NSString *bookmarkName; + + + while ((key = [enumerator nextObject])) { + bookmarkComponents = [key componentsSeparatedByString:@"/"]; + url = [seedBookmarks objectForKey:key]; + + if ([bookmarkComponents count] == 2) { + folderName = [bookmarkComponents objectAtIndex:0]; + bookmarkName = [bookmarkComponents objectAtIndex:1]; + + bookmark = [NSDictionary dictionaryWithObjectsAndKeys: + bookmarkName, @"title",url,@"URL",nil]; + + folder = [foldersDict objectForKey:folderName]; + if (folder) { + [(NSMutableArray *)[folder objectForKey:@"bookmarks"] addObject:bookmark]; + } else { + folder = [NSDictionary dictionaryWithObjectsAndKeys:folderName, @"title", + [NSMutableArray arrayWithObject:bookmark], @"bookmarks",nil]; + [foldersDict setObject:folder forKey:folderName]; + } + + } + } + + [defaults setObject:[foldersDict allValues] forKey:FOLDERS_KEY]; [defaults synchronize]; } diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 4a903c3..66a6f28 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */; }; B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55518D08D2A005E4834 /* BookmarkItem.m */; }; B5A210C218D091F700D65141 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A210C118D091F700D65141 /* Reachability.m */; }; + FA157C3019941ACB0002C146 /* bookmarks.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA157C2F19941ACB0002C146 /* bookmarks.strings */; }; FA3CD2AD1993D98800B3ACF0 /* right.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AB1993D98800B3ACF0 /* right.png */; }; FA3CD2AE1993D98800B3ACF0 /* left.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AC1993D98800B3ACF0 /* left.png */; }; FAA4557418A19A2E00B1BDF4 /* gsearch.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557118A19A2E00B1BDF4 /* gsearch.png */; }; @@ -71,6 +72,7 @@ B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = ""; }; B5A210C018D091F700D65141 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = ../Browser/Reachability.h; sourceTree = ""; }; B5A210C118D091F700D65141 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = ../Browser/Reachability.m; sourceTree = ""; }; + FA157C2F19941ACB0002C146 /* bookmarks.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = bookmarks.strings; sourceTree = ""; }; FA3CD2AB1993D98800B3ACF0 /* right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = right.png; sourceTree = ""; }; FA3CD2AC1993D98800B3ACF0 /* left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = left.png; sourceTree = ""; }; FAA4557118A19A2E00B1BDF4 /* gsearch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gsearch.png; sourceTree = ""; }; @@ -178,6 +180,14 @@ path = Logging; sourceTree = ""; }; + FA157C2E19941AB90002C146 /* Bookmarks */ = { + isa = PBXGroup; + children = ( + FA157C2F19941ACB0002C146 /* bookmarks.strings */, + ); + name = Bookmarks; + sourceTree = ""; + }; FAA4557718A19B2700B1BDF4 /* Buttons */ = { isa = PBXGroup; children = ( @@ -268,6 +278,7 @@ FAF75E8018A17A59007B317D /* Browser Resources */ = { isa = PBXGroup; children = ( + FA157C2E19941AB90002C146 /* Bookmarks */, 0E54DB6F197DAECA005BF033 /* Views */, 0E54DB6E197DAEA7005BF033 /* Web */, FAF75ED618A17BFD007B317D /* Images */, @@ -357,6 +368,7 @@ FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */, FAC9B26816F27BF800E37710 /* InfoPlist.strings in Resources */, FAF75EEA18A17BFD007B317D /* iphone_delete_button.png in Resources */, + FA157C3019941ACB0002C146 /* bookmarks.strings in Resources */, FAA4557B18A19F1E00B1BDF4 /* configure.png in Resources */, FAF75EA418A17A77007B317D /* launch.html in Resources */, FAA4557518A19A2E00B1BDF4 /* magglass.png in Resources */, From 825497285f3515222ad0d727985478a38db95719 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 20:57:07 -0400 Subject: [PATCH 45/60] bookmark icons now load favicons --- Browser Resources/BookmarkItem.xib | 4 ++-- Browser Resources/Images/folder.png | Bin 3480 -> 220 bytes Browser/BookmarksController.h | 4 ++++ Browser/BookmarksController.m | 19 +++++++++++++++--- .../TestBrowser.xcodeproj/project.pbxproj | 8 ++++---- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Browser Resources/BookmarkItem.xib b/Browser Resources/BookmarkItem.xib index 4c4a92f..c6ee9a8 100644 --- a/Browser Resources/BookmarkItem.xib +++ b/Browser Resources/BookmarkItem.xib @@ -45,13 +45,13 @@ - + diff --git a/Browser Resources/Images/folder.png b/Browser Resources/Images/folder.png index 52cd9bd36b5c69011b809c0d04f824eb212a2910..d6c707e712669dd54b7c6c8a4d9df880f75d023d 100644 GIT binary patch delta 200 zcmbOseTPx8Gr-TCmrII^fq{Y7)59eQNDF{42NRH-FfqeyqMls+Jq`{ANsgBPQ-1>m zWivw}N}Tg^b5rw5fLsO!=c3falGGH1^30M91$R&1fE2w{cA$8Wr;B5V#`)ww|Nq-F zYc_N?x*Rxk;DAEdU-sZfq1xPjyfZFE^g3K@;4Fyjj%5z}?$DE<_=0WGpN8WTeg6OZ ttE?+0At{+DUARSVd*hRY)FqW!tPHL((vEkZy9p=fS?83{1OOVeLcjn3 literal 3480 zcmV;J4QKL+P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW2oV%B25R5--T(j%DoI2^R9M56 zSWS;**Hv9>pL0LndsX$SzihYN9k&yK6OupxA%mGABoslUOu~c_BZiFlBS?%HA~6dR zGXz*5CjtpVj2%#%koddXUENjn>V4dM&fbf`tuB}CxNV=olkUBG_pH13T4(RIDG9%5 zUEC*m`F=!PzWI@-A72g_KtPgvi3kxg(wl85L-D@N2lJK)IbfDQ=|$5{ABSsZk4K zyL;0#A0g1=X=JogF_b#iQUjKorp=b%ju1)>B`GD6GJXo6De)h{)c5^oL4T35p;~b- z9>NTl)KKxp$1HWDN`5k`4kOb4oR&Q zK#UB&HzEX*m6gD@VmGDf{Bxy)s_Hq zEeJHQz-5`a`#6s7K8YY;E>=pAi4Y+OLLdMICOvxs`vbOXu=Q=&0{aMphK6cFKnLO}zubjU2S9s?i0Bjp`ONJ~gt~b~f3~>Jllu7*Oymq)N9PV(Jd#K8xh&ac3DP@lV6ciy;$PvJn zF{pOXz4FFO3tMzIpGUoSO+)fttpviHX<#lQsxw5GvI!C47Ge=9J)m6~-4lm1$sL>% zs;V%uejU->H@}3%CiyD(G%#-^+5K~!6SOK7DTEOmC8s=mlo$8nB}$c7lT^dDl|!A*A%0qf z0!R@+5+@y`dK3@7=P0x5H=wuD?y7ayfey%{J?u&+RAHocjY(k!n$<3;!7d(&PC_UN zCV7!IrKS);&;`@uYMBrK!9;*EAclKs{X<*cZs%UN_pJXfsAv9l*o@I3|Iq7Q$B}iM zIo*xpFxYfFTLM8uCXcd~IeG}txvO&kSewu0FmQ|A zzi9l&ZSx;CyE@ZxLZuT-q0#X!@ru>^&`(sKq&Vq0L zOPgI8ON8@WKs>K!8JlZpAwmHrFjb%=WW+-LI?DIQ)l0s6ztz=Q^Gti_+Wm}dVM#K? zK)nr}s4P5fa{W5{>$0PW4T~AJZG`!HQ~Q%LFR^Hm8D886Vzu7I=v9q^Q%{lr2pRJt zG$RJ2F`;Fp#=DB2c)S|J|IT#WZf4LIkXO#PPS@Lg3kYBj0xZ;)^_a}yb8HB118455 z78w{2yIFH|R>AcAH%-q{%RQ>&QN^Y zp^RhsIk8JNH{hTx;f+YaK><#IG6xaZz60B-yn|q=4R(jQeU;H;Tjja66@F~ znyG=5rj{{C10rt%SGd6Lb)5W7-TqUiC*5p^L+MA!1~)KTp>-W+3k(Y-0)$6I6=g80 zA-Y=MP4)myF+ERfkROCrLq+1EOMP!Pcs(sKoNY%(B%7+15Ry+eA_#-!18X3_Zb-jV z%W3uRC;x97J9S4Yhwe>k&#b9LkLV&ms|YC)X-2^)R)><#H0&eZAc3?LPKRjA_G_{) z0j9dzjM@aodQ4{4K60gML<&iYsYe5lQ*0yJ=$E|x``z$M!&}ek!FQ8>P|EF`yh$4> zqa;T~W|&!QlX@t@64H5_MXP3xu@62_d#t!sORoN0-M#4ZWsS4lu-a@F>tv-l>(DgA zLHL#tfqLE~PHBTOG=tURL)0$&v)%PS8M|kX&i?J%>EDKm`5w9rvZZk`=mhOvj!uAV zJdbi9Xn>qe@&MlP&CLeywavAy|MvYQ+j4i_TpePl^nO%h-DsAzRTz}31J)~9M1&zv z&Q(#uS3{|z&j(l7^J9SCe|8oxqg|!k z=F*@BT1iHd5hQit{1u7~Mk;S37Bzk zEE3w5PXvb1AD-=w$0C<)t@P#VvSTotH4QAf80UkIhw-eI8ZjGu7>MmV z>Dq4Wvg6Q(_G(ktM#2aIOq1IXA+;$S(S;R70Ar53O??w-UvfzynFz?B%;Zd^jullM zLx3d*5*u>_P?3;2%;vT?-=Etul|8JF$L+Y`P{+HmzQ@r}=7XGaM5R}R=oL{Bl^%$S zC=e`2d2;1(lk2NF)x@9zlLIL=YOP~2qLxyIZ8mywzyhd3&X@xZ3`$CUZp%JbwZvu| zkL&I*7Hn+Qc8In|ZLO>^85amPIj@Pct}LiRJ9!d{fvO;0fxZP5p-AUml0pI(Nlk0W z-OVSiwF!_LjY2jjEQ{ulQc|OmHd}wU;>vb-AL&F}^XSHGeOk>VXa+zaTrfg4CJ|`> zDp(|v6@ocoZ${mPSA-|#)U=ij4fms|EC-AE{9t+K>HQ`JR85T;GSYcNKhdE}Fz0TK z)%G|i^(R#Gf5{h}KLDRdgYM5aOP@70pa*9-c;LTx>R%bSzO((o(44jH`#GOxt4K3K zy?lP~vh>ZT_HK=5XKp>XgYDegaqy>Z9sb&##f@1Y7?_c8)I3c|C!-0V>$w^Vb?h?I3J1UHdw(>udXekm^Yu-|TlkU+T?e zesh-JN;uN$r`=T>x^8uL|FE%K+SNvN-u~8?_HNziuJj}vY-m#_`>~$d%&uIy(zb17 z9(J#BcxM*dImb{_fzn#LeqY(f+3))PpXtVnvw7-^nsIUC;FJN?7gegpvvK|QgVP^x z)^9)Q>oTJFsHW_Ei&fioy!{lv@rAubFJgoy%fyMA`C@E%;mMn(+27y4eQm!j<7xYL zI#P;5gIFH6zNo!#5576v_|ts&wZ0wmIJ0)4{nJzqkPuU^heP7lmGOmPw~hy|o|Wao zhFMChvsljCuYPg<mR+I!ybj;Nz*bG!aRd-&)5t#7fNYS=Xyw3sYPhXQ1y_1Pi- zw~AbZI@2Q8I-neOd%tq$`j?-X?->w>#gI7pbex|fm?nmol6869v_{kRw%mWF?{3q* zx%%zq*0*ux4+HC@4r2y^_RO&dfc9YM_6Z~qkr7BRS^^8^ei+R!KXs$Ix%}d-logP< z!6rYUX$0c|IV>UbBlG3y(#%vUGr$x4=&#G>=lP3&!M!i+8gGLRGlOAZbQpoABIT;- zivuCRU<4!JMY&@|Z9t6a)Ujxg6z^xdLI*^cU=rxa1pXhMLE{CvKFi<$0000 0) ? [UIImage imageWithData:bookmarkImageData] : bookmarkImage; +} // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -318,7 +329,8 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; [cell.cellLabel setText:[bookmarkDict valueForKey:@"title"]]; LogInfo(@"Cell Label : %@", cell.cellLabel.text); - cell.cellImage.image = bookmarkImage; + cell.cellImage.image = [self getBookmarkImageFromUrlString:[bookmarkDict objectForKey:@"URL"]]; + } if (self.mode == 'E') { @@ -328,7 +340,8 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa NSArray* bookmarksArray = [folderDict objectForKey:@"bookmarks"]; NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; [cell.cellLabel setText:[bookmarkDict valueForKey:@"title"]]; - cell.cellImage.image = bookmarkImage; + cell.cellImage.image = [self getBookmarkImageFromUrlString:[bookmarkDict objectForKey:@"URL"]]; + [cell enableEdit]; } else @@ -354,7 +367,7 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { LogTrace(@"%s", __PRETTY_FUNCTION__); - ((BookmarkItem *)cell).cellLabel.font = [UIFont italicSystemFontOfSize:17.0]; + ((BookmarkItem *)cell).cellLabel.font = [UIFont italicSystemFontOfSize:14.0]; } diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 66a6f28..3b30966 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ FAA4557918A19D9500B1BDF4 /* unable_to_connect.html in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557818A19D9500B1BDF4 /* unable_to_connect.html */; }; FAA4557B18A19F1E00B1BDF4 /* configure.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557A18A19F1E00B1BDF4 /* configure.png */; }; FAA4557D18A19F7A00B1BDF4 /* bookmarks.png in Resources */ = {isa = PBXBuildFile; fileRef = FAA4557C18A19F7A00B1BDF4 /* bookmarks.png */; }; + FAB6B8FF19945091001666A7 /* folder.png in Resources */ = {isa = PBXBuildFile; fileRef = FAB6B8FE19945091001666A7 /* folder.png */; }; FAC9B25E16F27BF800E37710 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B25D16F27BF800E37710 /* UIKit.framework */; }; FAC9B26016F27BF800E37710 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B25F16F27BF800E37710 /* Foundation.framework */; }; FAC9B26216F27BF800E37710 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC9B26116F27BF800E37710 /* CoreGraphics.framework */; }; @@ -47,7 +48,6 @@ FAF75EE518A17BFD007B317D /* bookmark.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75ED918A17BFD007B317D /* bookmark.png */; }; FAF75EE618A17BFD007B317D /* cell_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDA18A17BFD007B317D /* cell_arrow.png */; }; FAF75EE718A17BFD007B317D /* delete_circle.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDB18A17BFD007B317D /* delete_circle.png */; }; - FAF75EE818A17BFD007B317D /* folder.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDC18A17BFD007B317D /* folder.png */; }; FAF75EE918A17BFD007B317D /* gray-pixel.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDD18A17BFD007B317D /* gray-pixel.png */; }; FAF75EEA18A17BFD007B317D /* iphone_delete_button.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDE18A17BFD007B317D /* iphone_delete_button.png */; }; FAF75EEB18A17BFD007B317D /* refresh.png in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EDF18A17BFD007B317D /* refresh.png */; }; @@ -81,6 +81,7 @@ FAA4557818A19D9500B1BDF4 /* unable_to_connect.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = unable_to_connect.html; sourceTree = ""; }; FAA4557A18A19F1E00B1BDF4 /* configure.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = configure.png; sourceTree = ""; }; FAA4557C18A19F7A00B1BDF4 /* bookmarks.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bookmarks.png; sourceTree = ""; }; + FAB6B8FE19945091001666A7 /* folder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = folder.png; sourceTree = ""; }; FAC9B25A16F27BF800E37710 /* TestBrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestBrowser.app; sourceTree = BUILT_PRODUCTS_DIR; }; FAC9B25D16F27BF800E37710 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; FAC9B25F16F27BF800E37710 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -109,7 +110,6 @@ FAF75ED918A17BFD007B317D /* bookmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bookmark.png; sourceTree = ""; }; FAF75EDA18A17BFD007B317D /* cell_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cell_arrow.png; sourceTree = ""; }; FAF75EDB18A17BFD007B317D /* delete_circle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = delete_circle.png; sourceTree = ""; }; - FAF75EDC18A17BFD007B317D /* folder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = folder.png; sourceTree = ""; }; FAF75EDD18A17BFD007B317D /* gray-pixel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "gray-pixel.png"; sourceTree = ""; }; FAF75EDE18A17BFD007B317D /* iphone_delete_button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iphone_delete_button.png; sourceTree = ""; }; FAF75EDF18A17BFD007B317D /* refresh.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = refresh.png; sourceTree = ""; }; @@ -292,11 +292,11 @@ children = ( FAA4557718A19B2700B1BDF4 /* Buttons */, FAA4557118A19A2E00B1BDF4 /* gsearch.png */, + FAB6B8FE19945091001666A7 /* folder.png */, FAF75ED918A17BFD007B317D /* bookmark.png */, FAA4557218A19A2E00B1BDF4 /* magglass.png */, FAF75EDA18A17BFD007B317D /* cell_arrow.png */, FAF75EDB18A17BFD007B317D /* delete_circle.png */, - FAF75EDC18A17BFD007B317D /* folder.png */, FAF75EDD18A17BFD007B317D /* gray-pixel.png */, FAF75EDE18A17BFD007B317D /* iphone_delete_button.png */, FAF75EDF18A17BFD007B317D /* refresh.png */, @@ -363,6 +363,7 @@ FAF75EE718A17BFD007B317D /* delete_circle.png in Resources */, FAF75E9818A17A77007B317D /* BookmarksForm.xib in Resources */, FAF75EEC18A17BFD007B317D /* tabs.png in Resources */, + FAB6B8FF19945091001666A7 /* folder.png in Resources */, FAF75EE518A17BFD007B317D /* bookmark.png in Resources */, FAF75EA318A17A77007B317D /* import_bookmark_howto.html in Resources */, FAF75EA718A17A77007B317D /* Bookmarks.xib in Resources */, @@ -373,7 +374,6 @@ FAF75EA418A17A77007B317D /* launch.html in Resources */, FAA4557518A19A2E00B1BDF4 /* magglass.png in Resources */, FAC9B27016F27BF800E37710 /* Default.png in Resources */, - FAF75EE818A17BFD007B317D /* folder.png in Resources */, FAA4557418A19A2E00B1BDF4 /* gsearch.png in Resources */, FAA4557618A19A2E00B1BDF4 /* tab_add.png in Resources */, FAF75EEB18A17BFD007B317D /* refresh.png in Resources */, From 9861798a5f6873d8bae4fef2a81333b21502e910 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Thu, 7 Aug 2014 20:59:37 -0400 Subject: [PATCH 46/60] bump podspec version --- banshee.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banshee.podspec b/banshee.podspec index 142fc64..55b8831 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.7" + s.version = "0.1.8" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 052dbea1443e5e592c0b02dbab42fc47a4a23b41 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Fri, 8 Aug 2014 14:21:12 -0400 Subject: [PATCH 47/60] make bookmarks seed resource customizeable --- Browser/BookmarksController.m | 3 ++- banshee.podspec | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index e4ff964..a373fa9 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -28,6 +28,7 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil if (self) { // Custom initialization. self.folderIndex = BOOKMARKS_ROOT; + self.bookmarksSeedResourceName = BOOKMARKS_SEED_RESOURCE_NAME; [self loadBookmarks]; } return self; @@ -43,7 +44,7 @@ - (void)viewDidLoad { if (foldersDict == nil) { NSString *fname = nil; - fname = [[NSBundle mainBundle] pathForResource:BOOKMARKS_SEED_RESOURCE_NAME ofType:@"strings"]; + fname = [[NSBundle mainBundle] pathForResource:bookmarksSeedResourceName ofType:@"strings"]; NSDictionary *seedBookmarks = [NSDictionary dictionaryWithContentsOfFile:fname]; NSMutableDictionary *foldersDict = [[NSMutableDictionary alloc] init]; diff --git a/banshee.podspec b/banshee.podspec index 55b8831..bac91c6 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.8" + s.version = "0.1.9" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 71442e2b279929b82419e86187da5baae10d8964 Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Wed, 20 Aug 2014 17:37:24 -0400 Subject: [PATCH 48/60] load bookmark icons async --- Browser/BookmarksController.h | 2 +- Browser/BookmarksController.m | 10 ++++++++-- banshee.podspec | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Browser/BookmarksController.h b/Browser/BookmarksController.h index f939538..b614fd9 100644 --- a/Browser/BookmarksController.h +++ b/Browser/BookmarksController.h @@ -69,5 +69,5 @@ -(NSString *) getBookmarkImageURLFromUrlString:(NSString *) urlString; -(UIImage *) getBookmarkImageFromUrlString:(NSString *) urlString; - +-(void) setBookmarkImageForCellWithURL:(NSArray *) args; @end diff --git a/Browser/BookmarksController.m b/Browser/BookmarksController.m index a373fa9..ec3a5ed 100644 --- a/Browser/BookmarksController.m +++ b/Browser/BookmarksController.m @@ -293,6 +293,12 @@ -(UIImage *) getBookmarkImageFromUrlString:(NSString *) urlString { return ([bookmarkImageData length] > 0) ? [UIImage imageWithData:bookmarkImageData] : bookmarkImage; } +-(void) setBookmarkImageForCellWithURL:(NSArray *) args { + BookmarkItem *cell = [args objectAtIndex:0]; + NSString *urlString = [args objectAtIndex:1]; + cell.cellImage.image = [self getBookmarkImageFromUrlString:urlString]; +} + // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { LogTrace(@"%s", __PRETTY_FUNCTION__); @@ -330,8 +336,8 @@ - (UITableViewCell *)tableView:(UITableView *)localTableView cellForRowAtIndexPa NSDictionary* bookmarkDict = [bookmarksArray objectAtIndex:[indexPath row]]; [cell.cellLabel setText:[bookmarkDict valueForKey:@"title"]]; LogInfo(@"Cell Label : %@", cell.cellLabel.text); - cell.cellImage.image = [self getBookmarkImageFromUrlString:[bookmarkDict objectForKey:@"URL"]]; - + // load bookmark icon async + [self performSelectorInBackground:@selector(setBookmarkImageForCellWithURL:) withObject:@[cell, [bookmarkDict objectForKey:@"URL"]] ]; } if (self.mode == 'E') { diff --git a/banshee.podspec b/banshee.podspec index bac91c6..488036d 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.9" + s.version = "0.1.10" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" From 3c6794ab09233ad4931e6afb592bd980bdab2068 Mon Sep 17 00:00:00 2001 From: Alexandru Catighera Date: Thu, 21 Aug 2014 17:20:44 -0400 Subject: [PATCH 49/60] subclass uiwindow to support tap&hold --- Browser/BrowserMainWindow.h | 15 ++++++ Browser/BrowserMainWindow.m | 53 +++++++++++++++++++ Browser/Tab.m | 4 +- README.md | 1 + banshee.podspec | 2 +- .../TestBrowser.xcodeproj/project.pbxproj | 14 ++++- sample-app/TestBrowser/AppDelegate.m | 3 +- 7 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 Browser/BrowserMainWindow.h create mode 100644 Browser/BrowserMainWindow.m diff --git a/Browser/BrowserMainWindow.h b/Browser/BrowserMainWindow.h new file mode 100644 index 0000000..ec6e221 --- /dev/null +++ b/Browser/BrowserMainWindow.h @@ -0,0 +1,15 @@ +// +// BrowserMainWindow.h +// +// Created by Alexandru Catighera on 10/28/13. +// +// + +#import + +@interface BrowserMainWindow : UIWindow { + CGPoint tapLocation; + NSTimer *contextualMenuTimer; +} + +@end diff --git a/Browser/BrowserMainWindow.m b/Browser/BrowserMainWindow.m new file mode 100644 index 0000000..5170742 --- /dev/null +++ b/Browser/BrowserMainWindow.m @@ -0,0 +1,53 @@ +// +// BrowserMainWindow.m +// +// Created by Alexandru Catighera on 10/28/13. +// +// + +#import "BrowserMainWindow.h" + +@implementation BrowserMainWindow + +- (void)tapAndHoldAction:(NSTimer*)timer +{ + contextualMenuTimer = nil; + NSDictionary *coord = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithFloat:tapLocation.x],@"x", + [NSNumber numberWithFloat:tapLocation.y],@"y",nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:@"TapAndHoldNotification" object:coord]; +} + +- (void)sendEvent:(UIEvent *)event +{ + NSSet *touches = [event touchesForWindow:self]; + + [super sendEvent:event]; // Call super to make sure the event is processed as usual + + if ([touches count] == 1) { // We're only interested in one-finger events + UITouch *touch = [touches anyObject]; + + switch ([touch phase]) { + case UITouchPhaseBegan: // A finger touched the screen + tapLocation = [touch locationInView:self]; + [contextualMenuTimer invalidate]; + contextualMenuTimer = [NSTimer scheduledTimerWithTimeInterval:0.8 + target:self selector:@selector(tapAndHoldAction:) + userInfo:nil repeats:NO]; + break; + + case UITouchPhaseEnded: + case UITouchPhaseMoved: + case UITouchPhaseStationary: + case UITouchPhaseCancelled: + [contextualMenuTimer invalidate]; + contextualMenuTimer = nil; + break; + } + } else { // Multiple fingers are touching the screen + [contextualMenuTimer invalidate]; + contextualMenuTimer = nil; + } +} + +@end diff --git a/Browser/Tab.m b/Browser/Tab.m index 43405b7..3d1d491 100644 --- a/Browser/Tab.m +++ b/Browser/Tab.m @@ -69,7 +69,7 @@ -(id) initWithFrame:(CGRect)frame addTarget:(BrowserViewController *) vc { _tabTitleFrame = CGRectMake(3, 0, 80, 22); _tabTitle = [[UILabel alloc] initWithFrame:_tabTitleFrame]; _tabTitle.font = [UIFont systemFontOfSize:11]; - _tabTitle.text = @"Untitled"; + _tabTitle.text = @"New Tab"; // append views [_tabButton addSubview:_tabTitle]; @@ -413,7 +413,7 @@ -(void) webViewDidFinishFinalLoad:(UIWebView *)webView { NSString *tabTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; // NSString *url = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; if ([tabTitle length] == 0) { - _tabTitle.text = @"Untitled"; + _tabTitle.text = @"New Tab"; // [self setTitle:@"Untitled"]; } else { // [self setTitle:tabTitle]; diff --git a/README.md b/README.md index 0b6be8b..842d846 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ The recommended way to integrate the browser code is to make your view controlle In the app delegate you should place this code in your `didFinishLaunchingWithOptions`: + self.window = [[BrowserMainWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window setRootViewController:[[ViewController alloc] init]]; Note: These instructions only work if you create an empty project file. If you create a different type of project like a "single page" app, you will have to use a different approach since story board files are pulled in via plist file. diff --git a/banshee.podspec b/banshee.podspec index 488036d..f5a5f20 100644 --- a/banshee.podspec +++ b/banshee.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "banshee" - s.version = "0.1.10" + s.version = "0.1.11" s.summary = "An iOS browser built on top of UIWebView." s.homepage = "https://github.com/acatighera/banshee" s.screenshots = "https://d1k68i4h6ifyxa.cloudfront.net/screens/banshee_screen1.png" diff --git a/sample-app/TestBrowser.xcodeproj/project.pbxproj b/sample-app/TestBrowser.xcodeproj/project.pbxproj index 3b30966..0d8a9d5 100644 --- a/sample-app/TestBrowser.xcodeproj/project.pbxproj +++ b/sample-app/TestBrowser.xcodeproj/project.pbxproj @@ -15,6 +15,9 @@ B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55118D08D2A005E4834 /* BookmarkFolderFormController.m */; }; B572E55E18D08D2A005E4834 /* BookmarkItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B572E55518D08D2A005E4834 /* BookmarkItem.m */; }; B5A210C218D091F700D65141 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A210C118D091F700D65141 /* Reachability.m */; }; + B5E88BDA19A68C5D0021ED10 /* BrowserMainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E88BD919A68C5D0021ED10 /* BrowserMainWindow.m */; }; + B5E88C1F19A697490021ED10 /* JSTools.js in Sources */ = {isa = PBXBuildFile; fileRef = FAF75EE118A17BFD007B317D /* JSTools.js */; }; + B5E88C2019A698DF0021ED10 /* JSTools.js in Resources */ = {isa = PBXBuildFile; fileRef = FAF75EE118A17BFD007B317D /* JSTools.js */; }; FA157C3019941ACB0002C146 /* bookmarks.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA157C2F19941ACB0002C146 /* bookmarks.strings */; }; FA3CD2AD1993D98800B3ACF0 /* right.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AB1993D98800B3ACF0 /* right.png */; }; FA3CD2AE1993D98800B3ACF0 /* left.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3CD2AC1993D98800B3ACF0 /* left.png */; }; @@ -72,6 +75,8 @@ B572E55618D08D2A005E4834 /* BookmarksController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookmarksController.h; sourceTree = ""; }; B5A210C018D091F700D65141 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = ../Browser/Reachability.h; sourceTree = ""; }; B5A210C118D091F700D65141 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = ../Browser/Reachability.m; sourceTree = ""; }; + B5E88BD819A68C5D0021ED10 /* BrowserMainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserMainWindow.h; sourceTree = ""; }; + B5E88BD919A68C5D0021ED10 /* BrowserMainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserMainWindow.m; sourceTree = ""; }; FA157C2F19941ACB0002C146 /* bookmarks.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = bookmarks.strings; sourceTree = ""; }; FA3CD2AB1993D98800B3ACF0 /* right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = right.png; sourceTree = ""; }; FA3CD2AC1993D98800B3ACF0 /* left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = left.png; sourceTree = ""; }; @@ -266,6 +271,8 @@ B572E54718D08D2A005E4834 /* Tab.m */, B572E54E18D08D2A005E4834 /* UIMainView.h */, B572E54F18D08D2A005E4834 /* UIMainView.m */, + B5E88BD819A68C5D0021ED10 /* BrowserMainWindow.h */, + B5E88BD919A68C5D0021ED10 /* BrowserMainWindow.m */, B5A210C018D091F700D65141 /* Reachability.h */, B5A210C118D091F700D65141 /* Reachability.m */, B572E54B18D08D2A005E4834 /* BrowserViewController.h */, @@ -356,6 +363,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B5E88C2019A698DF0021ED10 /* JSTools.js in Resources */, FAF75EA518A17A77007B317D /* MainWindow-iPad.xib in Resources */, FAA4557D18A19F7A00B1BDF4 /* bookmarks.png in Resources */, FAF75EE918A17BFD007B317D /* gray-pixel.png in Resources */, @@ -403,9 +411,11 @@ FAC9B26E16F27BF800E37710 /* AppDelegate.m in Sources */, B572E55B18D08D2A005E4834 /* UIMainView.m in Sources */, B572E55818D08D2A005E4834 /* BookmarksController.m in Sources */, + B5E88BDA19A68C5D0021ED10 /* BrowserMainWindow.m in Sources */, B572E55A18D08D2A005E4834 /* BrowserViewController.m in Sources */, FAC9B27716F27BF800E37710 /* ViewController.m in Sources */, B572E55C18D08D2A005E4834 /* BookmarkFolderFormController.m in Sources */, + B5E88C1F19A697490021ED10 /* JSTools.js in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -489,7 +499,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TestBrowser/TestBrowser-Prefix.pch"; INFOPLIST_FILE = "TestBrowser/TestBrowser-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -501,7 +511,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "TestBrowser/TestBrowser-Prefix.pch"; INFOPLIST_FILE = "TestBrowser/TestBrowser-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/sample-app/TestBrowser/AppDelegate.m b/sample-app/TestBrowser/AppDelegate.m index 934ab16..a11c3dd 100644 --- a/sample-app/TestBrowser/AppDelegate.m +++ b/sample-app/TestBrowser/AppDelegate.m @@ -8,6 +8,7 @@ #import "AppDelegate.h" #import "BrowserViewController.h" +#import "BrowserMainWindow.h" @implementation AppDelegate @@ -15,7 +16,7 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window = [[BrowserMainWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.viewController = [[BrowserViewController alloc] init]; From 8a9863b237189911e9441aa9ecdc56dfcc11965e Mon Sep 17 00:00:00 2001 From: Alex Catighera Date: Mon, 25 Aug 2014 21:13:01 -0400 Subject: [PATCH 50/60] fix some design issues on ipad and also for tabs --- Browser Resources/MainWindow-iPad.xib | 25 +++++++++++++++---------- Browser/Tab.m | 2 +- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Browser Resources/MainWindow-iPad.xib b/Browser Resources/MainWindow-iPad.xib index 7f7c693..8186db2 100644 --- a/Browser Resources/MainWindow-iPad.xib +++ b/Browser Resources/MainWindow-iPad.xib @@ -1,7 +1,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -159,11 +159,11 @@ - + - - + + @@ -172,16 +172,21 @@ + + + + + - + - + @@ -190,12 +195,12 @@ - + - + - +