From a20544e8d5f339a0793b691a1261e239b495e99d Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Thu, 22 Nov 2012 17:11:04 +0200 Subject: [PATCH] Show a search bar when there is at least one object in a folder Show a search bar in the folder view controller, when there is at least one object. In iPad the search bar is fixed at the top, while in iPhone it is on the top of the tableview, and scrolled off screen initially. Improve the Folder model class and other relevant code. --- Classes/AddFolderViewController.m | 3 +- Classes/AddPhotoViewController.m | 3 +- Classes/ContainerDetailViewController.m | 4 +- Classes/ContainersViewController.m | 2 +- Classes/EditMetadataViewController.m | 2 +- Classes/EditPermissionsViewController.m | 2 +- Classes/Folder.h | 8 ++ Classes/Folder.m | 34 +++++++- Classes/FolderViewController.h | 3 + Classes/FolderViewController.m | 79 ++++++++++++++---- Classes/FolderViewController.xib | 129 ++++------------------------- Classes/StorageObjectViewController.h | 1 - Classes/StorageObjectViewController.m | 12 +-- Classes/UploadGenericFileViewController.m | 3 +- 14 files changed, 140 insertions(+), 145 deletions(-) diff --git a/Classes/AddFolderViewController.m b/Classes/AddFolderViewController.m index ecfdc4a..bb7431f 100755 --- a/Classes/AddFolderViewController.m +++ b/Classes/AddFolderViewController.m @@ -106,8 +106,9 @@ if ([folderViewController.folder isEqual:container.rootFolder]) { currentFolderIsRoot = YES; } - [folder.folders setObject:newFolder forKey:newFolder.name]; + [folder addFolder:newFolder]; [folderViewController.tableView reloadData]; + folderViewController.folder = folderViewController.folder; if (currentFolderIsRoot) { container.count += 1; container.rootFolder = folder; diff --git a/Classes/AddPhotoViewController.m b/Classes/AddPhotoViewController.m index 2a1fe23..36f5afc 100755 --- a/Classes/AddPhotoViewController.m +++ b/Classes/AddPhotoViewController.m @@ -403,8 +403,9 @@ if ([folderViewController.folder isEqual:container.rootFolder]) { currentFolderIsRoot = YES; } - [folder.objects setObject:object forKey:object.name]; + [folder addObject:object]; [folderViewController.tableView reloadData]; + folderViewController.folder = folderViewController.folder; if (currentFolderIsRoot) { container.count += 1; container.rootFolder = folder; diff --git a/Classes/ContainerDetailViewController.m b/Classes/ContainerDetailViewController.m index c703f31..062baf3 100755 --- a/Classes/ContainerDetailViewController.m +++ b/Classes/ContainerDetailViewController.m @@ -154,7 +154,7 @@ cell.textLabel.text = @"Delete Container"; } if ((self.container.count == 0) || - (self.container.rootFolder && ([self.container.rootFolder.folders count] + [self.container.rootFolder.objects count] == 0))) { + (self.container.rootFolder && !self.container.rootFolder.objectsAndFoldersCount)) { cell.textLabel.textColor = [UIColor blackColor]; cell.selectionStyle = UITableViewCellSelectionStyleBlue; } else { @@ -290,7 +290,7 @@ [vc release]; } } else if (indexPath.section == deleteSection) { - if (self.container.count == 0 || ([self.container.rootFolder.folders count] + [self.container.rootFolder.objects count] == 0)) { + if (self.container.count == 0 || !self.container.rootFolder.objectsAndFoldersCount) { UIActionSheet *deleteActionSheet = [[[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this container? This operation cannot be undone." delegate:self cancelButtonTitle:@"Cancel" diff --git a/Classes/ContainersViewController.m b/Classes/ContainersViewController.m index 980cb64..db70246 100755 --- a/Classes/ContainersViewController.m +++ b/Classes/ContainersViewController.m @@ -222,10 +222,10 @@ FolderViewController *vc = [[FolderViewController alloc] initWithNibName:@"FolderViewController" bundle:nil]; vc.account = self.account; vc.container = container; - vc.folder = container.rootFolder; vc.containersViewController = self; vc.selectedContainerIndexPath = indexPath; [self.navigationController pushViewController:vc animated:YES]; + vc.folder = container.rootFolder; [vc release]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } diff --git a/Classes/EditMetadataViewController.m b/Classes/EditMetadataViewController.m index 1db7aa7..57b8aa0 100644 --- a/Classes/EditMetadataViewController.m +++ b/Classes/EditMetadataViewController.m @@ -361,7 +361,7 @@ newFolder.parent = folderViewController.folder; newFolder.sharing = folderViewController.folder.sharing; newFolder.metadata = object.metadata; - [folderViewController.folder.folders setObject:newFolder forKey:newFolder.name]; + [folderViewController.folder addFolder:newFolder]; [activityIndicatorView removeFromSuperview]; [newFolder release]; self.metadataKey = userInputMetaKey; diff --git a/Classes/EditPermissionsViewController.m b/Classes/EditPermissionsViewController.m index dc44e8b..1966a9e 100644 --- a/Classes/EditPermissionsViewController.m +++ b/Classes/EditPermissionsViewController.m @@ -402,7 +402,7 @@ newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject]; newFolder.parent = folderViewController.folder; newFolder.sharing = folderViewController.folder.sharing; - [folderViewController.folder.folders setObject:newFolder forKey:newFolder.name]; + [folderViewController.folder addFolder:newFolder]; [activityIndicatorView removeFromSuperview]; [newFolder release]; [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; diff --git a/Classes/Folder.h b/Classes/Folder.h index 7763ea9..fdedf0f 100755 --- a/Classes/Folder.h +++ b/Classes/Folder.h @@ -15,6 +15,8 @@ // 3. folder/def.txt // In this case, there would be a folder object for files 2 and 3 +@class StorageObject; + @interface Folder : NSObject { NSString *name; Folder *parent; @@ -36,8 +38,14 @@ @property (nonatomic, retain) NSMutableDictionary *metadata; @property (nonatomic, retain) NSString *contentType; +@property (nonatomic, readonly) NSUInteger objectsAndFoldersCount; + + (id)folder; - (NSArray *)sortedContents; - (NSString *)fullPath; +- (void)addFolder:(Folder *)aFolder; +- (void)addObject:(StorageObject *)anObject; +- (void)removeFolder:(Folder *)aFolder; +- (void)removeObject:(StorageObject *)anObject; @end diff --git a/Classes/Folder.m b/Classes/Folder.m index cb9daac..09e6155 100755 --- a/Classes/Folder.m +++ b/Classes/Folder.m @@ -13,7 +13,7 @@ @implementation Folder -@synthesize name, parent, objects, folders, sharing, metadata, contentType; +@synthesize name, parent, objects, folders, sharing, metadata, contentType, objectsAndFoldersCount; #pragma mark - Object lifecycle @@ -142,6 +142,10 @@ return sortedContents; } +- (NSUInteger)objectsAndFoldersCount { + return (self.objects.count + self.folders.count); +} + #pragma mark - Actions - (NSString *)fullPath { @@ -154,4 +158,32 @@ } } +- (void)addFolder:(Folder *)aFolder { + [self.folders setObject:aFolder forKey:aFolder.name]; + [sortedContents release]; + sortedContents = nil; +} + +- (void)addObject:(StorageObject *)anObject { + [self.objects setObject:anObject forKey:anObject.name]; + [sortedContents release]; + sortedContents = nil; +} + +- (void)removeFolder:(Folder *)aFolder { + if ([self.folders objectForKey:aFolder.name]) { + [self.folders removeObjectForKey:aFolder.name]; + [sortedContents release]; + sortedContents = nil; + } +} + +- (void)removeObject:(StorageObject *)anObject { + if ([self.objects objectForKey:anObject.name]) { + [self.objects removeObjectForKey:anObject.name]; + [sortedContents release]; + sortedContents = nil; + } +} + @end diff --git a/Classes/FolderViewController.h b/Classes/FolderViewController.h index 326b931..00077cc 100755 --- a/Classes/FolderViewController.h +++ b/Classes/FolderViewController.h @@ -30,6 +30,8 @@ IBOutlet UITableView *tableView; IBOutlet UIBarButtonItem *homeButton; IBOutlet UIBarButtonItem *refreshButton; + UISearchBar *searchBar; + FolderDetailViewController *folderDetailVC; StorageObjectViewController *selectedObjectViewController; } @@ -47,6 +49,7 @@ @property (nonatomic, assign) BOOL refreshWhenAppeared; @property (nonatomic, retain) IBOutlet UITableView *tableView; @property (nonatomic, retain) IBOutlet UIBarButtonItem *refreshButton; +@property (nonatomic, readonly) UISearchBar *searchBar; @property (nonatomic, assign) FolderDetailViewController *folderDetailVC; @property (nonatomic, assign) StorageObjectViewController *selectedObjectViewController; diff --git a/Classes/FolderViewController.m b/Classes/FolderViewController.m index 28ca287..cf2e762 100755 --- a/Classes/FolderViewController.m +++ b/Classes/FolderViewController.m @@ -32,7 +32,7 @@ @implementation FolderViewController -@synthesize account, container, folder, containersViewController, selectedContainerIndexPath, contentsLoaded, parentFolderViewController, selectedFolderIndexPath, tableView, needsRefreshing, folderHasBeenRemoved, refreshWhenAppeared, folderDetailVC, selectedObjectViewController, refreshButton; +@synthesize account, container, folder, containersViewController, selectedContainerIndexPath, contentsLoaded, parentFolderViewController, selectedFolderIndexPath, tableView, needsRefreshing, folderHasBeenRemoved, refreshWhenAppeared, folderDetailVC, selectedObjectViewController, refreshButton, searchBar; #pragma mark - View lifecycle @@ -68,7 +68,7 @@ [self refreshButtonPressed:nil]; refreshWhenAppeared = NO; } - if (account.shared && ([folder.folders count] + [folder.objects count] == 0)) { + if (account.shared && !folder.objectsAndFoldersCount) { [self.navigationController popViewControllerAnimated:YES]; } } @@ -94,11 +94,43 @@ [parentFolderViewController release]; [selectedFolderIndexPath release]; [refreshButton release]; + [searchBar release]; [super dealloc]; } #pragma mark - Internal +- (void)showSearchBar:(BOOL)show { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + if (show && self.searchBar.hidden) { + // Add search bar above the tableview + CGRect tableViewFrame = self.tableView.frame; + tableViewFrame.origin.y += 44.0; + tableViewFrame.size.height -= 44.0; + self.tableView.frame = tableViewFrame; + self.searchBar.hidden = NO; + [self.view addSubview:self.searchBar]; + } else if (!show && !self.searchBar.hidden) { + // Remove search bar above the tableview + CGRect tableViewFrame = self.tableView.frame; + tableViewFrame.origin.y -= 44.0; + tableViewFrame.size.height += 44.0; + self.tableView.frame = tableViewFrame; + [self.searchBar removeFromSuperview]; + self.searchBar.hidden = YES; + } + } else { + if (show && ![self.tableView.tableHeaderView isEqual:self.searchBar]) { + self.searchBar.hidden = NO; + self.tableView.tableHeaderView = self.searchBar; + self.tableView.contentOffset = CGPointMake(0.0, 44.0); + } else if (!show) { + self.tableView.tableHeaderView = nil; + self.searchBar.hidden = YES; + } + } +} + - (void)reloadFolderViewControllers { NSArray *viewControllers = [self.navigationController viewControllers]; @@ -118,7 +150,7 @@ folderViewController.folderHasBeenRemoved = YES; } } - if (!self.folder || (account.shared && [folder.folders count] + [folder.objects count] == 0)) { + if (!self.folder || (account.shared && !folder.objectsAndFoldersCount)) { if (needsRefreshing && self.parentFolderViewController) { self.parentFolderViewController.needsRefreshing = YES; } @@ -128,6 +160,23 @@ } } +#pragma mark - Properties + +- (UISearchBar *)searchBar { + if (!searchBar) { + searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)]; + searchBar.barStyle = UIBarStyleBlack; + searchBar.hidden = YES; + } + return searchBar; +} + +- (void)setFolder:(Folder *)aFolder { + [folder release]; + folder = [aFolder retain]; + [self showSearchBar:(self.contentsLoaded && self.folder && self.folder.objectsAndFoldersCount)]; +} + #pragma mark - Actions - (void)setDetailViewController { @@ -156,11 +205,11 @@ #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { - return MAX(contentsLoaded ? 1 : 0, [folder.objects count] + [folder.folders count]); + return MAX(contentsLoaded ? 1 : 0, folder.objectsAndFoldersCount); } - (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - if ([folder.objects count] + [folder.folders count] == 0) { + if (!folder.objectsAndFoldersCount) { aTableView.scrollEnabled = NO; aTableView.allowsSelection = NO; return aTableView.frame.size.height; @@ -172,7 +221,7 @@ } - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - if ([folder.objects count] + [folder.folders count] == 0) { + if (!folder.objectsAndFoldersCount) { NSString *noFoldersTitle = (self.account.shared || self.account.sharingAccount) ? @"No shared Files or Folders" : @"No Files or Folders"; NSString *noFoldersSubtitle = (self.account.shared || self.account.sharingAccount || [self.folder.name hasSuffix:@"/"]) ? @@ -258,18 +307,18 @@ #pragma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if ([folder.objects count] + [folder.folders count] > 0) { - id item = [self.folder.sortedContents objectAtIndex:indexPath.row]; + if (folder.objectsAndFoldersCount) { + id item = [self.folder.sortedContents objectAtIndex:indexPath.row]; if ([[item class] isEqual:[Folder class]]) { FolderViewController *vc = [[FolderViewController alloc] initWithNibName:@"FolderViewController" bundle:nil]; vc.account = self.account; vc.container = self.container; - vc.folder = item; - vc.contentsLoaded = YES; vc.selectedFolderIndexPath = indexPath; vc.parentFolderViewController = self; vc.containersViewController = self.containersViewController; [self.navigationController pushViewController:vc animated:YES]; + vc.contentsLoaded = YES; + vc.folder = item; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { Folder *folderForDetailView; @@ -421,9 +470,9 @@ [[self.account.manager deleteObject:self.container object:object] success:^(OpenStackRequest *request) { if (self.folder.parent) { - [self.folder.parent.folders removeObjectForKey:self.folder.name]; + [self.folder.parent removeFolder:self.folder]; } else { - [self.container.rootFolder.folders removeObjectForKey:self.folder.name]; + [self.container.rootFolder removeFolder:self.folder]; } [self.account persist]; @@ -431,8 +480,9 @@ [self.navigationController popViewControllerAnimated:YES]; if (self.folder.parent) { - if ([self.folder.parent.folders count] + [self.folder.parent.objects count] == 0) { + if (!self.folder.parent.objectsAndFoldersCount) { [self.parentFolderViewController.tableView reloadData]; + self.parentFolderViewController.folder = self.parentFolderViewController.folder; } else { [self.parentFolderViewController.tableView selectRowAtIndexPath:selectedFolderIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteFolderRow) userInfo:nil repeats:NO]; @@ -440,8 +490,9 @@ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) [self.parentFolderViewController setDetailViewController]; } else { - if ([self.container.rootFolder.folders count] + [self.container.rootFolder.objects count] == 0) { + if (!self.container.rootFolder.objectsAndFoldersCount) { [self.parentFolderViewController.tableView reloadData]; + self.parentFolderViewController.folder = self.parentFolderViewController.folder; } else { [self.parentFolderViewController.tableView selectRowAtIndexPath:selectedFolderIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteFolderRow) userInfo:nil repeats:NO]; diff --git a/Classes/FolderViewController.xib b/Classes/FolderViewController.xib index b708b23..2ea8204 100755 --- a/Classes/FolderViewController.xib +++ b/Classes/FolderViewController.xib @@ -1,22 +1,22 @@ - 1296 - 11E53 - 2182 - 1138.47 + 1536 + 11G63 + 2843 + 1138.51 569.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 + 1929 YES + IBProxyObject IBUIBarButtonItem IBUITableView IBUIToolbar IBUIView - IBProxyObject YES @@ -46,7 +46,7 @@ 266 {{0, 416}, {320, 44}} - + NO NO IBCocoaTouchFramework @@ -70,7 +70,6 @@ 274 {320, 416} - 3 @@ -89,7 +88,6 @@ {320, 460} - 3 @@ -196,6 +194,9 @@ 10 + + YES + Table View @@ -266,116 +267,14 @@ - 28 - - - - YES - - FolderViewController - OpenStackViewController - - YES - - YES - homeButtonPressed: - refreshButtonPressed: - - - YES - id - id - - - - YES - - YES - homeButtonPressed: - refreshButtonPressed: - - - YES - - homeButtonPressed: - id - - - refreshButtonPressed: - id - - - - - YES - - YES - homeButton - refreshButton - tableView - - - YES - UIBarButtonItem - UIBarButtonItem - UITableView - - - - YES - - YES - homeButton - refreshButton - tableView - - - YES - - homeButton - UIBarButtonItem - - - refreshButton - UIBarButtonItem - - - tableView - UITableView - - - - - IBProjectSource - ./Classes/FolderViewController.h - - - - OpenStackViewController - UIViewController - - toolbar - UIToolbar - - - toolbar - - toolbar - UIToolbar - - - - IBProjectSource - ./Classes/OpenStackViewController.h - - - + 30 + 0 IBCocoaTouchFramework com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 @@ -383,6 +282,6 @@ YES 3 - 1181 + 1929 diff --git a/Classes/StorageObjectViewController.h b/Classes/StorageObjectViewController.h index c9bf5b4..e8a4c59 100755 --- a/Classes/StorageObjectViewController.h +++ b/Classes/StorageObjectViewController.h @@ -22,7 +22,6 @@ Container *container; Folder *folder; StorageObject *object; - BOOL performingAction; BOOL fileDownloaded; AnimatedProgressView *downloadProgressView; BOOL fileDownloading; diff --git a/Classes/StorageObjectViewController.m b/Classes/StorageObjectViewController.m index 63ef842..e8e5f88 100755 --- a/Classes/StorageObjectViewController.m +++ b/Classes/StorageObjectViewController.m @@ -629,7 +629,7 @@ #pragma mark Action Sheet Delegate - (void)deleteObjectRow { - [self.folder.objects removeObjectForKey:self.object.name]; + [self.folder removeObject:self.object]; [self.folderViewController.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:selectedIndexPath] withRowAnimation:UITableViewRowAnimationLeft]; self.folderViewController.refreshButton.enabled = YES; } @@ -647,7 +647,6 @@ [[self.account.manager deleteObject:self.container object:self.object] success:^(OpenStackRequest *request) { [activityIndicatorView removeFromSuperview]; - performingAction = NO; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self.navigationController popViewControllerAnimated:YES]; if (account.shared) @@ -658,12 +657,14 @@ [self.folderViewController setDetailViewController]; else [self.folderViewController refreshButtonPressed:nil]; + self.folderViewController.refreshButton.enabled = YES; } if (self.folder.objects.count == 1) - [self.folder.objects removeObjectForKey:self.object.name]; + [self.folder removeObject:self.object]; - if ([self.folder.objects count] + [self.folder.folders count] == 0) { + if (!self.folder.objectsAndFoldersCount) { [self.folderViewController.tableView reloadData]; + self.folderViewController.folder = self.folderViewController.folder; } else { [self.folderViewController.tableView selectRowAtIndexPath:selectedIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteObjectRow) userInfo:nil repeats:NO]; @@ -672,8 +673,7 @@ failure:^(OpenStackRequest *request) { [activityIndicatorView removeFromSuperview]; [self hideToolbarActivityMessage]; - performingAction = NO; - [self alert:@"There was a problem deleting this file." request:request]; + [self alert:@"There was a problem deleting this file." request:request]; }]; } NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:deleteSection]; diff --git a/Classes/UploadGenericFileViewController.m b/Classes/UploadGenericFileViewController.m index ccbd5cb..2174dab 100755 --- a/Classes/UploadGenericFileViewController.m +++ b/Classes/UploadGenericFileViewController.m @@ -266,8 +266,9 @@ if ([folderViewController.folder isEqual:container.rootFolder]) { currentFolderIsRoot = YES; } - [folder.objects setObject:object forKey:object.name]; + [folder addObject:object]; [folderViewController.tableView reloadData]; + folderViewController.folder = folderViewController.folder; if (currentFolderIsRoot) { container.count += 1; container.rootFolder = folder; -- 1.7.10.4