project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m
changeset 3514 59dbd31e9953
parent 3490 016b3172b645
child 3546 ccf4854df294
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m	Thu Jun 17 20:30:39 2010 +0200
@@ -0,0 +1,398 @@
+//
+//  SettingsViewController.m
+//  hwengine
+//
+//  Created by Vittorio on 08/01/10.
+//  Copyright 2010 __MyCompanyName__. All rights reserved.
+//
+
+#import "GeneralSettingsViewController.h"
+#import "CommodityFunctions.h"
+
+@implementation GeneralSettingsViewController
+@synthesize settingsDictionary, textFieldBeingEdited, musicSwitch, soundSwitch, altDamageSwitch;
+
+
+-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
+	return rotationManager(interfaceOrientation);
+}
+
+
+#pragma mark -
+#pragma mark textfield methods
+// return to previous table
+-(void) cancel:(id) sender {
+    if (textFieldBeingEdited != nil)
+        [self.textFieldBeingEdited resignFirstResponder];
+}
+
+// set the new value
+-(BOOL) save:(id) sender {
+    if (textFieldBeingEdited != nil) {
+        if (textFieldBeingEdited.tag == 0) {
+            [self.settingsDictionary setObject:textFieldBeingEdited.text forKey:@"username"];
+        } else {
+            [self.settingsDictionary setObject:textFieldBeingEdited.text forKey:@"password"];
+        }
+        
+        isWriteNeeded = YES;
+        [self.textFieldBeingEdited resignFirstResponder];
+        return YES;
+    }
+    return NO;
+}
+
+// the textfield is being modified, update the navigation controller
+-(void) textFieldDidBeginEditing:(UITextField *)aTextField{   
+    self.textFieldBeingEdited = aTextField;
+    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel",@"from the settings table")
+                                                                     style:UIBarButtonItemStylePlain
+                                                                    target:self
+                                                                    action:@selector(cancel:)];
+    self.navigationItem.leftBarButtonItem = cancelButton;
+    [cancelButton release];
+    
+    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Save",@"from the settings table")
+                                                                     style:UIBarButtonItemStyleDone
+                                                                    target:self
+                                                                    action:@selector(save:)];
+    self.navigationItem.rightBarButtonItem = saveButton;
+    [saveButton release];
+}
+
+// the textfield has been modified, check for empty strings and restore original navigation bar
+-(void) textFieldDidEndEditing:(UITextField *)aTextField{
+    self.textFieldBeingEdited = nil;
+    self.navigationItem.rightBarButtonItem = self.navigationItem.backBarButtonItem;
+    self.navigationItem.leftBarButtonItem = nil;
+}
+
+// limit the size of the field to 64 characters like in original frontend
+-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    int limit = 64;
+    return !([textField.text length] > limit && [string length] > range.length);
+}
+
+
+#pragma mark -
+#pragma mark View Lifecycle
+-(void) viewDidLoad {
+	[super viewDidLoad];
+    self.musicSwitch = [[UISwitch alloc] init];
+	self.soundSwitch = [[UISwitch alloc] init];
+	self.altDamageSwitch = [[UISwitch alloc] init];
+	[self.soundSwitch addTarget:self action:@selector(alsoTurnOffMusic:) forControlEvents:UIControlEventValueChanged];
+	[self.musicSwitch addTarget:self action:@selector(dontTurnOnMusic:) forControlEvents:UIControlEventValueChanged];
+	[self.altDamageSwitch addTarget:self action:@selector(justUpdateDictionary:) forControlEvents:UIControlEventValueChanged];
+    
+    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()];
+    self.settingsDictionary = dictionary;
+    [dictionary release];
+}
+
+-(void) viewWillAppear:(BOOL)animated {
+    [self.tableView setContentOffset:CGPointMake(0,0) animated:NO];
+    isWriteNeeded = NO;
+    
+    musicSwitch.on = [[settingsDictionary objectForKey:@"music"] boolValue];
+    soundSwitch.on = [[settingsDictionary objectForKey:@"sound"] boolValue];
+    altDamageSwitch.on = [[settingsDictionary objectForKey:@"alternate"] boolValue];
+    
+    [super viewWillAppear:animated];
+}
+
+-(void) viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    
+    if (isWriteNeeded) {
+       	NSLog(@"writing preferences to file");
+        [self.settingsDictionary writeToFile:SETTINGS_FILE() atomically:YES];
+        isWriteNeeded = NO;
+    }
+}
+
+#pragma mark -
+// if the sound system is off, turn off also the background music 
+-(void) alsoTurnOffMusic:(id) sender {
+    [self.settingsDictionary setObject:[NSNumber numberWithBool:soundSwitch.on] forKey:@"sound"];
+	if (YES == self.musicSwitch.on) {
+		[musicSwitch setOn:NO animated:YES];
+        [self.settingsDictionary setObject:[NSNumber numberWithBool:musicSwitch.on] forKey:@"music"];
+	}
+    isWriteNeeded = YES;
+}
+
+// if the sound system is off, don't enable background music 
+-(void) dontTurnOnMusic:(id) sender {
+	if (NO == self.soundSwitch.on) {
+		[musicSwitch setOn:NO animated:YES];
+	} else {
+        [self.settingsDictionary setObject:[NSNumber numberWithBool:musicSwitch.on] forKey:@"music"];
+        isWriteNeeded = YES;
+    }
+}
+
+-(void) justUpdateDictionary:(id) sender {
+    UISwitch *theSwitch = (UISwitch *)sender;
+    [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"alternate"];
+    isWriteNeeded = YES;
+}
+
+/*
+#pragma mark -
+#pragma mark UIActionSheet Methods
+-(IBAction) deleteData: (id)sender {
+	UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Are you reeeeeally sure?", @"")
+								 delegate:self
+							cancelButtonTitle:NSLocalizedString(@"Well, maybe not...", @"")
+						   destructiveButtonTitle:NSLocalizedString(@"As sure as I can be!", @"")
+							otherButtonTitles:nil];
+	[actionSheet showInView:self.view];
+	[actionSheet release];
+}
+
+-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex {
+	if ([actionSheet cancelButtonIndex] != buttonIndex) {
+		// get the documents dirctory
+		NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+		NSString *documentsDirectory = [paths objectAtIndex:0];
+		
+		// get the content of the directory
+		NSFileManager *fm = [NSFileManager defaultManager];
+		NSArray *dirContent = [fm directoryContentsAtPath:documentsDirectory];
+		NSError *error;
+		
+		// delete data
+		for (NSString *fileName in dirContent) {
+			[fm removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:fileName] error:&error];
+		}
+		
+		// force resetting
+		UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Hit Home Button to Exit", @"")
+								  message:NSLocalizedString(@"\nEverything is gone!\nNow you need to restart the game...", @"")
+								 delegate:self
+							cancelButtonTitle:nil
+							otherButtonTitles:nil];
+		[anAlert show];
+		[anAlert release];
+	}
+}
+*/
+
+#pragma mark -
+#pragma mark TableView Methods
+-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
+	return 3;
+}
+
+-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+	switch (section) {
+		case kNetworkFields:
+			return 2;
+			break;
+		case kAudioFields:
+			return 2;
+			break;
+		case kOtherFields:
+			return 1;
+			break;
+		default:
+			break;
+	}
+	return 0;
+}
+
+-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+	static NSString *cellIdentifier = @"systemSettingsCell";
+	NSInteger row = [indexPath row];
+    NSInteger section = [indexPath section];
+    
+	UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:cellIdentifier];
+    if (nil == cell) {
+        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
+        if (section == kNetworkFields) {
+            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(-15, 10, 100, 25)];
+            label.textAlignment = UITextAlignmentRight;
+            label.backgroundColor = [UIColor clearColor];
+            label.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize] + 2];
+            if (row == 0) 
+                label.text = NSLocalizedString(@"Nickname","from the settings table");
+            else 
+                label.text = NSLocalizedString(@"Password","from the settings table");
+            [cell.contentView addSubview:label];
+            [label release];
+            
+            UITextField *aTextField = [[UITextField alloc] initWithFrame:
+                                       CGRectMake(110, 12, (cell.frame.size.width + cell.frame.size.width/3) - 90, 25)];
+            aTextField.clearsOnBeginEditing = NO;
+            aTextField.returnKeyType = UIReturnKeyDone;
+            aTextField.adjustsFontSizeToFitWidth = YES;
+            aTextField.delegate = self;
+            aTextField.tag = row;
+            aTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
+            [aTextField addTarget:self action:@selector(save:) forControlEvents:UIControlEventEditingDidEndOnExit];
+            [cell.contentView addSubview:aTextField];
+            [aTextField release];
+        }
+    }
+    
+    cell.accessoryType = UITableViewCellAccessoryNone;
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+    cell.imageView.image = nil;
+    
+    UITextField *aTextField;
+    switch (section) {
+        case kNetworkFields:
+            for (UIView *oneView in cell.contentView.subviews) 
+                if ([oneView isMemberOfClass:[UITextField class]]) 
+                    aTextField = (UITextField *)oneView;
+
+            switch (row) {
+				case 0:                    
+                    aTextField.placeholder = NSLocalizedString(@"Insert your username (if you have one)",@"");
+                    aTextField.text = [self.settingsDictionary objectForKey:@"username"];
+					break;
+				case 1:                    
+                    aTextField.placeholder = NSLocalizedString(@"Insert your password",@"");
+                    aTextField.text = [self.settingsDictionary objectForKey:@"password"];
+                    aTextField.secureTextEntry = YES;
+					break;
+				default:
+					break;
+			}
+			break;
+            
+		case kAudioFields:
+			switch (row) {
+				case 0:
+					cell.textLabel.text = NSLocalizedString(@"Sound", @"");
+					cell.accessoryView = soundSwitch;
+					break;
+				case 1:
+					cell.textLabel.text = NSLocalizedString(@"Music", @"");
+					cell.accessoryView = musicSwitch;
+					break;
+				default:
+					break;
+			}
+			break;
+            
+		case kOtherFields:
+            cell.selectionStyle = UITableViewCellSelectionStyleNone;
+			cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @"");
+			cell.accessoryView = altDamageSwitch;
+			break;
+		default:
+			break;
+	}
+	return cell;
+}
+
+-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
+    NSString *sectionTitle = nil;
+    switch (section) {
+		case kNetworkFields:
+			sectionTitle = NSLocalizedString(@"Network Configuration", @"");
+			break;
+		case kAudioFields:
+			sectionTitle = NSLocalizedString(@"Audio Preferences", @"");
+			break;
+		case kOtherFields:
+			sectionTitle = NSLocalizedString(@"Other Settings", @"");
+			break;
+		default:
+			NSLog(@"Nope");
+			break;
+	}
+    return sectionTitle;
+}
+
+/*
+-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+	UIView *containerView =	[[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 50)] autorelease];
+	UILabel *headerLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 300, 40)] autorelease];
+	headerLabel.textColor = [UIColor lightGrayColor];
+	headerLabel.shadowColor = [UIColor blackColor];
+	headerLabel.shadowOffset = CGSizeMake(0, 1);
+	headerLabel.font = [UIFont boldSystemFontOfSize:20];
+	headerLabel.backgroundColor = [UIColor clearColor];
+
+	switch (section) {
+		case kNetworkFields:
+			headerLabel.text = NSLocalizedString(@"Network Configuration", @"");
+			break;
+		case kAudioFields:
+			headerLabel.text = NSLocalizedString(@"Audio Preferences", @"");
+			break;
+		case kOtherFields:
+			headerLabel.text = NSLocalizedString(@"Other Settings", @"");
+			break;
+		default:
+			NSLog(@"Warning: unset case value in titleForHeaderInSection!");
+			headerLabel.text = @"!";
+			break;
+	}
+	
+	[containerView addSubview:headerLabel];
+	return containerView;
+}
+
+-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+	if (kAudioFields == [indexPath section] && 2 == [indexPath row])
+		return volumeCell.frame.size.height;
+	else
+		return table.rowHeight;
+}
+
+-(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+	return 57.0;
+}
+*/
+
+
+#pragma mark -
+#pragma mark Table view delegate
+-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell;
+    if (kNetworkFields == [indexPath section]) {
+        cell = [aTableView cellForRowAtIndexPath:indexPath];
+        for (UIView *oneView in cell.contentView.subviews) {
+            if ([oneView isMemberOfClass:[UITextField class]]) {
+                textFieldBeingEdited = (UITextField *)oneView;
+                [textFieldBeingEdited becomeFirstResponder];
+            }
+        }
+        [aTableView deselectRowAtIndexPath:indexPath animated:NO];
+    }
+}
+
+
+#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.settingsDictionary = nil;
+	self.textFieldBeingEdited = nil;
+	self.musicSwitch = nil;
+	self.soundSwitch = nil;
+	self.altDamageSwitch = nil;
+	[super viewDidUnload];
+    MSG_DIDUNLOAD();
+}
+
+-(void) dealloc {
+    [settingsDictionary release];
+	[textFieldBeingEdited release];
+	[musicSwitch release];
+	[soundSwitch release];
+	[altDamageSwitch release];
+	[super dealloc];
+}
+
+
+@end