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