Update version
[pithos-ios] / Classes / AddFolderViewController.m
1 //
2 //  AddFolderViewController.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 1/4/11.
6 //  Copyright 2011 __MyCompanyName__. All rights reserved.
7 //
8
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"
15 #import "Container.h"
16 #import "Folder.h"
17 #import "StorageObject.h"
18 #import "FolderViewController.h"
19 #import "APICallback.h"
20
21 @implementation AddFolderViewController
22
23 @synthesize account, container, folder, folderViewController;
24
25 #pragma mark - View lifecycle
26
27 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
28     return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
29 }
30
31 - (void)viewDidLoad {
32     [super viewDidLoad];
33     self.navigationItem.title = @"Add Folder";
34     [self addSaveButton];
35 }
36
37 - (void)viewDidAppear:(BOOL)animated {
38     [super viewDidAppear:animated];
39     [textField becomeFirstResponder];
40 }
41
42 #pragma mark - Memory management
43
44 - (void)dealloc {
45     [account release];
46     [container release];
47     [folder release];
48     [folderViewController release];
49     [super dealloc];
50 }
51
52 #pragma mark - UITableViewDataSource
53
54 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
55     return 1;
56 }
57
58 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
59     static NSString *cellIdentifier = @"FolderNameCell";
60     RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
61     if (cell == nil) {
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;
67     }
68     cell.textLabel.text = @"Name";
69     return cell;
70 }
71
72 #pragma mark - UITextFieldDelegate
73
74 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
75     [self saveButtonPressed:nil];
76     return NO;
77 }
78
79 #pragma mark - UIAlertViewDelegate
80
81 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
82     if (buttonIndex == 1) {
83         allowOverwrite = YES;
84         [self saveButtonPressed:nil];
85     }
86 }
87
88 #pragma mark - Button handlers
89
90 - (void)saveButtonPressed:(id)sender {
91     if ([textField.text isEqualToString:@""]) {
92         [self alert:@"Folder Name Required" message:@"Please enter a folder name."];
93     } else {
94         [textField resignFirstResponder];
95         NSString *objectName;
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"];
101             return;
102         }
103             
104         if (folder && folder.name) {
105             objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text];
106         } else {
107             objectName = textField.text;
108         }
109         
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
115                                                             message:alertMessage
116                                                            delegate:self
117                                                   cancelButtonTitle:@"Cancel"
118                                                   otherButtonTitles:@"OK", nil];
119             [alert show];
120             [alert release];
121             return;
122         }
123
124         StorageObject *object = [[StorageObject alloc] init];
125         object.name = object.fullPath = objectName;
126         object.data = [NSData data];
127         object.contentType = @"application/directory";
128         
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;
147              }
148              allowOverwrite = NO;
149              [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
150              [self dismissModalViewControllerAnimated:YES];
151              [newFolder release];
152              [object release];
153          }
154          failure:^(OpenStackRequest *request) {
155              allowOverwrite = NO;
156              [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
157              [self alert:@"There was a problem creating this folder." request:request];
158              [object release];
159          }];
160     }
161 }
162
163 @end
164