Statistics
| Branch: | Tag: | Revision:

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