Statistics
| Branch: | Tag: | Revision:

root / Classes / UIViewController+Conveniences.m @ 64929bae

History | View | Annotate | Download (9.5 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  UIViewController+Conveniences.m
3 700184fb Miltiadis Vasilakis
//
4 700184fb Miltiadis Vasilakis
//  Created by Mike Mayo on 7/21/10.
5 700184fb Miltiadis Vasilakis
//
6 700184fb Miltiadis Vasilakis
7 700184fb Miltiadis Vasilakis
#import "UIViewController+Conveniences.h"
8 700184fb Miltiadis Vasilakis
#import "NSObject+Conveniences.h"
9 700184fb Miltiadis Vasilakis
#import "OpenStackRequest.h"
10 700184fb Miltiadis Vasilakis
#import "LogEntryModalViewController.h"
11 700184fb Miltiadis Vasilakis
#import "APILogEntry.h"
12 700184fb Miltiadis Vasilakis
#import "OpenStackAccount.h"
13 700184fb Miltiadis Vasilakis
#import "ServerViewController.h"
14 700184fb Miltiadis Vasilakis
#import "OpenStackAppDelegate.h"
15 700184fb Miltiadis Vasilakis
#import "UIColor+MoreColors.h"
16 700184fb Miltiadis Vasilakis
#import "ErrorAlerter.h"
17 700184fb Miltiadis Vasilakis
#import "RootViewController.h"
18 700184fb Miltiadis Vasilakis
#import "Analytics.h"
19 700184fb Miltiadis Vasilakis
20 700184fb Miltiadis Vasilakis
#define kUpcoming 0
21 700184fb Miltiadis Vasilakis
#define kAllEvents 1
22 700184fb Miltiadis Vasilakis
23 700184fb Miltiadis Vasilakis
@implementation UIViewController (Conveniences)
24 700184fb Miltiadis Vasilakis
25 700184fb Miltiadis Vasilakis
-(void)cancelButtonPressed:(id)sender {
26 700184fb Miltiadis Vasilakis
	[self dismissModalViewControllerAnimated:YES];
27 700184fb Miltiadis Vasilakis
28 700184fb Miltiadis Vasilakis
//    if ([self respondsToSelector:@selector(serverViewController)] && [self respondsToSelector:@selector(actionIndexPath)]) {
29 700184fb Miltiadis Vasilakis
//        ServerViewController *vc = (ServerViewController *)[self performSelector:@selector(serverViewController)];
30 700184fb Miltiadis Vasilakis
//        [vc.tableView deselectRowAtIndexPath:(NSIndexPath *)[self performSelector:@selector(actionIndexPath)] animated:YES];
31 700184fb Miltiadis Vasilakis
//    }    
32 700184fb Miltiadis Vasilakis
}
33 700184fb Miltiadis Vasilakis
34 700184fb Miltiadis Vasilakis
- (void)addCancelButton {
35 700184fb Miltiadis Vasilakis
    UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)];
36 700184fb Miltiadis Vasilakis
    self.navigationItem.leftBarButtonItem = cancel;
37 700184fb Miltiadis Vasilakis
    [cancel release];
38 700184fb Miltiadis Vasilakis
}
39 700184fb Miltiadis Vasilakis
40 700184fb Miltiadis Vasilakis
- (void)addSaveButton {
41 700184fb Miltiadis Vasilakis
    UIBarButtonItem *save = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(saveButtonPressed:)];
42 700184fb Miltiadis Vasilakis
    self.navigationItem.rightBarButtonItem = save;
43 700184fb Miltiadis Vasilakis
    [save release];
44 700184fb Miltiadis Vasilakis
}
45 700184fb Miltiadis Vasilakis
46 700184fb Miltiadis Vasilakis
- (void)addAddButton {
47 700184fb Miltiadis Vasilakis
    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonPressed:)];
48 700184fb Miltiadis Vasilakis
    self.navigationItem.rightBarButtonItem = add;
49 700184fb Miltiadis Vasilakis
    [add release];
50 700184fb Miltiadis Vasilakis
}
51 700184fb Miltiadis Vasilakis
52 700184fb Miltiadis Vasilakis
- (void)addDoneButton {
53 700184fb Miltiadis Vasilakis
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];
54 700184fb Miltiadis Vasilakis
    self.navigationItem.rightBarButtonItem = done;
55 700184fb Miltiadis Vasilakis
    [done release];
56 700184fb Miltiadis Vasilakis
}
57 700184fb Miltiadis Vasilakis
58 700184fb Miltiadis Vasilakis
- (void)addNextButton {
59 700184fb Miltiadis Vasilakis
    UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(nextButtonPressed:)];
60 700184fb Miltiadis Vasilakis
    self.navigationItem.rightBarButtonItem = next;
61 700184fb Miltiadis Vasilakis
    [next release];
62 700184fb Miltiadis Vasilakis
}
63 700184fb Miltiadis Vasilakis
64 700184fb Miltiadis Vasilakis
- (void)presentModalViewControllerWithNavigation:(UIViewController *)viewController animated:(BOOL)animated {
65 700184fb Miltiadis Vasilakis
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
66 700184fb Miltiadis Vasilakis
    
67 700184fb Miltiadis Vasilakis
    TrackViewController(viewController);
68 700184fb Miltiadis Vasilakis
    
69 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
70 700184fb Miltiadis Vasilakis
        nav.modalPresentationStyle = UIModalPresentationFormSheet;
71 700184fb Miltiadis Vasilakis
        nav.navigationBar.barStyle = UIBarStyleBlack;
72 700184fb Miltiadis Vasilakis
        nav.navigationBar.opaque = NO;
73 700184fb Miltiadis Vasilakis
    } else {
74 700184fb Miltiadis Vasilakis
        nav.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;
75 700184fb Miltiadis Vasilakis
        nav.navigationBar.translucent = self.navigationController.navigationBar.translucent;
76 700184fb Miltiadis Vasilakis
        nav.navigationBar.opaque = self.navigationController.navigationBar.opaque;
77 700184fb Miltiadis Vasilakis
        nav.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;    
78 700184fb Miltiadis Vasilakis
    }
79 700184fb Miltiadis Vasilakis
    
80 700184fb Miltiadis Vasilakis
    [self.navigationController presentModalViewController:nav animated:animated];
81 700184fb Miltiadis Vasilakis
    [nav release];
82 700184fb Miltiadis Vasilakis
}
83 700184fb Miltiadis Vasilakis
84 700184fb Miltiadis Vasilakis
- (void)presentModalViewControllerWithNavigation:(UIViewController *)viewController {
85 700184fb Miltiadis Vasilakis
    [self presentModalViewControllerWithNavigation:viewController animated:YES];
86 700184fb Miltiadis Vasilakis
}
87 700184fb Miltiadis Vasilakis
88 700184fb Miltiadis Vasilakis
- (void)presentPrimaryViewController:(UIViewController *)viewController animated:(BOOL)animated {
89 700184fb Miltiadis Vasilakis
    // if we're on iphone, do a regular push, on iPad, let's change the split view
90 700184fb Miltiadis Vasilakis
    TrackViewController(viewController);
91 45f2fce6 Miltiadis Vasilakis
92 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
93 700184fb Miltiadis Vasilakis
        OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
94 700184fb Miltiadis Vasilakis
        app.masterNavigationController.viewControllers = [NSArray arrayWithObject:viewController];
95 700184fb Miltiadis Vasilakis
        if (app.rootViewController.popoverController != nil) {
96 700184fb Miltiadis Vasilakis
            viewController.navigationItem.leftBarButtonItem = app.barButtonItem;
97 700184fb Miltiadis Vasilakis
        }
98 700184fb Miltiadis Vasilakis
    } else {
99 700184fb Miltiadis Vasilakis
        [self.navigationController pushViewController:viewController animated:animated];
100 700184fb Miltiadis Vasilakis
    }
101 700184fb Miltiadis Vasilakis
}
102 700184fb Miltiadis Vasilakis
103 700184fb Miltiadis Vasilakis
- (void)presentPrimaryViewController:(UIViewController *)viewController {
104 700184fb Miltiadis Vasilakis
    [self presentPrimaryViewController:viewController animated:YES];
105 700184fb Miltiadis Vasilakis
}
106 700184fb Miltiadis Vasilakis
107 700184fb Miltiadis Vasilakis
- (void)alert:(NSString *)title message:(NSString *)message {
108 700184fb Miltiadis Vasilakis
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
109 700184fb Miltiadis Vasilakis
	[alert show];
110 700184fb Miltiadis Vasilakis
	[alert release];
111 700184fb Miltiadis Vasilakis
}
112 700184fb Miltiadis Vasilakis
113 700184fb Miltiadis Vasilakis
- (void)alert:(NSString *)message request:(OpenStackRequest *)request {
114 700184fb Miltiadis Vasilakis
    ErrorAlerter *alerter = [[ErrorAlerter alloc] init];
115 7db1712d Miltiadis Vasilakis
116 7db1712d Miltiadis Vasilakis
   if (request.responseStatusCode == 401) {
117 7db1712d Miltiadis Vasilakis
       message = [message stringByAppendingString:@"  Authorization failed.  Please check your User Name and API Key."];
118 7db1712d Miltiadis Vasilakis
   } else if (request.responseStatusCode == 503) {
119 7db1712d Miltiadis Vasilakis
       message = [message stringByAppendingString:@"  Service is currently unavailable.  Please try again later."];            
120 7db1712d Miltiadis Vasilakis
   }    
121 700184fb Miltiadis Vasilakis
    [alerter alert:message request:request viewController:self];
122 700184fb Miltiadis Vasilakis
}
123 700184fb Miltiadis Vasilakis
124 700184fb Miltiadis Vasilakis
- (void)failOnBadConnection {    
125 700184fb Miltiadis Vasilakis
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
126 700184fb Miltiadis Vasilakis
    if (![defaults boolForKey:@"already_failed_on_connection"]) {
127 700184fb Miltiadis Vasilakis
        [self alert:@"Connection Error" message:@"Please check your connection or API URL and try again."];
128 700184fb Miltiadis Vasilakis
    }
129 700184fb Miltiadis Vasilakis
    [defaults setBool:YES forKey:@"already_failed_on_connection"];
130 700184fb Miltiadis Vasilakis
    [defaults synchronize];              
131 700184fb Miltiadis Vasilakis
}
132 700184fb Miltiadis Vasilakis
133 700184fb Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)tableView emptyCellWithImage:(UIImage *)image title:(NSString *)title subtitle:(NSString *)subtitle deleteButtonTitle:(NSString *)deleteButtonTitle deleteButtonSelector:(SEL)deleteButtonSelector {
134 700184fb Miltiadis Vasilakis
    static NSString *CellIdentifier = @"EmptyCell";
135 700184fb Miltiadis Vasilakis
    
136 700184fb Miltiadis Vasilakis
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
137 700184fb Miltiadis Vasilakis
    if (cell == nil) {
138 700184fb Miltiadis Vasilakis
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
139 700184fb Miltiadis Vasilakis
    }
140 700184fb Miltiadis Vasilakis
    
141 700184fb Miltiadis Vasilakis
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, tableView.frame.size.height)];
142 700184fb Miltiadis Vasilakis
    container.center = cell.center;
143 700184fb Miltiadis Vasilakis
    container.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
144 700184fb Miltiadis Vasilakis
    
145 700184fb Miltiadis Vasilakis
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
146 700184fb Miltiadis Vasilakis
    
147 700184fb Miltiadis Vasilakis
    CGRect imageRect = CGRectMake(tableView.frame.size.width / 2.0 - imageView.frame.size.width / 2.0, (tableView.frame.size.height / 2.0 - imageView.frame.size.height / 2.0) - 35.0, imageView.frame.size.width, imageView.frame.size.height);
148 700184fb Miltiadis Vasilakis
    
149 700184fb Miltiadis Vasilakis
    if (deleteButtonTitle) {
150 700184fb Miltiadis Vasilakis
        imageRect = CGRectMake(tableView.frame.size.width / 2.0 - imageView.frame.size.width / 2.0, (tableView.frame.size.height / 2.0 - imageView.frame.size.height / 2.0) - 78.0, imageView.frame.size.width, imageView.frame.size.height);
151 700184fb Miltiadis Vasilakis
    }
152 700184fb Miltiadis Vasilakis
    
153 700184fb Miltiadis Vasilakis
    imageView.frame = imageRect;
154 700184fb Miltiadis Vasilakis
    
155 700184fb Miltiadis Vasilakis
    [container addSubview:imageView];
156 700184fb Miltiadis Vasilakis
    [imageView release];
157 700184fb Miltiadis Vasilakis
    
158 700184fb Miltiadis Vasilakis
    UIFont *font = [UIFont boldSystemFontOfSize:18.0];
159 700184fb Miltiadis Vasilakis
    CGSize size = [title sizeWithFont:font constrainedToSize:CGSizeMake(tableView.frame.size.width - 20.0, tableView.frame.size.height) lineBreakMode:UILineBreakModeWordWrap];
160 700184fb Miltiadis Vasilakis
    CGRect rect = CGRectMake(10.0, imageView.frame.origin.y + imageView.frame.size.height + 20.0, tableView.frame.size.width - 20.0, size.height);    
161 700184fb Miltiadis Vasilakis
    
162 700184fb Miltiadis Vasilakis
    UILabel *label = [[UILabel alloc] initWithFrame:rect];
163 700184fb Miltiadis Vasilakis
    label.numberOfLines = 0;
164 700184fb Miltiadis Vasilakis
    label.lineBreakMode = UILineBreakModeWordWrap;
165 700184fb Miltiadis Vasilakis
    label.font = font;
166 700184fb Miltiadis Vasilakis
    label.textColor = [UIColor emptyCollectionGrayColor];
167 700184fb Miltiadis Vasilakis
    label.text = title;
168 700184fb Miltiadis Vasilakis
    label.textAlignment = UITextAlignmentCenter;
169 700184fb Miltiadis Vasilakis
    [container addSubview:label];
170 700184fb Miltiadis Vasilakis
    
171 700184fb Miltiadis Vasilakis
    font = [UIFont boldSystemFontOfSize:14.0];
172 700184fb Miltiadis Vasilakis
    size = [subtitle sizeWithFont:font constrainedToSize:CGSizeMake(tableView.frame.size.width - 20.0, tableView.frame.size.height) lineBreakMode:UILineBreakModeWordWrap];
173 700184fb Miltiadis Vasilakis
    rect = CGRectMake(10.0, rect.origin.y + label.frame.size.height + 8.0, tableView.frame.size.width - 20.0, size.height);    
174 700184fb Miltiadis Vasilakis
    
175 700184fb Miltiadis Vasilakis
    UILabel *sublabel = [[UILabel alloc] initWithFrame:rect];
176 700184fb Miltiadis Vasilakis
    sublabel.numberOfLines = 0;
177 700184fb Miltiadis Vasilakis
    sublabel.lineBreakMode = UILineBreakModeWordWrap;
178 700184fb Miltiadis Vasilakis
    sublabel.font = font;
179 700184fb Miltiadis Vasilakis
    sublabel.textColor = [UIColor emptyCollectionGrayColor];
180 700184fb Miltiadis Vasilakis
    sublabel.text = subtitle;
181 700184fb Miltiadis Vasilakis
    sublabel.textAlignment = UITextAlignmentCenter;
182 700184fb Miltiadis Vasilakis
    [container addSubview:sublabel];
183 700184fb Miltiadis Vasilakis
    
184 700184fb Miltiadis Vasilakis
    
185 700184fb Miltiadis Vasilakis
    if (deleteButtonTitle) {
186 700184fb Miltiadis Vasilakis
        rect = CGRectMake(10.0, rect.origin.y + sublabel.frame.size.height + 57.0, 301.0, 43.0);        
187 700184fb Miltiadis Vasilakis
        UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
188 700184fb Miltiadis Vasilakis
        deleteButton.frame = rect;
189 700184fb Miltiadis Vasilakis
        deleteButton.titleLabel.font = [UIFont boldSystemFontOfSize:18.0];
190 700184fb Miltiadis Vasilakis
        [deleteButton setBackgroundImage:[UIImage imageNamed:@"red-button.png"] forState:UIControlStateNormal];
191 700184fb Miltiadis Vasilakis
        [deleteButton setTitle:deleteButtonTitle forState:UIControlStateNormal];
192 700184fb Miltiadis Vasilakis
        [deleteButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
193 700184fb Miltiadis Vasilakis
        [deleteButton addTarget:self action:deleteButtonSelector forControlEvents:UIControlEventTouchUpInside];
194 700184fb Miltiadis Vasilakis
        [container addSubview:deleteButton];
195 700184fb Miltiadis Vasilakis
    }
196 700184fb Miltiadis Vasilakis
    
197 700184fb Miltiadis Vasilakis
    [label release];
198 700184fb Miltiadis Vasilakis
    [sublabel release];
199 700184fb Miltiadis Vasilakis
    
200 700184fb Miltiadis Vasilakis
    [cell addSubview:container];
201 700184fb Miltiadis Vasilakis
    [container release];
202 700184fb Miltiadis Vasilakis
    
203 700184fb Miltiadis Vasilakis
    return cell;
204 700184fb Miltiadis Vasilakis
}
205 700184fb Miltiadis Vasilakis
206 700184fb Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)tableView emptyCellWithImage:(UIImage *)image title:(NSString *)title subtitle:(NSString *)subtitle {
207 700184fb Miltiadis Vasilakis
    return [self tableView:tableView emptyCellWithImage:image title:title subtitle:subtitle deleteButtonTitle:nil deleteButtonSelector:nil];
208 700184fb Miltiadis Vasilakis
}
209 700184fb Miltiadis Vasilakis
210 700184fb Miltiadis Vasilakis
@end