root / Classes / FolderViewController.m @ 72744ed1
History | View | Annotate | Download (21.9 kB)
1 |
// |
---|---|
2 |
// FolderViewController.m |
3 |
// OpenStack |
4 |
// |
5 |
// Created by Mike Mayo on 12/15/10. |
6 |
// The OpenStack project is provided under the Apache 2.0 license. |
7 |
// |
8 |
|
9 |
#import "FolderViewController.h" |
10 |
#import "OpenStackAccount.h" |
11 |
#import "Container.h" |
12 |
#import "Folder.h" |
13 |
#import "StorageObject.h" |
14 |
#import "StorageObjectViewController.h" |
15 |
#import "ContainerDetailViewController.h" |
16 |
#import "AccountManager.h" |
17 |
#import "ActivityIndicatorView.h" |
18 |
#import "ContainersViewController.h" |
19 |
#import "UIViewController+Conveniences.h" |
20 |
#import "AddObjectViewController.h" |
21 |
#import "OpenStackAppDelegate.h" |
22 |
#import "RootViewController.h" |
23 |
#import "FolderDetailViewController.h" |
24 |
#import "AccountHomeViewController.h" |
25 |
#import "PithosImageViewController.h" |
26 |
#import "OpenStackRequest.h" |
27 |
#import "JSON.h" |
28 |
#import "APICallback.h" |
29 |
#import "OpenStackAppDelegate.h" |
30 |
#import <MobileCoreServices/MobileCoreServices.h> |
31 |
|
32 |
|
33 |
@implementation FolderViewController |
34 |
|
35 |
@synthesize account, container, folder, containersViewController, selectedContainerIndexPath, contentsLoaded, parentFolderViewController, selectedFolderIndexPath, tableView, needsRefreshing, folderHasBeenRemoved, refreshWhenAppeared, folderDetailVC, selectedObjectViewController; |
36 |
|
37 |
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { |
38 |
return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); |
39 |
} |
40 |
|
41 |
#pragma mark - |
42 |
#pragma mark View lifecycle |
43 |
|
44 |
- (void)viewDidLoad { |
45 |
[super viewDidLoad]; |
46 |
[self addAddButton]; |
47 |
[self addHomeButton]; |
48 |
|
49 |
deleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this folder? This operation cannot be undone." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete Folder" otherButtonTitles:nil]; |
50 |
} |
51 |
|
52 |
- (void)viewWillAppear:(BOOL)animated { |
53 |
[super viewWillAppear:animated]; |
54 |
if (folder.name && ![@"" isEqualToString:folder.name]) { |
55 |
self.navigationItem.title = self.folder.name; |
56 |
} else { |
57 |
self.navigationItem.title = self.container.name; |
58 |
} |
59 |
self.selectedObjectViewController = nil; |
60 |
} |
61 |
|
62 |
- (void)viewDidAppear:(BOOL)animated { |
63 |
[super viewDidAppear:animated]; |
64 |
if (!self.folder) { |
65 |
if (folderHasBeenRemoved) { |
66 |
if (needsRefreshing) |
67 |
self.parentFolderViewController.needsRefreshing = YES; |
68 |
[self.navigationController popViewControllerAnimated:YES]; |
69 |
} |
70 |
else |
71 |
[self refreshButtonPressed:nil]; |
72 |
} else { |
73 |
if (self.needsRefreshing) { |
74 |
self.parentFolderViewController.needsRefreshing = YES; |
75 |
if (refreshWhenAppeared) { |
76 |
[self refreshButtonPressed:nil]; |
77 |
refreshWhenAppeared = NO; |
78 |
} |
79 |
if (account.shared && ([folder.folders count] + [folder.objects count] == 0)) { |
80 |
[self.navigationController popViewControllerAnimated:YES]; |
81 |
} |
82 |
} |
83 |
} |
84 |
} |
85 |
|
86 |
- (void)viewWillDisappear:(BOOL)animated { |
87 |
[super viewWillDisappear:animated]; |
88 |
if (![self.navigationController.viewControllers containsObject:self]) { |
89 |
if (self.parentViewController && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) |
90 |
[parentFolderViewController setDetailViewController]; |
91 |
} |
92 |
if (!(folder.name && ![@"" isEqualToString:folder.name])) { |
93 |
// [self.containersViewController.tableView deselectRowAtIndexPath:self.selectedContainerIndexPath animated:YES]; |
94 |
} |
95 |
} |
96 |
|
97 |
- (void)setDetailViewController { |
98 |
if ([self.folder isEqual:self.container.rootFolder]) { |
99 |
ContainerDetailViewController *vc = [[ContainerDetailViewController alloc] initWithNibName:@"ContainerDetailViewController" bundle:nil]; |
100 |
vc.account = self.account; |
101 |
vc.container = self.container; |
102 |
vc.containersViewController = self.containersViewController; |
103 |
vc.rootFolderViewController = self; |
104 |
vc.selectedContainerIndexPath = self.selectedContainerIndexPath; |
105 |
[self presentPrimaryViewController:vc]; |
106 |
self.containersViewController.containerDetailViewController = vc; |
107 |
[vc release]; |
108 |
} |
109 |
else { |
110 |
FolderDetailViewController *folderDetailViewController = [[FolderDetailViewController alloc] initWithNibName:@"FolderDetailViewController" bundle:nil]; |
111 |
folderDetailViewController.account = account; |
112 |
folderDetailViewController.container = container; |
113 |
folderDetailViewController.folder = self.folder; |
114 |
folderDetailViewController.folderViewController = self.parentFolderViewController; |
115 |
[self presentPrimaryViewController:folderDetailViewController]; |
116 |
self.parentFolderViewController.folderDetailVC = folderDetailViewController; |
117 |
[folderDetailViewController release]; |
118 |
} |
119 |
} |
120 |
|
121 |
|
122 |
- (void)reloadFolderViewControllers |
123 |
{ |
124 |
NSArray *viewControllers = [self.navigationController viewControllers]; |
125 |
|
126 |
int rootFolderControllerIndex = [viewControllers indexOfObject:self.containersViewController] + 1; |
127 |
FolderViewController *rootFolderViewController = [viewControllers objectAtIndex:rootFolderControllerIndex]; |
128 |
rootFolderViewController.folder = self.container.rootFolder; |
129 |
[rootFolderViewController.tableView reloadData]; |
130 |
|
131 |
for (int i = rootFolderControllerIndex + 1; i < [viewControllers count]; i++) { |
132 |
FolderViewController *folderViewController = [viewControllers objectAtIndex:i]; |
133 |
Folder *parentFolder = folderViewController.parentFolderViewController.folder; |
134 |
|
135 |
folderViewController.folder = [parentFolder.folders objectForKey:folderViewController.folder.name]; |
136 |
if (folderViewController.folder) { |
137 |
[folderViewController.tableView reloadData]; |
138 |
} |
139 |
else { |
140 |
folderViewController.folderHasBeenRemoved = YES; |
141 |
} |
142 |
} |
143 |
if (!self.folder || (account.shared && [folder.folders count] + [folder.objects count] == 0)) { |
144 |
if (needsRefreshing && self.parentFolderViewController) { |
145 |
self.parentFolderViewController.needsRefreshing = YES; |
146 |
} |
147 |
[self.navigationController popViewControllerAnimated:YES]; |
148 |
} else { |
149 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && account.shared) |
150 |
[self setDetailViewController]; |
151 |
} |
152 |
} |
153 |
|
154 |
|
155 |
|
156 |
#pragma mark - |
157 |
#pragma mark Table view data source |
158 |
|
159 |
- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView { |
160 |
return 1; |
161 |
} |
162 |
|
163 |
|
164 |
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { |
165 |
return MAX(contentsLoaded ? 1 : 0, [folder.objects count] + [folder.folders count]); |
166 |
} |
167 |
|
168 |
- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { |
169 |
if ([folder.objects count] + [folder.folders count] == 0) { |
170 |
aTableView.scrollEnabled = NO; |
171 |
aTableView.allowsSelection = NO; |
172 |
return aTableView.frame.size.height; |
173 |
} else { |
174 |
aTableView.scrollEnabled = YES; |
175 |
aTableView.allowsSelection = YES; |
176 |
return aTableView.rowHeight; |
177 |
} |
178 |
} |
179 |
|
180 |
|
181 |
// Customize the appearance of table view cells. |
182 |
|
183 |
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
184 |
if ([folder.objects count] + [folder.folders count] == 0) { |
185 |
NSString *noFoldersTitle = (self.account.shared || self.account.sharingAccount) ? |
186 |
@"No shared Files or Folders" : @"No Files or Folders"; |
187 |
NSString *noFoldersSubtitle = (self.account.shared || self.account.sharingAccount || [self.folder.name hasSuffix:@"/"]) ? |
188 |
@"" : @"Tap the + button to create a new Folder"; |
189 |
NSString *deleteFolderButtonTitle = (self.account.shared || self.account.sharingAccount) ? |
190 |
nil : @"Delete Folder"; |
191 |
SEL deleteButtonSelector = (self.account.shared || self.account.sharingAccount) ? nil : @selector(deleteButtonPressed:); |
192 |
self.navigationItem.rightBarButtonItem.enabled = (self.account.shared || [self.folder.name hasSuffix:@"/"]) ? NO : YES; |
193 |
|
194 |
if ([self.container.rootFolder isEqual:self.folder]) { |
195 |
return [self tableView:aTableView |
196 |
emptyCellWithImage:[UIImage imageNamed:@"empty-files.png"] |
197 |
title:noFoldersTitle |
198 |
subtitle:noFoldersSubtitle]; |
199 |
} else { |
200 |
return [self tableView:aTableView |
201 |
emptyCellWithImage:[UIImage imageNamed:@"empty-files.png"] |
202 |
title:noFoldersTitle |
203 |
subtitle:noFoldersSubtitle |
204 |
deleteButtonTitle:deleteFolderButtonTitle |
205 |
deleteButtonSelector:deleteButtonSelector]; |
206 |
} |
207 |
} else { |
208 |
static NSString *CellIdentifier = @"Cell"; |
209 |
|
210 |
UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
211 |
if (cell == nil) { |
212 |
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; |
213 |
} |
214 |
|
215 |
id item = [[self.folder sortedContents] objectAtIndex:indexPath.row]; |
216 |
[cell.textLabel setLineBreakMode:UILineBreakModeTailTruncation]; |
217 |
cell.textLabel.text = [item name]; |
218 |
|
219 |
if ([[item class] isEqual:[Folder class]]) { |
220 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
221 |
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
222 |
} else { |
223 |
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; |
224 |
} |
225 |
cell.imageView.image = [UIImage imageNamed:@"folder-icon.png"]; |
226 |
|
227 |
NSString *folderString = @""; |
228 |
NSString *objectString = @""; |
229 |
if ([[item folders] count] > 1) { |
230 |
folderString = [NSString stringWithFormat:@"%i folders, ", [[item folders] count]]; |
231 |
} else if ([[item folders] count] > 0) { |
232 |
folderString = @"1 folder, "; |
233 |
} |
234 |
if ([[item objects] count] != 1) { |
235 |
objectString = [NSString stringWithFormat:@"%i objects", [[item objects] count]]; |
236 |
} else if ([[item objects] count]) { |
237 |
objectString = @"1 object"; |
238 |
} |
239 |
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@%@", folderString, objectString]; |
240 |
} else if ([[item class] isEqual:[StorageObject class]]) { |
241 |
[cell.textLabel setLineBreakMode:UILineBreakModeMiddleTruncation]; |
242 |
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
243 |
|
244 |
StorageObject *object = item; |
245 |
CFStringRef mimeType = (CFStringRef)object.contentType; |
246 |
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType, NULL); |
247 |
NSString *emptyPath = [[NSBundle mainBundle] pathForResource:@"empty-file" ofType:@""]; |
248 |
UIDocumentInteractionController *udic = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:emptyPath]]; |
249 |
if (((NSString *)uti).length > 0) |
250 |
udic.UTI = (NSString *)uti; |
251 |
if ([udic.icons count] > 0) |
252 |
cell.imageView.image = [udic.icons objectAtIndex:0]; |
253 |
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@", [item humanizedBytes], [item contentType]]; |
254 |
} |
255 |
|
256 |
return cell; |
257 |
} |
258 |
} |
259 |
|
260 |
#pragma mark - |
261 |
#pragma mark Table view delegate |
262 |
|
263 |
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
264 |
if ([folder.objects count] + [folder.folders count] > 0) { |
265 |
id item = [self.folder.sortedContents objectAtIndex:indexPath.row]; |
266 |
if ([[item class] isEqual:[Folder class]]) { |
267 |
FolderViewController *vc = [[FolderViewController alloc] initWithNibName:@"FolderViewController" bundle:nil]; |
268 |
vc.account = self.account; |
269 |
vc.container = self.container; |
270 |
vc.folder = item; |
271 |
vc.contentsLoaded = YES; |
272 |
vc.selectedFolderIndexPath = indexPath; |
273 |
vc.parentFolderViewController = self; |
274 |
vc.containersViewController = self.containersViewController; |
275 |
[self.navigationController pushViewController:vc animated:YES]; |
276 |
[self.tableView deselectRowAtIndexPath:indexPath animated:YES]; |
277 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
278 |
Folder *folderForDetailView; |
279 |
if ([folder.sortedContents count] > 0) { |
280 |
folderForDetailView = [self.folder.sortedContents objectAtIndex:indexPath.row]; |
281 |
} else { |
282 |
folderForDetailView = nil; |
283 |
} |
284 |
FolderDetailViewController *folderDetailViewController = [[FolderDetailViewController alloc] initWithNibName:@"FolderDetailViewController" bundle:nil]; |
285 |
folderDetailViewController.account = account; |
286 |
folderDetailViewController.container = container; |
287 |
folderDetailViewController.folder = folderForDetailView; |
288 |
folderDetailViewController.folderViewController = vc; |
289 |
[self presentPrimaryViewController:folderDetailViewController]; |
290 |
self.folderDetailVC = folderDetailViewController; |
291 |
[folderDetailViewController release]; |
292 |
} |
293 |
[vc release]; |
294 |
} else if ([[item class] isEqual:[StorageObject class]]) { |
295 |
StorageObjectViewController *vc = [[StorageObjectViewController alloc] initWithNibName:@"StorageObjectViewController" bundle:nil]; |
296 |
vc.account = self.account; |
297 |
vc.container = self.container; |
298 |
vc.folder = self.folder; |
299 |
vc.object = item; |
300 |
vc.folderViewController = self; |
301 |
vc.selectedIndexPath = indexPath; |
302 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
303 |
[self.navigationController presentPrimaryViewController:vc]; |
304 |
self.selectedObjectViewController = vc; |
305 |
OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate]; |
306 |
if (app.rootViewController.popoverController != nil) { |
307 |
[app.rootViewController.popoverController dismissPopoverAnimated:YES]; |
308 |
} |
309 |
} else { |
310 |
[self.navigationController pushViewController:vc animated:YES]; |
311 |
[self.tableView deselectRowAtIndexPath:indexPath animated:YES]; |
312 |
} |
313 |
[vc release]; |
314 |
} |
315 |
} |
316 |
} |
317 |
|
318 |
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { |
319 |
Folder *folderForDetailView; |
320 |
if ([folder.sortedContents count] > 0) { |
321 |
folderForDetailView = [self.folder.sortedContents objectAtIndex:indexPath.row]; |
322 |
} else { |
323 |
folderForDetailView = nil; |
324 |
} |
325 |
FolderDetailViewController *vc = [[FolderDetailViewController alloc] initWithNibName:@"FolderDetailViewController" bundle:nil]; |
326 |
vc.account = account; |
327 |
vc.container = container; |
328 |
vc.folder = folderForDetailView; |
329 |
vc.folderViewController = self; |
330 |
[self.navigationController pushViewController:vc animated:YES]; |
331 |
[vc release]; |
332 |
} |
333 |
|
334 |
#pragma mark - |
335 |
#pragma mark Buttons |
336 |
|
337 |
- (IBAction)homeButtonPressed:(id)sender { |
338 |
[self.navigationController popToViewController:containersViewController.accountHomeViewController animated:YES]; |
339 |
} |
340 |
|
341 |
- (IBAction)refreshButtonPressed:(id)sender { |
342 |
activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Loading..."] text:@"Loading..."]; |
343 |
[activityIndicatorView addToView:self.view]; |
344 |
|
345 |
[self.account.manager getObjects:self.container]; |
346 |
successObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getObjectsSucceeded" object:self.container |
347 |
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) |
348 |
{ |
349 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
350 |
contentsLoaded = YES; |
351 |
[self.containersViewController refreshButtonPressed:nil]; |
352 |
[self reloadFolderViewControllers]; |
353 |
needsRefreshing = NO; |
354 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
355 |
if (self.selectedObjectViewController) { |
356 |
[self.selectedObjectViewController reloadMetadataSection]; |
357 |
} else if ([self.folder isEqual:container.rootFolder]) { |
358 |
[containersViewController.containerDetailViewController reloadMetadataSection]; |
359 |
} else if ([parentFolderViewController.folderDetailVC.navigationController.topViewController |
360 |
isEqual:parentFolderViewController.folderDetailVC]) { |
361 |
[parentFolderViewController.folderDetailVC reloadMetadataSection]; |
362 |
} |
363 |
} |
364 |
[[NSNotificationCenter defaultCenter] removeObserver:successObserver]; |
365 |
}]; |
366 |
|
367 |
failureObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getObjectsFailed" object:self.container |
368 |
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) |
369 |
{ |
370 |
needsRefreshing = NO; |
371 |
[self.tableView reloadData]; |
372 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
373 |
[self alert:@"Error" message:@"Failed to retrieve files from server"]; |
374 |
[[NSNotificationCenter defaultCenter] removeObserver:failureObserver]; |
375 |
}]; |
376 |
|
377 |
|
378 |
} |
379 |
|
380 |
- (void)addButtonPressed:(id)sender { |
381 |
AddObjectViewController *vc = [[AddObjectViewController alloc] initWithNibName:@"AddObjectViewController" bundle:nil]; |
382 |
vc.account = self.account; |
383 |
vc.container = self.container; |
384 |
vc.folder = self.folder; |
385 |
vc.folderViewController = self; |
386 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
387 |
vc.modalPresentationStyle = UIModalPresentationFormSheet; |
388 |
OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate]; |
389 |
if (app.rootViewController.popoverController != nil) { |
390 |
[app.rootViewController.popoverController dismissPopoverAnimated:YES]; |
391 |
} |
392 |
} |
393 |
[self presentModalViewControllerWithNavigation:vc animated:YES]; |
394 |
[vc release]; |
395 |
} |
396 |
|
397 |
- (void)deleteButtonPressed:(id)sender { |
398 |
OpenStackAppDelegate *appDelegate = (OpenStackAppDelegate *)[[UIApplication sharedApplication] delegate]; |
399 |
[deleteActionSheet showInView:appDelegate.masterNavigationController.view]; |
400 |
} |
401 |
|
402 |
#pragma mark - |
403 |
#pragma mark Action Sheet Delegate |
404 |
|
405 |
- (void)deleteFolderRow { |
406 |
[self.parentFolderViewController.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:selectedFolderIndexPath] withRowAnimation:UITableViewRowAnimationLeft]; |
407 |
} |
408 |
|
409 |
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { |
410 |
if (buttonIndex == 0) { |
411 |
StorageObject *object = [[StorageObject alloc] init]; |
412 |
object.name = object.fullPath = [self.folder fullPath]; |
413 |
|
414 |
NSString *activityMessage = @"Deleting folder..."; |
415 |
activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage]; |
416 |
[activityIndicatorView addToView:self.view scrollOffset:self.tableView.contentOffset.y]; |
417 |
|
418 |
[[self.account.manager deleteObject:self.container object:object] |
419 |
success:^(OpenStackRequest *request) { |
420 |
if (self.folder.parent) { |
421 |
[self.folder.parent.folders removeObjectForKey:self.folder.name]; |
422 |
} else { |
423 |
[self.container.rootFolder.folders removeObjectForKey:self.folder.name]; |
424 |
} |
425 |
[self.account persist]; |
426 |
|
427 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
428 |
[self.navigationController popViewControllerAnimated:YES]; |
429 |
|
430 |
if (self.folder.parent) { |
431 |
if ([self.folder.parent.folders count] + [self.folder.parent.objects count] == 0) { |
432 |
[self.parentFolderViewController.tableView reloadData]; |
433 |
} else { |
434 |
[self.parentFolderViewController.tableView selectRowAtIndexPath:selectedFolderIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; |
435 |
[NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteFolderRow) userInfo:nil repeats:NO]; |
436 |
} |
437 |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) |
438 |
[self.parentFolderViewController setDetailViewController]; |
439 |
} else { |
440 |
if ([self.container.rootFolder.folders count] + [self.container.rootFolder.objects count] == 0) { |
441 |
[self.parentFolderViewController.tableView reloadData]; |
442 |
} else { |
443 |
[self.parentFolderViewController.tableView selectRowAtIndexPath:selectedFolderIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; |
444 |
[NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteFolderRow) userInfo:nil repeats:NO]; |
445 |
} |
446 |
} |
447 |
[object release]; |
448 |
} |
449 |
failure:^(OpenStackRequest *request) { |
450 |
[activityIndicatorView removeFromSuperviewAndRelease]; |
451 |
[self alert:@"There was a problem deleting this folder." request:request]; |
452 |
[object release]; |
453 |
}]; |
454 |
} |
455 |
} |
456 |
|
457 |
#pragma mark - |
458 |
#pragma mark Memory management |
459 |
|
460 |
- (void)dealloc { |
461 |
[account release]; |
462 |
[container release]; |
463 |
[folder release]; |
464 |
[containersViewController release]; |
465 |
[selectedContainerIndexPath release]; |
466 |
[deleteActionSheet release]; |
467 |
[parentFolderViewController release]; |
468 |
[selectedFolderIndexPath release]; |
469 |
[super dealloc]; |
470 |
} |
471 |
|
472 |
|
473 |
@end |
474 |
|