0,0 → 1,375 |
// |
// InAppSettingsViewController.m |
// InAppSettings |
// |
// Created by David Keegan on 11/21/09. |
// Copyright 2009 InScopeApps{+}. All rights reserved. |
// |
|
#import "InAppSettings.h" |
#import "InAppSettingsConstants.h" |
#import "InAppSettingsPSMultiValueSpecifierTable.h" |
|
@implementation InAppSettings |
|
+ (void) registerDefaults { |
[[[InAppSettingsReaderRegisterDefaults alloc] init] release]; |
} |
|
@end |
|
@implementation InAppSettingsModalViewController |
|
- (id) init { |
InAppSettingsViewController * settings = [[InAppSettingsViewController alloc] init]; |
|
self = [[UINavigationController alloc] initWithRootViewController:settings]; |
[settings addDoneButton]; |
[settings release]; |
return self; |
} |
|
@end |
|
@implementation InAppSettingsViewController |
|
@synthesize file; |
@synthesize settingsTableView; |
@synthesize firstResponder; |
@synthesize settingsReader; |
@synthesize delegate; |
@synthesize dataSource; |
|
|
#pragma mark modal view |
|
- (void) dismissModalView { |
[self.navigationController dismissModalViewControllerAnimated:YES]; |
} |
|
- (void) addDoneButton { |
UIBarButtonItem * doneButton = [[UIBarButtonItem alloc] |
initWithBarButtonSystemItem:UIBarButtonSystemItemDone |
target:self |
action:@selector(dismissModalView)]; |
|
self.navigationItem.rightBarButtonItem = doneButton; |
[doneButton release]; |
} |
|
#pragma mark setup view |
|
- (id) initWithFile:(NSString *)inputFile { |
self = [super init]; |
if (self != nil) { |
self.file = inputFile; |
} |
return self; |
} |
|
- (void) viewDidLoad { |
// setup the table |
self.settingsTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; |
self.settingsTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); |
self.settingsTableView.delegate = self; |
self.settingsTableView.dataSource = self; |
[self.view addSubview:self.settingsTableView]; |
|
// if the title is nil set it to Settings |
if (!self.title) { |
self.title = NSLocalizedString(@"Settings", nil); |
} |
|
// load settigns plist |
if (!self.file) { |
self.file = InAppSettingsRootFile; |
} |
|
InAppSettingsReader* tmpSettingsReader = [[InAppSettingsReader alloc] initWithFile:self.file dataSource:dataSource]; |
self.settingsReader = tmpSettingsReader; |
[tmpSettingsReader release]; |
|
|
// setup keyboard notification |
self.firstResponder = nil; |
[self registerForKeyboardNotifications]; |
} |
|
- (void) viewWillAppear:(BOOL)animated { |
self.firstResponder = nil; |
|
self.settingsTableView.contentInset = UIEdgeInsetsZero; |
self.settingsTableView.scrollIndicatorInsets = UIEdgeInsetsZero; |
|
[self.settingsTableView reloadData]; |
[super viewWillAppear:animated]; |
} |
|
- (void) viewWillDisappear:(BOOL)animated { |
self.firstResponder = nil; |
[super viewWillDisappear:animated]; |
} |
|
- (void) dealloc { |
self.firstResponder = nil; |
self.delegate = nil; |
|
[file release]; |
[settingsTableView release]; |
[settingsReader release]; |
[super dealloc]; |
} |
|
#pragma mark text field cell delegate |
|
- (void) textFieldDidBeginEditing:(UITextField *)cellTextField { |
self.firstResponder = cellTextField; |
|
// TODO: find a better way to get the cell from the text view |
NSIndexPath * indexPath = [self.settingsTableView indexPathForCell:(UITableViewCell *)[[cellTextField superview] superview]]; |
[self.settingsTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; |
} |
|
- (BOOL) textFieldShouldReturn:(UITextField *)cellTextField { |
self.firstResponder = nil; |
[cellTextField resignFirstResponder]; |
return YES; |
} |
|
#pragma mark keyboard notification |
|
- (void) registerForKeyboardNotifications { |
[[NSNotificationCenter defaultCenter] addObserver:self |
selector:@selector(keyboardWillShow:) |
name:UIKeyboardWillShowNotification object:nil]; |
|
[[NSNotificationCenter defaultCenter] addObserver:self |
selector:@selector(keyboardWillHide:) |
name:UIKeyboardWillHideNotification object:nil]; |
} |
|
- (void) keyboardWillShow:(NSNotification *)notification { |
if (self.firstResponder == nil) { |
// get the keybaord rect |
CGRect keyboardRect = [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; |
|
// determin the bottom inset for the table view |
UIEdgeInsets settingsTableInset = self.settingsTableView.contentInset; |
CGPoint tableViewScreenSpace = [self.settingsTableView.superview convertPoint:self.settingsTableView.frame.origin toView:nil]; |
CGFloat tableViewBottomOffset = InAppSettingsScreenHeight - (tableViewScreenSpace.y + self.settingsTableView.frame.size.height); |
settingsTableInset.bottom = keyboardRect.size.height - tableViewBottomOffset; |
|
[UIView beginAnimations:nil context:nil]; |
[UIView setAnimationDuration:InAppSettingsKeyboardAnimation]; |
[UIView setAnimationBeginsFromCurrentState:YES]; |
self.settingsTableView.contentInset = settingsTableInset; |
self.settingsTableView.scrollIndicatorInsets = settingsTableInset; |
[UIView commitAnimations]; |
} |
} |
|
- (void) keyboardWillHide:(NSNotification *)notification { |
if (self.firstResponder == nil) { |
[UIView beginAnimations:nil context:nil]; |
[UIView setAnimationDuration:InAppSettingsKeyboardAnimation]; |
[UIView setAnimationBeginsFromCurrentState:YES]; |
self.settingsTableView.contentInset = UIEdgeInsetsZero; |
self.settingsTableView.scrollIndicatorInsets = UIEdgeInsetsZero; |
[UIView commitAnimations]; |
} |
} |
|
#pragma mark specifier delegate |
|
- (void) settingsSpecifierUpdated:(InAppSettingsSpecifier *)specifier { |
if ([self.delegate respondsToSelector:@selector(InAppSettingsValue:forKey:)]) { |
[self.delegate InAppSettingsValue:[specifier getValue] forKey:[specifier getKey]]; |
} |
} |
|
#pragma mark Table view methods |
|
- (InAppSettingsSpecifier *) settingAtIndexPath:(NSIndexPath *)indexPath { |
return [[self.settingsReader.settings objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; |
} |
|
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { |
return [self.settingsReader.headers count]; |
} |
|
- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { |
return [self.settingsReader.headers objectAtIndex:section]; |
} |
|
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
return [[self.settingsReader.settings objectAtIndex:section] count]; |
} |
|
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { |
if (InAppSettingsDisplayPowered && [self.file isEqualToString:InAppSettingsRootFile] && section == (NSInteger)[self.settingsReader.headers count] - 1) { |
return InAppSettingsPowerFooterHeight; |
} |
return 0.0f; |
} |
|
- (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { |
if (InAppSettingsDisplayPowered && [self.file isEqualToString:InAppSettingsRootFile] && section == (NSInteger)[self.settingsReader.headers count] - 1) { |
UIView * powerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, InAppSettingsScreenWidth, InAppSettingsPowerFooterHeight)]; |
|
// InAppSettings label |
CGSize InAppSettingsSize = [InAppSettingsProjectName sizeWithFont:InAppSettingsFooterFont]; |
CGPoint InAppSettingsPos = CGPointMake((CGFloat)round((InAppSettingsScreenWidth * 0.5f) - (InAppSettingsSize.width * 0.5f)), |
(CGFloat)round((InAppSettingsPowerFooterHeight * 0.5f) - (InAppSettingsSize.height * 0.5f)) - 1); |
UILabel * InAppLabel = [[UILabel alloc] initWithFrame:CGRectMake(InAppSettingsPos.x, InAppSettingsPos.y, InAppSettingsSize.width, InAppSettingsSize.height)]; |
InAppLabel.text = InAppSettingsProjectName; |
InAppLabel.font = InAppSettingsFooterFont; |
InAppLabel.backgroundColor = [UIColor clearColor]; |
InAppLabel.textColor = InAppSettingsFooterBlue; |
InAppLabel.shadowColor = [UIColor whiteColor]; |
InAppLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); |
[powerView addSubview:InAppLabel]; |
[InAppLabel release]; |
|
// lighting bolts |
CGPoint leftLightningBoltPos = CGPointMake(InAppSettingsPos.x - InAppSettingsLightingBoltSize, |
(CGFloat)round((InAppSettingsPowerFooterHeight * 0.5f) - (InAppSettingsLightingBoltSize * 0.5f))); |
InAppSettingsLightningBolt * leftLightningBolt = [[InAppSettingsLightningBolt alloc] |
initWithFrame:CGRectMake(leftLightningBoltPos.x, leftLightningBoltPos.y, |
InAppSettingsLightingBoltSize, InAppSettingsLightingBoltSize)]; |
[powerView addSubview:leftLightningBolt]; |
[leftLightningBolt release]; |
|
CGPoint rightLightningBoltPos = CGPointMake((CGFloat)round(InAppSettingsPos.x + InAppSettingsSize.width), leftLightningBoltPos.y); |
InAppSettingsLightningBolt * rightLightningBolt = [[InAppSettingsLightningBolt alloc] |
initWithFrame:CGRectMake(rightLightningBoltPos.x, rightLightningBoltPos.y, |
InAppSettingsLightingBoltSize, InAppSettingsLightingBoltSize)]; |
rightLightningBolt.flip = YES; |
[powerView addSubview:rightLightningBolt]; |
[rightLightningBolt release]; |
|
return [powerView autorelease]; |
} |
return nil; |
} |
|
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
InAppSettingsSpecifier * setting = [self settingAtIndexPath:indexPath]; |
|
setting.delegate = self; |
|
// get the NSClass for a specifier, if there is none use the base class InAppSettingsTableCell |
NSString * cellType = [setting cellName]; |
Class nsclass = NSClassFromString(cellType); |
if (!nsclass) { |
cellType = @"InAppSettingsTableCell"; |
nsclass = NSClassFromString(cellType); |
} |
|
InAppSettingsTableCell * cell = ((InAppSettingsTableCell *)[tableView dequeueReusableCellWithIdentifier:cellType]); |
if (cell == nil) { |
cell = [[[nsclass alloc] initWithReuseIdentifier:cellType] autorelease]; |
// setup the cells controlls |
[cell setupCell]; |
} |
|
// set the values of the cell, this is separated from setupCell for reloading the table |
cell.setting = setting; |
[cell setValueDelegate:self]; |
[cell setUIValues]; |
|
return cell; |
} |
|
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
InAppSettingsSpecifier * setting = [self settingAtIndexPath:indexPath]; |
|
if ([setting isType:InAppSettingsPSMultiValueSpecifier]) { |
InAppSettingsPSMultiValueSpecifierTable * multiValueSpecifier = [[InAppSettingsPSMultiValueSpecifierTable alloc] initWithSetting:setting]; |
[self.navigationController pushViewController:multiValueSpecifier animated:YES]; |
[multiValueSpecifier release]; |
} else if ([setting isType:InAppSettingsPSChildPaneSpecifier]) { |
|
if ( [setting valueForKey:InAppSettingsSpecifierInAppChildPaneClass] ) { |
|
UIViewController * childPane; |
|
Class childPaneClass = NSClassFromString([setting valueForKey:InAppSettingsSpecifierInAppChildPaneClass]); |
if ( [childPaneClass conformsToProtocol:@protocol(InAppSettingsChildPane)] ) { |
childPane = [[childPaneClass alloc] initWithSetting:setting]; |
} else { |
childPane = [[childPaneClass alloc] init]; |
} |
|
childPane.title = [setting localizedTitle]; |
[self.navigationController pushViewController:childPane animated:YES]; |
[childPane release]; |
} else { |
|
InAppSettingsViewController * childPane = [[InAppSettingsViewController alloc] initWithFile:[setting valueForKey:InAppSettingsSpecifierFile]]; |
childPane.title = [setting localizedTitle]; |
childPane.dataSource = self.dataSource; |
[self.navigationController pushViewController:childPane animated:YES]; |
[childPane release]; |
} |
} else if ([setting isType:InAppSettingsPSTitleValueSpecifier]) { |
InAppSettingsOpenUrl([NSURL URLWithString:[setting valueForKey:InAppSettingsSpecifierInAppURL]]); |
} |
} |
|
- (NSIndexPath *) tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
InAppSettingsTableCell * cell = ((InAppSettingsTableCell *)[tableView cellForRowAtIndexPath:indexPath]); |
|
if ([cell.setting isType:@"PSTextFieldSpecifier"]) { |
[cell.valueInput becomeFirstResponder]; |
} else if (cell.canSelectCell) { |
[self.firstResponder resignFirstResponder]; |
return indexPath; |
} |
return nil; |
} |
|
@end |
|
@implementation InAppSettingsLightningBolt |
|
@synthesize flip; |
|
- (id) initWithFrame:(CGRect)frame { |
self = [super initWithFrame:frame]; |
if (self != nil) { |
self.flip = NO; |
self.backgroundColor = [UIColor clearColor]; |
} |
return self; |
} |
|
- (void) drawRect:(CGRect)rect { |
CGContextRef context = UIGraphicsGetCurrentContext(); |
|
CGContextSetFillColorWithColor(context, [InAppSettingsFooterBlue CGColor]); |
#if __IPHONE_3_2 |
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 1.0f), 0.0f, [[UIColor whiteColor] CGColor]); |
#else |
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, -1.0f), 0.0f, [[UIColor whiteColor] CGColor]); |
#endif |
if (self.flip) { |
CGContextMoveToPoint(context, 4.0f, 1.0f); |
CGContextAddLineToPoint(context, 13.0f, 1.0f); |
CGContextAddLineToPoint(context, 10.0f, 5.0f); |
CGContextAddLineToPoint(context, 12.0f, 7.0f); |
CGContextAddLineToPoint(context, 2.0f, 15.0f); |
CGContextAddLineToPoint(context, 5.0f, 7.0f); |
CGContextAddLineToPoint(context, 3.0f, 5.0f); |
} else { |
CGContextMoveToPoint(context, 3.0f, 1.0f); |
CGContextAddLineToPoint(context, 12.0f, 1.0f); |
CGContextAddLineToPoint(context, 13.0f, 5.0f); |
CGContextAddLineToPoint(context, 11.0f, 7.0f); |
CGContextAddLineToPoint(context, 14.0f, 15.0f); |
CGContextAddLineToPoint(context, 4.0f, 7.0f); |
CGContextAddLineToPoint(context, 6.0f, 5.0f); |
} |
CGContextFillPath(context); |
} |
|
@end |