Show activity indicator views when creating or refreshing containers
[pithos-ios] / Classes / AddFolderViewController.m
index 4172105..b8f8781 100755 (executable)
 #import "FolderViewController.h"
 #import "APICallback.h"
 
-
 @implementation AddFolderViewController
 
 @synthesize account, container, folder, folderViewController;
 
+#pragma mark - View lifecycle
+
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
     return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
 }
 
-#pragma mark -
-#pragma mark View lifecycle
-
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.navigationItem.title = @"Add Folder";
     [textField becomeFirstResponder];
 }
 
-#pragma mark -
-#pragma mark Save Button
+#pragma mark - Memory management
 
-- (void)saveButtonPressed:(id)sender {    
-    if (!saving) {        
-        if ([textField.text isEqualToString:@""]) {
-            [self alert:@"Folder Name Required" message:@"Please enter a folder name."];
-        } else {
-            [textField resignFirstResponder];
-            NSString *objectName;
-            BOOL objectNameHasTrailingSlash = [textField.text hasSuffix:@"/"];
-            NSUInteger indexOfFirstSlash = [textField.text rangeOfString:@"/"].location;
-            
-            if ((!objectNameHasTrailingSlash && indexOfFirstSlash != NSNotFound) || 
-                (objectNameHasTrailingSlash && indexOfFirstSlash < textField.text.length - 1)) {
-                [self alert:@"Invalid folder name" message:@"'/' characters are only allowed at the end of folder names"];
-                return;
-            }
-                
-            if (folder && folder.name) {
-                objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text];
-            } else {
-                objectName = textField.text;
-            }
-            
-            if ([folderViewController.folder.folders objectForKey:objectName] && !allowOverwrite) {
-                NSString *alertMessage = [NSString stringWithFormat:@"An object with path '%@' in the container '%@' already exists, do you want to replace it?",objectName, folderViewController.container.name];
-                NSString *alertTitle = @"Apply changes";
-                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
-                                                                message:alertMessage
-                                                               delegate:self
-                                                      cancelButtonTitle:@"Cancel"
-                                                      otherButtonTitles:@"OK", nil];
-                [alert show];
-                [alert release];
-                return;
-            }
-
-            StorageObject *object = [[StorageObject alloc] init];
-            object.name = object.fullPath = objectName;
-            object.data = [NSData data];
-            object.contentType = @"application/directory";
-            
-            __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Adding folder..."
-                                                                                                           andAddToView:self.view];
-            [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
-             success:^(OpenStackRequest *request) {
-                 Folder *newFolder = [[Folder alloc] init];
-                 if (objectNameHasTrailingSlash)
-                     object.name = [object.name substringToIndex:object.name.length - 1];
-                 newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
-                 if (objectNameHasTrailingSlash)
-                     newFolder.name = [newFolder.name stringByAppendingString:@"/"];
-                 newFolder.parent = folder;
-                 newFolder.sharing = folder.sharing;
-                 BOOL currentFolderIsRoot = NO;
-                 if ([folderViewController.folder isEqual:container.rootFolder]) {
-                     currentFolderIsRoot = YES;
-                 }
-                 [folder addFolder:newFolder];
-                 folderViewController.folder = folderViewController.folder;
-                 if (currentFolderIsRoot) {
-                     container.count += 1;
-                     container.rootFolder = folder;
-                     [self.account.containers setObject:container forKey:container.name];
-                 }
-                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
-                     [folderViewController setDetailViewController];
-                 
-                 allowOverwrite = NO;
-                 [activityIndicatorView removeFromSuperview];
-                 [self dismissModalViewControllerAnimated:YES];
-                 [newFolder release];
-                 [object release];
-             }
-             failure:^(OpenStackRequest *request) {
-                 allowOverwrite = NO;
-                 [activityIndicatorView removeFromSuperview];
-                 [self alert:@"There was a problem creating this folder." request:request];
-                 [object release];
-             }];
-        }
-    }
+- (void)dealloc {
+    [account release];
+    [container release];
+    [folder release];
+    [folderViewController release];
+    [super dealloc];
 }
 
-#pragma mark -
-#pragma mark Table view data source
-
-- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
-    return 1;
-}
+#pragma mark - UITableViewDataSource
 
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return 1;
 }
 
-- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
-    return @"If your folder name contains any forward slash characters, multiple folder objects will be created.";
-}
-
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
-    static NSString *CellIdentifier = @"FolderNameCell";
-    RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+    static NSString *cellIdentifier = @"FolderNameCell";
+    RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
     if (cell == nil) {
-        cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
+        cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier] autorelease];
         cell.modalPresentationStyle = UIModalPresentationFormSheet;
                textField = cell.textField;
         textField.delegate = self;
                textField.clearButtonMode = UITextFieldViewModeWhileEditing;
-    }    
+    }
     cell.textLabel.text = @"Name";
     return cell;
 }
 
-#pragma mark - Alertview delegate
-
-- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
-{
-    if (buttonIndex == 1) {
-        allowOverwrite = YES;
-        [self saveButtonPressed:nil];
-    } 
-}
-
-
-#pragma mark -
-#pragma mark Text Field Delegate
+#pragma mark - UITextFieldDelegate
 
 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
     [self saveButtonPressed:nil];
     return NO;
 }
 
-#pragma mark -
-#pragma mark Memory management
+#pragma mark - UIAlertViewDelegate
 
-- (void)dealloc {
-    [account release];
-    [container release];
-    [folder release];
-    [folderViewController release];
-    [super dealloc];
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+    if (buttonIndex == 1) {
+        allowOverwrite = YES;
+        [self saveButtonPressed:nil];
+    }
+}
+
+#pragma mark - Button handlers
+
+- (void)saveButtonPressed:(id)sender {
+    if ([textField.text isEqualToString:@""]) {
+        [self alert:@"Folder Name Required" message:@"Please enter a folder name."];
+    } else {
+        [textField resignFirstResponder];
+        NSString *objectName;
+        BOOL objectNameHasTrailingSlash = [textField.text hasSuffix:@"/"];
+        NSUInteger indexOfFirstSlash = [textField.text rangeOfString:@"/"].location;
+        if ((!objectNameHasTrailingSlash && indexOfFirstSlash != NSNotFound) ||
+            (objectNameHasTrailingSlash && indexOfFirstSlash < textField.text.length - 1)) {
+            [self alert:@"Invalid folder name" message:@"'/' characters are only allowed at the end of folder names"];
+            return;
+        }
+            
+        if (folder && folder.name) {
+            objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text];
+        } else {
+            objectName = textField.text;
+        }
+        
+        if ([folderViewController.folder.folders objectForKey:objectName] && !allowOverwrite) {
+            NSString *alertMessage = [NSString stringWithFormat:@"An object with path '%@' in the container '%@' already exists, do you want to replace it?",
+                                      objectName, folderViewController.container.name];
+            NSString *alertTitle = @"Apply changes";
+            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
+                                                            message:alertMessage
+                                                           delegate:self
+                                                  cancelButtonTitle:@"Cancel"
+                                                  otherButtonTitles:@"OK", nil];
+            [alert show];
+            [alert release];
+            return;
+        }
+
+        StorageObject *object = [[StorageObject alloc] init];
+        object.name = object.fullPath = objectName;
+        object.data = [NSData data];
+        object.contentType = @"application/directory";
+        
+        __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Adding folder..."
+                                                                                                       andAddToView:self.view];
+        [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
+         success:^(OpenStackRequest *request) {
+             Folder *newFolder = [[Folder alloc] init];
+             if (objectNameHasTrailingSlash)
+                 object.name = [object.name substringToIndex:object.name.length - 1];
+             newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
+             if (objectNameHasTrailingSlash)
+                 newFolder.name = [newFolder.name stringByAppendingString:@"/"];
+             newFolder.parent = folder;
+             newFolder.sharing = folder.sharing;
+             BOOL currentFolderIsRoot = NO;
+             if ([folderViewController.folder isEqual:container.rootFolder]) {
+                 currentFolderIsRoot = YES;
+             }
+             [folder addFolder:newFolder];
+             folderViewController.folder = folderViewController.folder;
+             if (currentFolderIsRoot) {
+                 container.count += 1;
+                 container.rootFolder = folder;
+                 [self.account.containers setObject:container forKey:container.name];
+             }
+             if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+                 [folderViewController setDetailViewController];
+             
+             allowOverwrite = NO;
+             [activityIndicatorView removeFromSuperview];
+             [self dismissModalViewControllerAnimated:YES];
+             [newFolder release];
+             [object release];
+         }
+         failure:^(OpenStackRequest *request) {
+             allowOverwrite = NO;
+             [activityIndicatorView removeFromSuperview];
+             [self alert:@"There was a problem creating this folder." request:request];
+             [object release];
+         }];
+    }
 }
 
 @end