Statistics
| Branch: | Tag: | Revision:

root / Classes / AddFolderViewController.m @ 3a8071d4

History | View | Annotate | Download (7.3 kB)

1
//
2
//  AddFolderViewController.m
3
//  OpenStack
4
//
5
//  Created by Mike Mayo on 1/4/11.
6
//  Copyright 2011 __MyCompanyName__. All rights reserved.
7
//
8

    
9
#import "AddFolderViewController.h"
10
#import "RSTextFieldCell.h"
11
#import "ActivityIndicatorView.h"
12
#import "UIViewController+Conveniences.h"
13
#import "OpenStackAccount.h"
14
#import "AccountManager.h"
15
#import "Container.h"
16
#import "Folder.h"
17
#import "StorageObject.h"
18
#import "FolderViewController.h"
19
#import "APICallback.h"
20

    
21

    
22
@implementation AddFolderViewController
23

    
24
@synthesize account, container, folder, folderViewController;
25

    
26
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
27
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
28
}
29

    
30
#pragma mark -
31
#pragma mark View lifecycle
32

    
33
- (void)viewDidLoad {
34
    [super viewDidLoad];
35
    self.navigationItem.title = @"Add Folder";
36
    [self addSaveButton];
37
}
38

    
39
- (void)viewDidAppear:(BOOL)animated {
40
    [super viewDidAppear:animated];
41
    [textField becomeFirstResponder];
42
}
43

    
44
#pragma mark -
45
#pragma mark Save Button
46

    
47
- (void)saveButtonPressed:(id)sender {    
48
    if (!saving) {        
49
        if ([textField.text isEqualToString:@""]) {
50
            [self alert:@"Folder Name Required" message:@"Please enter a folder name."];
51
        } else {
52
            [textField resignFirstResponder];
53
            NSString *objectName;
54
            BOOL objectNameHasTrailingSlash = [textField.text hasSuffix:@"/"];
55
            NSUInteger indexOfFirstSlash = [textField.text rangeOfString:@"/"].location;
56
            
57
            if ((!objectNameHasTrailingSlash && indexOfFirstSlash != NSNotFound) || 
58
                (objectNameHasTrailingSlash && indexOfFirstSlash < textField.text.length - 1)) {
59
                [self alert:@"Invalid folder name" message:@"'/' characters are only allowed at the end of folder names"];
60
                return;
61
            }
62
                
63
            if (folder && folder.name) {
64
                objectName = [NSString stringWithFormat:@"%@/%@", [folder fullPath], textField.text];
65
            } else {
66
                objectName = textField.text;
67
            }
68
            
69
            if ([folderViewController.folder.folders objectForKey:objectName] && !allowOverwrite) {
70
                NSString *alertMessage = [NSString stringWithFormat:@"An object with path '%@' in the container '%@' already exists, do you want to replace it?",objectName, folderViewController.container.name];
71
                NSString *alertTitle = @"Apply changes";
72
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
73
                                                                message:alertMessage
74
                                                               delegate:self
75
                                                      cancelButtonTitle:@"Cancel"
76
                                                      otherButtonTitles:@"OK", nil];
77
                [alert show];
78
                [alert release];
79
                return;
80
            }
81

    
82
            NSString *activityMessage = @"Adding folder...";
83
            
84
            // figure out how many folders to create
85
            [activityIndicatorView release];
86
            activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
87
            [activityIndicatorView addToView:self.view];
88
            
89
            // actually create the folders
90
            StorageObject *object = [[StorageObject alloc] init];
91
            object.name = object.fullPath = objectName;
92
            object.data = [NSData data];
93
            object.contentType = @"application/directory";
94

    
95
            [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
96
             success:^(OpenStackRequest *request) {
97
                 Folder *newFolder = [[Folder alloc] init];
98
                 if (objectNameHasTrailingSlash)
99
                     object.name = [object.name substringToIndex:object.name.length - 1];
100
                 newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
101
                 if (objectNameHasTrailingSlash)
102
                     newFolder.name = [newFolder.name stringByAppendingString:@"/"];
103
                 newFolder.parent = folder;
104
                 newFolder.sharing = folder.sharing;
105
                 BOOL currentFolderIsRoot = NO;
106
                 if ([folderViewController.folder isEqual:container.rootFolder]) {
107
                     currentFolderIsRoot = YES;
108
                 }
109
                 [folder.folders setObject:newFolder forKey:newFolder.name];
110
                 [folderViewController.tableView reloadData];
111
                 if (currentFolderIsRoot) {
112
                     container.count += 1;
113
                     container.rootFolder = folder;
114
                     [self.account.containers setObject:container forKey:container.name];
115
                 }
116
                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
117
                     [folderViewController setDetailViewController];
118
                 
119
                 allowOverwrite = NO;
120
                 [activityIndicatorView removeFromSuperview];
121
                 [self dismissModalViewControllerAnimated:YES];
122
                 [newFolder release];
123
                 [object release];
124
 
125
             }
126
             failure:^(OpenStackRequest *request) {
127
                 allowOverwrite = NO;
128
                 [activityIndicatorView removeFromSuperview];
129
                 [self alert:@"There was a problem creating this folder." request:request];
130
                 [object release];
131
             }];
132
        }
133
    }
134
}
135

    
136
#pragma mark -
137
#pragma mark Table view data source
138

    
139
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
140
    return 1;
141
}
142

    
143
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
144
    return 1;
145
}
146

    
147
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
148
    return @"If your folder name contains any forward slash characters, multiple folder objects will be created.";
149
}
150

    
151
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
152
    static NSString *CellIdentifier = @"FolderNameCell";
153
    RSTextFieldCell *cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
154
    if (cell == nil) {
155
        cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
156
        cell.modalPresentationStyle = UIModalPresentationFormSheet;
157
		textField = cell.textField;
158
        textField.delegate = self;
159
		textField.clearButtonMode = UITextFieldViewModeWhileEditing;
160
    }    
161
    cell.textLabel.text = @"Name";
162
    return cell;
163
}
164

    
165
#pragma mark - Alertview delegate
166

    
167
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
168
{
169
    if (buttonIndex == 1) {
170
        allowOverwrite = YES;
171
        [self saveButtonPressed:nil];
172
    } 
173
}
174

    
175

    
176
#pragma mark -
177
#pragma mark Text Field Delegate
178

    
179
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
180
    [self saveButtonPressed:nil];
181
    return NO;
182
}
183

    
184
#pragma mark -
185
#pragma mark Memory management
186

    
187
- (void)dealloc {
188
    [account release];
189
    [container release];
190
    [folder release];
191
    [folderViewController release];
192
    [activityIndicatorView release];
193
    [super dealloc];
194
}
195

    
196
@end
197