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