Statistics
| Branch: | Tag: | Revision:

root / Classes / AddFolderViewController.m @ 7db1712d

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
                return;
79
            }
80

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

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

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

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

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

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

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

    
164
#pragma mark - Alertview delegate
165

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

    
174

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

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

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

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

    
194
@end
195