Statistics
| Branch: | Tag: | Revision:

root / Classes / FolderDetailViewController.m @ ea3a6bba

History | View | Annotate | Download (15.6 kB)

1 38d59b6c Miltiadis Vasilakis
//
2 38d59b6c Miltiadis Vasilakis
//  FolderDetailViewController.m
3 38d59b6c Miltiadis Vasilakis
//  pithos-ios
4 38d59b6c Miltiadis Vasilakis
//
5 ea3a6bba Miltiadis Vasilakis
// Copyright 2011-2013 GRNET S.A. All rights reserved.
6 38d59b6c Miltiadis Vasilakis
//
7 38d59b6c Miltiadis Vasilakis
// Redistribution and use in source and binary forms, with or
8 38d59b6c Miltiadis Vasilakis
// without modification, are permitted provided that the following
9 38d59b6c Miltiadis Vasilakis
// conditions are met:
10 38d59b6c Miltiadis Vasilakis
// 
11 38d59b6c Miltiadis Vasilakis
//   1. Redistributions of source code must retain the above
12 38d59b6c Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
13 38d59b6c Miltiadis Vasilakis
//      disclaimer.
14 38d59b6c Miltiadis Vasilakis
// 
15 38d59b6c Miltiadis Vasilakis
//   2. Redistributions in binary form must reproduce the above
16 38d59b6c Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
17 38d59b6c Miltiadis Vasilakis
//      disclaimer in the documentation and/or other materials
18 38d59b6c Miltiadis Vasilakis
//      provided with the distribution.
19 38d59b6c Miltiadis Vasilakis
// 
20 38d59b6c Miltiadis Vasilakis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21 38d59b6c Miltiadis Vasilakis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 38d59b6c Miltiadis Vasilakis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 38d59b6c Miltiadis Vasilakis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24 38d59b6c Miltiadis Vasilakis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 38d59b6c Miltiadis Vasilakis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 38d59b6c Miltiadis Vasilakis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 38d59b6c Miltiadis Vasilakis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 38d59b6c Miltiadis Vasilakis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 38d59b6c Miltiadis Vasilakis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 38d59b6c Miltiadis Vasilakis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 38d59b6c Miltiadis Vasilakis
// POSSIBILITY OF SUCH DAMAGE.
32 38d59b6c Miltiadis Vasilakis
// 
33 38d59b6c Miltiadis Vasilakis
// The views and conclusions contained in the software and
34 38d59b6c Miltiadis Vasilakis
// documentation are those of the authors and should not be
35 38d59b6c Miltiadis Vasilakis
// interpreted as representing official policies, either expressed
36 38d59b6c Miltiadis Vasilakis
// or implied, of GRNET S.A.
37 38d59b6c Miltiadis Vasilakis
38 38d59b6c Miltiadis Vasilakis
#import "FolderDetailViewController.h"
39 38d59b6c Miltiadis Vasilakis
#import "EditMetadataViewController.h"
40 d17a05de Miltiadis Vasilakis
#import "EditPermissionsViewController.h"
41 60731366 Miltiadis Vasilakis
#import "OpenStackAccount.h"
42 60731366 Miltiadis Vasilakis
#import "Container.h"
43 60731366 Miltiadis Vasilakis
#import "Folder.h"
44 d17a05de Miltiadis Vasilakis
#import "StorageObject.h"
45 60731366 Miltiadis Vasilakis
#import "ActivityIndicatorView.h"
46 54fd5c36 Miltiadis Vasilakis
#import "APICallback.h"
47 54fd5c36 Miltiadis Vasilakis
#import "AccountManager.h"
48 54fd5c36 Miltiadis Vasilakis
#import "UIViewController+Conveniences.h"
49 3a8071d4 Miltiadis Vasilakis
#import "NSString+Conveniences.h"
50 38d59b6c Miltiadis Vasilakis
51 38d59b6c Miltiadis Vasilakis
#define kOverview 0
52 38d59b6c Miltiadis Vasilakis
#define kMetadata 1
53 d17a05de Miltiadis Vasilakis
#define kPermissions 2
54 38d59b6c Miltiadis Vasilakis
55 38d59b6c Miltiadis Vasilakis
#define maxMetadataViewableLength 12
56 38d59b6c Miltiadis Vasilakis
57 38d59b6c Miltiadis Vasilakis
@implementation FolderDetailViewController
58 38d59b6c Miltiadis Vasilakis
59 7446ae64 Miltiadis Vasilakis
@synthesize account, container, folder, folderViewController, permissions;
60 38d59b6c Miltiadis Vasilakis
61 7446ae64 Miltiadis Vasilakis
#pragma mark - View lifecycle
62 38d59b6c Miltiadis Vasilakis
63 7446ae64 Miltiadis Vasilakis
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
64 7446ae64 Miltiadis Vasilakis
    return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
65 38d59b6c Miltiadis Vasilakis
}
66 38d59b6c Miltiadis Vasilakis
67 60731366 Miltiadis Vasilakis
- (void)viewDidLoad {
68 38d59b6c Miltiadis Vasilakis
    [super viewDidLoad];
69 7446ae64 Miltiadis Vasilakis
    self.permissions = [folder.folderObject permissions];
70 d17a05de Miltiadis Vasilakis
    folderIsReadOnly = NO;
71 7446ae64 Miltiadis Vasilakis
    if (account.sharingAccount && permissions.count) {
72 7446ae64 Miltiadis Vasilakis
        folderIsReadOnly = ![[permissions objectForKey:account.username] isEqualToString:@"write"];
73 d17a05de Miltiadis Vasilakis
    }
74 d17a05de Miltiadis Vasilakis
    
75 d17a05de Miltiadis Vasilakis
    object = [[StorageObject alloc] init];
76 d17a05de Miltiadis Vasilakis
    object.name = folder.name;
77 d17a05de Miltiadis Vasilakis
    object.metadata = folder.metadata;
78 d17a05de Miltiadis Vasilakis
    object.fullPath = [folder fullPath];
79 d17a05de Miltiadis Vasilakis
    object.sharing = folder.sharing;
80 45f2fce6 Miltiadis Vasilakis
    object.contentType = folder.contentType;
81 38d59b6c Miltiadis Vasilakis
}
82 38d59b6c Miltiadis Vasilakis
83 60731366 Miltiadis Vasilakis
- (void)viewWillAppear:(BOOL)animated {
84 38d59b6c Miltiadis Vasilakis
    [super viewWillAppear:animated];
85 38d59b6c Miltiadis Vasilakis
    [self.tableView reloadData];
86 38d59b6c Miltiadis Vasilakis
}
87 38d59b6c Miltiadis Vasilakis
88 60731366 Miltiadis Vasilakis
- (void)viewDidAppear:(BOOL)animated {
89 38d59b6c Miltiadis Vasilakis
    [super viewDidAppear:animated];
90 54fd5c36 Miltiadis Vasilakis
    if (folder.metadata == nil) {
91 54fd5c36 Miltiadis Vasilakis
        [self reloadMetadataSection];
92 7446ae64 Miltiadis Vasilakis
    } else {
93 7446ae64 Miltiadis Vasilakis
        [self updatePermissionsUserCatalog];
94 54fd5c36 Miltiadis Vasilakis
    }
95 38d59b6c Miltiadis Vasilakis
}
96 38d59b6c Miltiadis Vasilakis
97 60731366 Miltiadis Vasilakis
- (void)viewWillDisappear:(BOOL)animated {
98 38d59b6c Miltiadis Vasilakis
    [super viewWillDisappear:animated];
99 d17a05de Miltiadis Vasilakis
    folder.sharing = object.sharing;
100 38d59b6c Miltiadis Vasilakis
}
101 38d59b6c Miltiadis Vasilakis
102 7446ae64 Miltiadis Vasilakis
#pragma mark - Memory management
103 7446ae64 Miltiadis Vasilakis
104 7446ae64 Miltiadis Vasilakis
- (void)dealloc {
105 7446ae64 Miltiadis Vasilakis
    [object release];
106 7446ae64 Miltiadis Vasilakis
    [account release];
107 7446ae64 Miltiadis Vasilakis
    [container release];
108 7446ae64 Miltiadis Vasilakis
    [folderViewController release];
109 7446ae64 Miltiadis Vasilakis
    [folder release];
110 7446ae64 Miltiadis Vasilakis
    [permissions release];
111 7446ae64 Miltiadis Vasilakis
    [super dealloc];
112 38d59b6c Miltiadis Vasilakis
}
113 38d59b6c Miltiadis Vasilakis
114 7446ae64 Miltiadis Vasilakis
#pragma mark - Internal
115 7446ae64 Miltiadis Vasilakis
116 7446ae64 Miltiadis Vasilakis
- (void)updatePermissionsUserCatalog {
117 7446ae64 Miltiadis Vasilakis
    NSMutableArray *UUIDs = [NSMutableArray arrayWithCapacity:permissions.count];
118 7446ae64 Miltiadis Vasilakis
    for (NSString *user in [permissions allKeys]) {
119 7446ae64 Miltiadis Vasilakis
        NSRange rangeOfColumn = [user rangeOfString:@":"];
120 7446ae64 Miltiadis Vasilakis
        NSString *UUID = (rangeOfColumn.location == NSNotFound) ? user : [user substringToIndex:rangeOfColumn.location];
121 7446ae64 Miltiadis Vasilakis
        if (![UUID isEqualToString:@"*"]) {
122 7446ae64 Miltiadis Vasilakis
            [UUIDs addObject:UUID];
123 7446ae64 Miltiadis Vasilakis
        }
124 7446ae64 Miltiadis Vasilakis
    }
125 7446ae64 Miltiadis Vasilakis
    if (UUIDs.count) {
126 7446ae64 Miltiadis Vasilakis
        __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Loading permissions..."
127 7446ae64 Miltiadis Vasilakis
                                                                                                       andAddToView:self.view];
128 7446ae64 Miltiadis Vasilakis
        [[self.account.manager userCatalogForDisplaynames:nil UUIDs:UUIDs]
129 7446ae64 Miltiadis Vasilakis
         success:^(OpenStackRequest *request) {
130 7446ae64 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
131 7446ae64 Miltiadis Vasilakis
             [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kPermissions] withRowAnimation:UITableViewRowAnimationNone];
132 7446ae64 Miltiadis Vasilakis
         }
133 7446ae64 Miltiadis Vasilakis
         failure:^(OpenStackRequest *request) {
134 7446ae64 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
135 7446ae64 Miltiadis Vasilakis
         }];
136 7446ae64 Miltiadis Vasilakis
    }
137 7446ae64 Miltiadis Vasilakis
}
138 7446ae64 Miltiadis Vasilakis
#pragma mark - Actions
139 7446ae64 Miltiadis Vasilakis
140 7446ae64 Miltiadis Vasilakis
- (void)reloadMetadataSection {
141 7446ae64 Miltiadis Vasilakis
    __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Loading metadata..."
142 7446ae64 Miltiadis Vasilakis
                                                                                                   andAddToView:self.view];
143 7446ae64 Miltiadis Vasilakis
    [[self.account.manager getObjectInfo:container object:object version:nil]
144 7446ae64 Miltiadis Vasilakis
     success:^(OpenStackRequest *request) {
145 7446ae64 Miltiadis Vasilakis
         [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
146 7446ae64 Miltiadis Vasilakis
         folder.metadata = [NSMutableDictionary dictionary];
147 7446ae64 Miltiadis Vasilakis
         for (NSString *header in request.responseHeaders) {
148 7446ae64 Miltiadis Vasilakis
             NSString *metadataKey;
149 7446ae64 Miltiadis Vasilakis
             NSString *metadataValue;
150 7446ae64 Miltiadis Vasilakis
             if ([header rangeOfString:@"X-Object-Meta-"].location != NSNotFound) {
151 7446ae64 Miltiadis Vasilakis
                 metadataKey = [NSString decodeFromPercentEscape:[header substringFromIndex:14]];
152 7446ae64 Miltiadis Vasilakis
                 metadataValue = [NSString decodeFromPercentEscape:[request.responseHeaders objectForKey:header]];
153 7446ae64 Miltiadis Vasilakis
                 [folder.metadata setObject:metadataValue forKey:metadataKey];
154 7446ae64 Miltiadis Vasilakis
             }
155 7446ae64 Miltiadis Vasilakis
         }
156 7446ae64 Miltiadis Vasilakis
         object.metadata = folder.metadata;
157 7446ae64 Miltiadis Vasilakis
         [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kMetadata] withRowAnimation:UITableViewRowAnimationFade];
158 7446ae64 Miltiadis Vasilakis
         [self updatePermissionsUserCatalog];
159 7446ae64 Miltiadis Vasilakis
     }
160 7446ae64 Miltiadis Vasilakis
     failure:^(OpenStackRequest *request) {
161 7446ae64 Miltiadis Vasilakis
         [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
162 7446ae64 Miltiadis Vasilakis
         [self alert:@"There was a problem retrieving the object's metadata." request:request];
163 7446ae64 Miltiadis Vasilakis
     }];
164 7446ae64 Miltiadis Vasilakis
}
165 7446ae64 Miltiadis Vasilakis
166 7446ae64 Miltiadis Vasilakis
#pragma mark - UITableViewDataSource
167 38d59b6c Miltiadis Vasilakis
168 60731366 Miltiadis Vasilakis
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
169 d17a05de Miltiadis Vasilakis
    return 3;
170 38d59b6c Miltiadis Vasilakis
}
171 38d59b6c Miltiadis Vasilakis
172 60731366 Miltiadis Vasilakis
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
173 de548234 Miltiadis Vasilakis
    if (section == kOverview) {
174 1ab29d03 Miltiadis Vasilakis
        return (folder.lastModifiedString ? 3 : 2);
175 de548234 Miltiadis Vasilakis
    } else if (section == kPermissions) {
176 de548234 Miltiadis Vasilakis
        if (account.sharingAccount) {
177 7446ae64 Miltiadis Vasilakis
            return permissions.count;
178 de548234 Miltiadis Vasilakis
        } else {
179 7446ae64 Miltiadis Vasilakis
            return (permissions.count + 1);
180 de548234 Miltiadis Vasilakis
        }
181 de548234 Miltiadis Vasilakis
    } else if (section == kMetadata) {
182 de548234 Miltiadis Vasilakis
        if (folderIsReadOnly) {
183 54fd5c36 Miltiadis Vasilakis
            return [folder.metadata count];
184 de548234 Miltiadis Vasilakis
        } else {
185 7446ae64 Miltiadis Vasilakis
            return ([folder.metadata count] + 1);
186 de548234 Miltiadis Vasilakis
        }
187 de548234 Miltiadis Vasilakis
    }
188 de548234 Miltiadis Vasilakis
    return 0;
189 38d59b6c Miltiadis Vasilakis
}
190 38d59b6c Miltiadis Vasilakis
191 221c2106 Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
192 cacaa443 Miltiadis Vasilakis
    CGFloat result = tableView.rowHeight;
193 cacaa443 Miltiadis Vasilakis
    if ((indexPath.section == kOverview) && ((indexPath.row == 0) || (indexPath.row == 1))) {
194 cacaa443 Miltiadis Vasilakis
        NSString *text;
195 221c2106 Miltiadis Vasilakis
        if (indexPath.row == 0) {
196 cacaa443 Miltiadis Vasilakis
            text = folder.name;
197 192b305e Miltiadis Vasilakis
        } else {
198 cacaa443 Miltiadis Vasilakis
            text = folder.fullPath;
199 cacaa443 Miltiadis Vasilakis
            if ([text hasPrefix:@"/"]) {
200 cacaa443 Miltiadis Vasilakis
                text = [text substringFromIndex:1];
201 221c2106 Miltiadis Vasilakis
            }
202 221c2106 Miltiadis Vasilakis
        }
203 cacaa443 Miltiadis Vasilakis
        result = 22.0 + [text sizeWithFont:[UIFont systemFontOfSize:18.0]
204 cacaa443 Miltiadis Vasilakis
                         constrainedToSize:(([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ?
205 cacaa443 Miltiadis Vasilakis
                                            CGSizeMake(537.0, 9000.0) :
206 cacaa443 Miltiadis Vasilakis
                                            CGSizeMake(221.0, 9000.0))
207 cacaa443 Miltiadis Vasilakis
                             lineBreakMode:UILineBreakModeCharacterWrap].height;
208 221c2106 Miltiadis Vasilakis
    }
209 cacaa443 Miltiadis Vasilakis
    return MAX(tableView.rowHeight, result);
210 221c2106 Miltiadis Vasilakis
}
211 221c2106 Miltiadis Vasilakis
212 60731366 Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
213 38d59b6c Miltiadis Vasilakis
    static NSString *CellIdentifier = @"Cell";
214 38d59b6c Miltiadis Vasilakis
    
215 38d59b6c Miltiadis Vasilakis
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
216 38d59b6c Miltiadis Vasilakis
    if (cell == nil) {
217 38d59b6c Miltiadis Vasilakis
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
218 38d59b6c Miltiadis Vasilakis
219 38d59b6c Miltiadis Vasilakis
        cell.textLabel.backgroundColor = [UIColor clearColor];
220 38d59b6c Miltiadis Vasilakis
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
221 38d59b6c Miltiadis Vasilakis
        cell.detailTextLabel.numberOfLines = 0;
222 38d59b6c Miltiadis Vasilakis
        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
223 38d59b6c Miltiadis Vasilakis
        cell.detailTextLabel.textAlignment = UITextAlignmentRight;
224 38d59b6c Miltiadis Vasilakis
    }
225 38d59b6c Miltiadis Vasilakis
    
226 38d59b6c Miltiadis Vasilakis
    if (indexPath.section == kOverview) {
227 38d59b6c Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryNone;
228 38d59b6c Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
229 38d59b6c Miltiadis Vasilakis
        cell.accessoryView = nil;
230 38d59b6c Miltiadis Vasilakis
        if (indexPath.row == 0) {
231 38d59b6c Miltiadis Vasilakis
            cell.textLabel.text = @"Name";
232 38d59b6c Miltiadis Vasilakis
            cell.detailTextLabel.text = folder.name;
233 38d59b6c Miltiadis Vasilakis
        } else if (indexPath.row == 1) {
234 38d59b6c Miltiadis Vasilakis
            cell.textLabel.text = @"Full Path";
235 221c2106 Miltiadis Vasilakis
            NSString *folderFullPathToShow = folder.fullPath;
236 221c2106 Miltiadis Vasilakis
            if ([folderFullPathToShow hasPrefix:@"/"]) {
237 221c2106 Miltiadis Vasilakis
                folderFullPathToShow = [folderFullPathToShow substringFromIndex:1];
238 221c2106 Miltiadis Vasilakis
            }
239 221c2106 Miltiadis Vasilakis
            cell.detailTextLabel.text = folderFullPathToShow;
240 1ab29d03 Miltiadis Vasilakis
        } else if (indexPath.row == 2) {
241 1ab29d03 Miltiadis Vasilakis
            cell.textLabel.text = @"Last Modified";
242 1ab29d03 Miltiadis Vasilakis
            cell.detailTextLabel.text = folder.lastModifiedString;
243 38d59b6c Miltiadis Vasilakis
        }
244 38d59b6c Miltiadis Vasilakis
    } else if (indexPath.section == kMetadata) {
245 d17a05de Miltiadis Vasilakis
        if (folderIsReadOnly) {
246 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
247 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
248 d17a05de Miltiadis Vasilakis
            cell.userInteractionEnabled = NO;
249 d17a05de Miltiadis Vasilakis
        }
250 d17a05de Miltiadis Vasilakis
        else {
251 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
252 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
253 d17a05de Miltiadis Vasilakis
        }
254 38d59b6c Miltiadis Vasilakis
        cell.accessoryView = nil;
255 38d59b6c Miltiadis Vasilakis
        if (indexPath.row == [folder.metadata count]) {
256 38d59b6c Miltiadis Vasilakis
            cell.textLabel.text = @"Add Metadata";
257 38d59b6c Miltiadis Vasilakis
            cell.detailTextLabel.text = @"";
258 38d59b6c Miltiadis Vasilakis
        } else {
259 38d59b6c Miltiadis Vasilakis
            NSString *key = [[folder.metadata allKeys] objectAtIndex:indexPath.row];
260 38d59b6c Miltiadis Vasilakis
            NSString *value = [folder.metadata objectForKey:key];
261 38d59b6c Miltiadis Vasilakis
            NSString *metadataKeyCellText = key;
262 38d59b6c Miltiadis Vasilakis
            NSString *metadataValueCellText = value;
263 38d59b6c Miltiadis Vasilakis
            if ([metadataKeyCellText length] > maxMetadataViewableLength) {
264 38d59b6c Miltiadis Vasilakis
                metadataKeyCellText = [metadataKeyCellText substringToIndex:(maxMetadataViewableLength - 3)];
265 38d59b6c Miltiadis Vasilakis
                metadataKeyCellText = [metadataKeyCellText stringByAppendingString:@"..."];
266 38d59b6c Miltiadis Vasilakis
            }
267 38d59b6c Miltiadis Vasilakis
            if ([metadataValueCellText length] > maxMetadataViewableLength) {
268 38d59b6c Miltiadis Vasilakis
                metadataValueCellText = [metadataValueCellText substringToIndex:(maxMetadataViewableLength - 3)];
269 38d59b6c Miltiadis Vasilakis
                metadataValueCellText = [metadataValueCellText stringByAppendingString:@"..."];
270 38d59b6c Miltiadis Vasilakis
            }
271 38d59b6c Miltiadis Vasilakis
272 38d59b6c Miltiadis Vasilakis
            cell.textLabel.text = metadataKeyCellText;
273 38d59b6c Miltiadis Vasilakis
            cell.detailTextLabel.text = metadataValueCellText;
274 38d59b6c Miltiadis Vasilakis
        }
275 d17a05de Miltiadis Vasilakis
    } else if (indexPath.section == kPermissions) {
276 d17a05de Miltiadis Vasilakis
        if (account.sharingAccount) {
277 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
278 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
279 d17a05de Miltiadis Vasilakis
            cell.userInteractionEnabled = NO;
280 7446ae64 Miltiadis Vasilakis
        } else {
281 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
282 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
283 d17a05de Miltiadis Vasilakis
        }
284 d17a05de Miltiadis Vasilakis
        cell.accessoryView = nil;
285 d17a05de Miltiadis Vasilakis
        
286 7446ae64 Miltiadis Vasilakis
        if (indexPath.row == permissions.count) {
287 4b4b833e Miltiadis Vasilakis
            cell.textLabel.text = @"Share";
288 d17a05de Miltiadis Vasilakis
            cell.detailTextLabel.text = @""; 
289 7446ae64 Miltiadis Vasilakis
        } else {
290 7446ae64 Miltiadis Vasilakis
            NSString *user = [[[permissions allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] objectAtIndex:indexPath.row];
291 7446ae64 Miltiadis Vasilakis
            NSRange rangeOfColumn = [user rangeOfString:@":"];
292 7446ae64 Miltiadis Vasilakis
            NSString *UUID = (rangeOfColumn.location == NSNotFound) ? user : [user substringToIndex:rangeOfColumn.location];
293 7446ae64 Miltiadis Vasilakis
            NSString *group = ((rangeOfColumn.location == NSNotFound) || (rangeOfColumn.location == user.length - 1)) ? nil : [user substringFromIndex:(rangeOfColumn.location + 1)];
294 7446ae64 Miltiadis Vasilakis
            NSMutableString *displayname = [NSMutableString stringWithString:[account displaynameForUUID:UUID safe:YES]];
295 7446ae64 Miltiadis Vasilakis
            if (group) {
296 7446ae64 Miltiadis Vasilakis
                [displayname appendFormat:@":%@", group];
297 7446ae64 Miltiadis Vasilakis
            }
298 7446ae64 Miltiadis Vasilakis
            cell.textLabel.text = displayname;
299 7446ae64 Miltiadis Vasilakis
            
300 7446ae64 Miltiadis Vasilakis
            cell.detailTextLabel.numberOfLines = 1;
301 7446ae64 Miltiadis Vasilakis
            cell.detailTextLabel.lineBreakMode = UILineBreakModeTailTruncation;
302 7446ae64 Miltiadis Vasilakis
            cell.detailTextLabel.text = ([[permissions objectForKey:user] isEqualToString:@"write"] ? @"Read/Write" : @"Read Only");
303 d17a05de Miltiadis Vasilakis
        }
304 38d59b6c Miltiadis Vasilakis
    }
305 38d59b6c Miltiadis Vasilakis
306 38d59b6c Miltiadis Vasilakis
    return cell;
307 38d59b6c Miltiadis Vasilakis
}
308 38d59b6c Miltiadis Vasilakis
309 7446ae64 Miltiadis Vasilakis
#pragma mark - UITableViewDelegate
310 38d59b6c Miltiadis Vasilakis
311 60731366 Miltiadis Vasilakis
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
312 38d59b6c Miltiadis Vasilakis
    if (indexPath.section == kMetadata) {
313 38d59b6c Miltiadis Vasilakis
        EditMetadataViewController *vc = [[EditMetadataViewController alloc] initWithNibName:@"EditMetadataViewController" bundle:nil];
314 38d59b6c Miltiadis Vasilakis
        NSString *metadataKey;
315 38d59b6c Miltiadis Vasilakis
        NSString *metadataValue;
316 38d59b6c Miltiadis Vasilakis
        
317 38d59b6c Miltiadis Vasilakis
        if (indexPath.row == [self.folder.metadata count]) {
318 38d59b6c Miltiadis Vasilakis
            metadataKey = @"";
319 38d59b6c Miltiadis Vasilakis
            metadataValue = @"";
320 221c2106 Miltiadis Vasilakis
            vc.removeMetadataEnabled = FALSE;
321 38d59b6c Miltiadis Vasilakis
            vc.navigationItem.title = @"Add Metadata";
322 60731366 Miltiadis Vasilakis
        } else {
323 38d59b6c Miltiadis Vasilakis
            metadataKey = [[self.folder.metadata allKeys] objectAtIndex:indexPath.row];
324 38d59b6c Miltiadis Vasilakis
            metadataValue = [self.folder.metadata objectForKey:metadataKey];
325 221c2106 Miltiadis Vasilakis
            vc.removeMetadataEnabled = TRUE;
326 38d59b6c Miltiadis Vasilakis
            vc.navigationItem.title = @"Edit Metadata";
327 38d59b6c Miltiadis Vasilakis
        }
328 d17a05de Miltiadis Vasilakis
                
329 38d59b6c Miltiadis Vasilakis
        vc.metadataKey = metadataKey;
330 38d59b6c Miltiadis Vasilakis
        vc.metadataValue = metadataValue;
331 38d59b6c Miltiadis Vasilakis
        vc.account = account;
332 38d59b6c Miltiadis Vasilakis
        vc.container = container;
333 38d59b6c Miltiadis Vasilakis
        vc.object = object;
334 45f2fce6 Miltiadis Vasilakis
        vc.objectIsFolder = YES;
335 45f2fce6 Miltiadis Vasilakis
        vc.folderViewController = folderViewController;
336 38d59b6c Miltiadis Vasilakis
337 38d59b6c Miltiadis Vasilakis
        [self.navigationController pushViewController:vc animated:YES];
338 38d59b6c Miltiadis Vasilakis
        [vc release];
339 d17a05de Miltiadis Vasilakis
    } else if (indexPath.section == kPermissions) {
340 d17a05de Miltiadis Vasilakis
        EditPermissionsViewController *vc = [[EditPermissionsViewController alloc] initWithNibName:@"EditPermissionsViewController" bundle:nil];
341 d17a05de Miltiadis Vasilakis
        NSString *user;
342 d17a05de Miltiadis Vasilakis
        
343 7446ae64 Miltiadis Vasilakis
        if (indexPath.row == permissions.count) {
344 d17a05de Miltiadis Vasilakis
            user = @"";
345 d17a05de Miltiadis Vasilakis
            vc.removePermissionsEnabled = NO;
346 7446ae64 Miltiadis Vasilakis
            vc.navigationItem.title = @"Add Permission";
347 60731366 Miltiadis Vasilakis
        } else {
348 7446ae64 Miltiadis Vasilakis
            user = [[[permissions allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] objectAtIndex:indexPath.row];
349 d17a05de Miltiadis Vasilakis
            NSString *userPermissions = [permissions objectForKey:user];
350 7446ae64 Miltiadis Vasilakis
            if ([userPermissions rangeOfString:@"read"].location != NSNotFound) {
351 d17a05de Miltiadis Vasilakis
                vc.readPermissionSelected = YES;
352 7446ae64 Miltiadis Vasilakis
            } else {
353 d17a05de Miltiadis Vasilakis
                vc.readPermissionSelected = NO;
354 7446ae64 Miltiadis Vasilakis
            }
355 7446ae64 Miltiadis Vasilakis
            if ([userPermissions rangeOfString:@"write"].location != NSNotFound) {
356 d17a05de Miltiadis Vasilakis
                vc.writePermissionSelected = YES;
357 7446ae64 Miltiadis Vasilakis
            } else {
358 d17a05de Miltiadis Vasilakis
                vc.writePermissionSelected = NO;
359 7446ae64 Miltiadis Vasilakis
            }
360 d17a05de Miltiadis Vasilakis
            vc.removePermissionsEnabled = YES;
361 7446ae64 Miltiadis Vasilakis
            vc.navigationItem.title = @"Edit Permission";
362 d17a05de Miltiadis Vasilakis
        }
363 d17a05de Miltiadis Vasilakis
        
364 7446ae64 Miltiadis Vasilakis
        vc.permissionUser = user;
365 d17a05de Miltiadis Vasilakis
        vc.permissions = permissions;
366 d17a05de Miltiadis Vasilakis
        vc.account = account;
367 d17a05de Miltiadis Vasilakis
        vc.container = container;
368 d17a05de Miltiadis Vasilakis
        vc.object = object;
369 d17a05de Miltiadis Vasilakis
        vc.objectIsFolder = YES;
370 d17a05de Miltiadis Vasilakis
        vc.folderViewController = folderViewController;
371 d17a05de Miltiadis Vasilakis
        [self.navigationController pushViewController:vc animated:YES];
372 d17a05de Miltiadis Vasilakis
        [vc release];
373 d17a05de Miltiadis Vasilakis
    } 
374 38d59b6c Miltiadis Vasilakis
}
375 38d59b6c Miltiadis Vasilakis
376 38d59b6c Miltiadis Vasilakis
@end