root / Classes / AddFolderViewController.m @ e06c24cf
History | View | Annotate | Download (7.3 kB)
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 |
|
22 |
@implementation AddFolderViewController |
23 |
|
24 |
@synthesize account, container, folder, folderViewController; |
25 |
|
26 |
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { |
27 |
return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); |
28 |
} |
29 |
|
30 |
#pragma mark - |
31 |
#pragma mark View lifecycle |
32 |
|
33 |
- (void)viewDidLoad { |
34 |
[super viewDidLoad]; |
35 |
self.navigationItem.title = @"Add Folder"; |
36 |
[self addSaveButton]; |
37 |
} |
38 |
|
39 |
- (void)viewDidAppear:(BOOL)animated { |
40 |
[super viewDidAppear:animated]; |
41 |
[textField becomeFirstResponder]; |
42 |
} |
43 |
|
44 |
#pragma mark - |
45 |
#pragma mark Save Button |
46 |
|
47 |
- (void)saveButtonPressed:(id)sender { |
48 |
if (!saving) { |
49 |
if ([textField.text isEqualToString:@""]) { |
50 |
[self alert:@"Folder Name Required" message:@"Please enter a folder name."]; |
51 |
} else { |
52 |
[textField resignFirstResponder]; |
53 |
NSString *objectName; |
54 |
BOOL objectNameHasTrailingSlash = [textField.text hasSuffix:@"/"]; |
55 |
NSUInteger indexOfFirstSlash = [textField.text rangeOfString:@"/"].location; |
56 |
|
57 |
if ((!objectNameHasTrailingSlash && indexOfFirstSlash != NSNotFound) || |
58 |
(objectNameHasTrailingSlash && indexOfFirstSlash < textField.text.length - 1)) { |
59 |
[self alert:@"Invalid folder name" message:@"'/' characters are only allowed at the end of folder names"]; |
60 |
return; |
61 |
} |
62 |
|
63 |
if (folder && folder.name) { |
64 |
objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text]; |
65 |
} else { |
66 |
objectName = textField.text; |
67 |
} |
68 |
|
69 |
if ([folderViewController.folder.folders objectForKey:objectName] && !allowOverwrite) { |
70 |
NSString *alertMessage = [NSString stringWithFormat:@"An object with path '%@' in the container '%@' already exists, do you want to replace it?",objectName, folderViewController.container.name]; |
71 |
NSString *alertTitle = @"Apply changes"; |
72 |
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle |
73 |
message:alertMessage |
74 |
delegate:self |
75 |
cancelButtonTitle:@"Cancel" |
76 |
otherButtonTitles:@"OK", nil]; |
77 |
[alert show]; |
78 |
[alert release]; |
79 |
return; |
80 |
} |
81 |
|
82 |
NSString *activityMessage = @"Adding folder..."; |
83 |
|
84 |
// figure out how many folders to create |
85 |
|
86 |
activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage]; |
87 |
[activityIndicatorView addToView:self.view]; |
88 |
|
89 |
// actually create the folders |
90 |
StorageObject *object = [[StorageObject alloc] init]; |
91 |
object.name = object.fullPath = objectName; |
92 |
object.data = [NSData data]; |
93 |
object.contentType = @"application/directory"; |
94 |
|
95 |
[[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil] |
96 |
success:^(OpenStackRequest *request) { |
97 |
Folder *newFolder = [[Folder alloc] init]; |
98 |
if (objectNameHasTrailingSlash) |
99 |
object.name = [object.name substringToIndex:object.name.length - 1]; |
100 |
newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject]; |
101 |
if (objectNameHasTrailingSlash) |
102 |
newFolder.name = [newFolder.name stringByAppendingString:@"/"]; |
103 |
newFolder.parent = folder; |
104 |
newFolder.sharing = folder.sharing; |
105 |
BOOL currentFolderIsRoot = NO; |
106 |
if ([folderViewController.folder isEqual:container.rootFolder]) { |
107 |
currentFolderIsRoot = YES; |
108 |
} |
109 |
[folder.folders setObject:newFolder forKey:newFolder.name]; |
110 |
[folderViewController.tableView reloadData]; |
111 |
if (currentFolderIsRoot) { |
112 |
container.count += 1; |
113 |
container.rootFolder = folder; |
114 |
[self.account.containers setObject:container forKey:container.name]; |
115 |
} |
116 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) |
117 |
[folderViewController setDetailViewController]; |
118 |
|
119 |
allowOverwrite = NO; |
120 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
121 |
[self dismissModalViewControllerAnimated:YES]; |
122 |
[newFolder release]; |
123 |
[object release]; |
124 |
|
125 |
} |
126 |
failure:^(OpenStackRequest *request) { |
127 |
allowOverwrite = NO; |
128 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
129 |
[self alert:@"There was a problem creating this folder." request:request]; |
130 |
[object release]; |
131 |
}]; |
132 |
} |
133 |
} |
134 |
} |
135 |
|
136 |
#pragma mark - |
137 |
#pragma mark Table view data source |
138 |
|
139 |
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
140 |
return 1; |
141 |
} |
142 |
|
143 |
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
144 |
return 1; |
145 |
} |
146 |
|
147 |
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { |
148 |
return @"If your folder name contains any forward slash characters, multiple folder objects will be created."; |
149 |
} |
150 |
|
151 |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
152 |
static NSString *CellIdentifier = @"FolderNameCell"; |
153 |
RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
154 |
if (cell == nil) { |
155 |
cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; |
156 |
cell.modalPresentationStyle = UIModalPresentationFormSheet; |
157 |
textField = cell.textField; |
158 |
textField.delegate = self; |
159 |
textField.clearButtonMode = UITextFieldViewModeWhileEditing; |
160 |
} |
161 |
cell.textLabel.text = @"Name"; |
162 |
return cell; |
163 |
} |
164 |
|
165 |
#pragma mark - Alertview delegate |
166 |
|
167 |
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex |
168 |
{ |
169 |
if (buttonIndex == 1) { |
170 |
allowOverwrite = YES; |
171 |
[self saveButtonPressed:nil]; |
172 |
} |
173 |
} |
174 |
|
175 |
|
176 |
#pragma mark - |
177 |
#pragma mark Text Field Delegate |
178 |
|
179 |
- (BOOL)textFieldShouldReturn:(UITextField *)textField { |
180 |
[self saveButtonPressed:nil]; |
181 |
return NO; |
182 |
} |
183 |
|
184 |
#pragma mark - |
185 |
#pragma mark Memory management |
186 |
|
187 |
- (void)dealloc { |
188 |
[account release]; |
189 |
[container release]; |
190 |
[folder release]; |
191 |
[folderViewController release]; |
192 |
[super dealloc]; |
193 |
} |
194 |
|
195 |
@end |
196 |
|