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