2 // AddFolderViewController.m
5 // Created by Mike Mayo on 1/4/11.
6 // Copyright 2011 __MyCompanyName__. All rights reserved.
9 #import "AddFolderViewController.h"
10 #import "RSTextFieldCell.h"
11 #import "ActivityIndicatorView.h"
12 #import "UIViewController+Conveniences.h"
13 #import "OpenStackAccount.h"
14 #import "AccountManager.h"
17 #import "StorageObject.h"
18 #import "FolderViewController.h"
19 #import "APICallback.h"
21 @implementation AddFolderViewController
23 @synthesize account, container, folder, folderViewController;
25 #pragma mark - View lifecycle
27 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
28 return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
33 self.navigationItem.title = @"Add Folder";
37 - (void)viewDidAppear:(BOOL)animated {
38 [super viewDidAppear:animated];
39 [textField becomeFirstResponder];
42 #pragma mark - Memory management
48 [folderViewController release];
52 #pragma mark - UITableViewDataSource
54 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
58 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
59 static NSString *cellIdentifier = @"FolderNameCell";
60 RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
62 cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier] autorelease];
63 cell.modalPresentationStyle = UIModalPresentationFormSheet;
64 textField = cell.textField;
65 textField.delegate = self;
66 textField.clearButtonMode = UITextFieldViewModeWhileEditing;
68 cell.textLabel.text = @"Name";
72 #pragma mark - UITextFieldDelegate
74 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
75 [self saveButtonPressed:nil];
79 #pragma mark - UIAlertViewDelegate
81 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
82 if (buttonIndex == 1) {
84 [self saveButtonPressed:nil];
88 #pragma mark - Button handlers
90 - (void)saveButtonPressed:(id)sender {
91 if ([textField.text isEqualToString:@""]) {
92 [self alert:@"Folder Name Required" message:@"Please enter a folder name."];
94 [textField resignFirstResponder];
96 BOOL objectNameHasTrailingSlash = [textField.text hasSuffix:@"/"];
97 NSUInteger indexOfFirstSlash = [textField.text rangeOfString:@"/"].location;
98 if ((!objectNameHasTrailingSlash && indexOfFirstSlash != NSNotFound) ||
99 (objectNameHasTrailingSlash && indexOfFirstSlash < textField.text.length - 1)) {
100 [self alert:@"Invalid folder name" message:@"'/' characters are only allowed at the end of folder names"];
104 if (folder && folder.name) {
105 objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text];
107 objectName = textField.text;
110 if ([folderViewController.folder.folders objectForKey:objectName] && !allowOverwrite) {
111 NSString *alertMessage = [NSString stringWithFormat:@"An object with path '%@' in the container '%@' already exists, do you want to replace it?",
112 objectName, folderViewController.container.name];
113 NSString *alertTitle = @"Apply changes";
114 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
117 cancelButtonTitle:@"Cancel"
118 otherButtonTitles:@"OK", nil];
124 StorageObject *object = [[StorageObject alloc] init];
125 object.name = object.fullPath = objectName;
126 object.data = [NSData data];
127 object.contentType = @"application/directory";
129 __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Adding folder..."
130 andAddToView:self.view];
131 [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
132 success:^(OpenStackRequest *request) {
133 Folder *newFolder = [[Folder alloc] init];
134 if (objectNameHasTrailingSlash)
135 object.name = [object.name substringToIndex:object.name.length - 1];
136 newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
137 if (objectNameHasTrailingSlash)
138 newFolder.name = [newFolder.name stringByAppendingString:@"/"];
139 newFolder.parent = folder;
140 newFolder.sharing = folder.sharing;
141 BOOL currentFolderIsRoot = (folderViewController.folder == container.rootFolder);
142 [folder addFolder:newFolder];
143 folderViewController.folder = folderViewController.folder;
144 if (currentFolderIsRoot) {
145 container.count += 1;
146 container.rootFolder = folder;
149 [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
150 [self dismissModalViewControllerAnimated:YES];
154 failure:^(OpenStackRequest *request) {
156 [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
157 [self alert:@"There was a problem creating this folder." request:request];