Statistics
| Branch: | Tag: | Revision:

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