0,0 → 1,411 |
///////////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2010, Frank Blumenberg |
// |
// See License.txt for complete licensing and attribution information. |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to deal |
// in the Software without restriction, including without limitation the rights |
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
// copies of the Software, and to permit persons to whom the Software is |
// furnished to do so, subject to the following conditions: |
// |
// The above copyright notice and this permission notice shall be included in all |
// copies or substantial portions of the Software. |
// |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
// THE SOFTWARE. |
// |
///////////////////////////////////////////////////////////////////////////////// |
|
#import "MainViewController.h" |
#import "InAppSettings.h" |
#import "Settings.h" |
#import "GradientButton.h" |
#import "MKConnectionController.h" |
#import "MKDataConstants.h" |
#import "MKIpConnection.h" |
#import "MKFakeConnection.h" |
#import "LcdViewController.h" |
#import "AnalogViewController.h" |
#import "SettingsSelectionViewController.h" |
|
#define CONNECT_SECTIONID 0 |
|
@interface MainViewController (Private) |
|
-(void)initCellForConnectionButton:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; |
-(void)initCellForConnectionButtonDisconnected:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; |
-(void)initCellForConnectionButtonConnecting:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; |
-(void)initCellForConnectionButtonConnected:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; |
-(void)initCellForMenu:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath; |
|
@end |
|
|
////////////////////////////////////////////////////////////////////////////////////////////// |
@implementation MainViewController |
|
@synthesize versionString = _versionString; |
@synthesize controllers = _controllers; |
|
#pragma mark - |
#pragma mark View lifecycle |
|
|
- (void)viewDidLoad { |
|
|
self.title = @"µKopter"; |
//self.tableView.backgroundColor=[UIColor darkGrayColor]; |
|
NSMutableArray *array = [[NSMutableArray alloc] init]; |
|
// SettingsMainViewController* settingsController = [[SettingsMainViewController alloc] |
// initWithNibName:@"SettingsMainViewController" bundle:nil]; |
|
SettingsSelectionViewController* settingsController = [[SettingsSelectionViewController alloc] |
initWithStyle:UITableViewStyleGrouped]; |
|
settingsController.title = NSLocalizedString(@"Settings",@"Settings controller title"); |
[array addObject:settingsController]; |
[settingsController release]; |
|
LcdViewController* lcdController = [[LcdViewController alloc] |
initWithNibName:@"LcdViewController" bundle:nil]; |
|
lcdController.title = NSLocalizedString(@"LCD Menu",@"LCD Menu controller title"); |
[array addObject:lcdController]; |
[lcdController release]; |
|
|
AnalogViewController* analogController = [[AnalogViewController alloc] |
initWithStyle:UITableViewStylePlain]; |
|
analogController.title = NSLocalizedString(@"Analog Values",@"Analog values controller title"); |
[array addObject:analogController]; |
[analogController release]; |
|
self.controllers = array; |
[array release]; |
|
connectionState=MKConnectionStateDisconnected; |
|
//Disable tableview scrolling. |
self.tableView.scrollEnabled = NO; |
|
NSNotificationCenter* nc=[NSNotificationCenter defaultCenter]; |
|
[nc addObserver:self |
selector:@selector(connectionRequestDidSucceed:) |
name:MKConnectedNotification |
object:nil]; |
|
[nc addObserver:self |
selector:@selector(disconnected:) |
name:MKDisconnectedNotification |
object:nil]; |
|
[nc addObserver:self |
selector:@selector(connectionRequestDidFail:) |
name:MKDisconnectErrorNotification |
object:nil]; |
|
[nc addObserver:self |
selector:@selector(versionResponse:) |
name:MKVersionNotification |
object:nil]; |
|
|
[super viewDidLoad]; |
} |
|
-(void) viewDidAppear:(BOOL)animated { |
[self.tableView reloadData]; |
} |
|
#pragma mark - |
#pragma mark Memory management |
|
- (void)didReceiveMemoryWarning { |
// Releases the view if it doesn't have a superview. |
[super didReceiveMemoryWarning]; |
|
// Relinquish ownership any cached data, images, etc that aren't in use. |
} |
|
- (void)viewDidUnload { |
|
self.versionString=nil; |
self.controllers = nil; |
[super viewDidUnload]; |
} |
|
- (void)dealloc { |
[_versionString release]; |
[_controllers release]; |
|
[super dealloc]; |
} |
|
|
////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Table view data source |
|
|
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
return 2; |
} |
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
|
if(section==CONNECT_SECTIONID) |
return 1; |
|
return connectionState==MKConnectionStateConnected?[self.controllers count]:0; |
} |
|
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section |
{ |
if (section!=CONNECT_SECTIONID) |
return nil; |
|
DLog(@"Footer for %d state %d",section,connectionState); |
|
if(connectionState==MKConnectionStateConnected && self.versionString!=nil ) |
return self.versionString; |
|
return NSLocalizedString(@"Not Connected",@"Connection version string"); |
} |
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
|
DLog(@"%@ state %d",indexPath,connectionState); |
|
static NSString *CellIdentifier = @"Cell"; |
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
if (cell == nil) { |
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; |
} |
|
if (indexPath.section==CONNECT_SECTIONID) { |
[self initCellForConnectionButton:cell forRowAtIndexPath:indexPath]; |
} |
else { |
[self initCellForMenu:cell forRowAtIndexPath:indexPath]; |
} |
|
return cell; |
} |
|
|
////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Table cell initialization |
|
- (void)initCellForConnectionButton:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
cell.textLabel.text=[[NSUserDefaults standardUserDefaults] stringForKey:kHostnameKey]; |
cell.selectionStyle = UITableViewCellSelectionStyleNone; |
|
switch (connectionState) { |
case MKConnectionStateConnected: |
[self initCellForConnectionButtonConnected:cell forRowAtIndexPath:indexPath]; |
break; |
case MKConnectionStateConnecting: |
[self initCellForConnectionButtonConnecting:cell forRowAtIndexPath:indexPath]; |
break; |
default: |
[self initCellForConnectionButtonDisconnected:cell forRowAtIndexPath:indexPath]; |
break; |
} |
} |
|
- (void)initCellForConnectionButtonDisconnected:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
cell.selectionStyle = UITableViewCellSelectionStyleNone; |
cell.accessoryView = nil; |
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; |
} |
|
- (UIView *) initCancelButton |
{ |
UIView *accView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 94, 35)]; |
|
GradientButton *cancelButton = [[GradientButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 63.0, 33.0)]; |
|
[cancelButton useRedDeleteStyle]; |
[cancelButton setTitle:NSLocalizedString(@"Abort",@"Conncetion abort button") forState:UIControlStateNormal]; |
[cancelButton addTarget:self action:@selector(userDidCancelLastConnectRequest) forControlEvents:UIControlEventTouchDown]; |
cancelButton.titleLabel.font = [UIFont boldSystemFontOfSize:14]; |
|
UIActivityIndicatorView *gear = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease]; |
gear.frame = CGRectMake(68.0, 5.5, 22.0, 22.0); |
[gear startAnimating]; |
|
[accView addSubview:gear]; |
[accView addSubview:cancelButton]; |
return accView; |
} |
|
- (void)initCellForConnectionButtonConnecting:(UITableViewCell *)cell |
{ |
UIView *accView; |
accView = [self initCancelButton]; |
|
cell.accessoryView = accView; |
cell.accessoryType = UITableViewCellAccessoryNone; |
[accView release]; |
} |
|
- (UIView *) initStopButton |
{ |
UIView *accView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 63, 35)]; |
|
GradientButton *stoplButton = [[GradientButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 63.0, 33.0)]; |
|
[stoplButton useAlertStyle]; |
[stoplButton setTitle:NSLocalizedString(@"Stop",@"Conncetion stop button") forState:UIControlStateNormal]; |
[stoplButton addTarget:self action:@selector(userDidDisconnect) forControlEvents:UIControlEventTouchDown]; |
stoplButton.titleLabel.font = [UIFont boldSystemFontOfSize:14]; |
|
[accView addSubview:stoplButton]; |
return accView; |
} |
|
- (void)initCellForConnectionButtonConnected:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
cell.detailTextLabel.text=@"Connected"; |
|
UIView *accView; |
accView = [self initStopButton]; |
|
cell.accessoryView = accView; |
cell.accessoryType = UITableViewCellAccessoryNone; |
[accView release]; |
} |
|
//----------------------------------------------------------------------- |
|
- (void)initCellForMenu:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
// Configure the cell |
NSUInteger row = [indexPath row]; |
UIViewController *controller = [_controllers objectAtIndex:row]; |
|
cell.textLabel.text = controller.title; |
cell.accessoryView = nil; |
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
} |
|
////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Connection status actions (Statemachine) |
|
- (void)userDidDisconnect; |
{ |
[[MKConnectionController sharedMKConnectionController] stop]; |
} |
|
- (void)userDidCancelLastConnectRequest; |
{ |
[[MKConnectionController sharedMKConnectionController] stop]; |
connectionState=MKConnectionStateDisconnected; |
[self.tableView reloadData]; |
} |
- (void)connectionRequestDidFail:(NSNotification *)aNotification; |
{ |
NSError* err = [[aNotification userInfo] objectForKey:@"error"]; |
|
UIAlertView *alert = [[UIAlertView alloc] |
initWithTitle:NSLocalizedString(@"Server error", @"Server error") |
message:[err localizedDescription] |
delegate:self |
cancelButtonTitle:@"Ok" |
otherButtonTitles:nil]; |
[alert show]; |
[alert release]; |
|
[self.navigationController popToRootViewControllerAnimated:YES]; |
|
connectionState=MKConnectionStateDisconnected; |
[self.tableView reloadData]; |
} |
- (void)connectionRequestDidSucceed:(NSNotification *)aNotification; |
{ |
DLog(@"Got connected"); |
|
connectionState=MKConnectionStateConnected; |
[self.tableView beginUpdates]; |
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade]; |
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:CONNECT_SECTIONID] withRowAnimation:UITableViewRowAnimationNone]; |
[self.tableView endUpdates]; |
} |
- (void)disconnected:(NSNotification *)aNotification; |
{ |
connectionState=MKConnectionStateDisconnected; |
[self.tableView beginUpdates]; |
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationBottom]; |
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:CONNECT_SECTIONID] withRowAnimation:UITableViewRowAnimationNone]; |
[self.tableView endUpdates]; |
} |
|
- (void)versionResponse:(NSNotification *)aNotification; |
{ |
self.versionString = [[MKConnectionController sharedMKConnectionController]longVersionForAddress:MKAddressFC]; |
|
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:CONNECT_SECTIONID] withRowAnimation:UITableViewRowAnimationNone]; |
} |
|
////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Table view delegate |
|
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{ |
|
if (indexPath.section==CONNECT_SECTIONID) { |
return (connectionState==MKConnectionStateDisconnected)?indexPath:nil; |
} |
|
return (connectionState==MKConnectionStateConnected)?indexPath:nil; |
} |
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
|
if (indexPath.section==CONNECT_SECTIONID && connectionState==MKConnectionStateDisconnected) { |
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; |
[self initCellForConnectionButtonConnecting:cell]; |
[tableView deselectRowAtIndexPath:indexPath animated:YES]; |
|
[[MKConnectionController sharedMKConnectionController] start]; |
} |
else { |
|
NSUInteger row = [indexPath row]; |
UIViewController* controller=[self.controllers objectAtIndex:row]; |
|
[self.navigationController pushViewController:controller animated:YES]; |
} |
|
} |
|
|
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { |
|
if( [indexPath section]==0 && [indexPath row]==0 ) { |
InAppSettingsViewController *settings = [[InAppSettingsViewController alloc] init]; |
[self.navigationController pushViewController:settings animated:YES]; |
} |
} |
|
|
@end |
|